1 /* $NetBSD: isp_pci.c,v 1.61 2000/12/09 08:06:33 mjacob Exp $ */ 2 /* 3 * This driver, which is contained in NetBSD in the files: 4 * 5 * sys/dev/ic/isp.c 6 * sys/dev/ic/ic/isp.c 7 * sys/dev/ic/ic/isp_inline.h 8 * sys/dev/ic/ic/isp_netbsd.c 9 * sys/dev/ic/ic/isp_netbsd.h 10 * sys/dev/ic/ic/isp_target.c 11 * sys/dev/ic/ic/isp_target.h 12 * sys/dev/ic/ic/isp_tpublic.h 13 * sys/dev/ic/ic/ispmbox.h 14 * sys/dev/ic/ic/ispreg.h 15 * sys/dev/ic/ic/ispvar.h 16 * sys/microcode/isp/asm_sbus.h 17 * sys/microcode/isp/asm_1040.h 18 * sys/microcode/isp/asm_1080.h 19 * sys/microcode/isp/asm_12160.h 20 * sys/microcode/isp/asm_2100.h 21 * sys/microcode/isp/asm_2200.h 22 * sys/pci/isp_pci.c 23 * sys/sbus/isp_sbus.c 24 * 25 * Is being actively maintained by Matthew Jacob (mjacob@netbsd.org). 26 * This driver also is shared source with FreeBSD, OpenBSD, Linux, Solaris, 27 * Linux versions. This tends to be an interesting maintenance problem. 28 * 29 * Please coordinate with Matthew Jacob on changes you wish to make here. 30 */ 31 /* 32 * PCI specific probe and attach routines for Qlogic ISP SCSI adapters. 33 * Matthew Jacob (mjacob@nas.nasa.gov) 34 */ 35 /* 36 * Copyright (C) 1997, 1998, 1999 National Aeronautics & Space Administration 37 * All rights reserved. 38 * 39 * Redistribution and use in source and binary forms, with or without 40 * modification, are permitted provided that the following conditions 41 * are met: 42 * 1. Redistributions of source code must retain the above copyright 43 * notice, this list of conditions and the following disclaimer. 44 * 2. Redistributions in binary form must reproduce the above copyright 45 * notice, this list of conditions and the following disclaimer in the 46 * documentation and/or other materials provided with the distribution. 47 * 3. The name of the author may not be used to endorse or promote products 48 * derived from this software without specific prior written permission 49 * 50 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 51 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 52 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 53 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 54 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 55 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 56 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 57 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 58 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 59 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 60 */ 61 62 #include <dev/ic/isp_netbsd.h> 63 #include <dev/pci/pcireg.h> 64 #include <dev/pci/pcivar.h> 65 #include <dev/pci/pcidevs.h> 66 #include <uvm/uvm_extern.h> 67 68 static u_int16_t isp_pci_rd_reg __P((struct ispsoftc *, int)); 69 static void isp_pci_wr_reg __P((struct ispsoftc *, int, u_int16_t)); 70 #if !(defined(ISP_DISABLE_1080_SUPPORT) && defined(ISP_DISABLE_12160_SUPPORT)) 71 static u_int16_t isp_pci_rd_reg_1080 __P((struct ispsoftc *, int)); 72 static void isp_pci_wr_reg_1080 __P((struct ispsoftc *, int, u_int16_t)); 73 #endif 74 static int isp_pci_mbxdma __P((struct ispsoftc *)); 75 static int isp_pci_dmasetup __P((struct ispsoftc *, struct scsipi_xfer *, 76 ispreq_t *, u_int16_t *, u_int16_t)); 77 static void isp_pci_dmateardown __P((struct ispsoftc *, struct scsipi_xfer *, 78 u_int32_t)); 79 static void isp_pci_reset1 __P((struct ispsoftc *)); 80 static void isp_pci_dumpregs __P((struct ispsoftc *, const char *)); 81 static int isp_pci_intr __P((void *)); 82 83 #if defined(ISP_DISABLE_1020_SUPPORT) 84 #define ISP_1040_RISC_CODE NULL 85 #else 86 #define ISP_1040_RISC_CODE isp_1040_risc_code 87 #include <dev/microcode/isp/asm_1040.h> 88 #endif 89 90 #if defined(ISP_DISABLE_1080_SUPPORT) 91 #define ISP_1080_RISC_CODE NULL 92 #else 93 #define ISP_1080_RISC_CODE isp_1080_risc_code 94 #include <dev/microcode/isp/asm_1080.h> 95 #endif 96 97 #if defined(ISP_DISABLE_12160_SUPPORT) 98 #define ISP_12160_RISC_CODE NULL 99 #else 100 #define ISP_12160_RISC_CODE isp_12160_risc_code 101 #include <dev/microcode/isp/asm_12160.h> 102 #endif 103 104 #if defined(ISP_DISABLE_2100_SUPPORT) 105 #define ISP_2100_RISC_CODE NULL 106 #else 107 #define ISP_2100_RISC_CODE isp_2100_risc_code 108 #include <dev/microcode/isp/asm_2100.h> 109 #endif 110 111 #if defined(ISP_DISABLE_2200_SUPPORT) 112 #define ISP_2200_RISC_CODE NULL 113 #else 114 #define ISP_2200_RISC_CODE isp_2200_risc_code 115 #include <dev/microcode/isp/asm_2200.h> 116 #endif 117 118 #ifndef ISP_DISABLE_1020_SUPPORT 119 static struct ispmdvec mdvec = { 120 isp_pci_rd_reg, 121 isp_pci_wr_reg, 122 isp_pci_mbxdma, 123 isp_pci_dmasetup, 124 isp_pci_dmateardown, 125 NULL, 126 isp_pci_reset1, 127 isp_pci_dumpregs, 128 ISP_1040_RISC_CODE, 129 BIU_BURST_ENABLE|BIU_PCI_CONF1_FIFO_64 130 }; 131 #endif 132 133 #ifndef ISP_DISABLE_1080_SUPPORT 134 static struct ispmdvec mdvec_1080 = { 135 isp_pci_rd_reg_1080, 136 isp_pci_wr_reg_1080, 137 isp_pci_mbxdma, 138 isp_pci_dmasetup, 139 isp_pci_dmateardown, 140 NULL, 141 isp_pci_reset1, 142 isp_pci_dumpregs, 143 ISP_1080_RISC_CODE, 144 BIU_BURST_ENABLE|BIU_PCI_CONF1_FIFO_64 145 }; 146 #endif 147 148 #ifndef ISP_DISABLE_12160_SUPPORT 149 static struct ispmdvec mdvec_12160 = { 150 isp_pci_rd_reg_1080, 151 isp_pci_wr_reg_1080, 152 isp_pci_mbxdma, 153 isp_pci_dmasetup, 154 isp_pci_dmateardown, 155 NULL, 156 isp_pci_reset1, 157 isp_pci_dumpregs, 158 ISP_12160_RISC_CODE, 159 BIU_BURST_ENABLE|BIU_PCI_CONF1_FIFO_64 160 }; 161 #endif 162 163 #ifndef ISP_DISABLE_2100_SUPPORT 164 static struct ispmdvec mdvec_2100 = { 165 isp_pci_rd_reg, 166 isp_pci_wr_reg, 167 isp_pci_mbxdma, 168 isp_pci_dmasetup, 169 isp_pci_dmateardown, 170 NULL, 171 isp_pci_reset1, 172 isp_pci_dumpregs, 173 ISP_2100_RISC_CODE 174 }; 175 #endif 176 177 #ifndef ISP_DISABLE_2200_SUPPORT 178 static struct ispmdvec mdvec_2200 = { 179 isp_pci_rd_reg, 180 isp_pci_wr_reg, 181 isp_pci_mbxdma, 182 isp_pci_dmasetup, 183 isp_pci_dmateardown, 184 NULL, 185 isp_pci_reset1, 186 isp_pci_dumpregs, 187 ISP_2200_RISC_CODE 188 }; 189 #endif 190 191 #ifndef PCI_VENDOR_QLOGIC 192 #define PCI_VENDOR_QLOGIC 0x1077 193 #endif 194 195 #ifndef PCI_PRODUCT_QLOGIC_ISP1020 196 #define PCI_PRODUCT_QLOGIC_ISP1020 0x1020 197 #endif 198 199 #ifndef PCI_PRODUCT_QLOGIC_ISP1080 200 #define PCI_PRODUCT_QLOGIC_ISP1080 0x1080 201 #endif 202 203 #ifndef PCI_PRODUCT_QLOGIC_ISP1240 204 #define PCI_PRODUCT_QLOGIC_ISP1240 0x1240 205 #endif 206 207 #ifndef PCI_PRODUCT_QLOGIC_ISP1280 208 #define PCI_PRODUCT_QLOGIC_ISP1280 0x1280 209 #endif 210 211 #ifndef PCI_PRODUCT_QLOGIC_ISP12160 212 #define PCI_PRODUCT_QLOGIC_ISP12160 0x1216 213 #endif 214 215 #ifndef PCI_PRODUCT_QLOGIC_ISP2100 216 #define PCI_PRODUCT_QLOGIC_ISP2100 0x2100 217 #endif 218 219 #ifndef PCI_PRODUCT_QLOGIC_ISP2200 220 #define PCI_PRODUCT_QLOGIC_ISP2200 0x2200 221 #endif 222 223 #define PCI_QLOGIC_ISP ((PCI_PRODUCT_QLOGIC_ISP1020 << 16) | PCI_VENDOR_QLOGIC) 224 225 #define PCI_QLOGIC_ISP1080 \ 226 ((PCI_PRODUCT_QLOGIC_ISP1080 << 16) | PCI_VENDOR_QLOGIC) 227 228 #define PCI_QLOGIC_ISP1240 \ 229 ((PCI_PRODUCT_QLOGIC_ISP1240 << 16) | PCI_VENDOR_QLOGIC) 230 231 #define PCI_QLOGIC_ISP1280 \ 232 ((PCI_PRODUCT_QLOGIC_ISP1280 << 16) | PCI_VENDOR_QLOGIC) 233 234 #define PCI_QLOGIC_ISP12160 \ 235 ((PCI_PRODUCT_QLOGIC_ISP12160 << 16) | PCI_VENDOR_QLOGIC) 236 237 #define PCI_QLOGIC_ISP2100 \ 238 ((PCI_PRODUCT_QLOGIC_ISP2100 << 16) | PCI_VENDOR_QLOGIC) 239 240 #define PCI_QLOGIC_ISP2200 \ 241 ((PCI_PRODUCT_QLOGIC_ISP2200 << 16) | PCI_VENDOR_QLOGIC) 242 243 #define IO_MAP_REG 0x10 244 #define MEM_MAP_REG 0x14 245 #define PCIR_ROMADDR 0x30 246 247 #define PCI_DFLT_LTNCY 0x40 248 #define PCI_DFLT_LNSZ 0x10 249 250 251 static int isp_pci_probe __P((struct device *, struct cfdata *, void *)); 252 static void isp_pci_attach __P((struct device *, struct device *, void *)); 253 254 struct isp_pcisoftc { 255 struct ispsoftc pci_isp; 256 pci_chipset_tag_t pci_pc; 257 pcitag_t pci_tag; 258 bus_space_tag_t pci_st; 259 bus_space_handle_t pci_sh; 260 bus_dma_tag_t pci_dmat; 261 bus_dmamap_t pci_scratch_dmap; /* for fcp only */ 262 bus_dmamap_t pci_rquest_dmap; 263 bus_dmamap_t pci_result_dmap; 264 bus_dmamap_t *pci_xfer_dmap; 265 void * pci_ih; 266 int16_t pci_poff[_NREG_BLKS]; 267 }; 268 269 struct cfattach isp_pci_ca = { 270 sizeof (struct isp_pcisoftc), isp_pci_probe, isp_pci_attach 271 }; 272 273 #ifdef DEBUG 274 static char *vstring = 275 "Qlogic ISP Driver, NetBSD (pci) Platform Version %d.%d Core Version %d.%d"; 276 #endif 277 278 static int 279 isp_pci_probe(parent, match, aux) 280 struct device *parent; 281 struct cfdata *match; 282 void *aux; 283 { 284 struct pci_attach_args *pa = aux; 285 switch (pa->pa_id) { 286 #ifndef ISP_DISABLE_1020_SUPPORT 287 case PCI_QLOGIC_ISP: 288 return (1); 289 #endif 290 #ifndef ISP_DISABLE_1080_SUPPORT 291 case PCI_QLOGIC_ISP1080: 292 case PCI_QLOGIC_ISP1240: 293 case PCI_QLOGIC_ISP1280: 294 return (1); 295 #endif 296 #ifndef ISP_DISABLE_12160_SUPPORT 297 case PCI_QLOGIC_ISP12160: 298 return (1); 299 #endif 300 #ifndef ISP_DISABLE_2100_SUPPORT 301 case PCI_QLOGIC_ISP2100: 302 return (1); 303 #endif 304 #ifndef ISP_DISABLE_2200_SUPPORT 305 case PCI_QLOGIC_ISP2200: 306 return (1); 307 #endif 308 default: 309 return (0); 310 } 311 } 312 313 314 static void 315 isp_pci_attach(parent, self, aux) 316 struct device *parent, *self; 317 void *aux; 318 { 319 #ifdef DEBUG 320 static char oneshot = 1; 321 #endif 322 static char *nomem = "%s: no mem for sdparam table\n"; 323 u_int32_t data, rev, linesz = PCI_DFLT_LNSZ; 324 struct pci_attach_args *pa = aux; 325 struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) self; 326 struct ispsoftc *isp = &pcs->pci_isp; 327 bus_space_tag_t st, iot, memt; 328 bus_space_handle_t sh, ioh, memh; 329 pci_intr_handle_t ih; 330 const char *intrstr; 331 int ioh_valid, memh_valid; 332 333 ioh_valid = (pci_mapreg_map(pa, IO_MAP_REG, 334 PCI_MAPREG_TYPE_IO, 0, 335 &iot, &ioh, NULL, NULL) == 0); 336 memh_valid = (pci_mapreg_map(pa, MEM_MAP_REG, 337 PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_32BIT, 0, 338 &memt, &memh, NULL, NULL) == 0); 339 340 if (memh_valid) { 341 st = memt; 342 sh = memh; 343 } else if (ioh_valid) { 344 st = iot; 345 sh = ioh; 346 } else { 347 printf(": unable to map device registers\n"); 348 return; 349 } 350 printf("\n"); 351 352 pcs->pci_st = st; 353 pcs->pci_sh = sh; 354 pcs->pci_dmat = pa->pa_dmat; 355 pcs->pci_pc = pa->pa_pc; 356 pcs->pci_tag = pa->pa_tag; 357 pcs->pci_poff[BIU_BLOCK >> _BLK_REG_SHFT] = BIU_REGS_OFF; 358 pcs->pci_poff[MBOX_BLOCK >> _BLK_REG_SHFT] = PCI_MBOX_REGS_OFF; 359 pcs->pci_poff[SXP_BLOCK >> _BLK_REG_SHFT] = PCI_SXP_REGS_OFF; 360 pcs->pci_poff[RISC_BLOCK >> _BLK_REG_SHFT] = PCI_RISC_REGS_OFF; 361 pcs->pci_poff[DMA_BLOCK >> _BLK_REG_SHFT] = DMA_REGS_OFF; 362 rev = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_CLASS_REG) & 0xff; 363 364 #ifndef ISP_DISABLE_1020_SUPPORT 365 if (pa->pa_id == PCI_QLOGIC_ISP) { 366 isp->isp_mdvec = &mdvec; 367 isp->isp_type = ISP_HA_SCSI_UNKNOWN; 368 isp->isp_param = malloc(sizeof (sdparam), M_DEVBUF, M_NOWAIT); 369 if (isp->isp_param == NULL) { 370 printf(nomem, isp->isp_name); 371 return; 372 } 373 bzero(isp->isp_param, sizeof (sdparam)); 374 } 375 #endif 376 #ifndef ISP_DISABLE_1080_SUPPORT 377 if (pa->pa_id == PCI_QLOGIC_ISP1080) { 378 isp->isp_mdvec = &mdvec_1080; 379 isp->isp_type = ISP_HA_SCSI_1080; 380 isp->isp_param = malloc(sizeof (sdparam), M_DEVBUF, M_NOWAIT); 381 if (isp->isp_param == NULL) { 382 printf(nomem, isp->isp_name); 383 return; 384 } 385 bzero(isp->isp_param, sizeof (sdparam)); 386 pcs->pci_poff[DMA_BLOCK >> _BLK_REG_SHFT] = 387 ISP1080_DMA_REGS_OFF; 388 } 389 if (pa->pa_id == PCI_QLOGIC_ISP1240) { 390 isp->isp_mdvec = &mdvec_1080; 391 isp->isp_type = ISP_HA_SCSI_1240; 392 isp->isp_param = 393 malloc(2 * sizeof (sdparam), M_DEVBUF, M_NOWAIT); 394 if (isp->isp_param == NULL) { 395 printf(nomem, isp->isp_name); 396 return; 397 } 398 bzero(isp->isp_param, 2 * sizeof (sdparam)); 399 pcs->pci_poff[DMA_BLOCK >> _BLK_REG_SHFT] = 400 ISP1080_DMA_REGS_OFF; 401 } 402 if (pa->pa_id == PCI_QLOGIC_ISP1280) { 403 isp->isp_mdvec = &mdvec_1080; 404 isp->isp_type = ISP_HA_SCSI_1280; 405 isp->isp_param = 406 malloc(2 * sizeof (sdparam), M_DEVBUF, M_NOWAIT); 407 if (isp->isp_param == NULL) { 408 printf(nomem, isp->isp_name); 409 return; 410 } 411 bzero(isp->isp_param, 2 * sizeof (sdparam)); 412 pcs->pci_poff[DMA_BLOCK >> _BLK_REG_SHFT] = 413 ISP1080_DMA_REGS_OFF; 414 } 415 #endif 416 #ifndef ISP_DISABLE_12160_SUPPORT 417 if (pa->pa_id == PCI_QLOGIC_ISP12160) { 418 isp->isp_mdvec = &mdvec_12160; 419 isp->isp_type = ISP_HA_SCSI_12160; 420 isp->isp_param = 421 malloc(2 * sizeof (sdparam), M_DEVBUF, M_NOWAIT); 422 if (isp->isp_param == NULL) { 423 printf(nomem, isp->isp_name); 424 return; 425 } 426 bzero(isp->isp_param, 2 * sizeof (sdparam)); 427 pcs->pci_poff[DMA_BLOCK >> _BLK_REG_SHFT] = 428 ISP1080_DMA_REGS_OFF; 429 } 430 #endif 431 #ifndef ISP_DISABLE_2100_SUPPORT 432 if (pa->pa_id == PCI_QLOGIC_ISP2100) { 433 isp->isp_mdvec = &mdvec_2100; 434 isp->isp_type = ISP_HA_FC_2100; 435 isp->isp_param = malloc(sizeof (fcparam), M_DEVBUF, M_NOWAIT); 436 if (isp->isp_param == NULL) { 437 printf(nomem, isp->isp_name); 438 return; 439 } 440 bzero(isp->isp_param, sizeof (fcparam)); 441 pcs->pci_poff[MBOX_BLOCK >> _BLK_REG_SHFT] = 442 PCI_MBOX_REGS2100_OFF; 443 if (rev < 3) { 444 /* 445 * XXX: Need to get the actual revision 446 * XXX: number of the 2100 FB. At any rate, 447 * XXX: lower cache line size for early revision 448 * XXX; boards. 449 */ 450 linesz = 1; 451 } 452 } 453 #endif 454 #ifndef ISP_DISABLE_2200_SUPPORT 455 if (pa->pa_id == PCI_QLOGIC_ISP2200) { 456 isp->isp_mdvec = &mdvec_2200; 457 isp->isp_type = ISP_HA_FC_2200; 458 isp->isp_param = malloc(sizeof (fcparam), M_DEVBUF, M_NOWAIT); 459 if (isp->isp_param == NULL) { 460 printf(nomem, isp->isp_name); 461 return; 462 } 463 bzero(isp->isp_param, sizeof (fcparam)); 464 pcs->pci_poff[MBOX_BLOCK >> _BLK_REG_SHFT] = 465 PCI_MBOX_REGS2100_OFF; 466 data = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_CLASS_REG); 467 } 468 #endif 469 /* 470 * Set up logging levels. 471 */ 472 #ifdef ISP_LOGDEFAULT 473 isp->isp_dblev = ISP_LOGDEFAULT; 474 #else 475 isp->isp_dblev = ISP_LOGCONFIG|ISP_LOGWARN|ISP_LOGERR; 476 #ifdef SCSIDEBUG 477 isp->isp_dblev |= ISP_LOGDEBUG1|ISP_LOGDEBUG2; 478 #endif 479 #ifdef DEBUG 480 isp->isp_dblev |= ISP_LOGDEBUG0|ISP_LOGINFO; 481 #endif 482 #endif 483 484 #ifdef DEBUG 485 if (oneshot) { 486 oneshot = 0; 487 isp_prt(isp, ISP_LOGCONFIG, vstring, 488 ISP_PLATFORM_VERSION_MAJOR, ISP_PLATFORM_VERSION_MINOR, 489 ISP_CORE_VERSION_MAJOR, ISP_CORE_VERSION_MINOR); 490 } 491 #endif 492 493 isp->isp_revision = rev; 494 495 /* 496 * Make sure that command register set sanely. 497 */ 498 data = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG); 499 data |= PCI_COMMAND_MASTER_ENABLE | PCI_COMMAND_INVALIDATE_ENABLE; 500 501 /* 502 * Not so sure about these- but I think it's important that they get 503 * enabled...... 504 */ 505 data |= PCI_COMMAND_PARITY_ENABLE | PCI_COMMAND_SERR_ENABLE; 506 pci_conf_write(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG, data); 507 508 /* 509 * Make sure that the latency timer, cache line size, 510 * and ROM is disabled. 511 */ 512 data = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_BHLC_REG); 513 data &= ~(PCI_LATTIMER_MASK << PCI_LATTIMER_SHIFT); 514 data &= ~(PCI_CACHELINE_MASK << PCI_CACHELINE_SHIFT); 515 data |= (PCI_DFLT_LTNCY << PCI_LATTIMER_SHIFT); 516 data |= (linesz << PCI_CACHELINE_SHIFT); 517 pci_conf_write(pa->pa_pc, pa->pa_tag, PCI_BHLC_REG, data); 518 519 data = pci_conf_read(pa->pa_pc, pa->pa_tag, PCIR_ROMADDR); 520 data &= ~1; 521 pci_conf_write(pa->pa_pc, pa->pa_tag, PCIR_ROMADDR, data); 522 523 if (pci_intr_map(pa->pa_pc, pa->pa_intrtag, pa->pa_intrpin, 524 pa->pa_intrline, &ih)) { 525 printf("%s: couldn't map interrupt\n", isp->isp_name); 526 free(isp->isp_param, M_DEVBUF); 527 return; 528 } 529 intrstr = pci_intr_string(pa->pa_pc, ih); 530 if (intrstr == NULL) 531 intrstr = "<I dunno>"; 532 pcs->pci_ih = pci_intr_establish(pa->pa_pc, ih, IPL_BIO, 533 isp_pci_intr, isp); 534 if (pcs->pci_ih == NULL) { 535 printf("%s: couldn't establish interrupt at %s\n", 536 isp->isp_name, intrstr); 537 free(isp->isp_param, M_DEVBUF); 538 return; 539 } 540 541 printf("%s: interrupting at %s\n", isp->isp_name, intrstr); 542 543 if (IS_FC(isp)) { 544 DEFAULT_NODEWWN(isp) = 0x400000007F000002; 545 DEFAULT_PORTWWN(isp) = 0x400000007F000002; 546 } 547 548 isp->isp_confopts = self->dv_cfdata->cf_flags; 549 ISP_LOCK(isp); 550 isp->isp_osinfo.no_mbox_ints = 1; 551 isp_reset(isp); 552 if (isp->isp_state != ISP_RESETSTATE) { 553 ISP_UNLOCK(isp); 554 free(isp->isp_param, M_DEVBUF); 555 return; 556 } 557 ENABLE_INTS(isp); 558 isp_init(isp); 559 if (isp->isp_state != ISP_INITSTATE) { 560 isp_uninit(isp); 561 ISP_UNLOCK(isp); 562 free(isp->isp_param, M_DEVBUF); 563 return; 564 } 565 /* 566 * Do platform attach. 567 */ 568 ISP_UNLOCK(isp); 569 isp_attach(isp); 570 if (isp->isp_state != ISP_RUNSTATE) { 571 ISP_LOCK(isp); 572 isp_uninit(isp); 573 free(isp->isp_param, M_DEVBUF); 574 ISP_UNLOCK(isp); 575 } 576 } 577 578 static u_int16_t 579 isp_pci_rd_reg(isp, regoff) 580 struct ispsoftc *isp; 581 int regoff; 582 { 583 u_int16_t rv; 584 struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp; 585 int offset, oldconf = 0; 586 587 if ((regoff & _BLK_REG_MASK) == SXP_BLOCK) { 588 /* 589 * We will assume that someone has paused the RISC processor. 590 */ 591 oldconf = isp_pci_rd_reg(isp, BIU_CONF1); 592 isp_pci_wr_reg(isp, BIU_CONF1, oldconf | BIU_PCI_CONF1_SXP); 593 delay(250); 594 } 595 offset = pcs->pci_poff[(regoff & _BLK_REG_MASK) >> _BLK_REG_SHFT]; 596 offset += (regoff & 0xff); 597 rv = bus_space_read_2(pcs->pci_st, pcs->pci_sh, offset); 598 if ((regoff & _BLK_REG_MASK) == SXP_BLOCK) { 599 isp_pci_wr_reg(isp, BIU_CONF1, oldconf); 600 delay(250); 601 } 602 return (rv); 603 } 604 605 static void 606 isp_pci_wr_reg(isp, regoff, val) 607 struct ispsoftc *isp; 608 int regoff; 609 u_int16_t val; 610 { 611 struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp; 612 int offset, oldconf = 0; 613 614 if ((regoff & _BLK_REG_MASK) == SXP_BLOCK) { 615 /* 616 * We will assume that someone has paused the RISC processor. 617 */ 618 oldconf = isp_pci_rd_reg(isp, BIU_CONF1); 619 isp_pci_wr_reg(isp, BIU_CONF1, oldconf | BIU_PCI_CONF1_SXP); 620 delay(250); 621 } 622 offset = pcs->pci_poff[(regoff & _BLK_REG_MASK) >> _BLK_REG_SHFT]; 623 offset += (regoff & 0xff); 624 bus_space_write_2(pcs->pci_st, pcs->pci_sh, offset, val); 625 if ((regoff & _BLK_REG_MASK) == SXP_BLOCK) { 626 isp_pci_wr_reg(isp, BIU_CONF1, oldconf); 627 delay(250); 628 } 629 } 630 631 #if !(defined(ISP_DISABLE_1080_SUPPORT) && defined(ISP_DISABLE_12160_SUPPORT)) 632 static u_int16_t 633 isp_pci_rd_reg_1080(isp, regoff) 634 struct ispsoftc *isp; 635 int regoff; 636 { 637 u_int16_t rv, oc = 0; 638 struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp; 639 int offset; 640 641 if ((regoff & _BLK_REG_MASK) == SXP_BLOCK) { 642 u_int16_t tc; 643 /* 644 * We will assume that someone has paused the RISC processor. 645 */ 646 oc = isp_pci_rd_reg(isp, BIU_CONF1); 647 tc = oc & ~BIU_PCI1080_CONF1_DMA; 648 if (IS_1280(isp)) { 649 if (regoff & SXP_BANK1_SELECT) 650 tc |= BIU_PCI1080_CONF1_SXP0; 651 else 652 tc |= BIU_PCI1080_CONF1_SXP1; 653 } else { 654 tc |= BIU_PCI1080_CONF1_SXP0; 655 } 656 isp_pci_wr_reg(isp, BIU_CONF1, tc); 657 delay(250); 658 } else if ((regoff & _BLK_REG_MASK) == DMA_BLOCK) { 659 oc = isp_pci_rd_reg(isp, BIU_CONF1); 660 isp_pci_wr_reg(isp, BIU_CONF1, oc | BIU_PCI1080_CONF1_DMA); 661 delay(250); 662 } 663 offset = pcs->pci_poff[(regoff & _BLK_REG_MASK) >> _BLK_REG_SHFT]; 664 offset += (regoff & 0xff); 665 rv = bus_space_read_2(pcs->pci_st, pcs->pci_sh, offset); 666 /* 667 * Okay, because BIU_CONF1 is always nonzero 668 */ 669 if (oc) { 670 isp_pci_wr_reg(isp, BIU_CONF1, oc); 671 delay(250); 672 } 673 return (rv); 674 } 675 676 static void 677 isp_pci_wr_reg_1080(isp, regoff, val) 678 struct ispsoftc *isp; 679 int regoff; 680 u_int16_t val; 681 { 682 u_int16_t oc = 0; 683 struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp; 684 int offset; 685 686 if ((regoff & _BLK_REG_MASK) == SXP_BLOCK) { 687 u_int16_t tc; 688 /* 689 * We will assume that someone has paused the RISC processor. 690 */ 691 oc = isp_pci_rd_reg(isp, BIU_CONF1); 692 tc = oc & ~BIU_PCI1080_CONF1_DMA; 693 if (IS_1280(isp)) { 694 if (regoff & SXP_BANK1_SELECT) 695 tc |= BIU_PCI1080_CONF1_SXP0; 696 else 697 tc |= BIU_PCI1080_CONF1_SXP1; 698 } else { 699 tc |= BIU_PCI1080_CONF1_SXP0; 700 } 701 isp_pci_wr_reg(isp, BIU_CONF1, tc); 702 delay(250); 703 } else if ((regoff & _BLK_REG_MASK) == DMA_BLOCK) { 704 oc = isp_pci_rd_reg(isp, BIU_CONF1); 705 isp_pci_wr_reg(isp, BIU_CONF1, oc | BIU_PCI1080_CONF1_DMA); 706 delay(250); 707 } 708 offset = pcs->pci_poff[(regoff & _BLK_REG_MASK) >> _BLK_REG_SHFT]; 709 offset += (regoff & 0xff); 710 bus_space_write_2(pcs->pci_st, pcs->pci_sh, offset, val); 711 /* 712 * Okay, because BIU_CONF1 is always nonzero 713 */ 714 if (oc) { 715 isp_pci_wr_reg(isp, BIU_CONF1, oc); 716 delay(250); 717 } 718 } 719 #endif 720 721 static int 722 isp_pci_mbxdma(isp) 723 struct ispsoftc *isp; 724 { 725 struct isp_pcisoftc *pcs = (struct isp_pcisoftc *)isp; 726 bus_dma_tag_t dmat = pcs->pci_dmat; 727 bus_dma_segment_t sg; 728 bus_size_t len; 729 fcparam *fcp; 730 int rs, i; 731 732 if (isp->isp_rquest_dma) /* been here before? */ 733 return (0); 734 735 len = isp->isp_maxcmds * sizeof (XS_T); 736 isp->isp_xflist = (XS_T **) malloc(len, M_DEVBUF, M_WAITOK); 737 if (isp->isp_xflist == NULL) { 738 isp_prt(isp, ISP_LOGERR, "cannot malloc xflist array"); 739 return (1); 740 } 741 bzero(isp->isp_xflist, len); 742 len = isp->isp_maxcmds * sizeof (bus_dmamap_t); 743 pcs->pci_xfer_dmap = (bus_dmamap_t *) malloc(len, M_DEVBUF, M_WAITOK); 744 if (pcs->pci_xfer_dmap == NULL) { 745 free(isp->isp_xflist, M_DEVBUF); 746 isp->isp_xflist = NULL; 747 isp_prt(isp, ISP_LOGERR, "cannot malloc dma map array"); 748 return (1); 749 } 750 for (i = 0; i < isp->isp_maxcmds; i++) { 751 if (bus_dmamap_create(dmat, MAXPHYS, (MAXPHYS / PAGE_SIZE) + 1, 752 MAXPHYS, 0, BUS_DMA_NOWAIT, &pcs->pci_xfer_dmap[i])) { 753 isp_prt(isp, ISP_LOGERR, "cannot create dma maps"); 754 break; 755 } 756 } 757 if (i < isp->isp_maxcmds) { 758 while (--i >= 0) { 759 bus_dmamap_destroy(dmat, pcs->pci_xfer_dmap[i]); 760 } 761 free(isp->isp_xflist, M_DEVBUF); 762 free(pcs->pci_xfer_dmap, M_DEVBUF); 763 isp->isp_xflist = NULL; 764 pcs->pci_xfer_dmap = NULL; 765 return (1); 766 } 767 768 /* 769 * Allocate and map the request queue. 770 */ 771 len = ISP_QUEUE_SIZE(RQUEST_QUEUE_LEN(isp)); 772 if (bus_dmamem_alloc(dmat, len, PAGE_SIZE, 0, &sg, 1, &rs, 773 BUS_DMA_NOWAIT) || 774 bus_dmamem_map(pcs->pci_dmat, &sg, rs, len, 775 (caddr_t *)&isp->isp_rquest, BUS_DMA_NOWAIT|BUS_DMA_COHERENT)) { 776 goto dmafail; 777 } 778 779 if (bus_dmamap_create(dmat, len, 1, len, 0, BUS_DMA_NOWAIT, 780 &pcs->pci_rquest_dmap) || bus_dmamap_load(dmat, 781 pcs->pci_rquest_dmap, (caddr_t)isp->isp_rquest, len, NULL, 782 BUS_DMA_NOWAIT)) { 783 goto dmafail; 784 } 785 786 isp->isp_rquest_dma = pcs->pci_rquest_dmap->dm_segs[0].ds_addr; 787 788 /* 789 * Allocate and map the result queue. 790 */ 791 len = ISP_QUEUE_SIZE(RESULT_QUEUE_LEN(isp)); 792 if (bus_dmamem_alloc(dmat, len, PAGE_SIZE, 0, &sg, 1, &rs, 793 BUS_DMA_NOWAIT) || 794 bus_dmamem_map(dmat, &sg, rs, len, (caddr_t *)&isp->isp_result, 795 BUS_DMA_NOWAIT|BUS_DMA_COHERENT)) { 796 goto dmafail; 797 } 798 if (bus_dmamap_create(dmat, len, 1, len, 0, BUS_DMA_NOWAIT, 799 &pcs->pci_result_dmap) || bus_dmamap_load(pcs->pci_dmat, 800 pcs->pci_result_dmap, (caddr_t)isp->isp_result, len, NULL, 801 BUS_DMA_NOWAIT)) { 802 goto dmafail; 803 } 804 isp->isp_result_dma = pcs->pci_result_dmap->dm_segs[0].ds_addr; 805 806 if (IS_SCSI(isp)) { 807 return (0); 808 } 809 810 fcp = isp->isp_param; 811 len = ISP2100_SCRLEN; 812 if (bus_dmamem_alloc(dmat, len, PAGE_SIZE, 0, &sg, 1, &rs, 813 BUS_DMA_NOWAIT) || 814 bus_dmamem_map(dmat, &sg, rs, len, (caddr_t *)&fcp->isp_scratch, 815 BUS_DMA_NOWAIT|BUS_DMA_COHERENT)) { 816 goto dmafail; 817 } 818 if (bus_dmamap_create(dmat, len, 1, len, 0, BUS_DMA_NOWAIT, 819 &pcs->pci_scratch_dmap) || bus_dmamap_load(dmat, 820 pcs->pci_scratch_dmap, (caddr_t)fcp->isp_scratch, len, NULL, 821 BUS_DMA_NOWAIT)) { 822 goto dmafail; 823 } 824 fcp->isp_scdma = pcs->pci_scratch_dmap->dm_segs[0].ds_addr; 825 return (0); 826 dmafail: 827 isp_prt(isp, ISP_LOGERR, "mailbox dma setup failure"); 828 for (i = 0; i < isp->isp_maxcmds; i++) { 829 bus_dmamap_destroy(dmat, pcs->pci_xfer_dmap[i]); 830 } 831 free(isp->isp_xflist, M_DEVBUF); 832 free(pcs->pci_xfer_dmap, M_DEVBUF); 833 isp->isp_xflist = NULL; 834 pcs->pci_xfer_dmap = NULL; 835 return (1); 836 } 837 838 static int 839 isp_pci_dmasetup(isp, xs, rq, iptrp, optr) 840 struct ispsoftc *isp; 841 struct scsipi_xfer *xs; 842 ispreq_t *rq; 843 u_int16_t *iptrp; 844 u_int16_t optr; 845 { 846 struct isp_pcisoftc *pcs = (struct isp_pcisoftc *)isp; 847 bus_dmamap_t dmap; 848 ispcontreq_t *crq; 849 int segcnt, seg, error, ovseg, seglim, drq; 850 851 dmap = pcs->pci_xfer_dmap[isp_handle_index(rq->req_handle)]; 852 853 if (xs->datalen == 0) { 854 rq->req_seg_count = 1; 855 goto mbxsync; 856 } 857 if (xs->xs_control & XS_CTL_DATA_IN) { 858 drq = REQFLAG_DATA_IN; 859 } else { 860 drq = REQFLAG_DATA_OUT; 861 } 862 863 if (IS_FC(isp)) { 864 seglim = ISP_RQDSEG_T2; 865 ((ispreqt2_t *)rq)->req_totalcnt = xs->datalen; 866 ((ispreqt2_t *)rq)->req_flags |= drq; 867 } else { 868 rq->req_flags |= drq; 869 if (XS_CDBLEN(xs) > 12) { 870 seglim = 0; 871 } else { 872 seglim = ISP_RQDSEG; 873 } 874 } 875 error = bus_dmamap_load(pcs->pci_dmat, dmap, xs->data, xs->datalen, 876 NULL, xs->xs_control & XS_CTL_NOSLEEP ? 877 BUS_DMA_NOWAIT : BUS_DMA_WAITOK); 878 if (error) { 879 XS_SETERR(xs, HBA_BOTCH); 880 return (CMD_COMPLETE); 881 } 882 883 segcnt = dmap->dm_nsegs; 884 885 isp_prt(isp, ISP_LOGDEBUG2, "%d byte %s %p in %d segs", 886 xs->datalen, (xs->xs_control & XS_CTL_DATA_IN)? "read to" : 887 "write from", xs->data, segcnt); 888 889 for (seg = 0, rq->req_seg_count = 0; 890 seglim && seg < segcnt && rq->req_seg_count < seglim; 891 seg++, rq->req_seg_count++) { 892 if (IS_FC(isp)) { 893 ispreqt2_t *rq2 = (ispreqt2_t *)rq; 894 #if _BYTE_ORDER == _BIG_ENDIAN 895 rq2->req_dataseg[rq2->req_seg_count].ds_count = 896 bswap32(dmap->dm_segs[seg].ds_len); 897 rq2->req_dataseg[rq2->req_seg_count].ds_base = 898 bswap32(dmap->dm_segs[seg].ds_addr); 899 #else 900 rq2->req_dataseg[rq2->req_seg_count].ds_count = 901 dmap->dm_segs[seg].ds_len; 902 rq2->req_dataseg[rq2->req_seg_count].ds_base = 903 dmap->dm_segs[seg].ds_addr; 904 #endif 905 } else { 906 #if _BYTE_ORDER == _BIG_ENDIAN 907 rq->req_dataseg[rq->req_seg_count].ds_count = 908 bswap32(dmap->dm_segs[seg].ds_len); 909 rq->req_dataseg[rq->req_seg_count].ds_base = 910 bswap32(dmap->dm_segs[seg].ds_addr); 911 #else 912 rq->req_dataseg[rq->req_seg_count].ds_count = 913 dmap->dm_segs[seg].ds_len; 914 rq->req_dataseg[rq->req_seg_count].ds_base = 915 dmap->dm_segs[seg].ds_addr; 916 #endif 917 } 918 isp_prt(isp, ISP_LOGDEBUG2, "seg0.[%d]={0x%x,%d}", 919 rq->req_seg_count, dmap->dm_segs[seg].ds_addr, 920 dmap->dm_segs[seg].ds_len); 921 } 922 923 if (seg == segcnt) 924 goto dmasync; 925 926 do { 927 crq = (ispcontreq_t *) ISP_QUEUE_ENTRY(isp->isp_rquest, *iptrp); 928 *iptrp = ISP_NXT_QENTRY(*iptrp, RQUEST_QUEUE_LEN(isp)); 929 if (*iptrp == optr) { 930 isp_prt(isp, ISP_LOGDEBUG0, "Request Queue Overflow++"); 931 bus_dmamap_unload(pcs->pci_dmat, dmap); 932 XS_SETERR(xs, HBA_BOTCH); 933 return (CMD_EAGAIN); 934 } 935 rq->req_header.rqs_entry_count++; 936 bzero((void *)crq, sizeof (*crq)); 937 crq->req_header.rqs_entry_count = 1; 938 crq->req_header.rqs_entry_type = RQSTYPE_DATASEG; 939 940 for (ovseg = 0; seg < segcnt && ovseg < ISP_CDSEG; 941 rq->req_seg_count++, seg++, ovseg++) { 942 #if _BYTE_ORDER == _BIG_ENDIAN 943 crq->req_dataseg[ovseg].ds_count = 944 bswap32(dmap->dm_segs[seg].ds_len); 945 crq->req_dataseg[ovseg].ds_base = 946 bswap32(dmap->dm_segs[seg].ds_addr); 947 #else 948 crq->req_dataseg[ovseg].ds_count = 949 dmap->dm_segs[seg].ds_len; 950 crq->req_dataseg[ovseg].ds_base = 951 dmap->dm_segs[seg].ds_addr; 952 #endif 953 isp_prt(isp, ISP_LOGDEBUG2, "seg%d.[%d]={0x%x,%d}", 954 rq->req_header.rqs_entry_count - 1, 955 rq->req_seg_count, dmap->dm_segs[seg].ds_addr, 956 dmap->dm_segs[seg].ds_len); 957 } 958 } while (seg < segcnt); 959 960 961 dmasync: 962 bus_dmamap_sync(pcs->pci_dmat, dmap, 0, dmap->dm_mapsize, 963 (xs->xs_control & XS_CTL_DATA_IN) ? BUS_DMASYNC_PREREAD : 964 BUS_DMASYNC_PREWRITE); 965 966 mbxsync: 967 ISP_SWIZZLE_REQUEST(isp, rq); 968 bus_dmamap_sync(pcs->pci_dmat, pcs->pci_rquest_dmap, 0, 969 pcs->pci_rquest_dmap->dm_mapsize, BUS_DMASYNC_PREWRITE); 970 return (CMD_QUEUED); 971 } 972 973 static int 974 isp_pci_intr(arg) 975 void *arg; 976 { 977 int rv; 978 struct isp_pcisoftc *pcs = (struct isp_pcisoftc *)arg; 979 bus_dmamap_sync(pcs->pci_dmat, pcs->pci_result_dmap, 0, 980 pcs->pci_result_dmap->dm_mapsize, BUS_DMASYNC_POSTREAD); 981 pcs->pci_isp.isp_osinfo.onintstack = 1; 982 rv = isp_intr(arg); 983 pcs->pci_isp.isp_osinfo.onintstack = 0; 984 return (rv); 985 } 986 987 static void 988 isp_pci_dmateardown(isp, xs, handle) 989 struct ispsoftc *isp; 990 struct scsipi_xfer *xs; 991 u_int32_t handle; 992 { 993 struct isp_pcisoftc *pcs = (struct isp_pcisoftc *)isp; 994 bus_dmamap_t dmap = pcs->pci_xfer_dmap[isp_handle_index(handle)]; 995 bus_dmamap_sync(pcs->pci_dmat, dmap, 0, dmap->dm_mapsize, 996 xs->xs_control & XS_CTL_DATA_IN ? 997 BUS_DMASYNC_POSTREAD : BUS_DMASYNC_POSTWRITE); 998 bus_dmamap_unload(pcs->pci_dmat, dmap); 999 } 1000 1001 static void 1002 isp_pci_reset1(isp) 1003 struct ispsoftc *isp; 1004 { 1005 /* Make sure the BIOS is disabled */ 1006 isp_pci_wr_reg(isp, HCCR, PCI_HCCR_CMD_BIOS); 1007 } 1008 1009 static void 1010 isp_pci_dumpregs(isp, msg) 1011 struct ispsoftc *isp; 1012 const char *msg; 1013 { 1014 struct isp_pcisoftc *pcs = (struct isp_pcisoftc *)isp; 1015 if (msg) 1016 printf("%s: %s\n", isp->isp_name, msg); 1017 if (IS_SCSI(isp)) 1018 printf(" biu_conf1=%x", ISP_READ(isp, BIU_CONF1)); 1019 else 1020 printf(" biu_csr=%x", ISP_READ(isp, BIU2100_CSR)); 1021 printf(" biu_icr=%x biu_isr=%x biu_sema=%x ", ISP_READ(isp, BIU_ICR), 1022 ISP_READ(isp, BIU_ISR), ISP_READ(isp, BIU_SEMA)); 1023 printf("risc_hccr=%x\n", ISP_READ(isp, HCCR)); 1024 1025 1026 if (IS_SCSI(isp)) { 1027 ISP_WRITE(isp, HCCR, HCCR_CMD_PAUSE); 1028 printf(" cdma_conf=%x cdma_sts=%x cdma_fifostat=%x\n", 1029 ISP_READ(isp, CDMA_CONF), ISP_READ(isp, CDMA_STATUS), 1030 ISP_READ(isp, CDMA_FIFO_STS)); 1031 printf(" ddma_conf=%x ddma_sts=%x ddma_fifostat=%x\n", 1032 ISP_READ(isp, DDMA_CONF), ISP_READ(isp, DDMA_STATUS), 1033 ISP_READ(isp, DDMA_FIFO_STS)); 1034 printf(" sxp_int=%x sxp_gross=%x sxp(scsi_ctrl)=%x\n", 1035 ISP_READ(isp, SXP_INTERRUPT), 1036 ISP_READ(isp, SXP_GROSS_ERR), 1037 ISP_READ(isp, SXP_PINS_CTRL)); 1038 ISP_WRITE(isp, HCCR, HCCR_CMD_RELEASE); 1039 } 1040 printf(" mbox regs: %x %x %x %x %x\n", 1041 ISP_READ(isp, OUTMAILBOX0), ISP_READ(isp, OUTMAILBOX1), 1042 ISP_READ(isp, OUTMAILBOX2), ISP_READ(isp, OUTMAILBOX3), 1043 ISP_READ(isp, OUTMAILBOX4)); 1044 printf(" PCI Status Command/Status=%x\n", 1045 pci_conf_read(pcs->pci_pc, pcs->pci_tag, PCI_COMMAND_STATUS_REG)); 1046 } 1047