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