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