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