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