1 /* $NetBSD: ahc_pci.c,v 1.32 2001/11/21 19:01:33 wiz Exp $ */ 2 3 /* 4 * Product specific probe and attach routines for: 5 * 3940, 2940, aic7895, aic7890, aic7880, 6 * aic7870, aic7860 and aic7850 SCSI controllers 7 * 8 * Copyright (c) 1994, 1995, 1996, 1997, 1998, 1999, 2000 Justin T. Gibbs. 9 * All rights reserved. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions, and the following disclaimer, 16 * without modification. 17 * 2. The name of the author may not be used to endorse or promote products 18 * derived from this software without specific prior written permission. 19 * 20 * Alternatively, this software may be distributed under the terms of the 21 * the GNU Public License ("GPL"). 22 * 23 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 26 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR 27 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33 * SUCH DAMAGE. 34 * 35 * $FreeBSD: src/sys/dev/aic7xxx/ahc_pci.c,v 1.28 2000/02/09 21:00:22 gibbs Exp $ 36 */ 37 38 #include <sys/cdefs.h> 39 __KERNEL_RCSID(0, "$NetBSD: ahc_pci.c,v 1.32 2001/11/21 19:01:33 wiz Exp $"); 40 41 #include <sys/param.h> 42 #include <sys/systm.h> 43 #include <sys/malloc.h> 44 #include <sys/kernel.h> 45 #include <sys/queue.h> 46 #include <sys/device.h> 47 #include <sys/reboot.h> 48 49 #include <machine/bus.h> 50 #include <machine/intr.h> 51 52 #include <dev/pci/pcireg.h> 53 #include <dev/pci/pcivar.h> 54 55 /* XXXX some i386 on-board chips act weird when memory-mapped */ 56 #ifndef __i386__ 57 #define AHC_ALLOW_MEMIO 58 #endif 59 60 #define AHC_PCI_IOADDR PCI_MAPREG_START /* I/O Address */ 61 #define AHC_PCI_MEMADDR (PCI_MAPREG_START + 4) /* Mem I/O Address */ 62 63 #include <dev/scsipi/scsi_all.h> 64 #include <dev/scsipi/scsipi_all.h> 65 #include <dev/scsipi/scsiconf.h> 66 67 #include <dev/ic/aic7xxxvar.h> 68 #include <dev/ic/smc93cx6var.h> 69 70 #include <dev/microcode/aic7xxx/aic7xxx_reg.h> 71 72 struct ahc_pci_busdata { 73 pci_chipset_tag_t pc; 74 pcitag_t tag; 75 u_int dev; 76 u_int func; 77 }; 78 79 static __inline u_int64_t 80 ahc_compose_id(u_int device, u_int vendor, u_int subdevice, u_int subvendor) 81 { 82 u_int64_t id; 83 84 id = subvendor 85 | (subdevice << 16) 86 | ((u_int64_t)vendor << 32) 87 | ((u_int64_t)device << 48); 88 89 return (id); 90 } 91 92 #define ID_ALL_MASK 0xFFFFFFFFFFFFFFFFull 93 #define ID_DEV_VENDOR_MASK 0xFFFFFFFF00000000ull 94 #define ID_AIC7850 0x5078900400000000ull 95 #define ID_AHA_2910_15_20_30C 0x5078900478509004ull 96 #define ID_AIC7855 0x5578900400000000ull 97 #define ID_AIC7859 0x3860900400000000ull 98 #define ID_AHA_2930CU 0x3860900438699004ull 99 #define ID_AIC7860 0x6078900400000000ull 100 #define ID_AIC7860C 0x6078900478609004ull 101 #define ID_AHA_2940AU_0 0x6178900400000000ull 102 #define ID_AHA_2940AU_1 0x6178900478619004ull 103 #define ID_AHA_2940AU_CN 0x2178900478219004ull 104 #define ID_AHA_2930C_VAR 0x6038900438689004ull 105 106 #define ID_AIC7870 0x7078900400000000ull 107 #define ID_AHA_2940 0x7178900400000000ull 108 #define ID_AHA_3940 0x7278900400000000ull 109 #define ID_AHA_398X 0x7378900400000000ull 110 #define ID_AHA_2944 0x7478900400000000ull 111 #define ID_AHA_3944 0x7578900400000000ull 112 113 #define ID_AIC7880 0x8078900400000000ull 114 #define ID_AIC7880_B 0x8078900478809004ull 115 #define ID_AHA_2940U 0x8178900400000000ull 116 #define ID_AHA_3940U 0x8278900400000000ull 117 #define ID_AHA_2944U 0x8478900400000000ull 118 #define ID_AHA_3944U 0x8578900400000000ull 119 #define ID_AHA_398XU 0x8378900400000000ull 120 #define ID_AHA_4944U 0x8678900400000000ull 121 #define ID_AHA_2940UB 0x8178900478819004ull 122 #define ID_AHA_2930U 0x8878900478889004ull 123 #define ID_AHA_2940U_PRO 0x8778900478879004ull 124 #define ID_AHA_2940U_CN 0x0078900478009004ull 125 126 #define ID_AIC7895 0x7895900478959004ull 127 #define ID_AIC7895_RAID_PORT 0x7893900478939004ull 128 #define ID_AHA_2940U_DUAL 0x7895900478919004ull 129 #define ID_AHA_3940AU 0x7895900478929004ull 130 #define ID_AHA_3944AU 0x7895900478949004ull 131 132 #define ID_AIC7890 0x001F9005000F9005ull 133 #define ID_AAA_131U2 0x0013900500039005ull 134 #define ID_AHA_2930U2 0x0011900501819005ull 135 #define ID_AHA_2940U2B 0x00109005A1009005ull 136 #define ID_AHA_2940U2_OEM 0x0010900521809005ull 137 #define ID_AHA_2940U2 0x00109005A1809005ull 138 #define ID_AHA_2950U2B 0x00109005E1009005ull 139 140 #define ID_AIC7892 0x008F9005FFFF9005ull 141 #define ID_AHA_29160 0x00809005E2A09005ull 142 #define ID_AHA_29160_CPQ 0x00809005E2A00E11ull 143 #define ID_AHA_29160N 0x0080900562A09005ull 144 #define ID_AHA_29160B 0x00809005E2209005ull 145 #define ID_AHA_19160B 0x0081900562A19005ull 146 147 #define ID_AIC7896 0x005F9005FFFF9005ull 148 #define ID_AHA_3950U2B_0 0x00509005FFFF9005ull 149 #define ID_AHA_3950U2B_1 0x00509005F5009005ull 150 #define ID_AHA_3950U2D_0 0x00519005FFFF9005ull 151 #define ID_AHA_3950U2D_1 0x00519005B5009005ull 152 153 #define ID_AIC7899 0x00CF9005FFFF9005ull 154 #define ID_AHA_3960D 0x00C09005F6209005ull /* AKA AHA-39160 */ 155 #define ID_AHA_3960D_CPQ 0x00C09005F6200E11ull 156 157 #define ID_AIC7810 0x1078900400000000ull 158 #define ID_AIC7815 0x7815900400000000ull 159 160 typedef int (ahc_device_setup_t)(struct pci_attach_args *, char *, 161 ahc_chip *, ahc_feature *, ahc_flag *); 162 163 static ahc_device_setup_t ahc_aic7850_setup; 164 static ahc_device_setup_t ahc_aic7855_setup; 165 static ahc_device_setup_t ahc_aic7859_setup; 166 static ahc_device_setup_t ahc_aic7860_setup; 167 static ahc_device_setup_t ahc_aic7870_setup; 168 static ahc_device_setup_t ahc_aha394X_setup; 169 static ahc_device_setup_t ahc_aha398X_setup; 170 static ahc_device_setup_t ahc_aic7880_setup; 171 static ahc_device_setup_t ahc_2940Pro_setup; 172 static ahc_device_setup_t ahc_aha394XU_setup; 173 static ahc_device_setup_t ahc_aha398XU_setup; 174 static ahc_device_setup_t ahc_aic7890_setup; 175 static ahc_device_setup_t ahc_aic7892_setup; 176 static ahc_device_setup_t ahc_aic7895_setup; 177 static ahc_device_setup_t ahc_aic7896_setup; 178 static ahc_device_setup_t ahc_aic7899_setup; 179 static ahc_device_setup_t ahc_raid_setup; 180 static ahc_device_setup_t ahc_aha394XX_setup; 181 static ahc_device_setup_t ahc_aha398XX_setup; 182 183 struct ahc_pci_identity { 184 u_int64_t full_id; 185 u_int64_t id_mask; 186 const char *name; 187 ahc_device_setup_t *setup; 188 }; 189 190 const struct ahc_pci_identity ahc_pci_ident_table [] = 191 { 192 /* aic7850 based controllers */ 193 { 194 ID_AHA_2910_15_20_30C, 195 ID_ALL_MASK, 196 "Adaptec 2910/15/20/30C SCSI adapter", 197 ahc_aic7850_setup 198 }, 199 /* aic7859 based controllers */ 200 { 201 ID_AHA_2930CU, 202 ID_ALL_MASK, 203 "Adaptec 2930CU SCSI adapter", 204 ahc_aic7859_setup 205 }, 206 /* aic7860 based controllers */ 207 { 208 ID_AHA_2940AU_0 & ID_DEV_VENDOR_MASK, 209 ID_DEV_VENDOR_MASK, 210 "Adaptec 2940A Ultra SCSI adapter", 211 ahc_aic7860_setup 212 }, 213 { 214 ID_AHA_2940AU_CN & ID_DEV_VENDOR_MASK, 215 ID_DEV_VENDOR_MASK, 216 "Adaptec 2940A/CN Ultra SCSI adapter", 217 ahc_aic7860_setup 218 }, 219 { 220 ID_AHA_2930C_VAR & ID_DEV_VENDOR_MASK, 221 ID_DEV_VENDOR_MASK, 222 "Adaptec 2930C SCSI adapter (VAR)", 223 ahc_aic7860_setup 224 }, 225 /* aic7870 based controllers */ 226 { 227 ID_AHA_2940, 228 ID_ALL_MASK, 229 "Adaptec 2940 SCSI adapter", 230 ahc_aic7870_setup 231 }, 232 { 233 ID_AHA_3940, 234 ID_ALL_MASK, 235 "Adaptec 3940 SCSI adapter", 236 ahc_aha394X_setup 237 }, 238 { 239 ID_AHA_398X, 240 ID_ALL_MASK, 241 "Adaptec 398X SCSI RAID adapter", 242 ahc_aha398X_setup 243 }, 244 { 245 ID_AHA_2944, 246 ID_ALL_MASK, 247 "Adaptec 2944 SCSI adapter", 248 ahc_aic7870_setup 249 }, 250 { 251 ID_AHA_3944, 252 ID_ALL_MASK, 253 "Adaptec 3944 SCSI adapter", 254 ahc_aha394X_setup 255 }, 256 /* aic7880 based controllers */ 257 { 258 ID_AHA_2940U & ID_DEV_VENDOR_MASK, 259 ID_DEV_VENDOR_MASK, 260 "Adaptec 2940 Ultra SCSI adapter", 261 ahc_aic7880_setup 262 }, 263 { 264 ID_AHA_3940U & ID_DEV_VENDOR_MASK, 265 ID_DEV_VENDOR_MASK, 266 "Adaptec 3940 Ultra SCSI adapter", 267 ahc_aha394XU_setup 268 }, 269 { 270 ID_AHA_2944U & ID_DEV_VENDOR_MASK, 271 ID_DEV_VENDOR_MASK, 272 "Adaptec 2944 Ultra SCSI adapter", 273 ahc_aic7880_setup 274 }, 275 { 276 ID_AHA_3944U & ID_DEV_VENDOR_MASK, 277 ID_DEV_VENDOR_MASK, 278 "Adaptec 3944 Ultra SCSI adapter", 279 ahc_aha394XU_setup 280 }, 281 { 282 ID_AHA_398XU & ID_DEV_VENDOR_MASK, 283 ID_DEV_VENDOR_MASK, 284 "Adaptec 398X Ultra SCSI RAID adapter", 285 ahc_aha398XU_setup 286 }, 287 { 288 /* 289 * XXX Don't know the slot numbers 290 * so we can't identify channels 291 */ 292 ID_AHA_4944U & ID_DEV_VENDOR_MASK, 293 ID_DEV_VENDOR_MASK, 294 "Adaptec 4944 Ultra SCSI adapter", 295 ahc_aic7880_setup 296 }, 297 { 298 ID_AHA_2930U & ID_DEV_VENDOR_MASK, 299 ID_DEV_VENDOR_MASK, 300 "Adaptec 2930 Ultra SCSI adapter", 301 ahc_aic7880_setup 302 }, 303 { 304 ID_AHA_2940U_PRO & ID_DEV_VENDOR_MASK, 305 ID_DEV_VENDOR_MASK, 306 "Adaptec 2940 Pro Ultra SCSI adapter", 307 ahc_2940Pro_setup 308 }, 309 { 310 ID_AHA_2940U_CN & ID_DEV_VENDOR_MASK, 311 ID_DEV_VENDOR_MASK, 312 "Adaptec 2940/CN Ultra SCSI adapter", 313 ahc_aic7880_setup 314 }, 315 /* aic7890 based controllers */ 316 { 317 ID_AHA_2930U2, 318 ID_ALL_MASK, 319 "Adaptec 2930 Ultra2 SCSI adapter", 320 ahc_aic7890_setup 321 }, 322 { 323 ID_AHA_2940U2B, 324 ID_ALL_MASK, 325 "Adaptec 2940B Ultra2 SCSI adapter", 326 ahc_aic7890_setup 327 }, 328 { 329 ID_AHA_2940U2_OEM, 330 ID_ALL_MASK, 331 "Adaptec 2940 Ultra2 SCSI adapter (OEM)", 332 ahc_aic7890_setup 333 }, 334 { 335 ID_AHA_2940U2, 336 ID_ALL_MASK, 337 "Adaptec 2940 Ultra2 SCSI adapter", 338 ahc_aic7890_setup 339 }, 340 { 341 ID_AHA_2950U2B, 342 ID_ALL_MASK, 343 "Adaptec 2950 Ultra2 SCSI adapter", 344 ahc_aic7890_setup 345 }, 346 { 347 ID_AAA_131U2, 348 ID_ALL_MASK, 349 "Adaptec AAA-131 Ultra2 RAID adapter", 350 ahc_aic7890_setup 351 }, 352 /* aic7892 based controllers */ 353 { 354 ID_AHA_29160, 355 ID_ALL_MASK, 356 "Adaptec 29160 Ultra160 SCSI adapter", 357 ahc_aic7892_setup 358 }, 359 { 360 ID_AHA_29160_CPQ, 361 ID_ALL_MASK, 362 "Adaptec (Compaq OEM) 29160 Ultra160 SCSI adapter", 363 ahc_aic7892_setup 364 }, 365 { 366 ID_AHA_29160N, 367 ID_ALL_MASK, 368 "Adaptec 29160N Ultra160 SCSI adapter", 369 ahc_aic7892_setup 370 }, 371 { 372 ID_AHA_29160B, 373 ID_ALL_MASK, 374 "Adaptec 29160B Ultra160 SCSI adapter", 375 ahc_aic7892_setup 376 }, 377 { 378 ID_AHA_19160B, 379 ID_ALL_MASK, 380 "Adaptec 19160B Ultra160 SCSI adapter", 381 ahc_aic7892_setup 382 }, 383 /* aic7895 based controllers */ 384 { 385 ID_AHA_2940U_DUAL, 386 ID_ALL_MASK, 387 "Adaptec 2940/DUAL Ultra SCSI adapter", 388 ahc_aic7895_setup 389 }, 390 { 391 ID_AHA_3940AU, 392 ID_ALL_MASK, 393 "Adaptec 3940A Ultra SCSI adapter", 394 ahc_aic7895_setup 395 }, 396 { 397 ID_AHA_3944AU, 398 ID_ALL_MASK, 399 "Adaptec 3944A Ultra SCSI adapter", 400 ahc_aic7895_setup 401 }, 402 /* aic7896/97 based controllers */ 403 { 404 ID_AHA_3950U2B_0, 405 ID_ALL_MASK, 406 "Adaptec 3950B Ultra2 SCSI adapter", 407 ahc_aic7896_setup 408 }, 409 { 410 ID_AHA_3950U2B_1, 411 ID_ALL_MASK, 412 "Adaptec 3950B Ultra2 SCSI adapter", 413 ahc_aic7896_setup 414 }, 415 { 416 ID_AHA_3950U2D_0, 417 ID_ALL_MASK, 418 "Adaptec 3950D Ultra2 SCSI adapter", 419 ahc_aic7896_setup 420 }, 421 { 422 ID_AHA_3950U2D_1, 423 ID_ALL_MASK, 424 "Adaptec 3950D Ultra2 SCSI adapter", 425 ahc_aic7896_setup 426 }, 427 /* aic7899 based controllers */ 428 { 429 ID_AHA_3960D, 430 ID_ALL_MASK, 431 "Adaptec 3960D Ultra160 SCSI adapter", 432 ahc_aic7899_setup 433 }, 434 { 435 ID_AHA_3960D_CPQ, 436 ID_ALL_MASK, 437 "Adaptec (Compaq OEM) 3960D Ultra160 SCSI adapter", 438 ahc_aic7899_setup 439 }, 440 /* Generic chip probes for devices we don't know 'exactly' */ 441 { 442 ID_AIC7850 & ID_DEV_VENDOR_MASK, 443 ID_DEV_VENDOR_MASK, 444 "Adaptec aic7850 SCSI adapter", 445 ahc_aic7850_setup 446 }, 447 { 448 ID_AIC7855 & ID_DEV_VENDOR_MASK, 449 ID_DEV_VENDOR_MASK, 450 "Adaptec aic7855 SCSI adapter", 451 ahc_aic7855_setup 452 }, 453 { 454 ID_AIC7859 & ID_DEV_VENDOR_MASK, 455 ID_DEV_VENDOR_MASK, 456 "Adaptec aic7859 SCSI adapter", 457 ahc_aic7859_setup 458 }, 459 { 460 ID_AIC7860 & ID_DEV_VENDOR_MASK, 461 ID_DEV_VENDOR_MASK, 462 "Adaptec aic7860 SCSI adapter", 463 ahc_aic7860_setup 464 }, 465 { 466 ID_AIC7870 & ID_DEV_VENDOR_MASK, 467 ID_DEV_VENDOR_MASK, 468 "Adaptec aic7870 SCSI adapter", 469 ahc_aic7870_setup 470 }, 471 { 472 ID_AIC7880 & ID_DEV_VENDOR_MASK, 473 ID_DEV_VENDOR_MASK, 474 "Adaptec aic7880 Ultra SCSI adapter", 475 ahc_aic7880_setup 476 }, 477 { 478 ID_AIC7890 & ID_DEV_VENDOR_MASK, 479 ID_DEV_VENDOR_MASK, 480 "Adaptec aic7890/91 Ultra2 SCSI adapter", 481 ahc_aic7890_setup 482 }, 483 { 484 ID_AIC7892 & ID_DEV_VENDOR_MASK, 485 ID_DEV_VENDOR_MASK, 486 "Adaptec aic7892 Ultra160 SCSI adapter", 487 ahc_aic7892_setup 488 }, 489 { 490 ID_AIC7895 & ID_DEV_VENDOR_MASK, 491 ID_DEV_VENDOR_MASK, 492 "Adaptec aic7895 Ultra SCSI adapter", 493 ahc_aic7895_setup 494 }, 495 { 496 ID_AIC7895_RAID_PORT & ID_DEV_VENDOR_MASK, 497 ID_DEV_VENDOR_MASK, 498 "Adaptec aic7895 Ultra SCSI adapter (RAID PORT)", 499 ahc_aic7895_setup 500 }, 501 { 502 ID_AIC7896 & ID_DEV_VENDOR_MASK, 503 ID_DEV_VENDOR_MASK, 504 "Adaptec aic7896/97 Ultra2 SCSI adapter", 505 ahc_aic7896_setup 506 }, 507 { 508 ID_AIC7899 & ID_DEV_VENDOR_MASK, 509 ID_DEV_VENDOR_MASK, 510 "Adaptec aic7899 Ultra160 SCSI adapter", 511 ahc_aic7899_setup 512 }, 513 { 514 ID_AIC7810 & ID_DEV_VENDOR_MASK, 515 ID_DEV_VENDOR_MASK, 516 "Adaptec aic7810 RAID memory controller", 517 ahc_raid_setup 518 }, 519 { 520 ID_AIC7815 & ID_DEV_VENDOR_MASK, 521 ID_DEV_VENDOR_MASK, 522 "Adaptec aic7815 RAID memory controller", 523 ahc_raid_setup 524 } 525 }; 526 527 static const int ahc_num_pci_devs = 528 sizeof(ahc_pci_ident_table) / sizeof(*ahc_pci_ident_table); 529 530 #define AHC_394X_SLOT_CHANNEL_A 4 531 #define AHC_394X_SLOT_CHANNEL_B 5 532 533 #define AHC_398X_SLOT_CHANNEL_A 4 534 #define AHC_398X_SLOT_CHANNEL_B 8 535 #define AHC_398X_SLOT_CHANNEL_C 12 536 537 #define DEVCONFIG 0x40 538 #define SCBSIZE32 0x00010000 /* aic789X only */ 539 #define MPORTMODE 0x00000400 /* aic7870 only */ 540 #define RAMPSM 0x00000200 /* aic7870 only */ 541 #define VOLSENSE 0x00000100 542 #define SCBRAMSEL 0x00000080 543 #define MRDCEN 0x00000040 544 #define EXTSCBTIME 0x00000020 /* aic7870 only */ 545 #define EXTSCBPEN 0x00000010 /* aic7870 only */ 546 #define BERREN 0x00000008 547 #define DACEN 0x00000004 548 #define STPWLEVEL 0x00000002 549 #define DIFACTNEGEN 0x00000001 /* aic7870 only */ 550 551 #define CSIZE_LATTIME 0x0c 552 #define CACHESIZE 0x0000003f /* only 5 bits */ 553 #define LATTIME 0x0000ff00 554 555 static const struct ahc_pci_identity *ahc_find_pci_device(pcireg_t, pcireg_t); 556 static int ahc_ext_scbram_present(struct ahc_softc *ahc); 557 static void ahc_ext_scbram_config(struct ahc_softc *ahc, int enable, 558 int pcheck, int fast); 559 static void ahc_probe_ext_scbram(struct ahc_softc *ahc); 560 561 int ahc_pci_probe __P((struct device *, struct cfdata *, void *)); 562 void ahc_pci_attach __P((struct device *, struct device *, void *)); 563 564 /* Exported for use in the ahc_intr routine */ 565 int ahc_pci_intr(struct ahc_softc *ahc); 566 567 struct cfattach ahc_pci_ca = { 568 sizeof(struct ahc_softc), ahc_pci_probe, ahc_pci_attach 569 }; 570 571 static const struct ahc_pci_identity * 572 ahc_find_pci_device(id, subid) 573 pcireg_t id, subid; 574 { 575 u_int64_t full_id; 576 const struct ahc_pci_identity *entry; 577 u_int i; 578 579 full_id = ahc_compose_id(PCI_PRODUCT(id), PCI_VENDOR(id), 580 PCI_PRODUCT(subid), PCI_VENDOR(subid)); 581 582 for (i = 0; i < ahc_num_pci_devs; i++) { 583 entry = &ahc_pci_ident_table[i]; 584 if (entry->full_id == (full_id & entry->id_mask)) 585 return (entry); 586 } 587 return (NULL); 588 } 589 590 int 591 ahc_pci_probe(parent, match, aux) 592 struct device *parent; 593 struct cfdata *match; 594 void *aux; 595 { 596 struct pci_attach_args *pa = aux; 597 const struct ahc_pci_identity *entry; 598 pcireg_t subid; 599 600 subid = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_SUBSYS_ID_REG); 601 entry = ahc_find_pci_device(pa->pa_id, subid); 602 return entry != NULL ? 1 : 0; 603 } 604 605 void 606 ahc_pci_attach(parent, self, aux) 607 struct device *parent, *self; 608 void *aux; 609 { 610 struct pci_attach_args *pa = aux; 611 const struct ahc_pci_identity *entry; 612 struct ahc_softc *ahc = (void *)self; 613 pcireg_t command; 614 ahc_chip ahc_t = AHC_NONE; 615 ahc_feature ahc_fe = AHC_FENONE; 616 ahc_flag ahc_f = AHC_FNONE; 617 u_int our_id = 0; 618 u_int sxfrctl1; 619 u_int scsiseq; 620 int error; 621 char channel; 622 pcireg_t subid; 623 int ioh_valid, memh_valid; 624 bus_space_tag_t st, iot; 625 bus_space_handle_t sh, ioh; 626 #ifdef AHC_ALLOW_MEMIO 627 bus_space_tag_t memt; 628 bus_space_handle_t memh; 629 pcireg_t memtype; 630 #endif 631 pci_intr_handle_t ih; 632 const char *intrstr; 633 struct ahc_pci_busdata *bd; 634 635 command = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG); 636 subid = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_SUBSYS_ID_REG); 637 entry = ahc_find_pci_device(pa->pa_id, subid); 638 if (entry == NULL) 639 return; 640 error = entry->setup(pa, &channel, &ahc_t, &ahc_fe, &ahc_f); 641 if (error != 0) 642 return; 643 644 ioh_valid = memh_valid = 0; 645 646 #ifdef AHC_ALLOW_MEMIO 647 memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, AHC_PCI_MEMADDR); 648 switch (memtype) { 649 case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_32BIT: 650 case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_64BIT: 651 memh_valid = (pci_mapreg_map(pa, AHC_PCI_MEMADDR, 652 memtype, 0, &memt, &memh, NULL, NULL) == 0); 653 break; 654 default: 655 memh_valid = 0; 656 } 657 #endif 658 ioh_valid = (pci_mapreg_map(pa, AHC_PCI_IOADDR, 659 PCI_MAPREG_TYPE_IO, 0, &iot, &ioh, NULL, NULL) == 0); 660 661 if (ioh_valid) { 662 st = iot; 663 sh = ioh; 664 #ifdef AHC_ALLOW_MEMIO 665 } else if (memh_valid) { 666 st = memt; 667 sh = memh; 668 #endif 669 } else { 670 printf(": unable to map registers\n"); 671 return; 672 } 673 674 printf("\n"); 675 676 677 /* Ensure busmastering is enabled */ 678 command |= PCI_COMMAND_MASTER_ENABLE;; 679 pci_conf_write(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG, command); 680 681 /* On all PCI adapters, we allow SCB paging */ 682 ahc_f |= AHC_PAGESCBS; 683 if (ahc_alloc(ahc, sh, st, pa->pa_dmat, 684 ahc_t|AHC_PCI, ahc_fe, ahc_f) < 0) 685 return; 686 687 bd = malloc(sizeof (struct ahc_pci_busdata), M_DEVBUF, M_NOWAIT); 688 if (bd == NULL) { 689 printf(": unable to allocate bus-specific data\n"); 690 return; 691 } 692 693 bd->pc = pa->pa_pc; 694 bd->tag = pa->pa_tag; 695 bd->func = pa->pa_function; 696 bd->dev = pa->pa_device; 697 698 ahc->bus_data = bd; 699 ahc->bus_intr = ahc_pci_intr; 700 ahc->channel = channel; 701 702 /* Remeber how the card was setup in case there is no SEEPROM */ 703 ahc_outb(ahc, HCNTRL, ahc->pause); 704 if ((ahc->features & AHC_ULTRA2) != 0) 705 our_id = ahc_inb(ahc, SCSIID_ULTRA2) & OID; 706 else 707 our_id = ahc_inb(ahc, SCSIID) & OID; 708 sxfrctl1 = ahc_inb(ahc, SXFRCTL1) & STPWEN; 709 scsiseq = ahc_inb(ahc, SCSISEQ); 710 711 if (ahc_reset(ahc) != 0) { 712 /* Failed */ 713 ahc_free(ahc); 714 return; 715 } 716 717 if ((ahc->features & AHC_DT) != 0) { 718 u_int optionmode; 719 u_int sfunct; 720 721 /* Perform ALT-Mode Setup */ 722 sfunct = ahc_inb(ahc, SFUNCT) & ~ALT_MODE; 723 ahc_outb(ahc, SFUNCT, sfunct | ALT_MODE); 724 optionmode = ahc_inb(ahc, OPTIONMODE); 725 #ifdef DEBUG 726 printf("%s: OptionMode = %x\n", ahc->sc_dev.dv_xname, 727 optionmode); 728 #endif 729 ahc_outb(ahc, OPTIONMODE, OPTIONMODE_DEFAULTS); 730 /* Send CRC info in target mode every 4K */ 731 ahc_outb(ahc, TARGCRCCNT, 0); 732 ahc_outb(ahc, TARGCRCCNT + 1, 0x10); 733 ahc_outb(ahc, SFUNCT, sfunct); 734 735 /* Normal mode setup */ 736 ahc_outb(ahc, CRCCONTROL1, CRCVALCHKEN|CRCENDCHKEN|CRCREQCHKEN 737 |TARGCRCENDEN|TARGCRCCNTEN); 738 } 739 740 if (pci_intr_map(pa, &ih)) { 741 printf("%s: couldn't map interrupt\n", ahc->sc_dev.dv_xname); 742 ahc_free(ahc); 743 return; 744 } 745 intrstr = pci_intr_string(pa->pa_pc, ih); 746 ahc->ih = pci_intr_establish(pa->pa_pc, ih, IPL_BIO, ahc_intr, ahc); 747 if (ahc->ih == NULL) { 748 printf("%s: couldn't establish interrupt", 749 ahc->sc_dev.dv_xname); 750 if (intrstr != NULL) 751 printf(" at %s", intrstr); 752 printf("\n"); 753 ahc_free(ahc); 754 return; 755 } 756 if (intrstr != NULL) 757 printf("%s: interrupting at %s\n", ahc->sc_dev.dv_xname, 758 intrstr); 759 760 /* 761 * Do aic7880/aic7870/aic7860/aic7850 specific initialization 762 */ 763 { 764 u_int8_t sblkctl; 765 u_int dscommand0; 766 767 dscommand0 = ahc_inb(ahc, DSCOMMAND0); 768 dscommand0 |= MPARCKEN; 769 if ((ahc->features & AHC_ULTRA2) != 0) { 770 771 /* 772 * DPARCKEN doesn't work correctly on 773 * some MBs so don't use it. 774 */ 775 dscommand0 &= ~(USCBSIZE32|DPARCKEN); 776 dscommand0 |= CACHETHEN; 777 } 778 779 ahc_outb(ahc, DSCOMMAND0, dscommand0); 780 781 /* See if we have an SEEPROM and perform auto-term */ 782 check_extport(ahc, &sxfrctl1); 783 784 /* 785 * Take the LED out of diagnostic mode 786 */ 787 sblkctl = ahc_inb(ahc, SBLKCTL); 788 ahc_outb(ahc, SBLKCTL, (sblkctl & ~(DIAGLEDEN|DIAGLEDON))); 789 790 /* 791 * I don't know where this is set in the SEEPROM or by the 792 * BIOS, so we default to 100% on Ultra or slower controllers 793 * and 75% on ULTRA2 controllers. 794 */ 795 if ((ahc->features & AHC_ULTRA2) != 0) { 796 ahc_outb(ahc, DFF_THRSH, RD_DFTHRSH_75|WR_DFTHRSH_75); 797 } else { 798 ahc_outb(ahc, DSPCISTATUS, DFTHRSH_100); 799 } 800 801 if (ahc->flags & AHC_USEDEFAULTS) { 802 /* 803 * PCI Adapter default setup 804 * Should only be used if the adapter does not have 805 * an SEEPROM. 806 */ 807 /* See if someone else set us up already */ 808 if (scsiseq != 0) { 809 printf("%s: Using left over BIOS settings\n", 810 ahc_name(ahc)); 811 ahc->flags &= ~AHC_USEDEFAULTS; 812 } else { 813 /* 814 * Assume only one connector and always turn 815 * on termination. 816 */ 817 our_id = 0x07; 818 sxfrctl1 = STPWEN; 819 } 820 ahc_outb(ahc, SCSICONF, our_id|ENSPCHK|RESET_SCSI); 821 822 ahc->our_id = our_id; 823 } 824 } 825 826 /* 827 * Take a look to see if we have external SRAM. 828 * We currently do not attempt to use SRAM that is 829 * shared among multiple controllers. 830 */ 831 ahc_probe_ext_scbram(ahc); 832 833 834 printf("%s: %s ", ahc_name(ahc), 835 ahc_chip_names[ahc->chip & AHC_CHIPID_MASK]); 836 837 /* 838 * Record our termination setting for the 839 * generic initialization routine. 840 */ 841 if ((sxfrctl1 & STPWEN) != 0) 842 ahc->flags |= AHC_TERM_ENB_A; 843 844 if (ahc_init(ahc)) { 845 ahc_free(ahc); 846 return; 847 } 848 849 ahc_attach(ahc); 850 } 851 852 /* 853 * Test for the presence of external sram in an 854 * "unshared" configuration. 855 */ 856 static int 857 ahc_ext_scbram_present(struct ahc_softc *ahc) 858 { 859 int ramps; 860 int single_user; 861 pcireg_t devconfig; 862 struct ahc_pci_busdata *bd = ahc->bus_data; 863 864 devconfig = pci_conf_read(bd->pc, bd->tag, DEVCONFIG); 865 single_user = (devconfig & MPORTMODE) != 0; 866 867 if ((ahc->features & AHC_ULTRA2) != 0) 868 ramps = (ahc_inb(ahc, DSCOMMAND0) & RAMPS) != 0; 869 else if ((ahc->chip & AHC_CHIPID_MASK) >= AHC_AIC7870) 870 ramps = (devconfig & RAMPSM) != 0; 871 else 872 ramps = 0; 873 874 if (ramps && single_user) 875 return (1); 876 return (0); 877 } 878 879 /* 880 * Enable external scbram. 881 */ 882 static void 883 ahc_ext_scbram_config(struct ahc_softc *ahc, int enable, int pcheck, int fast) 884 { 885 pcireg_t devconfig; 886 struct ahc_pci_busdata *bd = ahc->bus_data; 887 888 if (ahc->features & AHC_MULTI_FUNC) { 889 /* 890 * Set the SCB Base addr (highest address bit) 891 * depending on which channel we are. 892 */ 893 ahc_outb(ahc, SCBBADDR, (u_int8_t)bd->func); 894 } 895 896 devconfig = pci_conf_read(bd->pc, bd->tag, DEVCONFIG); 897 if ((ahc->features & AHC_ULTRA2) != 0) { 898 u_int dscommand0; 899 900 dscommand0 = ahc_inb(ahc, DSCOMMAND0); 901 if (enable) 902 dscommand0 &= ~INTSCBRAMSEL; 903 else 904 dscommand0 |= INTSCBRAMSEL; 905 ahc_outb(ahc, DSCOMMAND0, dscommand0); 906 } else { 907 if (fast) 908 devconfig &= ~EXTSCBTIME; 909 else 910 devconfig |= EXTSCBTIME; 911 if (enable) 912 devconfig &= ~SCBRAMSEL; 913 else 914 devconfig |= SCBRAMSEL; 915 } 916 if (pcheck) 917 devconfig |= EXTSCBPEN; 918 else 919 devconfig &= ~EXTSCBPEN; 920 921 pci_conf_write(bd->pc, bd->tag, DEVCONFIG, devconfig); 922 } 923 924 /* 925 * Take a look to see if we have external SRAM. 926 * We currently do not attempt to use SRAM that is 927 * shared among multiple controllers. 928 */ 929 static void 930 ahc_probe_ext_scbram(struct ahc_softc *ahc) 931 { 932 int num_scbs; 933 int test_num_scbs; 934 int enable; 935 int pcheck; 936 int fast; 937 938 if (ahc_ext_scbram_present(ahc) == 0) 939 return; 940 941 /* 942 * Probe for the best parameters to use. 943 */ 944 enable = FALSE; 945 pcheck = FALSE; 946 fast = FALSE; 947 ahc_ext_scbram_config(ahc, /*enable*/TRUE, pcheck, fast); 948 num_scbs = ahc_probe_scbs(ahc); 949 if (num_scbs == 0) { 950 /* The SRAM wasn't really present. */ 951 goto done; 952 } 953 enable = TRUE; 954 955 /* 956 * Clear any outstanding parity error 957 * and ensure that parity error reporting 958 * is enabled. 959 */ 960 ahc_outb(ahc, SEQCTL, 0); 961 ahc_outb(ahc, CLRINT, CLRPARERR); 962 ahc_outb(ahc, CLRINT, CLRBRKADRINT); 963 964 /* Now see if we can do parity */ 965 ahc_ext_scbram_config(ahc, enable, /*pcheck*/TRUE, fast); 966 num_scbs = ahc_probe_scbs(ahc); 967 if ((ahc_inb(ahc, INTSTAT) & BRKADRINT) == 0 968 || (ahc_inb(ahc, ERROR) & MPARERR) == 0) 969 pcheck = TRUE; 970 971 /* Clear any resulting parity error */ 972 ahc_outb(ahc, CLRINT, CLRPARERR); 973 ahc_outb(ahc, CLRINT, CLRBRKADRINT); 974 975 /* Now see if we can do fast timing */ 976 ahc_ext_scbram_config(ahc, enable, pcheck, /*fast*/TRUE); 977 test_num_scbs = ahc_probe_scbs(ahc); 978 if (test_num_scbs == num_scbs 979 && ((ahc_inb(ahc, INTSTAT) & BRKADRINT) == 0 980 || (ahc_inb(ahc, ERROR) & MPARERR) == 0)) 981 fast = TRUE; 982 983 done: 984 /* 985 * Disable parity error reporting until we 986 * can load instruction ram. 987 */ 988 ahc_outb(ahc, SEQCTL, PERRORDIS|FAILDIS); 989 /* Clear any latched parity error */ 990 ahc_outb(ahc, CLRINT, CLRPARERR); 991 ahc_outb(ahc, CLRINT, CLRBRKADRINT); 992 if (bootverbose && enable) { 993 printf("%s: External SRAM, %s access%s\n", 994 ahc_name(ahc), fast ? "fast" : "slow", 995 pcheck ? ", parity checking enabled" : ""); 996 997 } 998 ahc_ext_scbram_config(ahc, enable, pcheck, fast); 999 } 1000 1001 #define DPE PCI_STATUS_PARITY_DETECT 1002 #define SSE PCI_STATUS_SPECIAL_ERROR 1003 #define RMA PCI_STATUS_MASTER_ABORT 1004 #define RTA PCI_STATUS_MASTER_TARGET_ABORT 1005 #define STA PCI_STATUS_TARGET_TARGET_ABORT 1006 #define DPR PCI_STATUS_PARITY_ERROR 1007 1008 int 1009 ahc_pci_intr(struct ahc_softc *ahc) 1010 { 1011 pcireg_t status1; 1012 struct ahc_pci_busdata *bd = ahc->bus_data; 1013 1014 if ((ahc_inb(ahc, ERROR) & PCIERRSTAT) == 0) 1015 return 0; 1016 1017 status1 = pci_conf_read(bd->pc, bd->tag, PCI_COMMAND_STATUS_REG); 1018 1019 if (status1 & DPE) { 1020 printf("%s: Data Parity Error Detected during address " 1021 "or write data phase\n", ahc_name(ahc)); 1022 } 1023 if (status1 & SSE) { 1024 printf("%s: Signal System Error Detected\n", ahc_name(ahc)); 1025 } 1026 if (status1 & RMA) { 1027 printf("%s: Received a Master Abort\n", ahc_name(ahc)); 1028 } 1029 if (status1 & RTA) { 1030 printf("%s: Received a Target Abort\n", ahc_name(ahc)); 1031 } 1032 if (status1 & STA) { 1033 printf("%s: Signaled a Target Abort\n", ahc_name(ahc)); 1034 } 1035 if (status1 & DPR) { 1036 printf("%s: Data Parity Error has been reported via PERR#\n", 1037 ahc_name(ahc)); 1038 } 1039 if ((status1 & (DPE|SSE|RMA|RTA|STA|DPR)) == 0) { 1040 printf("%s: Latched PCIERR interrupt with " 1041 "no status bits set\n", ahc_name(ahc)); 1042 } 1043 pci_conf_write(bd->pc, bd->tag, PCI_COMMAND_STATUS_REG, status1); 1044 1045 if (status1 & (DPR|RMA|RTA)) { 1046 ahc_outb(ahc, CLRINT, CLRPARERR); 1047 } 1048 1049 return 1; 1050 } 1051 1052 static int 1053 ahc_aic7850_setup(struct pci_attach_args *pa, char *channel, 1054 ahc_chip *chip, ahc_feature *features, ahc_flag *flags) 1055 { 1056 *channel = 'A'; 1057 *chip = AHC_AIC7850; 1058 *features = AHC_AIC7850_FE; 1059 return (0); 1060 } 1061 1062 static int 1063 ahc_aic7855_setup(struct pci_attach_args *pa, char *channel, 1064 ahc_chip *chip, ahc_feature *features, ahc_flag *flags) 1065 { 1066 *channel = 'A'; 1067 *chip = AHC_AIC7855; 1068 *features = AHC_AIC7855_FE; 1069 return (0); 1070 } 1071 1072 static int 1073 ahc_aic7859_setup(struct pci_attach_args *pa, char *channel, 1074 ahc_chip *chip, ahc_feature *features, ahc_flag *flags) 1075 { 1076 *channel = 'A'; 1077 *chip = AHC_AIC7859; 1078 *features = AHC_AIC7859_FE; 1079 return (0); 1080 } 1081 1082 static int 1083 ahc_aic7860_setup(struct pci_attach_args *pa, char *channel, 1084 ahc_chip *chip, ahc_feature *features, ahc_flag *flags) 1085 { 1086 *channel = 'A'; 1087 *chip = AHC_AIC7860; 1088 *features = AHC_AIC7860_FE; 1089 return (0); 1090 } 1091 1092 static int 1093 ahc_aic7870_setup(struct pci_attach_args *pa, char *channel, 1094 ahc_chip *chip, ahc_feature *features, ahc_flag *flags) 1095 { 1096 *channel = 'A'; 1097 *chip = AHC_AIC7870; 1098 *features = AHC_AIC7870_FE; 1099 return (0); 1100 } 1101 1102 static int 1103 ahc_aha394X_setup(struct pci_attach_args *pa, char *channel, 1104 ahc_chip *chip, ahc_feature *features, ahc_flag *flags) 1105 { 1106 int error; 1107 1108 error = ahc_aic7870_setup(pa, channel, chip, features, flags); 1109 if (error == 0) 1110 error = ahc_aha394XX_setup(pa, channel, chip, features, flags); 1111 return (error); 1112 } 1113 1114 static int 1115 ahc_aha398X_setup(struct pci_attach_args *pa, char *channel, 1116 ahc_chip *chip, ahc_feature *features, ahc_flag *flags) 1117 { 1118 int error; 1119 1120 error = ahc_aic7870_setup(pa, channel, chip, features, flags); 1121 if (error == 0) 1122 error = ahc_aha398XX_setup(pa, channel, chip, features, flags); 1123 return (error); 1124 } 1125 1126 static int 1127 ahc_aic7880_setup(struct pci_attach_args *pa, char *channel, 1128 ahc_chip *chip, ahc_feature *features, ahc_flag *flags) 1129 { 1130 *channel = 'A'; 1131 *chip = AHC_AIC7880; 1132 *features = AHC_AIC7880_FE; 1133 return (0); 1134 } 1135 1136 static int 1137 ahc_2940Pro_setup(struct pci_attach_args *pa, char *channel, 1138 ahc_chip *chip, ahc_feature *features, ahc_flag *flags) 1139 { 1140 int error; 1141 1142 *flags |= AHC_INT50_SPEEDFLEX; 1143 error = ahc_aic7880_setup(pa, channel, chip, features, flags); 1144 return (0); 1145 } 1146 1147 static int 1148 ahc_aha394XU_setup(struct pci_attach_args *pa, char *channel, 1149 ahc_chip *chip, ahc_feature *features, ahc_flag *flags) 1150 { 1151 int error; 1152 1153 error = ahc_aic7880_setup(pa, channel, chip, features, flags); 1154 if (error == 0) 1155 error = ahc_aha394XX_setup(pa, channel, chip, features, flags); 1156 return (error); 1157 } 1158 1159 static int 1160 ahc_aha398XU_setup(struct pci_attach_args *pa, char *channel, 1161 ahc_chip *chip, ahc_feature *features, ahc_flag *flags) 1162 { 1163 int error; 1164 1165 error = ahc_aic7880_setup(pa, channel, chip, features, flags); 1166 if (error == 0) 1167 error = ahc_aha398XX_setup(pa, channel, chip, features, flags); 1168 return (error); 1169 } 1170 1171 static int 1172 ahc_aic7890_setup(struct pci_attach_args *pa, char *channel, 1173 ahc_chip *chip, ahc_feature *features, ahc_flag *flags) 1174 { 1175 *channel = 'A'; 1176 *chip = AHC_AIC7890; 1177 *features = AHC_AIC7890_FE; 1178 *flags |= AHC_NEWEEPROM_FMT; 1179 return (0); 1180 } 1181 1182 static int 1183 ahc_aic7892_setup(struct pci_attach_args *pa, char *channel, 1184 ahc_chip *chip, ahc_feature *features, ahc_flag *flags) 1185 { 1186 *channel = 'A'; 1187 *chip = AHC_AIC7892; 1188 *features = AHC_AIC7892_FE; 1189 *flags |= AHC_NEWEEPROM_FMT; 1190 return (0); 1191 } 1192 1193 static int 1194 ahc_aic7895_setup(struct pci_attach_args *pa, char *channel, 1195 ahc_chip *chip, ahc_feature *features, ahc_flag *flags) 1196 { 1197 pcireg_t devconfig; 1198 1199 *channel = pa->pa_function == 1 ? 'B' : 'A'; 1200 *chip = AHC_AIC7895; 1201 /* The 'C' revision of the aic7895 has a few additional features */ 1202 if (PCI_REVISION(pa->pa_class) >= 4) 1203 *features = AHC_AIC7895C_FE; 1204 else 1205 *features = AHC_AIC7895_FE; 1206 *flags |= AHC_NEWEEPROM_FMT; 1207 devconfig = pci_conf_read(pa->pa_pc, pa->pa_tag, DEVCONFIG); 1208 devconfig &= ~SCBSIZE32; 1209 pci_conf_write(pa->pa_pc, pa->pa_tag, DEVCONFIG, devconfig); 1210 return (0); 1211 } 1212 1213 static int 1214 ahc_aic7896_setup(struct pci_attach_args *pa, char *channel, 1215 ahc_chip *chip, ahc_feature *features, ahc_flag *flags) 1216 { 1217 *channel = pa->pa_function == 1 ? 'B' : 'A'; 1218 *chip = AHC_AIC7896; 1219 *features = AHC_AIC7896_FE; 1220 *flags |= AHC_NEWEEPROM_FMT; 1221 return (0); 1222 } 1223 1224 static int 1225 ahc_aic7899_setup(struct pci_attach_args *pa, char *channel, 1226 ahc_chip *chip, ahc_feature *features, ahc_flag *flags) 1227 { 1228 *channel = pa->pa_function == 1 ? 'B' : 'A'; 1229 *chip = AHC_AIC7899; 1230 *features = AHC_AIC7899_FE; 1231 *flags |= AHC_NEWEEPROM_FMT; 1232 return (0); 1233 } 1234 1235 static int 1236 ahc_raid_setup(struct pci_attach_args *pa, char *channel, 1237 ahc_chip *chip, ahc_feature *features, ahc_flag *flags) 1238 { 1239 printf(": RAID functionality unsupported\n"); 1240 return (ENXIO); 1241 } 1242 1243 static int 1244 ahc_aha394XX_setup(struct pci_attach_args *pa, char *channel, 1245 ahc_chip *chip, ahc_feature *features, ahc_flag *flags) 1246 { 1247 switch (pa->pa_device) { 1248 case AHC_394X_SLOT_CHANNEL_A: 1249 *channel = 'A'; 1250 break; 1251 case AHC_394X_SLOT_CHANNEL_B: 1252 *channel = 'B'; 1253 break; 1254 default: 1255 printf("adapter at unexpected slot %d\n" 1256 "unable to map to a channel\n", 1257 pa->pa_device); 1258 *channel = 'A'; 1259 } 1260 return (0); 1261 } 1262 1263 static int 1264 ahc_aha398XX_setup(struct pci_attach_args *pa, char *channel, 1265 ahc_chip *chip, ahc_feature *features, ahc_flag *flags) 1266 { 1267 switch (pa->pa_device) { 1268 case AHC_398X_SLOT_CHANNEL_A: 1269 *channel = 'A'; 1270 break; 1271 case AHC_398X_SLOT_CHANNEL_B: 1272 *channel = 'B'; 1273 break; 1274 case AHC_398X_SLOT_CHANNEL_C: 1275 *channel = 'C'; 1276 break; 1277 default: 1278 printf("adapter at unexpected slot %d\n" 1279 "unable to map to a channel\n", 1280 pa->pa_device); 1281 *channel = 'A'; 1282 } 1283 *flags |= AHC_LARGE_SEEPROM; 1284 return (0); 1285 } 1286