isp_pci.c revision 160410
1/*- 2 * 3 * Copyright (c) 1997-2006 by Matthew Jacob 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice immediately at the beginning of the file, without modification, 11 * this list of conditions, and the following disclaimer. 12 * 2. The name of the author may not be used to endorse or promote products 13 * derived from this software without specific prior written permission. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR 19 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25 * SUCH DAMAGE. 26 * 27 */ 28/* 29 * PCI specific probe and attach routines for Qlogic ISP SCSI adapters. 30 * FreeBSD Version. 31 */ 32#include <sys/cdefs.h> 33__FBSDID("$FreeBSD: head/sys/dev/isp/isp_pci.c 160410 2006-07-16 20:11:50Z mjacob $"); 34 35#include <sys/param.h> 36#include <sys/systm.h> 37#include <sys/kernel.h> 38#include <sys/module.h> 39#if __FreeBSD_version >= 700000 40#include <sys/linker.h> 41#include <sys/firmware.h> 42#endif 43#include <sys/bus.h> 44#if __FreeBSD_version < 500000 45#include <pci/pcireg.h> 46#include <pci/pcivar.h> 47#include <machine/bus_memio.h> 48#include <machine/bus_pio.h> 49#else 50#include <sys/stdint.h> 51#include <dev/pci/pcireg.h> 52#include <dev/pci/pcivar.h> 53#endif 54#include <machine/bus.h> 55#include <machine/resource.h> 56#include <sys/rman.h> 57#include <sys/malloc.h> 58 59#include <dev/isp/isp_freebsd.h> 60 61#if __FreeBSD_version < 500000 62#define BUS_PROBE_DEFAULT 0 63#endif 64 65static uint16_t isp_pci_rd_reg(ispsoftc_t *, int); 66static void isp_pci_wr_reg(ispsoftc_t *, int, uint16_t); 67static uint16_t isp_pci_rd_reg_1080(ispsoftc_t *, int); 68static void isp_pci_wr_reg_1080(ispsoftc_t *, int, uint16_t); 69static int 70isp_pci_rd_isr(ispsoftc_t *, uint16_t *, uint16_t *, uint16_t *); 71static int 72isp_pci_rd_isr_2300(ispsoftc_t *, uint16_t *, uint16_t *, uint16_t *); 73static int isp_pci_mbxdma(ispsoftc_t *); 74static int 75isp_pci_dmasetup(ispsoftc_t *, XS_T *, ispreq_t *, uint16_t *, uint16_t); 76static void 77isp_pci_dmateardown(ispsoftc_t *, XS_T *, uint16_t); 78 79 80static void isp_pci_reset1(ispsoftc_t *); 81static void isp_pci_dumpregs(ispsoftc_t *, const char *); 82 83static struct ispmdvec mdvec = { 84 isp_pci_rd_isr, 85 isp_pci_rd_reg, 86 isp_pci_wr_reg, 87 isp_pci_mbxdma, 88 isp_pci_dmasetup, 89 isp_pci_dmateardown, 90 NULL, 91 isp_pci_reset1, 92 isp_pci_dumpregs, 93 NULL, 94 BIU_BURST_ENABLE|BIU_PCI_CONF1_FIFO_64 95}; 96 97static struct ispmdvec mdvec_1080 = { 98 isp_pci_rd_isr, 99 isp_pci_rd_reg_1080, 100 isp_pci_wr_reg_1080, 101 isp_pci_mbxdma, 102 isp_pci_dmasetup, 103 isp_pci_dmateardown, 104 NULL, 105 isp_pci_reset1, 106 isp_pci_dumpregs, 107 NULL, 108 BIU_BURST_ENABLE|BIU_PCI_CONF1_FIFO_64 109}; 110 111static struct ispmdvec mdvec_12160 = { 112 isp_pci_rd_isr, 113 isp_pci_rd_reg_1080, 114 isp_pci_wr_reg_1080, 115 isp_pci_mbxdma, 116 isp_pci_dmasetup, 117 isp_pci_dmateardown, 118 NULL, 119 isp_pci_reset1, 120 isp_pci_dumpregs, 121 NULL, 122 BIU_BURST_ENABLE|BIU_PCI_CONF1_FIFO_64 123}; 124 125static struct ispmdvec mdvec_2100 = { 126 isp_pci_rd_isr, 127 isp_pci_rd_reg, 128 isp_pci_wr_reg, 129 isp_pci_mbxdma, 130 isp_pci_dmasetup, 131 isp_pci_dmateardown, 132 NULL, 133 isp_pci_reset1, 134 isp_pci_dumpregs 135}; 136 137static struct ispmdvec mdvec_2200 = { 138 isp_pci_rd_isr, 139 isp_pci_rd_reg, 140 isp_pci_wr_reg, 141 isp_pci_mbxdma, 142 isp_pci_dmasetup, 143 isp_pci_dmateardown, 144 NULL, 145 isp_pci_reset1, 146 isp_pci_dumpregs 147}; 148 149static struct ispmdvec mdvec_2300 = { 150 isp_pci_rd_isr_2300, 151 isp_pci_rd_reg, 152 isp_pci_wr_reg, 153 isp_pci_mbxdma, 154 isp_pci_dmasetup, 155 isp_pci_dmateardown, 156 NULL, 157 isp_pci_reset1, 158 isp_pci_dumpregs 159}; 160 161#ifndef PCIM_CMD_INVEN 162#define PCIM_CMD_INVEN 0x10 163#endif 164#ifndef PCIM_CMD_BUSMASTEREN 165#define PCIM_CMD_BUSMASTEREN 0x0004 166#endif 167#ifndef PCIM_CMD_PERRESPEN 168#define PCIM_CMD_PERRESPEN 0x0040 169#endif 170#ifndef PCIM_CMD_SEREN 171#define PCIM_CMD_SEREN 0x0100 172#endif 173#ifndef PCIM_CMD_INTX_DISABLE 174#define PCIM_CMD_INTX_DISABLE 0x0400 175#endif 176 177#ifndef PCIR_COMMAND 178#define PCIR_COMMAND 0x04 179#endif 180 181#ifndef PCIR_CACHELNSZ 182#define PCIR_CACHELNSZ 0x0c 183#endif 184 185#ifndef PCIR_LATTIMER 186#define PCIR_LATTIMER 0x0d 187#endif 188 189#ifndef PCIR_ROMADDR 190#define PCIR_ROMADDR 0x30 191#endif 192 193#ifndef PCI_VENDOR_QLOGIC 194#define PCI_VENDOR_QLOGIC 0x1077 195#endif 196 197#ifndef PCI_PRODUCT_QLOGIC_ISP1020 198#define PCI_PRODUCT_QLOGIC_ISP1020 0x1020 199#endif 200 201#ifndef PCI_PRODUCT_QLOGIC_ISP1080 202#define PCI_PRODUCT_QLOGIC_ISP1080 0x1080 203#endif 204 205#ifndef PCI_PRODUCT_QLOGIC_ISP10160 206#define PCI_PRODUCT_QLOGIC_ISP10160 0x1016 207#endif 208 209#ifndef PCI_PRODUCT_QLOGIC_ISP12160 210#define PCI_PRODUCT_QLOGIC_ISP12160 0x1216 211#endif 212 213#ifndef PCI_PRODUCT_QLOGIC_ISP1240 214#define PCI_PRODUCT_QLOGIC_ISP1240 0x1240 215#endif 216 217#ifndef PCI_PRODUCT_QLOGIC_ISP1280 218#define PCI_PRODUCT_QLOGIC_ISP1280 0x1280 219#endif 220 221#ifndef PCI_PRODUCT_QLOGIC_ISP2100 222#define PCI_PRODUCT_QLOGIC_ISP2100 0x2100 223#endif 224 225#ifndef PCI_PRODUCT_QLOGIC_ISP2200 226#define PCI_PRODUCT_QLOGIC_ISP2200 0x2200 227#endif 228 229#ifndef PCI_PRODUCT_QLOGIC_ISP2300 230#define PCI_PRODUCT_QLOGIC_ISP2300 0x2300 231#endif 232 233#ifndef PCI_PRODUCT_QLOGIC_ISP2312 234#define PCI_PRODUCT_QLOGIC_ISP2312 0x2312 235#endif 236 237#ifndef PCI_PRODUCT_QLOGIC_ISP2322 238#define PCI_PRODUCT_QLOGIC_ISP2322 0x2322 239#endif 240 241#ifndef PCI_PRODUCT_QLOGIC_ISP2422 242#define PCI_PRODUCT_QLOGIC_ISP2422 0x2422 243#endif 244 245#ifndef PCI_PRODUCT_QLOGIC_ISP6312 246#define PCI_PRODUCT_QLOGIC_ISP6312 0x6312 247#endif 248 249#ifndef PCI_PRODUCT_QLOGIC_ISP6322 250#define PCI_PRODUCT_QLOGIC_ISP6322 0x6322 251#endif 252 253 254#define PCI_QLOGIC_ISP1020 \ 255 ((PCI_PRODUCT_QLOGIC_ISP1020 << 16) | PCI_VENDOR_QLOGIC) 256 257#define PCI_QLOGIC_ISP1080 \ 258 ((PCI_PRODUCT_QLOGIC_ISP1080 << 16) | PCI_VENDOR_QLOGIC) 259 260#define PCI_QLOGIC_ISP10160 \ 261 ((PCI_PRODUCT_QLOGIC_ISP10160 << 16) | PCI_VENDOR_QLOGIC) 262 263#define PCI_QLOGIC_ISP12160 \ 264 ((PCI_PRODUCT_QLOGIC_ISP12160 << 16) | PCI_VENDOR_QLOGIC) 265 266#define PCI_QLOGIC_ISP1240 \ 267 ((PCI_PRODUCT_QLOGIC_ISP1240 << 16) | PCI_VENDOR_QLOGIC) 268 269#define PCI_QLOGIC_ISP1280 \ 270 ((PCI_PRODUCT_QLOGIC_ISP1280 << 16) | PCI_VENDOR_QLOGIC) 271 272#define PCI_QLOGIC_ISP2100 \ 273 ((PCI_PRODUCT_QLOGIC_ISP2100 << 16) | PCI_VENDOR_QLOGIC) 274 275#define PCI_QLOGIC_ISP2200 \ 276 ((PCI_PRODUCT_QLOGIC_ISP2200 << 16) | PCI_VENDOR_QLOGIC) 277 278#define PCI_QLOGIC_ISP2300 \ 279 ((PCI_PRODUCT_QLOGIC_ISP2300 << 16) | PCI_VENDOR_QLOGIC) 280 281#define PCI_QLOGIC_ISP2312 \ 282 ((PCI_PRODUCT_QLOGIC_ISP2312 << 16) | PCI_VENDOR_QLOGIC) 283 284#define PCI_QLOGIC_ISP2322 \ 285 ((PCI_PRODUCT_QLOGIC_ISP2322 << 16) | PCI_VENDOR_QLOGIC) 286 287#define PCI_QLOGIC_ISP2422 \ 288 ((PCI_PRODUCT_QLOGIC_ISP2422 << 16) | PCI_VENDOR_QLOGIC) 289 290#define PCI_QLOGIC_ISP6312 \ 291 ((PCI_PRODUCT_QLOGIC_ISP6312 << 16) | PCI_VENDOR_QLOGIC) 292 293#define PCI_QLOGIC_ISP6322 \ 294 ((PCI_PRODUCT_QLOGIC_ISP6322 << 16) | PCI_VENDOR_QLOGIC) 295 296/* 297 * Odd case for some AMI raid cards... We need to *not* attach to this. 298 */ 299#define AMI_RAID_SUBVENDOR_ID 0x101e 300 301#define IO_MAP_REG 0x10 302#define MEM_MAP_REG 0x14 303 304#define PCI_DFLT_LTNCY 0x40 305#define PCI_DFLT_LNSZ 0x10 306 307static int isp_pci_probe (device_t); 308static int isp_pci_attach (device_t); 309 310 311struct isp_pcisoftc { 312 ispsoftc_t pci_isp; 313 device_t pci_dev; 314 struct resource * pci_reg; 315 bus_space_tag_t pci_st; 316 bus_space_handle_t pci_sh; 317 void * ih; 318 int16_t pci_poff[_NREG_BLKS]; 319 bus_dma_tag_t dmat; 320 bus_dmamap_t *dmaps; 321}; 322 323static device_method_t isp_pci_methods[] = { 324 /* Device interface */ 325 DEVMETHOD(device_probe, isp_pci_probe), 326 DEVMETHOD(device_attach, isp_pci_attach), 327 { 0, 0 } 328}; 329static void isp_pci_intr(void *); 330 331static driver_t isp_pci_driver = { 332 "isp", isp_pci_methods, sizeof (struct isp_pcisoftc) 333}; 334static devclass_t isp_devclass; 335DRIVER_MODULE(isp, pci, isp_pci_driver, isp_devclass, 0, 0); 336#if __FreeBSD_version >= 700000 337MODULE_DEPEND(isp, ispfw, 1, 1, 1); 338MODULE_DEPEND(isp, firmware, 1, 1, 1); 339#else 340typedef void ispfwfunc(int, int, int, uint16_t **); 341extern ispfwfunc *isp_get_firmware_p; 342#endif 343 344static int 345isp_pci_probe(device_t dev) 346{ 347 switch ((pci_get_device(dev) << 16) | (pci_get_vendor(dev))) { 348 case PCI_QLOGIC_ISP1020: 349 device_set_desc(dev, "Qlogic ISP 1020/1040 PCI SCSI Adapter"); 350 break; 351 case PCI_QLOGIC_ISP1080: 352 device_set_desc(dev, "Qlogic ISP 1080 PCI SCSI Adapter"); 353 break; 354 case PCI_QLOGIC_ISP1240: 355 device_set_desc(dev, "Qlogic ISP 1240 PCI SCSI Adapter"); 356 break; 357 case PCI_QLOGIC_ISP1280: 358 device_set_desc(dev, "Qlogic ISP 1280 PCI SCSI Adapter"); 359 break; 360 case PCI_QLOGIC_ISP10160: 361 device_set_desc(dev, "Qlogic ISP 10160 PCI SCSI Adapter"); 362 break; 363 case PCI_QLOGIC_ISP12160: 364 if (pci_get_subvendor(dev) == AMI_RAID_SUBVENDOR_ID) { 365 return (ENXIO); 366 } 367 device_set_desc(dev, "Qlogic ISP 12160 PCI SCSI Adapter"); 368 break; 369 case PCI_QLOGIC_ISP2100: 370 device_set_desc(dev, "Qlogic ISP 2100 PCI FC-AL Adapter"); 371 break; 372 case PCI_QLOGIC_ISP2200: 373 device_set_desc(dev, "Qlogic ISP 2200 PCI FC-AL Adapter"); 374 break; 375 case PCI_QLOGIC_ISP2300: 376 device_set_desc(dev, "Qlogic ISP 2300 PCI FC-AL Adapter"); 377 break; 378 case PCI_QLOGIC_ISP2312: 379 device_set_desc(dev, "Qlogic ISP 2312 PCI FC-AL Adapter"); 380 break; 381 case PCI_QLOGIC_ISP2322: 382 device_set_desc(dev, "Qlogic ISP 2322 PCI FC-AL Adapter"); 383 break; 384#if 0 385 case PCI_QLOGIC_ISP2422: 386 device_set_desc(dev, "Qlogic ISP 2422 PCI FC-AL Adapter"); 387 break; 388#endif 389 case PCI_QLOGIC_ISP6312: 390 device_set_desc(dev, "Qlogic ISP 6312 PCI FC-AL Adapter"); 391 break; 392 case PCI_QLOGIC_ISP6322: 393 device_set_desc(dev, "Qlogic ISP 6322 PCI FC-AL Adapter"); 394 break; 395 default: 396 return (ENXIO); 397 } 398 if (isp_announced == 0 && bootverbose) { 399 printf("Qlogic ISP Driver, FreeBSD Version %d.%d, " 400 "Core Version %d.%d\n", 401 ISP_PLATFORM_VERSION_MAJOR, ISP_PLATFORM_VERSION_MINOR, 402 ISP_CORE_VERSION_MAJOR, ISP_CORE_VERSION_MINOR); 403 isp_announced++; 404 } 405 /* 406 * XXXX: Here is where we might load the f/w module 407 * XXXX: (or increase a reference count to it). 408 */ 409 return (BUS_PROBE_DEFAULT); 410} 411 412#if __FreeBSD_version < 500000 413static void 414isp_get_options(device_t dev, ispsoftc_t *isp) 415{ 416 uint64_t wwn; 417 int bitmap, unit; 418 419 unit = device_get_unit(dev); 420 if (getenv_int("isp_disable", &bitmap)) { 421 if (bitmap & (1 << unit)) { 422 isp->isp_osinfo.disabled = 1; 423 return; 424 } 425 } 426 427 if (getenv_int("isp_no_fwload", &bitmap)) { 428 if (bitmap & (1 << unit)) 429 isp->isp_confopts |= ISP_CFG_NORELOAD; 430 } 431 if (getenv_int("isp_fwload", &bitmap)) { 432 if (bitmap & (1 << unit)) 433 isp->isp_confopts &= ~ISP_CFG_NORELOAD; 434 } 435 if (getenv_int("isp_no_nvram", &bitmap)) { 436 if (bitmap & (1 << unit)) 437 isp->isp_confopts |= ISP_CFG_NONVRAM; 438 } 439 if (getenv_int("isp_nvram", &bitmap)) { 440 if (bitmap & (1 << unit)) 441 isp->isp_confopts &= ~ISP_CFG_NONVRAM; 442 } 443 if (getenv_int("isp_fcduplex", &bitmap)) { 444 if (bitmap & (1 << unit)) 445 isp->isp_confopts |= ISP_CFG_FULL_DUPLEX; 446 } 447 if (getenv_int("isp_no_fcduplex", &bitmap)) { 448 if (bitmap & (1 << unit)) 449 isp->isp_confopts &= ~ISP_CFG_FULL_DUPLEX; 450 } 451 if (getenv_int("isp_nport", &bitmap)) { 452 if (bitmap & (1 << unit)) 453 isp->isp_confopts |= ISP_CFG_NPORT; 454 } 455 456 /* 457 * Because the resource_*_value functions can neither return 458 * 64 bit integer values, nor can they be directly coerced 459 * to interpret the right hand side of the assignment as 460 * you want them to interpret it, we have to force WWN 461 * hint replacement to specify WWN strings with a leading 462 * 'w' (e..g w50000000aaaa0001). Sigh. 463 */ 464 if (getenv_quad("isp_portwwn", &wwn)) { 465 isp->isp_osinfo.default_port_wwn = wwn; 466 isp->isp_confopts |= ISP_CFG_OWNWWPN; 467 } 468 if (isp->isp_osinfo.default_port_wwn == 0) { 469 isp->isp_osinfo.default_port_wwn = 0x400000007F000009ull; 470 } 471 472 if (getenv_quad("isp_nodewwn", &wwn)) { 473 isp->isp_osinfo.default_node_wwn = wwn; 474 isp->isp_confopts |= ISP_CFG_OWNWWNN; 475 } 476 if (isp->isp_osinfo.default_node_wwn == 0) { 477 isp->isp_osinfo.default_node_wwn = 0x400000007F000009ull; 478 } 479 480 bitmap = 0; 481 (void) getenv_int("isp_debug", &bitmap); 482 if (bitmap) { 483 isp->isp_dblev = bitmap; 484 } else { 485 isp->isp_dblev = ISP_LOGWARN|ISP_LOGERR; 486 } 487 if (bootverbose) { 488 isp->isp_dblev |= ISP_LOGCONFIG|ISP_LOGINFO; 489 } 490 491#ifdef ISP_FW_CRASH_DUMP 492 bitmap = 0; 493 if (getenv_int("isp_fw_dump_enable", &bitmap)) { 494 if (bitmap & (1 << unit) { 495 size_t amt = 0; 496 if (IS_2200(isp)) { 497 amt = QLA2200_RISC_IMAGE_DUMP_SIZE; 498 } else if (IS_23XX(isp)) { 499 amt = QLA2300_RISC_IMAGE_DUMP_SIZE; 500 } 501 if (amt) { 502 FCPARAM(isp)->isp_dump_data = 503 malloc(amt, M_DEVBUF, M_WAITOK); 504 memset(FCPARAM(isp)->isp_dump_data, 0, amt); 505 } else { 506 device_printf(dev, 507 "f/w crash dumps not supported for card\n"); 508 } 509 } 510 } 511#endif 512} 513 514static void 515isp_get_pci_options(device_t dev, int *m1, int *m2) 516{ 517 int bitmap; 518 int unit = device_get_unit(dev); 519 520 *m1 = PCIM_CMD_MEMEN; 521 *m2 = PCIM_CMD_PORTEN; 522 if (getenv_int("isp_mem_map", &bitmap)) { 523 if (bitmap & (1 << unit)) { 524 *m1 = PCIM_CMD_MEMEN; 525 *m2 = PCIM_CMD_PORTEN; 526 } 527 } 528 bitmap = 0; 529 if (getenv_int("isp_io_map", &bitmap)) { 530 if (bitmap & (1 << unit)) { 531 *m1 = PCIM_CMD_PORTEN; 532 *m2 = PCIM_CMD_MEMEN; 533 } 534 } 535} 536#else 537static void 538isp_get_options(device_t dev, ispsoftc_t *isp) 539{ 540 int tval; 541 const char *sptr; 542 /* 543 * Figure out if we're supposed to skip this one. 544 */ 545 546 tval = 0; 547 if (resource_int_value(device_get_name(dev), device_get_unit(dev), 548 "disable", &tval) == 0 && tval) { 549 device_printf(dev, "disabled at user request\n"); 550 isp->isp_osinfo.disabled = 1; 551 return; 552 } 553 554 tval = -1; 555 if (resource_int_value(device_get_name(dev), device_get_unit(dev), 556 "role", &tval) == 0 && tval != -1) { 557 tval &= (ISP_ROLE_INITIATOR|ISP_ROLE_TARGET); 558 isp->isp_role = tval; 559 device_printf(dev, "setting role to 0x%x\n", isp->isp_role); 560 } else { 561#ifdef ISP_TARGET_MODE 562 isp->isp_role = ISP_ROLE_TARGET; 563#else 564 isp->isp_role = ISP_DEFAULT_ROLES; 565#endif 566 } 567 568 tval = 0; 569 if (resource_int_value(device_get_name(dev), device_get_unit(dev), 570 "fwload_disable", &tval) == 0 && tval != 0) { 571 isp->isp_confopts |= ISP_CFG_NORELOAD; 572 } 573 tval = 0; 574 if (resource_int_value(device_get_name(dev), device_get_unit(dev), 575 "ignore_nvram", &tval) == 0 && tval != 0) { 576 isp->isp_confopts |= ISP_CFG_NONVRAM; 577 } 578 tval = 0; 579 if (resource_int_value(device_get_name(dev), device_get_unit(dev), 580 "fullduplex", &tval) == 0 && tval != 0) { 581 isp->isp_confopts |= ISP_CFG_FULL_DUPLEX; 582 } 583#ifdef ISP_FW_CRASH_DUMP 584 tval = 0; 585 if (resource_int_value(device_get_name(dev), device_get_unit(dev), 586 "fw_dump_enable", &tval) == 0 && tval != 0) { 587 size_t amt = 0; 588 if (IS_2200(isp)) { 589 amt = QLA2200_RISC_IMAGE_DUMP_SIZE; 590 } else if (IS_23XX(isp)) { 591 amt = QLA2300_RISC_IMAGE_DUMP_SIZE; 592 } 593 if (amt) { 594 FCPARAM(isp)->isp_dump_data = 595 malloc(amt, M_DEVBUF, M_WAITOK | M_ZERO); 596 } else { 597 device_printf(dev, 598 "f/w crash dumps not supported for this model\n"); 599 } 600 } 601#endif 602 603 sptr = 0; 604 if (resource_string_value(device_get_name(dev), device_get_unit(dev), 605 "topology", (const char **) &sptr) == 0 && sptr != 0) { 606 if (strcmp(sptr, "lport") == 0) { 607 isp->isp_confopts |= ISP_CFG_LPORT; 608 } else if (strcmp(sptr, "nport") == 0) { 609 isp->isp_confopts |= ISP_CFG_NPORT; 610 } else if (strcmp(sptr, "lport-only") == 0) { 611 isp->isp_confopts |= ISP_CFG_LPORT_ONLY; 612 } else if (strcmp(sptr, "nport-only") == 0) { 613 isp->isp_confopts |= ISP_CFG_NPORT_ONLY; 614 } 615 } 616 617 /* 618 * Because the resource_*_value functions can neither return 619 * 64 bit integer values, nor can they be directly coerced 620 * to interpret the right hand side of the assignment as 621 * you want them to interpret it, we have to force WWN 622 * hint replacement to specify WWN strings with a leading 623 * 'w' (e..g w50000000aaaa0001). Sigh. 624 */ 625 sptr = 0; 626 tval = resource_string_value(device_get_name(dev), device_get_unit(dev), 627 "portwwn", (const char **) &sptr); 628 if (tval == 0 && sptr != 0 && *sptr++ == 'w') { 629 char *eptr = 0; 630 isp->isp_osinfo.default_port_wwn = strtouq(sptr, &eptr, 16); 631 if (eptr < sptr + 16 || isp->isp_osinfo.default_port_wwn == 0) { 632 device_printf(dev, "mangled portwwn hint '%s'\n", sptr); 633 isp->isp_osinfo.default_port_wwn = 0; 634 } else { 635 isp->isp_confopts |= ISP_CFG_OWNWWPN; 636 } 637 } 638 if (isp->isp_osinfo.default_port_wwn == 0) { 639 isp->isp_osinfo.default_port_wwn = 0x400000007F000009ull; 640 } 641 642 sptr = 0; 643 tval = resource_string_value(device_get_name(dev), device_get_unit(dev), 644 "nodewwn", (const char **) &sptr); 645 if (tval == 0 && sptr != 0 && *sptr++ == 'w') { 646 char *eptr = 0; 647 isp->isp_osinfo.default_node_wwn = strtouq(sptr, &eptr, 16); 648 if (eptr < sptr + 16 || isp->isp_osinfo.default_node_wwn == 0) { 649 device_printf(dev, "mangled nodewwn hint '%s'\n", sptr); 650 isp->isp_osinfo.default_node_wwn = 0; 651 } else { 652 isp->isp_confopts |= ISP_CFG_OWNWWNN; 653 } 654 } 655 if (isp->isp_osinfo.default_node_wwn == 0) { 656 isp->isp_osinfo.default_node_wwn = 0x400000007F000009ull; 657 } 658 659 isp->isp_osinfo.default_id = -1; 660 if (resource_int_value(device_get_name(dev), device_get_unit(dev), 661 "iid", &tval) == 0) { 662 isp->isp_osinfo.default_id = tval; 663 isp->isp_confopts |= ISP_CFG_OWNLOOPID; 664 } 665 if (isp->isp_osinfo.default_id == -1) { 666 if (IS_FC(isp)) { 667 isp->isp_osinfo.default_id = 109; 668 } else { 669 isp->isp_osinfo.default_id = 7; 670 } 671 } 672 673 /* 674 * Set up logging levels. 675 */ 676 tval = 0; 677 (void) resource_int_value(device_get_name(dev), device_get_unit(dev), 678 "debug", &tval); 679 if (tval) { 680 isp->isp_dblev = tval; 681 } else { 682 isp->isp_dblev = ISP_LOGWARN|ISP_LOGERR; 683 } 684 if (bootverbose) { 685 isp->isp_dblev |= ISP_LOGCONFIG|ISP_LOGINFO; 686 } 687 688} 689 690static void 691isp_get_pci_options(device_t dev, int *m1, int *m2) 692{ 693 int tval; 694 /* 695 * Which we should try first - memory mapping or i/o mapping? 696 * 697 * We used to try memory first followed by i/o on alpha, otherwise 698 * the reverse, but we should just try memory first all the time now. 699 */ 700 *m1 = PCIM_CMD_MEMEN; 701 *m2 = PCIM_CMD_PORTEN; 702 703 tval = 0; 704 if (resource_int_value(device_get_name(dev), device_get_unit(dev), 705 "prefer_iomap", &tval) == 0 && tval != 0) { 706 *m1 = PCIM_CMD_PORTEN; 707 *m2 = PCIM_CMD_MEMEN; 708 } 709 tval = 0; 710 if (resource_int_value(device_get_name(dev), device_get_unit(dev), 711 "prefer_memmap", &tval) == 0 && tval != 0) { 712 *m1 = PCIM_CMD_MEMEN; 713 *m2 = PCIM_CMD_PORTEN; 714 } 715} 716#endif 717 718static int 719isp_pci_attach(device_t dev) 720{ 721 struct resource *regs, *irq; 722 int rtp, rgd, iqd, m1, m2; 723 uint32_t data, cmd, linesz, psize, basetype; 724 struct isp_pcisoftc *pcs; 725 ispsoftc_t *isp = NULL; 726 struct ispmdvec *mdvp; 727#if __FreeBSD_version >= 500000 728 int locksetup = 0; 729#endif 730 731 pcs = device_get_softc(dev); 732 if (pcs == NULL) { 733 device_printf(dev, "cannot get softc\n"); 734 return (ENOMEM); 735 } 736 memset(pcs, 0, sizeof (*pcs)); 737 pcs->pci_dev = dev; 738 isp = &pcs->pci_isp; 739 740 /* 741 * Get Generic Options 742 */ 743 isp_get_options(dev, isp); 744 745 /* 746 * Check to see if options have us disabled 747 */ 748 if (isp->isp_osinfo.disabled) { 749 /* 750 * But return zero to preserve unit numbering 751 */ 752 return (0); 753 } 754 755 /* 756 * Get PCI options- which in this case are just mapping preferences. 757 */ 758 isp_get_pci_options(dev, &m1, &m2); 759 760 761 linesz = PCI_DFLT_LNSZ; 762 irq = regs = NULL; 763 rgd = rtp = iqd = 0; 764 765 cmd = pci_read_config(dev, PCIR_COMMAND, 2); 766 if (cmd & m1) { 767 rtp = (m1 == PCIM_CMD_MEMEN)? SYS_RES_MEMORY : SYS_RES_IOPORT; 768 rgd = (m1 == PCIM_CMD_MEMEN)? MEM_MAP_REG : IO_MAP_REG; 769 regs = bus_alloc_resource_any(dev, rtp, &rgd, RF_ACTIVE); 770 } 771 if (regs == NULL && (cmd & m2)) { 772 rtp = (m2 == PCIM_CMD_MEMEN)? SYS_RES_MEMORY : SYS_RES_IOPORT; 773 rgd = (m2 == PCIM_CMD_MEMEN)? MEM_MAP_REG : IO_MAP_REG; 774 regs = bus_alloc_resource_any(dev, rtp, &rgd, RF_ACTIVE); 775 } 776 if (regs == NULL) { 777 device_printf(dev, "unable to map any ports\n"); 778 goto bad; 779 } 780 if (bootverbose) { 781 device_printf(dev, "using %s space register mapping\n", 782 (rgd == IO_MAP_REG)? "I/O" : "Memory"); 783 } 784 pcs->pci_dev = dev; 785 pcs->pci_reg = regs; 786 pcs->pci_st = rman_get_bustag(regs); 787 pcs->pci_sh = rman_get_bushandle(regs); 788 789 pcs->pci_poff[BIU_BLOCK >> _BLK_REG_SHFT] = BIU_REGS_OFF; 790 pcs->pci_poff[MBOX_BLOCK >> _BLK_REG_SHFT] = PCI_MBOX_REGS_OFF; 791 pcs->pci_poff[SXP_BLOCK >> _BLK_REG_SHFT] = PCI_SXP_REGS_OFF; 792 pcs->pci_poff[RISC_BLOCK >> _BLK_REG_SHFT] = PCI_RISC_REGS_OFF; 793 pcs->pci_poff[DMA_BLOCK >> _BLK_REG_SHFT] = DMA_REGS_OFF; 794 mdvp = &mdvec; 795 basetype = ISP_HA_SCSI_UNKNOWN; 796 psize = sizeof (sdparam); 797 if (pci_get_devid(dev) == PCI_QLOGIC_ISP1020) { 798 mdvp = &mdvec; 799 basetype = ISP_HA_SCSI_UNKNOWN; 800 psize = sizeof (sdparam); 801 } 802 if (pci_get_devid(dev) == PCI_QLOGIC_ISP1080) { 803 mdvp = &mdvec_1080; 804 basetype = ISP_HA_SCSI_1080; 805 psize = sizeof (sdparam); 806 pcs->pci_poff[DMA_BLOCK >> _BLK_REG_SHFT] = 807 ISP1080_DMA_REGS_OFF; 808 } 809 if (pci_get_devid(dev) == PCI_QLOGIC_ISP1240) { 810 mdvp = &mdvec_1080; 811 basetype = ISP_HA_SCSI_1240; 812 psize = 2 * sizeof (sdparam); 813 pcs->pci_poff[DMA_BLOCK >> _BLK_REG_SHFT] = 814 ISP1080_DMA_REGS_OFF; 815 } 816 if (pci_get_devid(dev) == PCI_QLOGIC_ISP1280) { 817 mdvp = &mdvec_1080; 818 basetype = ISP_HA_SCSI_1280; 819 psize = 2 * sizeof (sdparam); 820 pcs->pci_poff[DMA_BLOCK >> _BLK_REG_SHFT] = 821 ISP1080_DMA_REGS_OFF; 822 } 823 if (pci_get_devid(dev) == PCI_QLOGIC_ISP10160) { 824 mdvp = &mdvec_12160; 825 basetype = ISP_HA_SCSI_10160; 826 psize = sizeof (sdparam); 827 pcs->pci_poff[DMA_BLOCK >> _BLK_REG_SHFT] = 828 ISP1080_DMA_REGS_OFF; 829 } 830 if (pci_get_devid(dev) == PCI_QLOGIC_ISP12160) { 831 mdvp = &mdvec_12160; 832 basetype = ISP_HA_SCSI_12160; 833 psize = 2 * sizeof (sdparam); 834 pcs->pci_poff[DMA_BLOCK >> _BLK_REG_SHFT] = 835 ISP1080_DMA_REGS_OFF; 836 } 837 if (pci_get_devid(dev) == PCI_QLOGIC_ISP2100) { 838 mdvp = &mdvec_2100; 839 basetype = ISP_HA_FC_2100; 840 psize = sizeof (fcparam); 841 pcs->pci_poff[MBOX_BLOCK >> _BLK_REG_SHFT] = 842 PCI_MBOX_REGS2100_OFF; 843 if (pci_get_revid(dev) < 3) { 844 /* 845 * XXX: Need to get the actual revision 846 * XXX: number of the 2100 FB. At any rate, 847 * XXX: lower cache line size for early revision 848 * XXX; boards. 849 */ 850 linesz = 1; 851 } 852 } 853 if (pci_get_devid(dev) == PCI_QLOGIC_ISP2200) { 854 mdvp = &mdvec_2200; 855 basetype = ISP_HA_FC_2200; 856 psize = sizeof (fcparam); 857 pcs->pci_poff[MBOX_BLOCK >> _BLK_REG_SHFT] = 858 PCI_MBOX_REGS2100_OFF; 859 } 860 if (pci_get_devid(dev) == PCI_QLOGIC_ISP2300) { 861 mdvp = &mdvec_2300; 862 basetype = ISP_HA_FC_2300; 863 psize = sizeof (fcparam); 864 pcs->pci_poff[MBOX_BLOCK >> _BLK_REG_SHFT] = 865 PCI_MBOX_REGS2300_OFF; 866 } 867 if (pci_get_devid(dev) == PCI_QLOGIC_ISP2312 || 868 pci_get_devid(dev) == PCI_QLOGIC_ISP6312) { 869 mdvp = &mdvec_2300; 870 basetype = ISP_HA_FC_2312; 871 psize = sizeof (fcparam); 872 pcs->pci_poff[MBOX_BLOCK >> _BLK_REG_SHFT] = 873 PCI_MBOX_REGS2300_OFF; 874 } 875 if (pci_get_devid(dev) == PCI_QLOGIC_ISP2322 || 876 pci_get_devid(dev) == PCI_QLOGIC_ISP6322) { 877 mdvp = &mdvec_2300; 878 basetype = ISP_HA_FC_2322; 879 psize = sizeof (fcparam); 880 pcs->pci_poff[MBOX_BLOCK >> _BLK_REG_SHFT] = 881 PCI_MBOX_REGS2300_OFF; 882 } 883 if (pci_get_devid(dev) == PCI_QLOGIC_ISP2422) { 884 mdvp = &mdvec_2300; 885 basetype = ISP_HA_FC_2422; 886 psize = sizeof (fcparam); 887 pcs->pci_poff[MBOX_BLOCK >> _BLK_REG_SHFT] = 888 PCI_MBOX_REGS2300_OFF; 889 } 890 isp = &pcs->pci_isp; 891 isp->isp_param = malloc(psize, M_DEVBUF, M_NOWAIT | M_ZERO); 892 if (isp->isp_param == NULL) { 893 device_printf(dev, "cannot allocate parameter data\n"); 894 goto bad; 895 } 896 isp->isp_mdvec = mdvp; 897 isp->isp_type = basetype; 898 isp->isp_revision = pci_get_revid(dev); 899 isp->isp_dev = dev; 900 901#if __FreeBSD_version >= 700000 902 /* 903 * Try and find firmware for this device. 904 */ 905 { 906 char fwname[32]; 907 unsigned int did = pci_get_device(dev); 908 909 /* 910 * Map a few pci ids to fw names 911 */ 912 switch (did) { 913 case PCI_PRODUCT_QLOGIC_ISP1020: 914 did = 0x1040; 915 break; 916 case PCI_PRODUCT_QLOGIC_ISP1240: 917 did = 0x1080; 918 break; 919 case PCI_PRODUCT_QLOGIC_ISP10160: 920 case PCI_PRODUCT_QLOGIC_ISP12160: 921 did = 0x12160; 922 break; 923 case PCI_PRODUCT_QLOGIC_ISP6312: 924 case PCI_PRODUCT_QLOGIC_ISP2312: 925 did = 0x2300; 926 break; 927 case PCI_PRODUCT_QLOGIC_ISP6322: 928 did = 0x2322; 929 break; 930 default: 931 break; 932 } 933 934 isp->isp_osinfo.fw = NULL; 935 if (isp->isp_role & ISP_ROLE_TARGET) { 936 snprintf(fwname, sizeof (fwname), "isp_%04x_it", did); 937 isp->isp_osinfo.fw = firmware_get(fwname); 938 } 939 if (isp->isp_osinfo.fw == NULL) { 940 snprintf(fwname, sizeof (fwname), "isp_%04x", did); 941 isp->isp_osinfo.fw = firmware_get(fwname); 942 } 943 if (isp->isp_osinfo.fw != NULL) { 944 union { 945 const void *fred; 946 uint16_t *bob; 947 } u; 948 u.fred = isp->isp_osinfo.fw->data; 949 isp->isp_mdvec->dv_ispfw = u.bob; 950 } 951 } 952#else 953 if (isp_get_firmware_p) { 954 int device = (int) pci_get_device(dev); 955#ifdef ISP_TARGET_MODE 956 (*isp_get_firmware_p)(0, 1, device, &mdvp->dv_ispfw); 957#else 958 (*isp_get_firmware_p)(0, 0, device, &mdvp->dv_ispfw); 959#endif 960 } 961#endif 962 963 /* 964 * Make sure that SERR, PERR, WRITE INVALIDATE and BUSMASTER 965 * are set. 966 */ 967 cmd |= PCIM_CMD_SEREN | PCIM_CMD_PERRESPEN | 968 PCIM_CMD_BUSMASTEREN | PCIM_CMD_INVEN; 969 970 if (IS_2300(isp)) { /* per QLogic errata */ 971 cmd &= ~PCIM_CMD_INVEN; 972 } 973 974 if (IS_23XX(isp)) { 975 /* 976 * Can't tell if ROM will hang on 'ABOUT FIRMWARE' command. 977 */ 978 isp->isp_touched = 1; 979 980 } 981 982 if (IS_2322(isp) || pci_get_devid(dev) == PCI_QLOGIC_ISP6312) { 983 cmd &= ~PCIM_CMD_INTX_DISABLE; 984 } 985 986 pci_write_config(dev, PCIR_COMMAND, cmd, 2); 987 988 /* 989 * Make sure the Cache Line Size register is set sensibly. 990 */ 991 data = pci_read_config(dev, PCIR_CACHELNSZ, 1); 992 if (data != linesz) { 993 data = PCI_DFLT_LNSZ; 994 isp_prt(isp, ISP_LOGCONFIG, "set PCI line size to %d", data); 995 pci_write_config(dev, PCIR_CACHELNSZ, data, 1); 996 } 997 998 /* 999 * Make sure the Latency Timer is sane. 1000 */ 1001 data = pci_read_config(dev, PCIR_LATTIMER, 1); 1002 if (data < PCI_DFLT_LTNCY) { 1003 data = PCI_DFLT_LTNCY; 1004 isp_prt(isp, ISP_LOGCONFIG, "set PCI latency to %d", data); 1005 pci_write_config(dev, PCIR_LATTIMER, data, 1); 1006 } 1007 1008 /* 1009 * Make sure we've disabled the ROM. 1010 */ 1011 data = pci_read_config(dev, PCIR_ROMADDR, 4); 1012 data &= ~1; 1013 pci_write_config(dev, PCIR_ROMADDR, data, 4); 1014 1015 iqd = 0; 1016 irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &iqd, 1017 RF_ACTIVE | RF_SHAREABLE); 1018 if (irq == NULL) { 1019 device_printf(dev, "could not allocate interrupt\n"); 1020 goto bad; 1021 } 1022 1023#if __FreeBSD_version >= 500000 1024 /* Make sure the lock is set up. */ 1025 mtx_init(&isp->isp_osinfo.lock, "isp", NULL, MTX_DEF); 1026 locksetup++; 1027#endif 1028 1029 if (bus_setup_intr(dev, irq, ISP_IFLAGS, isp_pci_intr, isp, &pcs->ih)) { 1030 device_printf(dev, "could not setup interrupt\n"); 1031 goto bad; 1032 } 1033 1034 /* 1035 * Last minute checks... 1036 */ 1037 if (IS_23XX(isp)) { 1038 isp->isp_port = pci_get_function(dev); 1039 } 1040 1041 /* 1042 * Make sure we're in reset state. 1043 */ 1044 ISP_LOCK(isp); 1045 isp_reset(isp); 1046 if (isp->isp_state != ISP_RESETSTATE) { 1047 ISP_UNLOCK(isp); 1048 goto bad; 1049 } 1050 isp_init(isp); 1051 if (isp->isp_role != ISP_ROLE_NONE && isp->isp_state != ISP_INITSTATE) { 1052 isp_uninit(isp); 1053 ISP_UNLOCK(isp); 1054 goto bad; 1055 } 1056 isp_attach(isp); 1057 if (isp->isp_role != ISP_ROLE_NONE && isp->isp_state != ISP_RUNSTATE) { 1058 isp_uninit(isp); 1059 ISP_UNLOCK(isp); 1060 goto bad; 1061 } 1062 /* 1063 * XXXX: Here is where we might unload the f/w module 1064 * XXXX: (or decrease the reference count to it). 1065 */ 1066 ISP_UNLOCK(isp); 1067 return (0); 1068 1069bad: 1070 1071 if (pcs && pcs->ih) { 1072 (void) bus_teardown_intr(dev, irq, pcs->ih); 1073 } 1074 1075#if __FreeBSD_version >= 500000 1076 if (locksetup && isp) { 1077 mtx_destroy(&isp->isp_osinfo.lock); 1078 } 1079#endif 1080 1081 if (irq) { 1082 (void) bus_release_resource(dev, SYS_RES_IRQ, iqd, irq); 1083 } 1084 1085 1086 if (regs) { 1087 (void) bus_release_resource(dev, rtp, rgd, regs); 1088 } 1089 1090 if (pcs) { 1091 if (pcs->pci_isp.isp_param) { 1092#ifdef ISP_FW_CRASH_DUMP 1093 if (IS_FC(isp) && FCPARAM(isp)->isp_dump_data) { 1094 free(FCPARAM(isp)->isp_dump_data, M_DEVBUF); 1095 } 1096#endif 1097 free(pcs->pci_isp.isp_param, M_DEVBUF); 1098 } 1099 } 1100 1101 /* 1102 * XXXX: Here is where we might unload the f/w module 1103 * XXXX: (or decrease the reference count to it). 1104 */ 1105 return (ENXIO); 1106} 1107 1108static void 1109isp_pci_intr(void *arg) 1110{ 1111 ispsoftc_t *isp = arg; 1112 uint16_t isr, sema, mbox; 1113 1114 ISP_LOCK(isp); 1115 isp->isp_intcnt++; 1116 if (ISP_READ_ISR(isp, &isr, &sema, &mbox) == 0) { 1117 isp->isp_intbogus++; 1118 } else { 1119 int iok = isp->isp_osinfo.intsok; 1120 isp->isp_osinfo.intsok = 0; 1121 isp_intr(isp, isr, sema, mbox); 1122 isp->isp_osinfo.intsok = iok; 1123 } 1124 ISP_UNLOCK(isp); 1125} 1126 1127 1128#define IspVirt2Off(a, x) \ 1129 (((struct isp_pcisoftc *)a)->pci_poff[((x) & _BLK_REG_MASK) >> \ 1130 _BLK_REG_SHFT] + ((x) & 0xff)) 1131 1132#define BXR2(pcs, off) \ 1133 bus_space_read_2(pcs->pci_st, pcs->pci_sh, off) 1134#define BXW2(pcs, off, v) \ 1135 bus_space_write_2(pcs->pci_st, pcs->pci_sh, off, v) 1136 1137 1138static __inline int 1139isp_pci_rd_debounced(ispsoftc_t *isp, int off, uint16_t *rp) 1140{ 1141 struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp; 1142 uint16_t val0, val1; 1143 int i = 0; 1144 1145 do { 1146 val0 = BXR2(pcs, IspVirt2Off(isp, off)); 1147 val1 = BXR2(pcs, IspVirt2Off(isp, off)); 1148 } while (val0 != val1 && ++i < 1000); 1149 if (val0 != val1) { 1150 return (1); 1151 } 1152 *rp = val0; 1153 return (0); 1154} 1155 1156static int 1157isp_pci_rd_isr(ispsoftc_t *isp, uint16_t *isrp, 1158 uint16_t *semap, uint16_t *mbp) 1159{ 1160 struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp; 1161 uint16_t isr, sema; 1162 1163 if (IS_2100(isp)) { 1164 if (isp_pci_rd_debounced(isp, BIU_ISR, &isr)) { 1165 return (0); 1166 } 1167 if (isp_pci_rd_debounced(isp, BIU_SEMA, &sema)) { 1168 return (0); 1169 } 1170 } else { 1171 isr = BXR2(pcs, IspVirt2Off(isp, BIU_ISR)); 1172 sema = BXR2(pcs, IspVirt2Off(isp, BIU_SEMA)); 1173 } 1174 isp_prt(isp, ISP_LOGDEBUG3, "ISR 0x%x SEMA 0x%x", isr, sema); 1175 isr &= INT_PENDING_MASK(isp); 1176 sema &= BIU_SEMA_LOCK; 1177 if (isr == 0 && sema == 0) { 1178 return (0); 1179 } 1180 *isrp = isr; 1181 if ((*semap = sema) != 0) { 1182 if (IS_2100(isp)) { 1183 if (isp_pci_rd_debounced(isp, OUTMAILBOX0, mbp)) { 1184 return (0); 1185 } 1186 } else { 1187 *mbp = BXR2(pcs, IspVirt2Off(isp, OUTMAILBOX0)); 1188 } 1189 } 1190 return (1); 1191} 1192 1193static int 1194isp_pci_rd_isr_2300(ispsoftc_t *isp, uint16_t *isrp, 1195 uint16_t *semap, uint16_t *mbox0p) 1196{ 1197 struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp; 1198 uint16_t hccr; 1199 uint32_t r2hisr; 1200 1201 if (!(BXR2(pcs, IspVirt2Off(isp, BIU_ISR) & BIU2100_ISR_RISC_INT))) { 1202 *isrp = 0; 1203 return (0); 1204 } 1205 r2hisr = bus_space_read_4(pcs->pci_st, pcs->pci_sh, 1206 IspVirt2Off(pcs, BIU_R2HSTSLO)); 1207 isp_prt(isp, ISP_LOGDEBUG3, "RISC2HOST ISR 0x%x", r2hisr); 1208 if ((r2hisr & BIU_R2HST_INTR) == 0) { 1209 *isrp = 0; 1210 return (0); 1211 } 1212 switch (r2hisr & BIU_R2HST_ISTAT_MASK) { 1213 case ISPR2HST_ROM_MBX_OK: 1214 case ISPR2HST_ROM_MBX_FAIL: 1215 case ISPR2HST_MBX_OK: 1216 case ISPR2HST_MBX_FAIL: 1217 case ISPR2HST_ASYNC_EVENT: 1218 *isrp = r2hisr & 0xffff; 1219 *mbox0p = (r2hisr >> 16); 1220 *semap = 1; 1221 return (1); 1222 case ISPR2HST_RIO_16: 1223 *isrp = r2hisr & 0xffff; 1224 *mbox0p = ASYNC_RIO1; 1225 *semap = 1; 1226 return (1); 1227 case ISPR2HST_FPOST: 1228 *isrp = r2hisr & 0xffff; 1229 *mbox0p = ASYNC_CMD_CMPLT; 1230 *semap = 1; 1231 return (1); 1232 case ISPR2HST_FPOST_CTIO: 1233 *isrp = r2hisr & 0xffff; 1234 *mbox0p = ASYNC_CTIO_DONE; 1235 *semap = 1; 1236 return (1); 1237 case ISPR2HST_RSPQ_UPDATE: 1238 *isrp = r2hisr & 0xffff; 1239 *mbox0p = 0; 1240 *semap = 0; 1241 return (1); 1242 default: 1243 hccr = ISP_READ(isp, HCCR); 1244 if (hccr & HCCR_PAUSE) { 1245 ISP_WRITE(isp, HCCR, HCCR_RESET); 1246 isp_prt(isp, ISP_LOGERR, 1247 "RISC paused at interrupt (%x->%x\n", hccr, 1248 ISP_READ(isp, HCCR)); 1249 } else { 1250 isp_prt(isp, ISP_LOGERR, "unknown interrerupt 0x%x\n", 1251 r2hisr); 1252 } 1253 return (0); 1254 } 1255} 1256 1257static uint16_t 1258isp_pci_rd_reg(ispsoftc_t *isp, int regoff) 1259{ 1260 uint16_t rv; 1261 struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp; 1262 int oldconf = 0; 1263 1264 if ((regoff & _BLK_REG_MASK) == SXP_BLOCK) { 1265 /* 1266 * We will assume that someone has paused the RISC processor. 1267 */ 1268 oldconf = BXR2(pcs, IspVirt2Off(isp, BIU_CONF1)); 1269 BXW2(pcs, IspVirt2Off(isp, BIU_CONF1), 1270 oldconf | BIU_PCI_CONF1_SXP); 1271 } 1272 rv = BXR2(pcs, IspVirt2Off(isp, regoff)); 1273 if ((regoff & _BLK_REG_MASK) == SXP_BLOCK) { 1274 BXW2(pcs, IspVirt2Off(isp, BIU_CONF1), oldconf); 1275 } 1276 return (rv); 1277} 1278 1279static void 1280isp_pci_wr_reg(ispsoftc_t *isp, int regoff, uint16_t val) 1281{ 1282 struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp; 1283 int oldconf = 0; 1284 1285 if ((regoff & _BLK_REG_MASK) == SXP_BLOCK) { 1286 /* 1287 * We will assume that someone has paused the RISC processor. 1288 */ 1289 oldconf = BXR2(pcs, IspVirt2Off(isp, BIU_CONF1)); 1290 BXW2(pcs, IspVirt2Off(isp, BIU_CONF1), 1291 oldconf | BIU_PCI_CONF1_SXP); 1292 } 1293 BXW2(pcs, IspVirt2Off(isp, regoff), val); 1294 if ((regoff & _BLK_REG_MASK) == SXP_BLOCK) { 1295 BXW2(pcs, IspVirt2Off(isp, BIU_CONF1), oldconf); 1296 } 1297} 1298 1299static uint16_t 1300isp_pci_rd_reg_1080(ispsoftc_t *isp, int regoff) 1301{ 1302 uint16_t rv, oc = 0; 1303 struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp; 1304 1305 if ((regoff & _BLK_REG_MASK) == SXP_BLOCK || 1306 (regoff & _BLK_REG_MASK) == (SXP_BLOCK|SXP_BANK1_SELECT)) { 1307 uint16_t tc; 1308 /* 1309 * We will assume that someone has paused the RISC processor. 1310 */ 1311 oc = BXR2(pcs, IspVirt2Off(isp, BIU_CONF1)); 1312 tc = oc & ~BIU_PCI1080_CONF1_DMA; 1313 if (regoff & SXP_BANK1_SELECT) 1314 tc |= BIU_PCI1080_CONF1_SXP1; 1315 else 1316 tc |= BIU_PCI1080_CONF1_SXP0; 1317 BXW2(pcs, IspVirt2Off(isp, BIU_CONF1), tc); 1318 } else if ((regoff & _BLK_REG_MASK) == DMA_BLOCK) { 1319 oc = BXR2(pcs, IspVirt2Off(isp, BIU_CONF1)); 1320 BXW2(pcs, IspVirt2Off(isp, BIU_CONF1), 1321 oc | BIU_PCI1080_CONF1_DMA); 1322 } 1323 rv = BXR2(pcs, IspVirt2Off(isp, regoff)); 1324 if (oc) { 1325 BXW2(pcs, IspVirt2Off(isp, BIU_CONF1), oc); 1326 } 1327 return (rv); 1328} 1329 1330static void 1331isp_pci_wr_reg_1080(ispsoftc_t *isp, int regoff, uint16_t val) 1332{ 1333 struct isp_pcisoftc *pcs = (struct isp_pcisoftc *) isp; 1334 int oc = 0; 1335 1336 if ((regoff & _BLK_REG_MASK) == SXP_BLOCK || 1337 (regoff & _BLK_REG_MASK) == (SXP_BLOCK|SXP_BANK1_SELECT)) { 1338 uint16_t tc; 1339 /* 1340 * We will assume that someone has paused the RISC processor. 1341 */ 1342 oc = BXR2(pcs, IspVirt2Off(isp, BIU_CONF1)); 1343 tc = oc & ~BIU_PCI1080_CONF1_DMA; 1344 if (regoff & SXP_BANK1_SELECT) 1345 tc |= BIU_PCI1080_CONF1_SXP1; 1346 else 1347 tc |= BIU_PCI1080_CONF1_SXP0; 1348 BXW2(pcs, IspVirt2Off(isp, BIU_CONF1), tc); 1349 } else if ((regoff & _BLK_REG_MASK) == DMA_BLOCK) { 1350 oc = BXR2(pcs, IspVirt2Off(isp, BIU_CONF1)); 1351 BXW2(pcs, IspVirt2Off(isp, BIU_CONF1), 1352 oc | BIU_PCI1080_CONF1_DMA); 1353 } 1354 BXW2(pcs, IspVirt2Off(isp, regoff), val); 1355 if (oc) { 1356 BXW2(pcs, IspVirt2Off(isp, BIU_CONF1), oc); 1357 } 1358} 1359 1360 1361struct imush { 1362 ispsoftc_t *isp; 1363 int error; 1364}; 1365 1366static void imc(void *, bus_dma_segment_t *, int, int); 1367 1368static void 1369imc(void *arg, bus_dma_segment_t *segs, int nseg, int error) 1370{ 1371 struct imush *imushp = (struct imush *) arg; 1372 if (error) { 1373 imushp->error = error; 1374 } else { 1375 ispsoftc_t *isp =imushp->isp; 1376 bus_addr_t addr = segs->ds_addr; 1377 1378 isp->isp_rquest_dma = addr; 1379 addr += ISP_QUEUE_SIZE(RQUEST_QUEUE_LEN(isp)); 1380 isp->isp_result_dma = addr; 1381 if (IS_FC(isp)) { 1382 addr += ISP_QUEUE_SIZE(RESULT_QUEUE_LEN(isp)); 1383 FCPARAM(isp)->isp_scdma = addr; 1384 } 1385 } 1386} 1387 1388/* 1389 * Should be BUS_SPACE_MAXSIZE, but MAXPHYS is larger than BUS_SPACE_MAXSIZE 1390 */ 1391#define ISP_NSEGS ((MAXPHYS / PAGE_SIZE) + 1) 1392 1393#if __FreeBSD_version < 500000 1394#define isp_dma_tag_create bus_dma_tag_create 1395#else 1396#define isp_dma_tag_create(a, b, c, d, e, f, g, h, i, j, k, z) \ 1397 bus_dma_tag_create(a, b, c, d, e, f, g, h, i, j, k, \ 1398 busdma_lock_mutex, &Giant, z) 1399#endif 1400 1401static int 1402isp_pci_mbxdma(ispsoftc_t *isp) 1403{ 1404 struct isp_pcisoftc *pcs = (struct isp_pcisoftc *)isp; 1405 caddr_t base; 1406 uint32_t len; 1407 int i, error, ns; 1408 bus_size_t slim; /* segment size */ 1409 bus_addr_t llim; /* low limit of unavailable dma */ 1410 bus_addr_t hlim; /* high limit of unavailable dma */ 1411 struct imush im; 1412 1413 /* 1414 * Already been here? If so, leave... 1415 */ 1416 if (isp->isp_rquest) { 1417 return (0); 1418 } 1419 1420 hlim = BUS_SPACE_MAXADDR; 1421 if (IS_ULTRA2(isp) || IS_FC(isp) || IS_1240(isp)) { 1422 slim = (bus_size_t) (1ULL << 32); 1423 llim = BUS_SPACE_MAXADDR; 1424 } else { 1425 llim = BUS_SPACE_MAXADDR_32BIT; 1426 slim = (1 << 24); 1427 } 1428 1429 /* 1430 * XXX: We don't really support 64 bit target mode for parallel scsi yet 1431 */ 1432#ifdef ISP_TARGET_MODE 1433 if (IS_SCSI(isp) && sizeof (bus_addr_t) > 4) { 1434 isp_prt(isp, ISP_LOGERR, "we cannot do DAC for SPI cards yet"); 1435 return (1); 1436 } 1437#endif 1438 1439 ISP_UNLOCK(isp); 1440 if (isp_dma_tag_create(NULL, 1, slim, llim, hlim, 1441 NULL, NULL, BUS_SPACE_MAXSIZE, ISP_NSEGS, slim, 0, &pcs->dmat)) { 1442 isp_prt(isp, ISP_LOGERR, "could not create master dma tag"); 1443 ISP_LOCK(isp); 1444 return (1); 1445 } 1446 1447 1448 len = sizeof (XS_T **) * isp->isp_maxcmds; 1449 isp->isp_xflist = (XS_T **) malloc(len, M_DEVBUF, M_WAITOK | M_ZERO); 1450 if (isp->isp_xflist == NULL) { 1451 isp_prt(isp, ISP_LOGERR, "cannot alloc xflist array"); 1452 ISP_LOCK(isp); 1453 return (1); 1454 } 1455#ifdef ISP_TARGET_MODE 1456 len = sizeof (void **) * isp->isp_maxcmds; 1457 isp->isp_tgtlist = (void **) malloc(len, M_DEVBUF, M_WAITOK | M_ZERO); 1458 if (isp->isp_tgtlist == NULL) { 1459 isp_prt(isp, ISP_LOGERR, "cannot alloc tgtlist array"); 1460 ISP_LOCK(isp); 1461 return (1); 1462 } 1463#endif 1464 len = sizeof (bus_dmamap_t) * isp->isp_maxcmds; 1465 pcs->dmaps = (bus_dmamap_t *) malloc(len, M_DEVBUF, M_WAITOK); 1466 if (pcs->dmaps == NULL) { 1467 isp_prt(isp, ISP_LOGERR, "can't alloc dma map storage"); 1468 free(isp->isp_xflist, M_DEVBUF); 1469#ifdef ISP_TARGET_MODE 1470 free(isp->isp_tgtlist, M_DEVBUF); 1471#endif 1472 ISP_LOCK(isp); 1473 return (1); 1474 } 1475 1476 /* 1477 * Allocate and map the request, result queues, plus FC scratch area. 1478 */ 1479 len = ISP_QUEUE_SIZE(RQUEST_QUEUE_LEN(isp)); 1480 len += ISP_QUEUE_SIZE(RESULT_QUEUE_LEN(isp)); 1481 if (IS_FC(isp)) { 1482 len += ISP2100_SCRLEN; 1483 } 1484 1485 ns = (len / PAGE_SIZE) + 1; 1486 /* 1487 * Create a tag for the control spaces- force it to within 32 bits. 1488 */ 1489 if (isp_dma_tag_create(pcs->dmat, QENTRY_LEN, slim, 1490 BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, 1491 NULL, NULL, len, ns, slim, 0, &isp->isp_cdmat)) { 1492 isp_prt(isp, ISP_LOGERR, 1493 "cannot create a dma tag for control spaces"); 1494 free(pcs->dmaps, M_DEVBUF); 1495 free(isp->isp_xflist, M_DEVBUF); 1496#ifdef ISP_TARGET_MODE 1497 free(isp->isp_tgtlist, M_DEVBUF); 1498#endif 1499 ISP_LOCK(isp); 1500 return (1); 1501 } 1502 1503 if (bus_dmamem_alloc(isp->isp_cdmat, (void **)&base, BUS_DMA_NOWAIT, 1504 &isp->isp_cdmap) != 0) { 1505 isp_prt(isp, ISP_LOGERR, 1506 "cannot allocate %d bytes of CCB memory", len); 1507 bus_dma_tag_destroy(isp->isp_cdmat); 1508 free(isp->isp_xflist, M_DEVBUF); 1509#ifdef ISP_TARGET_MODE 1510 free(isp->isp_tgtlist, M_DEVBUF); 1511#endif 1512 free(pcs->dmaps, M_DEVBUF); 1513 ISP_LOCK(isp); 1514 return (1); 1515 } 1516 1517 for (i = 0; i < isp->isp_maxcmds; i++) { 1518 error = bus_dmamap_create(pcs->dmat, 0, &pcs->dmaps[i]); 1519 if (error) { 1520 isp_prt(isp, ISP_LOGERR, 1521 "error %d creating per-cmd DMA maps", error); 1522 while (--i >= 0) { 1523 bus_dmamap_destroy(pcs->dmat, pcs->dmaps[i]); 1524 } 1525 goto bad; 1526 } 1527 } 1528 1529 im.isp = isp; 1530 im.error = 0; 1531 bus_dmamap_load(isp->isp_cdmat, isp->isp_cdmap, base, len, imc, &im, 0); 1532 if (im.error) { 1533 isp_prt(isp, ISP_LOGERR, 1534 "error %d loading dma map for control areas", im.error); 1535 goto bad; 1536 } 1537 1538 isp->isp_rquest = base; 1539 base += ISP_QUEUE_SIZE(RQUEST_QUEUE_LEN(isp)); 1540 isp->isp_result = base; 1541 if (IS_FC(isp)) { 1542 base += ISP_QUEUE_SIZE(RESULT_QUEUE_LEN(isp)); 1543 FCPARAM(isp)->isp_scratch = base; 1544 } 1545 ISP_LOCK(isp); 1546 return (0); 1547 1548bad: 1549 bus_dmamem_free(isp->isp_cdmat, base, isp->isp_cdmap); 1550 bus_dma_tag_destroy(isp->isp_cdmat); 1551 free(isp->isp_xflist, M_DEVBUF); 1552#ifdef ISP_TARGET_MODE 1553 free(isp->isp_tgtlist, M_DEVBUF); 1554#endif 1555 free(pcs->dmaps, M_DEVBUF); 1556 ISP_LOCK(isp); 1557 isp->isp_rquest = NULL; 1558 return (1); 1559} 1560 1561typedef struct { 1562 ispsoftc_t *isp; 1563 void *cmd_token; 1564 void *rq; 1565 uint16_t *nxtip; 1566 uint16_t optr; 1567 int error; 1568} mush_t; 1569 1570#define MUSHERR_NOQENTRIES -2 1571 1572#ifdef ISP_TARGET_MODE 1573/* 1574 * We need to handle DMA for target mode differently from initiator mode. 1575 * 1576 * DMA mapping and construction and submission of CTIO Request Entries 1577 * and rendevous for completion are very tightly coupled because we start 1578 * out by knowing (per platform) how much data we have to move, but we 1579 * don't know, up front, how many DMA mapping segments will have to be used 1580 * cover that data, so we don't know how many CTIO Request Entries we 1581 * will end up using. Further, for performance reasons we may want to 1582 * (on the last CTIO for Fibre Channel), send status too (if all went well). 1583 * 1584 * The standard vector still goes through isp_pci_dmasetup, but the callback 1585 * for the DMA mapping routines comes here instead with the whole transfer 1586 * mapped and a pointer to a partially filled in already allocated request 1587 * queue entry. We finish the job. 1588 */ 1589static void tdma_mk(void *, bus_dma_segment_t *, int, int); 1590static void tdma_mkfc(void *, bus_dma_segment_t *, int, int); 1591 1592#define STATUS_WITH_DATA 1 1593 1594static void 1595tdma_mk(void *arg, bus_dma_segment_t *dm_segs, int nseg, int error) 1596{ 1597 mush_t *mp; 1598 struct ccb_scsiio *csio; 1599 ispsoftc_t *isp; 1600 struct isp_pcisoftc *pcs; 1601 bus_dmamap_t *dp; 1602 ct_entry_t *cto, *qe; 1603 uint8_t scsi_status; 1604 uint16_t curi, nxti, handle; 1605 uint32_t sflags; 1606 int32_t resid; 1607 int nth_ctio, nctios, send_status; 1608 1609 mp = (mush_t *) arg; 1610 if (error) { 1611 mp->error = error; 1612 return; 1613 } 1614 1615 isp = mp->isp; 1616 csio = mp->cmd_token; 1617 cto = mp->rq; 1618 curi = isp->isp_reqidx; 1619 qe = (ct_entry_t *) ISP_QUEUE_ENTRY(isp->isp_rquest, curi); 1620 1621 cto->ct_xfrlen = 0; 1622 cto->ct_seg_count = 0; 1623 cto->ct_header.rqs_entry_count = 1; 1624 MEMZERO(cto->ct_dataseg, sizeof(cto->ct_dataseg)); 1625 1626 if (nseg == 0) { 1627 cto->ct_header.rqs_seqno = 1; 1628 isp_prt(isp, ISP_LOGTDEBUG1, 1629 "CTIO[%x] lun%d iid%d tag %x flgs %x sts %x ssts %x res %d", 1630 cto->ct_fwhandle, csio->ccb_h.target_lun, cto->ct_iid, 1631 cto->ct_tag_val, cto->ct_flags, cto->ct_status, 1632 cto->ct_scsi_status, cto->ct_resid); 1633 ISP_TDQE(isp, "tdma_mk[no data]", curi, cto); 1634 isp_put_ctio(isp, cto, qe); 1635 return; 1636 } 1637 1638 nctios = nseg / ISP_RQDSEG; 1639 if (nseg % ISP_RQDSEG) { 1640 nctios++; 1641 } 1642 1643 /* 1644 * Save syshandle, and potentially any SCSI status, which we'll 1645 * reinsert on the last CTIO we're going to send. 1646 */ 1647 1648 handle = cto->ct_syshandle; 1649 cto->ct_syshandle = 0; 1650 cto->ct_header.rqs_seqno = 0; 1651 send_status = (cto->ct_flags & CT_SENDSTATUS) != 0; 1652 1653 if (send_status) { 1654 sflags = cto->ct_flags & (CT_SENDSTATUS | CT_CCINCR); 1655 cto->ct_flags &= ~(CT_SENDSTATUS | CT_CCINCR); 1656 /* 1657 * Preserve residual. 1658 */ 1659 resid = cto->ct_resid; 1660 1661 /* 1662 * Save actual SCSI status. 1663 */ 1664 scsi_status = cto->ct_scsi_status; 1665 1666#ifndef STATUS_WITH_DATA 1667 sflags |= CT_NO_DATA; 1668 /* 1669 * We can't do a status at the same time as a data CTIO, so 1670 * we need to synthesize an extra CTIO at this level. 1671 */ 1672 nctios++; 1673#endif 1674 } else { 1675 sflags = scsi_status = resid = 0; 1676 } 1677 1678 cto->ct_resid = 0; 1679 cto->ct_scsi_status = 0; 1680 1681 pcs = (struct isp_pcisoftc *)isp; 1682 dp = &pcs->dmaps[isp_handle_index(handle)]; 1683 if ((csio->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) { 1684 bus_dmamap_sync(pcs->dmat, *dp, BUS_DMASYNC_PREREAD); 1685 } else { 1686 bus_dmamap_sync(pcs->dmat, *dp, BUS_DMASYNC_PREWRITE); 1687 } 1688 1689 nxti = *mp->nxtip; 1690 1691 for (nth_ctio = 0; nth_ctio < nctios; nth_ctio++) { 1692 int seglim; 1693 1694 seglim = nseg; 1695 if (seglim) { 1696 int seg; 1697 1698 if (seglim > ISP_RQDSEG) 1699 seglim = ISP_RQDSEG; 1700 1701 for (seg = 0; seg < seglim; seg++, nseg--) { 1702 /* 1703 * Unlike normal initiator commands, we don't 1704 * do any swizzling here. 1705 */ 1706 cto->ct_dataseg[seg].ds_count = dm_segs->ds_len; 1707 cto->ct_dataseg[seg].ds_base = dm_segs->ds_addr; 1708 cto->ct_xfrlen += dm_segs->ds_len; 1709 dm_segs++; 1710 } 1711 cto->ct_seg_count = seg; 1712 } else { 1713 /* 1714 * This case should only happen when we're sending an 1715 * extra CTIO with final status. 1716 */ 1717 if (send_status == 0) { 1718 isp_prt(isp, ISP_LOGWARN, 1719 "tdma_mk ran out of segments"); 1720 mp->error = EINVAL; 1721 return; 1722 } 1723 } 1724 1725 /* 1726 * At this point, the fields ct_lun, ct_iid, ct_tagval, 1727 * ct_tagtype, and ct_timeout have been carried over 1728 * unchanged from what our caller had set. 1729 * 1730 * The dataseg fields and the seg_count fields we just got 1731 * through setting. The data direction we've preserved all 1732 * along and only clear it if we're now sending status. 1733 */ 1734 1735 if (nth_ctio == nctios - 1) { 1736 /* 1737 * We're the last in a sequence of CTIOs, so mark 1738 * this CTIO and save the handle to the CCB such that 1739 * when this CTIO completes we can free dma resources 1740 * and do whatever else we need to do to finish the 1741 * rest of the command. We *don't* give this to the 1742 * firmware to work on- the caller will do that. 1743 */ 1744 1745 cto->ct_syshandle = handle; 1746 cto->ct_header.rqs_seqno = 1; 1747 1748 if (send_status) { 1749 cto->ct_scsi_status = scsi_status; 1750 cto->ct_flags |= sflags; 1751 cto->ct_resid = resid; 1752 } 1753 if (send_status) { 1754 isp_prt(isp, ISP_LOGTDEBUG1, 1755 "CTIO[%x] lun%d iid %d tag %x ct_flags %x " 1756 "scsi status %x resid %d", 1757 cto->ct_fwhandle, csio->ccb_h.target_lun, 1758 cto->ct_iid, cto->ct_tag_val, cto->ct_flags, 1759 cto->ct_scsi_status, cto->ct_resid); 1760 } else { 1761 isp_prt(isp, ISP_LOGTDEBUG1, 1762 "CTIO[%x] lun%d iid%d tag %x ct_flags 0x%x", 1763 cto->ct_fwhandle, csio->ccb_h.target_lun, 1764 cto->ct_iid, cto->ct_tag_val, 1765 cto->ct_flags); 1766 } 1767 isp_put_ctio(isp, cto, qe); 1768 ISP_TDQE(isp, "last tdma_mk", curi, cto); 1769 if (nctios > 1) { 1770 MEMORYBARRIER(isp, SYNC_REQUEST, 1771 curi, QENTRY_LEN); 1772 } 1773 } else { 1774 ct_entry_t *oqe = qe; 1775 1776 /* 1777 * Make sure syshandle fields are clean 1778 */ 1779 cto->ct_syshandle = 0; 1780 cto->ct_header.rqs_seqno = 0; 1781 1782 isp_prt(isp, ISP_LOGTDEBUG1, 1783 "CTIO[%x] lun%d for ID%d ct_flags 0x%x", 1784 cto->ct_fwhandle, csio->ccb_h.target_lun, 1785 cto->ct_iid, cto->ct_flags); 1786 1787 /* 1788 * Get a new CTIO 1789 */ 1790 qe = (ct_entry_t *) 1791 ISP_QUEUE_ENTRY(isp->isp_rquest, nxti); 1792 nxti = ISP_NXT_QENTRY(nxti, RQUEST_QUEUE_LEN(isp)); 1793 if (nxti == mp->optr) { 1794 isp_prt(isp, ISP_LOGTDEBUG0, 1795 "Queue Overflow in tdma_mk"); 1796 mp->error = MUSHERR_NOQENTRIES; 1797 return; 1798 } 1799 1800 /* 1801 * Now that we're done with the old CTIO, 1802 * flush it out to the request queue. 1803 */ 1804 ISP_TDQE(isp, "dma_tgt_fc", curi, cto); 1805 isp_put_ctio(isp, cto, oqe); 1806 if (nth_ctio != 0) { 1807 MEMORYBARRIER(isp, SYNC_REQUEST, curi, 1808 QENTRY_LEN); 1809 } 1810 curi = ISP_NXT_QENTRY(curi, RQUEST_QUEUE_LEN(isp)); 1811 1812 /* 1813 * Reset some fields in the CTIO so we can reuse 1814 * for the next one we'll flush to the request 1815 * queue. 1816 */ 1817 cto->ct_header.rqs_entry_type = RQSTYPE_CTIO; 1818 cto->ct_header.rqs_entry_count = 1; 1819 cto->ct_header.rqs_flags = 0; 1820 cto->ct_status = 0; 1821 cto->ct_scsi_status = 0; 1822 cto->ct_xfrlen = 0; 1823 cto->ct_resid = 0; 1824 cto->ct_seg_count = 0; 1825 MEMZERO(cto->ct_dataseg, sizeof(cto->ct_dataseg)); 1826 } 1827 } 1828 *mp->nxtip = nxti; 1829} 1830 1831/* 1832 * We don't have to do multiple CTIOs here. Instead, we can just do 1833 * continuation segments as needed. This greatly simplifies the code 1834 * improves performance. 1835 */ 1836 1837static void 1838tdma_mkfc(void *arg, bus_dma_segment_t *dm_segs, int nseg, int error) 1839{ 1840 mush_t *mp; 1841 struct ccb_scsiio *csio; 1842 ispsoftc_t *isp; 1843 ct2_entry_t *cto, *qe; 1844 uint16_t curi, nxti; 1845 ispds_t *ds; 1846 ispds64_t *ds64; 1847 int segcnt, seglim; 1848 1849 mp = (mush_t *) arg; 1850 if (error) { 1851 mp->error = error; 1852 return; 1853 } 1854 1855 isp = mp->isp; 1856 csio = mp->cmd_token; 1857 cto = mp->rq; 1858 1859 curi = isp->isp_reqidx; 1860 qe = (ct2_entry_t *) ISP_QUEUE_ENTRY(isp->isp_rquest, curi); 1861 1862 if (nseg == 0) { 1863 if ((cto->ct_flags & CT2_FLAG_MMASK) != CT2_FLAG_MODE1) { 1864 isp_prt(isp, ISP_LOGWARN, 1865 "dma2_tgt_fc, a status CTIO2 without MODE1 " 1866 "set (0x%x)", cto->ct_flags); 1867 mp->error = EINVAL; 1868 return; 1869 } 1870 /* 1871 * We preserve ct_lun, ct_iid, ct_rxid. We set the data 1872 * flags to NO DATA and clear relative offset flags. 1873 * We preserve the ct_resid and the response area. 1874 */ 1875 cto->ct_header.rqs_seqno = 1; 1876 cto->ct_seg_count = 0; 1877 cto->ct_reloff = 0; 1878 isp_prt(isp, ISP_LOGTDEBUG1, 1879 "CTIO2[%x] lun %d->iid%d flgs 0x%x sts 0x%x ssts " 1880 "0x%x res %d", cto->ct_rxid, csio->ccb_h.target_lun, 1881 cto->ct_iid, cto->ct_flags, cto->ct_status, 1882 cto->rsp.m1.ct_scsi_status, cto->ct_resid); 1883 if (IS_2KLOGIN(isp)) { 1884 isp_put_ctio2e(isp, 1885 (ct2e_entry_t *)cto, (ct2e_entry_t *)qe); 1886 } else { 1887 isp_put_ctio2(isp, cto, qe); 1888 } 1889 ISP_TDQE(isp, "dma2_tgt_fc[no data]", curi, qe); 1890 return; 1891 } 1892 1893 if ((cto->ct_flags & CT2_FLAG_MMASK) != CT2_FLAG_MODE0) { 1894 isp_prt(isp, ISP_LOGERR, 1895 "dma2_tgt_fc, a data CTIO2 without MODE0 set " 1896 "(0x%x)", cto->ct_flags); 1897 mp->error = EINVAL; 1898 return; 1899 } 1900 1901 1902 nxti = *mp->nxtip; 1903 1904 /* 1905 * Check to see if we need to DAC addressing or not. 1906 * 1907 * Any address that's over the 4GB boundary causes this 1908 * to happen. 1909 */ 1910 segcnt = nseg; 1911 if (sizeof (bus_addr_t) > 4) { 1912 for (segcnt = 0; segcnt < nseg; segcnt++) { 1913 uint64_t addr = dm_segs[segcnt].ds_addr; 1914 if (addr >= 0x100000000LL) { 1915 break; 1916 } 1917 } 1918 } 1919 if (segcnt != nseg) { 1920 cto->ct_header.rqs_entry_type = RQSTYPE_CTIO3; 1921 seglim = ISP_RQDSEG_T3; 1922 ds64 = &cto->rsp.m0.ct_dataseg64[0]; 1923 ds = NULL; 1924 } else { 1925 seglim = ISP_RQDSEG_T2; 1926 ds64 = NULL; 1927 ds = &cto->rsp.m0.ct_dataseg[0]; 1928 } 1929 cto->ct_seg_count = 0; 1930 1931 /* 1932 * Set up the CTIO2 data segments. 1933 */ 1934 for (segcnt = 0; cto->ct_seg_count < seglim && segcnt < nseg; 1935 cto->ct_seg_count++, segcnt++) { 1936 if (ds64) { 1937 ds64->ds_basehi = 1938 ((uint64_t) (dm_segs[segcnt].ds_addr) >> 32); 1939 ds64->ds_base = dm_segs[segcnt].ds_addr; 1940 ds64->ds_count = dm_segs[segcnt].ds_len; 1941 ds64++; 1942 } else { 1943 ds->ds_base = dm_segs[segcnt].ds_addr; 1944 ds->ds_count = dm_segs[segcnt].ds_len; 1945 ds++; 1946 } 1947 cto->rsp.m0.ct_xfrlen += dm_segs[segcnt].ds_len; 1948#if __FreeBSD_version < 500000 1949 isp_prt(isp, ISP_LOGTDEBUG1, 1950 "isp_send_ctio2: ent0[%d]0x%llx:%llu", 1951 cto->ct_seg_count, (uint64_t)dm_segs[segcnt].ds_addr, 1952 (uint64_t)dm_segs[segcnt].ds_len); 1953#else 1954 isp_prt(isp, ISP_LOGTDEBUG1, 1955 "isp_send_ctio2: ent0[%d]0x%jx:%ju", 1956 cto->ct_seg_count, (uintmax_t)dm_segs[segcnt].ds_addr, 1957 (uintmax_t)dm_segs[segcnt].ds_len); 1958#endif 1959 } 1960 1961 while (segcnt < nseg) { 1962 uint16_t curip; 1963 int seg; 1964 ispcontreq_t local, *crq = &local, *qep; 1965 1966 qep = (ispcontreq_t *) ISP_QUEUE_ENTRY(isp->isp_rquest, nxti); 1967 curip = nxti; 1968 nxti = ISP_NXT_QENTRY(curip, RQUEST_QUEUE_LEN(isp)); 1969 if (nxti == mp->optr) { 1970 ISP_UNLOCK(isp); 1971 isp_prt(isp, ISP_LOGTDEBUG0, 1972 "tdma_mkfc: request queue overflow"); 1973 mp->error = MUSHERR_NOQENTRIES; 1974 return; 1975 } 1976 cto->ct_header.rqs_entry_count++; 1977 MEMZERO((void *)crq, sizeof (*crq)); 1978 crq->req_header.rqs_entry_count = 1; 1979 if (cto->ct_header.rqs_entry_type == RQSTYPE_CTIO3) { 1980 seglim = ISP_CDSEG64; 1981 ds = NULL; 1982 ds64 = &((ispcontreq64_t *)crq)->req_dataseg[0]; 1983 crq->req_header.rqs_entry_type = RQSTYPE_A64_CONT; 1984 } else { 1985 seglim = ISP_CDSEG; 1986 ds = &crq->req_dataseg[0]; 1987 ds64 = NULL; 1988 crq->req_header.rqs_entry_type = RQSTYPE_DATASEG; 1989 } 1990 for (seg = 0; segcnt < nseg && seg < seglim; 1991 segcnt++, seg++) { 1992 if (ds64) { 1993 ds64->ds_basehi = 1994 ((uint64_t) (dm_segs[segcnt].ds_addr) >> 32); 1995 ds64->ds_base = dm_segs[segcnt].ds_addr; 1996 ds64->ds_count = dm_segs[segcnt].ds_len; 1997 ds64++; 1998 } else { 1999 ds->ds_base = dm_segs[segcnt].ds_addr; 2000 ds->ds_count = dm_segs[segcnt].ds_len; 2001 ds++; 2002 } 2003#if __FreeBSD_version < 500000 2004 isp_prt(isp, ISP_LOGTDEBUG1, 2005 "isp_send_ctio2: ent%d[%d]%llx:%llu", 2006 cto->ct_header.rqs_entry_count-1, seg, 2007 (uint64_t)dm_segs[segcnt].ds_addr, 2008 (uint64_t)dm_segs[segcnt].ds_len); 2009#else 2010 isp_prt(isp, ISP_LOGTDEBUG1, 2011 "isp_send_ctio2: ent%d[%d]%jx:%ju", 2012 cto->ct_header.rqs_entry_count-1, seg, 2013 (uintmax_t)dm_segs[segcnt].ds_addr, 2014 (uintmax_t)dm_segs[segcnt].ds_len); 2015#endif 2016 cto->rsp.m0.ct_xfrlen += dm_segs[segcnt].ds_len; 2017 cto->ct_seg_count++; 2018 } 2019 MEMORYBARRIER(isp, SYNC_REQUEST, curip, QENTRY_LEN); 2020 isp_put_cont_req(isp, crq, qep); 2021 ISP_TDQE(isp, "cont entry", curi, qep); 2022 } 2023 2024 /* 2025 * No do final twiddling for the CTIO itself. 2026 */ 2027 cto->ct_header.rqs_seqno = 1; 2028 isp_prt(isp, ISP_LOGTDEBUG1, 2029 "CTIO2[%x] lun %d->iid%d flgs 0x%x sts 0x%x ssts 0x%x resid %d", 2030 cto->ct_rxid, csio->ccb_h.target_lun, (int) cto->ct_iid, 2031 cto->ct_flags, cto->ct_status, cto->rsp.m1.ct_scsi_status, 2032 cto->ct_resid); 2033 if (IS_2KLOGIN(isp)) 2034 isp_put_ctio2e(isp, (ct2e_entry_t *)cto, (ct2e_entry_t *)qe); 2035 else 2036 isp_put_ctio2(isp, cto, qe); 2037 ISP_TDQE(isp, "last dma2_tgt_fc", curi, qe); 2038 *mp->nxtip = nxti; 2039} 2040#endif 2041 2042static void dma2_a64(void *, bus_dma_segment_t *, int, int); 2043static void dma2(void *, bus_dma_segment_t *, int, int); 2044 2045static void 2046dma2_a64(void *arg, bus_dma_segment_t *dm_segs, int nseg, int error) 2047{ 2048 mush_t *mp; 2049 ispsoftc_t *isp; 2050 struct ccb_scsiio *csio; 2051 struct isp_pcisoftc *pcs; 2052 bus_dmamap_t *dp; 2053 bus_dma_segment_t *eseg; 2054 ispreq64_t *rq; 2055 int seglim, datalen; 2056 uint16_t nxti; 2057 2058 mp = (mush_t *) arg; 2059 if (error) { 2060 mp->error = error; 2061 return; 2062 } 2063 2064 if (nseg < 1) { 2065 isp_prt(mp->isp, ISP_LOGERR, "bad segment count (%d)", nseg); 2066 mp->error = EFAULT; 2067 return; 2068 } 2069 csio = mp->cmd_token; 2070 isp = mp->isp; 2071 rq = mp->rq; 2072 pcs = (struct isp_pcisoftc *)mp->isp; 2073 dp = &pcs->dmaps[isp_handle_index(rq->req_handle)]; 2074 nxti = *mp->nxtip; 2075 2076 if ((csio->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) { 2077 bus_dmamap_sync(pcs->dmat, *dp, BUS_DMASYNC_PREREAD); 2078 } else { 2079 bus_dmamap_sync(pcs->dmat, *dp, BUS_DMASYNC_PREWRITE); 2080 } 2081 datalen = XS_XFRLEN(csio); 2082 2083 /* 2084 * We're passed an initial partially filled in entry that 2085 * has most fields filled in except for data transfer 2086 * related values. 2087 * 2088 * Our job is to fill in the initial request queue entry and 2089 * then to start allocating and filling in continuation entries 2090 * until we've covered the entire transfer. 2091 */ 2092 2093 if (IS_FC(isp)) { 2094 rq->req_header.rqs_entry_type = RQSTYPE_T3RQS; 2095 seglim = ISP_RQDSEG_T3; 2096 ((ispreqt3_t *)rq)->req_totalcnt = datalen; 2097 if ((csio->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) { 2098 ((ispreqt3_t *)rq)->req_flags |= REQFLAG_DATA_IN; 2099 } else { 2100 ((ispreqt3_t *)rq)->req_flags |= REQFLAG_DATA_OUT; 2101 } 2102 } else { 2103 rq->req_header.rqs_entry_type = RQSTYPE_A64; 2104 if (csio->cdb_len > 12) { 2105 seglim = 0; 2106 } else { 2107 seglim = ISP_RQDSEG_A64; 2108 } 2109 if ((csio->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) { 2110 rq->req_flags |= REQFLAG_DATA_IN; 2111 } else { 2112 rq->req_flags |= REQFLAG_DATA_OUT; 2113 } 2114 } 2115 2116 eseg = dm_segs + nseg; 2117 2118 while (datalen != 0 && rq->req_seg_count < seglim && dm_segs != eseg) { 2119 if (IS_FC(isp)) { 2120 ispreqt3_t *rq3 = (ispreqt3_t *)rq; 2121 rq3->req_dataseg[rq3->req_seg_count].ds_base = 2122 DMA_LO32(dm_segs->ds_addr); 2123 rq3->req_dataseg[rq3->req_seg_count].ds_basehi = 2124 DMA_HI32(dm_segs->ds_addr); 2125 rq3->req_dataseg[rq3->req_seg_count].ds_count = 2126 dm_segs->ds_len; 2127 } else { 2128 rq->req_dataseg[rq->req_seg_count].ds_base = 2129 DMA_LO32(dm_segs->ds_addr); 2130 rq->req_dataseg[rq->req_seg_count].ds_basehi = 2131 DMA_HI32(dm_segs->ds_addr); 2132 rq->req_dataseg[rq->req_seg_count].ds_count = 2133 dm_segs->ds_len; 2134 } 2135 datalen -= dm_segs->ds_len; 2136 rq->req_seg_count++; 2137 dm_segs++; 2138 } 2139 2140 while (datalen > 0 && dm_segs != eseg) { 2141 uint16_t onxti; 2142 ispcontreq64_t local, *crq = &local, *cqe; 2143 2144 cqe = (ispcontreq64_t *) ISP_QUEUE_ENTRY(isp->isp_rquest, nxti); 2145 onxti = nxti; 2146 nxti = ISP_NXT_QENTRY(onxti, RQUEST_QUEUE_LEN(isp)); 2147 if (nxti == mp->optr) { 2148 isp_prt(isp, ISP_LOGDEBUG0, "Request Queue Overflow++"); 2149 mp->error = MUSHERR_NOQENTRIES; 2150 return; 2151 } 2152 rq->req_header.rqs_entry_count++; 2153 MEMZERO((void *)crq, sizeof (*crq)); 2154 crq->req_header.rqs_entry_count = 1; 2155 crq->req_header.rqs_entry_type = RQSTYPE_A64_CONT; 2156 2157 seglim = 0; 2158 while (datalen > 0 && seglim < ISP_CDSEG64 && dm_segs != eseg) { 2159 crq->req_dataseg[seglim].ds_base = 2160 DMA_LO32(dm_segs->ds_addr); 2161 crq->req_dataseg[seglim].ds_basehi = 2162 DMA_HI32(dm_segs->ds_addr); 2163 crq->req_dataseg[seglim].ds_count = 2164 dm_segs->ds_len; 2165 rq->req_seg_count++; 2166 dm_segs++; 2167 seglim++; 2168 datalen -= dm_segs->ds_len; 2169 } 2170 isp_put_cont64_req(isp, crq, cqe); 2171 MEMORYBARRIER(isp, SYNC_REQUEST, onxti, QENTRY_LEN); 2172 } 2173 *mp->nxtip = nxti; 2174} 2175 2176static void 2177dma2(void *arg, bus_dma_segment_t *dm_segs, int nseg, int error) 2178{ 2179 mush_t *mp; 2180 ispsoftc_t *isp; 2181 struct ccb_scsiio *csio; 2182 struct isp_pcisoftc *pcs; 2183 bus_dmamap_t *dp; 2184 bus_dma_segment_t *eseg; 2185 ispreq_t *rq; 2186 int seglim, datalen; 2187 uint16_t nxti; 2188 2189 mp = (mush_t *) arg; 2190 if (error) { 2191 mp->error = error; 2192 return; 2193 } 2194 2195 if (nseg < 1) { 2196 isp_prt(mp->isp, ISP_LOGERR, "bad segment count (%d)", nseg); 2197 mp->error = EFAULT; 2198 return; 2199 } 2200 csio = mp->cmd_token; 2201 isp = mp->isp; 2202 rq = mp->rq; 2203 pcs = (struct isp_pcisoftc *)mp->isp; 2204 dp = &pcs->dmaps[isp_handle_index(rq->req_handle)]; 2205 nxti = *mp->nxtip; 2206 2207 if ((csio->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) { 2208 bus_dmamap_sync(pcs->dmat, *dp, BUS_DMASYNC_PREREAD); 2209 } else { 2210 bus_dmamap_sync(pcs->dmat, *dp, BUS_DMASYNC_PREWRITE); 2211 } 2212 2213 datalen = XS_XFRLEN(csio); 2214 2215 /* 2216 * We're passed an initial partially filled in entry that 2217 * has most fields filled in except for data transfer 2218 * related values. 2219 * 2220 * Our job is to fill in the initial request queue entry and 2221 * then to start allocating and filling in continuation entries 2222 * until we've covered the entire transfer. 2223 */ 2224 2225 if (IS_FC(isp)) { 2226 seglim = ISP_RQDSEG_T2; 2227 ((ispreqt2_t *)rq)->req_totalcnt = datalen; 2228 if ((csio->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) { 2229 ((ispreqt2_t *)rq)->req_flags |= REQFLAG_DATA_IN; 2230 } else { 2231 ((ispreqt2_t *)rq)->req_flags |= REQFLAG_DATA_OUT; 2232 } 2233 } else { 2234 if (csio->cdb_len > 12) { 2235 seglim = 0; 2236 } else { 2237 seglim = ISP_RQDSEG; 2238 } 2239 if ((csio->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) { 2240 rq->req_flags |= REQFLAG_DATA_IN; 2241 } else { 2242 rq->req_flags |= REQFLAG_DATA_OUT; 2243 } 2244 } 2245 2246 eseg = dm_segs + nseg; 2247 2248 while (datalen != 0 && rq->req_seg_count < seglim && dm_segs != eseg) { 2249 if (IS_FC(isp)) { 2250 ispreqt2_t *rq2 = (ispreqt2_t *)rq; 2251 rq2->req_dataseg[rq2->req_seg_count].ds_base = 2252 DMA_LO32(dm_segs->ds_addr); 2253 rq2->req_dataseg[rq2->req_seg_count].ds_count = 2254 dm_segs->ds_len; 2255 } else { 2256 rq->req_dataseg[rq->req_seg_count].ds_base = 2257 DMA_LO32(dm_segs->ds_addr); 2258 rq->req_dataseg[rq->req_seg_count].ds_count = 2259 dm_segs->ds_len; 2260 } 2261 datalen -= dm_segs->ds_len; 2262 rq->req_seg_count++; 2263 dm_segs++; 2264 } 2265 2266 while (datalen > 0 && dm_segs != eseg) { 2267 uint16_t onxti; 2268 ispcontreq_t local, *crq = &local, *cqe; 2269 2270 cqe = (ispcontreq_t *) ISP_QUEUE_ENTRY(isp->isp_rquest, nxti); 2271 onxti = nxti; 2272 nxti = ISP_NXT_QENTRY(onxti, RQUEST_QUEUE_LEN(isp)); 2273 if (nxti == mp->optr) { 2274 isp_prt(isp, ISP_LOGDEBUG0, "Request Queue Overflow++"); 2275 mp->error = MUSHERR_NOQENTRIES; 2276 return; 2277 } 2278 rq->req_header.rqs_entry_count++; 2279 MEMZERO((void *)crq, sizeof (*crq)); 2280 crq->req_header.rqs_entry_count = 1; 2281 crq->req_header.rqs_entry_type = RQSTYPE_DATASEG; 2282 2283 seglim = 0; 2284 while (datalen > 0 && seglim < ISP_CDSEG && dm_segs != eseg) { 2285 crq->req_dataseg[seglim].ds_base = 2286 DMA_LO32(dm_segs->ds_addr); 2287 crq->req_dataseg[seglim].ds_count = 2288 dm_segs->ds_len; 2289 rq->req_seg_count++; 2290 dm_segs++; 2291 seglim++; 2292 datalen -= dm_segs->ds_len; 2293 } 2294 isp_put_cont_req(isp, crq, cqe); 2295 MEMORYBARRIER(isp, SYNC_REQUEST, onxti, QENTRY_LEN); 2296 } 2297 *mp->nxtip = nxti; 2298} 2299 2300/* 2301 * We enter with ISP_LOCK held 2302 */ 2303static int 2304isp_pci_dmasetup(ispsoftc_t *isp, struct ccb_scsiio *csio, ispreq_t *rq, 2305 uint16_t *nxtip, uint16_t optr) 2306{ 2307 struct isp_pcisoftc *pcs = (struct isp_pcisoftc *)isp; 2308 ispreq_t *qep; 2309 bus_dmamap_t *dp = NULL; 2310 mush_t mush, *mp; 2311 void (*eptr)(void *, bus_dma_segment_t *, int, int); 2312 2313 qep = (ispreq_t *) ISP_QUEUE_ENTRY(isp->isp_rquest, isp->isp_reqidx); 2314#ifdef ISP_TARGET_MODE 2315 if (csio->ccb_h.func_code == XPT_CONT_TARGET_IO) { 2316 if (IS_FC(isp)) { 2317 eptr = tdma_mkfc; 2318 } else { 2319 eptr = tdma_mk; 2320 } 2321 if ((csio->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_NONE || 2322 (csio->dxfer_len == 0)) { 2323 mp = &mush; 2324 mp->isp = isp; 2325 mp->cmd_token = csio; 2326 mp->rq = rq; /* really a ct_entry_t or ct2_entry_t */ 2327 mp->nxtip = nxtip; 2328 mp->optr = optr; 2329 mp->error = 0; 2330 ISPLOCK_2_CAMLOCK(isp); 2331 (*eptr)(mp, NULL, 0, 0); 2332 CAMLOCK_2_ISPLOCK(isp); 2333 goto mbxsync; 2334 } 2335 } else 2336#endif 2337 if (sizeof (bus_addr_t) > 4) { 2338 eptr = dma2_a64; 2339 } else { 2340 eptr = dma2; 2341 } 2342 2343 2344 if ((csio->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_NONE || 2345 (csio->dxfer_len == 0)) { 2346 rq->req_seg_count = 1; 2347 goto mbxsync; 2348 } 2349 2350 /* 2351 * Do a virtual grapevine step to collect info for 2352 * the callback dma allocation that we have to use... 2353 */ 2354 mp = &mush; 2355 mp->isp = isp; 2356 mp->cmd_token = csio; 2357 mp->rq = rq; 2358 mp->nxtip = nxtip; 2359 mp->optr = optr; 2360 mp->error = 0; 2361 2362 ISPLOCK_2_CAMLOCK(isp); 2363 if ((csio->ccb_h.flags & CAM_SCATTER_VALID) == 0) { 2364 if ((csio->ccb_h.flags & CAM_DATA_PHYS) == 0) { 2365 int error, s; 2366 dp = &pcs->dmaps[isp_handle_index(rq->req_handle)]; 2367 s = splsoftvm(); 2368 error = bus_dmamap_load(pcs->dmat, *dp, 2369 csio->data_ptr, csio->dxfer_len, eptr, mp, 0); 2370 if (error == EINPROGRESS) { 2371 bus_dmamap_unload(pcs->dmat, *dp); 2372 mp->error = EINVAL; 2373 isp_prt(isp, ISP_LOGERR, 2374 "deferred dma allocation not supported"); 2375 } else if (error && mp->error == 0) { 2376#ifdef DIAGNOSTIC 2377 isp_prt(isp, ISP_LOGERR, 2378 "error %d in dma mapping code", error); 2379#endif 2380 mp->error = error; 2381 } 2382 splx(s); 2383 } else { 2384 /* Pointer to physical buffer */ 2385 struct bus_dma_segment seg; 2386 seg.ds_addr = (bus_addr_t)(vm_offset_t)csio->data_ptr; 2387 seg.ds_len = csio->dxfer_len; 2388 (*eptr)(mp, &seg, 1, 0); 2389 } 2390 } else { 2391 struct bus_dma_segment *segs; 2392 2393 if ((csio->ccb_h.flags & CAM_DATA_PHYS) != 0) { 2394 isp_prt(isp, ISP_LOGERR, 2395 "Physical segment pointers unsupported"); 2396 mp->error = EINVAL; 2397 } else if ((csio->ccb_h.flags & CAM_SG_LIST_PHYS) == 0) { 2398 isp_prt(isp, ISP_LOGERR, 2399 "Virtual segment addresses unsupported"); 2400 mp->error = EINVAL; 2401 } else { 2402 /* Just use the segments provided */ 2403 segs = (struct bus_dma_segment *) csio->data_ptr; 2404 (*eptr)(mp, segs, csio->sglist_cnt, 0); 2405 } 2406 } 2407 CAMLOCK_2_ISPLOCK(isp); 2408 if (mp->error) { 2409 int retval = CMD_COMPLETE; 2410 if (mp->error == MUSHERR_NOQENTRIES) { 2411 retval = CMD_EAGAIN; 2412 } else if (mp->error == EFBIG) { 2413 XS_SETERR(csio, CAM_REQ_TOO_BIG); 2414 } else if (mp->error == EINVAL) { 2415 XS_SETERR(csio, CAM_REQ_INVALID); 2416 } else { 2417 XS_SETERR(csio, CAM_UNREC_HBA_ERROR); 2418 } 2419 return (retval); 2420 } 2421mbxsync: 2422 switch (rq->req_header.rqs_entry_type) { 2423 case RQSTYPE_REQUEST: 2424 isp_put_request(isp, rq, qep); 2425 break; 2426 case RQSTYPE_CMDONLY: 2427 isp_put_extended_request(isp, (ispextreq_t *)rq, 2428 (ispextreq_t *)qep); 2429 break; 2430 case RQSTYPE_T2RQS: 2431 isp_put_request_t2(isp, (ispreqt2_t *) rq, (ispreqt2_t *) qep); 2432 break; 2433 case RQSTYPE_A64: 2434 case RQSTYPE_T3RQS: 2435 isp_put_request_t3(isp, (ispreqt3_t *) rq, (ispreqt3_t *) qep); 2436 break; 2437 } 2438 return (CMD_QUEUED); 2439} 2440 2441static void 2442isp_pci_dmateardown(ispsoftc_t *isp, XS_T *xs, uint16_t handle) 2443{ 2444 struct isp_pcisoftc *pcs = (struct isp_pcisoftc *)isp; 2445 bus_dmamap_t *dp = &pcs->dmaps[isp_handle_index(handle)]; 2446 if ((xs->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) { 2447 bus_dmamap_sync(pcs->dmat, *dp, BUS_DMASYNC_POSTREAD); 2448 } else { 2449 bus_dmamap_sync(pcs->dmat, *dp, BUS_DMASYNC_POSTWRITE); 2450 } 2451 bus_dmamap_unload(pcs->dmat, *dp); 2452} 2453 2454 2455static void 2456isp_pci_reset1(ispsoftc_t *isp) 2457{ 2458 /* Make sure the BIOS is disabled */ 2459 isp_pci_wr_reg(isp, HCCR, PCI_HCCR_CMD_BIOS); 2460 /* and enable interrupts */ 2461 ENABLE_INTS(isp); 2462} 2463 2464static void 2465isp_pci_dumpregs(ispsoftc_t *isp, const char *msg) 2466{ 2467 struct isp_pcisoftc *pcs = (struct isp_pcisoftc *)isp; 2468 if (msg) 2469 printf("%s: %s\n", device_get_nameunit(isp->isp_dev), msg); 2470 else 2471 printf("%s:\n", device_get_nameunit(isp->isp_dev)); 2472 if (IS_SCSI(isp)) 2473 printf(" biu_conf1=%x", ISP_READ(isp, BIU_CONF1)); 2474 else 2475 printf(" biu_csr=%x", ISP_READ(isp, BIU2100_CSR)); 2476 printf(" biu_icr=%x biu_isr=%x biu_sema=%x ", ISP_READ(isp, BIU_ICR), 2477 ISP_READ(isp, BIU_ISR), ISP_READ(isp, BIU_SEMA)); 2478 printf("risc_hccr=%x\n", ISP_READ(isp, HCCR)); 2479 2480 2481 if (IS_SCSI(isp)) { 2482 ISP_WRITE(isp, HCCR, HCCR_CMD_PAUSE); 2483 printf(" cdma_conf=%x cdma_sts=%x cdma_fifostat=%x\n", 2484 ISP_READ(isp, CDMA_CONF), ISP_READ(isp, CDMA_STATUS), 2485 ISP_READ(isp, CDMA_FIFO_STS)); 2486 printf(" ddma_conf=%x ddma_sts=%x ddma_fifostat=%x\n", 2487 ISP_READ(isp, DDMA_CONF), ISP_READ(isp, DDMA_STATUS), 2488 ISP_READ(isp, DDMA_FIFO_STS)); 2489 printf(" sxp_int=%x sxp_gross=%x sxp(scsi_ctrl)=%x\n", 2490 ISP_READ(isp, SXP_INTERRUPT), 2491 ISP_READ(isp, SXP_GROSS_ERR), 2492 ISP_READ(isp, SXP_PINS_CTRL)); 2493 ISP_WRITE(isp, HCCR, HCCR_CMD_RELEASE); 2494 } 2495 printf(" mbox regs: %x %x %x %x %x\n", 2496 ISP_READ(isp, OUTMAILBOX0), ISP_READ(isp, OUTMAILBOX1), 2497 ISP_READ(isp, OUTMAILBOX2), ISP_READ(isp, OUTMAILBOX3), 2498 ISP_READ(isp, OUTMAILBOX4)); 2499 printf(" PCI Status Command/Status=%x\n", 2500 pci_read_config(pcs->pci_dev, PCIR_COMMAND, 1)); 2501} 2502