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