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