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