xref: /dragonfly/sys/dev/raid/aac/aac.c (revision 9f3fc534)
1 /*-
2  * Copyright (c) 2000 Michael Smith
3  * Copyright (c) 2001 Scott Long
4  * Copyright (c) 2000 BSDi
5  * Copyright (c) 2001 Adaptec, Inc.
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  *
29  *	$FreeBSD: src/sys/dev/aac/aac.c,v 1.9.2.14 2003/04/08 13:22:08 scottl Exp $
30  *	$DragonFly: src/sys/dev/raid/aac/aac.c,v 1.34 2008/01/20 03:40:35 pavalos Exp $
31  */
32 
33 /*
34  * Driver for the Adaptec 'FSA' family of PCI/SCSI RAID adapters.
35  */
36 #define AAC_DRIVER_VERSION		0x02000000
37 #define AAC_DRIVERNAME			"aac"
38 
39 #include "opt_aac.h"
40 
41 /* #include <stddef.h> */
42 #include <sys/param.h>
43 #include <sys/systm.h>
44 #include <sys/malloc.h>
45 #include <sys/kernel.h>
46 #include <sys/kthread.h>
47 #include <sys/sysctl.h>
48 #include <sys/poll.h>
49 
50 #include <sys/bus.h>
51 #include <sys/conf.h>
52 #include <sys/devicestat.h>
53 #include <sys/disk.h>
54 #include <sys/signalvar.h>
55 #include <sys/time.h>
56 #include <sys/eventhandler.h>
57 #include <sys/rman.h>
58 
59 #include <bus/pci/pcireg.h>
60 #include <bus/pci/pcivar.h>
61 
62 #include "aacreg.h"
63 #include "aac_ioctl.h"
64 #include "aacvar.h"
65 #include "aac_tables.h"
66 
67 static void	aac_startup(void *arg);
68 static void	aac_add_container(struct aac_softc *sc,
69 				  struct aac_mntinforesp *mir, int f);
70 static void	aac_get_bus_info(struct aac_softc *sc);
71 static int	aac_shutdown(device_t dev);
72 
73 /* Command Processing */
74 static void	aac_timeout(void *ssc);
75 static int	aac_map_command(struct aac_command *cm);
76 static void	aac_complete(void *context, int pending);
77 static int	aac_bio_command(struct aac_softc *sc, struct aac_command **cmp);
78 static void	aac_bio_complete(struct aac_command *cm);
79 static int	aac_wait_command(struct aac_command *cm);
80 static void	aac_command_thread(struct aac_softc *sc);
81 
82 /* Command Buffer Management */
83 static void	aac_map_command_sg(void *arg, bus_dma_segment_t *segs,
84 				   int nseg, int error);
85 static void	aac_map_command_helper(void *arg, bus_dma_segment_t *segs,
86 				       int nseg, int error);
87 static int	aac_alloc_commands(struct aac_softc *sc);
88 static void	aac_free_commands(struct aac_softc *sc);
89 static void	aac_unmap_command(struct aac_command *cm);
90 
91 /* Hardware Interface */
92 static void	aac_common_map(void *arg, bus_dma_segment_t *segs, int nseg,
93 			       int error);
94 static int	aac_check_firmware(struct aac_softc *sc);
95 static int	aac_init(struct aac_softc *sc);
96 static int	aac_sync_command(struct aac_softc *sc, u_int32_t command,
97 				 u_int32_t arg0, u_int32_t arg1, u_int32_t arg2,
98 				 u_int32_t arg3, u_int32_t *sp);
99 static int	aac_enqueue_fib(struct aac_softc *sc, int queue,
100 				struct aac_command *cm);
101 static int	aac_dequeue_fib(struct aac_softc *sc, int queue,
102 				u_int32_t *fib_size, struct aac_fib **fib_addr);
103 static int	aac_enqueue_response(struct aac_softc *sc, int queue,
104 				     struct aac_fib *fib);
105 
106 /* Falcon/PPC interface */
107 static int	aac_fa_get_fwstatus(struct aac_softc *sc);
108 static void	aac_fa_qnotify(struct aac_softc *sc, int qbit);
109 static int	aac_fa_get_istatus(struct aac_softc *sc);
110 static void	aac_fa_clear_istatus(struct aac_softc *sc, int mask);
111 static void	aac_fa_set_mailbox(struct aac_softc *sc, u_int32_t command,
112 				   u_int32_t arg0, u_int32_t arg1,
113 				   u_int32_t arg2, u_int32_t arg3);
114 static int	aac_fa_get_mailbox(struct aac_softc *sc, int mb);
115 static void	aac_fa_set_interrupts(struct aac_softc *sc, int enable);
116 
117 struct aac_interface aac_fa_interface = {
118 	aac_fa_get_fwstatus,
119 	aac_fa_qnotify,
120 	aac_fa_get_istatus,
121 	aac_fa_clear_istatus,
122 	aac_fa_set_mailbox,
123 	aac_fa_get_mailbox,
124 	aac_fa_set_interrupts,
125 	NULL, NULL, NULL
126 };
127 
128 /* StrongARM interface */
129 static int	aac_sa_get_fwstatus(struct aac_softc *sc);
130 static void	aac_sa_qnotify(struct aac_softc *sc, int qbit);
131 static int	aac_sa_get_istatus(struct aac_softc *sc);
132 static void	aac_sa_clear_istatus(struct aac_softc *sc, int mask);
133 static void	aac_sa_set_mailbox(struct aac_softc *sc, u_int32_t command,
134 				   u_int32_t arg0, u_int32_t arg1,
135 				   u_int32_t arg2, u_int32_t arg3);
136 static int	aac_sa_get_mailbox(struct aac_softc *sc, int mb);
137 static void	aac_sa_set_interrupts(struct aac_softc *sc, int enable);
138 
139 struct aac_interface aac_sa_interface = {
140 	aac_sa_get_fwstatus,
141 	aac_sa_qnotify,
142 	aac_sa_get_istatus,
143 	aac_sa_clear_istatus,
144 	aac_sa_set_mailbox,
145 	aac_sa_get_mailbox,
146 	aac_sa_set_interrupts,
147 	NULL, NULL, NULL
148 };
149 
150 /* i960Rx interface */
151 static int	aac_rx_get_fwstatus(struct aac_softc *sc);
152 static void	aac_rx_qnotify(struct aac_softc *sc, int qbit);
153 static int	aac_rx_get_istatus(struct aac_softc *sc);
154 static void	aac_rx_clear_istatus(struct aac_softc *sc, int mask);
155 static void	aac_rx_set_mailbox(struct aac_softc *sc, u_int32_t command,
156 				   u_int32_t arg0, u_int32_t arg1,
157 				   u_int32_t arg2, u_int32_t arg3);
158 static int	aac_rx_get_mailbox(struct aac_softc *sc, int mb);
159 static void	aac_rx_set_interrupts(struct aac_softc *sc, int enable);
160 static int aac_rx_send_command(struct aac_softc *sc, struct aac_command *cm);
161 static int aac_rx_get_outb_queue(struct aac_softc *sc);
162 static void aac_rx_set_outb_queue(struct aac_softc *sc, int index);
163 
164 struct aac_interface aac_rx_interface = {
165 	aac_rx_get_fwstatus,
166 	aac_rx_qnotify,
167 	aac_rx_get_istatus,
168 	aac_rx_clear_istatus,
169 	aac_rx_set_mailbox,
170 	aac_rx_get_mailbox,
171 	aac_rx_set_interrupts,
172 	aac_rx_send_command,
173 	aac_rx_get_outb_queue,
174 	aac_rx_set_outb_queue
175 };
176 
177 /* Rocket/MIPS interface */
178 static int	aac_rkt_get_fwstatus(struct aac_softc *sc);
179 static void	aac_rkt_qnotify(struct aac_softc *sc, int qbit);
180 static int	aac_rkt_get_istatus(struct aac_softc *sc);
181 static void	aac_rkt_clear_istatus(struct aac_softc *sc, int mask);
182 static void	aac_rkt_set_mailbox(struct aac_softc *sc, u_int32_t command,
183 				    u_int32_t arg0, u_int32_t arg1,
184 				    u_int32_t arg2, u_int32_t arg3);
185 static int	aac_rkt_get_mailbox(struct aac_softc *sc, int mb);
186 static void	aac_rkt_set_interrupts(struct aac_softc *sc, int enable);
187 static int aac_rkt_send_command(struct aac_softc *sc, struct aac_command *cm);
188 static int aac_rkt_get_outb_queue(struct aac_softc *sc);
189 static void aac_rkt_set_outb_queue(struct aac_softc *sc, int index);
190 
191 struct aac_interface aac_rkt_interface = {
192 	aac_rkt_get_fwstatus,
193 	aac_rkt_qnotify,
194 	aac_rkt_get_istatus,
195 	aac_rkt_clear_istatus,
196 	aac_rkt_set_mailbox,
197 	aac_rkt_get_mailbox,
198 	aac_rkt_set_interrupts,
199 	aac_rkt_send_command,
200 	aac_rkt_get_outb_queue,
201 	aac_rkt_set_outb_queue
202 };
203 
204 /* Debugging and Diagnostics */
205 static void	aac_describe_controller(struct aac_softc *sc);
206 static char	*aac_describe_code(struct aac_code_lookup *table,
207 				   u_int32_t code);
208 
209 /* Management Interface */
210 static d_open_t		aac_open;
211 static d_close_t	aac_close;
212 static d_ioctl_t	aac_ioctl;
213 static d_poll_t		aac_poll;
214 static int		aac_ioctl_sendfib(struct aac_softc *sc, caddr_t ufib) __unused;
215 static void		aac_handle_aif(struct aac_softc *sc,
216 					   struct aac_fib *fib);
217 static int		aac_rev_check(struct aac_softc *sc, caddr_t udata);
218 static int		aac_getnext_aif(struct aac_softc *sc, caddr_t arg);
219 static int		aac_return_aif(struct aac_softc *sc, caddr_t uptr);
220 static int		aac_query_disk(struct aac_softc *sc, caddr_t uptr);
221 static int		aac_get_pci_info(struct aac_softc *sc, caddr_t uptr);
222 static void		aac_ioctl_event(struct aac_softc *sc,
223 				        struct aac_event *event, void *arg);
224 
225 #define AAC_CDEV_MAJOR	150
226 
227 static struct dev_ops aac_ops = {
228 	{ "aac", AAC_CDEV_MAJOR, 0 },
229 	.d_open =	aac_open,
230 	.d_close =	aac_close,
231 	.d_ioctl =	aac_ioctl,
232 	.d_poll =	aac_poll,
233 };
234 
235 DECLARE_DUMMY_MODULE(aac);
236 
237 MALLOC_DEFINE(M_AACBUF, "aacbuf", "Buffers for the AAC driver");
238 
239 /* sysctl node */
240 SYSCTL_NODE(_hw, OID_AUTO, aac, CTLFLAG_RD, 0, "AAC driver parameters");
241 
242 /*
243  * Device Interface
244  */
245 
246 /*
247  * Initialise the controller and softc
248  */
249 int
250 aac_attach(struct aac_softc *sc)
251 {
252 	int error, unit;
253 
254 	debug_called(1);
255 	callout_init(&sc->aac_watchdog);
256 
257 	/*
258 	 * Initialise per-controller queues.
259 	 */
260 	aac_initq_free(sc);
261 	aac_initq_ready(sc);
262 	aac_initq_busy(sc);
263 	aac_initq_complete(sc);
264 	aac_initq_bio(sc);
265 
266 	/*
267 	 * Initialise command-completion task.
268 	 */
269 	TASK_INIT(&sc->aac_task_complete, 0, aac_complete, sc);
270 
271 	/* mark controller as suspended until we get ourselves organised */
272 	sc->aac_state |= AAC_STATE_SUSPEND;
273 
274 	/*
275 	 * Check that the firmware on the card is supported.
276 	 */
277 	if ((error = aac_check_firmware(sc)) != 0)
278 		return(error);
279 
280 	/*
281 	 * Initialize locks
282 	 */
283 	AAC_LOCK_INIT(&sc->aac_aifq_lock, "AAC AIF lock");
284 	AAC_LOCK_INIT(&sc->aac_io_lock, "AAC I/O lock");
285 	AAC_LOCK_INIT(&sc->aac_container_lock, "AAC container lock");
286 	TAILQ_INIT(&sc->aac_container_tqh);
287 	TAILQ_INIT(&sc->aac_ev_cmfree);
288 
289 
290 	/* Initialize the local AIF queue pointers */
291 	sc->aac_aifq_head = sc->aac_aifq_tail = AAC_AIFQ_LENGTH;
292 
293 	/*
294 	 * Initialise the adapter.
295 	 */
296 	if ((error = aac_init(sc)) != 0)
297 		return(error);
298 
299 	/*
300 	 * Allocate and connect our interrupt.
301 	 */
302 	sc->aac_irq_rid = 0;
303 	if ((sc->aac_irq = bus_alloc_resource_any(sc->aac_dev, SYS_RES_IRQ,
304 			   			  &sc->aac_irq_rid,
305 			   			  RF_SHAREABLE |
306 						  RF_ACTIVE)) == NULL) {
307 		device_printf(sc->aac_dev, "can't allocate interrupt\n");
308 		return (EINVAL);
309 	}
310 	if (sc->flags & AAC_FLAGS_NEW_COMM) {
311 		if (bus_setup_intr(sc->aac_dev, sc->aac_irq,
312 				   0, aac_new_intr,
313 				   sc, &sc->aac_intr, NULL)) {
314 			device_printf(sc->aac_dev, "can't set up interrupt\n");
315 			return (EINVAL);
316 		}
317 	} else {
318 		if (bus_setup_intr(sc->aac_dev, sc->aac_irq,
319 				   INTR_FAST, aac_fast_intr,
320 				   sc, &sc->aac_intr, NULL)) {
321 			device_printf(sc->aac_dev,
322 				      "can't set up FAST interrupt\n");
323 			if (bus_setup_intr(sc->aac_dev, sc->aac_irq,
324 					   0, aac_fast_intr,
325 					   sc, &sc->aac_intr, NULL)) {
326 				device_printf(sc->aac_dev,
327 					     "can't set up MPSAFE interrupt\n");
328 				return (EINVAL);
329 			}
330 		}
331 	}
332 
333 	/*
334 	 * Print a little information about the controller.
335 	 */
336 	aac_describe_controller(sc);
337 
338 	/*
339 	 * Register to probe our containers later.
340 	 */
341 	sc->aac_ich.ich_func = aac_startup;
342 	sc->aac_ich.ich_arg = sc;
343 	sc->aac_ich.ich_desc = "aac";
344 	if (config_intrhook_establish(&sc->aac_ich) != 0) {
345 		device_printf(sc->aac_dev,
346 			      "can't establish configuration hook\n");
347 		return(ENXIO);
348 	}
349 
350 	/*
351 	 * Make the control device.
352 	 */
353 	unit = device_get_unit(sc->aac_dev);
354 	dev_ops_add(&aac_ops, -1, unit);
355 	sc->aac_dev_t = make_dev(&aac_ops, unit, UID_ROOT, GID_OPERATOR, 0640,
356 				 "aac%d", unit);
357 	sc->aac_dev_t->si_drv1 = sc;
358 	reference_dev(sc->aac_dev_t);
359 
360 	/* Create the AIF thread */
361 	if (kthread_create((void(*)(void *))aac_command_thread, sc,
362 			   &sc->aifthread, "aac%daif", unit))
363 		panic("Could not create AIF thread\n");
364 
365 	/* Register the shutdown method to only be called post-dump */
366 	if ((sc->eh = EVENTHANDLER_REGISTER(shutdown_post_sync, aac_shutdown,
367 	    sc->aac_dev, SHUTDOWN_PRI_DRIVER)) == NULL)
368 		device_printf(sc->aac_dev,
369 			      "shutdown event registration failed\n");
370 
371 	/* Register with CAM for the non-DASD devices */
372 	if ((sc->flags & AAC_FLAGS_ENABLE_CAM) != 0) {
373 		TAILQ_INIT(&sc->aac_sim_tqh);
374 		aac_get_bus_info(sc);
375 	}
376 
377 	return(0);
378 }
379 
380 void
381 aac_add_event(struct aac_softc *sc, struct aac_event *event)
382 {
383 
384 	switch (event->ev_type & AAC_EVENT_MASK) {
385 	case AAC_EVENT_CMFREE:
386 		TAILQ_INSERT_TAIL(&sc->aac_ev_cmfree, event, ev_links);
387 		break;
388 	default:
389 		device_printf(sc->aac_dev, "aac_add event: unknown event %d\n",
390 		    event->ev_type);
391 		break;
392 	}
393 
394 	return;
395 }
396 
397 /*
398  * Probe for containers, create disks.
399  */
400 static void
401 aac_startup(void *arg)
402 {
403 	struct aac_softc *sc;
404 	struct aac_fib *fib;
405 	struct aac_mntinfo *mi;
406 	struct aac_mntinforesp *mir = NULL;
407 	int count = 0, i = 0;
408 
409 	debug_called(1);
410 
411 	sc = (struct aac_softc *)arg;
412 
413 	/* disconnect ourselves from the intrhook chain */
414 	config_intrhook_disestablish(&sc->aac_ich);
415 
416 	AAC_LOCK_ACQUIRE(&sc->aac_io_lock);
417 	aac_alloc_sync_fib(sc, &fib);
418 	mi = (struct aac_mntinfo *)&fib->data[0];
419 
420 	/* loop over possible containers */
421 	do {
422 		/* request information on this container */
423 		bzero(mi, sizeof(struct aac_mntinfo));
424 		mi->Command = VM_NameServe;
425 		mi->MntType = FT_FILESYS;
426 		mi->MntCount = i;
427 		if (aac_sync_fib(sc, ContainerCommand, 0, fib,
428 				 sizeof(struct aac_mntinfo))) {
429 			device_printf(sc->aac_dev,
430 			    "error probing container %d", i);
431 
432 			continue;
433 		}
434 
435 		mir = (struct aac_mntinforesp *)&fib->data[0];
436 		/* XXX Need to check if count changed */
437 		count = mir->MntRespCount;
438 		aac_add_container(sc, mir, 0);
439 		i++;
440 	} while ((i < count) && (i < AAC_MAX_CONTAINERS));
441 
442 	aac_release_sync_fib(sc);
443 	AAC_LOCK_RELEASE(&sc->aac_io_lock);
444 
445 	/* poke the bus to actually attach the child devices */
446 	if (bus_generic_attach(sc->aac_dev))
447 		device_printf(sc->aac_dev, "bus_generic_attach failed\n");
448 
449 	/* mark the controller up */
450 	sc->aac_state &= ~AAC_STATE_SUSPEND;
451 
452 	/* enable interrupts now */
453 	AAC_UNMASK_INTERRUPTS(sc);
454 }
455 
456 /*
457  * Create a device to respresent a new container
458  */
459 static void
460 aac_add_container(struct aac_softc *sc, struct aac_mntinforesp *mir, int f)
461 {
462 	struct aac_container *co;
463 	device_t child;
464 
465 	/*
466 	 * Check container volume type for validity.  Note that many of
467 	 * the possible types may never show up.
468 	 */
469 	if ((mir->Status == ST_OK) && (mir->MntTable[0].VolType != CT_NONE)) {
470 		co = (struct aac_container *)kmalloc(sizeof *co, M_AACBUF,
471 		       M_INTWAIT | M_ZERO);
472 		debug(1, "id %x  name '%.16s'  size %u  type %d",
473 		      mir->MntTable[0].ObjectId,
474 		      mir->MntTable[0].FileSystemName,
475 		      mir->MntTable[0].Capacity, mir->MntTable[0].VolType);
476 
477 		if ((child = device_add_child(sc->aac_dev, "aacd", -1)) == NULL)
478 			device_printf(sc->aac_dev, "device_add_child failed\n");
479 		else
480 			device_set_ivars(child, co);
481 		device_set_desc(child, aac_describe_code(aac_container_types,
482 				mir->MntTable[0].VolType));
483 		co->co_disk = child;
484 		co->co_found = f;
485 		bcopy(&mir->MntTable[0], &co->co_mntobj,
486 		      sizeof(struct aac_mntobj));
487 		AAC_LOCK_ACQUIRE(&sc->aac_container_lock);
488 		TAILQ_INSERT_TAIL(&sc->aac_container_tqh, co, co_link);
489 		AAC_LOCK_RELEASE(&sc->aac_container_lock);
490 	}
491 }
492 
493 /*
494  * Free all of the resources associated with (sc)
495  *
496  * Should not be called if the controller is active.
497  */
498 void
499 aac_free(struct aac_softc *sc)
500 {
501 
502 	debug_called(1);
503 
504 	/* remove the control device */
505 	if (sc->aac_dev_t != NULL)
506 		destroy_dev(sc->aac_dev_t);
507 
508 	/* throw away any FIB buffers, discard the FIB DMA tag */
509 	aac_free_commands(sc);
510 	if (sc->aac_fib_dmat)
511 		bus_dma_tag_destroy(sc->aac_fib_dmat);
512 
513 	kfree(sc->aac_commands, M_AACBUF);
514 
515 	/* destroy the common area */
516 	if (sc->aac_common) {
517 		bus_dmamap_unload(sc->aac_common_dmat, sc->aac_common_dmamap);
518 		bus_dmamem_free(sc->aac_common_dmat, sc->aac_common,
519 				sc->aac_common_dmamap);
520 	}
521 	if (sc->aac_common_dmat)
522 		bus_dma_tag_destroy(sc->aac_common_dmat);
523 
524 	/* disconnect the interrupt handler */
525 	if (sc->aac_intr)
526 		bus_teardown_intr(sc->aac_dev, sc->aac_irq, sc->aac_intr);
527 	if (sc->aac_irq != NULL)
528 		bus_release_resource(sc->aac_dev, SYS_RES_IRQ, sc->aac_irq_rid,
529 				     sc->aac_irq);
530 
531 	/* destroy data-transfer DMA tag */
532 	if (sc->aac_buffer_dmat)
533 		bus_dma_tag_destroy(sc->aac_buffer_dmat);
534 
535 	/* destroy the parent DMA tag */
536 	if (sc->aac_parent_dmat)
537 		bus_dma_tag_destroy(sc->aac_parent_dmat);
538 
539 	/* release the register window mapping */
540 	if (sc->aac_regs_resource != NULL) {
541 		bus_release_resource(sc->aac_dev, SYS_RES_MEMORY,
542 				     sc->aac_regs_rid, sc->aac_regs_resource);
543 	}
544 	dev_ops_remove(&aac_ops, -1, device_get_unit(sc->aac_dev));
545 }
546 
547 /*
548  * Disconnect from the controller completely, in preparation for unload.
549  */
550 int
551 aac_detach(device_t dev)
552 {
553 	struct aac_softc *sc;
554 	struct aac_container *co;
555 	struct aac_sim	*sim;
556 	int error;
557 
558 	debug_called(1);
559 
560 	sc = device_get_softc(dev);
561 
562 	callout_stop(&sc->aac_watchdog);
563 
564 	if (sc->aac_state & AAC_STATE_OPEN)
565 		return(EBUSY);
566 
567 	/* Remove the child containers */
568 	while ((co = TAILQ_FIRST(&sc->aac_container_tqh)) != NULL) {
569 		error = device_delete_child(dev, co->co_disk);
570 		if (error)
571 			return (error);
572 		TAILQ_REMOVE(&sc->aac_container_tqh, co, co_link);
573 		kfree(co, M_AACBUF);
574 	}
575 
576 	/* Remove the CAM SIMs */
577 	while ((sim = TAILQ_FIRST(&sc->aac_sim_tqh)) != NULL) {
578 		TAILQ_REMOVE(&sc->aac_sim_tqh, sim, sim_link);
579 		error = device_delete_child(dev, sim->sim_dev);
580 		if (error)
581 			return (error);
582 		kfree(sim, M_AACBUF);
583 	}
584 
585 	if (sc->aifflags & AAC_AIFFLAGS_RUNNING) {
586 		sc->aifflags |= AAC_AIFFLAGS_EXIT;
587 		wakeup(sc->aifthread);
588 		tsleep(sc->aac_dev, PCATCH, "aacdch", 30 * hz);
589 	}
590 
591 	if (sc->aifflags & AAC_AIFFLAGS_RUNNING)
592 		panic("Cannot shutdown AIF thread\n");
593 
594 	if ((error = aac_shutdown(dev)))
595 		return(error);
596 
597 	EVENTHANDLER_DEREGISTER(shutdown_post_sync, sc->eh);
598 
599 	aac_free(sc);
600 
601 	lockuninit(&sc->aac_aifq_lock);
602 	lockuninit(&sc->aac_io_lock);
603 	lockuninit(&sc->aac_container_lock);
604 
605 	return(0);
606 }
607 
608 /*
609  * Bring the controller down to a dormant state and detach all child devices.
610  *
611  * This function is called before detach or system shutdown.
612  *
613  * Note that we can assume that the bioq on the controller is empty, as we won't
614  * allow shutdown if any device is open.
615  */
616 static int
617 aac_shutdown(device_t dev)
618 {
619 	struct aac_softc *sc;
620 	struct aac_fib *fib;
621 	struct aac_close_command *cc;
622 
623 	debug_called(1);
624 
625 	sc = device_get_softc(dev);
626 
627 	sc->aac_state |= AAC_STATE_SUSPEND;
628 
629 	/*
630 	 * Send a Container shutdown followed by a HostShutdown FIB to the
631 	 * controller to convince it that we don't want to talk to it anymore.
632 	 * We've been closed and all I/O completed already
633 	 */
634 	device_printf(sc->aac_dev, "shutting down controller...");
635 
636 	AAC_LOCK_ACQUIRE(&sc->aac_io_lock);
637 	aac_alloc_sync_fib(sc, &fib);
638 	cc = (struct aac_close_command *)&fib->data[0];
639 
640 	bzero(cc, sizeof(struct aac_close_command));
641 	cc->Command = VM_CloseAll;
642 	cc->ContainerId = 0xffffffff;
643 	if (aac_sync_fib(sc, ContainerCommand, 0, fib,
644 	    sizeof(struct aac_close_command)))
645 		kprintf("FAILED.\n");
646 	else
647 		kprintf("done\n");
648 #if 0
649 	else {
650 		fib->data[0] = 0;
651 		/*
652 		 * XXX Issuing this command to the controller makes it shut down
653 		 * but also keeps it from coming back up without a reset of the
654 		 * PCI bus.  This is not desirable if you are just unloading the
655 		 * driver module with the intent to reload it later.
656 		 */
657 		if (aac_sync_fib(sc, FsaHostShutdown, AAC_FIBSTATE_SHUTDOWN,
658 		    fib, 1)) {
659 			kprintf("FAILED.\n");
660 		} else {
661 			kprintf("done.\n");
662 		}
663 	}
664 #endif
665 
666 	AAC_MASK_INTERRUPTS(sc);
667 	aac_release_sync_fib(sc);
668 	AAC_LOCK_RELEASE(&sc->aac_io_lock);
669 
670 	return(0);
671 }
672 
673 /*
674  * Bring the controller to a quiescent state, ready for system suspend.
675  */
676 int
677 aac_suspend(device_t dev)
678 {
679 	struct aac_softc *sc;
680 
681 	debug_called(1);
682 
683 	sc = device_get_softc(dev);
684 
685 	sc->aac_state |= AAC_STATE_SUSPEND;
686 
687 	AAC_MASK_INTERRUPTS(sc);
688 	return(0);
689 }
690 
691 /*
692  * Bring the controller back to a state ready for operation.
693  */
694 int
695 aac_resume(device_t dev)
696 {
697 	struct aac_softc *sc;
698 
699 	debug_called(1);
700 
701 	sc = device_get_softc(dev);
702 
703 	sc->aac_state &= ~AAC_STATE_SUSPEND;
704 	AAC_UNMASK_INTERRUPTS(sc);
705 	return(0);
706 }
707 
708 /*
709  * Interrupt handler for NEW_COMM interface.
710  */
711 void
712 aac_new_intr(void *arg)
713 {
714 	struct aac_softc *sc;
715 	u_int32_t index, fast;
716 	struct aac_command *cm;
717 	struct aac_fib *fib;
718 	int i;
719 
720 	debug_called(2);
721 
722 	sc = (struct aac_softc *)arg;
723 
724 	AAC_LOCK_ACQUIRE(&sc->aac_io_lock);
725 	while (1) {
726 		index = AAC_GET_OUTB_QUEUE(sc);
727 		if (index == 0xffffffff)
728 			index = AAC_GET_OUTB_QUEUE(sc);
729 		if (index == 0xffffffff)
730 			break;
731 		if (index & 2) {
732 			if (index == 0xfffffffe) {
733 				/* XXX This means that the controller wants
734 				 * more work.  Ignore it for now.
735 				 */
736 				continue;
737 			}
738 			/* AIF */
739 			fib = (struct aac_fib *)kmalloc(sizeof *fib, M_AACBUF,
740 				   M_INTWAIT | M_ZERO);
741 			index &= ~2;
742 			for (i = 0; i < sizeof(struct aac_fib)/4; ++i)
743 				((u_int32_t *)fib)[i] = AAC_GETREG4(sc, index + i*4);
744 			aac_handle_aif(sc, fib);
745 			kfree(fib, M_AACBUF);
746 
747 			/*
748 			 * AIF memory is owned by the adapter, so let it
749 			 * know that we are done with it.
750 			 */
751 			AAC_SET_OUTB_QUEUE(sc, index);
752 			AAC_CLEAR_ISTATUS(sc, AAC_DB_RESPONSE_READY);
753 		} else {
754 			fast = index & 1;
755 			cm = sc->aac_commands + (index >> 2);
756 			fib = cm->cm_fib;
757 			if (fast) {
758 				fib->Header.XferState |= AAC_FIBSTATE_DONEADAP;
759 				*((u_int32_t *)(fib->data)) = AAC_ERROR_NORMAL;
760 			}
761 			aac_remove_busy(cm);
762  			aac_unmap_command(cm);
763 			cm->cm_flags |= AAC_CMD_COMPLETED;
764 
765 			/* is there a completion handler? */
766 			if (cm->cm_complete != NULL) {
767 				cm->cm_complete(cm);
768 			} else {
769 				/* assume that someone is sleeping on this
770 				 * command
771 				 */
772 				wakeup(cm);
773 			}
774 			sc->flags &= ~AAC_QUEUE_FRZN;
775 		}
776 	}
777 	/* see if we can start some more I/O */
778 	if ((sc->flags & AAC_QUEUE_FRZN) == 0)
779 		aac_startio(sc);
780 
781 	AAC_LOCK_RELEASE(&sc->aac_io_lock);
782 }
783 
784 void
785 aac_fast_intr(void *arg)
786 {
787 	struct aac_softc *sc;
788 	u_int16_t reason;
789 
790 	debug_called(2);
791 
792 	sc = (struct aac_softc *)arg;
793 
794 	/*
795 	 * Read the status register directly.  This is faster than taking the
796 	 * driver lock and reading the queues directly.  It also saves having
797 	 * to turn parts of the driver lock into a spin mutex, which would be
798 	 * ugly.
799 	 */
800 	reason = AAC_GET_ISTATUS(sc);
801 	AAC_CLEAR_ISTATUS(sc, reason);
802 
803 	/* handle completion processing */
804 	if (reason & AAC_DB_RESPONSE_READY)
805 		taskqueue_enqueue(taskqueue_swi, &sc->aac_task_complete);
806 
807 	/* controller wants to talk to us */
808 	if (reason & (AAC_DB_PRINTF | AAC_DB_COMMAND_READY)) {
809 		/*
810 		 * XXX Make sure that we don't get fooled by strange messages
811 		 * that start with a NULL.
812 		 */
813 		if ((reason & AAC_DB_PRINTF) &&
814 			(sc->aac_common->ac_printf[0] == 0))
815 			sc->aac_common->ac_printf[0] = 32;
816 
817 		/*
818 		 * This might miss doing the actual wakeup.  However, the
819 		 * msleep that this is waking up has a timeout, so it will
820 		 * wake up eventually.  AIFs and printfs are low enough
821 		 * priority that they can handle hanging out for a few seconds
822 		 * if needed.
823 		 */
824 		wakeup(sc->aifthread);
825 	}
826 }
827 
828 /*
829  * Command Processing
830  */
831 
832 /*
833  * Start as much queued I/O as possible on the controller
834  */
835 void
836 aac_startio(struct aac_softc *sc)
837 {
838 	struct aac_command *cm;
839 
840 	debug_called(2);
841 
842 	if (sc->flags & AAC_QUEUE_FRZN)
843 		return;
844 
845 	for (;;) {
846 		/*
847 		 * Try to get a command that's been put off for lack of
848 		 * resources
849 		 */
850 		cm = aac_dequeue_ready(sc);
851 
852 		/*
853 		 * Try to build a command off the bio queue (ignore error
854 		 * return)
855 		 */
856 		if (cm == NULL)
857 			aac_bio_command(sc, &cm);
858 
859 		/* nothing to do? */
860 		if (cm == NULL)
861 			break;
862 
863 		/*
864 		 * Try to give the command to the controller.  Any error is
865 		 * catastrophic since it means that bus_dmamap_load() failed.
866 		 */
867 		if (aac_map_command(cm) != 0)
868 			panic("aac: error mapping command %p\n", cm);
869 	}
870 }
871 
872 /*
873  * Deliver a command to the controller; allocate controller resources at the
874  * last moment when possible.
875  */
876 static int
877 aac_map_command(struct aac_command *cm)
878 {
879 	struct aac_softc *sc;
880 	int error;
881 
882 	debug_called(2);
883 
884 	sc = cm->cm_sc;
885 	error = 0;
886 
887 	/* don't map more than once */
888 	if (cm->cm_flags & AAC_CMD_MAPPED)
889 		panic("aac: command %p already mapped", cm);
890 
891 	if (cm->cm_datalen != 0) {
892 		error = bus_dmamap_load(sc->aac_buffer_dmat, cm->cm_datamap,
893 					cm->cm_data, cm->cm_datalen,
894 					aac_map_command_sg, cm, 0);
895 		if (error == EINPROGRESS) {
896 			debug(1, "freezing queue\n");
897 			sc->flags |= AAC_QUEUE_FRZN;
898 			error = 0;
899 		}
900 	} else {
901 		aac_map_command_sg(cm, NULL, 0, 0);
902 	}
903 	return (error);
904 }
905 
906 /*
907  * Handle notification of one or more FIBs coming from the controller.
908  */
909 static void
910 aac_command_thread(struct aac_softc *sc)
911 {
912 	struct aac_fib *fib;
913 	u_int32_t fib_size;
914 	int size, retval;
915 
916 	debug_called(2);
917 
918 	AAC_LOCK_ACQUIRE(&sc->aac_io_lock);
919 	sc->aifflags = AAC_AIFFLAGS_RUNNING;
920 
921 	while ((sc->aifflags & AAC_AIFFLAGS_EXIT) == 0) {
922 		retval = 0;
923 		if ((sc->aifflags & AAC_AIFFLAGS_PENDING) == 0) {
924 			crit_enter();
925 			tsleep_interlock(sc->aifthread);
926 			AAC_LOCK_RELEASE(&sc->aac_io_lock);
927 			retval = tsleep(sc->aifthread, 0,
928 					"aifthd", AAC_PERIODIC_INTERVAL * hz);
929 			AAC_LOCK_ACQUIRE(&sc->aac_io_lock);
930 			crit_exit();
931 		}
932 		/*
933 		 * First see if any FIBs need to be allocated.  This needs
934 		 * to be called without the driver lock because contigmalloc
935 		 * will grab Giant, and would result in an LOR.
936 		 */
937 		if ((sc->aifflags & AAC_AIFFLAGS_ALLOCFIBS) != 0) {
938 			AAC_LOCK_RELEASE(&sc->aac_io_lock);
939 			aac_alloc_commands(sc);
940 			AAC_LOCK_ACQUIRE(&sc->aac_io_lock);
941 			sc->aifflags &= ~AAC_AIFFLAGS_ALLOCFIBS;
942 			aac_startio(sc);
943 		}
944 
945 		/*
946 		 * While we're here, check to see if any commands are stuck.
947 		 * This is pretty low-priority, so it's ok if it doesn't
948 		 * always fire.
949 		 */
950 		if (retval == EWOULDBLOCK)
951 			aac_timeout(sc);
952 
953 		/* Check the hardware printf message buffer */
954 		if (sc->aac_common->ac_printf[0] != 0)
955 			aac_print_printf(sc);
956 
957 		/* Also check to see if the adapter has a command for us. */
958 		if (sc->flags & AAC_FLAGS_NEW_COMM)
959 			continue;
960 		for (;;) {
961 			if (aac_dequeue_fib(sc, AAC_HOST_NORM_CMD_QUEUE,
962 					    &fib_size, &fib))
963 				break;
964 
965 			AAC_PRINT_FIB(sc, fib);
966 
967 			switch (fib->Header.Command) {
968 			case AifRequest:
969 				aac_handle_aif(sc, fib);
970 				break;
971 			default:
972 				device_printf(sc->aac_dev, "unknown command "
973 					      "from controller\n");
974 				break;
975 			}
976 
977 			if ((fib->Header.XferState == 0) ||
978 			    (fib->Header.StructType != AAC_FIBTYPE_TFIB)) {
979 				break;
980 			}
981 
982 			/* Return the AIF to the controller. */
983 			if (fib->Header.XferState & AAC_FIBSTATE_FROMADAP) {
984 				fib->Header.XferState |= AAC_FIBSTATE_DONEHOST;
985 				*(AAC_FSAStatus*)fib->data = ST_OK;
986 
987 				/* XXX Compute the Size field? */
988 				size = fib->Header.Size;
989 				if (size > sizeof(struct aac_fib)) {
990 					size = sizeof(struct aac_fib);
991 					fib->Header.Size = size;
992 				}
993 				/*
994 				 * Since we did not generate this command, it
995 				 * cannot go through the normal
996 				 * enqueue->startio chain.
997 				 */
998 				aac_enqueue_response(sc,
999 						 AAC_ADAP_NORM_RESP_QUEUE,
1000 						 fib);
1001 			}
1002 		}
1003 	}
1004 	sc->aifflags &= ~AAC_AIFFLAGS_RUNNING;
1005 	AAC_LOCK_RELEASE(&sc->aac_io_lock);
1006 	wakeup(sc->aac_dev);
1007 
1008 	kthread_exit();
1009 }
1010 
1011 /*
1012  * Process completed commands.
1013  */
1014 static void
1015 aac_complete(void *context, int pending)
1016 {
1017 	struct aac_softc *sc;
1018 	struct aac_command *cm;
1019 	struct aac_fib *fib;
1020 	u_int32_t fib_size;
1021 
1022 	debug_called(2);
1023 
1024 	sc = (struct aac_softc *)context;
1025 
1026 	AAC_LOCK_ACQUIRE(&sc->aac_io_lock);
1027 
1028 	/* pull completed commands off the queue */
1029 	for (;;) {
1030 		/* look for completed FIBs on our queue */
1031 		if (aac_dequeue_fib(sc, AAC_HOST_NORM_RESP_QUEUE, &fib_size,
1032 							&fib))
1033 			break;	/* nothing to do */
1034 
1035 		/* get the command, unmap and queue for later processing */
1036 		cm = sc->aac_commands + fib->Header.SenderData;
1037 		if (cm == NULL) {
1038 			AAC_PRINT_FIB(sc, fib);
1039 			break;
1040 		}
1041 		aac_remove_busy(cm);
1042 		aac_unmap_command(cm);		/* XXX defer? */
1043 		cm->cm_flags |= AAC_CMD_COMPLETED;
1044 
1045 		/* is there a completion handler? */
1046 		if (cm->cm_complete != NULL) {
1047 			cm->cm_complete(cm);
1048 		} else {
1049 			/* assume that someone is sleeping on this command */
1050 			wakeup(cm);
1051 		}
1052 	}
1053 
1054 	/* see if we can start some more I/O */
1055 	sc->flags &= ~AAC_QUEUE_FRZN;
1056 	aac_startio(sc);
1057 
1058 	AAC_LOCK_RELEASE(&sc->aac_io_lock);
1059 }
1060 
1061 /*
1062  * Handle a bio submitted from a disk device.
1063  */
1064 void
1065 aac_submit_bio(struct aac_disk *ad, struct bio *bio)
1066 {
1067 	struct aac_softc *sc;
1068 
1069 	debug_called(2);
1070 
1071 	bio->bio_driver_info = ad;
1072 	sc = ad->ad_controller;
1073 
1074 	/* queue the BIO and try to get some work done */
1075 	aac_enqueue_bio(sc, bio);
1076 	aac_startio(sc);
1077 }
1078 
1079 /*
1080  * Get a bio and build a command to go with it.
1081  */
1082 static int
1083 aac_bio_command(struct aac_softc *sc, struct aac_command **cmp)
1084 {
1085 	struct aac_command *cm;
1086 	struct aac_fib *fib;
1087 	struct aac_disk *ad;
1088 	struct bio *bio;
1089 	struct buf *bp;
1090 
1091 	debug_called(2);
1092 
1093 	/* get the resources we will need */
1094 	cm = NULL;
1095 	bio = NULL;
1096 	if (aac_alloc_command(sc, &cm))	/* get a command */
1097 		goto fail;
1098 	if ((bio = aac_dequeue_bio(sc)) == NULL)
1099 		goto fail;
1100 
1101 	/* fill out the command */
1102 	bp = bio->bio_buf;
1103 	cm->cm_data = (void *)bp->b_data;
1104 	cm->cm_datalen = bp->b_bcount;
1105 	cm->cm_complete = aac_bio_complete;
1106 	cm->cm_private = bio;
1107 	cm->cm_timestamp = time_second;
1108 	cm->cm_queue = AAC_ADAP_NORM_CMD_QUEUE;
1109 
1110 	/* build the FIB */
1111 	fib = cm->cm_fib;
1112 	fib->Header.Size = sizeof(struct aac_fib_header);
1113 	fib->Header.XferState =
1114 		AAC_FIBSTATE_HOSTOWNED   |
1115 		AAC_FIBSTATE_INITIALISED |
1116 		AAC_FIBSTATE_EMPTY	 |
1117 		AAC_FIBSTATE_FROMHOST	 |
1118 		AAC_FIBSTATE_REXPECTED   |
1119 		AAC_FIBSTATE_NORM	 |
1120 		AAC_FIBSTATE_ASYNC	 |
1121 		AAC_FIBSTATE_FAST_RESPONSE;
1122 
1123 	/* build the read/write request */
1124 	ad = (struct aac_disk *)bio->bio_driver_info;
1125 
1126 	if (sc->flags & AAC_FLAGS_RAW_IO) {
1127 		struct aac_raw_io *raw;
1128 		raw = (struct aac_raw_io *)&fib->data[0];
1129 		fib->Header.Command = RawIo;
1130 		raw->BlockNumber = bio->bio_offset / AAC_BLOCK_SIZE;
1131 		raw->ByteCount = bp->b_bcount;
1132 		raw->ContainerId = ad->ad_container->co_mntobj.ObjectId;
1133 		raw->BpTotal = 0;
1134 		raw->BpComplete = 0;
1135 		fib->Header.Size += sizeof(struct aac_raw_io);
1136 		cm->cm_sgtable = (struct aac_sg_table *)&raw->SgMapRaw;
1137 		if (bp->b_cmd == BUF_CMD_READ) {
1138 			raw->Flags = 1;
1139 			cm->cm_flags |= AAC_CMD_DATAIN;
1140 		} else {
1141 			raw->Flags = 0;
1142 			cm->cm_flags |= AAC_CMD_DATAOUT;
1143 		}
1144 	} else if ((sc->flags & AAC_FLAGS_SG_64BIT) == 0) {
1145 		fib->Header.Command = ContainerCommand;
1146 		if (bp->b_cmd == BUF_CMD_READ) {
1147 			struct aac_blockread *br;
1148 			br = (struct aac_blockread *)&fib->data[0];
1149 			br->Command = VM_CtBlockRead;
1150 			br->ContainerId = ad->ad_container->co_mntobj.ObjectId;
1151 			br->BlockNumber = bio->bio_offset / AAC_BLOCK_SIZE;
1152 			br->ByteCount = bp->b_bcount;
1153 			fib->Header.Size += sizeof(struct aac_blockread);
1154 			cm->cm_sgtable = &br->SgMap;
1155 			cm->cm_flags |= AAC_CMD_DATAIN;
1156 		} else {
1157 			struct aac_blockwrite *bw;
1158 			bw = (struct aac_blockwrite *)&fib->data[0];
1159 			bw->Command = VM_CtBlockWrite;
1160 			bw->ContainerId = ad->ad_container->co_mntobj.ObjectId;
1161 			bw->BlockNumber = bio->bio_offset / AAC_BLOCK_SIZE;
1162 			bw->ByteCount = bp->b_bcount;
1163 			bw->Stable = CUNSTABLE;
1164 			fib->Header.Size += sizeof(struct aac_blockwrite);
1165 			cm->cm_flags |= AAC_CMD_DATAOUT;
1166 			cm->cm_sgtable = &bw->SgMap;
1167 		}
1168 	} else {
1169 		fib->Header.Command = ContainerCommand64;
1170 		if (bp->b_cmd == BUF_CMD_READ) {
1171 			struct aac_blockread64 *br;
1172 			br = (struct aac_blockread64 *)&fib->data[0];
1173 			br->Command = VM_CtHostRead64;
1174 			br->ContainerId = ad->ad_container->co_mntobj.ObjectId;
1175 			br->SectorCount = bp->b_bcount / AAC_BLOCK_SIZE;
1176 			br->BlockNumber = bio->bio_offset / AAC_BLOCK_SIZE;
1177 			br->Pad = 0;
1178 			br->Flags = 0;
1179 			fib->Header.Size += sizeof(struct aac_blockread64);
1180 			cm->cm_flags |= AAC_CMD_DATAOUT;
1181 			cm->cm_sgtable = (struct aac_sg_table *)&br->SgMap64;
1182 		} else {
1183 			struct aac_blockwrite64 *bw;
1184 			bw = (struct aac_blockwrite64 *)&fib->data[0];
1185 			bw->Command = VM_CtHostWrite64;
1186 			bw->ContainerId = ad->ad_container->co_mntobj.ObjectId;
1187 			bw->SectorCount = bp->b_bcount / AAC_BLOCK_SIZE;
1188 			bw->BlockNumber = bio->bio_offset / AAC_BLOCK_SIZE;
1189 			bw->Pad = 0;
1190 			bw->Flags = 0;
1191 			fib->Header.Size += sizeof(struct aac_blockwrite64);
1192 			cm->cm_flags |= AAC_CMD_DATAIN;
1193 			cm->cm_sgtable = (struct aac_sg_table *)&bw->SgMap64;
1194 		}
1195 	}
1196 
1197 	*cmp = cm;
1198 	return(0);
1199 
1200 fail:
1201 	if (bio != NULL)
1202 		aac_enqueue_bio(sc, bio);
1203 	if (cm != NULL)
1204 		aac_release_command(cm);
1205 	return(ENOMEM);
1206 }
1207 
1208 /*
1209  * Handle a bio-instigated command that has been completed.
1210  */
1211 static void
1212 aac_bio_complete(struct aac_command *cm)
1213 {
1214 	struct aac_blockread_response *brr;
1215 	struct aac_blockwrite_response *bwr;
1216 	struct bio *bio;
1217 	struct buf *bp;
1218 	const char *code;
1219 	AAC_FSAStatus status;
1220 
1221 	/* fetch relevant status and then release the command */
1222 	bio = (struct bio *)cm->cm_private;
1223 	bp = bio->bio_buf;
1224 	if (bp->b_cmd == BUF_CMD_READ) {
1225 		brr = (struct aac_blockread_response *)&cm->cm_fib->data[0];
1226 		status = brr->Status;
1227 	} else {
1228 		bwr = (struct aac_blockwrite_response *)&cm->cm_fib->data[0];
1229 		status = bwr->Status;
1230 	}
1231 	aac_release_command(cm);
1232 
1233 	/* fix up the bio based on status */
1234 	if (status == ST_OK) {
1235 		bp->b_resid = 0;
1236 		code = 0;
1237 	} else {
1238 		bp->b_error = EIO;
1239 		bp->b_flags |= B_ERROR;
1240 		/* pass an error string out to the disk layer */
1241 		code = aac_describe_code(aac_command_status_table, status);
1242 	}
1243 	aac_biodone(bio, code);
1244 }
1245 
1246 /*
1247  * Dump a block of data to the controller.  If the queue is full, tell the
1248  * caller to hold off and wait for the queue to drain.
1249  */
1250 int
1251 aac_dump_enqueue(struct aac_disk *ad, u_int64_t lba, void *data, int dumppages)
1252 {
1253 	struct aac_softc *sc;
1254 	struct aac_command *cm;
1255 	struct aac_fib *fib;
1256 	struct aac_blockwrite *bw;
1257 
1258 	sc = ad->ad_controller;
1259 	cm = NULL;
1260 
1261 	KKASSERT(lba <= 0x100000000ULL);
1262 
1263 	if (aac_alloc_command(sc, &cm))
1264 		return (EBUSY);
1265 
1266 	/* fill out the command */
1267 	cm->cm_data = data;
1268 	cm->cm_datalen = dumppages * PAGE_SIZE;
1269 	cm->cm_complete = NULL;
1270 	cm->cm_private = NULL;
1271 	cm->cm_timestamp = time_second;
1272 	cm->cm_queue = AAC_ADAP_NORM_CMD_QUEUE;
1273 
1274 	/* build the FIB */
1275 	fib = cm->cm_fib;
1276 	fib->Header.XferState =
1277 	AAC_FIBSTATE_HOSTOWNED   |
1278 	AAC_FIBSTATE_INITIALISED |
1279 	AAC_FIBSTATE_FROMHOST	 |
1280 	AAC_FIBSTATE_REXPECTED   |
1281 	AAC_FIBSTATE_NORM;
1282 	fib->Header.Command = ContainerCommand;
1283 	fib->Header.Size = sizeof(struct aac_fib_header);
1284 
1285 	bw = (struct aac_blockwrite *)&fib->data[0];
1286 	bw->Command = VM_CtBlockWrite;
1287 	bw->ContainerId = ad->ad_container->co_mntobj.ObjectId;
1288 	bw->BlockNumber = lba;
1289 	bw->ByteCount = dumppages * PAGE_SIZE;
1290 	bw->Stable = CUNSTABLE;		/* XXX what's appropriate here? */
1291 	fib->Header.Size += sizeof(struct aac_blockwrite);
1292 	cm->cm_flags |= AAC_CMD_DATAOUT;
1293 	cm->cm_sgtable = &bw->SgMap;
1294 
1295 	return (aac_map_command(cm));
1296 }
1297 
1298 /*
1299  * Wait for the card's queue to drain when dumping.  Also check for monitor
1300  * kprintf's
1301  */
1302 void
1303 aac_dump_complete(struct aac_softc *sc)
1304 {
1305 	struct aac_fib *fib;
1306 	struct aac_command *cm;
1307 	u_int16_t reason;
1308 	u_int32_t pi, ci, fib_size;
1309 
1310 	do {
1311 		reason = AAC_GET_ISTATUS(sc);
1312 		if (reason & AAC_DB_RESPONSE_READY) {
1313 			AAC_CLEAR_ISTATUS(sc, AAC_DB_RESPONSE_READY);
1314 			for (;;) {
1315 				if (aac_dequeue_fib(sc,
1316 						    AAC_HOST_NORM_RESP_QUEUE,
1317 						    &fib_size, &fib))
1318 					break;
1319 				cm = (struct aac_command *)
1320 					fib->Header.SenderData;
1321 				if (cm == NULL)
1322 					AAC_PRINT_FIB(sc, fib);
1323 				else {
1324 					aac_remove_busy(cm);
1325 					aac_unmap_command(cm);
1326 					aac_enqueue_complete(cm);
1327 					aac_release_command(cm);
1328 				}
1329 			}
1330 		}
1331 		if (reason & AAC_DB_PRINTF) {
1332 			AAC_CLEAR_ISTATUS(sc, AAC_DB_PRINTF);
1333 			aac_print_printf(sc);
1334 		}
1335 		pi = sc->aac_queues->qt_qindex[AAC_ADAP_NORM_CMD_QUEUE][
1336 			AAC_PRODUCER_INDEX];
1337 		ci = sc->aac_queues->qt_qindex[AAC_ADAP_NORM_CMD_QUEUE][
1338 			AAC_CONSUMER_INDEX];
1339 	} while (ci != pi);
1340 
1341 	return;
1342 }
1343 
1344 /*
1345  * Submit a command to the controller, return when it completes.
1346  * XXX This is very dangerous!  If the card has gone out to lunch, we could
1347  *     be stuck here forever.  At the same time, signals are not caught
1348  *     because there is a risk that a signal could wakeup the sleep before
1349  *     the card has a chance to complete the command.  Since there is no way
1350  *     to cancel a command that is in progress, we can't protect against the
1351  *     card completing a command late and spamming the command and data
1352  *     memory.  So, we are held hostage until the command completes.
1353  */
1354 static int
1355 aac_wait_command(struct aac_command *cm)
1356 {
1357 	struct aac_softc *sc;
1358 	int error;
1359 
1360 	debug_called(2);
1361 
1362 	sc = cm->cm_sc;
1363 
1364 	/* Put the command on the ready queue and get things going */
1365 	cm->cm_queue = AAC_ADAP_NORM_CMD_QUEUE;
1366 	aac_enqueue_ready(cm);
1367 	aac_startio(sc);
1368 	/* Lock is held */
1369 	KKASSERT(lockstatus(&sc->aac_io_lock, curthread) != 0);
1370 	crit_enter();
1371 	tsleep_interlock(cm);
1372 	AAC_LOCK_RELEASE(&sc->aac_io_lock);
1373 	error = tsleep(cm, 0, "aacwait", 0);
1374 	AAC_LOCK_ACQUIRE(&sc->aac_io_lock);
1375 	crit_exit();
1376 	return(error);
1377 }
1378 
1379 /*
1380  *Command Buffer Management
1381  */
1382 
1383 /*
1384  * Allocate a command.
1385  */
1386 int
1387 aac_alloc_command(struct aac_softc *sc, struct aac_command **cmp)
1388 {
1389 	struct aac_command *cm;
1390 
1391 	debug_called(3);
1392 
1393 	if ((cm = aac_dequeue_free(sc)) == NULL) {
1394 		if (sc->total_fibs < sc->aac_max_fibs) {
1395 			sc->aifflags |= AAC_AIFFLAGS_ALLOCFIBS;
1396 			wakeup(sc->aifthread);
1397 		}
1398 		return (EBUSY);
1399 	}
1400 
1401 	*cmp = cm;
1402 	return(0);
1403 }
1404 
1405 /*
1406  * Release a command back to the freelist.
1407  */
1408 void
1409 aac_release_command(struct aac_command *cm)
1410 {
1411 	struct aac_event *event;
1412 	struct aac_softc *sc;
1413 
1414 	debug_called(3);
1415 
1416 	/* (re)initialise the command/FIB */
1417 	cm->cm_sgtable = NULL;
1418 	cm->cm_flags = 0;
1419 	cm->cm_complete = NULL;
1420 	cm->cm_private = NULL;
1421 	cm->cm_fib->Header.XferState = AAC_FIBSTATE_EMPTY;
1422 	cm->cm_fib->Header.StructType = AAC_FIBTYPE_TFIB;
1423 	cm->cm_fib->Header.Flags = 0;
1424 	cm->cm_fib->Header.SenderSize = cm->cm_sc->aac_max_fib_size;
1425 
1426 	/*
1427 	 * These are duplicated in aac_start to cover the case where an
1428 	 * intermediate stage may have destroyed them.  They're left
1429 	 * initialised here for debugging purposes only.
1430 	 */
1431 	cm->cm_fib->Header.ReceiverFibAddress = (u_int32_t)cm->cm_fibphys;
1432 	cm->cm_fib->Header.SenderData = 0;
1433 
1434 	aac_enqueue_free(cm);
1435 
1436 	sc = cm->cm_sc;
1437 	event = TAILQ_FIRST(&sc->aac_ev_cmfree);
1438 	if (event != NULL) {
1439 		TAILQ_REMOVE(&sc->aac_ev_cmfree, event, ev_links);
1440 		event->ev_callback(sc, event, event->ev_arg);
1441 	}
1442 }
1443 
1444 /*
1445  * Map helper for command/FIB allocation.
1446  */
1447 static void
1448 aac_map_command_helper(void *arg, bus_dma_segment_t *segs, int nseg, int error)
1449 {
1450 	uint64_t	*fibphys;
1451 
1452 	fibphys = (uint64_t *)arg;
1453 
1454 	debug_called(3);
1455 
1456 	*fibphys = segs[0].ds_addr;
1457 }
1458 
1459 /*
1460  * Allocate and initialise commands/FIBs for this adapter.
1461  */
1462 static int
1463 aac_alloc_commands(struct aac_softc *sc)
1464 {
1465 	struct aac_command *cm;
1466 	struct aac_fibmap *fm;
1467 	uint64_t fibphys;
1468 	int i, error;
1469 
1470 	debug_called(2);
1471 
1472 	if (sc->total_fibs + sc->aac_max_fibs_alloc > sc->aac_max_fibs)
1473 		return (ENOMEM);
1474 
1475 	fm = kmalloc(sizeof(struct aac_fibmap), M_AACBUF, M_INTWAIT | M_ZERO);
1476 
1477 	/* allocate the FIBs in DMAable memory and load them */
1478 	if (bus_dmamem_alloc(sc->aac_fib_dmat, (void **)&fm->aac_fibs,
1479 			     BUS_DMA_NOWAIT, &fm->aac_fibmap)) {
1480 		device_printf(sc->aac_dev,
1481 			      "Not enough contiguous memory available.\n");
1482 		kfree(fm, M_AACBUF);
1483 		return (ENOMEM);
1484 	}
1485 
1486 	/* Ignore errors since this doesn't bounce */
1487 	bus_dmamap_load(sc->aac_fib_dmat, fm->aac_fibmap, fm->aac_fibs,
1488 			sc->aac_max_fibs_alloc * sc->aac_max_fib_size,
1489 			aac_map_command_helper, &fibphys, 0);
1490 
1491 	/* initialise constant fields in the command structure */
1492 	bzero(fm->aac_fibs, sc->aac_max_fibs_alloc * sc->aac_max_fib_size);
1493 	for (i = 0; i < sc->aac_max_fibs_alloc; i++) {
1494 		cm = sc->aac_commands + sc->total_fibs;
1495 		fm->aac_commands = cm;
1496 		cm->cm_sc = sc;
1497 		cm->cm_fib = (struct aac_fib *)
1498 			((u_int8_t *)fm->aac_fibs + i*sc->aac_max_fib_size);
1499 		cm->cm_fibphys = fibphys + i*sc->aac_max_fib_size;
1500 		cm->cm_index = sc->total_fibs;
1501 
1502 		if ((error = bus_dmamap_create(sc->aac_buffer_dmat, 0,
1503 					       &cm->cm_datamap)) != 0)
1504 			break;
1505 		AAC_LOCK_ACQUIRE(&sc->aac_io_lock);
1506 		aac_release_command(cm);
1507 		sc->total_fibs++;
1508 		AAC_LOCK_RELEASE(&sc->aac_io_lock);
1509 	}
1510 
1511 	if (i > 0) {
1512 		AAC_LOCK_ACQUIRE(&sc->aac_io_lock);
1513 		TAILQ_INSERT_TAIL(&sc->aac_fibmap_tqh, fm, fm_link);
1514 		debug(1, "total_fibs= %d\n", sc->total_fibs);
1515 		AAC_LOCK_RELEASE(&sc->aac_io_lock);
1516 		return (0);
1517 	}
1518 
1519 	bus_dmamap_unload(sc->aac_fib_dmat, fm->aac_fibmap);
1520 	bus_dmamem_free(sc->aac_fib_dmat, fm->aac_fibs, fm->aac_fibmap);
1521 	kfree(fm, M_AACBUF);
1522 	return (ENOMEM);
1523 }
1524 
1525 /*
1526  * Free FIBs owned by this adapter.
1527  */
1528 static void
1529 aac_free_commands(struct aac_softc *sc)
1530 {
1531 	struct aac_fibmap *fm;
1532 	struct aac_command *cm;
1533 	int i;
1534 
1535 	debug_called(1);
1536 
1537 	while ((fm = TAILQ_FIRST(&sc->aac_fibmap_tqh)) != NULL) {
1538 
1539 		TAILQ_REMOVE(&sc->aac_fibmap_tqh, fm, fm_link);
1540 		/*
1541 		 * We check against total_fibs to handle partially
1542 		 * allocated blocks.
1543 		 */
1544 		for (i = 0; i < sc->aac_max_fibs_alloc && sc->total_fibs--; i++) {
1545 			cm = fm->aac_commands + i;
1546 			bus_dmamap_destroy(sc->aac_buffer_dmat, cm->cm_datamap);
1547 		}
1548 		bus_dmamap_unload(sc->aac_fib_dmat, fm->aac_fibmap);
1549 		bus_dmamem_free(sc->aac_fib_dmat, fm->aac_fibs, fm->aac_fibmap);
1550 		kfree(fm, M_AACBUF);
1551 	}
1552 }
1553 
1554 /*
1555  * Command-mapping helper function - populate this command's s/g table.
1556  */
1557 static void
1558 aac_map_command_sg(void *arg, bus_dma_segment_t *segs, int nseg, int error)
1559 {
1560 	struct aac_softc *sc;
1561 	struct aac_command *cm;
1562 	struct aac_fib *fib;
1563 	int i;
1564 
1565 	debug_called(3);
1566 
1567 	cm = (struct aac_command *)arg;
1568 	sc = cm->cm_sc;
1569 	fib = cm->cm_fib;
1570 
1571 	/* copy into the FIB */
1572 	if (cm->cm_sgtable != NULL) {
1573 		if (fib->Header.Command == RawIo) {
1574 			struct aac_sg_tableraw *sg;
1575 			sg = (struct aac_sg_tableraw *)cm->cm_sgtable;
1576 			sg->SgCount = nseg;
1577 			for (i = 0; i < nseg; i++) {
1578 				sg->SgEntryRaw[i].SgAddress = segs[i].ds_addr;
1579 				sg->SgEntryRaw[i].SgByteCount = segs[i].ds_len;
1580 				sg->SgEntryRaw[i].Next = 0;
1581 				sg->SgEntryRaw[i].Prev = 0;
1582 				sg->SgEntryRaw[i].Flags = 0;
1583 			}
1584 			/* update the FIB size for the s/g count */
1585 			fib->Header.Size += nseg*sizeof(struct aac_sg_entryraw);
1586 		} else if ((cm->cm_sc->flags & AAC_FLAGS_SG_64BIT) == 0) {
1587 			struct aac_sg_table *sg;
1588 			sg = cm->cm_sgtable;
1589 			sg->SgCount = nseg;
1590 			for (i = 0; i < nseg; i++) {
1591 				sg->SgEntry[i].SgAddress = segs[i].ds_addr;
1592 				sg->SgEntry[i].SgByteCount = segs[i].ds_len;
1593 			}
1594 			/* update the FIB size for the s/g count */
1595 			fib->Header.Size += nseg*sizeof(struct aac_sg_entry);
1596 		} else {
1597 			struct aac_sg_table64 *sg;
1598 			sg = (struct aac_sg_table64 *)cm->cm_sgtable;
1599 			sg->SgCount = nseg;
1600 			for (i = 0; i < nseg; i++) {
1601 				sg->SgEntry64[i].SgAddress = segs[i].ds_addr;
1602 				sg->SgEntry64[i].SgByteCount = segs[i].ds_len;
1603 			}
1604 			/* update the FIB size for the s/g count */
1605 			fib->Header.Size += nseg*sizeof(struct aac_sg_entry64);
1606 		}
1607 	}
1608 
1609 	/* Fix up the address values in the FIB.  Use the command array index
1610 	 * instead of a pointer since these fields are only 32 bits.  Shift
1611 	 * the SenderFibAddress over to make room for the fast response bit
1612 	 * and for the AIF bit
1613 	 */
1614 	cm->cm_fib->Header.SenderFibAddress = (cm->cm_index << 2);
1615 	cm->cm_fib->Header.ReceiverFibAddress = (u_int32_t)cm->cm_fibphys;
1616 
1617 	/* save a pointer to the command for speedy reverse-lookup */
1618 	cm->cm_fib->Header.SenderData = cm->cm_index;
1619 
1620 	if (cm->cm_flags & AAC_CMD_DATAIN)
1621 		bus_dmamap_sync(sc->aac_buffer_dmat, cm->cm_datamap,
1622 				BUS_DMASYNC_PREREAD);
1623 	if (cm->cm_flags & AAC_CMD_DATAOUT)
1624 		bus_dmamap_sync(sc->aac_buffer_dmat, cm->cm_datamap,
1625 				BUS_DMASYNC_PREWRITE);
1626 	cm->cm_flags |= AAC_CMD_MAPPED;
1627 
1628 	if (sc->flags & AAC_FLAGS_NEW_COMM) {
1629 		int count = 10000000L;
1630 		while (AAC_SEND_COMMAND(sc, cm) != 0) {
1631 			if (--count == 0) {
1632 				aac_unmap_command(cm);
1633 				sc->flags |= AAC_QUEUE_FRZN;
1634 				aac_requeue_ready(cm);
1635 				break;
1636 			}
1637 			DELAY(5);			/* wait 5 usec. */
1638 		}
1639 	} else {
1640 		/* Put the FIB on the outbound queue */
1641 		if (aac_enqueue_fib(sc, cm->cm_queue, cm) == EBUSY) {
1642 			aac_unmap_command(cm);
1643 			sc->flags |= AAC_QUEUE_FRZN;
1644 			aac_requeue_ready(cm);
1645 		}
1646 	}
1647 }
1648 
1649 /*
1650  * Unmap a command from controller-visible space.
1651  */
1652 static void
1653 aac_unmap_command(struct aac_command *cm)
1654 {
1655 	struct aac_softc *sc;
1656 
1657 	debug_called(2);
1658 
1659 	sc = cm->cm_sc;
1660 
1661 	if (!(cm->cm_flags & AAC_CMD_MAPPED))
1662 		return;
1663 
1664 	if (cm->cm_datalen != 0) {
1665 		if (cm->cm_flags & AAC_CMD_DATAIN)
1666 			bus_dmamap_sync(sc->aac_buffer_dmat, cm->cm_datamap,
1667 					BUS_DMASYNC_POSTREAD);
1668 		if (cm->cm_flags & AAC_CMD_DATAOUT)
1669 			bus_dmamap_sync(sc->aac_buffer_dmat, cm->cm_datamap,
1670 					BUS_DMASYNC_POSTWRITE);
1671 
1672 		bus_dmamap_unload(sc->aac_buffer_dmat, cm->cm_datamap);
1673 	}
1674 	cm->cm_flags &= ~AAC_CMD_MAPPED;
1675 }
1676 
1677 /*
1678  * Hardware Interface
1679  */
1680 
1681 /*
1682  * Initialise the adapter.
1683  */
1684 static void
1685 aac_common_map(void *arg, bus_dma_segment_t *segs, int nseg, int error)
1686 {
1687 	struct aac_softc *sc;
1688 
1689 	debug_called(1);
1690 
1691 	sc = (struct aac_softc *)arg;
1692 
1693 	sc->aac_common_busaddr = segs[0].ds_addr;
1694 }
1695 
1696 static int
1697 aac_check_firmware(struct aac_softc *sc)
1698 {
1699 	u_int32_t major, minor, options = 0, atu_size = 0;
1700 	int status;
1701 
1702 	debug_called(1);
1703 
1704 	/*
1705 	 * Retrieve the firmware version numbers.  Dell PERC2/QC cards with
1706 	 * firmware version 1.x are not compatible with this driver.
1707 	 */
1708 	if (sc->flags & AAC_FLAGS_PERC2QC) {
1709 		if (aac_sync_command(sc, AAC_MONKER_GETKERNVER, 0, 0, 0, 0,
1710 				     NULL)) {
1711 			device_printf(sc->aac_dev,
1712 				      "Error reading firmware version\n");
1713 			return (EIO);
1714 		}
1715 
1716 		/* These numbers are stored as ASCII! */
1717 		major = (AAC_GET_MAILBOX(sc, 1) & 0xff) - 0x30;
1718 		minor = (AAC_GET_MAILBOX(sc, 2) & 0xff) - 0x30;
1719 		if (major == 1) {
1720 			device_printf(sc->aac_dev,
1721 			    "Firmware version %d.%d is not supported.\n",
1722 			    major, minor);
1723 			return (EINVAL);
1724 		}
1725 	}
1726 
1727 	/*
1728 	 * Retrieve the capabilities/supported options word so we know what
1729 	 * work-arounds to enable.  Some firmware revs don't support this
1730 	 * command.
1731 	 */
1732 	if (aac_sync_command(sc, AAC_MONKER_GETINFO, 0, 0, 0, 0, &status)) {
1733 		if (status != AAC_SRB_STS_INVALID_REQUEST) {
1734 			device_printf(sc->aac_dev,
1735 			     "RequestAdapterInfo failed\n");
1736 			return (EIO);
1737 		}
1738 	} else {
1739 		options = AAC_GET_MAILBOX(sc, 1);
1740 		atu_size = AAC_GET_MAILBOX(sc, 2);
1741 		sc->supported_options = options;
1742 
1743 		if ((options & AAC_SUPPORTED_4GB_WINDOW) != 0 &&
1744 		    (sc->flags & AAC_FLAGS_NO4GB) == 0)
1745 			sc->flags |= AAC_FLAGS_4GB_WINDOW;
1746 		if (options & AAC_SUPPORTED_NONDASD)
1747 			sc->flags |= AAC_FLAGS_ENABLE_CAM;
1748 		if ((options & AAC_SUPPORTED_SGMAP_HOST64) != 0
1749 		     && (sizeof(bus_addr_t) > 4)) {
1750 			device_printf(sc->aac_dev,
1751 			    "Enabling 64-bit address support\n");
1752 			sc->flags |= AAC_FLAGS_SG_64BIT;
1753 		}
1754 		if ((options & AAC_SUPPORTED_NEW_COMM)
1755 		 && sc->aac_if.aif_send_command)
1756 			sc->flags |= AAC_FLAGS_NEW_COMM;
1757 		if (options & AAC_SUPPORTED_64BIT_ARRAYSIZE)
1758 			sc->flags |= AAC_FLAGS_ARRAY_64BIT;
1759 	}
1760 
1761 	/* Check for broken hardware that does a lower number of commands */
1762 	sc->aac_max_fibs = (sc->flags & AAC_FLAGS_256FIBS ? 256:512);
1763 
1764 	/* Remap mem. resource, if required */
1765 	if ((sc->flags & AAC_FLAGS_NEW_COMM) &&
1766 		atu_size > rman_get_size(sc->aac_regs_resource)) {
1767 		bus_release_resource(
1768 			sc->aac_dev, SYS_RES_MEMORY,
1769 			sc->aac_regs_rid, sc->aac_regs_resource);
1770 		sc->aac_regs_resource = bus_alloc_resource(
1771 			sc->aac_dev, SYS_RES_MEMORY, &sc->aac_regs_rid,
1772 			0ul, ~0ul, atu_size, RF_ACTIVE);
1773 		if (sc->aac_regs_resource == NULL) {
1774 			sc->aac_regs_resource = bus_alloc_resource_any(
1775 				sc->aac_dev, SYS_RES_MEMORY,
1776 				&sc->aac_regs_rid, RF_ACTIVE);
1777 			if (sc->aac_regs_resource == NULL) {
1778 				device_printf(sc->aac_dev,
1779 				    "couldn't allocate register window\n");
1780 				return (ENXIO);
1781 			}
1782 			sc->flags &= ~AAC_FLAGS_NEW_COMM;
1783 		}
1784 		sc->aac_btag = rman_get_bustag(sc->aac_regs_resource);
1785 		sc->aac_bhandle = rman_get_bushandle(sc->aac_regs_resource);
1786 	}
1787 
1788 	/* Read preferred settings */
1789 	sc->aac_max_fib_size = sizeof(struct aac_fib);
1790 	sc->aac_max_sectors = 128;				/* 64KB */
1791 	if (sc->flags & AAC_FLAGS_SG_64BIT)
1792 		sc->aac_sg_tablesize = (AAC_FIB_DATASIZE
1793 		 - sizeof(struct aac_blockwrite64)
1794 		 + sizeof(struct aac_sg_table64))
1795 		 / sizeof(struct aac_sg_table64);
1796 	else
1797 		sc->aac_sg_tablesize = (AAC_FIB_DATASIZE
1798 		 - sizeof(struct aac_blockwrite)
1799 		 + sizeof(struct aac_sg_table))
1800 		 / sizeof(struct aac_sg_table);
1801 
1802 	if (!aac_sync_command(sc, AAC_MONKER_GETCOMMPREF, 0, 0, 0, 0, NULL)) {
1803 		options = AAC_GET_MAILBOX(sc, 1);
1804 		sc->aac_max_fib_size = (options & 0xFFFF);
1805 		sc->aac_max_sectors = (options >> 16) << 1;
1806 		options = AAC_GET_MAILBOX(sc, 2);
1807 		sc->aac_sg_tablesize = (options >> 16);
1808 		options = AAC_GET_MAILBOX(sc, 3);
1809 		sc->aac_max_fibs = (options & 0xFFFF);
1810 	}
1811 	if (sc->aac_max_fib_size > PAGE_SIZE)
1812 		sc->aac_max_fib_size = PAGE_SIZE;
1813 	sc->aac_max_fibs_alloc = PAGE_SIZE / sc->aac_max_fib_size;
1814 
1815 	return (0);
1816 }
1817 
1818 static int
1819 aac_init(struct aac_softc *sc)
1820 {
1821 	struct aac_adapter_init	*ip;
1822 	time_t then;
1823 	u_int32_t code, qoffset;
1824 	int error;
1825 
1826 	debug_called(1);
1827 
1828 	/*
1829 	 * First wait for the adapter to come ready.
1830 	 */
1831 	then = time_second;
1832 	do {
1833 		code = AAC_GET_FWSTATUS(sc);
1834 		if (code & AAC_SELF_TEST_FAILED) {
1835 			device_printf(sc->aac_dev, "FATAL: selftest failed\n");
1836 			return(ENXIO);
1837 		}
1838 		if (code & AAC_KERNEL_PANIC) {
1839 			device_printf(sc->aac_dev,
1840 				      "FATAL: controller kernel panic\n");
1841 			return(ENXIO);
1842 		}
1843 		if (time_second > (then + AAC_BOOT_TIMEOUT)) {
1844 			device_printf(sc->aac_dev,
1845 				      "FATAL: controller not coming ready, "
1846 					   "status %x\n", code);
1847 			return(ENXIO);
1848 		}
1849 	} while (!(code & AAC_UP_AND_RUNNING));
1850 
1851  	error = ENOMEM;
1852  	/*
1853  	 * Create DMA tag for mapping buffers into controller-addressable space.
1854  	 */
1855  	if (bus_dma_tag_create(sc->aac_parent_dmat, 	/* parent */
1856  			       1, 0, 			/* algnmnt, boundary */
1857 			       (sc->flags & AAC_FLAGS_SG_64BIT) ?
1858 			       BUS_SPACE_MAXADDR :
1859  			       BUS_SPACE_MAXADDR_32BIT,	/* lowaddr */
1860  			       BUS_SPACE_MAXADDR, 	/* highaddr */
1861  			       NULL, NULL, 		/* filter, filterarg */
1862  			       MAXBSIZE,		/* maxsize */
1863  			       sc->aac_sg_tablesize,	/* nsegments */
1864  			       MAXBSIZE,		/* maxsegsize */
1865  			       BUS_DMA_ALLOCNOW,	/* flags */
1866  			       &sc->aac_buffer_dmat)) {
1867  		device_printf(sc->aac_dev, "can't allocate buffer DMA tag\n");
1868  		goto out;
1869  	}
1870 
1871  	/*
1872  	 * Create DMA tag for mapping FIBs into controller-addressable space..
1873  	 */
1874  	if (bus_dma_tag_create(sc->aac_parent_dmat,	/* parent */
1875  			       1, 0, 			/* algnmnt, boundary */
1876  			       (sc->flags & AAC_FLAGS_4GB_WINDOW) ?
1877  			       BUS_SPACE_MAXADDR_32BIT :
1878  			       0x7fffffff,		/* lowaddr */
1879  			       BUS_SPACE_MAXADDR, 	/* highaddr */
1880  			       NULL, NULL, 		/* filter, filterarg */
1881 			       sc->aac_max_fibs_alloc *
1882 			       sc->aac_max_fib_size,	/* maxsize */
1883  			       1,			/* nsegments */
1884 			       sc->aac_max_fibs_alloc *
1885 			       sc->aac_max_fib_size,	/* maxsegsize */
1886  			       0,			/* flags */
1887  			       &sc->aac_fib_dmat)) {
1888  		device_printf(sc->aac_dev, "can't allocate FIB DMA tag\n");
1889  		goto out;
1890  	}
1891 
1892 	/*
1893 	 * Create DMA tag for the common structure and allocate it.
1894 	 */
1895 	if (bus_dma_tag_create(sc->aac_parent_dmat, 	/* parent */
1896 			       1, 0,			/* algnmnt, boundary */
1897 			       (sc->flags & AAC_FLAGS_4GB_WINDOW) ?
1898 			       BUS_SPACE_MAXADDR_32BIT :
1899 			       0x7fffffff,		/* lowaddr */
1900 			       BUS_SPACE_MAXADDR, 	/* highaddr */
1901 			       NULL, NULL, 		/* filter, filterarg */
1902 			       8192 + sizeof(struct aac_common), /* maxsize */
1903 			       1,			/* nsegments */
1904 			       BUS_SPACE_MAXSIZE_32BIT,	/* maxsegsize */
1905 			       0,			/* flags */
1906 			       &sc->aac_common_dmat)) {
1907 		device_printf(sc->aac_dev,
1908 			      "can't allocate common structure DMA tag\n");
1909 		goto out;
1910 	}
1911 	if (bus_dmamem_alloc(sc->aac_common_dmat, (void **)&sc->aac_common,
1912 			     BUS_DMA_NOWAIT, &sc->aac_common_dmamap)) {
1913 		device_printf(sc->aac_dev, "can't allocate common structure\n");
1914 		goto out;
1915 	}
1916 	/*
1917 	 * Work around a bug in the 2120 and 2200 that cannot DMA commands
1918 	 * below address 8192 in physical memory.
1919 	 * XXX If the padding is not needed, can it be put to use instead
1920 	 * of ignored?
1921 	 */
1922 	bus_dmamap_load(sc->aac_common_dmat, sc->aac_common_dmamap,
1923 			sc->aac_common, 8192 + sizeof(*sc->aac_common),
1924 			aac_common_map, sc, 0);
1925 
1926 	if (sc->aac_common_busaddr < 8192) {
1927 		sc->aac_common =
1928 		    (struct aac_common *)((uint8_t *)sc->aac_common + 8192);
1929 		sc->aac_common_busaddr += 8192;
1930 	}
1931 	bzero(sc->aac_common, sizeof(*sc->aac_common));
1932 
1933 	/* Allocate some FIBs and associated command structs */
1934 	TAILQ_INIT(&sc->aac_fibmap_tqh);
1935 	sc->aac_commands = kmalloc(sc->aac_max_fibs * sizeof(struct aac_command),
1936 				  M_AACBUF, M_INTWAIT | M_ZERO);
1937 	while (sc->total_fibs < AAC_PREALLOCATE_FIBS) {
1938 		if (aac_alloc_commands(sc) != 0)
1939 			break;
1940 	}
1941 	if (sc->total_fibs == 0)
1942 		goto out;
1943 
1944 	/*
1945 	 * Fill in the init structure.  This tells the adapter about the
1946 	 * physical location of various important shared data structures.
1947 	 */
1948 	ip = &sc->aac_common->ac_init;
1949 	ip->InitStructRevision = AAC_INIT_STRUCT_REVISION;
1950 	if (sc->aac_max_fib_size > sizeof(struct aac_fib)) {
1951 		ip->InitStructRevision = AAC_INIT_STRUCT_REVISION_4;
1952 		sc->flags |= AAC_FLAGS_RAW_IO;
1953 	}
1954 	ip->MiniPortRevision = AAC_INIT_STRUCT_MINIPORT_REVISION;
1955 
1956 	ip->AdapterFibsPhysicalAddress = sc->aac_common_busaddr +
1957 					 offsetof(struct aac_common, ac_fibs);
1958 	ip->AdapterFibsVirtualAddress = 0;
1959 	ip->AdapterFibsSize = AAC_ADAPTER_FIBS * sizeof(struct aac_fib);
1960 	ip->AdapterFibAlign = sizeof(struct aac_fib);
1961 
1962 	ip->PrintfBufferAddress = sc->aac_common_busaddr +
1963 				  offsetof(struct aac_common, ac_printf);
1964 	ip->PrintfBufferSize = AAC_PRINTF_BUFSIZE;
1965 
1966 	/*
1967 	 * The adapter assumes that pages are 4K in size, except on some
1968 	 * broken firmware versions that do the page->byte conversion twice,
1969 	 * therefore 'assuming' that this value is in 16MB units (2^24).
1970 	 * Round up since the granularity is so high.
1971 	 */
1972 	/* XXX why should the adapter care? */
1973 	ip->HostPhysMemPages = ctob((int)Maxmem) / AAC_PAGE_SIZE;
1974 	if (sc->flags & AAC_FLAGS_BROKEN_MEMMAP) {
1975 		ip->HostPhysMemPages =
1976 		    (ip->HostPhysMemPages + AAC_PAGE_SIZE) / AAC_PAGE_SIZE;
1977 	}
1978 	ip->HostElapsedSeconds = time_second;	/* reset later if invalid */
1979 
1980 	ip->InitFlags = 0;
1981 	if (sc->flags & AAC_FLAGS_NEW_COMM) {
1982 		ip->InitFlags = INITFLAGS_NEW_COMM_SUPPORTED;
1983 		device_printf(sc->aac_dev, "New comm. interface enabled\n");
1984 	}
1985 
1986 	ip->MaxIoCommands = sc->aac_max_fibs;
1987 	ip->MaxIoSize = sc->aac_max_sectors << 9;
1988 	ip->MaxFibSize = sc->aac_max_fib_size;
1989 
1990 	/*
1991 	 * Initialise FIB queues.  Note that it appears that the layout of the
1992 	 * indexes and the segmentation of the entries may be mandated by the
1993 	 * adapter, which is only told about the base of the queue index fields.
1994 	 *
1995 	 * The initial values of the indices are assumed to inform the adapter
1996 	 * of the sizes of the respective queues, and theoretically it could
1997 	 * work out the entire layout of the queue structures from this.  We
1998 	 * take the easy route and just lay this area out like everyone else
1999 	 * does.
2000 	 *
2001 	 * The Linux driver uses a much more complex scheme whereby several
2002 	 * header records are kept for each queue.  We use a couple of generic
2003 	 * list manipulation functions which 'know' the size of each list by
2004 	 * virtue of a table.
2005 	 */
2006 	qoffset = offsetof(struct aac_common, ac_qbuf) + AAC_QUEUE_ALIGN;
2007 	qoffset &= ~(AAC_QUEUE_ALIGN - 1);
2008 	sc->aac_queues =
2009 	    (struct aac_queue_table *)((uintptr_t)sc->aac_common + qoffset);
2010 	ip->CommHeaderAddress = sc->aac_common_busaddr + qoffset;
2011 
2012 	sc->aac_queues->qt_qindex[AAC_HOST_NORM_CMD_QUEUE][AAC_PRODUCER_INDEX] =
2013 		AAC_HOST_NORM_CMD_ENTRIES;
2014 	sc->aac_queues->qt_qindex[AAC_HOST_NORM_CMD_QUEUE][AAC_CONSUMER_INDEX] =
2015 		AAC_HOST_NORM_CMD_ENTRIES;
2016 	sc->aac_queues->qt_qindex[AAC_HOST_HIGH_CMD_QUEUE][AAC_PRODUCER_INDEX] =
2017 		AAC_HOST_HIGH_CMD_ENTRIES;
2018 	sc->aac_queues->qt_qindex[AAC_HOST_HIGH_CMD_QUEUE][AAC_CONSUMER_INDEX] =
2019 		AAC_HOST_HIGH_CMD_ENTRIES;
2020 	sc->aac_queues->qt_qindex[AAC_ADAP_NORM_CMD_QUEUE][AAC_PRODUCER_INDEX] =
2021 		AAC_ADAP_NORM_CMD_ENTRIES;
2022 	sc->aac_queues->qt_qindex[AAC_ADAP_NORM_CMD_QUEUE][AAC_CONSUMER_INDEX] =
2023 		AAC_ADAP_NORM_CMD_ENTRIES;
2024 	sc->aac_queues->qt_qindex[AAC_ADAP_HIGH_CMD_QUEUE][AAC_PRODUCER_INDEX] =
2025 		AAC_ADAP_HIGH_CMD_ENTRIES;
2026 	sc->aac_queues->qt_qindex[AAC_ADAP_HIGH_CMD_QUEUE][AAC_CONSUMER_INDEX] =
2027 		AAC_ADAP_HIGH_CMD_ENTRIES;
2028 	sc->aac_queues->qt_qindex[AAC_HOST_NORM_RESP_QUEUE][AAC_PRODUCER_INDEX]=
2029 		AAC_HOST_NORM_RESP_ENTRIES;
2030 	sc->aac_queues->qt_qindex[AAC_HOST_NORM_RESP_QUEUE][AAC_CONSUMER_INDEX]=
2031 		AAC_HOST_NORM_RESP_ENTRIES;
2032 	sc->aac_queues->qt_qindex[AAC_HOST_HIGH_RESP_QUEUE][AAC_PRODUCER_INDEX]=
2033 		AAC_HOST_HIGH_RESP_ENTRIES;
2034 	sc->aac_queues->qt_qindex[AAC_HOST_HIGH_RESP_QUEUE][AAC_CONSUMER_INDEX]=
2035 		AAC_HOST_HIGH_RESP_ENTRIES;
2036 	sc->aac_queues->qt_qindex[AAC_ADAP_NORM_RESP_QUEUE][AAC_PRODUCER_INDEX]=
2037 		AAC_ADAP_NORM_RESP_ENTRIES;
2038 	sc->aac_queues->qt_qindex[AAC_ADAP_NORM_RESP_QUEUE][AAC_CONSUMER_INDEX]=
2039 		AAC_ADAP_NORM_RESP_ENTRIES;
2040 	sc->aac_queues->qt_qindex[AAC_ADAP_HIGH_RESP_QUEUE][AAC_PRODUCER_INDEX]=
2041 		AAC_ADAP_HIGH_RESP_ENTRIES;
2042 	sc->aac_queues->qt_qindex[AAC_ADAP_HIGH_RESP_QUEUE][AAC_CONSUMER_INDEX]=
2043 		AAC_ADAP_HIGH_RESP_ENTRIES;
2044 	sc->aac_qentries[AAC_HOST_NORM_CMD_QUEUE] =
2045 		&sc->aac_queues->qt_HostNormCmdQueue[0];
2046 	sc->aac_qentries[AAC_HOST_HIGH_CMD_QUEUE] =
2047 		&sc->aac_queues->qt_HostHighCmdQueue[0];
2048 	sc->aac_qentries[AAC_ADAP_NORM_CMD_QUEUE] =
2049 		&sc->aac_queues->qt_AdapNormCmdQueue[0];
2050 	sc->aac_qentries[AAC_ADAP_HIGH_CMD_QUEUE] =
2051 		&sc->aac_queues->qt_AdapHighCmdQueue[0];
2052 	sc->aac_qentries[AAC_HOST_NORM_RESP_QUEUE] =
2053 		&sc->aac_queues->qt_HostNormRespQueue[0];
2054 	sc->aac_qentries[AAC_HOST_HIGH_RESP_QUEUE] =
2055 		&sc->aac_queues->qt_HostHighRespQueue[0];
2056 	sc->aac_qentries[AAC_ADAP_NORM_RESP_QUEUE] =
2057 		&sc->aac_queues->qt_AdapNormRespQueue[0];
2058 	sc->aac_qentries[AAC_ADAP_HIGH_RESP_QUEUE] =
2059 		&sc->aac_queues->qt_AdapHighRespQueue[0];
2060 
2061 	/*
2062 	 * Do controller-type-specific initialisation
2063 	 */
2064 	switch (sc->aac_hwif) {
2065 	case AAC_HWIF_I960RX:
2066 		AAC_SETREG4(sc, AAC_RX_ODBR, ~0);
2067 		break;
2068 	case AAC_HWIF_RKT:
2069 		AAC_SETREG4(sc, AAC_RKT_ODBR, ~0);
2070 		break;
2071 	default:
2072 		break;
2073 	}
2074 
2075 	/*
2076 	 * Give the init structure to the controller.
2077 	 */
2078 	if (aac_sync_command(sc, AAC_MONKER_INITSTRUCT,
2079 			     sc->aac_common_busaddr +
2080 			     offsetof(struct aac_common, ac_init), 0, 0, 0,
2081 			     NULL)) {
2082 		device_printf(sc->aac_dev,
2083 			      "error establishing init structure\n");
2084 		error = EIO;
2085 		goto out;
2086 	}
2087 
2088 	error = 0;
2089 out:
2090 	return(error);
2091 }
2092 
2093 /*
2094  * Send a synchronous command to the controller and wait for a result.
2095  * Indicate if the controller completed the command with an error status.
2096  */
2097 static int
2098 aac_sync_command(struct aac_softc *sc, u_int32_t command,
2099 		 u_int32_t arg0, u_int32_t arg1, u_int32_t arg2, u_int32_t arg3,
2100 		 u_int32_t *sp)
2101 {
2102 	time_t then;
2103 	u_int32_t status;
2104 
2105 	debug_called(3);
2106 
2107 	/* populate the mailbox */
2108 	AAC_SET_MAILBOX(sc, command, arg0, arg1, arg2, arg3);
2109 
2110 	/* ensure the sync command doorbell flag is cleared */
2111 	AAC_CLEAR_ISTATUS(sc, AAC_DB_SYNC_COMMAND);
2112 
2113 	/* then set it to signal the adapter */
2114 	AAC_QNOTIFY(sc, AAC_DB_SYNC_COMMAND);
2115 
2116 	/* spin waiting for the command to complete */
2117 	then = time_second;
2118 	do {
2119 		if (time_second > (then + AAC_IMMEDIATE_TIMEOUT)) {
2120 			debug(1, "timed out");
2121 			return(EIO);
2122 		}
2123 	} while (!(AAC_GET_ISTATUS(sc) & AAC_DB_SYNC_COMMAND));
2124 
2125 	/* clear the completion flag */
2126 	AAC_CLEAR_ISTATUS(sc, AAC_DB_SYNC_COMMAND);
2127 
2128 	/* get the command status */
2129 	status = AAC_GET_MAILBOX(sc, 0);
2130 	if (sp != NULL)
2131 		*sp = status;
2132 
2133 	if (status != AAC_SRB_STS_SUCCESS)
2134 		return (-1);
2135 	return(0);
2136 }
2137 
2138 int
2139 aac_sync_fib(struct aac_softc *sc, u_int32_t command, u_int32_t xferstate,
2140 		 struct aac_fib *fib, u_int16_t datasize)
2141 {
2142 	debug_called(3);
2143 	KKASSERT(lockstatus(&sc->aac_io_lock, curthread) != 0);
2144 
2145 	if (datasize > AAC_FIB_DATASIZE)
2146 		return(EINVAL);
2147 
2148 	/*
2149 	 * Set up the sync FIB
2150 	 */
2151 	fib->Header.XferState = AAC_FIBSTATE_HOSTOWNED |
2152 				AAC_FIBSTATE_INITIALISED |
2153 				AAC_FIBSTATE_EMPTY;
2154 	fib->Header.XferState |= xferstate;
2155 	fib->Header.Command = command;
2156 	fib->Header.StructType = AAC_FIBTYPE_TFIB;
2157 	fib->Header.Size = sizeof(struct aac_fib) + datasize;
2158 	fib->Header.SenderSize = sizeof(struct aac_fib);
2159 	fib->Header.SenderFibAddress = 0;	/* Not needed */
2160 	fib->Header.ReceiverFibAddress = sc->aac_common_busaddr +
2161 					 offsetof(struct aac_common,
2162 						  ac_sync_fib);
2163 
2164 	/*
2165 	 * Give the FIB to the controller, wait for a response.
2166 	 */
2167 	if (aac_sync_command(sc, AAC_MONKER_SYNCFIB,
2168 			     fib->Header.ReceiverFibAddress, 0, 0, 0, NULL)) {
2169 		debug(2, "IO error");
2170 		return(EIO);
2171 	}
2172 
2173 	return (0);
2174 }
2175 
2176 /*
2177  * Adapter-space FIB queue manipulation
2178  *
2179  * Note that the queue implementation here is a little funky; neither the PI or
2180  * CI will ever be zero.  This behaviour is a controller feature.
2181  */
2182 static struct {
2183 	int		size;
2184 	int		notify;
2185 } aac_qinfo[] = {
2186 	{AAC_HOST_NORM_CMD_ENTRIES, AAC_DB_COMMAND_NOT_FULL},
2187 	{AAC_HOST_HIGH_CMD_ENTRIES, 0},
2188 	{AAC_ADAP_NORM_CMD_ENTRIES, AAC_DB_COMMAND_READY},
2189 	{AAC_ADAP_HIGH_CMD_ENTRIES, 0},
2190 	{AAC_HOST_NORM_RESP_ENTRIES, AAC_DB_RESPONSE_NOT_FULL},
2191 	{AAC_HOST_HIGH_RESP_ENTRIES, 0},
2192 	{AAC_ADAP_NORM_RESP_ENTRIES, AAC_DB_RESPONSE_READY},
2193 	{AAC_ADAP_HIGH_RESP_ENTRIES, 0}
2194 };
2195 
2196 /*
2197  * Atomically insert an entry into the nominated queue, returns 0 on success or
2198  * EBUSY if the queue is full.
2199  *
2200  * Note: it would be more efficient to defer notifying the controller in
2201  *	 the case where we may be inserting several entries in rapid succession,
2202  *	 but implementing this usefully may be difficult (it would involve a
2203  *	 separate queue/notify interface).
2204  */
2205 static int
2206 aac_enqueue_fib(struct aac_softc *sc, int queue, struct aac_command *cm)
2207 {
2208 	u_int32_t pi, ci;
2209 	int error;
2210 	u_int32_t fib_size;
2211 	u_int32_t fib_addr;
2212 
2213 	debug_called(3);
2214 
2215 	fib_size = cm->cm_fib->Header.Size;
2216 	fib_addr = cm->cm_fib->Header.ReceiverFibAddress;
2217 
2218 	/* get the producer/consumer indices */
2219 	pi = sc->aac_queues->qt_qindex[queue][AAC_PRODUCER_INDEX];
2220 	ci = sc->aac_queues->qt_qindex[queue][AAC_CONSUMER_INDEX];
2221 
2222 	/* wrap the queue? */
2223 	if (pi >= aac_qinfo[queue].size)
2224 		pi = 0;
2225 
2226 	/* check for queue full */
2227 	if ((pi + 1) == ci) {
2228 		error = EBUSY;
2229 		goto out;
2230 	}
2231 	/*
2232 	 * To avoid a race with its completion interrupt, place this command on
2233 	 * the busy queue prior to advertising it to the controller.
2234 	 */
2235 	aac_enqueue_busy(cm);
2236 
2237 
2238 
2239 	/* populate queue entry */
2240 	(sc->aac_qentries[queue] + pi)->aq_fib_size = fib_size;
2241 	(sc->aac_qentries[queue] + pi)->aq_fib_addr = fib_addr;
2242 
2243 	/* update producer index */
2244 	sc->aac_queues->qt_qindex[queue][AAC_PRODUCER_INDEX] = pi + 1;
2245 
2246 	/* notify the adapter if we know how */
2247 	if (aac_qinfo[queue].notify != 0)
2248 		AAC_QNOTIFY(sc, aac_qinfo[queue].notify);
2249 
2250 	error = 0;
2251 
2252 out:
2253 	return(error);
2254 }
2255 
2256 /*
2257  * Atomically remove one entry from the nominated queue, returns 0 on
2258  * success or ENOENT if the queue is empty.
2259  */
2260 static int
2261 aac_dequeue_fib(struct aac_softc *sc, int queue, u_int32_t *fib_size,
2262 		struct aac_fib **fib_addr)
2263 {
2264 	u_int32_t pi, ci;
2265 	u_int32_t fib_index;
2266 	int error;
2267 	int notify;
2268 
2269 	debug_called(3);
2270 
2271 	/* get the producer/consumer indices */
2272 	pi = sc->aac_queues->qt_qindex[queue][AAC_PRODUCER_INDEX];
2273 	ci = sc->aac_queues->qt_qindex[queue][AAC_CONSUMER_INDEX];
2274 
2275 	/* check for queue empty */
2276 	if (ci == pi) {
2277 		error = ENOENT;
2278 		goto out;
2279 	}
2280 
2281 	/* wrap the pi so the following test works */
2282 	if (pi >= aac_qinfo[queue].size)
2283 		pi = 0;
2284 
2285 	notify = 0;
2286 	if (ci == pi + 1)
2287 		notify++;
2288 
2289 	/* wrap the queue? */
2290 	if (ci >= aac_qinfo[queue].size)
2291 		ci = 0;
2292 
2293 	/* fetch the entry */
2294 	*fib_size = (sc->aac_qentries[queue] + ci)->aq_fib_size;
2295 
2296 	switch (queue) {
2297 	case AAC_HOST_NORM_CMD_QUEUE:
2298 	case AAC_HOST_HIGH_CMD_QUEUE:
2299 		/*
2300 		 * The aq_fib_addr is only 32 bits wide so it can't be counted
2301 		 * on to hold an address.  For AIF's, the adapter assumes
2302 		 * that it's giving us an address into the array of AIF fibs.
2303 		 * Therefore, we have to convert it to an index.
2304 		 */
2305 		fib_index = (sc->aac_qentries[queue] + ci)->aq_fib_addr /
2306 			sizeof(struct aac_fib);
2307 		*fib_addr = &sc->aac_common->ac_fibs[fib_index];
2308 		break;
2309 
2310 	case AAC_HOST_NORM_RESP_QUEUE:
2311 	case AAC_HOST_HIGH_RESP_QUEUE:
2312 	{
2313 		struct aac_command *cm;
2314 
2315 		/*
2316 		 * As above, an index is used instead of an actual address.
2317 		 * Gotta shift the index to account for the fast response
2318 		 * bit.  No other correction is needed since this value was
2319 		 * originally provided by the driver via the SenderFibAddress
2320 		 * field.
2321 		 */
2322 		fib_index = (sc->aac_qentries[queue] + ci)->aq_fib_addr;
2323 		cm = sc->aac_commands + (fib_index >> 2);
2324 		*fib_addr = cm->cm_fib;
2325 
2326 		/*
2327 		 * Is this a fast response? If it is, update the fib fields in
2328 		 * local memory since the whole fib isn't DMA'd back up.
2329 		 */
2330 		if (fib_index & 0x01) {
2331 			(*fib_addr)->Header.XferState |= AAC_FIBSTATE_DONEADAP;
2332 			*((u_int32_t*)((*fib_addr)->data)) = AAC_ERROR_NORMAL;
2333 		}
2334 		break;
2335 	}
2336 	default:
2337 		panic("Invalid queue in aac_dequeue_fib()");
2338 		break;
2339 	}
2340 
2341 	/* update consumer index */
2342 	sc->aac_queues->qt_qindex[queue][AAC_CONSUMER_INDEX] = ci + 1;
2343 
2344 	/* if we have made the queue un-full, notify the adapter */
2345 	if (notify && (aac_qinfo[queue].notify != 0))
2346 		AAC_QNOTIFY(sc, aac_qinfo[queue].notify);
2347 	error = 0;
2348 
2349 out:
2350 	return(error);
2351 }
2352 
2353 /*
2354  * Put our response to an Adapter Initialed Fib on the response queue
2355  */
2356 static int
2357 aac_enqueue_response(struct aac_softc *sc, int queue, struct aac_fib *fib)
2358 {
2359 	u_int32_t pi, ci;
2360 	int error;
2361 	u_int32_t fib_size;
2362 	u_int32_t fib_addr;
2363 
2364 	debug_called(1);
2365 
2366 	/* Tell the adapter where the FIB is */
2367 	fib_size = fib->Header.Size;
2368 	fib_addr = fib->Header.SenderFibAddress;
2369 	fib->Header.ReceiverFibAddress = fib_addr;
2370 
2371 	/* get the producer/consumer indices */
2372 	pi = sc->aac_queues->qt_qindex[queue][AAC_PRODUCER_INDEX];
2373 	ci = sc->aac_queues->qt_qindex[queue][AAC_CONSUMER_INDEX];
2374 
2375 	/* wrap the queue? */
2376 	if (pi >= aac_qinfo[queue].size)
2377 		pi = 0;
2378 
2379 	/* check for queue full */
2380 	if ((pi + 1) == ci) {
2381 		error = EBUSY;
2382 		goto out;
2383 	}
2384 
2385 	/* populate queue entry */
2386 	(sc->aac_qentries[queue] + pi)->aq_fib_size = fib_size;
2387 	(sc->aac_qentries[queue] + pi)->aq_fib_addr = fib_addr;
2388 
2389 	/* update producer index */
2390 	sc->aac_queues->qt_qindex[queue][AAC_PRODUCER_INDEX] = pi + 1;
2391 
2392 	/* notify the adapter if we know how */
2393 	if (aac_qinfo[queue].notify != 0)
2394 		AAC_QNOTIFY(sc, aac_qinfo[queue].notify);
2395 
2396 	error = 0;
2397 
2398 out:
2399 	return(error);
2400 }
2401 
2402 /*
2403  * Check for commands that have been outstanding for a suspiciously long time,
2404  * and complain about them.
2405  */
2406 static void
2407 aac_timeout(void *xsc)
2408 {
2409 	struct aac_softc *sc = xsc;
2410 	struct aac_command *cm;
2411 	time_t deadline;
2412 	int timedout, code;
2413 	/*
2414 	 * Traverse the busy command list, bitch about late commands once
2415 	 * only.
2416 	 */
2417 	timedout = 0;
2418 	deadline = time_second - AAC_CMD_TIMEOUT;
2419 	TAILQ_FOREACH(cm, &sc->aac_busy, cm_link) {
2420 		if ((cm->cm_timestamp  < deadline)
2421 			/* && !(cm->cm_flags & AAC_CMD_TIMEDOUT) */) {
2422 			cm->cm_flags |= AAC_CMD_TIMEDOUT;
2423 			device_printf(sc->aac_dev,
2424 				      "COMMAND %p TIMEOUT AFTER %d SECONDS\n",
2425 				      cm, (int)(time_second-cm->cm_timestamp));
2426 			AAC_PRINT_FIB(sc, cm->cm_fib);
2427 			timedout++;
2428 		}
2429 	}
2430 	if (timedout) {
2431 		code = AAC_GET_FWSTATUS(sc);
2432 		if (code != AAC_UP_AND_RUNNING) {
2433 			device_printf(sc->aac_dev, "WARNING! Controller is no "
2434 				      "longer running! code= 0x%x\n", code);
2435 
2436 		}
2437 	}
2438 }
2439 
2440 /*
2441  * Interface Function Vectors
2442  */
2443 
2444 /*
2445  * Read the current firmware status word.
2446  */
2447 static int
2448 aac_sa_get_fwstatus(struct aac_softc *sc)
2449 {
2450 	debug_called(3);
2451 
2452 	return(AAC_GETREG4(sc, AAC_SA_FWSTATUS));
2453 }
2454 
2455 static int
2456 aac_rx_get_fwstatus(struct aac_softc *sc)
2457 {
2458 	debug_called(3);
2459 
2460 	return(AAC_GETREG4(sc, AAC_RX_FWSTATUS));
2461 }
2462 
2463 static int
2464 aac_fa_get_fwstatus(struct aac_softc *sc)
2465 {
2466 	int val;
2467 
2468 	debug_called(3);
2469 
2470 	val = AAC_GETREG4(sc, AAC_FA_FWSTATUS);
2471 	return (val);
2472 }
2473 
2474 static int
2475 aac_rkt_get_fwstatus(struct aac_softc *sc)
2476 {
2477 	debug_called(3);
2478 
2479 	return(AAC_GETREG4(sc, AAC_RKT_FWSTATUS));
2480 }
2481 
2482 /*
2483  * Notify the controller of a change in a given queue
2484  */
2485 
2486 static void
2487 aac_sa_qnotify(struct aac_softc *sc, int qbit)
2488 {
2489 	debug_called(3);
2490 
2491 	AAC_SETREG2(sc, AAC_SA_DOORBELL1_SET, qbit);
2492 }
2493 
2494 static void
2495 aac_rx_qnotify(struct aac_softc *sc, int qbit)
2496 {
2497 	debug_called(3);
2498 
2499 	AAC_SETREG4(sc, AAC_RX_IDBR, qbit);
2500 }
2501 
2502 static void
2503 aac_fa_qnotify(struct aac_softc *sc, int qbit)
2504 {
2505 	debug_called(3);
2506 
2507 	AAC_SETREG2(sc, AAC_FA_DOORBELL1, qbit);
2508 	AAC_FA_HACK(sc);
2509 }
2510 
2511 static void
2512 aac_rkt_qnotify(struct aac_softc *sc, int qbit)
2513 {
2514 	debug_called(3);
2515 
2516 	AAC_SETREG4(sc, AAC_RKT_IDBR, qbit);
2517 }
2518 
2519 /*
2520  * Get the interrupt reason bits
2521  */
2522 static int
2523 aac_sa_get_istatus(struct aac_softc *sc)
2524 {
2525 	debug_called(3);
2526 
2527 	return(AAC_GETREG2(sc, AAC_SA_DOORBELL0));
2528 }
2529 
2530 static int
2531 aac_rx_get_istatus(struct aac_softc *sc)
2532 {
2533 	debug_called(3);
2534 
2535 	return(AAC_GETREG4(sc, AAC_RX_ODBR));
2536 }
2537 
2538 static int
2539 aac_fa_get_istatus(struct aac_softc *sc)
2540 {
2541 	int val;
2542 
2543 	debug_called(3);
2544 
2545 	val = AAC_GETREG2(sc, AAC_FA_DOORBELL0);
2546 	return (val);
2547 }
2548 
2549 static int
2550 aac_rkt_get_istatus(struct aac_softc *sc)
2551 {
2552 	debug_called(3);
2553 
2554 	return(AAC_GETREG4(sc, AAC_RKT_ODBR));
2555 }
2556 
2557 /*
2558  * Clear some interrupt reason bits
2559  */
2560 static void
2561 aac_sa_clear_istatus(struct aac_softc *sc, int mask)
2562 {
2563 	debug_called(3);
2564 
2565 	AAC_SETREG2(sc, AAC_SA_DOORBELL0_CLEAR, mask);
2566 }
2567 
2568 static void
2569 aac_rx_clear_istatus(struct aac_softc *sc, int mask)
2570 {
2571 	debug_called(3);
2572 
2573 	AAC_SETREG4(sc, AAC_RX_ODBR, mask);
2574 }
2575 
2576 static void
2577 aac_fa_clear_istatus(struct aac_softc *sc, int mask)
2578 {
2579 	debug_called(3);
2580 
2581 	AAC_SETREG2(sc, AAC_FA_DOORBELL0_CLEAR, mask);
2582 	AAC_FA_HACK(sc);
2583 }
2584 
2585 static void
2586 aac_rkt_clear_istatus(struct aac_softc *sc, int mask)
2587 {
2588 	debug_called(3);
2589 
2590 	AAC_SETREG4(sc, AAC_RKT_ODBR, mask);
2591 }
2592 
2593 /*
2594  * Populate the mailbox and set the command word
2595  */
2596 static void
2597 aac_sa_set_mailbox(struct aac_softc *sc, u_int32_t command,
2598 		u_int32_t arg0, u_int32_t arg1, u_int32_t arg2, u_int32_t arg3)
2599 {
2600 	debug_called(4);
2601 
2602 	AAC_SETREG4(sc, AAC_SA_MAILBOX, command);
2603 	AAC_SETREG4(sc, AAC_SA_MAILBOX + 4, arg0);
2604 	AAC_SETREG4(sc, AAC_SA_MAILBOX + 8, arg1);
2605 	AAC_SETREG4(sc, AAC_SA_MAILBOX + 12, arg2);
2606 	AAC_SETREG4(sc, AAC_SA_MAILBOX + 16, arg3);
2607 }
2608 
2609 static void
2610 aac_rx_set_mailbox(struct aac_softc *sc, u_int32_t command,
2611 		u_int32_t arg0, u_int32_t arg1, u_int32_t arg2, u_int32_t arg3)
2612 {
2613 	debug_called(4);
2614 
2615 	AAC_SETREG4(sc, AAC_RX_MAILBOX, command);
2616 	AAC_SETREG4(sc, AAC_RX_MAILBOX + 4, arg0);
2617 	AAC_SETREG4(sc, AAC_RX_MAILBOX + 8, arg1);
2618 	AAC_SETREG4(sc, AAC_RX_MAILBOX + 12, arg2);
2619 	AAC_SETREG4(sc, AAC_RX_MAILBOX + 16, arg3);
2620 }
2621 
2622 static void
2623 aac_fa_set_mailbox(struct aac_softc *sc, u_int32_t command,
2624 		u_int32_t arg0, u_int32_t arg1, u_int32_t arg2, u_int32_t arg3)
2625 {
2626 	debug_called(4);
2627 
2628 	AAC_SETREG4(sc, AAC_FA_MAILBOX, command);
2629 	AAC_FA_HACK(sc);
2630 	AAC_SETREG4(sc, AAC_FA_MAILBOX + 4, arg0);
2631 	AAC_FA_HACK(sc);
2632 	AAC_SETREG4(sc, AAC_FA_MAILBOX + 8, arg1);
2633 	AAC_FA_HACK(sc);
2634 	AAC_SETREG4(sc, AAC_FA_MAILBOX + 12, arg2);
2635 	AAC_FA_HACK(sc);
2636 	AAC_SETREG4(sc, AAC_FA_MAILBOX + 16, arg3);
2637 	AAC_FA_HACK(sc);
2638 }
2639 
2640 static void
2641 aac_rkt_set_mailbox(struct aac_softc *sc, u_int32_t command, u_int32_t arg0,
2642 		    u_int32_t arg1, u_int32_t arg2, u_int32_t arg3)
2643 {
2644 	debug_called(4);
2645 
2646 	AAC_SETREG4(sc, AAC_RKT_MAILBOX, command);
2647 	AAC_SETREG4(sc, AAC_RKT_MAILBOX + 4, arg0);
2648 	AAC_SETREG4(sc, AAC_RKT_MAILBOX + 8, arg1);
2649 	AAC_SETREG4(sc, AAC_RKT_MAILBOX + 12, arg2);
2650 	AAC_SETREG4(sc, AAC_RKT_MAILBOX + 16, arg3);
2651 }
2652 
2653 /*
2654  * Fetch the immediate command status word
2655  */
2656 static int
2657 aac_sa_get_mailbox(struct aac_softc *sc, int mb)
2658 {
2659 	debug_called(4);
2660 
2661 	return(AAC_GETREG4(sc, AAC_SA_MAILBOX + (mb * 4)));
2662 }
2663 
2664 static int
2665 aac_rx_get_mailbox(struct aac_softc *sc, int mb)
2666 {
2667 	debug_called(4);
2668 
2669 	return(AAC_GETREG4(sc, AAC_RX_MAILBOX + (mb * 4)));
2670 }
2671 
2672 static int
2673 aac_fa_get_mailbox(struct aac_softc *sc, int mb)
2674 {
2675 	int val;
2676 
2677 	debug_called(4);
2678 
2679 	val = AAC_GETREG4(sc, AAC_FA_MAILBOX + (mb * 4));
2680 	return (val);
2681 }
2682 
2683 static int
2684 aac_rkt_get_mailbox(struct aac_softc *sc, int mb)
2685 {
2686 	debug_called(4);
2687 
2688 	return(AAC_GETREG4(sc, AAC_RKT_MAILBOX + (mb * 4)));
2689 }
2690 
2691 /*
2692  * Set/clear interrupt masks
2693  */
2694 static void
2695 aac_sa_set_interrupts(struct aac_softc *sc, int enable)
2696 {
2697 	debug(2, "%sable interrupts", enable ? "en" : "dis");
2698 
2699 	if (enable) {
2700 		AAC_SETREG2((sc), AAC_SA_MASK0_CLEAR, AAC_DB_INTERRUPTS);
2701 	} else {
2702 		AAC_SETREG2((sc), AAC_SA_MASK0_SET, ~0);
2703 	}
2704 }
2705 
2706 static void
2707 aac_rx_set_interrupts(struct aac_softc *sc, int enable)
2708 {
2709 	debug(2, "%sable interrupts", enable ? "en" : "dis");
2710 
2711 	if (enable) {
2712 		if (sc->flags & AAC_FLAGS_NEW_COMM)
2713 			AAC_SETREG4(sc, AAC_RX_OIMR, ~AAC_DB_INT_NEW_COMM);
2714 		else
2715 			AAC_SETREG4(sc, AAC_RX_OIMR, ~AAC_DB_INTERRUPTS);
2716 	} else {
2717 		AAC_SETREG4(sc, AAC_RX_OIMR, ~0);
2718 	}
2719 }
2720 
2721 static void
2722 aac_fa_set_interrupts(struct aac_softc *sc, int enable)
2723 {
2724 	debug(2, "%sable interrupts", enable ? "en" : "dis");
2725 
2726 	if (enable) {
2727 		AAC_SETREG2((sc), AAC_FA_MASK0_CLEAR, AAC_DB_INTERRUPTS);
2728 		AAC_FA_HACK(sc);
2729 	} else {
2730 		AAC_SETREG2((sc), AAC_FA_MASK0, ~0);
2731 		AAC_FA_HACK(sc);
2732 	}
2733 }
2734 
2735 static void
2736 aac_rkt_set_interrupts(struct aac_softc *sc, int enable)
2737 {
2738 	debug(2, "%sable interrupts", enable ? "en" : "dis");
2739 
2740 	if (enable) {
2741 		if (sc->flags & AAC_FLAGS_NEW_COMM)
2742 			AAC_SETREG4(sc, AAC_RKT_OIMR, ~AAC_DB_INT_NEW_COMM);
2743 		else
2744 			AAC_SETREG4(sc, AAC_RKT_OIMR, ~AAC_DB_INTERRUPTS);
2745 	} else {
2746 		AAC_SETREG4(sc, AAC_RKT_OIMR, ~0);
2747 	}
2748 }
2749 
2750 /*
2751  * New comm. interface: Send command functions
2752  */
2753 static int
2754 aac_rx_send_command(struct aac_softc *sc, struct aac_command *cm)
2755 {
2756 	u_int32_t index, device;
2757 
2758 	debug(2, "send command (new comm.)");
2759 
2760 	index = AAC_GETREG4(sc, AAC_RX_IQUE);
2761 	if (index == 0xffffffffL)
2762 		index = AAC_GETREG4(sc, AAC_RX_IQUE);
2763 	if (index == 0xffffffffL)
2764 		return index;
2765 	aac_enqueue_busy(cm);
2766 	device = index;
2767 	AAC_SETREG4(sc, device, (u_int32_t)(cm->cm_fibphys & 0xffffffffUL));
2768 	device += 4;
2769 	AAC_SETREG4(sc, device, (u_int32_t)(cm->cm_fibphys >> 32));
2770 	device += 4;
2771 	AAC_SETREG4(sc, device, cm->cm_fib->Header.Size);
2772 	AAC_SETREG4(sc, AAC_RX_IQUE, index);
2773 	return 0;
2774 }
2775 
2776 static int
2777 aac_rkt_send_command(struct aac_softc *sc, struct aac_command *cm)
2778 {
2779 	u_int32_t index, device;
2780 
2781 	debug(2, "send command (new comm.)");
2782 
2783 	index = AAC_GETREG4(sc, AAC_RKT_IQUE);
2784 	if (index == 0xffffffffL)
2785 		index = AAC_GETREG4(sc, AAC_RKT_IQUE);
2786 	if (index == 0xffffffffL)
2787 		return index;
2788 	aac_enqueue_busy(cm);
2789 	device = index;
2790 	AAC_SETREG4(sc, device, (u_int32_t)(cm->cm_fibphys & 0xffffffffUL));
2791 	device += 4;
2792 	AAC_SETREG4(sc, device, (u_int32_t)(cm->cm_fibphys >> 32));
2793 	device += 4;
2794 	AAC_SETREG4(sc, device, cm->cm_fib->Header.Size);
2795 	AAC_SETREG4(sc, AAC_RKT_IQUE, index);
2796 	return 0;
2797 }
2798 
2799 /*
2800  * New comm. interface: get, set outbound queue index
2801  */
2802 static int
2803 aac_rx_get_outb_queue(struct aac_softc *sc)
2804 {
2805 	debug_called(3);
2806 
2807 	return(AAC_GETREG4(sc, AAC_RX_OQUE));
2808 }
2809 
2810 static int
2811 aac_rkt_get_outb_queue(struct aac_softc *sc)
2812 {
2813 	debug_called(3);
2814 
2815 	return(AAC_GETREG4(sc, AAC_RKT_OQUE));
2816 }
2817 
2818 static void
2819 aac_rx_set_outb_queue(struct aac_softc *sc, int index)
2820 {
2821 	debug_called(3);
2822 
2823 	AAC_SETREG4(sc, AAC_RX_OQUE, index);
2824 }
2825 
2826 static void
2827 aac_rkt_set_outb_queue(struct aac_softc *sc, int index)
2828 {
2829 	debug_called(3);
2830 
2831 	AAC_SETREG4(sc, AAC_RKT_OQUE, index);
2832 }
2833 
2834 /*
2835  * Debugging and Diagnostics
2836  */
2837 
2838 /*
2839  * Print some information about the controller.
2840  */
2841 static void
2842 aac_describe_controller(struct aac_softc *sc)
2843 {
2844 	struct aac_fib *fib;
2845 	struct aac_adapter_info	*info;
2846 
2847 	debug_called(2);
2848 
2849 	AAC_LOCK_ACQUIRE(&sc->aac_io_lock);
2850 	aac_alloc_sync_fib(sc, &fib);
2851 
2852 	fib->data[0] = 0;
2853 	if (aac_sync_fib(sc, RequestAdapterInfo, 0, fib, 1)) {
2854 		device_printf(sc->aac_dev, "RequestAdapterInfo failed\n");
2855 		aac_release_sync_fib(sc);
2856 		AAC_LOCK_RELEASE(&sc->aac_io_lock);
2857 		return;
2858 	}
2859 
2860 	/* save the kernel revision structure for later use */
2861 	info = (struct aac_adapter_info *)&fib->data[0];
2862 	sc->aac_revision = info->KernelRevision;
2863 
2864 	device_printf(sc->aac_dev, "Adaptec Raid Controller %d.%d.%d-%d\n",
2865 		AAC_DRIVER_VERSION >> 24,
2866 		(AAC_DRIVER_VERSION >> 16) & 0xFF,
2867 		AAC_DRIVER_VERSION & 0xFF,
2868 		AAC_DRIVER_BUILD);
2869 
2870 	if (bootverbose) {
2871 		device_printf(sc->aac_dev, "%s %dMHz, %dMB memory "
2872 		    "(%dMB cache, %dMB execution), %s\n",
2873 		    aac_describe_code(aac_cpu_variant, info->CpuVariant),
2874 		    info->ClockSpeed, info->TotalMem / (1024 * 1024),
2875 		    info->BufferMem / (1024 * 1024),
2876 		    info->ExecutionMem / (1024 * 1024),
2877 		    aac_describe_code(aac_battery_platform,
2878 		    info->batteryPlatform));
2879 
2880 		device_printf(sc->aac_dev,
2881 		    "Kernel %d.%d-%d, Build %d, S/N %6X\n",
2882 		    info->KernelRevision.external.comp.major,
2883 		    info->KernelRevision.external.comp.minor,
2884 		    info->KernelRevision.external.comp.dash,
2885 		    info->KernelRevision.buildNumber,
2886 		    (u_int32_t)(info->SerialNumber & 0xffffff));
2887 
2888 		device_printf(sc->aac_dev, "Supported Options=%b\n",
2889 			      sc->supported_options,
2890 			      "\20"
2891 			      "\1SNAPSHOT"
2892 			      "\2CLUSTERS"
2893 			      "\3WCACHE"
2894 			      "\4DATA64"
2895 			      "\5HOSTTIME"
2896 			      "\6RAID50"
2897 			      "\7WINDOW4GB"
2898 			      "\10SCSIUPGD"
2899 			      "\11SOFTERR"
2900 			      "\12NORECOND"
2901 			      "\13SGMAP64"
2902 			      "\14ALARM"
2903 			      "\15NONDASD"
2904 			      "\16SCSIMGT"
2905 			      "\17RAIDSCSI"
2906 			      "\21ADPTINFO"
2907 			      "\22NEWCOMM"
2908 			      "\23ARRAY64BIT"
2909 			      "\24HEATSENSOR");
2910 	}
2911 	aac_release_sync_fib(sc);
2912 	AAC_LOCK_RELEASE(&sc->aac_io_lock);
2913 }
2914 
2915 /*
2916  * Look up a text description of a numeric error code and return a pointer to
2917  * same.
2918  */
2919 static char *
2920 aac_describe_code(struct aac_code_lookup *table, u_int32_t code)
2921 {
2922 	int i;
2923 
2924 	for (i = 0; table[i].string != NULL; i++)
2925 		if (table[i].code == code)
2926 			return(table[i].string);
2927 	return(table[i + 1].string);
2928 }
2929 
2930 /*
2931  * Management Interface
2932  */
2933 
2934 static int
2935 aac_open(struct dev_open_args *ap)
2936 {
2937 	cdev_t dev = ap->a_head.a_dev;
2938 	struct aac_softc *sc;
2939 
2940 	debug_called(2);
2941 
2942 	sc = dev->si_drv1;
2943 
2944 	/* Check to make sure the device isn't already open */
2945 	if (sc->aac_state & AAC_STATE_OPEN) {
2946 		return EBUSY;
2947 	}
2948 	sc->aac_state |= AAC_STATE_OPEN;
2949 
2950 	return 0;
2951 }
2952 
2953 static int
2954 aac_close(struct dev_close_args *ap)
2955 {
2956 	cdev_t dev = ap->a_head.a_dev;
2957 	struct aac_softc *sc;
2958 
2959 	debug_called(2);
2960 
2961 	sc = dev->si_drv1;
2962 
2963 	/* Mark this unit as no longer open  */
2964 	sc->aac_state &= ~AAC_STATE_OPEN;
2965 
2966 	return 0;
2967 }
2968 
2969 static int
2970 aac_ioctl(struct dev_ioctl_args *ap)
2971 {
2972 	cdev_t dev = ap->a_head.a_dev;
2973 	caddr_t arg = ap->a_data;
2974 	struct aac_softc *sc = dev->si_drv1;
2975 	int error = 0;
2976 	uint32_t cookie;
2977 
2978 	debug_called(2);
2979 
2980 	if (ap->a_cmd == AACIO_STATS) {
2981 		union aac_statrequest *as = (union aac_statrequest *)arg;
2982 
2983 		switch (as->as_item) {
2984 		case AACQ_FREE:
2985 		case AACQ_BIO:
2986 		case AACQ_READY:
2987 		case AACQ_BUSY:
2988 		case AACQ_COMPLETE:
2989 			bcopy(&sc->aac_qstat[as->as_item], &as->as_qstat,
2990 			      sizeof(struct aac_qstat));
2991 			break;
2992 		default:
2993 			error = ENOENT;
2994 			break;
2995 		}
2996 		return(error);
2997 	}
2998 
2999 	arg = *(caddr_t *)arg;
3000 
3001 	switch (ap->a_cmd) {
3002 	/* AACIO_STATS already handled above */
3003 	case FSACTL_SENDFIB:
3004 		debug(1, "FSACTL_SENDFIB");
3005 		error = aac_ioctl_sendfib(sc, arg);
3006 		break;
3007 	case FSACTL_AIF_THREAD:
3008 		debug(1, "FSACTL_AIF_THREAD");
3009 		error = EINVAL;
3010 		break;
3011 	case FSACTL_OPEN_GET_ADAPTER_FIB:
3012 		debug(1, "FSACTL_OPEN_GET_ADAPTER_FIB");
3013 		/*
3014 		 * Pass the caller out an AdapterFibContext.
3015 		 *
3016 		 * Note that because we only support one opener, we
3017 		 * basically ignore this.  Set the caller's context to a magic
3018 		 * number just in case.
3019 		 *
3020 		 * The Linux code hands the driver a pointer into kernel space,
3021 		 * and then trusts it when the caller hands it back.  Aiee!
3022 		 * Here, we give it the proc pointer of the per-adapter aif
3023 		 * thread. It's only used as a sanity check in other calls.
3024 		 */
3025 		cookie = (uint32_t)(uintptr_t)sc->aifthread;
3026 		error = copyout(&cookie, arg, sizeof(cookie));
3027 		break;
3028 	case FSACTL_GET_NEXT_ADAPTER_FIB:
3029 		debug(1, "FSACTL_GET_NEXT_ADAPTER_FIB");
3030 		error = aac_getnext_aif(sc, arg);
3031 		break;
3032 	case FSACTL_CLOSE_GET_ADAPTER_FIB:
3033 		debug(1, "FSACTL_CLOSE_GET_ADAPTER_FIB");
3034 		/* don't do anything here */
3035 		break;
3036 	case FSACTL_MINIPORT_REV_CHECK:
3037 		debug(1, "FSACTL_MINIPORT_REV_CHECK");
3038 		error = aac_rev_check(sc, arg);
3039 		break;
3040 	case FSACTL_QUERY_DISK:
3041 		debug(1, "FSACTL_QUERY_DISK");
3042 		error = aac_query_disk(sc, arg);
3043 		break;
3044 	case FSACTL_DELETE_DISK:
3045 		/*
3046 		 * We don't trust the underland to tell us when to delete a
3047 		 * container, rather we rely on an AIF coming from the
3048 		 * controller
3049 		 */
3050 		error = 0;
3051 		break;
3052 	case FSACTL_GET_PCI_INFO:
3053 		arg = *(caddr_t*)arg;
3054 	case FSACTL_LNX_GET_PCI_INFO:
3055 		debug(1, "FSACTL_GET_PCI_INFO");
3056 		error = aac_get_pci_info(sc, arg);
3057 		break;
3058 	default:
3059 		debug(1, "unsupported cmd 0x%lx\n", ap->a_cmd);
3060 		error = EINVAL;
3061 		break;
3062 	}
3063 	return(error);
3064 }
3065 
3066 static int
3067 aac_poll(struct dev_poll_args *ap)
3068 {
3069 	cdev_t dev = ap->a_head.a_dev;
3070 	struct aac_softc *sc;
3071 	int revents;
3072 
3073 	sc = dev->si_drv1;
3074 	revents = 0;
3075 
3076 	AAC_LOCK_ACQUIRE(&sc->aac_aifq_lock);
3077 	if ((ap->a_events & (POLLRDNORM | POLLIN)) != 0) {
3078 		if (sc->aac_aifq_tail != sc->aac_aifq_head)
3079 			revents |= ap->a_events & (POLLIN | POLLRDNORM);
3080 	}
3081 	AAC_LOCK_RELEASE(&sc->aac_aifq_lock);
3082 
3083 	if (revents == 0) {
3084 		if (ap->a_events & (POLLIN | POLLRDNORM))
3085 			selrecord(curthread, &sc->rcv_select);
3086 	}
3087 	ap->a_events = revents;
3088 	return (0);
3089 }
3090 
3091 static void
3092 aac_ioctl_event(struct aac_softc *sc, struct aac_event *event, void *arg)
3093 {
3094 
3095 	switch (event->ev_type) {
3096 	case AAC_EVENT_CMFREE:
3097 		AAC_LOCK_ACQUIRE(&sc->aac_io_lock);
3098 		if (aac_alloc_command(sc, (struct aac_command **)arg)) {
3099 			aac_add_event(sc, event);
3100 			AAC_LOCK_RELEASE(&sc->aac_io_lock);
3101 			return;
3102 		}
3103 		kfree(event, M_AACBUF);
3104 		wakeup(arg);
3105 		AAC_LOCK_RELEASE(&sc->aac_io_lock);
3106 		break;
3107 	default:
3108 		break;
3109 	}
3110 }
3111 
3112 /*
3113  * Send a FIB supplied from userspace
3114  */
3115 static int
3116 aac_ioctl_sendfib(struct aac_softc *sc, caddr_t ufib)
3117 {
3118 	struct aac_command *cm;
3119 	int size, error;
3120 
3121 	debug_called(2);
3122 
3123 	cm = NULL;
3124 
3125 	/*
3126 	 * Get a command
3127 	 */
3128 	AAC_LOCK_ACQUIRE(&sc->aac_io_lock);
3129 	if (aac_alloc_command(sc, &cm)) {
3130 		struct aac_event *event;
3131 
3132 		event = kmalloc(sizeof(struct aac_event), M_AACBUF,
3133 		    M_INTWAIT | M_ZERO);
3134 		event->ev_type = AAC_EVENT_CMFREE;
3135 		event->ev_callback = aac_ioctl_event;
3136 		event->ev_arg = &cm;
3137 		aac_add_event(sc, event);
3138 		crit_enter();
3139 		tsleep_interlock(&cm);
3140 		AAC_LOCK_RELEASE(&sc->aac_io_lock);
3141 		tsleep(&cm, 0, "sendfib", 0);
3142 		AAC_LOCK_ACQUIRE(&sc->aac_io_lock);
3143 		crit_exit();
3144 	}
3145 	AAC_LOCK_RELEASE(&sc->aac_io_lock);
3146 
3147 	/*
3148 	 * Fetch the FIB header, then re-copy to get data as well.
3149 	 */
3150 	if ((error = copyin(ufib, cm->cm_fib,
3151 			    sizeof(struct aac_fib_header))) != 0)
3152 		goto out;
3153 	size = cm->cm_fib->Header.Size + sizeof(struct aac_fib_header);
3154 	if (size > sizeof(struct aac_fib)) {
3155 		device_printf(sc->aac_dev, "incoming FIB oversized (%d > %zd)\n",
3156 			      size, sizeof(struct aac_fib));
3157 		size = sizeof(struct aac_fib);
3158 	}
3159 	if ((error = copyin(ufib, cm->cm_fib, size)) != 0)
3160 		goto out;
3161 	cm->cm_fib->Header.Size = size;
3162 	cm->cm_timestamp = time_second;
3163 
3164 	/*
3165 	 * Pass the FIB to the controller, wait for it to complete.
3166 	 */
3167 	AAC_LOCK_ACQUIRE(&sc->aac_io_lock);
3168 	if ((error = aac_wait_command(cm)) != 0) {
3169 		device_printf(sc->aac_dev,
3170 			      "aac_wait_command return %d\n", error);
3171 		goto out;
3172 	}
3173 	AAC_LOCK_RELEASE(&sc->aac_io_lock);
3174 
3175 	/*
3176 	 * Copy the FIB and data back out to the caller.
3177 	 */
3178 	size = cm->cm_fib->Header.Size;
3179 	if (size > sizeof(struct aac_fib)) {
3180 		device_printf(sc->aac_dev, "outbound FIB oversized (%d > %zd)\n",
3181 			      size, sizeof(struct aac_fib));
3182 		size = sizeof(struct aac_fib);
3183 	}
3184 	error = copyout(cm->cm_fib, ufib, size);
3185 	AAC_LOCK_ACQUIRE(&sc->aac_io_lock);
3186 
3187 out:
3188 	if (cm != NULL) {
3189 		aac_release_command(cm);
3190 	}
3191 
3192 	AAC_LOCK_RELEASE(&sc->aac_io_lock);
3193 	return(error);
3194 }
3195 
3196 /*
3197  * Handle an AIF sent to us by the controller; queue it for later reference.
3198  * If the queue fills up, then drop the older entries.
3199  */
3200 static void
3201 aac_handle_aif(struct aac_softc *sc, struct aac_fib *fib)
3202 {
3203 	struct aac_aif_command *aif;
3204 	struct aac_container *co, *co_next;
3205 	struct aac_mntinfo *mi;
3206 	struct aac_mntinforesp *mir = NULL;
3207 	u_int16_t rsize;
3208 	int next, found;
3209 	int count = 0, added = 0, i = 0;
3210 
3211 	debug_called(2);
3212 
3213 	aif = (struct aac_aif_command*)&fib->data[0];
3214 	aac_print_aif(sc, aif);
3215 
3216 	/* Is it an event that we should care about? */
3217 	switch (aif->command) {
3218 	case AifCmdEventNotify:
3219 		switch (aif->data.EN.type) {
3220 		case AifEnAddContainer:
3221 		case AifEnDeleteContainer:
3222 			/*
3223 			 * A container was added or deleted, but the message
3224 			 * doesn't tell us anything else!  Re-enumerate the
3225 			 * containers and sort things out.
3226 			 */
3227 			aac_alloc_sync_fib(sc, &fib);
3228 			mi = (struct aac_mntinfo *)&fib->data[0];
3229 			do {
3230 				/*
3231 				 * Ask the controller for its containers one at
3232 				 * a time.
3233 				 * XXX What if the controller's list changes
3234 				 * midway through this enumaration?
3235 				 * XXX This should be done async.
3236 				 */
3237 				bzero(mi, sizeof(struct aac_mntinfo));
3238 				mi->Command = VM_NameServe;
3239 				mi->MntType = FT_FILESYS;
3240 				mi->MntCount = i;
3241 				rsize = sizeof(mir);
3242 				if (aac_sync_fib(sc, ContainerCommand, 0, fib,
3243 						 sizeof(struct aac_mntinfo))) {
3244 					device_printf(sc->aac_dev,
3245 					    "Error probing container %d\n", i);
3246 
3247 					continue;
3248 				}
3249 				mir = (struct aac_mntinforesp *)&fib->data[0];
3250 				/* XXX Need to check if count changed */
3251 				count = mir->MntRespCount;
3252 
3253 				/*
3254 				 * Check the container against our list.
3255 				 * co->co_found was already set to 0 in a
3256 				 * previous run.
3257 				 */
3258 				if ((mir->Status == ST_OK) &&
3259 				    (mir->MntTable[0].VolType != CT_NONE)) {
3260 					found = 0;
3261 					TAILQ_FOREACH(co,
3262 						      &sc->aac_container_tqh,
3263 						      co_link) {
3264 						if (co->co_mntobj.ObjectId ==
3265 						    mir->MntTable[0].ObjectId) {
3266 							co->co_found = 1;
3267 							found = 1;
3268 							break;
3269 						}
3270 					}
3271 					/*
3272 					 * If the container matched, continue
3273 					 * in the list.
3274 					 */
3275 					if (found) {
3276 						i++;
3277 						continue;
3278 					}
3279 
3280 					/*
3281 					 * This is a new container.  Do all the
3282 					 * appropriate things to set it up.
3283 					 */
3284 					aac_add_container(sc, mir, 1);
3285 					added = 1;
3286 				}
3287 				i++;
3288 			} while ((i < count) && (i < AAC_MAX_CONTAINERS));
3289 			aac_release_sync_fib(sc);
3290 
3291 			/*
3292 			 * Go through our list of containers and see which ones
3293 			 * were not marked 'found'.  Since the controller didn't
3294 			 * list them they must have been deleted.  Do the
3295 			 * appropriate steps to destroy the device.  Also reset
3296 			 * the co->co_found field.
3297 			 */
3298 			co = TAILQ_FIRST(&sc->aac_container_tqh);
3299 			while (co != NULL) {
3300 				if (co->co_found == 0) {
3301 					AAC_LOCK_RELEASE(&sc->aac_io_lock);
3302 					get_mplock();
3303 					device_delete_child(sc->aac_dev,
3304 							    co->co_disk);
3305 					rel_mplock();
3306 					AAC_LOCK_ACQUIRE(&sc->aac_io_lock);
3307 					co_next = TAILQ_NEXT(co, co_link);
3308 					AAC_LOCK_ACQUIRE(&sc->
3309 							aac_container_lock);
3310 					TAILQ_REMOVE(&sc->aac_container_tqh, co,
3311 						     co_link);
3312 					AAC_LOCK_RELEASE(&sc->
3313 							 aac_container_lock);
3314 					kfree(co, M_AACBUF);
3315 					co = co_next;
3316 				} else {
3317 					co->co_found = 0;
3318 					co = TAILQ_NEXT(co, co_link);
3319 				}
3320 			}
3321 
3322 			/* Attach the newly created containers */
3323 			if (added) {
3324 				AAC_LOCK_RELEASE(&sc->aac_io_lock);
3325 				get_mplock();
3326 				bus_generic_attach(sc->aac_dev);
3327 				rel_mplock();
3328 				AAC_LOCK_ACQUIRE(&sc->aac_io_lock);
3329 			}
3330 
3331 			break;
3332 
3333 		default:
3334 			break;
3335 		}
3336 
3337 	default:
3338 		break;
3339 	}
3340 
3341 	/* Copy the AIF data to the AIF queue for ioctl retrieval */
3342 	AAC_LOCK_ACQUIRE(&sc->aac_aifq_lock);
3343 	next = (sc->aac_aifq_head + 1) % AAC_AIFQ_LENGTH;
3344 	if (next != sc->aac_aifq_tail) {
3345 		bcopy(aif, &sc->aac_aifq[next], sizeof(struct aac_aif_command));
3346 		sc->aac_aifq_head = next;
3347 
3348 		/* On the off chance that someone is sleeping for an aif... */
3349 		if (sc->aac_state & AAC_STATE_AIF_SLEEPER)
3350 			wakeup(sc->aac_aifq);
3351 		/* token may have been lost */
3352 		/* Wakeup any poll()ers */
3353 		selwakeup(&sc->rcv_select);
3354 		/* token may have been lost */
3355 	}
3356 	AAC_LOCK_RELEASE(&sc->aac_aifq_lock);
3357 
3358 	return;
3359 }
3360 
3361 /*
3362  * Return the Revision of the driver to userspace and check to see if the
3363  * userspace app is possibly compatible.  This is extremely bogus since
3364  * our driver doesn't follow Adaptec's versioning system.  Cheat by just
3365  * returning what the card reported.
3366  */
3367 static int
3368 aac_rev_check(struct aac_softc *sc, caddr_t udata)
3369 {
3370 	struct aac_rev_check rev_check;
3371 	struct aac_rev_check_resp rev_check_resp;
3372 	int error = 0;
3373 
3374 	debug_called(2);
3375 
3376 	/*
3377 	 * Copyin the revision struct from userspace
3378 	 */
3379 	if ((error = copyin(udata, (caddr_t)&rev_check,
3380 			sizeof(struct aac_rev_check))) != 0) {
3381 		return error;
3382 	}
3383 
3384 	debug(2, "Userland revision= %d\n",
3385 	      rev_check.callingRevision.buildNumber);
3386 
3387 	/*
3388 	 * Doctor up the response struct.
3389 	 */
3390 	rev_check_resp.possiblyCompatible = 1;
3391 	rev_check_resp.adapterSWRevision.external.ul =
3392 	    sc->aac_revision.external.ul;
3393 	rev_check_resp.adapterSWRevision.buildNumber =
3394 	    sc->aac_revision.buildNumber;
3395 
3396 	return(copyout((caddr_t)&rev_check_resp, udata,
3397 			sizeof(struct aac_rev_check_resp)));
3398 }
3399 
3400 /*
3401  * Pass the caller the next AIF in their queue
3402  */
3403 static int
3404 aac_getnext_aif(struct aac_softc *sc, caddr_t arg)
3405 {
3406 	struct get_adapter_fib_ioctl agf;
3407 	int error;
3408 
3409 	debug_called(2);
3410 
3411 	if ((error = copyin(arg, &agf, sizeof(agf))) == 0) {
3412 
3413 		/*
3414 		 * Check the magic number that we gave the caller.
3415 		 */
3416 		if (agf.AdapterFibContext != (int)(uintptr_t)sc->aifthread) {
3417 			error = EFAULT;
3418 		} else {
3419 
3420 			error = aac_return_aif(sc, agf.AifFib);
3421 
3422 			if ((error == EAGAIN) && (agf.Wait)) {
3423 				sc->aac_state |= AAC_STATE_AIF_SLEEPER;
3424 				while (error == EAGAIN) {
3425 					error = tsleep(sc->aac_aifq,
3426 						       PCATCH, "aacaif", 0);
3427 					if (error == 0)
3428 						error = aac_return_aif(sc,
3429 						    agf.AifFib);
3430 				}
3431 				sc->aac_state &= ~AAC_STATE_AIF_SLEEPER;
3432 			}
3433 		}
3434 	}
3435 	return(error);
3436 }
3437 
3438 /*
3439  * Hand the next AIF off the top of the queue out to userspace.
3440  *
3441  * YYY token could be lost during copyout
3442  */
3443 static int
3444 aac_return_aif(struct aac_softc *sc, caddr_t uptr)
3445 {
3446 	int next, error;
3447 
3448 	debug_called(2);
3449 
3450 	AAC_LOCK_ACQUIRE(&sc->aac_aifq_lock);
3451 	if (sc->aac_aifq_tail == sc->aac_aifq_head) {
3452 		AAC_LOCK_RELEASE(&sc->aac_aifq_lock);
3453 		return (EAGAIN);
3454 	}
3455 
3456 	next = (sc->aac_aifq_tail + 1) % AAC_AIFQ_LENGTH;
3457 	error = copyout(&sc->aac_aifq[next], uptr,
3458 			sizeof(struct aac_aif_command));
3459 	if (error)
3460 		device_printf(sc->aac_dev,
3461 		    "aac_return_aif: copyout returned %d\n", error);
3462 	else
3463 		sc->aac_aifq_tail = next;
3464 
3465 	AAC_LOCK_RELEASE(&sc->aac_aifq_lock);
3466 	return(error);
3467 }
3468 
3469 static int
3470 aac_get_pci_info(struct aac_softc *sc, caddr_t uptr)
3471 {
3472 	struct aac_pci_info {
3473 		u_int32_t bus;
3474 		u_int32_t slot;
3475 	} pciinf;
3476 	int error;
3477 
3478 	debug_called(2);
3479 
3480 	pciinf.bus = pci_get_bus(sc->aac_dev);
3481 	pciinf.slot = pci_get_slot(sc->aac_dev);
3482 
3483 	error = copyout((caddr_t)&pciinf, uptr,
3484 			sizeof(struct aac_pci_info));
3485 
3486 	return (error);
3487 }
3488 
3489 /*
3490  * Give the userland some information about the container.  The AAC arch
3491  * expects the driver to be a SCSI passthrough type driver, so it expects
3492  * the containers to have b:t:l numbers.  Fake it.
3493  */
3494 static int
3495 aac_query_disk(struct aac_softc *sc, caddr_t uptr)
3496 {
3497 	struct aac_query_disk query_disk;
3498 	struct aac_container *co;
3499 	struct aac_disk	*disk;
3500 	int error, id;
3501 
3502 	debug_called(2);
3503 
3504 	disk = NULL;
3505 
3506 	error = copyin(uptr, (caddr_t)&query_disk,
3507 		       sizeof(struct aac_query_disk));
3508 	if (error)
3509 		return (error);
3510 
3511 	id = query_disk.ContainerNumber;
3512 	if (id == -1)
3513 		return (EINVAL);
3514 
3515 	AAC_LOCK_ACQUIRE(&sc->aac_container_lock);
3516 	TAILQ_FOREACH(co, &sc->aac_container_tqh, co_link) {
3517 		if (co->co_mntobj.ObjectId == id)
3518 			break;
3519 		}
3520 
3521 	if (co == NULL) {
3522 			query_disk.Valid = 0;
3523 			query_disk.Locked = 0;
3524 			query_disk.Deleted = 1;		/* XXX is this right? */
3525 	} else {
3526 		disk = device_get_softc(co->co_disk);
3527 		query_disk.Valid = 1;
3528 		query_disk.Locked =
3529 		    (disk->ad_flags & AAC_DISK_OPEN) ? 1 : 0;
3530 		query_disk.Deleted = 0;
3531 		query_disk.Bus = device_get_unit(sc->aac_dev);
3532 		query_disk.Target = disk->unit;
3533 		query_disk.Lun = 0;
3534 		query_disk.UnMapped = 0;
3535 		bcopy(disk->ad_dev_t->si_name,
3536 		      &query_disk.diskDeviceName[0], 10);
3537 	}
3538 	AAC_LOCK_RELEASE(&sc->aac_container_lock);
3539 
3540 	error = copyout((caddr_t)&query_disk, uptr,
3541 			sizeof(struct aac_query_disk));
3542 
3543 	return (error);
3544 }
3545 
3546 static void
3547 aac_get_bus_info(struct aac_softc *sc)
3548 {
3549 	struct aac_fib *fib;
3550 	struct aac_ctcfg *c_cmd;
3551 	struct aac_ctcfg_resp *c_resp;
3552 	struct aac_vmioctl *vmi;
3553 	struct aac_vmi_businf_resp *vmi_resp;
3554 	struct aac_getbusinf businfo;
3555 	struct aac_sim *caminf;
3556 	device_t child;
3557 	int i, found, error;
3558 
3559 	AAC_LOCK_ACQUIRE(&sc->aac_io_lock);
3560 	aac_alloc_sync_fib(sc, &fib);
3561 	c_cmd = (struct aac_ctcfg *)&fib->data[0];
3562 	bzero(c_cmd, sizeof(struct aac_ctcfg));
3563 
3564 	c_cmd->Command = VM_ContainerConfig;
3565 	c_cmd->cmd = CT_GET_SCSI_METHOD;
3566 	c_cmd->param = 0;
3567 
3568 	error = aac_sync_fib(sc, ContainerCommand, 0, fib,
3569 	    sizeof(struct aac_ctcfg));
3570 	if (error) {
3571 		device_printf(sc->aac_dev, "Error %d sending "
3572 		    "VM_ContainerConfig command\n", error);
3573 		aac_release_sync_fib(sc);
3574 		AAC_LOCK_RELEASE(&sc->aac_io_lock);
3575 		return;
3576 	}
3577 
3578 	c_resp = (struct aac_ctcfg_resp *)&fib->data[0];
3579 	if (c_resp->Status != ST_OK) {
3580 		device_printf(sc->aac_dev, "VM_ContainerConfig returned 0x%x\n",
3581 		    c_resp->Status);
3582 		aac_release_sync_fib(sc);
3583 		AAC_LOCK_RELEASE(&sc->aac_io_lock);
3584 		return;
3585 	}
3586 
3587 	sc->scsi_method_id = c_resp->param;
3588 
3589 	vmi = (struct aac_vmioctl *)&fib->data[0];
3590 	bzero(vmi, sizeof(struct aac_vmioctl));
3591 
3592 	vmi->Command = VM_Ioctl;
3593 	vmi->ObjType = FT_DRIVE;
3594 	vmi->MethId = sc->scsi_method_id;
3595 	vmi->ObjId = 0;
3596 	vmi->IoctlCmd = GetBusInfo;
3597 
3598 	error = aac_sync_fib(sc, ContainerCommand, 0, fib,
3599 	    sizeof(struct aac_vmioctl));
3600 	if (error) {
3601 		device_printf(sc->aac_dev, "Error %d sending VMIoctl command\n",
3602 		    error);
3603 		aac_release_sync_fib(sc);
3604 		AAC_LOCK_RELEASE(&sc->aac_io_lock);
3605 		return;
3606 	}
3607 
3608 	vmi_resp = (struct aac_vmi_businf_resp *)&fib->data[0];
3609 	if (vmi_resp->Status != ST_OK) {
3610 		debug(1, "VM_Ioctl returned %d\n", vmi_resp->Status);
3611 		aac_release_sync_fib(sc);
3612 		AAC_LOCK_RELEASE(&sc->aac_io_lock);
3613 		return;
3614 	}
3615 
3616 	bcopy(&vmi_resp->BusInf, &businfo, sizeof(struct aac_getbusinf));
3617 	aac_release_sync_fib(sc);
3618 	AAC_LOCK_RELEASE(&sc->aac_io_lock);
3619 
3620 	found = 0;
3621 	for (i = 0; i < businfo.BusCount; i++) {
3622 		if (businfo.BusValid[i] != AAC_BUS_VALID)
3623 			continue;
3624 
3625 		caminf = (struct aac_sim *)kmalloc(sizeof(struct aac_sim),
3626 		    M_AACBUF, M_INTWAIT | M_ZERO);
3627 
3628 		child = device_add_child(sc->aac_dev, "aacp", -1);
3629 		if (child == NULL) {
3630 			device_printf(sc->aac_dev,
3631 			    "device_add_child failed for passthrough bus %d\n",
3632 			    i);
3633 			kfree(caminf, M_AACBUF);
3634 			break;
3635 		};
3636 
3637 		caminf->TargetsPerBus = businfo.TargetsPerBus;
3638 		caminf->BusNumber = i;
3639 		caminf->InitiatorBusId = businfo.InitiatorBusId[i];
3640 		caminf->aac_sc = sc;
3641 		caminf->sim_dev = child;
3642 
3643 		device_set_ivars(child, caminf);
3644 		device_set_desc(child, "SCSI Passthrough Bus");
3645 		TAILQ_INSERT_TAIL(&sc->aac_sim_tqh, caminf, sim_link);
3646 
3647 		found = 1;
3648 	}
3649 
3650 	if (found)
3651 		bus_generic_attach(sc->aac_dev);
3652 
3653 	return;
3654 }
3655