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