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 * Debugging support. 35 */ 36 #include "opt_aac.h" 37 38 #include <sys/param.h> 39 #include <sys/systm.h> 40 #include <sys/kernel.h> 41 #include <sys/conf.h> 42 43 #include <sys/bus.h> 44 45 #include <machine/resource.h> 46 #include <machine/bus.h> 47 48 #include <dev/aac/aacreg.h> 49 #include <sys/aac_ioctl.h> 50 #include <dev/aac/aacvar.h> 51 52 #ifdef AAC_DEBUG 53 void aac_printstate0(void); 54 void aac_intr0(void); 55 56 /* 57 * Dump the command queue indices 58 */ 59 void 60 aac_print_queues(struct aac_softc *sc) 61 { 62 device_printf(sc->aac_dev, "FIB queue header at %p queues at %p\n", 63 &sc->aac_queues->qt_qindex[AAC_HOST_NORM_CMD_QUEUE][0], 64 &sc->aac_queues->qt_HostNormCmdQueue[0]); 65 device_printf(sc->aac_dev, "HOST_NORM_CMD %d/%d (%d)\n", 66 sc->aac_queues->qt_qindex[AAC_HOST_NORM_CMD_QUEUE][ 67 AAC_PRODUCER_INDEX], 68 sc->aac_queues->qt_qindex[AAC_HOST_NORM_CMD_QUEUE][ 69 AAC_CONSUMER_INDEX], 70 AAC_HOST_NORM_CMD_ENTRIES); 71 device_printf(sc->aac_dev, "HOST_HIGH_CMD %d/%d (%d)\n", 72 sc->aac_queues->qt_qindex[AAC_HOST_HIGH_CMD_QUEUE][ 73 AAC_PRODUCER_INDEX], 74 sc->aac_queues->qt_qindex[AAC_HOST_HIGH_CMD_QUEUE][ 75 AAC_CONSUMER_INDEX], 76 AAC_HOST_HIGH_CMD_ENTRIES); 77 device_printf(sc->aac_dev, "ADAP_NORM_CMD %d/%d (%d)\n", 78 sc->aac_queues->qt_qindex[AAC_ADAP_NORM_CMD_QUEUE][ 79 AAC_PRODUCER_INDEX], 80 sc->aac_queues->qt_qindex[AAC_ADAP_NORM_CMD_QUEUE][ 81 AAC_CONSUMER_INDEX], 82 AAC_ADAP_NORM_CMD_ENTRIES); 83 device_printf(sc->aac_dev, "ADAP_HIGH_CMD %d/%d (%d)\n", 84 sc->aac_queues->qt_qindex[AAC_ADAP_HIGH_CMD_QUEUE][ 85 AAC_PRODUCER_INDEX], 86 sc->aac_queues->qt_qindex[AAC_ADAP_HIGH_CMD_QUEUE][ 87 AAC_CONSUMER_INDEX], 88 AAC_ADAP_HIGH_CMD_ENTRIES); 89 device_printf(sc->aac_dev, "HOST_NORM_RESP %d/%d (%d)\n", 90 sc->aac_queues->qt_qindex[AAC_HOST_NORM_RESP_QUEUE][ 91 AAC_PRODUCER_INDEX], 92 sc->aac_queues->qt_qindex[AAC_HOST_NORM_RESP_QUEUE][ 93 AAC_CONSUMER_INDEX], 94 AAC_HOST_NORM_RESP_ENTRIES); 95 device_printf(sc->aac_dev, "HOST_HIGH_RESP %d/%d (%d)\n", 96 sc->aac_queues->qt_qindex[AAC_HOST_HIGH_RESP_QUEUE][ 97 AAC_PRODUCER_INDEX], 98 sc->aac_queues->qt_qindex[AAC_HOST_HIGH_RESP_QUEUE][ 99 AAC_CONSUMER_INDEX], 100 AAC_HOST_HIGH_RESP_ENTRIES); 101 device_printf(sc->aac_dev, "ADAP_NORM_RESP %d/%d (%d)\n", 102 sc->aac_queues->qt_qindex[AAC_ADAP_NORM_RESP_QUEUE][ 103 AAC_PRODUCER_INDEX], 104 sc->aac_queues->qt_qindex[AAC_ADAP_NORM_RESP_QUEUE][ 105 AAC_CONSUMER_INDEX], 106 AAC_ADAP_NORM_RESP_ENTRIES); 107 device_printf(sc->aac_dev, "ADAP_HIGH_RESP %d/%d (%d)\n", 108 sc->aac_queues->qt_qindex[AAC_ADAP_HIGH_RESP_QUEUE][ 109 AAC_PRODUCER_INDEX], 110 sc->aac_queues->qt_qindex[AAC_ADAP_HIGH_RESP_QUEUE][ 111 AAC_CONSUMER_INDEX], 112 AAC_ADAP_HIGH_RESP_ENTRIES); 113 device_printf(sc->aac_dev, "AACQ_FREE %d/%d\n", 114 sc->aac_qstat[AACQ_FREE].q_length, sc->aac_qstat[AACQ_FREE].q_max); 115 device_printf(sc->aac_dev, "AACQ_BIO %d/%d\n", 116 sc->aac_qstat[AACQ_BIO].q_length, sc->aac_qstat[AACQ_BIO].q_max); 117 device_printf(sc->aac_dev, "AACQ_READY %d/%d\n", 118 sc->aac_qstat[AACQ_READY].q_length, 119 sc->aac_qstat[AACQ_READY].q_max); 120 device_printf(sc->aac_dev, "AACQ_BUSY %d/%d\n", 121 sc->aac_qstat[AACQ_BUSY].q_length, sc->aac_qstat[AACQ_BUSY].q_max); 122 } 123 124 /* 125 * Print the command queue states for controller 0 (callable from DDB) 126 */ 127 void 128 aac_printstate0(void) 129 { 130 struct aac_softc *sc; 131 132 sc = devclass_get_softc(devclass_find("aac"), 0); 133 134 aac_print_queues(sc); 135 switch (sc->aac_hwif) { 136 case AAC_HWIF_I960RX: 137 device_printf(sc->aac_dev, "IDBR 0x%08x IIMR 0x%08x " 138 "IISR 0x%08x\n", AAC_GETREG4(sc, AAC_RX_IDBR), 139 AAC_GETREG4(sc, AAC_RX_IIMR), AAC_GETREG4(sc, AAC_RX_IISR)); 140 device_printf(sc->aac_dev, "ODBR 0x%08x OIMR 0x%08x " 141 "OISR 0x%08x\n", AAC_GETREG4(sc, AAC_RX_ODBR), 142 AAC_GETREG4(sc, AAC_RX_OIMR), AAC_GETREG4(sc, AAC_RX_OISR)); 143 AAC_SETREG4(sc, AAC_RX_OIMR, 0/*~(AAC_DB_COMMAND_READY | 144 AAC_DB_RESPONSE_READY | AAC_DB_PRINTF)*/); 145 device_printf(sc->aac_dev, "ODBR 0x%08x OIMR 0x%08x " 146 "OISR 0x%08x\n", AAC_GETREG4(sc, AAC_RX_ODBR), 147 AAC_GETREG4(sc, AAC_RX_OIMR), AAC_GETREG4(sc, AAC_RX_OISR)); 148 break; 149 case AAC_HWIF_STRONGARM: 150 /* XXX implement */ 151 break; 152 } 153 } 154 155 /* 156 * simulate an interrupt for controller 0 157 */ 158 void 159 aac_intr0(void) 160 { 161 struct aac_softc *sc; 162 163 sc = devclass_get_softc(devclass_find("aac"), 0); 164 165 aac_intr(sc); 166 } 167 168 /* 169 * Panic in a slightly informative fashion 170 */ 171 void 172 aac_panic(struct aac_softc *sc, char *reason) 173 { 174 aac_print_queues(sc); 175 panic(reason); 176 } 177 178 /* 179 * Print a FIB 180 */ 181 void 182 aac_print_fib(struct aac_softc *sc, struct aac_fib *fib, const char *caller) 183 { 184 if (fib == NULL) { 185 device_printf(sc->aac_dev, 186 "aac_print_fib called with NULL fib\n"); 187 return; 188 } 189 device_printf(sc->aac_dev, "%s: FIB @ %p\n", caller, fib); 190 device_printf(sc->aac_dev, " XferState %b\n", fib->Header.XferState, 191 "\20" 192 "\1HOSTOWNED" 193 "\2ADAPTEROWNED" 194 "\3INITIALISED" 195 "\4EMPTY" 196 "\5FROMPOOL" 197 "\6FROMHOST" 198 "\7FROMADAP" 199 "\10REXPECTED" 200 "\11RNOTEXPECTED" 201 "\12DONEADAP" 202 "\13DONEHOST" 203 "\14HIGH" 204 "\15NORM" 205 "\16ASYNC" 206 "\17PAGEFILEIO" 207 "\20SHUTDOWN" 208 "\21LAZYWRITE" 209 "\22ADAPMICROFIB" 210 "\23BIOSFIB" 211 "\24FAST_RESPONSE" 212 "\25APIFIB\n"); 213 device_printf(sc->aac_dev, " Command %d\n", fib->Header.Command); 214 device_printf(sc->aac_dev, " StructType %d\n", 215 fib->Header.StructType); 216 device_printf(sc->aac_dev, " Flags 0x%x\n", fib->Header.Flags); 217 device_printf(sc->aac_dev, " Size %d\n", fib->Header.Size); 218 device_printf(sc->aac_dev, " SenderSize %d\n", 219 fib->Header.SenderSize); 220 device_printf(sc->aac_dev, " SenderAddress 0x%x\n", 221 fib->Header.SenderFibAddress); 222 device_printf(sc->aac_dev, " RcvrAddress 0x%x\n", 223 fib->Header.ReceiverFibAddress); 224 device_printf(sc->aac_dev, " SenderData 0x%x\n", 225 fib->Header.SenderData); 226 switch(fib->Header.Command) { 227 case ContainerCommand: 228 { 229 struct aac_blockread *br; 230 struct aac_blockwrite *bw; 231 struct aac_sg_table *sg; 232 int i; 233 234 br = (struct aac_blockread*)fib->data; 235 bw = (struct aac_blockwrite*)fib->data; 236 sg = NULL; 237 238 if (br->Command == VM_CtBlockRead) { 239 device_printf(sc->aac_dev, 240 " BlockRead: container %d 0x%x/%d\n", 241 br->ContainerId, br->BlockNumber, 242 br->ByteCount); 243 sg = &br->SgMap; 244 } 245 if (bw->Command == VM_CtBlockWrite) { 246 device_printf(sc->aac_dev, 247 " BlockWrite: container %d 0x%x/%d " 248 "(%s)\n", bw->ContainerId, 249 bw->BlockNumber, bw->ByteCount, 250 bw->Stable == CSTABLE ? "stable" : 251 "unstable"); 252 sg = &bw->SgMap; 253 } 254 if (sg != NULL) { 255 device_printf(sc->aac_dev, 256 " %d s/g entries\n", sg->SgCount); 257 for (i = 0; i < sg->SgCount; i++) 258 device_printf(sc->aac_dev, " 0x%08x/%d\n", 259 sg->SgEntry[i].SgAddress, 260 sg->SgEntry[i].SgByteCount); 261 } 262 break; 263 } 264 default: 265 device_printf(sc->aac_dev, " %16D\n", fib->data, " "); 266 device_printf(sc->aac_dev, " %16D\n", fib->data + 16, " "); 267 break; 268 } 269 } 270 271 /* 272 * Describe an AIF we have received. 273 */ 274 void 275 aac_print_aif(struct aac_softc *sc, struct aac_aif_command *aif) 276 { 277 switch(aif->command) { 278 case AifCmdEventNotify: 279 device_printf(sc->aac_dev, "EventNotify(%d)\n", aif->seqNumber); 280 switch(aif->data.EN.type) { 281 case AifEnGeneric: /* Generic notification */ 282 device_printf(sc->aac_dev, "(Generic) %.*s\n", 283 (int)sizeof(aif->data.EN.data.EG), 284 aif->data.EN.data.EG.text); 285 break; 286 case AifEnTaskComplete: /* Task has completed */ 287 device_printf(sc->aac_dev, "(TaskComplete)\n"); 288 break; 289 case AifEnConfigChange: /* Adapter configuration change 290 * occurred */ 291 device_printf(sc->aac_dev, "(ConfigChange)\n"); 292 break; 293 case AifEnContainerChange: /* Adapter specific container 294 * configuration change */ 295 device_printf(sc->aac_dev, "(ContainerChange) " 296 "container %d,%d\n", 297 aif->data.EN.data.ECC.container[0], 298 aif->data.EN.data.ECC.container[1]); 299 break; 300 case AifEnDeviceFailure: /* SCSI device failed */ 301 device_printf(sc->aac_dev, "(DeviceFailure) " 302 "handle %d\n", 303 aif->data.EN.data.EDF.deviceHandle); 304 break; 305 case AifEnMirrorFailover: /* Mirror failover started */ 306 device_printf(sc->aac_dev, "(MirrorFailover) " 307 "container %d failed, " 308 "migrating from slice %d to %d\n", 309 aif->data.EN.data.EMF.container, 310 aif->data.EN.data.EMF.failedSlice, 311 aif->data.EN.data.EMF.creatingSlice); 312 break; 313 case AifEnContainerEvent: /* Significant container 314 * event */ 315 device_printf(sc->aac_dev, "(ContainerEvent) " 316 "container %d event " 317 "%d\n", aif->data.EN.data.ECE.container, 318 aif->data.EN.data.ECE.eventType); 319 break; 320 case AifEnFileSystemChange: /* File system changed */ 321 device_printf(sc->aac_dev, "(FileSystemChange)\n"); 322 break; 323 case AifEnConfigPause: /* Container pause event */ 324 device_printf(sc->aac_dev, "(ConfigPause)\n"); 325 break; 326 case AifEnConfigResume: /* Container resume event */ 327 device_printf(sc->aac_dev, "(ConfigResume)\n"); 328 break; 329 case AifEnFailoverChange: /* Failover space assignment 330 * changed */ 331 device_printf(sc->aac_dev, "(FailoverChange)\n"); 332 break; 333 case AifEnRAID5RebuildDone: /* RAID5 rebuild finished */ 334 device_printf(sc->aac_dev, "(RAID5RebuildDone)\n"); 335 break; 336 case AifEnEnclosureManagement: /* Enclosure management event */ 337 device_printf(sc->aac_dev, "(EnclosureManagement) " 338 "EMPID %d unit %d " 339 "event %d\n", aif->data.EN.data.EEE.empID, 340 aif->data.EN.data.EEE.unitID, 341 aif->data.EN.data.EEE.eventType); 342 break; 343 case AifEnBatteryEvent: /* Significant NV battery 344 * event */ 345 device_printf(sc->aac_dev, "(BatteryEvent) %d " 346 "(state was %d, is %d\n", 347 aif->data.EN.data.EBE.transition_type, 348 aif->data.EN.data.EBE.current_state, 349 aif->data.EN.data.EBE.prior_state); 350 break; 351 case AifEnAddContainer: /* A new container was 352 * created. */ 353 device_printf(sc->aac_dev, "(AddContainer)\n"); 354 break; 355 case AifEnDeleteContainer: /* A container was deleted. */ 356 device_printf(sc->aac_dev, "(DeleteContainer)\n"); 357 break; 358 case AifEnBatteryNeedsRecond: /* The battery needs 359 * reconditioning */ 360 device_printf(sc->aac_dev, "(BatteryNeedsRecond)\n"); 361 break; 362 case AifEnClusterEvent: /* Some cluster event */ 363 device_printf(sc->aac_dev, "(ClusterEvent) event %d\n", 364 aif->data.EN.data.ECLE.eventType); 365 break; 366 case AifEnDiskSetEvent: /* A disk set event occured. */ 367 device_printf(sc->aac_dev, "(DiskSetEvent) event %d " 368 "diskset %jd creator %jd\n", 369 aif->data.EN.data.EDS.eventType, 370 (intmax_t)aif->data.EN.data.EDS.DsNum, 371 (intmax_t)aif->data.EN.data.EDS.CreatorId); 372 break; 373 case AifDenMorphComplete: /* A morph operation 374 * completed */ 375 device_printf(sc->aac_dev, "(MorphComplete)\n"); 376 break; 377 case AifDenVolumeExtendComplete: /* A volume expand operation 378 * completed */ 379 device_printf(sc->aac_dev, "(VolumeExtendComplete)\n"); 380 break; 381 default: 382 device_printf(sc->aac_dev, "(%d)\n", aif->data.EN.type); 383 break; 384 } 385 break; 386 case AifCmdJobProgress: 387 { 388 char *status; 389 switch(aif->data.PR[0].status) { 390 case AifJobStsSuccess: 391 status = "success"; break; 392 case AifJobStsFinished: 393 status = "finished"; break; 394 case AifJobStsAborted: 395 status = "aborted"; break; 396 case AifJobStsFailed: 397 status = "failed"; break; 398 case AifJobStsSuspended: 399 status = "suspended"; break; 400 case AifJobStsRunning: 401 status = "running"; break; 402 default: 403 status = "unknown status"; break; 404 } 405 406 device_printf(sc->aac_dev, "JobProgress (%d) - %s (%d, %d)\n", 407 aif->seqNumber, status, 408 aif->data.PR[0].currentTick, 409 aif->data.PR[0].finalTick); 410 switch(aif->data.PR[0].jd.type) { 411 case AifJobScsiZero: /* SCSI dev clear operation */ 412 device_printf(sc->aac_dev, "(ScsiZero) handle %d\n", 413 aif->data.PR[0].jd.client.scsi_dh); 414 break; 415 case AifJobScsiVerify: /* SCSI device Verify operation 416 * NO REPAIR */ 417 device_printf(sc->aac_dev, "(ScsiVerify) handle %d\n", 418 aif->data.PR[0].jd.client.scsi_dh); 419 break; 420 case AifJobScsiExercise: /* SCSI device Exercise 421 * operation */ 422 device_printf(sc->aac_dev, "(ScsiExercise) handle %d\n", 423 aif->data.PR[0].jd.client.scsi_dh); 424 break; 425 case AifJobScsiVerifyRepair: /* SCSI device Verify operation 426 * WITH repair */ 427 device_printf(sc->aac_dev, 428 "(ScsiVerifyRepair) handle %d\n", 429 aif->data.PR[0].jd.client.scsi_dh); 430 break; 431 case AifJobCtrZero: /* Container clear operation */ 432 device_printf(sc->aac_dev, 433 "(ConatainerZero) container %d\n", 434 aif->data.PR[0].jd.client.container.src); 435 break; 436 case AifJobCtrCopy: /* Container copy operation */ 437 device_printf(sc->aac_dev, 438 "(ConatainerCopy) container %d to %d\n", 439 aif->data.PR[0].jd.client.container.src, 440 aif->data.PR[0].jd.client.container.dst); 441 break; 442 case AifJobCtrCreateMirror: /* Container Create Mirror 443 * operation */ 444 device_printf(sc->aac_dev, 445 "(ConatainerCreateMirror) container %d\n", 446 aif->data.PR[0].jd.client.container.src); 447 /* XXX two containers? */ 448 break; 449 case AifJobCtrMergeMirror: /* Container Merge Mirror 450 * operation */ 451 device_printf(sc->aac_dev, 452 "(ConatainerMergeMirror) container %d\n", 453 aif->data.PR[0].jd.client.container.src); 454 /* XXX two containers? */ 455 break; 456 case AifJobCtrScrubMirror: /* Container Scrub Mirror 457 * operation */ 458 device_printf(sc->aac_dev, 459 "(ConatainerScrubMirror) container %d\n", 460 aif->data.PR[0].jd.client.container.src); 461 break; 462 case AifJobCtrRebuildRaid5: /* Container Rebuild Raid5 463 * operation */ 464 device_printf(sc->aac_dev, 465 "(ConatainerRebuildRaid5) container %d\n", 466 aif->data.PR[0].jd.client.container.src); 467 break; 468 case AifJobCtrScrubRaid5: /* Container Scrub Raid5 469 * operation */ 470 device_printf(sc->aac_dev, 471 "(ConatainerScrubRaid5) container %d\n", 472 aif->data.PR[0].jd.client.container.src); 473 break; 474 case AifJobCtrMorph: /* Container morph operation */ 475 device_printf(sc->aac_dev, 476 "(ConatainerMorph) container %d\n", 477 aif->data.PR[0].jd.client.container.src); 478 /* XXX two containers? */ 479 break; 480 case AifJobCtrPartCopy: /* Container Partition copy 481 * operation */ 482 device_printf(sc->aac_dev, 483 "(ConatainerPartCopy) container %d to " 484 "%d\n", 485 aif->data.PR[0].jd.client.container.src, 486 aif->data.PR[0].jd.client.container.dst); 487 break; 488 case AifJobCtrRebuildMirror: /* Container Rebuild Mirror 489 * operation */ 490 device_printf(sc->aac_dev, 491 "(ConatainerRebuildMirror) container " 492 "%d\n", 493 aif->data.PR[0].jd.client.container.src); 494 break; 495 case AifJobCtrCrazyCache: /* crazy cache */ 496 device_printf(sc->aac_dev, 497 "(ConatainerCrazyCache) container %d\n", 498 aif->data.PR[0].jd.client.container.src); 499 /* XXX two containers? */ 500 break; 501 case AifJobFsCreate: /* File System Create 502 * operation */ 503 device_printf(sc->aac_dev, "(FsCreate)\n"); 504 break; 505 case AifJobFsVerify: /* File System Verify 506 * operation */ 507 device_printf(sc->aac_dev, "(FsVerivy)\n"); 508 break; 509 case AifJobFsExtend: /* File System Extend 510 * operation */ 511 device_printf(sc->aac_dev, "(FsExtend)\n"); 512 break; 513 case AifJobApiFormatNTFS: /* Format a drive to NTFS */ 514 device_printf(sc->aac_dev, "(FormatNTFS)\n"); 515 break; 516 case AifJobApiFormatFAT: /* Format a drive to FAT */ 517 device_printf(sc->aac_dev, "(FormatFAT)\n"); 518 break; 519 case AifJobApiUpdateSnapshot: /* update the read/write half 520 * of a snapshot */ 521 device_printf(sc->aac_dev, "(UpdateSnapshot)\n"); 522 break; 523 case AifJobApiFormatFAT32: /* Format a drive to FAT32 */ 524 device_printf(sc->aac_dev, "(FormatFAT32)\n"); 525 break; 526 case AifJobCtlContinuousCtrVerify: /* Adapter operation */ 527 device_printf(sc->aac_dev, "(ContinuousCtrVerify)\n"); 528 break; 529 default: 530 device_printf(sc->aac_dev, "(%d)\n", 531 aif->data.PR[0].jd.type); 532 break; 533 } 534 break; 535 } 536 case AifCmdAPIReport: 537 device_printf(sc->aac_dev, "APIReport (%d)\n", aif->seqNumber); 538 break; 539 case AifCmdDriverNotify: 540 device_printf(sc->aac_dev, "DriverNotify (%d)\n", 541 aif->seqNumber); 542 break; 543 default: 544 device_printf(sc->aac_dev, "AIF %d (%d)\n", aif->command, 545 aif->seqNumber); 546 break; 547 } 548 } 549 #endif /* AAC_DEBUG */ 550