1 /* $NetBSD: isp.c,v 1.94 2002/05/17 18:49:42 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 * Machine and OS Independent (well, as best as possible) 32 * code for the Qlogic ISP SCSI adapters. 33 * 34 * Copyright (c) 1997, 1998, 1999, 2000, 2001 by Matthew Jacob 35 * NASA/Ames Research Center 36 * All rights reserved. 37 * 38 * Redistribution and use in source and binary forms, with or without 39 * modification, are permitted provided that the following conditions 40 * are met: 41 * 1. Redistributions of source code must retain the above copyright 42 * notice immediately at the beginning of the file, without modification, 43 * 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 AND CONTRIBUTORS ``AS IS'' AND 48 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 49 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 50 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR 51 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 52 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 53 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 54 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 55 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 56 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 57 * SUCH DAMAGE. 58 */ 59 60 /* 61 * Inspiration and ideas about this driver are from Erik Moe's Linux driver 62 * (qlogicisp.c) and Dave Miller's SBus version of same (qlogicisp.c). Some 63 * ideas dredged from the Solaris driver. 64 */ 65 66 /* 67 * Include header file appropriate for platform we're building on. 68 */ 69 70 #include <sys/cdefs.h> 71 __KERNEL_RCSID(0, "$NetBSD: isp.c,v 1.94 2002/05/17 18:49:42 mjacob Exp $"); 72 73 #ifdef __NetBSD__ 74 #include <dev/ic/isp_netbsd.h> 75 #endif 76 #ifdef __FreeBSD__ 77 #include <dev/isp/isp_freebsd.h> 78 #endif 79 #ifdef __OpenBSD__ 80 #include <dev/ic/isp_openbsd.h> 81 #endif 82 #ifdef __linux__ 83 #include "isp_linux.h" 84 #endif 85 #ifdef __svr4__ 86 #include "isp_solaris.h" 87 #endif 88 89 /* 90 * General defines 91 */ 92 93 #define MBOX_DELAY_COUNT 1000000 / 100 94 95 /* 96 * Local static data 97 */ 98 static const char portshift[] = 99 "Target %d Loop ID 0x%x (Port 0x%x) => Loop 0x%x (Port 0x%x)"; 100 static const char portdup[] = 101 "Target %d duplicates Target %d- killing off both"; 102 static const char retained[] = 103 "Retaining Loop ID 0x%x for Target %d (Port 0x%x)"; 104 static const char lretained[] = 105 "Retained login of Target %d (Loop ID 0x%x) Port 0x%x"; 106 static const char plogout[] = 107 "Logging out Target %d at Loop ID 0x%x (Port 0x%x)"; 108 static const char plogierr[] = 109 "Command Error in PLOGI for Port 0x%x (0x%x)"; 110 static const char nopdb[] = 111 "Could not get PDB for Device @ Port 0x%x"; 112 static const char pdbmfail1[] = 113 "PDB Loop ID info for Device @ Port 0x%x does not match up (0x%x)"; 114 static const char pdbmfail2[] = 115 "PDB Port info for Device @ Port 0x%x does not match up (0x%x)"; 116 static const char ldumped[] = 117 "Target %d (Loop ID 0x%x) Port 0x%x dumped after login info mismatch"; 118 static const char notresp[] = 119 "Not RESPONSE in RESPONSE Queue (type 0x%x) @ idx %d (next %d) nlooked %d"; 120 static const char xact1[] = 121 "HBA attempted queued transaction with disconnect not set for %d.%d.%d"; 122 static const char xact2[] = 123 "HBA attempted queued transaction to target routine %d on target %d bus %d"; 124 static const char xact3[] = 125 "HBA attempted queued cmd for %d.%d.%d when queueing disabled"; 126 static const char pskip[] = 127 "SCSI phase skipped for target %d.%d.%d"; 128 static const char topology[] = 129 "Loop ID %d, AL_PA 0x%x, Port ID 0x%x, Loop State 0x%x, Topology '%s'"; 130 static const char swrej[] = 131 "Fabric Nameserver rejected %s (Reason=0x%x Expl=0x%x) for Port ID 0x%x"; 132 static const char finmsg[] = 133 "(%d.%d.%d): FIN dl%d resid %d STS 0x%x SKEY %c XS_ERR=0x%x"; 134 static const char sc0[] = 135 "%s CHAN %d FTHRSH %d IID %d RESETD %d RETRYC %d RETRYD %d ASD 0x%x"; 136 static const char sc1[] = 137 "%s RAAN 0x%x DLAN 0x%x DDMAB 0x%x CDMAB 0x%x SELTIME %d MQD %d"; 138 static const char sc2[] = "%s CHAN %d TGT %d FLAGS 0x%x 0x%x/0x%x"; 139 static const char sc3[] = "Generated"; 140 static const char sc4[] = "NVRAM"; 141 static const char bun[] = 142 "bad underrun for %d.%d (count %d, resid %d, status %s)"; 143 144 /* 145 * Local function prototypes. 146 */ 147 static int isp_parse_async(struct ispsoftc *, u_int16_t); 148 static int isp_handle_other_response(struct ispsoftc *, int, isphdr_t *, 149 u_int16_t *); 150 static void 151 isp_parse_status(struct ispsoftc *, ispstatusreq_t *, XS_T *); 152 static void isp_fastpost_complete(struct ispsoftc *, u_int16_t); 153 static int isp_mbox_continue(struct ispsoftc *); 154 static void isp_scsi_init(struct ispsoftc *); 155 static void isp_scsi_channel_init(struct ispsoftc *, int); 156 static void isp_fibre_init(struct ispsoftc *); 157 static void isp_mark_getpdb_all(struct ispsoftc *); 158 static int isp_getmap(struct ispsoftc *, fcpos_map_t *); 159 static int isp_getpdb(struct ispsoftc *, int, isp_pdb_t *); 160 static u_int64_t isp_get_portname(struct ispsoftc *, int, int); 161 static int isp_fclink_test(struct ispsoftc *, int); 162 static char *isp2100_fw_statename(int); 163 static int isp_pdb_sync(struct ispsoftc *); 164 static int isp_scan_loop(struct ispsoftc *); 165 static int isp_fabric_mbox_cmd(struct ispsoftc *, mbreg_t *); 166 static int isp_scan_fabric(struct ispsoftc *, int); 167 static void isp_register_fc4_type(struct ispsoftc *); 168 static void isp_fw_state(struct ispsoftc *); 169 static void isp_mboxcmd_qnw(struct ispsoftc *, mbreg_t *, int); 170 static void isp_mboxcmd(struct ispsoftc *, mbreg_t *, int); 171 172 static void isp_update(struct ispsoftc *); 173 static void isp_update_bus(struct ispsoftc *, int); 174 static void isp_setdfltparm(struct ispsoftc *, int); 175 static int isp_read_nvram(struct ispsoftc *); 176 static void isp_rdnvram_word(struct ispsoftc *, int, u_int16_t *); 177 static void isp_parse_nvram_1020(struct ispsoftc *, u_int8_t *); 178 static void isp_parse_nvram_1080(struct ispsoftc *, int, u_int8_t *); 179 static void isp_parse_nvram_12160(struct ispsoftc *, int, u_int8_t *); 180 static void isp_parse_nvram_2100(struct ispsoftc *, u_int8_t *); 181 182 /* 183 * Reset Hardware. 184 * 185 * Hit the chip over the head, download new f/w if available and set it running. 186 * 187 * Locking done elsewhere. 188 */ 189 190 void 191 isp_reset(struct ispsoftc *isp) 192 { 193 mbreg_t mbs; 194 u_int16_t code_org; 195 int loops, i, touched, dodnld = 1; 196 char *btype = "????"; 197 198 isp->isp_state = ISP_NILSTATE; 199 200 /* 201 * Basic types (SCSI, FibreChannel and PCI or SBus) 202 * have been set in the MD code. We figure out more 203 * here. Possibly more refined types based upon PCI 204 * identification. Chip revision has been gathered. 205 * 206 * After we've fired this chip up, zero out the conf1 register 207 * for SCSI adapters and do other settings for the 2100. 208 */ 209 210 /* 211 * Get the current running firmware revision out of the 212 * chip before we hit it over the head (if this is our 213 * first time through). Note that we store this as the 214 * 'ROM' firmware revision- which it may not be. In any 215 * case, we don't really use this yet, but we may in 216 * the future. 217 */ 218 if ((touched = isp->isp_touched) == 0) { 219 /* 220 * First see whether or not we're sitting in the ISP PROM. 221 * If we've just been reset, we'll have the string "ISP " 222 * spread through outgoing mailbox registers 1-3. We do 223 * this for PCI cards because otherwise we really don't 224 * know what state the card is in and we could hang if 225 * we try this command otherwise. 226 * 227 * For SBus cards, we just do this because they almost 228 * certainly will be running firmware by now. 229 */ 230 if (ISP_READ(isp, OUTMAILBOX1) != 0x4953 || 231 ISP_READ(isp, OUTMAILBOX2) != 0x5020 || 232 ISP_READ(isp, OUTMAILBOX3) != 0x2020) { 233 /* 234 * Just in case it was paused... 235 */ 236 ISP_WRITE(isp, HCCR, HCCR_CMD_RELEASE); 237 mbs.param[0] = MBOX_ABOUT_FIRMWARE; 238 isp_mboxcmd(isp, &mbs, MBLOGNONE); 239 if (mbs.param[0] == MBOX_COMMAND_COMPLETE) { 240 isp->isp_romfw_rev[0] = mbs.param[1]; 241 isp->isp_romfw_rev[1] = mbs.param[2]; 242 isp->isp_romfw_rev[2] = mbs.param[3]; 243 } 244 } 245 isp->isp_touched = 1; 246 } 247 248 DISABLE_INTS(isp); 249 250 /* 251 * Set up default request/response queue in-pointer/out-pointer 252 * register indices. 253 */ 254 if (IS_23XX(isp)) { 255 isp->isp_rqstinrp = BIU_REQINP; 256 isp->isp_rqstoutrp = BIU_REQOUTP; 257 isp->isp_respinrp = BIU_RSPINP; 258 isp->isp_respoutrp = BIU_RSPOUTP; 259 } else { 260 isp->isp_rqstinrp = INMAILBOX4; 261 isp->isp_rqstoutrp = OUTMAILBOX4; 262 isp->isp_respinrp = OUTMAILBOX5; 263 isp->isp_respoutrp = INMAILBOX5; 264 } 265 266 /* 267 * Put the board into PAUSE mode (so we can read the SXP registers 268 * or write FPM/FBM registers). 269 */ 270 ISP_WRITE(isp, HCCR, HCCR_CMD_PAUSE); 271 272 if (IS_FC(isp)) { 273 switch (isp->isp_type) { 274 case ISP_HA_FC_2100: 275 btype = "2100"; 276 break; 277 case ISP_HA_FC_2200: 278 btype = "2200"; 279 break; 280 case ISP_HA_FC_2300: 281 btype = "2300"; 282 break; 283 case ISP_HA_FC_2312: 284 btype = "2312"; 285 break; 286 default: 287 break; 288 } 289 /* 290 * While we're paused, reset the FPM module and FBM fifos. 291 */ 292 ISP_WRITE(isp, BIU2100_CSR, BIU2100_FPM0_REGS); 293 ISP_WRITE(isp, FPM_DIAG_CONFIG, FPM_SOFT_RESET); 294 ISP_WRITE(isp, BIU2100_CSR, BIU2100_FB_REGS); 295 ISP_WRITE(isp, FBM_CMD, FBMCMD_FIFO_RESET_ALL); 296 ISP_WRITE(isp, BIU2100_CSR, BIU2100_RISC_REGS); 297 } else if (IS_1240(isp)) { 298 sdparam *sdp = isp->isp_param; 299 btype = "1240"; 300 isp->isp_clock = 60; 301 sdp->isp_ultramode = 1; 302 sdp++; 303 sdp->isp_ultramode = 1; 304 /* 305 * XXX: Should probably do some bus sensing. 306 */ 307 } else if (IS_ULTRA2(isp)) { 308 static const char m[] = "bus %d is in %s Mode"; 309 u_int16_t l; 310 sdparam *sdp = isp->isp_param; 311 312 isp->isp_clock = 100; 313 314 if (IS_1280(isp)) 315 btype = "1280"; 316 else if (IS_1080(isp)) 317 btype = "1080"; 318 else if (IS_12160(isp)) 319 btype = "12160"; 320 else 321 btype = "<UNKLVD>"; 322 323 l = ISP_READ(isp, SXP_PINS_DIFF) & ISP1080_MODE_MASK; 324 switch (l) { 325 case ISP1080_LVD_MODE: 326 sdp->isp_lvdmode = 1; 327 isp_prt(isp, ISP_LOGCONFIG, m, 0, "LVD"); 328 break; 329 case ISP1080_HVD_MODE: 330 sdp->isp_diffmode = 1; 331 isp_prt(isp, ISP_LOGCONFIG, m, 0, "Differential"); 332 break; 333 case ISP1080_SE_MODE: 334 sdp->isp_ultramode = 1; 335 isp_prt(isp, ISP_LOGCONFIG, m, 0, "Single-Ended"); 336 break; 337 default: 338 isp_prt(isp, ISP_LOGERR, 339 "unknown mode on bus %d (0x%x)", 0, l); 340 break; 341 } 342 343 if (IS_DUALBUS(isp)) { 344 sdp++; 345 l = ISP_READ(isp, SXP_PINS_DIFF|SXP_BANK1_SELECT); 346 l &= ISP1080_MODE_MASK; 347 switch(l) { 348 case ISP1080_LVD_MODE: 349 sdp->isp_lvdmode = 1; 350 isp_prt(isp, ISP_LOGCONFIG, m, 1, "LVD"); 351 break; 352 case ISP1080_HVD_MODE: 353 sdp->isp_diffmode = 1; 354 isp_prt(isp, ISP_LOGCONFIG, 355 m, 1, "Differential"); 356 break; 357 case ISP1080_SE_MODE: 358 sdp->isp_ultramode = 1; 359 isp_prt(isp, ISP_LOGCONFIG, 360 m, 1, "Single-Ended"); 361 break; 362 default: 363 isp_prt(isp, ISP_LOGERR, 364 "unknown mode on bus %d (0x%x)", 1, l); 365 break; 366 } 367 } 368 } else { 369 sdparam *sdp = isp->isp_param; 370 i = ISP_READ(isp, BIU_CONF0) & BIU_CONF0_HW_MASK; 371 switch (i) { 372 default: 373 isp_prt(isp, ISP_LOGALL, "Unknown Chip Type 0x%x", i); 374 /* FALLTHROUGH */ 375 case 1: 376 btype = "1020"; 377 isp->isp_type = ISP_HA_SCSI_1020; 378 isp->isp_clock = 40; 379 break; 380 case 2: 381 /* 382 * Some 1020A chips are Ultra Capable, but don't 383 * run the clock rate up for that unless told to 384 * do so by the Ultra Capable bits being set. 385 */ 386 btype = "1020A"; 387 isp->isp_type = ISP_HA_SCSI_1020A; 388 isp->isp_clock = 40; 389 break; 390 case 3: 391 btype = "1040"; 392 isp->isp_type = ISP_HA_SCSI_1040; 393 isp->isp_clock = 60; 394 break; 395 case 4: 396 btype = "1040A"; 397 isp->isp_type = ISP_HA_SCSI_1040A; 398 isp->isp_clock = 60; 399 break; 400 case 5: 401 btype = "1040B"; 402 isp->isp_type = ISP_HA_SCSI_1040B; 403 isp->isp_clock = 60; 404 break; 405 case 6: 406 btype = "1040C"; 407 isp->isp_type = ISP_HA_SCSI_1040C; 408 isp->isp_clock = 60; 409 break; 410 } 411 /* 412 * Now, while we're at it, gather info about ultra 413 * and/or differential mode. 414 */ 415 if (ISP_READ(isp, SXP_PINS_DIFF) & SXP_PINS_DIFF_MODE) { 416 isp_prt(isp, ISP_LOGCONFIG, "Differential Mode"); 417 sdp->isp_diffmode = 1; 418 } else { 419 sdp->isp_diffmode = 0; 420 } 421 i = ISP_READ(isp, RISC_PSR); 422 if (isp->isp_bustype == ISP_BT_SBUS) { 423 i &= RISC_PSR_SBUS_ULTRA; 424 } else { 425 i &= RISC_PSR_PCI_ULTRA; 426 } 427 if (i != 0) { 428 isp_prt(isp, ISP_LOGCONFIG, "Ultra Mode Capable"); 429 sdp->isp_ultramode = 1; 430 /* 431 * If we're in Ultra Mode, we have to be 60Mhz clock- 432 * even for the SBus version. 433 */ 434 isp->isp_clock = 60; 435 } else { 436 sdp->isp_ultramode = 0; 437 /* 438 * Clock is known. Gronk. 439 */ 440 } 441 442 /* 443 * Machine dependent clock (if set) overrides 444 * our generic determinations. 445 */ 446 if (isp->isp_mdvec->dv_clock) { 447 if (isp->isp_mdvec->dv_clock < isp->isp_clock) { 448 isp->isp_clock = isp->isp_mdvec->dv_clock; 449 } 450 } 451 452 } 453 454 /* 455 * Clear instrumentation 456 */ 457 isp->isp_intcnt = isp->isp_intbogus = 0; 458 459 /* 460 * Do MD specific pre initialization 461 */ 462 ISP_RESET0(isp); 463 464 again: 465 466 /* 467 * Hit the chip over the head with hammer, 468 * and give the ISP a chance to recover. 469 */ 470 471 if (IS_SCSI(isp)) { 472 ISP_WRITE(isp, BIU_ICR, BIU_ICR_SOFT_RESET); 473 /* 474 * A slight delay... 475 */ 476 USEC_DELAY(100); 477 478 /* 479 * Clear data && control DMA engines. 480 */ 481 ISP_WRITE(isp, CDMA_CONTROL, 482 DMA_CNTRL_CLEAR_CHAN | DMA_CNTRL_RESET_INT); 483 ISP_WRITE(isp, DDMA_CONTROL, 484 DMA_CNTRL_CLEAR_CHAN | DMA_CNTRL_RESET_INT); 485 486 487 } else { 488 ISP_WRITE(isp, BIU2100_CSR, BIU2100_SOFT_RESET); 489 /* 490 * A slight delay... 491 */ 492 USEC_DELAY(100); 493 494 /* 495 * Clear data && control DMA engines. 496 */ 497 ISP_WRITE(isp, CDMA2100_CONTROL, 498 DMA_CNTRL2100_CLEAR_CHAN | DMA_CNTRL2100_RESET_INT); 499 ISP_WRITE(isp, TDMA2100_CONTROL, 500 DMA_CNTRL2100_CLEAR_CHAN | DMA_CNTRL2100_RESET_INT); 501 ISP_WRITE(isp, RDMA2100_CONTROL, 502 DMA_CNTRL2100_CLEAR_CHAN | DMA_CNTRL2100_RESET_INT); 503 } 504 505 /* 506 * Wait for ISP to be ready to go... 507 */ 508 loops = MBOX_DELAY_COUNT; 509 for (;;) { 510 if (IS_SCSI(isp)) { 511 if (!(ISP_READ(isp, BIU_ICR) & BIU_ICR_SOFT_RESET)) 512 break; 513 } else { 514 if (!(ISP_READ(isp, BIU2100_CSR) & BIU2100_SOFT_RESET)) 515 break; 516 } 517 USEC_DELAY(100); 518 if (--loops < 0) { 519 ISP_DUMPREGS(isp, "chip reset timed out"); 520 return; 521 } 522 } 523 524 /* 525 * After we've fired this chip up, zero out the conf1 register 526 * for SCSI adapters and other settings for the 2100. 527 */ 528 529 if (IS_SCSI(isp)) { 530 ISP_WRITE(isp, BIU_CONF1, 0); 531 } else { 532 ISP_WRITE(isp, BIU2100_CSR, 0); 533 } 534 535 /* 536 * Reset RISC Processor 537 */ 538 ISP_WRITE(isp, HCCR, HCCR_CMD_RESET); 539 USEC_DELAY(100); 540 /* Clear semaphore register (just to be sure) */ 541 ISP_WRITE(isp, BIU_SEMA, 0); 542 543 /* 544 * Establish some initial burst rate stuff. 545 * (only for the 1XX0 boards). This really should 546 * be done later after fetching from NVRAM. 547 */ 548 if (IS_SCSI(isp)) { 549 u_int16_t tmp = isp->isp_mdvec->dv_conf1; 550 /* 551 * Busted FIFO. Turn off all but burst enables. 552 */ 553 if (isp->isp_type == ISP_HA_SCSI_1040A) { 554 tmp &= BIU_BURST_ENABLE; 555 } 556 ISP_SETBITS(isp, BIU_CONF1, tmp); 557 if (tmp & BIU_BURST_ENABLE) { 558 ISP_SETBITS(isp, CDMA_CONF, DMA_ENABLE_BURST); 559 ISP_SETBITS(isp, DDMA_CONF, DMA_ENABLE_BURST); 560 } 561 #ifdef PTI_CARDS 562 if (((sdparam *) isp->isp_param)->isp_ultramode) { 563 while (ISP_READ(isp, RISC_MTR) != 0x1313) { 564 ISP_WRITE(isp, RISC_MTR, 0x1313); 565 ISP_WRITE(isp, HCCR, HCCR_CMD_STEP); 566 } 567 } else { 568 ISP_WRITE(isp, RISC_MTR, 0x1212); 569 } 570 /* 571 * PTI specific register 572 */ 573 ISP_WRITE(isp, RISC_EMB, DUAL_BANK) 574 #else 575 ISP_WRITE(isp, RISC_MTR, 0x1212); 576 #endif 577 } else { 578 ISP_WRITE(isp, RISC_MTR2100, 0x1212); 579 if (IS_2200(isp) || IS_23XX(isp)) { 580 ISP_WRITE(isp, HCCR, HCCR_2X00_DISABLE_PARITY_PAUSE); 581 } 582 } 583 584 ISP_WRITE(isp, HCCR, HCCR_CMD_RELEASE); /* release paused processor */ 585 586 /* 587 * Do MD specific post initialization 588 */ 589 ISP_RESET1(isp); 590 591 /* 592 * Wait for everything to finish firing up. 593 * 594 * Avoid doing this on the 2312 because you can generate a PCI 595 * parity error (chip breakage). 596 */ 597 if (IS_23XX(isp)) { 598 USEC_DELAY(5); 599 } else { 600 loops = MBOX_DELAY_COUNT; 601 while (ISP_READ(isp, OUTMAILBOX0) == MBOX_BUSY) { 602 USEC_DELAY(100); 603 if (--loops < 0) { 604 isp_prt(isp, ISP_LOGERR, 605 "MBOX_BUSY never cleared on reset"); 606 return; 607 } 608 } 609 } 610 611 /* 612 * Up until this point we've done everything by just reading or 613 * setting registers. From this point on we rely on at least *some* 614 * kind of firmware running in the card. 615 */ 616 617 /* 618 * Do some sanity checking. 619 */ 620 mbs.param[0] = MBOX_NO_OP; 621 isp_mboxcmd(isp, &mbs, MBLOGALL); 622 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 623 return; 624 } 625 626 if (IS_SCSI(isp)) { 627 mbs.param[0] = MBOX_MAILBOX_REG_TEST; 628 mbs.param[1] = 0xdead; 629 mbs.param[2] = 0xbeef; 630 mbs.param[3] = 0xffff; 631 mbs.param[4] = 0x1111; 632 mbs.param[5] = 0xa5a5; 633 isp_mboxcmd(isp, &mbs, MBLOGALL); 634 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 635 return; 636 } 637 if (mbs.param[1] != 0xdead || mbs.param[2] != 0xbeef || 638 mbs.param[3] != 0xffff || mbs.param[4] != 0x1111 || 639 mbs.param[5] != 0xa5a5) { 640 isp_prt(isp, ISP_LOGERR, 641 "Register Test Failed (0x%x 0x%x 0x%x 0x%x 0x%x)", 642 mbs.param[1], mbs.param[2], mbs.param[3], 643 mbs.param[4], mbs.param[5]); 644 return; 645 } 646 647 } 648 649 /* 650 * Download new Firmware, unless requested not to do so. 651 * This is made slightly trickier in some cases where the 652 * firmware of the ROM revision is newer than the revision 653 * compiled into the driver. So, where we used to compare 654 * versions of our f/w and the ROM f/w, now we just see 655 * whether we have f/w at all and whether a config flag 656 * has disabled our download. 657 */ 658 if ((isp->isp_mdvec->dv_ispfw == NULL) || 659 (isp->isp_confopts & ISP_CFG_NORELOAD)) { 660 dodnld = 0; 661 } 662 663 if (IS_23XX(isp)) 664 code_org = ISP_CODE_ORG_2300; 665 else 666 code_org = ISP_CODE_ORG; 667 668 if (dodnld) { 669 isp->isp_mbxworkp = (void *) &isp->isp_mdvec->dv_ispfw[1]; 670 isp->isp_mbxwrk0 = isp->isp_mdvec->dv_ispfw[3] - 1; 671 isp->isp_mbxwrk1 = code_org + 1; 672 mbs.param[0] = MBOX_WRITE_RAM_WORD; 673 mbs.param[1] = code_org; 674 mbs.param[2] = isp->isp_mdvec->dv_ispfw[0]; 675 isp_mboxcmd(isp, &mbs, MBLOGNONE); 676 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 677 isp_prt(isp, ISP_LOGERR, 678 "F/W download failed at word %d", 679 isp->isp_mbxwrk1 - code_org); 680 dodnld = 0; 681 goto again; 682 } 683 /* 684 * Verify that it downloaded correctly. 685 */ 686 mbs.param[0] = MBOX_VERIFY_CHECKSUM; 687 mbs.param[1] = code_org; 688 isp_mboxcmd(isp, &mbs, MBLOGNONE); 689 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 690 isp_prt(isp, ISP_LOGERR, "Ram Checksum Failure"); 691 return; 692 } 693 isp->isp_loaded_fw = 1; 694 } else { 695 isp->isp_loaded_fw = 0; 696 isp_prt(isp, ISP_LOGDEBUG2, "skipping f/w download"); 697 } 698 699 /* 700 * Now start it rolling. 701 * 702 * If we didn't actually download f/w, 703 * we still need to (re)start it. 704 */ 705 706 707 mbs.param[0] = MBOX_EXEC_FIRMWARE; 708 mbs.param[1] = code_org; 709 isp_mboxcmd(isp, &mbs, MBLOGNONE); 710 /* 711 * Give it a chance to start. 712 */ 713 USEC_DELAY(500); 714 715 if (IS_SCSI(isp)) { 716 /* 717 * Set CLOCK RATE, but only if asked to. 718 */ 719 if (isp->isp_clock) { 720 mbs.param[0] = MBOX_SET_CLOCK_RATE; 721 mbs.param[1] = isp->isp_clock; 722 isp_mboxcmd(isp, &mbs, MBLOGALL); 723 /* we will try not to care if this fails */ 724 } 725 } 726 727 mbs.param[0] = MBOX_ABOUT_FIRMWARE; 728 isp_mboxcmd(isp, &mbs, MBLOGALL); 729 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 730 return; 731 } 732 733 /* 734 * The SBus firmware that we are using apparently does not return 735 * major, minor, micro revisions in the mailbox registers, which 736 * is really, really, annoying. 737 */ 738 if (ISP_SBUS_SUPPORTED && isp->isp_bustype == ISP_BT_SBUS) { 739 if (dodnld) { 740 #ifdef ISP_TARGET_MODE 741 isp->isp_fwrev[0] = 7; 742 isp->isp_fwrev[1] = 55; 743 #else 744 isp->isp_fwrev[0] = 1; 745 isp->isp_fwrev[1] = 37; 746 #endif 747 isp->isp_fwrev[2] = 0; 748 } 749 } else { 750 isp->isp_fwrev[0] = mbs.param[1]; 751 isp->isp_fwrev[1] = mbs.param[2]; 752 isp->isp_fwrev[2] = mbs.param[3]; 753 } 754 isp_prt(isp, ISP_LOGCONFIG, 755 "Board Type %s, Chip Revision 0x%x, %s F/W Revision %d.%d.%d", 756 btype, isp->isp_revision, dodnld? "loaded" : "resident", 757 isp->isp_fwrev[0], isp->isp_fwrev[1], isp->isp_fwrev[2]); 758 759 if (IS_FC(isp)) { 760 /* 761 * We do not believe firmware attributes for 2100 code less 762 * than 1.17.0. 763 */ 764 if (IS_2100(isp) && 765 (ISP_FW_REVX(isp->isp_fwrev) < ISP_FW_REV(1, 17, 0))) { 766 FCPARAM(isp)->isp_fwattr = 0; 767 } else { 768 FCPARAM(isp)->isp_fwattr = mbs.param[6]; 769 isp_prt(isp, ISP_LOGDEBUG0, 770 "Firmware Attributes = 0x%x", mbs.param[6]); 771 } 772 if (ISP_READ(isp, BIU2100_CSR) & BIU2100_PCI64) { 773 isp_prt(isp, ISP_LOGCONFIG, 774 "Installed in 64-Bit PCI slot"); 775 } 776 } 777 778 if (isp->isp_romfw_rev[0] || isp->isp_romfw_rev[1] || 779 isp->isp_romfw_rev[2]) { 780 isp_prt(isp, ISP_LOGCONFIG, "Last F/W revision was %d.%d.%d", 781 isp->isp_romfw_rev[0], isp->isp_romfw_rev[1], 782 isp->isp_romfw_rev[2]); 783 } 784 785 mbs.param[0] = MBOX_GET_FIRMWARE_STATUS; 786 isp_mboxcmd(isp, &mbs, MBLOGALL); 787 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 788 return; 789 } 790 isp->isp_maxcmds = mbs.param[2]; 791 isp_prt(isp, ISP_LOGINFO, 792 "%d max I/O commands supported", mbs.param[2]); 793 isp_fw_state(isp); 794 795 /* 796 * Set up DMA for the request and result mailboxes. 797 */ 798 if (ISP_MBOXDMASETUP(isp) != 0) { 799 isp_prt(isp, ISP_LOGERR, "Cannot setup DMA"); 800 return; 801 } 802 isp->isp_state = ISP_RESETSTATE; 803 804 /* 805 * Okay- now that we have new firmware running, we now (re)set our 806 * notion of how many luns we support. This is somewhat tricky because 807 * if we haven't loaded firmware, we sometimes do not have an easy way 808 * of knowing how many luns we support. 809 * 810 * Expanded lun firmware gives you 32 luns for SCSI cards and 811 * 16384 luns for Fibre Channel cards. 812 * 813 * It turns out that even for QLogic 2100s with ROM 1.10 and above 814 * we do get a firmware attributes word returned in mailbox register 6. 815 * 816 * Because the lun is in a a different position in the Request Queue 817 * Entry structure for Fibre Channel with expanded lun firmware, we 818 * can only support one lun (lun zero) when we don't know what kind 819 * of firmware we're running. 820 * 821 * Note that we only do this once (the first time thru isp_reset) 822 * because we may be called again after firmware has been loaded once 823 * and released. 824 */ 825 if (touched == 0) { 826 if (IS_SCSI(isp)) { 827 if (dodnld) { 828 isp->isp_maxluns = 32; 829 } else { 830 isp->isp_maxluns = 8; 831 } 832 } else { 833 if (FCPARAM(isp)->isp_fwattr & ISP_FW_ATTR_SCCLUN) { 834 isp->isp_maxluns = 16384; 835 } else { 836 isp->isp_maxluns = 16; 837 } 838 } 839 } 840 } 841 842 /* 843 * Initialize Parameters of Hardware to a known state. 844 * 845 * Locks are held before coming here. 846 */ 847 848 void 849 isp_init(struct ispsoftc *isp) 850 { 851 /* 852 * Must do this first to get defaults established. 853 */ 854 isp_setdfltparm(isp, 0); 855 if (IS_DUALBUS(isp)) { 856 isp_setdfltparm(isp, 1); 857 } 858 if (IS_FC(isp)) { 859 isp_fibre_init(isp); 860 } else { 861 isp_scsi_init(isp); 862 } 863 } 864 865 static void 866 isp_scsi_init(struct ispsoftc *isp) 867 { 868 sdparam *sdp_chan0, *sdp_chan1; 869 mbreg_t mbs; 870 871 sdp_chan0 = isp->isp_param; 872 sdp_chan1 = sdp_chan0; 873 if (IS_DUALBUS(isp)) { 874 sdp_chan1++; 875 } 876 877 /* 878 * If we have no role (neither target nor initiator), return. 879 */ 880 if (isp->isp_role == ISP_ROLE_NONE) { 881 return; 882 } 883 884 /* First do overall per-card settings. */ 885 886 /* 887 * If we have fast memory timing enabled, turn it on. 888 */ 889 if (sdp_chan0->isp_fast_mttr) { 890 ISP_WRITE(isp, RISC_MTR, 0x1313); 891 } 892 893 /* 894 * Set Retry Delay and Count. 895 * You set both channels at the same time. 896 */ 897 mbs.param[0] = MBOX_SET_RETRY_COUNT; 898 mbs.param[1] = sdp_chan0->isp_retry_count; 899 mbs.param[2] = sdp_chan0->isp_retry_delay; 900 mbs.param[6] = sdp_chan1->isp_retry_count; 901 mbs.param[7] = sdp_chan1->isp_retry_delay; 902 903 isp_mboxcmd(isp, &mbs, MBLOGALL); 904 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 905 return; 906 } 907 908 /* 909 * Set ASYNC DATA SETUP time. This is very important. 910 */ 911 mbs.param[0] = MBOX_SET_ASYNC_DATA_SETUP_TIME; 912 mbs.param[1] = sdp_chan0->isp_async_data_setup; 913 mbs.param[2] = sdp_chan1->isp_async_data_setup; 914 isp_mboxcmd(isp, &mbs, MBLOGALL); 915 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 916 return; 917 } 918 919 /* 920 * Set ACTIVE Negation State. 921 */ 922 mbs.param[0] = MBOX_SET_ACT_NEG_STATE; 923 mbs.param[1] = 924 (sdp_chan0->isp_req_ack_active_neg << 4) | 925 (sdp_chan0->isp_data_line_active_neg << 5); 926 mbs.param[2] = 927 (sdp_chan1->isp_req_ack_active_neg << 4) | 928 (sdp_chan1->isp_data_line_active_neg << 5); 929 930 isp_mboxcmd(isp, &mbs, MBLOGNONE); 931 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 932 isp_prt(isp, ISP_LOGERR, 933 "failed to set active negation state (%d,%d), (%d,%d)", 934 sdp_chan0->isp_req_ack_active_neg, 935 sdp_chan0->isp_data_line_active_neg, 936 sdp_chan1->isp_req_ack_active_neg, 937 sdp_chan1->isp_data_line_active_neg); 938 /* 939 * But don't return. 940 */ 941 } 942 943 /* 944 * Set the Tag Aging limit 945 */ 946 mbs.param[0] = MBOX_SET_TAG_AGE_LIMIT; 947 mbs.param[1] = sdp_chan0->isp_tag_aging; 948 mbs.param[2] = sdp_chan1->isp_tag_aging; 949 isp_mboxcmd(isp, &mbs, MBLOGALL); 950 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 951 isp_prt(isp, ISP_LOGERR, "failed to set tag age limit (%d,%d)", 952 sdp_chan0->isp_tag_aging, sdp_chan1->isp_tag_aging); 953 return; 954 } 955 956 /* 957 * Set selection timeout. 958 */ 959 mbs.param[0] = MBOX_SET_SELECT_TIMEOUT; 960 mbs.param[1] = sdp_chan0->isp_selection_timeout; 961 mbs.param[2] = sdp_chan1->isp_selection_timeout; 962 isp_mboxcmd(isp, &mbs, MBLOGALL); 963 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 964 return; 965 } 966 967 /* now do per-channel settings */ 968 isp_scsi_channel_init(isp, 0); 969 if (IS_DUALBUS(isp)) 970 isp_scsi_channel_init(isp, 1); 971 972 /* 973 * Now enable request/response queues 974 */ 975 976 mbs.param[0] = MBOX_INIT_RES_QUEUE; 977 mbs.param[1] = RESULT_QUEUE_LEN(isp); 978 mbs.param[2] = DMA_WD1(isp->isp_result_dma); 979 mbs.param[3] = DMA_WD0(isp->isp_result_dma); 980 mbs.param[4] = 0; 981 mbs.param[5] = 0; 982 isp_mboxcmd(isp, &mbs, MBLOGALL); 983 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 984 return; 985 } 986 isp->isp_residx = mbs.param[5]; 987 988 mbs.param[0] = MBOX_INIT_REQ_QUEUE; 989 mbs.param[1] = RQUEST_QUEUE_LEN(isp); 990 mbs.param[2] = DMA_WD1(isp->isp_rquest_dma); 991 mbs.param[3] = DMA_WD0(isp->isp_rquest_dma); 992 mbs.param[4] = 0; 993 isp_mboxcmd(isp, &mbs, MBLOGALL); 994 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 995 return; 996 } 997 isp->isp_reqidx = isp->isp_reqodx = mbs.param[4]; 998 999 /* 1000 * Turn on Fast Posting, LVD transitions 1001 * 1002 * Ultra2 F/W always has had fast posting (and LVD transitions) 1003 * 1004 * Ultra and older (i.e., SBus) cards may not. It's just safer 1005 * to assume not for them. 1006 */ 1007 1008 mbs.param[0] = MBOX_SET_FW_FEATURES; 1009 mbs.param[1] = 0; 1010 if (IS_ULTRA2(isp)) 1011 mbs.param[1] |= FW_FEATURE_LVD_NOTIFY; 1012 #ifndef ISP_NO_RIO 1013 if (IS_ULTRA2(isp) || IS_1240(isp)) 1014 mbs.param[1] |= FW_FEATURE_RIO_16BIT; 1015 #else 1016 #ifndef ISP_NO_FASTPOST 1017 if (IS_ULTRA2(isp) || IS_1240(isp)) 1018 mbs.param[1] |= FW_FEATURE_FAST_POST; 1019 #endif 1020 #endif 1021 if (mbs.param[1] != 0) { 1022 u_int16_t sfeat = mbs.param[1]; 1023 isp_mboxcmd(isp, &mbs, MBLOGALL); 1024 if (mbs.param[0] == MBOX_COMMAND_COMPLETE) { 1025 isp_prt(isp, ISP_LOGINFO, 1026 "Enabled FW features (0x%x)", sfeat); 1027 } 1028 } 1029 1030 /* 1031 * Let the outer layers decide whether to issue a SCSI bus reset. 1032 */ 1033 isp->isp_state = ISP_INITSTATE; 1034 } 1035 1036 static void 1037 isp_scsi_channel_init(struct ispsoftc *isp, int channel) 1038 { 1039 sdparam *sdp; 1040 mbreg_t mbs; 1041 int tgt; 1042 1043 sdp = isp->isp_param; 1044 sdp += channel; 1045 1046 /* 1047 * Set (possibly new) Initiator ID. 1048 */ 1049 mbs.param[0] = MBOX_SET_INIT_SCSI_ID; 1050 mbs.param[1] = (channel << 7) | sdp->isp_initiator_id; 1051 isp_mboxcmd(isp, &mbs, MBLOGALL); 1052 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 1053 return; 1054 } 1055 isp_prt(isp, ISP_LOGINFO, "Initiator ID is %d on Channel %d", 1056 sdp->isp_initiator_id, channel); 1057 1058 1059 /* 1060 * Set current per-target parameters to an initial safe minimum. 1061 */ 1062 for (tgt = 0; tgt < MAX_TARGETS; tgt++) { 1063 int lun; 1064 u_int16_t sdf; 1065 1066 if (sdp->isp_devparam[tgt].dev_enable == 0) { 1067 continue; 1068 } 1069 #ifndef ISP_TARGET_MODE 1070 sdf = sdp->isp_devparam[tgt].goal_flags; 1071 sdf &= DPARM_SAFE_DFLT; 1072 /* 1073 * It is not quite clear when this changed over so that 1074 * we could force narrow and async for 1000/1020 cards, 1075 * but assume that this is only the case for loaded 1076 * firmware. 1077 */ 1078 if (isp->isp_loaded_fw) { 1079 sdf |= DPARM_NARROW | DPARM_ASYNC; 1080 } 1081 #else 1082 /* 1083 * The !$*!)$!$)* f/w uses the same index into some 1084 * internal table to decide how to respond to negotiations, 1085 * so if we've said "let's be safe" for ID X, and ID X 1086 * selects *us*, the negotiations will back to 'safe' 1087 * (as in narrow/async). What the f/w *should* do is 1088 * use the initiator id settings to decide how to respond. 1089 */ 1090 sdp->isp_devparam[tgt].goal_flags = sdf = DPARM_DEFAULT; 1091 #endif 1092 mbs.param[0] = MBOX_SET_TARGET_PARAMS; 1093 mbs.param[1] = (channel << 15) | (tgt << 8); 1094 mbs.param[2] = sdf; 1095 if ((sdf & DPARM_SYNC) == 0) { 1096 mbs.param[3] = 0; 1097 } else { 1098 mbs.param[3] = 1099 (sdp->isp_devparam[tgt].goal_offset << 8) | 1100 (sdp->isp_devparam[tgt].goal_period); 1101 } 1102 isp_prt(isp, ISP_LOGDEBUG0, 1103 "Initial Settings bus%d tgt%d flags 0x%x off 0x%x per 0x%x", 1104 channel, tgt, mbs.param[2], mbs.param[3] >> 8, 1105 mbs.param[3] & 0xff); 1106 isp_mboxcmd(isp, &mbs, MBLOGNONE); 1107 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 1108 sdf = DPARM_SAFE_DFLT; 1109 mbs.param[0] = MBOX_SET_TARGET_PARAMS; 1110 mbs.param[1] = (tgt << 8) | (channel << 15); 1111 mbs.param[2] = sdf; 1112 mbs.param[3] = 0; 1113 isp_mboxcmd(isp, &mbs, MBLOGALL); 1114 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 1115 continue; 1116 } 1117 } 1118 1119 /* 1120 * We don't update any information directly from the f/w 1121 * because we need to run at least one command to cause a 1122 * new state to be latched up. So, we just assume that we 1123 * converge to the values we just had set. 1124 * 1125 * Ensure that we don't believe tagged queuing is enabled yet. 1126 * It turns out that sometimes the ISP just ignores our 1127 * attempts to set parameters for devices that it hasn't 1128 * seen yet. 1129 */ 1130 sdp->isp_devparam[tgt].actv_flags = sdf & ~DPARM_TQING; 1131 for (lun = 0; lun < (int) isp->isp_maxluns; lun++) { 1132 mbs.param[0] = MBOX_SET_DEV_QUEUE_PARAMS; 1133 mbs.param[1] = (channel << 15) | (tgt << 8) | lun; 1134 mbs.param[2] = sdp->isp_max_queue_depth; 1135 mbs.param[3] = sdp->isp_devparam[tgt].exc_throttle; 1136 isp_mboxcmd(isp, &mbs, MBLOGALL); 1137 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 1138 break; 1139 } 1140 } 1141 } 1142 for (tgt = 0; tgt < MAX_TARGETS; tgt++) { 1143 if (sdp->isp_devparam[tgt].dev_refresh) { 1144 isp->isp_sendmarker |= (1 << channel); 1145 isp->isp_update |= (1 << channel); 1146 break; 1147 } 1148 } 1149 } 1150 1151 /* 1152 * Fibre Channel specific initialization. 1153 * 1154 * Locks are held before coming here. 1155 */ 1156 static void 1157 isp_fibre_init(struct ispsoftc *isp) 1158 { 1159 fcparam *fcp; 1160 isp_icb_t local, *icbp = &local; 1161 mbreg_t mbs; 1162 int loopid; 1163 u_int64_t nwwn, pwwn; 1164 1165 fcp = isp->isp_param; 1166 1167 /* 1168 * Do this *before* initializing the firmware. 1169 */ 1170 isp_mark_getpdb_all(isp); 1171 fcp->isp_fwstate = FW_CONFIG_WAIT; 1172 fcp->isp_loopstate = LOOP_NIL; 1173 1174 /* 1175 * If we have no role (neither target nor initiator), return. 1176 */ 1177 if (isp->isp_role == ISP_ROLE_NONE) { 1178 return; 1179 } 1180 1181 loopid = fcp->isp_loopid; 1182 MEMZERO(icbp, sizeof (*icbp)); 1183 icbp->icb_version = ICB_VERSION1; 1184 1185 /* 1186 * Firmware Options are either retrieved from NVRAM or 1187 * are patched elsewhere. We check them for sanity here 1188 * and make changes based on board revision, but otherwise 1189 * let others decide policy. 1190 */ 1191 1192 /* 1193 * If this is a 2100 < revision 5, we have to turn off FAIRNESS. 1194 */ 1195 if ((isp->isp_type == ISP_HA_FC_2100) && isp->isp_revision < 5) { 1196 fcp->isp_fwoptions &= ~ICBOPT_FAIRNESS; 1197 } 1198 1199 /* 1200 * We have to use FULL LOGIN even though it resets the loop too much 1201 * because otherwise port database entries don't get updated after 1202 * a LIP- this is a known f/w bug for 2100 f/w less than 1.17.0. 1203 */ 1204 if (ISP_FW_REVX(isp->isp_fwrev) < ISP_FW_REV(1, 17, 0)) { 1205 fcp->isp_fwoptions |= ICBOPT_FULL_LOGIN; 1206 } 1207 1208 /* 1209 * Insist on Port Database Update Async notifications 1210 */ 1211 fcp->isp_fwoptions |= ICBOPT_PDBCHANGE_AE; 1212 1213 /* 1214 * Make sure that target role reflects into fwoptions. 1215 */ 1216 if (isp->isp_role & ISP_ROLE_TARGET) { 1217 fcp->isp_fwoptions |= ICBOPT_TGT_ENABLE; 1218 } else { 1219 fcp->isp_fwoptions &= ~ICBOPT_TGT_ENABLE; 1220 } 1221 1222 /* 1223 * Propagate all of this into the ICB structure. 1224 */ 1225 icbp->icb_fwoptions = fcp->isp_fwoptions; 1226 icbp->icb_maxfrmlen = fcp->isp_maxfrmlen; 1227 if (icbp->icb_maxfrmlen < ICB_MIN_FRMLEN || 1228 icbp->icb_maxfrmlen > ICB_MAX_FRMLEN) { 1229 isp_prt(isp, ISP_LOGERR, 1230 "bad frame length (%d) from NVRAM- using %d", 1231 fcp->isp_maxfrmlen, ICB_DFLT_FRMLEN); 1232 icbp->icb_maxfrmlen = ICB_DFLT_FRMLEN; 1233 } 1234 icbp->icb_maxalloc = fcp->isp_maxalloc; 1235 if (icbp->icb_maxalloc < 1) { 1236 isp_prt(isp, ISP_LOGERR, 1237 "bad maximum allocation (%d)- using 16", fcp->isp_maxalloc); 1238 icbp->icb_maxalloc = 16; 1239 } 1240 icbp->icb_execthrottle = fcp->isp_execthrottle; 1241 if (icbp->icb_execthrottle < 1) { 1242 isp_prt(isp, ISP_LOGERR, 1243 "bad execution throttle of %d- using 16", 1244 fcp->isp_execthrottle); 1245 icbp->icb_execthrottle = ICB_DFLT_THROTTLE; 1246 } 1247 icbp->icb_retry_delay = fcp->isp_retry_delay; 1248 icbp->icb_retry_count = fcp->isp_retry_count; 1249 icbp->icb_hardaddr = loopid; 1250 /* 1251 * Right now we just set extended options to prefer point-to-point 1252 * over loop based upon some soft config options. 1253 * 1254 * NB: for the 2300, ICBOPT_EXTENDED is required. 1255 */ 1256 if (IS_2200(isp) || IS_23XX(isp)) { 1257 icbp->icb_fwoptions |= ICBOPT_EXTENDED; 1258 /* 1259 * Prefer or force Point-To-Point instead Loop? 1260 */ 1261 switch(isp->isp_confopts & ISP_CFG_PORT_PREF) { 1262 case ISP_CFG_NPORT: 1263 icbp->icb_xfwoptions |= ICBXOPT_PTP_2_LOOP; 1264 break; 1265 case ISP_CFG_NPORT_ONLY: 1266 icbp->icb_xfwoptions |= ICBXOPT_PTP_ONLY; 1267 break; 1268 case ISP_CFG_LPORT_ONLY: 1269 icbp->icb_xfwoptions |= ICBXOPT_LOOP_ONLY; 1270 break; 1271 default: 1272 icbp->icb_xfwoptions |= ICBXOPT_LOOP_2_PTP; 1273 break; 1274 } 1275 if (IS_23XX(isp)) { 1276 if (IS_2300(isp) && isp->isp_revision < 2) { 1277 icbp->icb_fwoptions &= ~ICBOPT_FAST_POST; 1278 } 1279 if (isp->isp_confopts & ISP_CFG_ONEGB) { 1280 icbp->icb_zfwoptions |= ICBZOPT_RATE_ONEGB; 1281 } else if (isp->isp_confopts & ISP_CFG_TWOGB) { 1282 icbp->icb_zfwoptions |= ICBZOPT_RATE_TWOGB; 1283 } else { 1284 icbp->icb_zfwoptions |= ICBZOPT_RATE_AUTO; 1285 } 1286 } 1287 } 1288 1289 #ifndef ISP_NO_RIO_FC 1290 /* 1291 * RIO seems to be enabled in 2100s for fw >= 1.17.0. 1292 * 1293 * I've had some questionable problems with RIO on 2200. 1294 * More specifically, on a 2204 I had problems with RIO 1295 * on a Linux system where I was dropping commands right 1296 * and left. It's not clear to me what the actual problem 1297 * was, but it seems safer to only support this on the 1298 * 23XX cards. 1299 * 1300 * I have it disabled if we support a target mode role for 1301 * reasons I can't now remember. 1302 */ 1303 if ((isp->isp_role & ISP_ROLE_TARGET) == 0 && IS_23XX(isp)) { 1304 icbp->icb_xfwoptions |= ICBXOPT_RIO_16BIT; 1305 icbp->icb_racctimer = 4; 1306 icbp->icb_idelaytimer = 8; 1307 } 1308 #endif 1309 1310 if ((IS_2200(isp) && ISP_FW_REVX(isp->isp_fwrev) >= 1311 ISP_FW_REV(2, 1, 26)) || IS_23XX(isp)) { 1312 /* 1313 * Turn on LIP F8 async event (1) 1314 * Turn on generate AE 8013 on all LIP Resets (2) 1315 * Disable LIP F7 switching (8) 1316 */ 1317 mbs.param[0] = MBOX_SET_FIRMWARE_OPTIONS; 1318 mbs.param[1] = 0xb; 1319 mbs.param[2] = 0; 1320 mbs.param[3] = 0; 1321 isp_mboxcmd(isp, &mbs, MBLOGALL); 1322 } 1323 icbp->icb_logintime = 30; /* 30 second login timeout */ 1324 1325 if (IS_23XX(isp)) { 1326 ISP_WRITE(isp, isp->isp_rqstinrp, 0); 1327 ISP_WRITE(isp, isp->isp_rqstoutrp, 0); 1328 ISP_WRITE(isp, isp->isp_respinrp, 0); 1329 ISP_WRITE(isp, isp->isp_respoutrp, 0); 1330 } 1331 1332 nwwn = ISP_NODEWWN(isp); 1333 pwwn = ISP_PORTWWN(isp); 1334 if (nwwn && pwwn) { 1335 icbp->icb_fwoptions |= ICBOPT_BOTH_WWNS; 1336 MAKE_NODE_NAME_FROM_WWN(icbp->icb_nodename, nwwn); 1337 MAKE_NODE_NAME_FROM_WWN(icbp->icb_portname, pwwn); 1338 isp_prt(isp, ISP_LOGDEBUG1, 1339 "Setting ICB Node 0x%08x%08x Port 0x%08x%08x", 1340 ((u_int32_t) (nwwn >> 32)), 1341 ((u_int32_t) (nwwn & 0xffffffff)), 1342 ((u_int32_t) (pwwn >> 32)), 1343 ((u_int32_t) (pwwn & 0xffffffff))); 1344 } else { 1345 isp_prt(isp, ISP_LOGDEBUG1, "Not using any WWNs"); 1346 icbp->icb_fwoptions &= ~(ICBOPT_BOTH_WWNS|ICBOPT_FULL_LOGIN); 1347 } 1348 icbp->icb_rqstqlen = RQUEST_QUEUE_LEN(isp); 1349 icbp->icb_rsltqlen = RESULT_QUEUE_LEN(isp); 1350 icbp->icb_rqstaddr[RQRSP_ADDR0015] = DMA_WD0(isp->isp_rquest_dma); 1351 icbp->icb_rqstaddr[RQRSP_ADDR1631] = DMA_WD1(isp->isp_rquest_dma); 1352 icbp->icb_rqstaddr[RQRSP_ADDR3247] = DMA_WD2(isp->isp_rquest_dma); 1353 icbp->icb_rqstaddr[RQRSP_ADDR4863] = DMA_WD3(isp->isp_rquest_dma); 1354 icbp->icb_respaddr[RQRSP_ADDR0015] = DMA_WD0(isp->isp_result_dma); 1355 icbp->icb_respaddr[RQRSP_ADDR1631] = DMA_WD1(isp->isp_result_dma); 1356 icbp->icb_respaddr[RQRSP_ADDR3247] = DMA_WD2(isp->isp_result_dma); 1357 icbp->icb_respaddr[RQRSP_ADDR4863] = DMA_WD3(isp->isp_result_dma); 1358 isp_prt(isp, ISP_LOGDEBUG1, 1359 "isp_fibre_init: fwoptions 0x%x", fcp->isp_fwoptions); 1360 1361 FC_SCRATCH_ACQUIRE(isp); 1362 isp_put_icb(isp, icbp, (isp_icb_t *)fcp->isp_scratch); 1363 1364 /* 1365 * Init the firmware 1366 */ 1367 mbs.param[0] = MBOX_INIT_FIRMWARE; 1368 mbs.param[1] = 0; 1369 mbs.param[2] = DMA_WD1(fcp->isp_scdma); 1370 mbs.param[3] = DMA_WD0(fcp->isp_scdma); 1371 mbs.param[4] = 0; 1372 mbs.param[5] = 0; 1373 mbs.param[6] = DMA_WD3(fcp->isp_scdma); 1374 mbs.param[7] = DMA_WD2(fcp->isp_scdma); 1375 isp_mboxcmd(isp, &mbs, MBLOGALL); 1376 FC_SCRATCH_RELEASE(isp); 1377 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 1378 return; 1379 } 1380 isp->isp_reqidx = isp->isp_reqodx = 0; 1381 isp->isp_residx = 0; 1382 isp->isp_sendmarker = 1; 1383 1384 /* 1385 * Whatever happens, we're now committed to being here. 1386 */ 1387 isp->isp_state = ISP_INITSTATE; 1388 } 1389 1390 /* 1391 * Fibre Channel Support- get the port database for the id. 1392 * 1393 * Locks are held before coming here. Return 0 if success, 1394 * else failure. 1395 */ 1396 1397 static int 1398 isp_getmap(struct ispsoftc *isp, fcpos_map_t *map) 1399 { 1400 fcparam *fcp = (fcparam *) isp->isp_param; 1401 mbreg_t mbs; 1402 1403 mbs.param[0] = MBOX_GET_FC_AL_POSITION_MAP; 1404 mbs.param[1] = 0; 1405 mbs.param[2] = DMA_WD1(fcp->isp_scdma); 1406 mbs.param[3] = DMA_WD0(fcp->isp_scdma); 1407 /* 1408 * Unneeded. For the 2100, except for initializing f/w, registers 1409 * 4/5 have to not be written to. 1410 * mbs.param[4] = 0; 1411 * mbs.param[5] = 0; 1412 * 1413 */ 1414 mbs.param[6] = 0; 1415 mbs.param[7] = 0; 1416 FC_SCRATCH_ACQUIRE(isp); 1417 isp_mboxcmd(isp, &mbs, MBLOGALL & ~MBOX_COMMAND_PARAM_ERROR); 1418 if (mbs.param[0] == MBOX_COMMAND_COMPLETE) { 1419 MEMCPY(map, fcp->isp_scratch, sizeof (fcpos_map_t)); 1420 map->fwmap = mbs.param[1] != 0; 1421 FC_SCRATCH_RELEASE(isp); 1422 return (0); 1423 } 1424 FC_SCRATCH_RELEASE(isp); 1425 return (-1); 1426 } 1427 1428 static void 1429 isp_mark_getpdb_all(struct ispsoftc *isp) 1430 { 1431 fcparam *fcp = (fcparam *) isp->isp_param; 1432 int i; 1433 for (i = 0; i < MAX_FC_TARG; i++) { 1434 fcp->portdb[i].valid = fcp->portdb[i].fabric_dev = 0; 1435 } 1436 } 1437 1438 static int 1439 isp_getpdb(struct ispsoftc *isp, int id, isp_pdb_t *pdbp) 1440 { 1441 fcparam *fcp = (fcparam *) isp->isp_param; 1442 mbreg_t mbs; 1443 1444 mbs.param[0] = MBOX_GET_PORT_DB; 1445 mbs.param[1] = id << 8; 1446 mbs.param[2] = DMA_WD1(fcp->isp_scdma); 1447 mbs.param[3] = DMA_WD0(fcp->isp_scdma); 1448 /* 1449 * Unneeded. For the 2100, except for initializing f/w, registers 1450 * 4/5 have to not be written to. 1451 * mbs.param[4] = 0; 1452 * mbs.param[5] = 0; 1453 * 1454 */ 1455 mbs.param[6] = DMA_WD3(fcp->isp_scdma); 1456 mbs.param[7] = DMA_WD2(fcp->isp_scdma); 1457 FC_SCRATCH_ACQUIRE(isp); 1458 isp_mboxcmd(isp, &mbs, MBLOGALL & ~MBOX_COMMAND_PARAM_ERROR); 1459 if (mbs.param[0] == MBOX_COMMAND_COMPLETE) { 1460 isp_get_pdb(isp, (isp_pdb_t *)fcp->isp_scratch, pdbp); 1461 FC_SCRATCH_RELEASE(isp); 1462 return (0); 1463 } 1464 FC_SCRATCH_RELEASE(isp); 1465 return (-1); 1466 } 1467 1468 static u_int64_t 1469 isp_get_portname(struct ispsoftc *isp, int loopid, int nodename) 1470 { 1471 u_int64_t wwn = 0; 1472 mbreg_t mbs; 1473 1474 mbs.param[0] = MBOX_GET_PORT_NAME; 1475 mbs.param[1] = loopid << 8; 1476 if (nodename) 1477 mbs.param[1] |= 1; 1478 isp_mboxcmd(isp, &mbs, MBLOGALL & ~MBOX_COMMAND_PARAM_ERROR); 1479 if (mbs.param[0] == MBOX_COMMAND_COMPLETE) { 1480 wwn = 1481 (((u_int64_t)(mbs.param[2] & 0xff)) << 56) | 1482 (((u_int64_t)(mbs.param[2] >> 8)) << 48) | 1483 (((u_int64_t)(mbs.param[3] & 0xff)) << 40) | 1484 (((u_int64_t)(mbs.param[3] >> 8)) << 32) | 1485 (((u_int64_t)(mbs.param[6] & 0xff)) << 24) | 1486 (((u_int64_t)(mbs.param[6] >> 8)) << 16) | 1487 (((u_int64_t)(mbs.param[7] & 0xff)) << 8) | 1488 (((u_int64_t)(mbs.param[7] >> 8))); 1489 } 1490 return (wwn); 1491 } 1492 1493 /* 1494 * Make sure we have good FC link and know our Loop ID. 1495 */ 1496 1497 static int 1498 isp_fclink_test(struct ispsoftc *isp, int usdelay) 1499 { 1500 static char *toponames[] = { 1501 "Private Loop", 1502 "FL Port", 1503 "N-Port to N-Port", 1504 "F Port", 1505 "F Port (no FLOGI_ACC response)" 1506 }; 1507 mbreg_t mbs; 1508 int count, check_for_fabric; 1509 u_int8_t lwfs; 1510 fcparam *fcp; 1511 struct lportdb *lp; 1512 isp_pdb_t pdb; 1513 1514 fcp = isp->isp_param; 1515 1516 /* 1517 * XXX: Here is where we would start a 'loop dead' timeout 1518 */ 1519 1520 /* 1521 * Wait up to N microseconds for F/W to go to a ready state. 1522 */ 1523 lwfs = FW_CONFIG_WAIT; 1524 count = 0; 1525 while (count < usdelay) { 1526 u_int64_t enano; 1527 u_int32_t wrk; 1528 NANOTIME_T hra, hrb; 1529 1530 GET_NANOTIME(&hra); 1531 isp_fw_state(isp); 1532 if (lwfs != fcp->isp_fwstate) { 1533 isp_prt(isp, ISP_LOGINFO, "Firmware State <%s->%s>", 1534 isp2100_fw_statename((int)lwfs), 1535 isp2100_fw_statename((int)fcp->isp_fwstate)); 1536 lwfs = fcp->isp_fwstate; 1537 } 1538 if (fcp->isp_fwstate == FW_READY) { 1539 break; 1540 } 1541 GET_NANOTIME(&hrb); 1542 1543 /* 1544 * Get the elapsed time in nanoseconds. 1545 * Always guaranteed to be non-zero. 1546 */ 1547 enano = NANOTIME_SUB(&hrb, &hra); 1548 1549 isp_prt(isp, ISP_LOGDEBUG1, 1550 "usec%d: 0x%lx->0x%lx enano 0x%x%08x", 1551 count, (long) GET_NANOSEC(&hra), (long) GET_NANOSEC(&hrb), 1552 (u_int32_t)(enano >> 32), (u_int32_t)(enano & 0xffffffff)); 1553 1554 /* 1555 * If the elapsed time is less than 1 millisecond, 1556 * delay a period of time up to that millisecond of 1557 * waiting. 1558 * 1559 * This peculiar code is an attempt to try and avoid 1560 * invoking u_int64_t math support functions for some 1561 * platforms where linkage is a problem. 1562 */ 1563 if (enano < (1000 * 1000)) { 1564 count += 1000; 1565 enano = (1000 * 1000) - enano; 1566 while (enano > (u_int64_t) 4000000000U) { 1567 USEC_SLEEP(isp, 4000000); 1568 enano -= (u_int64_t) 4000000000U; 1569 } 1570 wrk = enano; 1571 wrk /= 1000; 1572 USEC_SLEEP(isp, wrk); 1573 } else { 1574 while (enano > (u_int64_t) 4000000000U) { 1575 count += 4000000; 1576 enano -= (u_int64_t) 4000000000U; 1577 } 1578 wrk = enano; 1579 count += (wrk / 1000); 1580 } 1581 } 1582 1583 /* 1584 * If we haven't gone to 'ready' state, return. 1585 */ 1586 if (fcp->isp_fwstate != FW_READY) { 1587 return (-1); 1588 } 1589 1590 /* 1591 * Get our Loop ID (if possible). We really need to have it. 1592 */ 1593 mbs.param[0] = MBOX_GET_LOOP_ID; 1594 isp_mboxcmd(isp, &mbs, MBLOGALL); 1595 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 1596 return (-1); 1597 } 1598 fcp->isp_loopid = mbs.param[1]; 1599 if (IS_2200(isp) || IS_23XX(isp)) { 1600 int topo = (int) mbs.param[6]; 1601 if (topo < TOPO_NL_PORT || topo > TOPO_PTP_STUB) 1602 topo = TOPO_PTP_STUB; 1603 fcp->isp_topo = topo; 1604 } else { 1605 fcp->isp_topo = TOPO_NL_PORT; 1606 } 1607 fcp->isp_portid = fcp->isp_alpa = mbs.param[2] & 0xff; 1608 1609 /* 1610 * Check to see if we're on a fabric by trying to see if we 1611 * can talk to the fabric name server. This can be a bit 1612 * tricky because if we're a 2100, we should check always 1613 * (in case we're connected to an server doing aliasing). 1614 */ 1615 fcp->isp_onfabric = 0; 1616 1617 if (IS_2100(isp)) 1618 check_for_fabric = 1; 1619 else if (fcp->isp_topo == TOPO_FL_PORT || fcp->isp_topo == TOPO_F_PORT) 1620 check_for_fabric = 1; 1621 else 1622 check_for_fabric = 0; 1623 1624 if (check_for_fabric && isp_getpdb(isp, FL_PORT_ID, &pdb) == 0) { 1625 int loopid = FL_PORT_ID; 1626 if (IS_2100(isp)) { 1627 fcp->isp_topo = TOPO_FL_PORT; 1628 } 1629 1630 if (BITS2WORD(pdb.pdb_portid_bits) == 0) { 1631 /* 1632 * Crock. 1633 */ 1634 fcp->isp_topo = TOPO_NL_PORT; 1635 goto not_on_fabric; 1636 } 1637 fcp->isp_portid = mbs.param[2] | ((int) mbs.param[3] << 16); 1638 1639 /* 1640 * Save the Fabric controller's port database entry. 1641 */ 1642 lp = &fcp->portdb[loopid]; 1643 lp->node_wwn = 1644 (((u_int64_t)pdb.pdb_nodename[0]) << 56) | 1645 (((u_int64_t)pdb.pdb_nodename[1]) << 48) | 1646 (((u_int64_t)pdb.pdb_nodename[2]) << 40) | 1647 (((u_int64_t)pdb.pdb_nodename[3]) << 32) | 1648 (((u_int64_t)pdb.pdb_nodename[4]) << 24) | 1649 (((u_int64_t)pdb.pdb_nodename[5]) << 16) | 1650 (((u_int64_t)pdb.pdb_nodename[6]) << 8) | 1651 (((u_int64_t)pdb.pdb_nodename[7])); 1652 lp->port_wwn = 1653 (((u_int64_t)pdb.pdb_portname[0]) << 56) | 1654 (((u_int64_t)pdb.pdb_portname[1]) << 48) | 1655 (((u_int64_t)pdb.pdb_portname[2]) << 40) | 1656 (((u_int64_t)pdb.pdb_portname[3]) << 32) | 1657 (((u_int64_t)pdb.pdb_portname[4]) << 24) | 1658 (((u_int64_t)pdb.pdb_portname[5]) << 16) | 1659 (((u_int64_t)pdb.pdb_portname[6]) << 8) | 1660 (((u_int64_t)pdb.pdb_portname[7])); 1661 lp->roles = 1662 (pdb.pdb_prli_svc3 & SVC3_ROLE_MASK) >> SVC3_ROLE_SHIFT; 1663 lp->portid = BITS2WORD(pdb.pdb_portid_bits); 1664 lp->loopid = pdb.pdb_loopid; 1665 lp->loggedin = lp->valid = 1; 1666 fcp->isp_onfabric = 1; 1667 (void) isp_async(isp, ISPASYNC_PROMENADE, &loopid); 1668 isp_register_fc4_type(isp); 1669 } else { 1670 not_on_fabric: 1671 fcp->isp_onfabric = 0; 1672 fcp->portdb[FL_PORT_ID].valid = 0; 1673 } 1674 1675 fcp->isp_gbspeed = 1; 1676 if (IS_23XX(isp)) { 1677 mbs.param[0] = MBOX_GET_SET_DATA_RATE; 1678 mbs.param[1] = MBGSD_GET_RATE; 1679 /* mbs.param[2] undefined if we're just getting rate */ 1680 isp_mboxcmd(isp, &mbs, MBLOGALL); 1681 if (mbs.param[0] == MBOX_COMMAND_COMPLETE) { 1682 if (mbs.param[1] == MBGSD_TWOGB) { 1683 isp_prt(isp, ISP_LOGINFO, "2Gb link speed/s"); 1684 fcp->isp_gbspeed = 2; 1685 } 1686 } 1687 } 1688 1689 isp_prt(isp, ISP_LOGCONFIG, topology, fcp->isp_loopid, fcp->isp_alpa, 1690 fcp->isp_portid, fcp->isp_loopstate, toponames[fcp->isp_topo]); 1691 1692 /* 1693 * Announce ourselves, too. This involves synthesizing an entry. 1694 */ 1695 if (fcp->isp_iid_set == 0) { 1696 fcp->isp_iid_set = 1; 1697 fcp->isp_iid = fcp->isp_loopid; 1698 lp = &fcp->portdb[fcp->isp_iid]; 1699 } else { 1700 lp = &fcp->portdb[fcp->isp_iid]; 1701 if (fcp->isp_portid != lp->portid || 1702 fcp->isp_loopid != lp->loopid || 1703 fcp->isp_nodewwn != ISP_NODEWWN(isp) || 1704 fcp->isp_portwwn != ISP_PORTWWN(isp)) { 1705 lp->valid = 0; 1706 count = fcp->isp_iid; 1707 (void) isp_async(isp, ISPASYNC_PROMENADE, &count); 1708 } 1709 } 1710 lp->loopid = fcp->isp_loopid; 1711 lp->portid = fcp->isp_portid; 1712 lp->node_wwn = ISP_NODEWWN(isp); 1713 lp->port_wwn = ISP_PORTWWN(isp); 1714 switch (isp->isp_role) { 1715 case ISP_ROLE_NONE: 1716 lp->roles = 0; 1717 break; 1718 case ISP_ROLE_TARGET: 1719 lp->roles = SVC3_TGT_ROLE >> SVC3_ROLE_SHIFT; 1720 break; 1721 case ISP_ROLE_INITIATOR: 1722 lp->roles = SVC3_INI_ROLE >> SVC3_ROLE_SHIFT; 1723 break; 1724 case ISP_ROLE_BOTH: 1725 lp->roles = (SVC3_INI_ROLE|SVC3_TGT_ROLE) >> SVC3_ROLE_SHIFT; 1726 break; 1727 } 1728 lp->loggedin = lp->valid = 1; 1729 count = fcp->isp_iid; 1730 (void) isp_async(isp, ISPASYNC_PROMENADE, &count); 1731 return (0); 1732 } 1733 1734 static char * 1735 isp2100_fw_statename(int state) 1736 { 1737 switch(state) { 1738 case FW_CONFIG_WAIT: return "Config Wait"; 1739 case FW_WAIT_AL_PA: return "Waiting for AL_PA"; 1740 case FW_WAIT_LOGIN: return "Wait Login"; 1741 case FW_READY: return "Ready"; 1742 case FW_LOSS_OF_SYNC: return "Loss Of Sync"; 1743 case FW_ERROR: return "Error"; 1744 case FW_REINIT: return "Re-Init"; 1745 case FW_NON_PART: return "Nonparticipating"; 1746 default: return "?????"; 1747 } 1748 } 1749 1750 /* 1751 * Synchronize our soft copy of the port database with what the f/w thinks 1752 * (with a view toward possibly for a specific target....) 1753 */ 1754 1755 static int 1756 isp_pdb_sync(struct ispsoftc *isp) 1757 { 1758 struct lportdb *lp; 1759 fcparam *fcp = isp->isp_param; 1760 isp_pdb_t pdb; 1761 int loopid, base, lim; 1762 1763 /* 1764 * Make sure we're okay for doing this right now. 1765 */ 1766 if (fcp->isp_loopstate != LOOP_PDB_RCVD && 1767 fcp->isp_loopstate != LOOP_FSCAN_DONE && 1768 fcp->isp_loopstate != LOOP_LSCAN_DONE) { 1769 return (-1); 1770 } 1771 1772 if (fcp->isp_topo == TOPO_FL_PORT || fcp->isp_topo == TOPO_NL_PORT || 1773 fcp->isp_topo == TOPO_N_PORT) { 1774 if (fcp->isp_loopstate < LOOP_LSCAN_DONE) { 1775 if (isp_scan_loop(isp) != 0) { 1776 return (-1); 1777 } 1778 } 1779 } 1780 fcp->isp_loopstate = LOOP_SYNCING_PDB; 1781 1782 /* 1783 * If we get this far, we've settled our differences with the f/w 1784 * (for local loop device) and we can say that the loop state is ready. 1785 */ 1786 1787 if (fcp->isp_topo == TOPO_NL_PORT) { 1788 fcp->loop_seen_once = 1; 1789 fcp->isp_loopstate = LOOP_READY; 1790 return (0); 1791 } 1792 1793 /* 1794 * Find all Fabric Entities that didn't make it from one scan to the 1795 * next and let the world know they went away. Scan the whole database. 1796 */ 1797 for (lp = &fcp->portdb[0]; lp < &fcp->portdb[MAX_FC_TARG]; lp++) { 1798 if (lp->was_fabric_dev && lp->fabric_dev == 0) { 1799 loopid = lp - fcp->portdb; 1800 lp->valid = 0; /* should already be set */ 1801 (void) isp_async(isp, ISPASYNC_PROMENADE, &loopid); 1802 MEMZERO((void *) lp, sizeof (*lp)); 1803 continue; 1804 } 1805 lp->was_fabric_dev = lp->fabric_dev; 1806 } 1807 1808 if (fcp->isp_topo == TOPO_FL_PORT) 1809 base = FC_SNS_ID+1; 1810 else 1811 base = 0; 1812 1813 if (fcp->isp_topo == TOPO_N_PORT) 1814 lim = 1; 1815 else 1816 lim = MAX_FC_TARG; 1817 1818 /* 1819 * Now log in any fabric devices that the outer layer has 1820 * left for us to see. This seems the most sane policy 1821 * for the moment. 1822 */ 1823 for (lp = &fcp->portdb[base]; lp < &fcp->portdb[lim]; lp++) { 1824 u_int32_t portid; 1825 mbreg_t mbs; 1826 1827 loopid = lp - fcp->portdb; 1828 if (loopid >= FL_PORT_ID && loopid <= FC_SNS_ID) { 1829 continue; 1830 } 1831 1832 /* 1833 * Anything here? 1834 */ 1835 if (lp->port_wwn == 0) { 1836 continue; 1837 } 1838 1839 /* 1840 * Don't try to log into yourself. 1841 */ 1842 if ((portid = lp->portid) == fcp->isp_portid) { 1843 continue; 1844 } 1845 1846 1847 /* 1848 * If we'd been logged in- see if we still are and we haven't 1849 * changed. If so, no need to log ourselves out, etc.. 1850 * 1851 * Unfortunately, our charming Qlogic f/w has decided to 1852 * return a valid port database entry for a fabric device 1853 * that has, in fact, gone away. And it hangs trying to 1854 * log it out. 1855 */ 1856 if (lp->loggedin && lp->force_logout == 0 && 1857 isp_getpdb(isp, lp->loopid, &pdb) == 0) { 1858 int nrole; 1859 u_int64_t nwwnn, nwwpn; 1860 nwwnn = 1861 (((u_int64_t)pdb.pdb_nodename[0]) << 56) | 1862 (((u_int64_t)pdb.pdb_nodename[1]) << 48) | 1863 (((u_int64_t)pdb.pdb_nodename[2]) << 40) | 1864 (((u_int64_t)pdb.pdb_nodename[3]) << 32) | 1865 (((u_int64_t)pdb.pdb_nodename[4]) << 24) | 1866 (((u_int64_t)pdb.pdb_nodename[5]) << 16) | 1867 (((u_int64_t)pdb.pdb_nodename[6]) << 8) | 1868 (((u_int64_t)pdb.pdb_nodename[7])); 1869 nwwpn = 1870 (((u_int64_t)pdb.pdb_portname[0]) << 56) | 1871 (((u_int64_t)pdb.pdb_portname[1]) << 48) | 1872 (((u_int64_t)pdb.pdb_portname[2]) << 40) | 1873 (((u_int64_t)pdb.pdb_portname[3]) << 32) | 1874 (((u_int64_t)pdb.pdb_portname[4]) << 24) | 1875 (((u_int64_t)pdb.pdb_portname[5]) << 16) | 1876 (((u_int64_t)pdb.pdb_portname[6]) << 8) | 1877 (((u_int64_t)pdb.pdb_portname[7])); 1878 nrole = (pdb.pdb_prli_svc3 & SVC3_ROLE_MASK) >> 1879 SVC3_ROLE_SHIFT; 1880 if (pdb.pdb_loopid == lp->loopid && lp->portid == 1881 (u_int32_t) BITS2WORD(pdb.pdb_portid_bits) && 1882 nwwnn == lp->node_wwn && nwwpn == lp->port_wwn && 1883 lp->roles == nrole && lp->force_logout == 0) { 1884 lp->loggedin = lp->valid = 1; 1885 isp_prt(isp, ISP_LOGCONFIG, lretained, 1886 (int) (lp - fcp->portdb), 1887 (int) lp->loopid, lp->portid); 1888 continue; 1889 } 1890 } 1891 1892 if (fcp->isp_fwstate != FW_READY || 1893 fcp->isp_loopstate != LOOP_SYNCING_PDB) { 1894 return (-1); 1895 } 1896 1897 /* 1898 * Force a logout if we were logged in. 1899 */ 1900 if (lp->loggedin) { 1901 if (lp->force_logout || 1902 isp_getpdb(isp, lp->loopid, &pdb) == 0) { 1903 mbs.param[0] = MBOX_FABRIC_LOGOUT; 1904 mbs.param[1] = lp->loopid << 8; 1905 mbs.param[2] = 0; 1906 mbs.param[3] = 0; 1907 isp_mboxcmd(isp, &mbs, MBLOGNONE); 1908 isp_prt(isp, ISP_LOGINFO, plogout, 1909 (int) (lp - fcp->portdb), lp->loopid, 1910 lp->portid); 1911 } 1912 lp->force_logout = lp->loggedin = 0; 1913 if (fcp->isp_fwstate != FW_READY || 1914 fcp->isp_loopstate != LOOP_SYNCING_PDB) { 1915 return (-1); 1916 } 1917 } 1918 1919 /* 1920 * And log in.... 1921 */ 1922 loopid = lp - fcp->portdb; 1923 lp->loopid = FL_PORT_ID; 1924 do { 1925 mbs.param[0] = MBOX_FABRIC_LOGIN; 1926 mbs.param[1] = loopid << 8; 1927 mbs.param[2] = portid >> 16; 1928 mbs.param[3] = portid & 0xffff; 1929 isp_mboxcmd(isp, &mbs, MBLOGALL & ~(MBOX_LOOP_ID_USED | 1930 MBOX_PORT_ID_USED | MBOX_COMMAND_ERROR)); 1931 if (fcp->isp_fwstate != FW_READY || 1932 fcp->isp_loopstate != LOOP_SYNCING_PDB) { 1933 return (-1); 1934 } 1935 switch (mbs.param[0]) { 1936 case MBOX_LOOP_ID_USED: 1937 /* 1938 * Try the next available loop id. 1939 */ 1940 loopid++; 1941 break; 1942 case MBOX_PORT_ID_USED: 1943 /* 1944 * This port is already logged in. 1945 * Snaffle the loop id it's using if it's 1946 * nonzero, otherwise we're hosed. 1947 */ 1948 if (mbs.param[1] != 0) { 1949 loopid = mbs.param[1]; 1950 isp_prt(isp, ISP_LOGINFO, retained, 1951 loopid, (int) (lp - fcp->portdb), 1952 lp->portid); 1953 } else { 1954 loopid = MAX_FC_TARG; 1955 break; 1956 } 1957 /* FALLTHROUGH */ 1958 case MBOX_COMMAND_COMPLETE: 1959 lp->loggedin = 1; 1960 lp->loopid = loopid; 1961 break; 1962 case MBOX_COMMAND_ERROR: 1963 isp_prt(isp, ISP_LOGINFO, plogierr, 1964 portid, mbs.param[1]); 1965 /* FALLTHROUGH */ 1966 case MBOX_ALL_IDS_USED: /* We're outta IDs */ 1967 default: 1968 loopid = MAX_FC_TARG; 1969 break; 1970 } 1971 } while (lp->loopid == FL_PORT_ID && loopid < MAX_FC_TARG); 1972 1973 /* 1974 * If we get here and we haven't set a Loop ID, 1975 * we failed to log into this device. 1976 */ 1977 1978 if (lp->loopid == FL_PORT_ID) { 1979 lp->loopid = 0; 1980 continue; 1981 } 1982 1983 /* 1984 * Make sure we can get the approriate port information. 1985 */ 1986 if (isp_getpdb(isp, lp->loopid, &pdb) != 0) { 1987 isp_prt(isp, ISP_LOGWARN, nopdb, lp->portid); 1988 goto dump_em; 1989 } 1990 1991 if (fcp->isp_fwstate != FW_READY || 1992 fcp->isp_loopstate != LOOP_SYNCING_PDB) { 1993 return (-1); 1994 } 1995 1996 if (pdb.pdb_loopid != lp->loopid) { 1997 isp_prt(isp, ISP_LOGWARN, pdbmfail1, 1998 lp->portid, pdb.pdb_loopid); 1999 goto dump_em; 2000 } 2001 2002 if (lp->portid != (u_int32_t) BITS2WORD(pdb.pdb_portid_bits)) { 2003 isp_prt(isp, ISP_LOGWARN, pdbmfail2, 2004 lp->portid, BITS2WORD(pdb.pdb_portid_bits)); 2005 goto dump_em; 2006 } 2007 2008 lp->roles = 2009 (pdb.pdb_prli_svc3 & SVC3_ROLE_MASK) >> SVC3_ROLE_SHIFT; 2010 lp->node_wwn = 2011 (((u_int64_t)pdb.pdb_nodename[0]) << 56) | 2012 (((u_int64_t)pdb.pdb_nodename[1]) << 48) | 2013 (((u_int64_t)pdb.pdb_nodename[2]) << 40) | 2014 (((u_int64_t)pdb.pdb_nodename[3]) << 32) | 2015 (((u_int64_t)pdb.pdb_nodename[4]) << 24) | 2016 (((u_int64_t)pdb.pdb_nodename[5]) << 16) | 2017 (((u_int64_t)pdb.pdb_nodename[6]) << 8) | 2018 (((u_int64_t)pdb.pdb_nodename[7])); 2019 lp->port_wwn = 2020 (((u_int64_t)pdb.pdb_portname[0]) << 56) | 2021 (((u_int64_t)pdb.pdb_portname[1]) << 48) | 2022 (((u_int64_t)pdb.pdb_portname[2]) << 40) | 2023 (((u_int64_t)pdb.pdb_portname[3]) << 32) | 2024 (((u_int64_t)pdb.pdb_portname[4]) << 24) | 2025 (((u_int64_t)pdb.pdb_portname[5]) << 16) | 2026 (((u_int64_t)pdb.pdb_portname[6]) << 8) | 2027 (((u_int64_t)pdb.pdb_portname[7])); 2028 /* 2029 * Check to make sure this all makes sense. 2030 */ 2031 if (lp->node_wwn && lp->port_wwn) { 2032 lp->valid = 1; 2033 loopid = lp - fcp->portdb; 2034 (void) isp_async(isp, ISPASYNC_PROMENADE, &loopid); 2035 continue; 2036 } 2037 dump_em: 2038 lp->valid = 0; 2039 isp_prt(isp, ISP_LOGINFO, 2040 ldumped, loopid, lp->loopid, lp->portid); 2041 mbs.param[0] = MBOX_FABRIC_LOGOUT; 2042 mbs.param[1] = lp->loopid << 8; 2043 mbs.param[2] = 0; 2044 mbs.param[3] = 0; 2045 isp_mboxcmd(isp, &mbs, MBLOGNONE); 2046 if (fcp->isp_fwstate != FW_READY || 2047 fcp->isp_loopstate != LOOP_SYNCING_PDB) { 2048 return (-1); 2049 } 2050 } 2051 /* 2052 * If we get here, we've for sure seen not only a valid loop 2053 * but know what is or isn't on it, so mark this for usage 2054 * in isp_start. 2055 */ 2056 fcp->loop_seen_once = 1; 2057 fcp->isp_loopstate = LOOP_READY; 2058 return (0); 2059 } 2060 2061 static int 2062 isp_scan_loop(struct ispsoftc *isp) 2063 { 2064 struct lportdb *lp; 2065 fcparam *fcp = isp->isp_param; 2066 isp_pdb_t pdb; 2067 int loopid, lim, hival; 2068 2069 switch (fcp->isp_topo) { 2070 case TOPO_NL_PORT: 2071 hival = FL_PORT_ID; 2072 break; 2073 case TOPO_N_PORT: 2074 hival = 2; 2075 break; 2076 case TOPO_FL_PORT: 2077 hival = FC_PORT_ID; 2078 break; 2079 default: 2080 fcp->isp_loopstate = LOOP_LSCAN_DONE; 2081 return (0); 2082 } 2083 fcp->isp_loopstate = LOOP_SCANNING_LOOP; 2084 2085 /* 2086 * make sure the temp port database is clean... 2087 */ 2088 MEMZERO((void *)fcp->tport, sizeof (fcp->tport)); 2089 2090 /* 2091 * Run through the local loop ports and get port database info 2092 * for each loop ID. 2093 * 2094 * There's a somewhat unexplained situation where the f/w passes back 2095 * the wrong database entity- if that happens, just restart (up to 2096 * FL_PORT_ID times). 2097 */ 2098 for (lim = loopid = 0; loopid < hival; loopid++) { 2099 lp = &fcp->tport[loopid]; 2100 2101 /* 2102 * Don't even try for ourselves... 2103 */ 2104 if (loopid == fcp->isp_loopid) 2105 continue; 2106 2107 lp->node_wwn = isp_get_portname(isp, loopid, 1); 2108 if (fcp->isp_loopstate < LOOP_SCANNING_LOOP) 2109 return (-1); 2110 if (lp->node_wwn == 0) 2111 continue; 2112 lp->port_wwn = isp_get_portname(isp, loopid, 0); 2113 if (fcp->isp_loopstate < LOOP_SCANNING_LOOP) 2114 return (-1); 2115 if (lp->port_wwn == 0) { 2116 lp->node_wwn = 0; 2117 continue; 2118 } 2119 2120 /* 2121 * Get an entry.... 2122 */ 2123 if (isp_getpdb(isp, loopid, &pdb) != 0) { 2124 if (fcp->isp_loopstate < LOOP_SCANNING_LOOP) 2125 return (-1); 2126 continue; 2127 } 2128 if (fcp->isp_loopstate < LOOP_SCANNING_LOOP) { 2129 return (-1); 2130 } 2131 2132 /* 2133 * If the returned database element doesn't match what we 2134 * asked for, restart the process entirely (up to a point...). 2135 */ 2136 if (pdb.pdb_loopid != loopid) { 2137 loopid = 0; 2138 if (lim++ < hival) { 2139 continue; 2140 } 2141 isp_prt(isp, ISP_LOGWARN, 2142 "giving up on synchronizing the port database"); 2143 return (-1); 2144 } 2145 2146 /* 2147 * Save the pertinent info locally. 2148 */ 2149 lp->node_wwn = 2150 (((u_int64_t)pdb.pdb_nodename[0]) << 56) | 2151 (((u_int64_t)pdb.pdb_nodename[1]) << 48) | 2152 (((u_int64_t)pdb.pdb_nodename[2]) << 40) | 2153 (((u_int64_t)pdb.pdb_nodename[3]) << 32) | 2154 (((u_int64_t)pdb.pdb_nodename[4]) << 24) | 2155 (((u_int64_t)pdb.pdb_nodename[5]) << 16) | 2156 (((u_int64_t)pdb.pdb_nodename[6]) << 8) | 2157 (((u_int64_t)pdb.pdb_nodename[7])); 2158 lp->port_wwn = 2159 (((u_int64_t)pdb.pdb_portname[0]) << 56) | 2160 (((u_int64_t)pdb.pdb_portname[1]) << 48) | 2161 (((u_int64_t)pdb.pdb_portname[2]) << 40) | 2162 (((u_int64_t)pdb.pdb_portname[3]) << 32) | 2163 (((u_int64_t)pdb.pdb_portname[4]) << 24) | 2164 (((u_int64_t)pdb.pdb_portname[5]) << 16) | 2165 (((u_int64_t)pdb.pdb_portname[6]) << 8) | 2166 (((u_int64_t)pdb.pdb_portname[7])); 2167 lp->roles = 2168 (pdb.pdb_prli_svc3 & SVC3_ROLE_MASK) >> SVC3_ROLE_SHIFT; 2169 lp->portid = BITS2WORD(pdb.pdb_portid_bits); 2170 lp->loopid = pdb.pdb_loopid; 2171 } 2172 2173 /* 2174 * Mark all of the permanent local loop database entries as invalid 2175 * (except our own entry). 2176 */ 2177 for (loopid = 0; loopid < hival; loopid++) { 2178 if (loopid == fcp->isp_iid) { 2179 fcp->portdb[loopid].valid = 1; 2180 fcp->portdb[loopid].loopid = fcp->isp_loopid; 2181 continue; 2182 } 2183 fcp->portdb[loopid].valid = 0; 2184 } 2185 2186 /* 2187 * Now merge our local copy of the port database into our saved copy. 2188 * Notify the outer layers of new devices arriving. 2189 */ 2190 for (loopid = 0; loopid < hival; loopid++) { 2191 int i; 2192 2193 /* 2194 * If we don't have a non-zero Port WWN, we're not here. 2195 */ 2196 if (fcp->tport[loopid].port_wwn == 0) { 2197 continue; 2198 } 2199 2200 /* 2201 * Skip ourselves. 2202 */ 2203 if (loopid == fcp->isp_iid) { 2204 continue; 2205 } 2206 2207 /* 2208 * For the purposes of deciding whether this is the 2209 * 'same' device or not, we only search for an identical 2210 * Port WWN. Node WWNs may or may not be the same as 2211 * the Port WWN, and there may be multiple different 2212 * Port WWNs with the same Node WWN. It would be chaos 2213 * to have multiple identical Port WWNs, so we don't 2214 * allow that. 2215 */ 2216 2217 for (i = 0; i < hival; i++) { 2218 int j; 2219 if (fcp->portdb[i].port_wwn == 0) 2220 continue; 2221 if (fcp->portdb[i].port_wwn != 2222 fcp->tport[loopid].port_wwn) 2223 continue; 2224 /* 2225 * We found this WWN elsewhere- it's changed 2226 * loopids then. We don't change it's actual 2227 * position in our cached port database- we 2228 * just change the actual loop ID we'd use. 2229 */ 2230 if (fcp->portdb[i].loopid != loopid) { 2231 isp_prt(isp, ISP_LOGINFO, portshift, i, 2232 fcp->portdb[i].loopid, 2233 fcp->portdb[i].portid, loopid, 2234 fcp->tport[loopid].portid); 2235 } 2236 fcp->portdb[i].portid = fcp->tport[loopid].portid; 2237 fcp->portdb[i].loopid = loopid; 2238 fcp->portdb[i].valid = 1; 2239 fcp->portdb[i].roles = fcp->tport[loopid].roles; 2240 2241 /* 2242 * Now make sure this Port WWN doesn't exist elsewhere 2243 * in the port database. 2244 */ 2245 for (j = i+1; j < hival; j++) { 2246 if (fcp->portdb[i].port_wwn != 2247 fcp->portdb[j].port_wwn) { 2248 continue; 2249 } 2250 isp_prt(isp, ISP_LOGWARN, portdup, j, i); 2251 /* 2252 * Invalidate the 'old' *and* 'new' ones. 2253 * This is really harsh and not quite right, 2254 * but if this happens, we really don't know 2255 * who is what at this point. 2256 */ 2257 fcp->portdb[i].valid = 0; 2258 fcp->portdb[j].valid = 0; 2259 } 2260 break; 2261 } 2262 2263 /* 2264 * If we didn't traverse the entire port database, 2265 * then we found (and remapped) an existing entry. 2266 * No need to notify anyone- go for the next one. 2267 */ 2268 if (i < hival) { 2269 isp_prt(isp, ISP_LOGINFO, retained, 2270 fcp->portdb[i].loopid, i, fcp->portdb[i].portid); 2271 continue; 2272 } 2273 2274 /* 2275 * We've not found this Port WWN anywhere. It's a new entry. 2276 * See if we can leave it where it is (with target == loopid). 2277 */ 2278 if (fcp->portdb[loopid].port_wwn != 0) { 2279 for (lim = 0; lim < hival; lim++) { 2280 if (fcp->portdb[lim].port_wwn == 0) 2281 break; 2282 } 2283 /* "Cannot Happen" */ 2284 if (lim == hival) { 2285 isp_prt(isp, ISP_LOGWARN, "Remap Overflow"); 2286 continue; 2287 } 2288 i = lim; 2289 } else { 2290 i = loopid; 2291 } 2292 2293 /* 2294 * NB: The actual loopid we use here is loopid- we may 2295 * in fact be at a completely different index (target). 2296 */ 2297 fcp->portdb[i].loopid = loopid; 2298 fcp->portdb[i].port_wwn = fcp->tport[loopid].port_wwn; 2299 fcp->portdb[i].node_wwn = fcp->tport[loopid].node_wwn; 2300 fcp->portdb[i].roles = fcp->tport[loopid].roles; 2301 fcp->portdb[i].portid = fcp->tport[loopid].portid; 2302 fcp->portdb[i].valid = 1; 2303 2304 /* 2305 * Tell the outside world we've arrived. 2306 */ 2307 (void) isp_async(isp, ISPASYNC_PROMENADE, &i); 2308 } 2309 2310 /* 2311 * Now find all previously used targets that are now invalid and 2312 * notify the outer layers that they're gone. 2313 */ 2314 for (lp = &fcp->portdb[0]; lp < &fcp->portdb[hival]; lp++) { 2315 if (lp->valid || lp->port_wwn == 0) { 2316 continue; 2317 } 2318 2319 /* 2320 * Tell the outside world we've gone 2321 * away and erase our pdb entry. 2322 * 2323 */ 2324 loopid = lp - fcp->portdb; 2325 (void) isp_async(isp, ISPASYNC_PROMENADE, &loopid); 2326 MEMZERO((void *) lp, sizeof (*lp)); 2327 } 2328 fcp->isp_loopstate = LOOP_LSCAN_DONE; 2329 return (0); 2330 } 2331 2332 2333 static int 2334 isp_fabric_mbox_cmd(struct ispsoftc *isp, mbreg_t *mbp) 2335 { 2336 isp_mboxcmd(isp, mbp, MBLOGNONE); 2337 if (mbp->param[0] != MBOX_COMMAND_COMPLETE) { 2338 if (FCPARAM(isp)->isp_loopstate == LOOP_SCANNING_FABRIC) { 2339 FCPARAM(isp)->isp_loopstate = LOOP_PDB_RCVD; 2340 } 2341 if (mbp->param[0] == MBOX_COMMAND_ERROR) { 2342 char tbuf[16]; 2343 char *m; 2344 switch (mbp->param[1]) { 2345 case 1: 2346 m = "No Loop"; 2347 break; 2348 case 2: 2349 m = "Failed to allocate IOCB buffer"; 2350 break; 2351 case 3: 2352 m = "Failed to allocate XCB buffer"; 2353 break; 2354 case 4: 2355 m = "timeout or transmit failed"; 2356 break; 2357 case 5: 2358 m = "no fabric loop"; 2359 break; 2360 case 6: 2361 m = "remote device not a target"; 2362 break; 2363 default: 2364 SNPRINTF(tbuf, sizeof tbuf, "%x", 2365 mbp->param[1]); 2366 m = tbuf; 2367 break; 2368 } 2369 isp_prt(isp, ISP_LOGERR, "SNS Failed- %s", m); 2370 } 2371 return (-1); 2372 } 2373 2374 if (FCPARAM(isp)->isp_fwstate != FW_READY || 2375 FCPARAM(isp)->isp_loopstate < LOOP_SCANNING_FABRIC) { 2376 return (-1); 2377 } 2378 return(0); 2379 } 2380 2381 #ifdef ISP_USE_GA_NXT 2382 static int 2383 isp_scan_fabric(struct ispsoftc *isp, int ftype) 2384 { 2385 fcparam *fcp = isp->isp_param; 2386 u_int32_t portid, first_portid, last_portid; 2387 int hicap, last_port_same; 2388 2389 if (fcp->isp_onfabric == 0) { 2390 fcp->isp_loopstate = LOOP_FSCAN_DONE; 2391 return (0); 2392 } 2393 2394 FC_SCRATCH_ACQUIRE(isp); 2395 2396 /* 2397 * Since Port IDs are 24 bits, we can check against having seen 2398 * anything yet with this value. 2399 */ 2400 last_port_same = 0; 2401 last_portid = 0xffffffff; /* not a port */ 2402 first_portid = portid = fcp->isp_portid; 2403 fcp->isp_loopstate = LOOP_SCANNING_FABRIC; 2404 2405 for (hicap = 0; hicap < GA_NXT_MAX; hicap++) { 2406 mbreg_t mbs; 2407 sns_screq_t *rq; 2408 sns_ga_nxt_rsp_t *rs0, *rs1; 2409 struct lportdb lcl; 2410 u_int8_t sc[SNS_GA_NXT_RESP_SIZE]; 2411 2412 rq = (sns_screq_t *)sc; 2413 MEMZERO((void *) rq, SNS_GA_NXT_REQ_SIZE); 2414 rq->snscb_rblen = SNS_GA_NXT_RESP_SIZE >> 1; 2415 rq->snscb_addr[RQRSP_ADDR0015] = DMA_WD0(fcp->isp_scdma+0x100); 2416 rq->snscb_addr[RQRSP_ADDR1631] = DMA_WD1(fcp->isp_scdma+0x100); 2417 rq->snscb_addr[RQRSP_ADDR3247] = DMA_WD2(fcp->isp_scdma+0x100); 2418 rq->snscb_addr[RQRSP_ADDR4863] = DMA_WD3(fcp->isp_scdma+0x100); 2419 rq->snscb_sblen = 6; 2420 rq->snscb_data[0] = SNS_GA_NXT; 2421 rq->snscb_data[4] = portid & 0xffff; 2422 rq->snscb_data[5] = (portid >> 16) & 0xff; 2423 isp_put_sns_request(isp, rq, (sns_screq_t *) fcp->isp_scratch); 2424 MEMORYBARRIER(isp, SYNC_SFORDEV, 0, SNS_GA_NXT_REQ_SIZE); 2425 mbs.param[0] = MBOX_SEND_SNS; 2426 mbs.param[1] = SNS_GA_NXT_REQ_SIZE >> 1; 2427 mbs.param[2] = DMA_WD1(fcp->isp_scdma); 2428 mbs.param[3] = DMA_WD0(fcp->isp_scdma); 2429 /* 2430 * Leave 4 and 5 alone 2431 */ 2432 mbs.param[6] = DMA_WD3(fcp->isp_scdma); 2433 mbs.param[7] = DMA_WD2(fcp->isp_scdma); 2434 if (isp_fabric_mbox_cmd(isp, &mbs)) { 2435 if (fcp->isp_loopstate >= LOOP_SCANNING_FABRIC) { 2436 fcp->isp_loopstate = LOOP_PDB_RCVD; 2437 } 2438 FC_SCRATCH_RELEASE(isp); 2439 return (-1); 2440 } 2441 MEMORYBARRIER(isp, SYNC_SFORCPU, 0x100, SNS_GA_NXT_RESP_SIZE); 2442 rs1 = (sns_ga_nxt_rsp_t *) sc; 2443 rs0 = (sns_ga_nxt_rsp_t *) ((u_int8_t *)fcp->isp_scratch+0x100); 2444 isp_get_ga_nxt_response(isp, rs0, rs1); 2445 if (rs1->snscb_cthdr.ct_response != FS_ACC) { 2446 isp_prt(isp, ISP_LOGWARN, swrej, "GA_NXT", 2447 rs1->snscb_cthdr.ct_reason, 2448 rs1->snscb_cthdr.ct_explanation, portid); 2449 FC_SCRATCH_RELEASE(isp); 2450 fcp->isp_loopstate = LOOP_FSCAN_DONE; 2451 return (0); 2452 } 2453 portid = 2454 (((u_int32_t) rs1->snscb_port_id[0]) << 16) | 2455 (((u_int32_t) rs1->snscb_port_id[1]) << 8) | 2456 (((u_int32_t) rs1->snscb_port_id[2])); 2457 2458 /* 2459 * Okay, we now have information about a fabric object. 2460 * If it is the type we're interested in, tell the outer layers 2461 * about it. The outer layer needs to know: Port ID, WWNN, 2462 * WWPN, FC4 type, and port type. 2463 * 2464 * The lportdb structure is adequate for this. 2465 */ 2466 MEMZERO(&lcl, sizeof (lcl)); 2467 lcl.port_type = rs1->snscb_port_type; 2468 lcl.fc4_type = ftype; 2469 lcl.portid = portid; 2470 lcl.node_wwn = 2471 (((u_int64_t)rs1->snscb_nodename[0]) << 56) | 2472 (((u_int64_t)rs1->snscb_nodename[1]) << 48) | 2473 (((u_int64_t)rs1->snscb_nodename[2]) << 40) | 2474 (((u_int64_t)rs1->snscb_nodename[3]) << 32) | 2475 (((u_int64_t)rs1->snscb_nodename[4]) << 24) | 2476 (((u_int64_t)rs1->snscb_nodename[5]) << 16) | 2477 (((u_int64_t)rs1->snscb_nodename[6]) << 8) | 2478 (((u_int64_t)rs1->snscb_nodename[7])); 2479 lcl.port_wwn = 2480 (((u_int64_t)rs1->snscb_portname[0]) << 56) | 2481 (((u_int64_t)rs1->snscb_portname[1]) << 48) | 2482 (((u_int64_t)rs1->snscb_portname[2]) << 40) | 2483 (((u_int64_t)rs1->snscb_portname[3]) << 32) | 2484 (((u_int64_t)rs1->snscb_portname[4]) << 24) | 2485 (((u_int64_t)rs1->snscb_portname[5]) << 16) | 2486 (((u_int64_t)rs1->snscb_portname[6]) << 8) | 2487 (((u_int64_t)rs1->snscb_portname[7])); 2488 2489 /* 2490 * Does this fabric object support the type we want? 2491 * If not, skip it. 2492 */ 2493 if (rs1->snscb_fc4_types[ftype >> 5] & (1 << (ftype & 0x1f))) { 2494 if (first_portid == portid) { 2495 lcl.last_fabric_dev = 1; 2496 } else { 2497 lcl.last_fabric_dev = 0; 2498 } 2499 (void) isp_async(isp, ISPASYNC_FABRIC_DEV, &lcl); 2500 } else { 2501 isp_prt(isp, ISP_LOGDEBUG0, 2502 "PortID 0x%x doesn't support FC4 type 0x%x", 2503 portid, ftype); 2504 } 2505 if (first_portid == portid) { 2506 fcp->isp_loopstate = LOOP_FSCAN_DONE; 2507 FC_SCRATCH_RELEASE(isp); 2508 return (0); 2509 } 2510 if (portid == last_portid) { 2511 if (last_port_same++ > 20) { 2512 isp_prt(isp, ISP_LOGWARN, 2513 "tangled fabric database detected"); 2514 break; 2515 } 2516 } else { 2517 last_port_same = 0 ; 2518 last_portid = portid; 2519 } 2520 } 2521 FC_SCRATCH_RELEASE(isp); 2522 if (hicap >= GA_NXT_MAX) { 2523 isp_prt(isp, ISP_LOGWARN, "fabric too big (> %d)", GA_NXT_MAX); 2524 } 2525 fcp->isp_loopstate = LOOP_FSCAN_DONE; 2526 return (0); 2527 } 2528 #else 2529 #define GIDLEN ((ISP2100_SCRLEN >> 1) + 16) 2530 #define NGENT ((GIDLEN - 16) >> 2) 2531 2532 #define IGPOFF (ISP2100_SCRLEN - GIDLEN) 2533 #define GXOFF (256) 2534 2535 static int 2536 isp_scan_fabric(struct ispsoftc *isp, int ftype) 2537 { 2538 fcparam *fcp = FCPARAM(isp); 2539 mbreg_t mbs; 2540 int i; 2541 sns_gid_ft_req_t *rq; 2542 sns_gid_ft_rsp_t *rs0, *rs1; 2543 2544 if (fcp->isp_onfabric == 0) { 2545 fcp->isp_loopstate = LOOP_FSCAN_DONE; 2546 return (0); 2547 } 2548 2549 FC_SCRATCH_ACQUIRE(isp); 2550 fcp->isp_loopstate = LOOP_SCANNING_FABRIC; 2551 2552 rq = (sns_gid_ft_req_t *)fcp->tport; 2553 MEMZERO((void *) rq, SNS_GID_FT_REQ_SIZE); 2554 rq->snscb_rblen = GIDLEN >> 1; 2555 rq->snscb_addr[RQRSP_ADDR0015] = DMA_WD0(fcp->isp_scdma+IGPOFF); 2556 rq->snscb_addr[RQRSP_ADDR1631] = DMA_WD1(fcp->isp_scdma+IGPOFF); 2557 rq->snscb_addr[RQRSP_ADDR3247] = DMA_WD2(fcp->isp_scdma+IGPOFF); 2558 rq->snscb_addr[RQRSP_ADDR4863] = DMA_WD3(fcp->isp_scdma+IGPOFF); 2559 rq->snscb_sblen = 6; 2560 rq->snscb_cmd = SNS_GID_FT; 2561 rq->snscb_mword_div_2 = NGENT; 2562 rq->snscb_fc4_type = ftype; 2563 isp_put_gid_ft_request(isp, rq, (sns_gid_ft_req_t *) fcp->isp_scratch); 2564 MEMORYBARRIER(isp, SYNC_SFORDEV, 0, SNS_GID_FT_REQ_SIZE); 2565 mbs.param[0] = MBOX_SEND_SNS; 2566 mbs.param[1] = SNS_GID_FT_REQ_SIZE >> 1; 2567 mbs.param[2] = DMA_WD1(fcp->isp_scdma); 2568 mbs.param[3] = DMA_WD0(fcp->isp_scdma); 2569 2570 /* 2571 * Leave 4 and 5 alone 2572 */ 2573 mbs.param[6] = DMA_WD3(fcp->isp_scdma); 2574 mbs.param[7] = DMA_WD2(fcp->isp_scdma); 2575 if (isp_fabric_mbox_cmd(isp, &mbs)) { 2576 if (fcp->isp_loopstate >= LOOP_SCANNING_FABRIC) { 2577 fcp->isp_loopstate = LOOP_PDB_RCVD; 2578 } 2579 FC_SCRATCH_RELEASE(isp); 2580 return (-1); 2581 } 2582 if (fcp->isp_loopstate != LOOP_SCANNING_FABRIC) { 2583 FC_SCRATCH_RELEASE(isp); 2584 return (-1); 2585 } 2586 MEMORYBARRIER(isp, SYNC_SFORCPU, IGPOFF, GIDLEN); 2587 rs1 = (sns_gid_ft_rsp_t *) fcp->tport; 2588 rs0 = (sns_gid_ft_rsp_t *) ((u_int8_t *)fcp->isp_scratch+IGPOFF); 2589 isp_get_gid_ft_response(isp, rs0, rs1, NGENT); 2590 if (rs1->snscb_cthdr.ct_response != FS_ACC) { 2591 isp_prt(isp, ISP_LOGWARN, swrej, "GID_FT", 2592 rs1->snscb_cthdr.ct_reason, 2593 rs1->snscb_cthdr.ct_explanation, 0); 2594 FC_SCRATCH_RELEASE(isp); 2595 fcp->isp_loopstate = LOOP_FSCAN_DONE; 2596 return (0); 2597 } 2598 2599 /* 2600 * Okay, we now have a list of Port IDs for this class of device. 2601 * Go through the list and for each one get the WWPN/WWNN for it 2602 * and tell the outer layers about it. The outer layer needs to 2603 * know: Port ID, WWNN, WWPN, FC4 type, and (possibly) port type. 2604 * 2605 * The lportdb structure is adequate for this. 2606 */ 2607 i = -1; 2608 do { 2609 sns_gxn_id_req_t grqbuf, *gq = &grqbuf; 2610 sns_gxn_id_rsp_t *gs0, grsbuf, *gs1 = &grsbuf; 2611 struct lportdb lcl; 2612 #if 0 2613 sns_gff_id_rsp_t *fs0, ffsbuf, *fs1 = &ffsbuf; 2614 #endif 2615 2616 i++; 2617 MEMZERO(&lcl, sizeof (lcl)); 2618 lcl.fc4_type = ftype; 2619 lcl.portid = 2620 (((u_int32_t) rs1->snscb_ports[i].portid[0]) << 16) | 2621 (((u_int32_t) rs1->snscb_ports[i].portid[1]) << 8) | 2622 (((u_int32_t) rs1->snscb_ports[i].portid[2])); 2623 2624 MEMZERO((void *) gq, sizeof (sns_gxn_id_req_t)); 2625 gq->snscb_rblen = SNS_GXN_ID_RESP_SIZE >> 1; 2626 gq->snscb_addr[RQRSP_ADDR0015] = DMA_WD0(fcp->isp_scdma+GXOFF); 2627 gq->snscb_addr[RQRSP_ADDR1631] = DMA_WD1(fcp->isp_scdma+GXOFF); 2628 gq->snscb_addr[RQRSP_ADDR3247] = DMA_WD2(fcp->isp_scdma+GXOFF); 2629 gq->snscb_addr[RQRSP_ADDR4863] = DMA_WD3(fcp->isp_scdma+GXOFF); 2630 gq->snscb_sblen = 6; 2631 gq->snscb_cmd = SNS_GPN_ID; 2632 gq->snscb_portid = lcl.portid; 2633 isp_put_gxn_id_request(isp, gq, 2634 (sns_gxn_id_req_t *) fcp->isp_scratch); 2635 MEMORYBARRIER(isp, SYNC_SFORDEV, 0, SNS_GXN_ID_REQ_SIZE); 2636 mbs.param[0] = MBOX_SEND_SNS; 2637 mbs.param[1] = SNS_GXN_ID_REQ_SIZE >> 1; 2638 mbs.param[2] = DMA_WD1(fcp->isp_scdma); 2639 mbs.param[3] = DMA_WD0(fcp->isp_scdma); 2640 /* 2641 * Leave 4 and 5 alone 2642 */ 2643 mbs.param[6] = DMA_WD3(fcp->isp_scdma); 2644 mbs.param[7] = DMA_WD2(fcp->isp_scdma); 2645 if (isp_fabric_mbox_cmd(isp, &mbs)) { 2646 if (fcp->isp_loopstate >= LOOP_SCANNING_FABRIC) { 2647 fcp->isp_loopstate = LOOP_PDB_RCVD; 2648 } 2649 FC_SCRATCH_RELEASE(isp); 2650 return (-1); 2651 } 2652 if (fcp->isp_loopstate != LOOP_SCANNING_FABRIC) { 2653 FC_SCRATCH_RELEASE(isp); 2654 return (-1); 2655 } 2656 MEMORYBARRIER(isp, SYNC_SFORCPU, GXOFF, SNS_GXN_ID_RESP_SIZE); 2657 gs0 = (sns_gxn_id_rsp_t *) ((u_int8_t *)fcp->isp_scratch+GXOFF); 2658 isp_get_gxn_id_response(isp, gs0, gs1); 2659 if (gs1->snscb_cthdr.ct_response != FS_ACC) { 2660 isp_prt(isp, ISP_LOGWARN, swrej, "GPN_ID", 2661 gs1->snscb_cthdr.ct_reason, 2662 gs1->snscb_cthdr.ct_explanation, lcl.portid); 2663 if (fcp->isp_loopstate != LOOP_SCANNING_FABRIC) { 2664 FC_SCRATCH_RELEASE(isp); 2665 return (-1); 2666 } 2667 continue; 2668 } 2669 lcl.port_wwn = 2670 (((u_int64_t)gs1->snscb_wwn[0]) << 56) | 2671 (((u_int64_t)gs1->snscb_wwn[1]) << 48) | 2672 (((u_int64_t)gs1->snscb_wwn[2]) << 40) | 2673 (((u_int64_t)gs1->snscb_wwn[3]) << 32) | 2674 (((u_int64_t)gs1->snscb_wwn[4]) << 24) | 2675 (((u_int64_t)gs1->snscb_wwn[5]) << 16) | 2676 (((u_int64_t)gs1->snscb_wwn[6]) << 8) | 2677 (((u_int64_t)gs1->snscb_wwn[7])); 2678 2679 MEMZERO((void *) gq, sizeof (sns_gxn_id_req_t)); 2680 gq->snscb_rblen = SNS_GXN_ID_RESP_SIZE >> 1; 2681 gq->snscb_addr[RQRSP_ADDR0015] = DMA_WD0(fcp->isp_scdma+GXOFF); 2682 gq->snscb_addr[RQRSP_ADDR1631] = DMA_WD1(fcp->isp_scdma+GXOFF); 2683 gq->snscb_addr[RQRSP_ADDR3247] = DMA_WD2(fcp->isp_scdma+GXOFF); 2684 gq->snscb_addr[RQRSP_ADDR4863] = DMA_WD3(fcp->isp_scdma+GXOFF); 2685 gq->snscb_sblen = 6; 2686 gq->snscb_cmd = SNS_GNN_ID; 2687 gq->snscb_portid = lcl.portid; 2688 isp_put_gxn_id_request(isp, gq, 2689 (sns_gxn_id_req_t *) fcp->isp_scratch); 2690 MEMORYBARRIER(isp, SYNC_SFORDEV, 0, SNS_GXN_ID_REQ_SIZE); 2691 mbs.param[0] = MBOX_SEND_SNS; 2692 mbs.param[1] = SNS_GXN_ID_REQ_SIZE >> 1; 2693 mbs.param[2] = DMA_WD1(fcp->isp_scdma); 2694 mbs.param[3] = DMA_WD0(fcp->isp_scdma); 2695 /* 2696 * Leave 4 and 5 alone 2697 */ 2698 mbs.param[6] = DMA_WD3(fcp->isp_scdma); 2699 mbs.param[7] = DMA_WD2(fcp->isp_scdma); 2700 if (isp_fabric_mbox_cmd(isp, &mbs)) { 2701 if (fcp->isp_loopstate >= LOOP_SCANNING_FABRIC) { 2702 fcp->isp_loopstate = LOOP_PDB_RCVD; 2703 } 2704 FC_SCRATCH_RELEASE(isp); 2705 return (-1); 2706 } 2707 if (fcp->isp_loopstate != LOOP_SCANNING_FABRIC) { 2708 FC_SCRATCH_RELEASE(isp); 2709 return (-1); 2710 } 2711 MEMORYBARRIER(isp, SYNC_SFORCPU, GXOFF, SNS_GXN_ID_RESP_SIZE); 2712 gs0 = (sns_gxn_id_rsp_t *) ((u_int8_t *)fcp->isp_scratch+GXOFF); 2713 isp_get_gxn_id_response(isp, gs0, gs1); 2714 if (gs1->snscb_cthdr.ct_response != FS_ACC) { 2715 isp_prt(isp, ISP_LOGWARN, swrej, "GNN_ID", 2716 gs1->snscb_cthdr.ct_reason, 2717 gs1->snscb_cthdr.ct_explanation, lcl.portid); 2718 if (fcp->isp_loopstate != LOOP_SCANNING_FABRIC) { 2719 FC_SCRATCH_RELEASE(isp); 2720 return (-1); 2721 } 2722 continue; 2723 } 2724 lcl.node_wwn = 2725 (((u_int64_t)gs1->snscb_wwn[0]) << 56) | 2726 (((u_int64_t)gs1->snscb_wwn[1]) << 48) | 2727 (((u_int64_t)gs1->snscb_wwn[2]) << 40) | 2728 (((u_int64_t)gs1->snscb_wwn[3]) << 32) | 2729 (((u_int64_t)gs1->snscb_wwn[4]) << 24) | 2730 (((u_int64_t)gs1->snscb_wwn[5]) << 16) | 2731 (((u_int64_t)gs1->snscb_wwn[6]) << 8) | 2732 (((u_int64_t)gs1->snscb_wwn[7])); 2733 2734 /* 2735 * The QLogic f/w is bouncing this with a parameter error. 2736 */ 2737 #if 0 2738 /* 2739 * Try and get FC4 Features (FC-GS-3 only). 2740 * We can use the sns_gxn_id_req_t for this request. 2741 */ 2742 MEMZERO((void *) gq, sizeof (sns_gxn_id_req_t)); 2743 gq->snscb_rblen = SNS_GFF_ID_RESP_SIZE >> 1; 2744 gq->snscb_addr[RQRSP_ADDR0015] = DMA_WD0(fcp->isp_scdma+GXOFF); 2745 gq->snscb_addr[RQRSP_ADDR1631] = DMA_WD1(fcp->isp_scdma+GXOFF); 2746 gq->snscb_addr[RQRSP_ADDR3247] = DMA_WD2(fcp->isp_scdma+GXOFF); 2747 gq->snscb_addr[RQRSP_ADDR4863] = DMA_WD3(fcp->isp_scdma+GXOFF); 2748 gq->snscb_sblen = 6; 2749 gq->snscb_cmd = SNS_GFF_ID; 2750 gq->snscb_portid = lcl.portid; 2751 isp_put_gxn_id_request(isp, gq, 2752 (sns_gxn_id_req_t *) fcp->isp_scratch); 2753 MEMORYBARRIER(isp, SYNC_SFORDEV, 0, SNS_GXN_ID_REQ_SIZE); 2754 mbs.param[0] = MBOX_SEND_SNS; 2755 mbs.param[1] = SNS_GXN_ID_REQ_SIZE >> 1; 2756 mbs.param[2] = DMA_WD1(fcp->isp_scdma); 2757 mbs.param[3] = DMA_WD0(fcp->isp_scdma); 2758 /* 2759 * Leave 4 and 5 alone 2760 */ 2761 mbs.param[6] = DMA_WD3(fcp->isp_scdma); 2762 mbs.param[7] = DMA_WD2(fcp->isp_scdma); 2763 if (isp_fabric_mbox_cmd(isp, &mbs)) { 2764 if (fcp->isp_loopstate >= LOOP_SCANNING_FABRIC) { 2765 fcp->isp_loopstate = LOOP_PDB_RCVD; 2766 } 2767 FC_SCRATCH_RELEASE(isp); 2768 return (-1); 2769 } 2770 if (fcp->isp_loopstate != LOOP_SCANNING_FABRIC) { 2771 FC_SCRATCH_RELEASE(isp); 2772 return (-1); 2773 } 2774 MEMORYBARRIER(isp, SYNC_SFORCPU, GXOFF, SNS_GFF_ID_RESP_SIZE); 2775 fs0 = (sns_gff_id_rsp_t *) ((u_int8_t *)fcp->isp_scratch+GXOFF); 2776 isp_get_gff_id_response(isp, fs0, fs1); 2777 if (fs1->snscb_cthdr.ct_response != FS_ACC) { 2778 isp_prt(isp, /* ISP_LOGDEBUG0 */ ISP_LOGWARN, 2779 swrej, "GFF_ID", 2780 fs1->snscb_cthdr.ct_reason, 2781 fs1->snscb_cthdr.ct_explanation, lcl.portid); 2782 if (fcp->isp_loopstate != LOOP_SCANNING_FABRIC) { 2783 FC_SCRATCH_RELEASE(isp); 2784 return (-1); 2785 } 2786 } else { 2787 int index = (ftype >> 3); 2788 int bshft = (ftype & 0x7) * 4; 2789 int fc4_fval = 2790 (fs1->snscb_fc4_features[index] >> bshft) & 0xf; 2791 if (fc4_fval & 0x1) { 2792 lcl.roles |= 2793 (SVC3_INI_ROLE >> SVC3_ROLE_SHIFT); 2794 } 2795 if (fc4_fval & 0x2) { 2796 lcl.roles |= 2797 (SVC3_TGT_ROLE >> SVC3_ROLE_SHIFT); 2798 } 2799 } 2800 #endif 2801 2802 /* 2803 * If we really want to know what kind of port type this is, 2804 * we have to run another CT command. Otherwise, we'll leave 2805 * it as undefined. 2806 * 2807 lcl.port_type = 0; 2808 */ 2809 if (rs1->snscb_ports[i].control & 0x80) { 2810 lcl.last_fabric_dev = 1; 2811 } else { 2812 lcl.last_fabric_dev = 0; 2813 } 2814 (void) isp_async(isp, ISPASYNC_FABRIC_DEV, &lcl); 2815 2816 } while ((rs1->snscb_ports[i].control & 0x80) == 0 && i < NGENT-1); 2817 2818 /* 2819 * If we're not at the last entry, our list isn't big enough. 2820 */ 2821 if ((rs1->snscb_ports[i].control & 0x80) == 0) { 2822 isp_prt(isp, ISP_LOGWARN, "fabric too big for scratch area"); 2823 } 2824 2825 FC_SCRATCH_RELEASE(isp); 2826 fcp->isp_loopstate = LOOP_FSCAN_DONE; 2827 return (0); 2828 } 2829 #endif 2830 2831 static void 2832 isp_register_fc4_type(struct ispsoftc *isp) 2833 { 2834 fcparam *fcp = isp->isp_param; 2835 u_int8_t local[SNS_RFT_ID_REQ_SIZE]; 2836 sns_screq_t *reqp = (sns_screq_t *) local; 2837 mbreg_t mbs; 2838 2839 MEMZERO((void *) reqp, SNS_RFT_ID_REQ_SIZE); 2840 reqp->snscb_rblen = SNS_RFT_ID_RESP_SIZE >> 1; 2841 reqp->snscb_addr[RQRSP_ADDR0015] = DMA_WD0(fcp->isp_scdma + 0x100); 2842 reqp->snscb_addr[RQRSP_ADDR1631] = DMA_WD1(fcp->isp_scdma + 0x100); 2843 reqp->snscb_addr[RQRSP_ADDR3247] = DMA_WD2(fcp->isp_scdma + 0x100); 2844 reqp->snscb_addr[RQRSP_ADDR4863] = DMA_WD3(fcp->isp_scdma + 0x100); 2845 reqp->snscb_sblen = 22; 2846 reqp->snscb_data[0] = SNS_RFT_ID; 2847 reqp->snscb_data[4] = fcp->isp_portid & 0xffff; 2848 reqp->snscb_data[5] = (fcp->isp_portid >> 16) & 0xff; 2849 reqp->snscb_data[6] = (1 << FC4_SCSI); 2850 #if 0 2851 reqp->snscb_data[6] |= (1 << FC4_IP); /* ISO/IEC 8802-2 LLC/SNAP */ 2852 #endif 2853 FC_SCRATCH_ACQUIRE(isp); 2854 isp_put_sns_request(isp, reqp, (sns_screq_t *) fcp->isp_scratch); 2855 mbs.param[0] = MBOX_SEND_SNS; 2856 mbs.param[1] = SNS_RFT_ID_REQ_SIZE >> 1; 2857 mbs.param[2] = DMA_WD1(fcp->isp_scdma); 2858 mbs.param[3] = DMA_WD0(fcp->isp_scdma); 2859 /* 2860 * Leave 4 and 5 alone 2861 */ 2862 mbs.param[6] = DMA_WD3(fcp->isp_scdma); 2863 mbs.param[7] = DMA_WD2(fcp->isp_scdma); 2864 isp_mboxcmd(isp, &mbs, MBLOGALL); 2865 FC_SCRATCH_RELEASE(isp); 2866 if (mbs.param[0] == MBOX_COMMAND_COMPLETE) { 2867 isp_prt(isp, ISP_LOGDEBUG0, "Register FC4 types succeeded"); 2868 } 2869 } 2870 2871 /* 2872 * Start a command. Locking is assumed done in the caller. 2873 */ 2874 2875 int 2876 isp_start(XS_T *xs) 2877 { 2878 struct ispsoftc *isp; 2879 u_int16_t nxti, optr, handle; 2880 u_int8_t local[QENTRY_LEN]; 2881 ispreq_t *reqp, *qep; 2882 int target, i; 2883 2884 XS_INITERR(xs); 2885 isp = XS_ISP(xs); 2886 2887 /* 2888 * Check to make sure we're supporting initiator role. 2889 */ 2890 if ((isp->isp_role & ISP_ROLE_INITIATOR) == 0) { 2891 XS_SETERR(xs, HBA_SELTIMEOUT); 2892 return (CMD_COMPLETE); 2893 } 2894 2895 /* 2896 * Now make sure we're running. 2897 */ 2898 2899 if (isp->isp_state != ISP_RUNSTATE) { 2900 isp_prt(isp, ISP_LOGERR, "Adapter not at RUNSTATE"); 2901 XS_SETERR(xs, HBA_BOTCH); 2902 return (CMD_COMPLETE); 2903 } 2904 2905 /* 2906 * Check command CDB length, etc.. We really are limited to 16 bytes 2907 * for Fibre Channel, but can do up to 44 bytes in parallel SCSI, 2908 * but probably only if we're running fairly new firmware (we'll 2909 * let the old f/w choke on an extended command queue entry). 2910 */ 2911 2912 if (XS_CDBLEN(xs) > (IS_FC(isp)? 16 : 44) || XS_CDBLEN(xs) == 0) { 2913 isp_prt(isp, ISP_LOGERR, 2914 "unsupported cdb length (%d, CDB[0]=0x%x)", 2915 XS_CDBLEN(xs), XS_CDBP(xs)[0] & 0xff); 2916 XS_SETERR(xs, HBA_BOTCH); 2917 return (CMD_COMPLETE); 2918 } 2919 2920 /* 2921 * Check to see whether we have good firmware state still or 2922 * need to refresh our port database for this target. 2923 */ 2924 target = XS_TGT(xs); 2925 if (IS_FC(isp)) { 2926 fcparam *fcp = isp->isp_param; 2927 struct lportdb *lp; 2928 #ifdef HANDLE_LOOPSTATE_IN_OUTER_LAYERS 2929 if (fcp->isp_fwstate != FW_READY || 2930 fcp->isp_loopstate != LOOP_READY) { 2931 return (CMD_RQLATER); 2932 } 2933 2934 /* 2935 * If we're not on a Fabric, we can't have a target 2936 * above FL_PORT_ID-1. 2937 * 2938 * If we're on a fabric and *not* connected as an F-port, 2939 * we can't have a target less than FC_SNS_ID+1. This 2940 * keeps us from having to sort out the difference between 2941 * local public loop devices and those which we might get 2942 * from a switch's database. 2943 */ 2944 if (fcp->isp_onfabric == 0) { 2945 if (target >= FL_PORT_ID) { 2946 XS_SETERR(xs, HBA_SELTIMEOUT); 2947 return (CMD_COMPLETE); 2948 } 2949 } else { 2950 if (target >= FL_PORT_ID && target <= FC_SNS_ID) { 2951 XS_SETERR(xs, HBA_SELTIMEOUT); 2952 return (CMD_COMPLETE); 2953 } 2954 /* 2955 * We used to exclude having local loop ports 2956 * at the same time that we have fabric ports. 2957 * That is, we used to exclude having ports 2958 * at < FL_PORT_ID if we're FL-port. 2959 * 2960 * That's wrong. The only thing that could be 2961 * dicey is if the switch you're connected to 2962 * has these local loop ports appear on the 2963 * fabric and we somehow attach them twice. 2964 */ 2965 } 2966 #else 2967 /* 2968 * Check for f/w being in ready state. If the f/w 2969 * isn't in ready state, then we don't know our 2970 * loop ID and the f/w hasn't completed logging 2971 * into all targets on the loop. If this is the 2972 * case, then bounce the command. We pretend this is 2973 * a SELECTION TIMEOUT error if we've never gone to 2974 * FW_READY state at all- in this case we may not 2975 * be hooked to a loop at all and we shouldn't hang 2976 * the machine for this. Otherwise, defer this command 2977 * until later. 2978 */ 2979 if (fcp->isp_fwstate != FW_READY) { 2980 /* 2981 * Give ourselves at most a 250ms delay. 2982 */ 2983 if (isp_fclink_test(isp, 250000)) { 2984 XS_SETERR(xs, HBA_SELTIMEOUT); 2985 if (fcp->loop_seen_once) { 2986 return (CMD_RQLATER); 2987 } else { 2988 return (CMD_COMPLETE); 2989 } 2990 } 2991 } 2992 2993 /* 2994 * If we're not on a Fabric, we can't have a target 2995 * above FL_PORT_ID-1. 2996 * 2997 * If we're on a fabric and *not* connected as an F-port, 2998 * we can't have a target less than FC_SNS_ID+1. This 2999 * keeps us from having to sort out the difference between 3000 * local public loop devices and those which we might get 3001 * from a switch's database. 3002 */ 3003 if (fcp->isp_onfabric == 0) { 3004 if (target >= FL_PORT_ID) { 3005 XS_SETERR(xs, HBA_SELTIMEOUT); 3006 return (CMD_COMPLETE); 3007 } 3008 } else { 3009 if (target >= FL_PORT_ID && target <= FC_SNS_ID) { 3010 XS_SETERR(xs, HBA_SELTIMEOUT); 3011 return (CMD_COMPLETE); 3012 } 3013 if (fcp->isp_topo != TOPO_F_PORT && 3014 target < FL_PORT_ID) { 3015 XS_SETERR(xs, HBA_SELTIMEOUT); 3016 return (CMD_COMPLETE); 3017 } 3018 } 3019 3020 /* 3021 * If our loop state is such that we haven't yet received 3022 * a "Port Database Changed" notification (after a LIP or 3023 * a Loop Reset or firmware initialization), then defer 3024 * sending commands for a little while, but only if we've 3025 * seen a valid loop at one point (otherwise we can get 3026 * stuck at initialization time). 3027 */ 3028 if (fcp->isp_loopstate < LOOP_PDB_RCVD) { 3029 XS_SETERR(xs, HBA_SELTIMEOUT); 3030 if (fcp->loop_seen_once) { 3031 return (CMD_RQLATER); 3032 } else { 3033 return (CMD_COMPLETE); 3034 } 3035 } 3036 3037 /* 3038 * If we're in the middle of loop or fabric scanning 3039 * or merging the port databases, retry this command later. 3040 */ 3041 if (fcp->isp_loopstate == LOOP_SCANNING_FABRIC || 3042 fcp->isp_loopstate == LOOP_SCANNING_LOOP || 3043 fcp->isp_loopstate == LOOP_SYNCING_PDB) { 3044 return (CMD_RQLATER); 3045 } 3046 3047 /* 3048 * If our loop state is now such that we've just now 3049 * received a Port Database Change notification, then 3050 * we have to go off and (re)scan the fabric. We back 3051 * out and try again later if this doesn't work. 3052 */ 3053 if (fcp->isp_loopstate == LOOP_PDB_RCVD && fcp->isp_onfabric) { 3054 if (isp_scan_fabric(isp, FC4_SCSI)) { 3055 return (CMD_RQLATER); 3056 } 3057 if (fcp->isp_fwstate != FW_READY || 3058 fcp->isp_loopstate < LOOP_PDB_RCVD) { 3059 return (CMD_RQLATER); 3060 } 3061 } 3062 3063 /* 3064 * If our loop state is now such that we've just now 3065 * received a Port Database Change notification, then 3066 * we have to go off and (re)synchronize our port 3067 * database. 3068 */ 3069 if (fcp->isp_loopstate < LOOP_READY) { 3070 if (isp_pdb_sync(isp)) { 3071 return (CMD_RQLATER); 3072 } 3073 if (fcp->isp_fwstate != FW_READY || 3074 fcp->isp_loopstate != LOOP_READY) { 3075 return (CMD_RQLATER); 3076 } 3077 } 3078 3079 /* 3080 * XXX: Here's were we would cancel any loop_dead flag 3081 * XXX: also cancel in dead_loop timeout that's running 3082 */ 3083 #endif 3084 3085 /* 3086 * Now check whether we should even think about pursuing this. 3087 */ 3088 lp = &fcp->portdb[target]; 3089 if (lp->valid == 0) { 3090 XS_SETERR(xs, HBA_SELTIMEOUT); 3091 return (CMD_COMPLETE); 3092 } 3093 if ((lp->roles & (SVC3_TGT_ROLE >> SVC3_ROLE_SHIFT)) == 0) { 3094 isp_prt(isp, ISP_LOGDEBUG2, 3095 "Target %d does not have target service", target); 3096 XS_SETERR(xs, HBA_SELTIMEOUT); 3097 return (CMD_COMPLETE); 3098 } 3099 /* 3100 * Now turn target into what the actual Loop ID is. 3101 */ 3102 target = lp->loopid; 3103 } 3104 3105 /* 3106 * Next check to see if any HBA or Device 3107 * parameters need to be updated. 3108 */ 3109 if (isp->isp_update != 0) { 3110 isp_update(isp); 3111 } 3112 3113 if (isp_getrqentry(isp, &nxti, &optr, (void **)&qep)) { 3114 isp_prt(isp, ISP_LOGDEBUG0, "Request Queue Overflow"); 3115 XS_SETERR(xs, HBA_BOTCH); 3116 return (CMD_EAGAIN); 3117 } 3118 3119 /* 3120 * Now see if we need to synchronize the ISP with respect to anything. 3121 * We do dual duty here (cough) for synchronizing for busses other 3122 * than which we got here to send a command to. 3123 */ 3124 reqp = (ispreq_t *) local; 3125 if (isp->isp_sendmarker) { 3126 u_int8_t n = (IS_DUALBUS(isp)? 2: 1); 3127 /* 3128 * Check ports to send markers for... 3129 */ 3130 for (i = 0; i < n; i++) { 3131 if ((isp->isp_sendmarker & (1 << i)) == 0) { 3132 continue; 3133 } 3134 MEMZERO((void *) reqp, QENTRY_LEN); 3135 reqp->req_header.rqs_entry_count = 1; 3136 reqp->req_header.rqs_entry_type = RQSTYPE_MARKER; 3137 reqp->req_modifier = SYNC_ALL; 3138 reqp->req_target = i << 7; /* insert bus number */ 3139 isp_put_request(isp, reqp, qep); 3140 ISP_ADD_REQUEST(isp, nxti); 3141 isp->isp_sendmarker &= ~(1 << i); 3142 if (isp_getrqentry(isp, &nxti, &optr, (void **) &qep)) { 3143 isp_prt(isp, ISP_LOGDEBUG0, 3144 "Request Queue Overflow+"); 3145 XS_SETERR(xs, HBA_BOTCH); 3146 return (CMD_EAGAIN); 3147 } 3148 } 3149 } 3150 3151 MEMZERO((void *)reqp, QENTRY_LEN); 3152 reqp->req_header.rqs_entry_count = 1; 3153 if (IS_FC(isp)) { 3154 reqp->req_header.rqs_entry_type = RQSTYPE_T2RQS; 3155 } else { 3156 if (XS_CDBLEN(xs) > 12) 3157 reqp->req_header.rqs_entry_type = RQSTYPE_CMDONLY; 3158 else 3159 reqp->req_header.rqs_entry_type = RQSTYPE_REQUEST; 3160 } 3161 /* reqp->req_header.rqs_flags = 0; */ 3162 /* reqp->req_header.rqs_seqno = 0; */ 3163 if (IS_FC(isp)) { 3164 /* 3165 * See comment in isp_intr 3166 */ 3167 /* XS_RESID(xs) = 0; */ 3168 3169 /* 3170 * Fibre Channel always requires some kind of tag. 3171 * The Qlogic drivers seem be happy not to use a tag, 3172 * but this breaks for some devices (IBM drives). 3173 */ 3174 if (XS_TAG_P(xs)) { 3175 ((ispreqt2_t *)reqp)->req_flags = XS_TAG_TYPE(xs); 3176 } else { 3177 /* 3178 * If we don't know what tag to use, use HEAD OF QUEUE 3179 * for Request Sense or Simple. 3180 */ 3181 if (XS_CDBP(xs)[0] == 0x3) /* REQUEST SENSE */ 3182 ((ispreqt2_t *)reqp)->req_flags = REQFLAG_HTAG; 3183 else 3184 ((ispreqt2_t *)reqp)->req_flags = REQFLAG_STAG; 3185 } 3186 } else { 3187 sdparam *sdp = (sdparam *)isp->isp_param; 3188 sdp += XS_CHANNEL(xs); 3189 if ((sdp->isp_devparam[target].actv_flags & DPARM_TQING) && 3190 XS_TAG_P(xs)) { 3191 reqp->req_flags = XS_TAG_TYPE(xs); 3192 } 3193 } 3194 reqp->req_target = target | (XS_CHANNEL(xs) << 7); 3195 if (IS_SCSI(isp)) { 3196 reqp->req_lun_trn = XS_LUN(xs); 3197 reqp->req_cdblen = XS_CDBLEN(xs); 3198 } else { 3199 if (FCPARAM(isp)->isp_fwattr & ISP_FW_ATTR_SCCLUN) 3200 ((ispreqt2_t *)reqp)->req_scclun = XS_LUN(xs); 3201 else 3202 ((ispreqt2_t *)reqp)->req_lun_trn = XS_LUN(xs); 3203 } 3204 MEMCPY(reqp->req_cdb, XS_CDBP(xs), XS_CDBLEN(xs)); 3205 3206 reqp->req_time = XS_TIME(xs) / 1000; 3207 if (reqp->req_time == 0 && XS_TIME(xs)) { 3208 reqp->req_time = 1; 3209 } 3210 3211 if (isp_save_xs(isp, xs, &handle)) { 3212 isp_prt(isp, ISP_LOGDEBUG0, "out of xflist pointers"); 3213 XS_SETERR(xs, HBA_BOTCH); 3214 return (CMD_EAGAIN); 3215 } 3216 reqp->req_handle = handle; 3217 3218 /* 3219 * Set up DMA and/or do any bus swizzling of the request entry 3220 * so that the Qlogic F/W understands what is being asked of it. 3221 */ 3222 i = ISP_DMASETUP(isp, xs, reqp, &nxti, optr); 3223 if (i != CMD_QUEUED) { 3224 isp_destroy_handle(isp, handle); 3225 /* 3226 * dmasetup sets actual error in packet, and 3227 * return what we were given to return. 3228 */ 3229 return (i); 3230 } 3231 XS_SETERR(xs, HBA_NOERROR); 3232 isp_prt(isp, ISP_LOGDEBUG2, 3233 "START cmd for %d.%d.%d cmd 0x%x datalen %ld", 3234 XS_CHANNEL(xs), target, XS_LUN(xs), XS_CDBP(xs)[0], 3235 (long) XS_XFRLEN(xs)); 3236 ISP_ADD_REQUEST(isp, nxti); 3237 isp->isp_nactive++; 3238 return (CMD_QUEUED); 3239 } 3240 3241 /* 3242 * isp control 3243 * Locks (ints blocked) assumed held. 3244 */ 3245 3246 int 3247 isp_control(struct ispsoftc *isp, ispctl_t ctl, void *arg) 3248 { 3249 XS_T *xs; 3250 mbreg_t mbs; 3251 int bus, tgt; 3252 u_int16_t handle; 3253 3254 switch (ctl) { 3255 default: 3256 isp_prt(isp, ISP_LOGERR, "Unknown Control Opcode 0x%x", ctl); 3257 break; 3258 3259 case ISPCTL_RESET_BUS: 3260 /* 3261 * Issue a bus reset. 3262 */ 3263 mbs.param[0] = MBOX_BUS_RESET; 3264 mbs.param[2] = 0; 3265 if (IS_SCSI(isp)) { 3266 mbs.param[1] = 3267 ((sdparam *) isp->isp_param)->isp_bus_reset_delay; 3268 if (mbs.param[1] < 2) 3269 mbs.param[1] = 2; 3270 bus = *((int *) arg); 3271 if (IS_DUALBUS(isp)) 3272 mbs.param[2] = bus; 3273 } else { 3274 mbs.param[1] = 10; 3275 bus = 0; 3276 } 3277 isp->isp_sendmarker |= (1 << bus); 3278 isp_mboxcmd(isp, &mbs, MBLOGALL); 3279 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 3280 break; 3281 } 3282 isp_prt(isp, ISP_LOGINFO, 3283 "driver initiated bus reset of bus %d", bus); 3284 return (0); 3285 3286 case ISPCTL_RESET_DEV: 3287 tgt = (*((int *) arg)) & 0xffff; 3288 bus = (*((int *) arg)) >> 16; 3289 mbs.param[0] = MBOX_ABORT_TARGET; 3290 mbs.param[1] = (tgt << 8) | (bus << 15); 3291 mbs.param[2] = 3; /* 'delay', in seconds */ 3292 isp_mboxcmd(isp, &mbs, MBLOGALL); 3293 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 3294 break; 3295 } 3296 isp_prt(isp, ISP_LOGINFO, 3297 "Target %d on Bus %d Reset Succeeded", tgt, bus); 3298 isp->isp_sendmarker |= (1 << bus); 3299 return (0); 3300 3301 case ISPCTL_ABORT_CMD: 3302 xs = (XS_T *) arg; 3303 tgt = XS_TGT(xs); 3304 handle = isp_find_handle(isp, xs); 3305 if (handle == 0) { 3306 isp_prt(isp, ISP_LOGWARN, 3307 "cannot find handle for command to abort"); 3308 break; 3309 } 3310 bus = XS_CHANNEL(xs); 3311 mbs.param[0] = MBOX_ABORT; 3312 if (IS_FC(isp)) { 3313 if (FCPARAM(isp)->isp_fwattr & ISP_FW_ATTR_SCCLUN) { 3314 mbs.param[1] = tgt << 8; 3315 mbs.param[4] = 0; 3316 mbs.param[5] = 0; 3317 mbs.param[6] = XS_LUN(xs); 3318 } else { 3319 mbs.param[1] = tgt << 8 | XS_LUN(xs); 3320 } 3321 } else { 3322 mbs.param[1] = 3323 (bus << 15) | (XS_TGT(xs) << 8) | XS_LUN(xs); 3324 } 3325 mbs.param[3] = 0; 3326 mbs.param[2] = handle; 3327 isp_mboxcmd(isp, &mbs, MBLOGALL & ~MBOX_COMMAND_ERROR); 3328 if (mbs.param[0] == MBOX_COMMAND_COMPLETE) { 3329 return (0); 3330 } 3331 /* 3332 * XXX: Look for command in the REQUEST QUEUE. That is, 3333 * XXX: It hasen't been picked up by firmware yet. 3334 */ 3335 break; 3336 3337 case ISPCTL_UPDATE_PARAMS: 3338 3339 isp_update(isp); 3340 return (0); 3341 3342 case ISPCTL_FCLINK_TEST: 3343 3344 if (IS_FC(isp)) { 3345 int usdelay = (arg)? *((int *) arg) : 250000; 3346 return (isp_fclink_test(isp, usdelay)); 3347 } 3348 break; 3349 3350 case ISPCTL_SCAN_FABRIC: 3351 3352 if (IS_FC(isp)) { 3353 int ftype = (arg)? *((int *) arg) : FC4_SCSI; 3354 return (isp_scan_fabric(isp, ftype)); 3355 } 3356 break; 3357 3358 case ISPCTL_SCAN_LOOP: 3359 3360 if (IS_FC(isp)) { 3361 return (isp_scan_loop(isp)); 3362 } 3363 break; 3364 3365 case ISPCTL_PDB_SYNC: 3366 3367 if (IS_FC(isp)) { 3368 return (isp_pdb_sync(isp)); 3369 } 3370 break; 3371 3372 case ISPCTL_SEND_LIP: 3373 3374 if (IS_FC(isp)) { 3375 mbs.param[0] = MBOX_INIT_LIP; 3376 isp_mboxcmd(isp, &mbs, MBLOGALL); 3377 if (mbs.param[0] == MBOX_COMMAND_COMPLETE) { 3378 return (0); 3379 } 3380 } 3381 break; 3382 3383 case ISPCTL_GET_POSMAP: 3384 3385 if (IS_FC(isp) && arg) { 3386 return (isp_getmap(isp, arg)); 3387 } 3388 break; 3389 3390 case ISPCTL_RUN_MBOXCMD: 3391 3392 isp_mboxcmd(isp, arg, MBLOGALL); 3393 return(0); 3394 3395 #ifdef ISP_TARGET_MODE 3396 case ISPCTL_TOGGLE_TMODE: 3397 { 3398 3399 /* 3400 * We don't check/set against role here- that's the 3401 * responsibility for the outer layer to coordinate. 3402 */ 3403 if (IS_SCSI(isp)) { 3404 int param = *(int *)arg; 3405 mbs.param[0] = MBOX_ENABLE_TARGET_MODE; 3406 mbs.param[1] = param & 0xffff; 3407 mbs.param[2] = param >> 16; 3408 isp_mboxcmd(isp, &mbs, MBLOGALL); 3409 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 3410 break; 3411 } 3412 } 3413 return (0); 3414 } 3415 #endif 3416 } 3417 return (-1); 3418 } 3419 3420 /* 3421 * Interrupt Service Routine(s). 3422 * 3423 * External (OS) framework has done the appropriate locking, 3424 * and the locking will be held throughout this function. 3425 */ 3426 3427 /* 3428 * Limit our stack depth by sticking with the max likely number 3429 * of completions on a request queue at any one time. 3430 */ 3431 #ifndef MAX_REQUESTQ_COMPLETIONS 3432 #define MAX_REQUESTQ_COMPLETIONS 64 3433 #endif 3434 3435 void 3436 isp_intr(struct ispsoftc *isp, u_int16_t isr, u_int16_t sema, u_int16_t mbox) 3437 { 3438 XS_T *complist[MAX_REQUESTQ_COMPLETIONS], *xs; 3439 u_int16_t iptr, optr, junk; 3440 int i, nlooked = 0, ndone = 0; 3441 3442 again: 3443 /* 3444 * Is this a mailbox related interrupt? 3445 * The mailbox semaphore will be nonzero if so. 3446 */ 3447 if (sema) { 3448 if (mbox & 0x4000) { 3449 isp->isp_intmboxc++; 3450 if (isp->isp_mboxbsy) { 3451 int i = 0, obits = isp->isp_obits; 3452 isp->isp_mboxtmp[i++] = mbox; 3453 for (i = 1; i < MAX_MAILBOX; i++) { 3454 if ((obits & (1 << i)) == 0) { 3455 continue; 3456 } 3457 isp->isp_mboxtmp[i] = 3458 ISP_READ(isp, MBOX_OFF(i)); 3459 } 3460 if (isp->isp_mbxwrk0) { 3461 if (isp_mbox_continue(isp) == 0) { 3462 return; 3463 } 3464 } 3465 MBOX_NOTIFY_COMPLETE(isp); 3466 } else { 3467 isp_prt(isp, ISP_LOGWARN, 3468 "Mbox Command Async (0x%x) with no waiters", 3469 mbox); 3470 } 3471 } else if (isp_parse_async(isp, mbox) < 0) { 3472 return; 3473 } 3474 if (IS_FC(isp) || isp->isp_state != ISP_RUNSTATE) { 3475 ISP_WRITE(isp, HCCR, HCCR_CMD_CLEAR_RISC_INT); 3476 ISP_WRITE(isp, BIU_SEMA, 0); 3477 return; 3478 } 3479 } 3480 3481 /* 3482 * We can't be getting this now. 3483 */ 3484 if (isp->isp_state != ISP_RUNSTATE) { 3485 isp_prt(isp, ISP_LOGWARN, 3486 "interrupt (ISR=%x SEMA=%x) when not ready", isr, sema); 3487 /* 3488 * Thank you very much! *Burrrp*! 3489 */ 3490 WRITE_RESPONSE_QUEUE_OUT_POINTER(isp, 3491 READ_RESPONSE_QUEUE_IN_POINTER(isp)); 3492 3493 ISP_WRITE(isp, HCCR, HCCR_CMD_CLEAR_RISC_INT); 3494 ISP_WRITE(isp, BIU_SEMA, 0); 3495 return; 3496 } 3497 3498 /* 3499 * Get the current Response Queue Out Pointer. 3500 * 3501 * If we're a 2300, we can ask what hardware what it thinks. 3502 */ 3503 if (IS_23XX(isp)) { 3504 optr = ISP_READ(isp, isp->isp_respoutrp); 3505 /* 3506 * Debug: to be taken out eventually 3507 */ 3508 if (isp->isp_residx != optr) { 3509 isp_prt(isp, ISP_LOGWARN, "optr %x soft optr %x", 3510 optr, isp->isp_residx); 3511 } 3512 } else { 3513 optr = isp->isp_residx; 3514 } 3515 3516 /* 3517 * You *must* read the Response Queue In Pointer 3518 * prior to clearing the RISC interrupt. 3519 * 3520 * Debounce the 2300 if revision less than 2. 3521 */ 3522 if (IS_2100(isp) || (IS_2300(isp) && isp->isp_revision < 2)) { 3523 i = 0; 3524 do { 3525 iptr = READ_RESPONSE_QUEUE_IN_POINTER(isp); 3526 junk = READ_RESPONSE_QUEUE_IN_POINTER(isp); 3527 } while (junk != iptr && ++i < 1000); 3528 3529 if (iptr != junk) { 3530 ISP_WRITE(isp, HCCR, HCCR_CMD_CLEAR_RISC_INT); 3531 isp_prt(isp, ISP_LOGWARN, 3532 "Response Queue Out Pointer Unstable (%x, %x)", 3533 iptr, junk); 3534 return; 3535 } 3536 } else { 3537 iptr = READ_RESPONSE_QUEUE_IN_POINTER(isp); 3538 } 3539 isp->isp_resodx = iptr; 3540 3541 3542 if (optr == iptr && sema == 0) { 3543 /* 3544 * There are a lot of these- reasons unknown- mostly on 3545 * faster Alpha machines. 3546 * 3547 * I tried delaying after writing HCCR_CMD_CLEAR_RISC_INT to 3548 * make sure the old interrupt went away (to avoid 'ringing' 3549 * effects), but that didn't stop this from occurring. 3550 */ 3551 if (IS_23XX(isp)) { 3552 USEC_DELAY(100); 3553 iptr = READ_RESPONSE_QUEUE_IN_POINTER(isp); 3554 junk = ISP_READ(isp, BIU_R2HSTSLO); 3555 } else { 3556 junk = ISP_READ(isp, BIU_ISR); 3557 } 3558 if (optr == iptr) { 3559 if (IS_23XX(isp)) { 3560 ; 3561 } else { 3562 sema = ISP_READ(isp, BIU_SEMA); 3563 mbox = ISP_READ(isp, OUTMAILBOX0); 3564 if ((sema & 0x3) && (mbox & 0x8000)) { 3565 goto again; 3566 } 3567 } 3568 isp->isp_intbogus++; 3569 isp_prt(isp, ISP_LOGDEBUG1, 3570 "bogus intr- isr %x (%x) iptr %x optr %x", 3571 isr, junk, iptr, optr); 3572 } 3573 } 3574 isp->isp_resodx = iptr; 3575 ISP_WRITE(isp, HCCR, HCCR_CMD_CLEAR_RISC_INT); 3576 ISP_WRITE(isp, BIU_SEMA, 0); 3577 3578 if (isp->isp_rspbsy) { 3579 return; 3580 } 3581 isp->isp_rspbsy = 1; 3582 3583 while (optr != iptr) { 3584 ispstatusreq_t local, *sp = &local; 3585 isphdr_t *hp; 3586 int type; 3587 u_int16_t oop; 3588 int buddaboom = 0; 3589 3590 hp = (isphdr_t *) ISP_QUEUE_ENTRY(isp->isp_result, optr); 3591 oop = optr; 3592 optr = ISP_NXT_QENTRY(optr, RESULT_QUEUE_LEN(isp)); 3593 nlooked++; 3594 /* 3595 * Synchronize our view of this response queue entry. 3596 */ 3597 MEMORYBARRIER(isp, SYNC_RESULT, oop, QENTRY_LEN); 3598 3599 type = isp_get_response_type(isp, hp); 3600 3601 if (type == RQSTYPE_RESPONSE) { 3602 isp_get_response(isp, (ispstatusreq_t *) hp, sp); 3603 } else if (type == RQSTYPE_RIO2) { 3604 isp_rio2_t rio; 3605 isp_get_rio2(isp, (isp_rio2_t *) hp, &rio); 3606 for (i = 0; i < rio.req_header.rqs_seqno; i++) { 3607 isp_fastpost_complete(isp, rio.req_handles[i]); 3608 } 3609 if (isp->isp_fpcchiwater < rio.req_header.rqs_seqno) 3610 isp->isp_fpcchiwater = rio.req_header.rqs_seqno; 3611 MEMZERO(hp, QENTRY_LEN); /* PERF */ 3612 continue; 3613 } else { 3614 /* 3615 * Somebody reachable via isp_handle_other_response 3616 * may have updated the response queue pointers for 3617 * us, so we reload our goal index. 3618 */ 3619 if (isp_handle_other_response(isp, type, hp, &optr)) { 3620 iptr = isp->isp_resodx; 3621 MEMZERO(hp, QENTRY_LEN); /* PERF */ 3622 continue; 3623 } 3624 3625 /* 3626 * After this point, we'll just look at the header as 3627 * we don't know how to deal with the rest of the 3628 * response. 3629 */ 3630 isp_get_response(isp, (ispstatusreq_t *) hp, sp); 3631 3632 /* 3633 * It really has to be a bounced request just copied 3634 * from the request queue to the response queue. If 3635 * not, something bad has happened. 3636 */ 3637 if (sp->req_header.rqs_entry_type != RQSTYPE_REQUEST) { 3638 isp_prt(isp, ISP_LOGERR, notresp, 3639 sp->req_header.rqs_entry_type, oop, optr, 3640 nlooked); 3641 if (isp->isp_dblev & ISP_LOGDEBUG0) { 3642 isp_print_bytes(isp, "Queue Entry", 3643 QENTRY_LEN, sp); 3644 } 3645 MEMZERO(hp, QENTRY_LEN); /* PERF */ 3646 continue; 3647 } 3648 buddaboom = 1; 3649 } 3650 3651 if (sp->req_header.rqs_flags & 0xf) { 3652 #define _RQS_OFLAGS \ 3653 ~(RQSFLAG_CONTINUATION|RQSFLAG_FULL|RQSFLAG_BADHEADER|RQSFLAG_BADPACKET) 3654 if (sp->req_header.rqs_flags & RQSFLAG_CONTINUATION) { 3655 isp_prt(isp, ISP_LOGWARN, 3656 "continuation segment"); 3657 WRITE_RESPONSE_QUEUE_OUT_POINTER(isp, optr); 3658 continue; 3659 } 3660 if (sp->req_header.rqs_flags & RQSFLAG_FULL) { 3661 isp_prt(isp, ISP_LOGDEBUG1, 3662 "internal queues full"); 3663 /* 3664 * We'll synthesize a QUEUE FULL message below. 3665 */ 3666 } 3667 if (sp->req_header.rqs_flags & RQSFLAG_BADHEADER) { 3668 isp_prt(isp, ISP_LOGERR, "bad header flag"); 3669 buddaboom++; 3670 } 3671 if (sp->req_header.rqs_flags & RQSFLAG_BADPACKET) { 3672 isp_prt(isp, ISP_LOGERR, "bad request packet"); 3673 buddaboom++; 3674 } 3675 if (sp->req_header.rqs_flags & _RQS_OFLAGS) { 3676 isp_prt(isp, ISP_LOGERR, 3677 "unknown flags (0x%x) in response", 3678 sp->req_header.rqs_flags); 3679 buddaboom++; 3680 } 3681 #undef _RQS_OFLAGS 3682 } 3683 if (sp->req_handle > isp->isp_maxcmds || sp->req_handle < 1) { 3684 MEMZERO(hp, QENTRY_LEN); /* PERF */ 3685 isp_prt(isp, ISP_LOGERR, 3686 "bad request handle %d (type 0x%x, flags 0x%x)", 3687 sp->req_handle, sp->req_header.rqs_entry_type, 3688 sp->req_header.rqs_flags); 3689 WRITE_RESPONSE_QUEUE_OUT_POINTER(isp, optr); 3690 continue; 3691 } 3692 xs = isp_find_xs(isp, sp->req_handle); 3693 if (xs == NULL) { 3694 u_int8_t ts = sp->req_completion_status & 0xff; 3695 MEMZERO(hp, QENTRY_LEN); /* PERF */ 3696 /* 3697 * Only whine if this isn't the expected fallout of 3698 * aborting the command. 3699 */ 3700 if (sp->req_header.rqs_entry_type != RQSTYPE_RESPONSE || 3701 ts != RQCS_ABORTED) { 3702 isp_prt(isp, ISP_LOGERR, 3703 "cannot find handle 0x%x in xflist", 3704 sp->req_handle); 3705 } 3706 WRITE_RESPONSE_QUEUE_OUT_POINTER(isp, optr); 3707 continue; 3708 } 3709 isp_destroy_handle(isp, sp->req_handle); 3710 if (sp->req_status_flags & RQSTF_BUS_RESET) { 3711 XS_SETERR(xs, HBA_BUSRESET); 3712 isp->isp_sendmarker |= (1 << XS_CHANNEL(xs)); 3713 } 3714 if (buddaboom) { 3715 XS_SETERR(xs, HBA_BOTCH); 3716 } 3717 3718 if (IS_FC(isp) && (sp->req_scsi_status & RQCS_SV)) { 3719 /* 3720 * Fibre Channel F/W doesn't say we got status 3721 * if there's Sense Data instead. I guess they 3722 * think it goes w/o saying. 3723 */ 3724 sp->req_state_flags |= RQSF_GOT_STATUS; 3725 } 3726 if (sp->req_state_flags & RQSF_GOT_STATUS) { 3727 *XS_STSP(xs) = sp->req_scsi_status & 0xff; 3728 } 3729 3730 switch (sp->req_header.rqs_entry_type) { 3731 case RQSTYPE_RESPONSE: 3732 XS_SET_STATE_STAT(isp, xs, sp); 3733 isp_parse_status(isp, sp, xs); 3734 if ((XS_NOERR(xs) || XS_ERR(xs) == HBA_NOERROR) && 3735 (*XS_STSP(xs) == SCSI_BUSY)) { 3736 XS_SETERR(xs, HBA_TGTBSY); 3737 } 3738 if (IS_SCSI(isp)) { 3739 XS_RESID(xs) = sp->req_resid; 3740 if ((sp->req_state_flags & RQSF_GOT_STATUS) && 3741 (*XS_STSP(xs) == SCSI_CHECK) && 3742 (sp->req_state_flags & RQSF_GOT_SENSE)) { 3743 XS_SAVE_SENSE(xs, sp); 3744 } 3745 /* 3746 * A new synchronous rate was negotiated for 3747 * this target. Mark state such that we'll go 3748 * look up that which has changed later. 3749 */ 3750 if (sp->req_status_flags & RQSTF_NEGOTIATION) { 3751 int t = XS_TGT(xs); 3752 sdparam *sdp = isp->isp_param; 3753 sdp += XS_CHANNEL(xs); 3754 sdp->isp_devparam[t].dev_refresh = 1; 3755 isp->isp_update |= 3756 (1 << XS_CHANNEL(xs)); 3757 } 3758 } else { 3759 if (sp->req_status_flags & RQSF_XFER_COMPLETE) { 3760 XS_RESID(xs) = 0; 3761 } else if (sp->req_scsi_status & RQCS_RESID) { 3762 XS_RESID(xs) = sp->req_resid; 3763 } else { 3764 XS_RESID(xs) = 0; 3765 } 3766 if ((sp->req_state_flags & RQSF_GOT_STATUS) && 3767 (*XS_STSP(xs) == SCSI_CHECK) && 3768 (sp->req_scsi_status & RQCS_SV)) { 3769 XS_SAVE_SENSE(xs, sp); 3770 /* solely for the benefit of debug */ 3771 sp->req_state_flags |= RQSF_GOT_SENSE; 3772 } 3773 } 3774 isp_prt(isp, ISP_LOGDEBUG2, 3775 "asked for %ld got resid %ld", (long) XS_XFRLEN(xs), 3776 (long) sp->req_resid); 3777 break; 3778 case RQSTYPE_REQUEST: 3779 if (sp->req_header.rqs_flags & RQSFLAG_FULL) { 3780 /* 3781 * Force Queue Full status. 3782 */ 3783 *XS_STSP(xs) = SCSI_QFULL; 3784 XS_SETERR(xs, HBA_NOERROR); 3785 } else if (XS_NOERR(xs)) { 3786 /* 3787 * ???? 3788 */ 3789 isp_prt(isp, ISP_LOGDEBUG0, 3790 "Request Queue Entry bounced back"); 3791 XS_SETERR(xs, HBA_BOTCH); 3792 } 3793 XS_RESID(xs) = XS_XFRLEN(xs); 3794 break; 3795 default: 3796 isp_prt(isp, ISP_LOGWARN, 3797 "unhandled response queue type 0x%x", 3798 sp->req_header.rqs_entry_type); 3799 if (XS_NOERR(xs)) { 3800 XS_SETERR(xs, HBA_BOTCH); 3801 } 3802 break; 3803 } 3804 3805 /* 3806 * Free any dma resources. As a side effect, this may 3807 * also do any cache flushing necessary for data coherence. */ 3808 if (XS_XFRLEN(xs)) { 3809 ISP_DMAFREE(isp, xs, sp->req_handle); 3810 } 3811 3812 if (((isp->isp_dblev & (ISP_LOGDEBUG2|ISP_LOGDEBUG3))) || 3813 ((isp->isp_dblev & ISP_LOGDEBUG1) && ((!XS_NOERR(xs)) || 3814 (*XS_STSP(xs) != SCSI_GOOD)))) { 3815 char skey; 3816 if (sp->req_state_flags & RQSF_GOT_SENSE) { 3817 skey = XS_SNSKEY(xs) & 0xf; 3818 if (skey < 10) 3819 skey += '0'; 3820 else 3821 skey += 'a' - 10; 3822 } else if (*XS_STSP(xs) == SCSI_CHECK) { 3823 skey = '?'; 3824 } else { 3825 skey = '.'; 3826 } 3827 isp_prt(isp, ISP_LOGALL, finmsg, XS_CHANNEL(xs), 3828 XS_TGT(xs), XS_LUN(xs), XS_XFRLEN(xs), XS_RESID(xs), 3829 *XS_STSP(xs), skey, XS_ERR(xs)); 3830 } 3831 3832 if (isp->isp_nactive > 0) 3833 isp->isp_nactive--; 3834 complist[ndone++] = xs; /* defer completion call until later */ 3835 MEMZERO(hp, QENTRY_LEN); /* PERF */ 3836 if (ndone == MAX_REQUESTQ_COMPLETIONS) { 3837 break; 3838 } 3839 } 3840 3841 /* 3842 * If we looked at any commands, then it's valid to find out 3843 * what the outpointer is. It also is a trigger to update the 3844 * ISP's notion of what we've seen so far. 3845 */ 3846 if (nlooked) { 3847 WRITE_RESPONSE_QUEUE_OUT_POINTER(isp, optr); 3848 /* 3849 * While we're at it, read the requst queue out pointer. 3850 */ 3851 isp->isp_reqodx = READ_REQUEST_QUEUE_OUT_POINTER(isp); 3852 if (isp->isp_rscchiwater < ndone) 3853 isp->isp_rscchiwater = ndone; 3854 } 3855 3856 isp->isp_residx = optr; 3857 isp->isp_rspbsy = 0; 3858 for (i = 0; i < ndone; i++) { 3859 xs = complist[i]; 3860 if (xs) { 3861 isp->isp_rsltccmplt++; 3862 isp_done(xs); 3863 } 3864 } 3865 } 3866 3867 /* 3868 * Support routines. 3869 */ 3870 3871 static int 3872 isp_parse_async(struct ispsoftc *isp, u_int16_t mbox) 3873 { 3874 int rval = 0; 3875 int bus; 3876 3877 if (IS_DUALBUS(isp)) { 3878 bus = ISP_READ(isp, OUTMAILBOX6); 3879 } else { 3880 bus = 0; 3881 } 3882 isp_prt(isp, ISP_LOGDEBUG2, "Async Mbox 0x%x", mbox); 3883 3884 switch (mbox) { 3885 case ASYNC_BUS_RESET: 3886 isp->isp_sendmarker |= (1 << bus); 3887 #ifdef ISP_TARGET_MODE 3888 if (isp_target_async(isp, bus, mbox)) 3889 rval = -1; 3890 #endif 3891 isp_async(isp, ISPASYNC_BUS_RESET, &bus); 3892 break; 3893 case ASYNC_SYSTEM_ERROR: 3894 isp_async(isp, ISPASYNC_FW_CRASH, NULL); 3895 /* no point continuing after this */ 3896 rval = -1; 3897 break; 3898 3899 case ASYNC_RQS_XFER_ERR: 3900 isp_prt(isp, ISP_LOGERR, "Request Queue Transfer Error"); 3901 break; 3902 3903 case ASYNC_RSP_XFER_ERR: 3904 isp_prt(isp, ISP_LOGERR, "Response Queue Transfer Error"); 3905 break; 3906 3907 case ASYNC_QWAKEUP: 3908 /* 3909 * We've just been notified that the Queue has woken up. 3910 * We don't need to be chatty about this- just unlatch things 3911 * and move on. 3912 */ 3913 mbox = READ_REQUEST_QUEUE_OUT_POINTER(isp); 3914 break; 3915 3916 case ASYNC_TIMEOUT_RESET: 3917 isp_prt(isp, ISP_LOGWARN, 3918 "timeout initiated SCSI bus reset of bus %d", bus); 3919 isp->isp_sendmarker |= (1 << bus); 3920 #ifdef ISP_TARGET_MODE 3921 if (isp_target_async(isp, bus, mbox)) 3922 rval = -1; 3923 #endif 3924 break; 3925 3926 case ASYNC_DEVICE_RESET: 3927 isp_prt(isp, ISP_LOGINFO, "device reset on bus %d", bus); 3928 isp->isp_sendmarker |= (1 << bus); 3929 #ifdef ISP_TARGET_MODE 3930 if (isp_target_async(isp, bus, mbox)) 3931 rval = -1; 3932 #endif 3933 break; 3934 3935 case ASYNC_EXTMSG_UNDERRUN: 3936 isp_prt(isp, ISP_LOGWARN, "extended message underrun"); 3937 break; 3938 3939 case ASYNC_SCAM_INT: 3940 isp_prt(isp, ISP_LOGINFO, "SCAM interrupt"); 3941 break; 3942 3943 case ASYNC_HUNG_SCSI: 3944 isp_prt(isp, ISP_LOGERR, 3945 "stalled SCSI Bus after DATA Overrun"); 3946 /* XXX: Need to issue SCSI reset at this point */ 3947 break; 3948 3949 case ASYNC_KILLED_BUS: 3950 isp_prt(isp, ISP_LOGERR, "SCSI Bus reset after DATA Overrun"); 3951 break; 3952 3953 case ASYNC_BUS_TRANSIT: 3954 mbox = ISP_READ(isp, OUTMAILBOX2); 3955 switch (mbox & 0x1c00) { 3956 case SXP_PINS_LVD_MODE: 3957 isp_prt(isp, ISP_LOGINFO, "Transition to LVD mode"); 3958 SDPARAM(isp)->isp_diffmode = 0; 3959 SDPARAM(isp)->isp_ultramode = 0; 3960 SDPARAM(isp)->isp_lvdmode = 1; 3961 break; 3962 case SXP_PINS_HVD_MODE: 3963 isp_prt(isp, ISP_LOGINFO, 3964 "Transition to Differential mode"); 3965 SDPARAM(isp)->isp_diffmode = 1; 3966 SDPARAM(isp)->isp_ultramode = 0; 3967 SDPARAM(isp)->isp_lvdmode = 0; 3968 break; 3969 case SXP_PINS_SE_MODE: 3970 isp_prt(isp, ISP_LOGINFO, 3971 "Transition to Single Ended mode"); 3972 SDPARAM(isp)->isp_diffmode = 0; 3973 SDPARAM(isp)->isp_ultramode = 1; 3974 SDPARAM(isp)->isp_lvdmode = 0; 3975 break; 3976 default: 3977 isp_prt(isp, ISP_LOGWARN, 3978 "Transition to Unknown Mode 0x%x", mbox); 3979 break; 3980 } 3981 /* 3982 * XXX: Set up to renegotiate again! 3983 */ 3984 /* Can only be for a 1080... */ 3985 isp->isp_sendmarker |= (1 << bus); 3986 break; 3987 3988 /* 3989 * We can use bus, which will always be zero for FC cards, 3990 * as a mailbox pattern accumulator to be checked below. 3991 */ 3992 case ASYNC_RIO5: 3993 bus = 0x1ce; /* outgoing mailbox regs 1-3, 6-7 */ 3994 break; 3995 3996 case ASYNC_RIO4: 3997 bus = 0x14e; /* outgoing mailbox regs 1-3, 6 */ 3998 break; 3999 4000 case ASYNC_RIO3: 4001 bus = 0x10e; /* outgoing mailbox regs 1-3 */ 4002 break; 4003 4004 case ASYNC_RIO2: 4005 bus = 0x106; /* outgoing mailbox regs 1-2 */ 4006 break; 4007 4008 case ASYNC_RIO1: 4009 case ASYNC_CMD_CMPLT: 4010 bus = 0x102; /* outgoing mailbox regs 1 */ 4011 break; 4012 4013 case ASYNC_RIO_RESP: 4014 break; 4015 4016 case ASYNC_CTIO_DONE: 4017 { 4018 #ifdef ISP_TARGET_MODE 4019 int handle = 4020 (ISP_READ(isp, OUTMAILBOX2) << 16) | 4021 (ISP_READ(isp, OUTMAILBOX1)); 4022 if (isp_target_async(isp, handle, mbox)) 4023 rval = -1; 4024 #else 4025 isp_prt(isp, ISP_LOGINFO, "Fast Posting CTIO done"); 4026 #endif 4027 isp->isp_fphccmplt++; /* count it as a fast posting intr */ 4028 break; 4029 } 4030 case ASYNC_LIP_F8: 4031 case ASYNC_LIP_OCCURRED: 4032 FCPARAM(isp)->isp_lipseq = 4033 ISP_READ(isp, OUTMAILBOX1); 4034 FCPARAM(isp)->isp_fwstate = FW_CONFIG_WAIT; 4035 FCPARAM(isp)->isp_loopstate = LOOP_LIP_RCVD; 4036 isp->isp_sendmarker = 1; 4037 isp_mark_getpdb_all(isp); 4038 isp_async(isp, ISPASYNC_LIP, NULL); 4039 #ifdef ISP_TARGET_MODE 4040 if (isp_target_async(isp, bus, mbox)) 4041 rval = -1; 4042 #endif 4043 /* 4044 * We've had problems with data corruption occuring on 4045 * commands that complete (with no apparent error) after 4046 * we receive a LIP. This has been observed mostly on 4047 * Local Loop topologies. To be safe, let's just mark 4048 * all active commands as dead. 4049 */ 4050 if (FCPARAM(isp)->isp_topo == TOPO_NL_PORT || 4051 FCPARAM(isp)->isp_topo == TOPO_FL_PORT) { 4052 int i, j; 4053 for (i = j = 0; i < isp->isp_maxcmds; i++) { 4054 XS_T *xs; 4055 xs = isp->isp_xflist[i]; 4056 if (xs != NULL) { 4057 j++; 4058 XS_SETERR(xs, HBA_BUSRESET); 4059 } 4060 } 4061 if (j) { 4062 isp_prt(isp, ISP_LOGERR, 4063 "LIP destroyed %d active commands", j); 4064 } 4065 } 4066 break; 4067 4068 case ASYNC_LOOP_UP: 4069 isp->isp_sendmarker = 1; 4070 FCPARAM(isp)->isp_fwstate = FW_CONFIG_WAIT; 4071 FCPARAM(isp)->isp_loopstate = LOOP_LIP_RCVD; 4072 isp_mark_getpdb_all(isp); 4073 isp_async(isp, ISPASYNC_LOOP_UP, NULL); 4074 #ifdef ISP_TARGET_MODE 4075 if (isp_target_async(isp, bus, mbox)) 4076 rval = -1; 4077 #endif 4078 break; 4079 4080 case ASYNC_LOOP_DOWN: 4081 isp->isp_sendmarker = 1; 4082 FCPARAM(isp)->isp_fwstate = FW_CONFIG_WAIT; 4083 FCPARAM(isp)->isp_loopstate = LOOP_NIL; 4084 isp_mark_getpdb_all(isp); 4085 isp_async(isp, ISPASYNC_LOOP_DOWN, NULL); 4086 #ifdef ISP_TARGET_MODE 4087 if (isp_target_async(isp, bus, mbox)) 4088 rval = -1; 4089 #endif 4090 break; 4091 4092 case ASYNC_LOOP_RESET: 4093 isp->isp_sendmarker = 1; 4094 FCPARAM(isp)->isp_fwstate = FW_CONFIG_WAIT; 4095 FCPARAM(isp)->isp_loopstate = LOOP_NIL; 4096 isp_mark_getpdb_all(isp); 4097 isp_async(isp, ISPASYNC_LOOP_RESET, NULL); 4098 #ifdef ISP_TARGET_MODE 4099 if (isp_target_async(isp, bus, mbox)) 4100 rval = -1; 4101 #endif 4102 break; 4103 4104 case ASYNC_PDB_CHANGED: 4105 isp->isp_sendmarker = 1; 4106 FCPARAM(isp)->isp_loopstate = LOOP_PDB_RCVD; 4107 isp_mark_getpdb_all(isp); 4108 isp_async(isp, ISPASYNC_CHANGE_NOTIFY, ISPASYNC_CHANGE_PDB); 4109 break; 4110 4111 case ASYNC_CHANGE_NOTIFY: 4112 /* 4113 * Not correct, but it will force us to rescan the loop. 4114 */ 4115 FCPARAM(isp)->isp_loopstate = LOOP_PDB_RCVD; 4116 isp_mark_getpdb_all(isp); 4117 isp_async(isp, ISPASYNC_CHANGE_NOTIFY, ISPASYNC_CHANGE_SNS); 4118 break; 4119 4120 case ASYNC_PTPMODE: 4121 if (FCPARAM(isp)->isp_onfabric) 4122 FCPARAM(isp)->isp_topo = TOPO_F_PORT; 4123 else 4124 FCPARAM(isp)->isp_topo = TOPO_N_PORT; 4125 isp_mark_getpdb_all(isp); 4126 isp->isp_sendmarker = 1; 4127 FCPARAM(isp)->isp_fwstate = FW_CONFIG_WAIT; 4128 FCPARAM(isp)->isp_loopstate = LOOP_LIP_RCVD; 4129 isp_async(isp, ISPASYNC_CHANGE_NOTIFY, ISPASYNC_CHANGE_OTHER); 4130 #ifdef ISP_TARGET_MODE 4131 if (isp_target_async(isp, bus, mbox)) 4132 rval = -1; 4133 #endif 4134 isp_prt(isp, ISP_LOGINFO, "Point-to-Point mode"); 4135 break; 4136 4137 case ASYNC_CONNMODE: 4138 mbox = ISP_READ(isp, OUTMAILBOX1); 4139 isp_mark_getpdb_all(isp); 4140 switch (mbox) { 4141 case ISP_CONN_LOOP: 4142 isp_prt(isp, ISP_LOGINFO, 4143 "Point-to-Point -> Loop mode"); 4144 break; 4145 case ISP_CONN_PTP: 4146 isp_prt(isp, ISP_LOGINFO, 4147 "Loop -> Point-to-Point mode"); 4148 break; 4149 case ISP_CONN_BADLIP: 4150 isp_prt(isp, ISP_LOGWARN, 4151 "Point-to-Point -> Loop mode (BAD LIP)"); 4152 break; 4153 case ISP_CONN_FATAL: 4154 isp_prt(isp, ISP_LOGERR, "FATAL CONNECTION ERROR"); 4155 isp_reinit(isp); 4156 #ifdef ISP_TARGET_MODE 4157 (void) isp_target_async(isp, bus, ASYNC_SYSTEM_ERROR); 4158 #endif 4159 /* no point continuing after this */ 4160 return (-1); 4161 case ISP_CONN_LOOPBACK: 4162 isp_prt(isp, ISP_LOGWARN, 4163 "Looped Back in Point-to-Point mode"); 4164 break; 4165 default: 4166 isp_prt(isp, ISP_LOGWARN, 4167 "Unknown connection mode (0x%x)", mbox); 4168 break; 4169 } 4170 isp_async(isp, ISPASYNC_CHANGE_NOTIFY, ISPASYNC_CHANGE_OTHER); 4171 isp->isp_sendmarker = 1; 4172 FCPARAM(isp)->isp_fwstate = FW_CONFIG_WAIT; 4173 FCPARAM(isp)->isp_loopstate = LOOP_LIP_RCVD; 4174 break; 4175 4176 default: 4177 isp_prt(isp, ISP_LOGWARN, "Unknown Async Code 0x%x", mbox); 4178 break; 4179 } 4180 4181 if (bus & 0x100) { 4182 int i, nh; 4183 u_int16_t handles[5]; 4184 4185 for (nh = 0, i = 1; i < MAX_MAILBOX; i++) { 4186 if ((bus & (1 << i)) == 0) { 4187 continue; 4188 } 4189 handles[nh++] = ISP_READ(isp, MBOX_OFF(i)); 4190 } 4191 for (i = 0; i < nh; i++) { 4192 isp_fastpost_complete(isp, handles[i]); 4193 isp_prt(isp, ISP_LOGDEBUG3, 4194 "fast post completion of %u", handles[i]); 4195 } 4196 if (isp->isp_fpcchiwater < nh) 4197 isp->isp_fpcchiwater = nh; 4198 } else { 4199 isp->isp_intoasync++; 4200 } 4201 return (rval); 4202 } 4203 4204 /* 4205 * Handle other response entries. A pointer to the request queue output 4206 * index is here in case we want to eat several entries at once, although 4207 * this is not used currently. 4208 */ 4209 4210 static int 4211 isp_handle_other_response(struct ispsoftc *isp, int type, 4212 isphdr_t *hp, u_int16_t *optrp) 4213 { 4214 switch (type) { 4215 case RQSTYPE_STATUS_CONT: 4216 isp_prt(isp, ISP_LOGINFO, "Ignored Continuation Response"); 4217 return (1); 4218 case RQSTYPE_ATIO: 4219 case RQSTYPE_CTIO: 4220 case RQSTYPE_ENABLE_LUN: 4221 case RQSTYPE_MODIFY_LUN: 4222 case RQSTYPE_NOTIFY: 4223 case RQSTYPE_NOTIFY_ACK: 4224 case RQSTYPE_CTIO1: 4225 case RQSTYPE_ATIO2: 4226 case RQSTYPE_CTIO2: 4227 case RQSTYPE_CTIO3: 4228 isp->isp_rsltccmplt++; /* count as a response completion */ 4229 #ifdef ISP_TARGET_MODE 4230 if (isp_target_notify(isp, (ispstatusreq_t *) hp, optrp)) { 4231 return (1); 4232 } 4233 #else 4234 optrp = optrp; 4235 /* FALLTHROUGH */ 4236 #endif 4237 case RQSTYPE_REQUEST: 4238 default: 4239 if (isp_async(isp, ISPASYNC_UNHANDLED_RESPONSE, hp)) { 4240 return (1); 4241 } 4242 isp_prt(isp, ISP_LOGWARN, "Unhandled Response Type 0x%x", 4243 isp_get_response_type(isp, hp)); 4244 return (0); 4245 } 4246 } 4247 4248 static void 4249 isp_parse_status(struct ispsoftc *isp, ispstatusreq_t *sp, XS_T *xs) 4250 { 4251 switch (sp->req_completion_status & 0xff) { 4252 case RQCS_COMPLETE: 4253 if (XS_NOERR(xs)) { 4254 XS_SETERR(xs, HBA_NOERROR); 4255 } 4256 return; 4257 4258 case RQCS_INCOMPLETE: 4259 if ((sp->req_state_flags & RQSF_GOT_TARGET) == 0) { 4260 isp_prt(isp, ISP_LOGDEBUG1, 4261 "Selection Timeout for %d.%d.%d", 4262 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 4263 if (XS_NOERR(xs)) { 4264 XS_SETERR(xs, HBA_SELTIMEOUT); 4265 } 4266 return; 4267 } 4268 isp_prt(isp, ISP_LOGERR, 4269 "command incomplete for %d.%d.%d, state 0x%x", 4270 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs), 4271 sp->req_state_flags); 4272 break; 4273 4274 case RQCS_DMA_ERROR: 4275 isp_prt(isp, ISP_LOGERR, "DMA error for command on %d.%d.%d", 4276 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 4277 break; 4278 4279 case RQCS_TRANSPORT_ERROR: 4280 { 4281 char buf[172]; 4282 buf[0] = 0; 4283 STRNCAT(buf, "states=>", sizeof buf); 4284 if (sp->req_state_flags & RQSF_GOT_BUS) { 4285 STRNCAT(buf, " GOT_BUS", sizeof buf); 4286 } 4287 if (sp->req_state_flags & RQSF_GOT_TARGET) { 4288 STRNCAT(buf, " GOT_TGT", sizeof buf); 4289 } 4290 if (sp->req_state_flags & RQSF_SENT_CDB) { 4291 STRNCAT(buf, " SENT_CDB", sizeof buf); 4292 } 4293 if (sp->req_state_flags & RQSF_XFRD_DATA) { 4294 STRNCAT(buf, " XFRD_DATA", sizeof buf); 4295 } 4296 if (sp->req_state_flags & RQSF_GOT_STATUS) { 4297 STRNCAT(buf, " GOT_STS", sizeof buf); 4298 } 4299 if (sp->req_state_flags & RQSF_GOT_SENSE) { 4300 STRNCAT(buf, " GOT_SNS", sizeof buf); 4301 } 4302 if (sp->req_state_flags & RQSF_XFER_COMPLETE) { 4303 STRNCAT(buf, " XFR_CMPLT", sizeof buf); 4304 } 4305 STRNCAT(buf, "\nstatus=>", sizeof buf); 4306 if (sp->req_status_flags & RQSTF_DISCONNECT) { 4307 STRNCAT(buf, " Disconnect", sizeof buf); 4308 } 4309 if (sp->req_status_flags & RQSTF_SYNCHRONOUS) { 4310 STRNCAT(buf, " Sync_xfr", sizeof buf); 4311 } 4312 if (sp->req_status_flags & RQSTF_PARITY_ERROR) { 4313 STRNCAT(buf, " Parity", sizeof buf); 4314 } 4315 if (sp->req_status_flags & RQSTF_BUS_RESET) { 4316 STRNCAT(buf, " Bus_Reset", sizeof buf); 4317 } 4318 if (sp->req_status_flags & RQSTF_DEVICE_RESET) { 4319 STRNCAT(buf, " Device_Reset", sizeof buf); 4320 } 4321 if (sp->req_status_flags & RQSTF_ABORTED) { 4322 STRNCAT(buf, " Aborted", sizeof buf); 4323 } 4324 if (sp->req_status_flags & RQSTF_TIMEOUT) { 4325 STRNCAT(buf, " Timeout", sizeof buf); 4326 } 4327 if (sp->req_status_flags & RQSTF_NEGOTIATION) { 4328 STRNCAT(buf, " Negotiation", sizeof buf); 4329 } 4330 isp_prt(isp, ISP_LOGERR, "%s", buf); 4331 isp_prt(isp, ISP_LOGERR, "transport error for %d.%d.%d:\n%s", 4332 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs), buf); 4333 break; 4334 } 4335 case RQCS_RESET_OCCURRED: 4336 isp_prt(isp, ISP_LOGWARN, 4337 "bus reset destroyed command for %d.%d.%d", 4338 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 4339 isp->isp_sendmarker |= (1 << XS_CHANNEL(xs)); 4340 if (XS_NOERR(xs)) { 4341 XS_SETERR(xs, HBA_BUSRESET); 4342 } 4343 return; 4344 4345 case RQCS_ABORTED: 4346 isp_prt(isp, ISP_LOGERR, "command aborted for %d.%d.%d", 4347 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 4348 isp->isp_sendmarker |= (1 << XS_CHANNEL(xs)); 4349 if (XS_NOERR(xs)) { 4350 XS_SETERR(xs, HBA_ABORTED); 4351 } 4352 return; 4353 4354 case RQCS_TIMEOUT: 4355 isp_prt(isp, ISP_LOGWARN, "command timed out for %d.%d.%d", 4356 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 4357 if (XS_NOERR(xs)) { 4358 XS_SETERR(xs, HBA_CMDTIMEOUT); 4359 } 4360 return; 4361 4362 case RQCS_DATA_OVERRUN: 4363 XS_RESID(xs) = sp->req_resid; 4364 isp_prt(isp, ISP_LOGERR, "data overrun for command on %d.%d.%d", 4365 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 4366 if (XS_NOERR(xs)) { 4367 XS_SETERR(xs, HBA_DATAOVR); 4368 } 4369 return; 4370 4371 case RQCS_COMMAND_OVERRUN: 4372 isp_prt(isp, ISP_LOGERR, 4373 "command overrun for command on %d.%d.%d", 4374 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 4375 break; 4376 4377 case RQCS_STATUS_OVERRUN: 4378 isp_prt(isp, ISP_LOGERR, 4379 "status overrun for command on %d.%d.%d", 4380 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 4381 break; 4382 4383 case RQCS_BAD_MESSAGE: 4384 isp_prt(isp, ISP_LOGERR, 4385 "msg not COMMAND COMPLETE after status %d.%d.%d", 4386 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 4387 break; 4388 4389 case RQCS_NO_MESSAGE_OUT: 4390 isp_prt(isp, ISP_LOGERR, 4391 "No MESSAGE OUT phase after selection on %d.%d.%d", 4392 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 4393 break; 4394 4395 case RQCS_EXT_ID_FAILED: 4396 isp_prt(isp, ISP_LOGERR, "EXTENDED IDENTIFY failed %d.%d.%d", 4397 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 4398 break; 4399 4400 case RQCS_IDE_MSG_FAILED: 4401 isp_prt(isp, ISP_LOGERR, 4402 "INITIATOR DETECTED ERROR rejected by %d.%d.%d", 4403 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 4404 break; 4405 4406 case RQCS_ABORT_MSG_FAILED: 4407 isp_prt(isp, ISP_LOGERR, "ABORT OPERATION rejected by %d.%d.%d", 4408 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 4409 break; 4410 4411 case RQCS_REJECT_MSG_FAILED: 4412 isp_prt(isp, ISP_LOGERR, "MESSAGE REJECT rejected by %d.%d.%d", 4413 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 4414 break; 4415 4416 case RQCS_NOP_MSG_FAILED: 4417 isp_prt(isp, ISP_LOGERR, "NOP rejected by %d.%d.%d", 4418 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 4419 break; 4420 4421 case RQCS_PARITY_ERROR_MSG_FAILED: 4422 isp_prt(isp, ISP_LOGERR, 4423 "MESSAGE PARITY ERROR rejected by %d.%d.%d", 4424 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 4425 break; 4426 4427 case RQCS_DEVICE_RESET_MSG_FAILED: 4428 isp_prt(isp, ISP_LOGWARN, 4429 "BUS DEVICE RESET rejected by %d.%d.%d", 4430 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 4431 break; 4432 4433 case RQCS_ID_MSG_FAILED: 4434 isp_prt(isp, ISP_LOGERR, "IDENTIFY rejected by %d.%d.%d", 4435 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 4436 break; 4437 4438 case RQCS_UNEXP_BUS_FREE: 4439 isp_prt(isp, ISP_LOGERR, "%d.%d.%d had an unexpected bus free", 4440 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 4441 break; 4442 4443 case RQCS_DATA_UNDERRUN: 4444 { 4445 if (IS_FC(isp)) { 4446 int ru_marked = (sp->req_scsi_status & RQCS_RU) != 0; 4447 if (!ru_marked || sp->req_resid > XS_XFRLEN(xs)) { 4448 isp_prt(isp, ISP_LOGWARN, bun, XS_TGT(xs), 4449 XS_LUN(xs), XS_XFRLEN(xs), sp->req_resid, 4450 (ru_marked)? "marked" : "not marked"); 4451 if (XS_NOERR(xs)) { 4452 XS_SETERR(xs, HBA_BOTCH); 4453 } 4454 return; 4455 } 4456 } 4457 XS_RESID(xs) = sp->req_resid; 4458 if (XS_NOERR(xs)) { 4459 XS_SETERR(xs, HBA_NOERROR); 4460 } 4461 return; 4462 } 4463 4464 case RQCS_XACT_ERR1: 4465 isp_prt(isp, ISP_LOGERR, xact1, XS_CHANNEL(xs), 4466 XS_TGT(xs), XS_LUN(xs)); 4467 break; 4468 4469 case RQCS_XACT_ERR2: 4470 isp_prt(isp, ISP_LOGERR, xact2, 4471 XS_LUN(xs), XS_TGT(xs), XS_CHANNEL(xs)); 4472 break; 4473 4474 case RQCS_XACT_ERR3: 4475 isp_prt(isp, ISP_LOGERR, xact3, 4476 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 4477 break; 4478 4479 case RQCS_BAD_ENTRY: 4480 isp_prt(isp, ISP_LOGERR, "Invalid IOCB entry type detected"); 4481 break; 4482 4483 case RQCS_QUEUE_FULL: 4484 isp_prt(isp, ISP_LOGDEBUG0, 4485 "internal queues full for %d.%d.%d status 0x%x", 4486 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs), *XS_STSP(xs)); 4487 4488 /* 4489 * If QFULL or some other status byte is set, then this 4490 * isn't an error, per se. 4491 * 4492 * Unfortunately, some QLogic f/w writers have, in 4493 * some cases, ommitted to *set* status to QFULL. 4494 * 4495 4496 if (*XS_STSP(xs) != SCSI_GOOD && XS_NOERR(xs)) { 4497 XS_SETERR(xs, HBA_NOERROR); 4498 return; 4499 } 4500 4501 * 4502 * 4503 */ 4504 4505 *XS_STSP(xs) = SCSI_QFULL; 4506 XS_SETERR(xs, HBA_NOERROR); 4507 return; 4508 4509 case RQCS_PHASE_SKIPPED: 4510 isp_prt(isp, ISP_LOGERR, pskip, XS_CHANNEL(xs), 4511 XS_TGT(xs), XS_LUN(xs)); 4512 break; 4513 4514 case RQCS_ARQS_FAILED: 4515 isp_prt(isp, ISP_LOGERR, 4516 "Auto Request Sense failed for %d.%d.%d", 4517 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 4518 if (XS_NOERR(xs)) { 4519 XS_SETERR(xs, HBA_ARQFAIL); 4520 } 4521 return; 4522 4523 case RQCS_WIDE_FAILED: 4524 isp_prt(isp, ISP_LOGERR, 4525 "Wide Negotiation failed for %d.%d.%d", 4526 XS_TGT(xs), XS_LUN(xs), XS_CHANNEL(xs)); 4527 if (IS_SCSI(isp)) { 4528 sdparam *sdp = isp->isp_param; 4529 sdp += XS_CHANNEL(xs); 4530 sdp->isp_devparam[XS_TGT(xs)].goal_flags &= ~DPARM_WIDE; 4531 sdp->isp_devparam[XS_TGT(xs)].dev_update = 1; 4532 isp->isp_update |= (1 << XS_CHANNEL(xs)); 4533 } 4534 if (XS_NOERR(xs)) { 4535 XS_SETERR(xs, HBA_NOERROR); 4536 } 4537 return; 4538 4539 case RQCS_SYNCXFER_FAILED: 4540 isp_prt(isp, ISP_LOGERR, 4541 "SDTR Message failed for target %d.%d.%d", 4542 XS_TGT(xs), XS_LUN(xs), XS_CHANNEL(xs)); 4543 if (IS_SCSI(isp)) { 4544 sdparam *sdp = isp->isp_param; 4545 sdp += XS_CHANNEL(xs); 4546 sdp->isp_devparam[XS_TGT(xs)].goal_flags &= ~DPARM_SYNC; 4547 sdp->isp_devparam[XS_TGT(xs)].dev_update = 1; 4548 isp->isp_update |= (1 << XS_CHANNEL(xs)); 4549 } 4550 break; 4551 4552 case RQCS_LVD_BUSERR: 4553 isp_prt(isp, ISP_LOGERR, 4554 "Bad LVD condition while talking to %d.%d.%d", 4555 XS_TGT(xs), XS_LUN(xs), XS_CHANNEL(xs)); 4556 break; 4557 4558 case RQCS_PORT_UNAVAILABLE: 4559 /* 4560 * No such port on the loop. Moral equivalent of SELTIMEO 4561 */ 4562 case RQCS_PORT_LOGGED_OUT: 4563 /* 4564 * It was there (maybe)- treat as a selection timeout. 4565 */ 4566 if ((sp->req_completion_status & 0xff) == RQCS_PORT_UNAVAILABLE) 4567 isp_prt(isp, ISP_LOGINFO, 4568 "port unavailable for target %d", XS_TGT(xs)); 4569 else 4570 isp_prt(isp, ISP_LOGINFO, 4571 "port logout for target %d", XS_TGT(xs)); 4572 /* 4573 * If we're on a local loop, force a LIP (which is overkill) 4574 * to force a re-login of this unit. If we're on fabric, 4575 * then we'll have to relogin as a matter of course. 4576 */ 4577 if (FCPARAM(isp)->isp_topo == TOPO_NL_PORT || 4578 FCPARAM(isp)->isp_topo == TOPO_FL_PORT) { 4579 mbreg_t mbs; 4580 mbs.param[0] = MBOX_INIT_LIP; 4581 isp_mboxcmd_qnw(isp, &mbs, 1); 4582 } 4583 4584 /* 4585 * Probably overkill. 4586 */ 4587 isp->isp_sendmarker = 1; 4588 FCPARAM(isp)->isp_loopstate = LOOP_PDB_RCVD; 4589 isp_mark_getpdb_all(isp); 4590 isp_async(isp, ISPASYNC_CHANGE_NOTIFY, ISPASYNC_CHANGE_OTHER); 4591 if (XS_NOERR(xs)) { 4592 XS_SETERR(xs, HBA_SELTIMEOUT); 4593 } 4594 return; 4595 4596 case RQCS_PORT_CHANGED: 4597 isp_prt(isp, ISP_LOGWARN, 4598 "port changed for target %d", XS_TGT(xs)); 4599 if (XS_NOERR(xs)) { 4600 XS_SETERR(xs, HBA_SELTIMEOUT); 4601 } 4602 return; 4603 4604 case RQCS_PORT_BUSY: 4605 isp_prt(isp, ISP_LOGWARN, 4606 "port busy for target %d", XS_TGT(xs)); 4607 if (XS_NOERR(xs)) { 4608 XS_SETERR(xs, HBA_TGTBSY); 4609 } 4610 return; 4611 4612 default: 4613 isp_prt(isp, ISP_LOGERR, "Unknown Completion Status 0x%x", 4614 sp->req_completion_status); 4615 break; 4616 } 4617 if (XS_NOERR(xs)) { 4618 XS_SETERR(xs, HBA_BOTCH); 4619 } 4620 } 4621 4622 static void 4623 isp_fastpost_complete(struct ispsoftc *isp, u_int16_t fph) 4624 { 4625 XS_T *xs; 4626 4627 if (fph == 0) { 4628 return; 4629 } 4630 xs = isp_find_xs(isp, fph); 4631 if (xs == NULL) { 4632 isp_prt(isp, ISP_LOGWARN, 4633 "Command for fast post handle 0x%x not found", fph); 4634 return; 4635 } 4636 isp_destroy_handle(isp, fph); 4637 4638 /* 4639 * Since we don't have a result queue entry item, 4640 * we must believe that SCSI status is zero and 4641 * that all data transferred. 4642 */ 4643 XS_SET_STATE_STAT(isp, xs, NULL); 4644 XS_RESID(xs) = 0; 4645 *XS_STSP(xs) = SCSI_GOOD; 4646 if (XS_XFRLEN(xs)) { 4647 ISP_DMAFREE(isp, xs, fph); 4648 } 4649 if (isp->isp_nactive) 4650 isp->isp_nactive--; 4651 isp->isp_fphccmplt++; 4652 isp_done(xs); 4653 } 4654 4655 static int 4656 isp_mbox_continue(struct ispsoftc *isp) 4657 { 4658 mbreg_t mbs; 4659 u_int16_t *ptr; 4660 4661 switch (isp->isp_lastmbxcmd) { 4662 case MBOX_WRITE_RAM_WORD: 4663 case MBOX_READ_RAM_WORD: 4664 case MBOX_READ_RAM_WORD_EXTENDED: 4665 break; 4666 default: 4667 return (1); 4668 } 4669 if (isp->isp_mboxtmp[0] != MBOX_COMMAND_COMPLETE) { 4670 isp->isp_mbxwrk0 = 0; 4671 return (-1); 4672 } 4673 4674 4675 /* 4676 * Clear the previous interrupt. 4677 */ 4678 ISP_WRITE(isp, HCCR, HCCR_CMD_CLEAR_RISC_INT); 4679 ISP_WRITE(isp, BIU_SEMA, 0); 4680 4681 /* 4682 * Continue with next word. 4683 */ 4684 ptr = isp->isp_mbxworkp; 4685 switch (isp->isp_lastmbxcmd) { 4686 case MBOX_WRITE_RAM_WORD: 4687 mbs.param[2] = *ptr++; 4688 mbs.param[1] = isp->isp_mbxwrk1++; 4689 break; 4690 case MBOX_READ_RAM_WORD: 4691 case MBOX_READ_RAM_WORD_EXTENDED: 4692 *ptr++ = isp->isp_mboxtmp[2]; 4693 mbs.param[1] = isp->isp_mbxwrk1++; 4694 break; 4695 } 4696 isp->isp_mbxworkp = ptr; 4697 mbs.param[0] = isp->isp_lastmbxcmd; 4698 isp->isp_mbxwrk0 -= 1; 4699 isp_mboxcmd_qnw(isp, &mbs, 0); 4700 return (0); 4701 } 4702 4703 4704 #define HIBYT(x) ((x) >> 0x8) 4705 #define LOBYT(x) ((x) & 0xff) 4706 #define ISPOPMAP(a, b) (((a) << 8) | (b)) 4707 static u_int16_t mbpscsi[] = { 4708 ISPOPMAP(0x01, 0x01), /* 0x00: MBOX_NO_OP */ 4709 ISPOPMAP(0x1f, 0x01), /* 0x01: MBOX_LOAD_RAM */ 4710 ISPOPMAP(0x03, 0x01), /* 0x02: MBOX_EXEC_FIRMWARE */ 4711 ISPOPMAP(0x1f, 0x01), /* 0x03: MBOX_DUMP_RAM */ 4712 ISPOPMAP(0x07, 0x07), /* 0x04: MBOX_WRITE_RAM_WORD */ 4713 ISPOPMAP(0x03, 0x07), /* 0x05: MBOX_READ_RAM_WORD */ 4714 ISPOPMAP(0x3f, 0x3f), /* 0x06: MBOX_MAILBOX_REG_TEST */ 4715 ISPOPMAP(0x03, 0x07), /* 0x07: MBOX_VERIFY_CHECKSUM */ 4716 ISPOPMAP(0x01, 0x0f), /* 0x08: MBOX_ABOUT_FIRMWARE */ 4717 ISPOPMAP(0x00, 0x00), /* 0x09: */ 4718 ISPOPMAP(0x00, 0x00), /* 0x0a: */ 4719 ISPOPMAP(0x00, 0x00), /* 0x0b: */ 4720 ISPOPMAP(0x00, 0x00), /* 0x0c: */ 4721 ISPOPMAP(0x00, 0x00), /* 0x0d: */ 4722 ISPOPMAP(0x01, 0x05), /* 0x0e: MBOX_CHECK_FIRMWARE */ 4723 ISPOPMAP(0x00, 0x00), /* 0x0f: */ 4724 ISPOPMAP(0x1f, 0x1f), /* 0x10: MBOX_INIT_REQ_QUEUE */ 4725 ISPOPMAP(0x3f, 0x3f), /* 0x11: MBOX_INIT_RES_QUEUE */ 4726 ISPOPMAP(0x0f, 0x0f), /* 0x12: MBOX_EXECUTE_IOCB */ 4727 ISPOPMAP(0x03, 0x03), /* 0x13: MBOX_WAKE_UP */ 4728 ISPOPMAP(0x01, 0x3f), /* 0x14: MBOX_STOP_FIRMWARE */ 4729 ISPOPMAP(0x0f, 0x0f), /* 0x15: MBOX_ABORT */ 4730 ISPOPMAP(0x03, 0x03), /* 0x16: MBOX_ABORT_DEVICE */ 4731 ISPOPMAP(0x07, 0x07), /* 0x17: MBOX_ABORT_TARGET */ 4732 ISPOPMAP(0x07, 0x07), /* 0x18: MBOX_BUS_RESET */ 4733 ISPOPMAP(0x03, 0x07), /* 0x19: MBOX_STOP_QUEUE */ 4734 ISPOPMAP(0x03, 0x07), /* 0x1a: MBOX_START_QUEUE */ 4735 ISPOPMAP(0x03, 0x07), /* 0x1b: MBOX_SINGLE_STEP_QUEUE */ 4736 ISPOPMAP(0x03, 0x07), /* 0x1c: MBOX_ABORT_QUEUE */ 4737 ISPOPMAP(0x03, 0x4f), /* 0x1d: MBOX_GET_DEV_QUEUE_STATUS */ 4738 ISPOPMAP(0x00, 0x00), /* 0x1e: */ 4739 ISPOPMAP(0x01, 0x07), /* 0x1f: MBOX_GET_FIRMWARE_STATUS */ 4740 ISPOPMAP(0x01, 0x07), /* 0x20: MBOX_GET_INIT_SCSI_ID */ 4741 ISPOPMAP(0x01, 0x07), /* 0x21: MBOX_GET_SELECT_TIMEOUT */ 4742 ISPOPMAP(0x01, 0xc7), /* 0x22: MBOX_GET_RETRY_COUNT */ 4743 ISPOPMAP(0x01, 0x07), /* 0x23: MBOX_GET_TAG_AGE_LIMIT */ 4744 ISPOPMAP(0x01, 0x03), /* 0x24: MBOX_GET_CLOCK_RATE */ 4745 ISPOPMAP(0x01, 0x07), /* 0x25: MBOX_GET_ACT_NEG_STATE */ 4746 ISPOPMAP(0x01, 0x07), /* 0x26: MBOX_GET_ASYNC_DATA_SETUP_TIME */ 4747 ISPOPMAP(0x01, 0x07), /* 0x27: MBOX_GET_PCI_PARAMS */ 4748 ISPOPMAP(0x03, 0x4f), /* 0x28: MBOX_GET_TARGET_PARAMS */ 4749 ISPOPMAP(0x03, 0x0f), /* 0x29: MBOX_GET_DEV_QUEUE_PARAMS */ 4750 ISPOPMAP(0x01, 0x07), /* 0x2a: MBOX_GET_RESET_DELAY_PARAMS */ 4751 ISPOPMAP(0x00, 0x00), /* 0x2b: */ 4752 ISPOPMAP(0x00, 0x00), /* 0x2c: */ 4753 ISPOPMAP(0x00, 0x00), /* 0x2d: */ 4754 ISPOPMAP(0x00, 0x00), /* 0x2e: */ 4755 ISPOPMAP(0x00, 0x00), /* 0x2f: */ 4756 ISPOPMAP(0x03, 0x03), /* 0x30: MBOX_SET_INIT_SCSI_ID */ 4757 ISPOPMAP(0x07, 0x07), /* 0x31: MBOX_SET_SELECT_TIMEOUT */ 4758 ISPOPMAP(0xc7, 0xc7), /* 0x32: MBOX_SET_RETRY_COUNT */ 4759 ISPOPMAP(0x07, 0x07), /* 0x33: MBOX_SET_TAG_AGE_LIMIT */ 4760 ISPOPMAP(0x03, 0x03), /* 0x34: MBOX_SET_CLOCK_RATE */ 4761 ISPOPMAP(0x07, 0x07), /* 0x35: MBOX_SET_ACT_NEG_STATE */ 4762 ISPOPMAP(0x07, 0x07), /* 0x36: MBOX_SET_ASYNC_DATA_SETUP_TIME */ 4763 ISPOPMAP(0x07, 0x07), /* 0x37: MBOX_SET_PCI_CONTROL_PARAMS */ 4764 ISPOPMAP(0x4f, 0x4f), /* 0x38: MBOX_SET_TARGET_PARAMS */ 4765 ISPOPMAP(0x0f, 0x0f), /* 0x39: MBOX_SET_DEV_QUEUE_PARAMS */ 4766 ISPOPMAP(0x07, 0x07), /* 0x3a: MBOX_SET_RESET_DELAY_PARAMS */ 4767 ISPOPMAP(0x00, 0x00), /* 0x3b: */ 4768 ISPOPMAP(0x00, 0x00), /* 0x3c: */ 4769 ISPOPMAP(0x00, 0x00), /* 0x3d: */ 4770 ISPOPMAP(0x00, 0x00), /* 0x3e: */ 4771 ISPOPMAP(0x00, 0x00), /* 0x3f: */ 4772 ISPOPMAP(0x01, 0x03), /* 0x40: MBOX_RETURN_BIOS_BLOCK_ADDR */ 4773 ISPOPMAP(0x3f, 0x01), /* 0x41: MBOX_WRITE_FOUR_RAM_WORDS */ 4774 ISPOPMAP(0x03, 0x07), /* 0x42: MBOX_EXEC_BIOS_IOCB */ 4775 ISPOPMAP(0x00, 0x00), /* 0x43: */ 4776 ISPOPMAP(0x00, 0x00), /* 0x44: */ 4777 ISPOPMAP(0x03, 0x03), /* 0x45: SET SYSTEM PARAMETER */ 4778 ISPOPMAP(0x01, 0x03), /* 0x46: GET SYSTEM PARAMETER */ 4779 ISPOPMAP(0x00, 0x00), /* 0x47: */ 4780 ISPOPMAP(0x01, 0xcf), /* 0x48: GET SCAM CONFIGURATION */ 4781 ISPOPMAP(0xcf, 0xcf), /* 0x49: SET SCAM CONFIGURATION */ 4782 ISPOPMAP(0x03, 0x03), /* 0x4a: MBOX_SET_FIRMWARE_FEATURES */ 4783 ISPOPMAP(0x01, 0x03), /* 0x4b: MBOX_GET_FIRMWARE_FEATURES */ 4784 ISPOPMAP(0x00, 0x00), /* 0x4c: */ 4785 ISPOPMAP(0x00, 0x00), /* 0x4d: */ 4786 ISPOPMAP(0x00, 0x00), /* 0x4e: */ 4787 ISPOPMAP(0x00, 0x00), /* 0x4f: */ 4788 ISPOPMAP(0xdf, 0xdf), /* 0x50: LOAD RAM A64 */ 4789 ISPOPMAP(0xdf, 0xdf), /* 0x51: DUMP RAM A64 */ 4790 ISPOPMAP(0xdf, 0xdf), /* 0x52: INITIALIZE REQUEST QUEUE A64 */ 4791 ISPOPMAP(0xff, 0xff), /* 0x53: INITIALIZE RESPONSE QUEUE A64 */ 4792 ISPOPMAP(0xcf, 0x01), /* 0x54: EXECUTE IOCB A64 */ 4793 ISPOPMAP(0x07, 0x01), /* 0x55: ENABLE TARGET MODE */ 4794 ISPOPMAP(0x03, 0x0f), /* 0x56: GET TARGET STATUS */ 4795 ISPOPMAP(0x00, 0x00), /* 0x57: */ 4796 ISPOPMAP(0x00, 0x00), /* 0x58: */ 4797 ISPOPMAP(0x00, 0x00), /* 0x59: */ 4798 ISPOPMAP(0x03, 0x03), /* 0x5a: SET DATA OVERRUN RECOVERY MODE */ 4799 ISPOPMAP(0x01, 0x03), /* 0x5b: GET DATA OVERRUN RECOVERY MODE */ 4800 ISPOPMAP(0x0f, 0x0f), /* 0x5c: SET HOST DATA */ 4801 ISPOPMAP(0x01, 0x01) /* 0x5d: GET NOST DATA */ 4802 }; 4803 4804 #ifndef ISP_STRIPPED 4805 static char *scsi_mbcmd_names[] = { 4806 "NO-OP", 4807 "LOAD RAM", 4808 "EXEC FIRMWARE", 4809 "DUMP RAM", 4810 "WRITE RAM WORD", 4811 "READ RAM WORD", 4812 "MAILBOX REG TEST", 4813 "VERIFY CHECKSUM", 4814 "ABOUT FIRMWARE", 4815 NULL, 4816 NULL, 4817 NULL, 4818 NULL, 4819 NULL, 4820 "CHECK FIRMWARE", 4821 NULL, 4822 "INIT REQUEST QUEUE", 4823 "INIT RESULT QUEUE", 4824 "EXECUTE IOCB", 4825 "WAKE UP", 4826 "STOP FIRMWARE", 4827 "ABORT", 4828 "ABORT DEVICE", 4829 "ABORT TARGET", 4830 "BUS RESET", 4831 "STOP QUEUE", 4832 "START QUEUE", 4833 "SINGLE STEP QUEUE", 4834 "ABORT QUEUE", 4835 "GET DEV QUEUE STATUS", 4836 NULL, 4837 "GET FIRMWARE STATUS", 4838 "GET INIT SCSI ID", 4839 "GET SELECT TIMEOUT", 4840 "GET RETRY COUNT", 4841 "GET TAG AGE LIMIT", 4842 "GET CLOCK RATE", 4843 "GET ACT NEG STATE", 4844 "GET ASYNC DATA SETUP TIME", 4845 "GET PCI PARAMS", 4846 "GET TARGET PARAMS", 4847 "GET DEV QUEUE PARAMS", 4848 "GET RESET DELAY PARAMS", 4849 NULL, 4850 NULL, 4851 NULL, 4852 NULL, 4853 NULL, 4854 "SET INIT SCSI ID", 4855 "SET SELECT TIMEOUT", 4856 "SET RETRY COUNT", 4857 "SET TAG AGE LIMIT", 4858 "SET CLOCK RATE", 4859 "SET ACT NEG STATE", 4860 "SET ASYNC DATA SETUP TIME", 4861 "SET PCI CONTROL PARAMS", 4862 "SET TARGET PARAMS", 4863 "SET DEV QUEUE PARAMS", 4864 "SET RESET DELAY PARAMS", 4865 NULL, 4866 NULL, 4867 NULL, 4868 NULL, 4869 NULL, 4870 "RETURN BIOS BLOCK ADDR", 4871 "WRITE FOUR RAM WORDS", 4872 "EXEC BIOS IOCB", 4873 NULL, 4874 NULL, 4875 "SET SYSTEM PARAMETER", 4876 "GET SYSTEM PARAMETER", 4877 NULL, 4878 "GET SCAM CONFIGURATION", 4879 "SET SCAM CONFIGURATION", 4880 "SET FIRMWARE FEATURES", 4881 "GET FIRMWARE FEATURES", 4882 NULL, 4883 NULL, 4884 NULL, 4885 NULL, 4886 "LOAD RAM A64", 4887 "DUMP RAM A64", 4888 "INITIALIZE REQUEST QUEUE A64", 4889 "INITIALIZE RESPONSE QUEUE A64", 4890 "EXECUTE IOCB A64", 4891 "ENABLE TARGET MODE", 4892 "GET TARGET MODE STATE", 4893 NULL, 4894 NULL, 4895 NULL, 4896 "SET DATA OVERRUN RECOVERY MODE", 4897 "GET DATA OVERRUN RECOVERY MODE", 4898 "SET HOST DATA", 4899 "GET NOST DATA", 4900 }; 4901 #endif 4902 4903 static u_int16_t mbpfc[] = { 4904 ISPOPMAP(0x01, 0x01), /* 0x00: MBOX_NO_OP */ 4905 ISPOPMAP(0x1f, 0x01), /* 0x01: MBOX_LOAD_RAM */ 4906 ISPOPMAP(0x03, 0x01), /* 0x02: MBOX_EXEC_FIRMWARE */ 4907 ISPOPMAP(0xdf, 0x01), /* 0x03: MBOX_DUMP_RAM */ 4908 ISPOPMAP(0x07, 0x07), /* 0x04: MBOX_WRITE_RAM_WORD */ 4909 ISPOPMAP(0x03, 0x07), /* 0x05: MBOX_READ_RAM_WORD */ 4910 ISPOPMAP(0xff, 0xff), /* 0x06: MBOX_MAILBOX_REG_TEST */ 4911 ISPOPMAP(0x03, 0x05), /* 0x07: MBOX_VERIFY_CHECKSUM */ 4912 ISPOPMAP(0x01, 0x4f), /* 0x08: MBOX_ABOUT_FIRMWARE */ 4913 ISPOPMAP(0xdf, 0x01), /* 0x09: LOAD RAM */ 4914 ISPOPMAP(0xdf, 0x01), /* 0x0a: DUMP RAM */ 4915 ISPOPMAP(0x00, 0x00), /* 0x0b: */ 4916 ISPOPMAP(0x00, 0x00), /* 0x0c: */ 4917 ISPOPMAP(0x00, 0x00), /* 0x0d: */ 4918 ISPOPMAP(0x01, 0x05), /* 0x0e: MBOX_CHECK_FIRMWARE */ 4919 ISPOPMAP(0x03, 0x07), /* 0x0f: MBOX_READ_RAM_WORD_EXTENDED(1) */ 4920 ISPOPMAP(0x1f, 0x11), /* 0x10: MBOX_INIT_REQ_QUEUE */ 4921 ISPOPMAP(0x2f, 0x21), /* 0x11: MBOX_INIT_RES_QUEUE */ 4922 ISPOPMAP(0x0f, 0x01), /* 0x12: MBOX_EXECUTE_IOCB */ 4923 ISPOPMAP(0x03, 0x03), /* 0x13: MBOX_WAKE_UP */ 4924 ISPOPMAP(0x01, 0xff), /* 0x14: MBOX_STOP_FIRMWARE */ 4925 ISPOPMAP(0x4f, 0x01), /* 0x15: MBOX_ABORT */ 4926 ISPOPMAP(0x07, 0x01), /* 0x16: MBOX_ABORT_DEVICE */ 4927 ISPOPMAP(0x07, 0x01), /* 0x17: MBOX_ABORT_TARGET */ 4928 ISPOPMAP(0x03, 0x03), /* 0x18: MBOX_BUS_RESET */ 4929 ISPOPMAP(0x07, 0x05), /* 0x19: MBOX_STOP_QUEUE */ 4930 ISPOPMAP(0x07, 0x05), /* 0x1a: MBOX_START_QUEUE */ 4931 ISPOPMAP(0x07, 0x05), /* 0x1b: MBOX_SINGLE_STEP_QUEUE */ 4932 ISPOPMAP(0x07, 0x05), /* 0x1c: MBOX_ABORT_QUEUE */ 4933 ISPOPMAP(0x07, 0x03), /* 0x1d: MBOX_GET_DEV_QUEUE_STATUS */ 4934 ISPOPMAP(0x00, 0x00), /* 0x1e: */ 4935 ISPOPMAP(0x01, 0x07), /* 0x1f: MBOX_GET_FIRMWARE_STATUS */ 4936 ISPOPMAP(0x01, 0x4f), /* 0x20: MBOX_GET_LOOP_ID */ 4937 ISPOPMAP(0x00, 0x00), /* 0x21: */ 4938 ISPOPMAP(0x01, 0x07), /* 0x22: MBOX_GET_RETRY_COUNT */ 4939 ISPOPMAP(0x00, 0x00), /* 0x23: */ 4940 ISPOPMAP(0x00, 0x00), /* 0x24: */ 4941 ISPOPMAP(0x00, 0x00), /* 0x25: */ 4942 ISPOPMAP(0x00, 0x00), /* 0x26: */ 4943 ISPOPMAP(0x00, 0x00), /* 0x27: */ 4944 ISPOPMAP(0x01, 0x03), /* 0x28: MBOX_GET_FIRMWARE_OPTIONS */ 4945 ISPOPMAP(0x03, 0x07), /* 0x29: MBOX_GET_PORT_QUEUE_PARAMS */ 4946 ISPOPMAP(0x00, 0x00), /* 0x2a: */ 4947 ISPOPMAP(0x00, 0x00), /* 0x2b: */ 4948 ISPOPMAP(0x00, 0x00), /* 0x2c: */ 4949 ISPOPMAP(0x00, 0x00), /* 0x2d: */ 4950 ISPOPMAP(0x00, 0x00), /* 0x2e: */ 4951 ISPOPMAP(0x00, 0x00), /* 0x2f: */ 4952 ISPOPMAP(0x00, 0x00), /* 0x30: */ 4953 ISPOPMAP(0x00, 0x00), /* 0x31: */ 4954 ISPOPMAP(0x07, 0x07), /* 0x32: MBOX_SET_RETRY_COUNT */ 4955 ISPOPMAP(0x00, 0x00), /* 0x33: */ 4956 ISPOPMAP(0x00, 0x00), /* 0x34: */ 4957 ISPOPMAP(0x00, 0x00), /* 0x35: */ 4958 ISPOPMAP(0x00, 0x00), /* 0x36: */ 4959 ISPOPMAP(0x00, 0x00), /* 0x37: */ 4960 ISPOPMAP(0x0f, 0x01), /* 0x38: MBOX_SET_FIRMWARE_OPTIONS */ 4961 ISPOPMAP(0x0f, 0x07), /* 0x39: MBOX_SET_PORT_QUEUE_PARAMS */ 4962 ISPOPMAP(0x00, 0x00), /* 0x3a: */ 4963 ISPOPMAP(0x00, 0x00), /* 0x3b: */ 4964 ISPOPMAP(0x00, 0x00), /* 0x3c: */ 4965 ISPOPMAP(0x00, 0x00), /* 0x3d: */ 4966 ISPOPMAP(0x00, 0x00), /* 0x3e: */ 4967 ISPOPMAP(0x00, 0x00), /* 0x3f: */ 4968 ISPOPMAP(0x03, 0x01), /* 0x40: MBOX_LOOP_PORT_BYPASS */ 4969 ISPOPMAP(0x03, 0x01), /* 0x41: MBOX_LOOP_PORT_ENABLE */ 4970 ISPOPMAP(0x03, 0x07), /* 0x42: MBOX_GET_RESOURCE_COUNTS */ 4971 ISPOPMAP(0x01, 0x01), /* 0x43: MBOX_REQUEST_NON_PARTICIPATING_MODE */ 4972 ISPOPMAP(0x00, 0x00), /* 0x44: */ 4973 ISPOPMAP(0x00, 0x00), /* 0x45: */ 4974 ISPOPMAP(0x00, 0x00), /* 0x46: */ 4975 ISPOPMAP(0xcf, 0x03), /* 0x47: GET PORT_DATABASE ENHANCED */ 4976 ISPOPMAP(0x00, 0x00), /* 0x48: */ 4977 ISPOPMAP(0x00, 0x00), /* 0x49: */ 4978 ISPOPMAP(0x00, 0x00), /* 0x4a: */ 4979 ISPOPMAP(0x00, 0x00), /* 0x4b: */ 4980 ISPOPMAP(0x00, 0x00), /* 0x4c: */ 4981 ISPOPMAP(0x00, 0x00), /* 0x4d: */ 4982 ISPOPMAP(0x00, 0x00), /* 0x4e: */ 4983 ISPOPMAP(0x00, 0x00), /* 0x4f: */ 4984 ISPOPMAP(0x00, 0x00), /* 0x50: */ 4985 ISPOPMAP(0x00, 0x00), /* 0x51: */ 4986 ISPOPMAP(0x00, 0x00), /* 0x52: */ 4987 ISPOPMAP(0x00, 0x00), /* 0x53: */ 4988 ISPOPMAP(0xcf, 0x01), /* 0x54: EXECUTE IOCB A64 */ 4989 ISPOPMAP(0x00, 0x00), /* 0x55: */ 4990 ISPOPMAP(0x00, 0x00), /* 0x56: */ 4991 ISPOPMAP(0x00, 0x00), /* 0x57: */ 4992 ISPOPMAP(0x00, 0x00), /* 0x58: */ 4993 ISPOPMAP(0x00, 0x00), /* 0x59: */ 4994 ISPOPMAP(0x00, 0x00), /* 0x5a: */ 4995 ISPOPMAP(0x03, 0x01), /* 0x5b: MBOX_DRIVER_HEARTBEAT */ 4996 ISPOPMAP(0xcf, 0x01), /* 0x5c: MBOX_FW_HEARTBEAT */ 4997 ISPOPMAP(0x07, 0x03), /* 0x5d: MBOX_GET_SET_DATA_RATE */ 4998 ISPOPMAP(0x00, 0x00), /* 0x5e: */ 4999 ISPOPMAP(0x00, 0x00), /* 0x5f: */ 5000 ISPOPMAP(0xfd, 0x31), /* 0x60: MBOX_INIT_FIRMWARE */ 5001 ISPOPMAP(0x00, 0x00), /* 0x61: */ 5002 ISPOPMAP(0x01, 0x01), /* 0x62: MBOX_INIT_LIP */ 5003 ISPOPMAP(0xcd, 0x03), /* 0x63: MBOX_GET_FC_AL_POSITION_MAP */ 5004 ISPOPMAP(0xcf, 0x01), /* 0x64: MBOX_GET_PORT_DB */ 5005 ISPOPMAP(0x07, 0x01), /* 0x65: MBOX_CLEAR_ACA */ 5006 ISPOPMAP(0x07, 0x01), /* 0x66: MBOX_TARGET_RESET */ 5007 ISPOPMAP(0x07, 0x01), /* 0x67: MBOX_CLEAR_TASK_SET */ 5008 ISPOPMAP(0x07, 0x01), /* 0x68: MBOX_ABORT_TASK_SET */ 5009 ISPOPMAP(0x01, 0x07), /* 0x69: MBOX_GET_FW_STATE */ 5010 ISPOPMAP(0x03, 0xcf), /* 0x6a: MBOX_GET_PORT_NAME */ 5011 ISPOPMAP(0xcf, 0x01), /* 0x6b: MBOX_GET_LINK_STATUS */ 5012 ISPOPMAP(0x0f, 0x01), /* 0x6c: MBOX_INIT_LIP_RESET */ 5013 ISPOPMAP(0x00, 0x00), /* 0x6d: */ 5014 ISPOPMAP(0xcf, 0x03), /* 0x6e: MBOX_SEND_SNS */ 5015 ISPOPMAP(0x0f, 0x07), /* 0x6f: MBOX_FABRIC_LOGIN */ 5016 ISPOPMAP(0x03, 0x01), /* 0x70: MBOX_SEND_CHANGE_REQUEST */ 5017 ISPOPMAP(0x03, 0x03), /* 0x71: MBOX_FABRIC_LOGOUT */ 5018 ISPOPMAP(0x0f, 0x0f), /* 0x72: MBOX_INIT_LIP_LOGIN */ 5019 ISPOPMAP(0x00, 0x00), /* 0x73: */ 5020 ISPOPMAP(0x07, 0x01), /* 0x74: LOGIN LOOP PORT */ 5021 ISPOPMAP(0xcf, 0x03), /* 0x75: GET PORT/NODE NAME LIST */ 5022 ISPOPMAP(0x4f, 0x01), /* 0x76: SET VENDOR ID */ 5023 ISPOPMAP(0xcd, 0x01), /* 0x77: INITIALIZE IP MAILBOX */ 5024 ISPOPMAP(0x00, 0x00), /* 0x78: */ 5025 ISPOPMAP(0x00, 0x00), /* 0x79: */ 5026 ISPOPMAP(0x00, 0x00), /* 0x7a: */ 5027 ISPOPMAP(0x00, 0x00), /* 0x7b: */ 5028 ISPOPMAP(0x4f, 0x03), /* 0x7c: Get ID List */ 5029 ISPOPMAP(0xcf, 0x01), /* 0x7d: SEND LFA */ 5030 ISPOPMAP(0x07, 0x01) /* 0x7e: Lun RESET */ 5031 }; 5032 /* 5033 * Footnotes 5034 * 5035 * (1): this sets bits 21..16 in mailbox register #8, which we nominally 5036 * do not access at this time in the core driver. The caller is 5037 * responsible for setting this register first (Gross!). 5038 */ 5039 5040 #ifndef ISP_STRIPPED 5041 static char *fc_mbcmd_names[] = { 5042 "NO-OP", 5043 "LOAD RAM", 5044 "EXEC FIRMWARE", 5045 "DUMP RAM", 5046 "WRITE RAM WORD", 5047 "READ RAM WORD", 5048 "MAILBOX REG TEST", 5049 "VERIFY CHECKSUM", 5050 "ABOUT FIRMWARE", 5051 "LOAD RAM", 5052 "DUMP RAM", 5053 NULL, 5054 NULL, 5055 "READ RAM WORD EXTENDED", 5056 "CHECK FIRMWARE", 5057 NULL, 5058 "INIT REQUEST QUEUE", 5059 "INIT RESULT QUEUE", 5060 "EXECUTE IOCB", 5061 "WAKE UP", 5062 "STOP FIRMWARE", 5063 "ABORT", 5064 "ABORT DEVICE", 5065 "ABORT TARGET", 5066 "BUS RESET", 5067 "STOP QUEUE", 5068 "START QUEUE", 5069 "SINGLE STEP QUEUE", 5070 "ABORT QUEUE", 5071 "GET DEV QUEUE STATUS", 5072 NULL, 5073 "GET FIRMWARE STATUS", 5074 "GET LOOP ID", 5075 NULL, 5076 "GET RETRY COUNT", 5077 NULL, 5078 NULL, 5079 NULL, 5080 NULL, 5081 NULL, 5082 "GET FIRMWARE OPTIONS", 5083 "GET PORT QUEUE PARAMS", 5084 NULL, 5085 NULL, 5086 NULL, 5087 NULL, 5088 NULL, 5089 NULL, 5090 NULL, 5091 NULL, 5092 "SET RETRY COUNT", 5093 NULL, 5094 NULL, 5095 NULL, 5096 NULL, 5097 NULL, 5098 "SET FIRMWARE OPTIONS", 5099 "SET PORT QUEUE PARAMS", 5100 NULL, 5101 NULL, 5102 NULL, 5103 NULL, 5104 NULL, 5105 NULL, 5106 "LOOP PORT BYPASS", 5107 "LOOP PORT ENABLE", 5108 "GET RESOURCE COUNTS", 5109 "REQUEST NON PARTICIPATING MODE", 5110 NULL, 5111 NULL, 5112 NULL, 5113 "GET PORT DATABASE,, ENHANCED", 5114 NULL, 5115 NULL, 5116 NULL, 5117 NULL, 5118 NULL, 5119 NULL, 5120 NULL, 5121 NULL, 5122 NULL, 5123 NULL, 5124 NULL, 5125 NULL, 5126 "EXECUTE IOCB A64", 5127 NULL, 5128 NULL, 5129 NULL, 5130 NULL, 5131 NULL, 5132 NULL, 5133 NULL, 5134 NULL, 5135 "GET/SET DATA RATE", 5136 NULL, 5137 NULL, 5138 "INIT FIRMWARE", 5139 NULL, 5140 "INIT LIP", 5141 "GET FC-AL POSITION MAP", 5142 "GET PORT DATABASE", 5143 "CLEAR ACA", 5144 "TARGET RESET", 5145 "CLEAR TASK SET", 5146 "ABORT TASK SET", 5147 "GET FW STATE", 5148 "GET PORT NAME", 5149 "GET LINK STATUS", 5150 "INIT LIP RESET", 5151 NULL, 5152 "SEND SNS", 5153 "FABRIC LOGIN", 5154 "SEND CHANGE REQUEST", 5155 "FABRIC LOGOUT", 5156 "INIT LIP LOGIN", 5157 NULL, 5158 "LOGIN LOOP PORT", 5159 "GET PORT/NODE NAME LIST", 5160 "SET VENDOR ID", 5161 "INITIALIZE IP MAILBOX", 5162 NULL, 5163 NULL, 5164 NULL, 5165 NULL, 5166 "Get ID List", 5167 "SEND LFA", 5168 "Lun RESET" 5169 }; 5170 #endif 5171 5172 static void 5173 isp_mboxcmd_qnw(struct ispsoftc *isp, mbreg_t *mbp, int nodelay) 5174 { 5175 unsigned int lim, ibits, obits, box, opcode; 5176 u_int16_t *mcp; 5177 5178 if (IS_FC(isp)) { 5179 mcp = mbpfc; 5180 lim = (sizeof (mbpfc) / sizeof (mbpfc[0])); 5181 } else { 5182 mcp = mbpscsi; 5183 lim = (sizeof (mbpscsi) / sizeof (mbpscsi[0])); 5184 } 5185 opcode = mbp->param[0]; 5186 ibits = HIBYT(mcp[opcode]) & NMBOX_BMASK(isp); 5187 obits = LOBYT(mcp[opcode]) & NMBOX_BMASK(isp); 5188 for (box = 0; box < MAX_MAILBOX; box++) { 5189 if (ibits & (1 << box)) { 5190 ISP_WRITE(isp, MBOX_OFF(box), mbp->param[box]); 5191 } 5192 if (nodelay == 0) { 5193 isp->isp_mboxtmp[box] = mbp->param[box] = 0; 5194 } 5195 } 5196 if (nodelay == 0) { 5197 isp->isp_lastmbxcmd = opcode; 5198 isp->isp_obits = obits; 5199 isp->isp_mboxbsy = 1; 5200 } 5201 ISP_WRITE(isp, HCCR, HCCR_CMD_SET_HOST_INT); 5202 /* 5203 * Oddly enough, if we're not delaying for an answer, 5204 * delay a bit to give the f/w a chance to pick up the 5205 * command. 5206 */ 5207 if (nodelay) { 5208 USEC_DELAY(1000); 5209 } 5210 } 5211 5212 static void 5213 isp_mboxcmd(struct ispsoftc *isp, mbreg_t *mbp, int logmask) 5214 { 5215 char *cname, *xname, tname[16], mname[16]; 5216 unsigned int lim, ibits, obits, box, opcode; 5217 u_int16_t *mcp; 5218 5219 if (IS_FC(isp)) { 5220 mcp = mbpfc; 5221 lim = (sizeof (mbpfc) / sizeof (mbpfc[0])); 5222 } else { 5223 mcp = mbpscsi; 5224 lim = (sizeof (mbpscsi) / sizeof (mbpscsi[0])); 5225 } 5226 5227 if ((opcode = mbp->param[0]) >= lim) { 5228 mbp->param[0] = MBOX_INVALID_COMMAND; 5229 isp_prt(isp, ISP_LOGERR, "Unknown Command 0x%x", opcode); 5230 return; 5231 } 5232 5233 ibits = HIBYT(mcp[opcode]) & NMBOX_BMASK(isp); 5234 obits = LOBYT(mcp[opcode]) & NMBOX_BMASK(isp); 5235 5236 if (ibits == 0 && obits == 0) { 5237 mbp->param[0] = MBOX_COMMAND_PARAM_ERROR; 5238 isp_prt(isp, ISP_LOGERR, "no parameters for 0x%x", opcode); 5239 return; 5240 } 5241 5242 /* 5243 * Get exclusive usage of mailbox registers. 5244 */ 5245 MBOX_ACQUIRE(isp); 5246 5247 for (box = 0; box < MAX_MAILBOX; box++) { 5248 if (ibits & (1 << box)) { 5249 ISP_WRITE(isp, MBOX_OFF(box), mbp->param[box]); 5250 } 5251 isp->isp_mboxtmp[box] = mbp->param[box] = 0; 5252 } 5253 5254 isp->isp_lastmbxcmd = opcode; 5255 5256 /* 5257 * We assume that we can't overwrite a previous command. 5258 */ 5259 isp->isp_obits = obits; 5260 isp->isp_mboxbsy = 1; 5261 5262 /* 5263 * Set Host Interrupt condition so that RISC will pick up mailbox regs. 5264 */ 5265 ISP_WRITE(isp, HCCR, HCCR_CMD_SET_HOST_INT); 5266 5267 /* 5268 * While we haven't finished the command, spin our wheels here. 5269 */ 5270 MBOX_WAIT_COMPLETE(isp); 5271 5272 if (isp->isp_mboxbsy) { 5273 /* 5274 * Command timed out. 5275 */ 5276 isp->isp_mboxbsy = 0; 5277 MBOX_RELEASE(isp); 5278 return; 5279 } 5280 5281 /* 5282 * Copy back output registers. 5283 */ 5284 for (box = 0; box < MAX_MAILBOX; box++) { 5285 if (obits & (1 << box)) { 5286 mbp->param[box] = isp->isp_mboxtmp[box]; 5287 } 5288 } 5289 5290 MBOX_RELEASE(isp); 5291 5292 if (logmask == 0 || opcode == MBOX_EXEC_FIRMWARE) { 5293 return; 5294 } 5295 #ifdef ISP_STRIPPED 5296 cname = NULL; 5297 #else 5298 cname = (IS_FC(isp))? fc_mbcmd_names[opcode] : scsi_mbcmd_names[opcode]; 5299 #endif 5300 if (cname == NULL) { 5301 cname = tname; 5302 SNPRINTF(tname, sizeof tname, "opcode %x", opcode); 5303 } 5304 5305 /* 5306 * Just to be chatty here... 5307 */ 5308 xname = NULL; 5309 switch (mbp->param[0]) { 5310 case MBOX_COMMAND_COMPLETE: 5311 break; 5312 case MBOX_INVALID_COMMAND: 5313 if (logmask & MBLOGMASK(MBOX_COMMAND_COMPLETE)) 5314 xname = "INVALID COMMAND"; 5315 break; 5316 case MBOX_HOST_INTERFACE_ERROR: 5317 if (logmask & MBLOGMASK(MBOX_HOST_INTERFACE_ERROR)) 5318 xname = "HOST INTERFACE ERROR"; 5319 break; 5320 case MBOX_TEST_FAILED: 5321 if (logmask & MBLOGMASK(MBOX_TEST_FAILED)) 5322 xname = "TEST FAILED"; 5323 break; 5324 case MBOX_COMMAND_ERROR: 5325 if (logmask & MBLOGMASK(MBOX_COMMAND_ERROR)) 5326 xname = "COMMAND ERROR"; 5327 break; 5328 case MBOX_COMMAND_PARAM_ERROR: 5329 if (logmask & MBLOGMASK(MBOX_COMMAND_PARAM_ERROR)) 5330 xname = "COMMAND PARAMETER ERROR"; 5331 break; 5332 case MBOX_LOOP_ID_USED: 5333 if (logmask & MBLOGMASK(MBOX_LOOP_ID_USED)) 5334 xname = "LOOP ID ALREADY IN USE"; 5335 break; 5336 case MBOX_PORT_ID_USED: 5337 if (logmask & MBLOGMASK(MBOX_PORT_ID_USED)) 5338 xname = "PORT ID ALREADY IN USE"; 5339 break; 5340 case MBOX_ALL_IDS_USED: 5341 if (logmask & MBLOGMASK(MBOX_ALL_IDS_USED)) 5342 xname = "ALL LOOP IDS IN USE"; 5343 break; 5344 case 0: /* special case */ 5345 xname = "TIMEOUT"; 5346 break; 5347 default: 5348 SNPRINTF(mname, sizeof mname, "error 0x%x", mbp->param[0]); 5349 xname = mname; 5350 break; 5351 } 5352 if (xname) 5353 isp_prt(isp, ISP_LOGALL, "Mailbox Command '%s' failed (%s)", 5354 cname, xname); 5355 } 5356 5357 static void 5358 isp_fw_state(struct ispsoftc *isp) 5359 { 5360 if (IS_FC(isp)) { 5361 mbreg_t mbs; 5362 fcparam *fcp = isp->isp_param; 5363 5364 mbs.param[0] = MBOX_GET_FW_STATE; 5365 isp_mboxcmd(isp, &mbs, MBLOGALL); 5366 if (mbs.param[0] == MBOX_COMMAND_COMPLETE) { 5367 fcp->isp_fwstate = mbs.param[1]; 5368 } 5369 } 5370 } 5371 5372 static void 5373 isp_update(struct ispsoftc *isp) 5374 { 5375 int bus, upmask; 5376 5377 for (bus = 0, upmask = isp->isp_update; upmask != 0; bus++) { 5378 if (upmask & (1 << bus)) { 5379 isp_update_bus(isp, bus); 5380 } 5381 upmask &= ~(1 << bus); 5382 } 5383 } 5384 5385 static void 5386 isp_update_bus(struct ispsoftc *isp, int bus) 5387 { 5388 int tgt; 5389 mbreg_t mbs; 5390 sdparam *sdp; 5391 5392 isp->isp_update &= ~(1 << bus); 5393 if (IS_FC(isp)) { 5394 /* 5395 * There are no 'per-bus' settings for Fibre Channel. 5396 */ 5397 return; 5398 } 5399 sdp = isp->isp_param; 5400 sdp += bus; 5401 5402 for (tgt = 0; tgt < MAX_TARGETS; tgt++) { 5403 u_int16_t flags, period, offset; 5404 int get; 5405 5406 if (sdp->isp_devparam[tgt].dev_enable == 0) { 5407 sdp->isp_devparam[tgt].dev_update = 0; 5408 sdp->isp_devparam[tgt].dev_refresh = 0; 5409 isp_prt(isp, ISP_LOGDEBUG0, 5410 "skipping target %d bus %d update", tgt, bus); 5411 continue; 5412 } 5413 /* 5414 * If the goal is to update the status of the device, 5415 * take what's in goal_flags and try and set the device 5416 * toward that. Otherwise, if we're just refreshing the 5417 * current device state, get the current parameters. 5418 */ 5419 5420 /* 5421 * Refresh overrides set 5422 */ 5423 if (sdp->isp_devparam[tgt].dev_refresh) { 5424 mbs.param[0] = MBOX_GET_TARGET_PARAMS; 5425 sdp->isp_devparam[tgt].dev_refresh = 0; 5426 get = 1; 5427 } else if (sdp->isp_devparam[tgt].dev_update) { 5428 mbs.param[0] = MBOX_SET_TARGET_PARAMS; 5429 /* 5430 * Make sure goal_flags has "Renegotiate on Error" 5431 * on and "Freeze Queue on Error" off. 5432 */ 5433 sdp->isp_devparam[tgt].goal_flags |= DPARM_RENEG; 5434 sdp->isp_devparam[tgt].goal_flags &= ~DPARM_QFRZ; 5435 5436 mbs.param[2] = sdp->isp_devparam[tgt].goal_flags; 5437 5438 /* 5439 * Insist that PARITY must be enabled 5440 * if SYNC or WIDE is enabled. 5441 */ 5442 if ((mbs.param[2] & (DPARM_SYNC|DPARM_WIDE)) != 0) { 5443 mbs.param[2] |= DPARM_PARITY; 5444 } 5445 5446 if ((mbs.param[2] & DPARM_SYNC) == 0) { 5447 mbs.param[3] = 0; 5448 } else { 5449 mbs.param[3] = 5450 (sdp->isp_devparam[tgt].goal_offset << 8) | 5451 (sdp->isp_devparam[tgt].goal_period); 5452 } 5453 /* 5454 * A command completion later that has 5455 * RQSTF_NEGOTIATION set can cause 5456 * the dev_refresh/announce cycle also. 5457 * 5458 * Note: It is really important to update our current 5459 * flags with at least the state of TAG capabilities- 5460 * otherwise we might try and send a tagged command 5461 * when we have it all turned off. So change it here 5462 * to say that current already matches goal. 5463 */ 5464 sdp->isp_devparam[tgt].actv_flags &= ~DPARM_TQING; 5465 sdp->isp_devparam[tgt].actv_flags |= 5466 (sdp->isp_devparam[tgt].goal_flags & DPARM_TQING); 5467 isp_prt(isp, ISP_LOGDEBUG0, 5468 "bus %d set tgt %d flags 0x%x off 0x%x period 0x%x", 5469 bus, tgt, mbs.param[2], mbs.param[3] >> 8, 5470 mbs.param[3] & 0xff); 5471 sdp->isp_devparam[tgt].dev_update = 0; 5472 sdp->isp_devparam[tgt].dev_refresh = 1; 5473 get = 0; 5474 } else { 5475 continue; 5476 } 5477 mbs.param[1] = (bus << 15) | (tgt << 8); 5478 isp_mboxcmd(isp, &mbs, MBLOGALL); 5479 if (get == 0) { 5480 isp->isp_sendmarker |= (1 << bus); 5481 continue; 5482 } 5483 flags = mbs.param[2]; 5484 period = mbs.param[3] & 0xff; 5485 offset = mbs.param[3] >> 8; 5486 sdp->isp_devparam[tgt].actv_flags = flags; 5487 sdp->isp_devparam[tgt].actv_period = period; 5488 sdp->isp_devparam[tgt].actv_offset = offset; 5489 get = (bus << 16) | tgt; 5490 (void) isp_async(isp, ISPASYNC_NEW_TGT_PARAMS, &get); 5491 } 5492 5493 for (tgt = 0; tgt < MAX_TARGETS; tgt++) { 5494 if (sdp->isp_devparam[tgt].dev_update || 5495 sdp->isp_devparam[tgt].dev_refresh) { 5496 isp->isp_update |= (1 << bus); 5497 break; 5498 } 5499 } 5500 } 5501 5502 static void 5503 isp_setdfltparm(struct ispsoftc *isp, int channel) 5504 { 5505 int tgt; 5506 mbreg_t mbs; 5507 sdparam *sdp; 5508 5509 if (IS_FC(isp)) { 5510 fcparam *fcp = (fcparam *) isp->isp_param; 5511 int nvfail; 5512 5513 fcp += channel; 5514 if (fcp->isp_gotdparms) { 5515 return; 5516 } 5517 fcp->isp_gotdparms = 1; 5518 fcp->isp_maxfrmlen = ICB_DFLT_FRMLEN; 5519 fcp->isp_maxalloc = ICB_DFLT_ALLOC; 5520 fcp->isp_execthrottle = ISP_EXEC_THROTTLE; 5521 fcp->isp_retry_delay = ICB_DFLT_RDELAY; 5522 fcp->isp_retry_count = ICB_DFLT_RCOUNT; 5523 /* Platform specific.... */ 5524 fcp->isp_loopid = DEFAULT_LOOPID(isp); 5525 fcp->isp_nodewwn = DEFAULT_NODEWWN(isp); 5526 fcp->isp_portwwn = DEFAULT_PORTWWN(isp); 5527 fcp->isp_fwoptions = 0; 5528 fcp->isp_fwoptions |= ICBOPT_FAIRNESS; 5529 fcp->isp_fwoptions |= ICBOPT_PDBCHANGE_AE; 5530 fcp->isp_fwoptions |= ICBOPT_HARD_ADDRESS; 5531 #ifndef ISP_NO_FASTPOST_FC 5532 fcp->isp_fwoptions |= ICBOPT_FAST_POST; 5533 #endif 5534 if (isp->isp_confopts & ISP_CFG_FULL_DUPLEX) 5535 fcp->isp_fwoptions |= ICBOPT_FULL_DUPLEX; 5536 5537 /* 5538 * Make sure this is turned off now until we get 5539 * extended options from NVRAM 5540 */ 5541 fcp->isp_fwoptions &= ~ICBOPT_EXTENDED; 5542 5543 /* 5544 * Now try and read NVRAM unless told to not do so. 5545 * This will set fcparam's isp_nodewwn && isp_portwwn. 5546 */ 5547 if ((isp->isp_confopts & ISP_CFG_NONVRAM) == 0) { 5548 nvfail = isp_read_nvram(isp); 5549 if (nvfail) 5550 isp->isp_confopts |= ISP_CFG_NONVRAM; 5551 } else { 5552 nvfail = 1; 5553 } 5554 /* 5555 * Set node && port to override platform set defaults 5556 * unless the nvram read failed (or none was done), 5557 * or the platform code wants to use what had been 5558 * set in the defaults. 5559 */ 5560 if (nvfail) { 5561 isp->isp_confopts |= ISP_CFG_OWNWWPN|ISP_CFG_OWNWWNN; 5562 } 5563 if (isp->isp_confopts & ISP_CFG_OWNWWNN) { 5564 isp_prt(isp, ISP_LOGCONFIG, "Using Node WWN 0x%08x%08x", 5565 (u_int32_t) (DEFAULT_NODEWWN(isp) >> 32), 5566 (u_int32_t) (DEFAULT_NODEWWN(isp) & 0xffffffff)); 5567 ISP_NODEWWN(isp) = DEFAULT_NODEWWN(isp); 5568 } else { 5569 /* 5570 * We always start out with values derived 5571 * from NVRAM or our platform default. 5572 */ 5573 ISP_NODEWWN(isp) = fcp->isp_nodewwn; 5574 } 5575 if (isp->isp_confopts & ISP_CFG_OWNWWPN) { 5576 isp_prt(isp, ISP_LOGCONFIG, "Using Port WWN 0x%08x%08x", 5577 (u_int32_t) (DEFAULT_PORTWWN(isp) >> 32), 5578 (u_int32_t) (DEFAULT_PORTWWN(isp) & 0xffffffff)); 5579 ISP_PORTWWN(isp) = DEFAULT_PORTWWN(isp); 5580 } else { 5581 /* 5582 * We always start out with values derived 5583 * from NVRAM or our platform default. 5584 */ 5585 ISP_PORTWWN(isp) = fcp->isp_portwwn; 5586 } 5587 return; 5588 } 5589 5590 sdp = (sdparam *) isp->isp_param; 5591 sdp += channel; 5592 5593 /* 5594 * Been there, done that, got the T-shirt... 5595 */ 5596 if (sdp->isp_gotdparms) { 5597 return; 5598 } 5599 sdp->isp_gotdparms = 1; 5600 5601 /* 5602 * Establish some default parameters. 5603 */ 5604 sdp->isp_cmd_dma_burst_enable = 0; 5605 sdp->isp_data_dma_burst_enabl = 1; 5606 sdp->isp_fifo_threshold = 0; 5607 sdp->isp_initiator_id = DEFAULT_IID(isp); 5608 if (isp->isp_type >= ISP_HA_SCSI_1040) { 5609 sdp->isp_async_data_setup = 9; 5610 } else { 5611 sdp->isp_async_data_setup = 6; 5612 } 5613 sdp->isp_selection_timeout = 250; 5614 sdp->isp_max_queue_depth = MAXISPREQUEST(isp); 5615 sdp->isp_tag_aging = 8; 5616 sdp->isp_bus_reset_delay = 5; 5617 /* 5618 * Don't retry selection, busy or queue full automatically- reflect 5619 * these back to us. 5620 */ 5621 sdp->isp_retry_count = 0; 5622 sdp->isp_retry_delay = 0; 5623 5624 for (tgt = 0; tgt < MAX_TARGETS; tgt++) { 5625 sdp->isp_devparam[tgt].exc_throttle = ISP_EXEC_THROTTLE; 5626 sdp->isp_devparam[tgt].dev_enable = 1; 5627 } 5628 5629 /* 5630 * If we've not been told to avoid reading NVRAM, try and read it. 5631 * If we're successful reading it, we can then return because NVRAM 5632 * will tell us what the desired settings are. Otherwise, we establish 5633 * some reasonable 'fake' nvram and goal defaults. 5634 */ 5635 5636 if ((isp->isp_confopts & ISP_CFG_NONVRAM) == 0) { 5637 if (isp_read_nvram(isp) == 0) { 5638 return; 5639 } 5640 } 5641 5642 /* 5643 * Now try and see whether we have specific values for them. 5644 */ 5645 if ((isp->isp_confopts & ISP_CFG_NONVRAM) == 0) { 5646 mbs.param[0] = MBOX_GET_ACT_NEG_STATE; 5647 isp_mboxcmd(isp, &mbs, MBLOGNONE); 5648 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 5649 sdp->isp_req_ack_active_neg = 1; 5650 sdp->isp_data_line_active_neg = 1; 5651 } else { 5652 sdp->isp_req_ack_active_neg = 5653 (mbs.param[1+channel] >> 4) & 0x1; 5654 sdp->isp_data_line_active_neg = 5655 (mbs.param[1+channel] >> 5) & 0x1; 5656 } 5657 } 5658 5659 isp_prt(isp, ISP_LOGDEBUG0, sc0, sc3, 5660 0, sdp->isp_fifo_threshold, sdp->isp_initiator_id, 5661 sdp->isp_bus_reset_delay, sdp->isp_retry_count, 5662 sdp->isp_retry_delay, sdp->isp_async_data_setup); 5663 isp_prt(isp, ISP_LOGDEBUG0, sc1, sc3, 5664 sdp->isp_req_ack_active_neg, sdp->isp_data_line_active_neg, 5665 sdp->isp_data_dma_burst_enabl, sdp->isp_cmd_dma_burst_enable, 5666 sdp->isp_selection_timeout, sdp->isp_max_queue_depth); 5667 5668 /* 5669 * The trick here is to establish a default for the default (honk!) 5670 * state (goal_flags). Then try and get the current status from 5671 * the card to fill in the current state. We don't, in fact, set 5672 * the default to the SAFE default state- that's not the goal state. 5673 */ 5674 for (tgt = 0; tgt < MAX_TARGETS; tgt++) { 5675 u_int8_t off, per; 5676 sdp->isp_devparam[tgt].actv_offset = 0; 5677 sdp->isp_devparam[tgt].actv_period = 0; 5678 sdp->isp_devparam[tgt].actv_flags = 0; 5679 5680 sdp->isp_devparam[tgt].goal_flags = 5681 sdp->isp_devparam[tgt].nvrm_flags = DPARM_DEFAULT; 5682 5683 /* 5684 * We default to Wide/Fast for versions less than a 1040 5685 * (unless it's SBus). 5686 */ 5687 if (IS_ULTRA3(isp)) { 5688 off = ISP_80M_SYNCPARMS >> 8; 5689 per = ISP_80M_SYNCPARMS & 0xff; 5690 } else if (IS_ULTRA2(isp)) { 5691 off = ISP_40M_SYNCPARMS >> 8; 5692 per = ISP_40M_SYNCPARMS & 0xff; 5693 } else if (IS_1240(isp)) { 5694 off = ISP_20M_SYNCPARMS >> 8; 5695 per = ISP_20M_SYNCPARMS & 0xff; 5696 } else if ((isp->isp_bustype == ISP_BT_SBUS && 5697 isp->isp_type < ISP_HA_SCSI_1020A) || 5698 (isp->isp_bustype == ISP_BT_PCI && 5699 isp->isp_type < ISP_HA_SCSI_1040) || 5700 (isp->isp_clock && isp->isp_clock < 60) || 5701 (sdp->isp_ultramode == 0)) { 5702 off = ISP_10M_SYNCPARMS >> 8; 5703 per = ISP_10M_SYNCPARMS & 0xff; 5704 } else { 5705 off = ISP_20M_SYNCPARMS_1040 >> 8; 5706 per = ISP_20M_SYNCPARMS_1040 & 0xff; 5707 } 5708 sdp->isp_devparam[tgt].goal_offset = 5709 sdp->isp_devparam[tgt].nvrm_offset = off; 5710 sdp->isp_devparam[tgt].goal_period = 5711 sdp->isp_devparam[tgt].nvrm_period = per; 5712 5713 isp_prt(isp, ISP_LOGDEBUG0, sc2, sc3, 5714 channel, tgt, sdp->isp_devparam[tgt].nvrm_flags, 5715 sdp->isp_devparam[tgt].nvrm_offset, 5716 sdp->isp_devparam[tgt].nvrm_period); 5717 } 5718 } 5719 5720 /* 5721 * Re-initialize the ISP and complete all orphaned commands 5722 * with a 'botched' notice. The reset/init routines should 5723 * not disturb an already active list of commands. 5724 * 5725 * Locks held prior to coming here. 5726 */ 5727 5728 void 5729 isp_reinit(struct ispsoftc *isp) 5730 { 5731 XS_T *xs; 5732 u_int16_t handle; 5733 5734 isp_reset(isp); 5735 if (isp->isp_state != ISP_RESETSTATE) { 5736 isp_prt(isp, ISP_LOGERR, "isp_reinit cannot reset card"); 5737 goto skip; 5738 } 5739 isp_init(isp); 5740 if (isp->isp_role == ISP_ROLE_NONE) { 5741 goto skip; 5742 } 5743 if (isp->isp_state == ISP_INITSTATE) { 5744 isp->isp_state = ISP_RUNSTATE; 5745 } 5746 if (isp->isp_state != ISP_RUNSTATE) { 5747 isp_prt(isp, ISP_LOGERR, "isp_reinit cannot restart card"); 5748 } 5749 skip: 5750 isp->isp_nactive = 0; 5751 5752 for (handle = 1; (int) handle <= isp->isp_maxcmds; handle++) { 5753 xs = isp_find_xs(isp, handle); 5754 if (xs == NULL) { 5755 continue; 5756 } 5757 isp_destroy_handle(isp, handle); 5758 if (XS_XFRLEN(xs)) { 5759 ISP_DMAFREE(isp, xs, handle); 5760 XS_RESID(xs) = XS_XFRLEN(xs); 5761 } else { 5762 XS_RESID(xs) = 0; 5763 } 5764 XS_SETERR(xs, HBA_BUSRESET); 5765 isp_done(xs); 5766 } 5767 } 5768 5769 /* 5770 * NVRAM Routines 5771 */ 5772 static int 5773 isp_read_nvram(struct ispsoftc *isp) 5774 { 5775 int i, amt; 5776 u_int8_t csum, minversion; 5777 union { 5778 u_int8_t _x[ISP2100_NVRAM_SIZE]; 5779 u_int16_t _s[ISP2100_NVRAM_SIZE>>1]; 5780 } _n; 5781 #define nvram_data _n._x 5782 #define nvram_words _n._s 5783 5784 if (IS_FC(isp)) { 5785 amt = ISP2100_NVRAM_SIZE; 5786 minversion = 1; 5787 } else if (IS_ULTRA2(isp)) { 5788 amt = ISP1080_NVRAM_SIZE; 5789 minversion = 0; 5790 } else { 5791 amt = ISP_NVRAM_SIZE; 5792 minversion = 2; 5793 } 5794 5795 /* 5796 * Just read the first two words first to see if we have a valid 5797 * NVRAM to continue reading the rest with. 5798 */ 5799 for (i = 0; i < 2; i++) { 5800 isp_rdnvram_word(isp, i, &nvram_words[i]); 5801 } 5802 if (nvram_data[0] != 'I' || nvram_data[1] != 'S' || 5803 nvram_data[2] != 'P') { 5804 if (isp->isp_bustype != ISP_BT_SBUS) { 5805 isp_prt(isp, ISP_LOGWARN, "invalid NVRAM header"); 5806 isp_prt(isp, ISP_LOGDEBUG0, "%x %x %x", 5807 nvram_data[0], nvram_data[1], nvram_data[2]); 5808 } 5809 return (-1); 5810 } 5811 for (i = 2; i < amt>>1; i++) { 5812 isp_rdnvram_word(isp, i, &nvram_words[i]); 5813 } 5814 for (csum = 0, i = 0; i < amt; i++) { 5815 csum += nvram_data[i]; 5816 } 5817 if (csum != 0) { 5818 isp_prt(isp, ISP_LOGWARN, "invalid NVRAM checksum"); 5819 return (-1); 5820 } 5821 if (ISP_NVRAM_VERSION(nvram_data) < minversion) { 5822 isp_prt(isp, ISP_LOGWARN, "version %d NVRAM not understood", 5823 ISP_NVRAM_VERSION(nvram_data)); 5824 return (-1); 5825 } 5826 5827 if (IS_ULTRA3(isp)) { 5828 isp_parse_nvram_12160(isp, 0, nvram_data); 5829 isp_parse_nvram_12160(isp, 1, nvram_data); 5830 } else if (IS_1080(isp)) { 5831 isp_parse_nvram_1080(isp, 0, nvram_data); 5832 } else if (IS_1280(isp) || IS_1240(isp)) { 5833 isp_parse_nvram_1080(isp, 0, nvram_data); 5834 isp_parse_nvram_1080(isp, 1, nvram_data); 5835 } else if (IS_SCSI(isp)) { 5836 isp_parse_nvram_1020(isp, nvram_data); 5837 } else { 5838 isp_parse_nvram_2100(isp, nvram_data); 5839 } 5840 return (0); 5841 #undef nvram_data 5842 #undef nvram_words 5843 } 5844 5845 static void 5846 isp_rdnvram_word(struct ispsoftc *isp, int wo, u_int16_t *rp) 5847 { 5848 int i, cbits; 5849 u_int16_t bit, rqst; 5850 5851 ISP_WRITE(isp, BIU_NVRAM, BIU_NVRAM_SELECT); 5852 USEC_DELAY(2); 5853 ISP_WRITE(isp, BIU_NVRAM, BIU_NVRAM_SELECT|BIU_NVRAM_CLOCK); 5854 USEC_DELAY(2); 5855 5856 if (IS_FC(isp)) { 5857 wo &= ((ISP2100_NVRAM_SIZE >> 1) - 1); 5858 if (IS_2312(isp) && isp->isp_port) { 5859 wo += 128; 5860 } 5861 rqst = (ISP_NVRAM_READ << 8) | wo; 5862 cbits = 10; 5863 } else if (IS_ULTRA2(isp)) { 5864 wo &= ((ISP1080_NVRAM_SIZE >> 1) - 1); 5865 rqst = (ISP_NVRAM_READ << 8) | wo; 5866 cbits = 10; 5867 } else { 5868 wo &= ((ISP_NVRAM_SIZE >> 1) - 1); 5869 rqst = (ISP_NVRAM_READ << 6) | wo; 5870 cbits = 8; 5871 } 5872 5873 /* 5874 * Clock the word select request out... 5875 */ 5876 for (i = cbits; i >= 0; i--) { 5877 if ((rqst >> i) & 1) { 5878 bit = BIU_NVRAM_SELECT | BIU_NVRAM_DATAOUT; 5879 } else { 5880 bit = BIU_NVRAM_SELECT; 5881 } 5882 ISP_WRITE(isp, BIU_NVRAM, bit); 5883 USEC_DELAY(2); 5884 ISP_WRITE(isp, BIU_NVRAM, bit | BIU_NVRAM_CLOCK); 5885 USEC_DELAY(2); 5886 ISP_WRITE(isp, BIU_NVRAM, bit); 5887 USEC_DELAY(2); 5888 } 5889 /* 5890 * Now read the result back in (bits come back in MSB format). 5891 */ 5892 *rp = 0; 5893 for (i = 0; i < 16; i++) { 5894 u_int16_t rv; 5895 *rp <<= 1; 5896 ISP_WRITE(isp, BIU_NVRAM, BIU_NVRAM_SELECT|BIU_NVRAM_CLOCK); 5897 USEC_DELAY(2); 5898 rv = ISP_READ(isp, BIU_NVRAM); 5899 if (rv & BIU_NVRAM_DATAIN) { 5900 *rp |= 1; 5901 } 5902 USEC_DELAY(2); 5903 ISP_WRITE(isp, BIU_NVRAM, BIU_NVRAM_SELECT); 5904 USEC_DELAY(2); 5905 } 5906 ISP_WRITE(isp, BIU_NVRAM, 0); 5907 USEC_DELAY(2); 5908 ISP_SWIZZLE_NVRAM_WORD(isp, rp); 5909 } 5910 5911 static void 5912 isp_parse_nvram_1020(struct ispsoftc *isp, u_int8_t *nvram_data) 5913 { 5914 sdparam *sdp = (sdparam *) isp->isp_param; 5915 int tgt; 5916 5917 sdp->isp_fifo_threshold = 5918 ISP_NVRAM_FIFO_THRESHOLD(nvram_data) | 5919 (ISP_NVRAM_FIFO_THRESHOLD_128(nvram_data) << 2); 5920 5921 sdp->isp_initiator_id = 5922 ISP_NVRAM_INITIATOR_ID(nvram_data); 5923 5924 sdp->isp_bus_reset_delay = 5925 ISP_NVRAM_BUS_RESET_DELAY(nvram_data); 5926 5927 sdp->isp_retry_count = 5928 ISP_NVRAM_BUS_RETRY_COUNT(nvram_data); 5929 5930 sdp->isp_retry_delay = 5931 ISP_NVRAM_BUS_RETRY_DELAY(nvram_data); 5932 5933 sdp->isp_async_data_setup = 5934 ISP_NVRAM_ASYNC_DATA_SETUP_TIME(nvram_data); 5935 5936 if (isp->isp_type >= ISP_HA_SCSI_1040) { 5937 if (sdp->isp_async_data_setup < 9) { 5938 sdp->isp_async_data_setup = 9; 5939 } 5940 } else { 5941 if (sdp->isp_async_data_setup != 6) { 5942 sdp->isp_async_data_setup = 6; 5943 } 5944 } 5945 5946 sdp->isp_req_ack_active_neg = 5947 ISP_NVRAM_REQ_ACK_ACTIVE_NEGATION(nvram_data); 5948 5949 sdp->isp_data_line_active_neg = 5950 ISP_NVRAM_DATA_LINE_ACTIVE_NEGATION(nvram_data); 5951 5952 sdp->isp_data_dma_burst_enabl = 5953 ISP_NVRAM_DATA_DMA_BURST_ENABLE(nvram_data); 5954 5955 sdp->isp_cmd_dma_burst_enable = 5956 ISP_NVRAM_CMD_DMA_BURST_ENABLE(nvram_data); 5957 5958 sdp->isp_tag_aging = 5959 ISP_NVRAM_TAG_AGE_LIMIT(nvram_data); 5960 5961 sdp->isp_selection_timeout = 5962 ISP_NVRAM_SELECTION_TIMEOUT(nvram_data); 5963 5964 sdp->isp_max_queue_depth = 5965 ISP_NVRAM_MAX_QUEUE_DEPTH(nvram_data); 5966 5967 sdp->isp_fast_mttr = ISP_NVRAM_FAST_MTTR_ENABLE(nvram_data); 5968 5969 isp_prt(isp, ISP_LOGDEBUG0, sc0, sc4, 5970 0, sdp->isp_fifo_threshold, sdp->isp_initiator_id, 5971 sdp->isp_bus_reset_delay, sdp->isp_retry_count, 5972 sdp->isp_retry_delay, sdp->isp_async_data_setup); 5973 isp_prt(isp, ISP_LOGDEBUG0, sc1, sc4, 5974 sdp->isp_req_ack_active_neg, sdp->isp_data_line_active_neg, 5975 sdp->isp_data_dma_burst_enabl, sdp->isp_cmd_dma_burst_enable, 5976 sdp->isp_selection_timeout, sdp->isp_max_queue_depth); 5977 5978 for (tgt = 0; tgt < MAX_TARGETS; tgt++) { 5979 sdp->isp_devparam[tgt].dev_enable = 5980 ISP_NVRAM_TGT_DEVICE_ENABLE(nvram_data, tgt); 5981 sdp->isp_devparam[tgt].exc_throttle = 5982 ISP_NVRAM_TGT_EXEC_THROTTLE(nvram_data, tgt); 5983 sdp->isp_devparam[tgt].nvrm_offset = 5984 ISP_NVRAM_TGT_SYNC_OFFSET(nvram_data, tgt); 5985 sdp->isp_devparam[tgt].nvrm_period = 5986 ISP_NVRAM_TGT_SYNC_PERIOD(nvram_data, tgt); 5987 /* 5988 * We probably shouldn't lie about this, but it 5989 * it makes it much safer if we limit NVRAM values 5990 * to sanity. 5991 */ 5992 if (isp->isp_type < ISP_HA_SCSI_1040) { 5993 /* 5994 * If we're not ultra, we can't possibly 5995 * be a shorter period than this. 5996 */ 5997 if (sdp->isp_devparam[tgt].nvrm_period < 0x19) { 5998 sdp->isp_devparam[tgt].nvrm_period = 0x19; 5999 } 6000 if (sdp->isp_devparam[tgt].nvrm_offset > 0xc) { 6001 sdp->isp_devparam[tgt].nvrm_offset = 0x0c; 6002 } 6003 } else { 6004 if (sdp->isp_devparam[tgt].nvrm_offset > 0x8) { 6005 sdp->isp_devparam[tgt].nvrm_offset = 0x8; 6006 } 6007 } 6008 sdp->isp_devparam[tgt].nvrm_flags = 0; 6009 if (ISP_NVRAM_TGT_RENEG(nvram_data, tgt)) 6010 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_RENEG; 6011 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_ARQ; 6012 if (ISP_NVRAM_TGT_TQING(nvram_data, tgt)) 6013 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_TQING; 6014 if (ISP_NVRAM_TGT_SYNC(nvram_data, tgt)) 6015 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_SYNC; 6016 if (ISP_NVRAM_TGT_WIDE(nvram_data, tgt)) 6017 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_WIDE; 6018 if (ISP_NVRAM_TGT_PARITY(nvram_data, tgt)) 6019 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_PARITY; 6020 if (ISP_NVRAM_TGT_DISC(nvram_data, tgt)) 6021 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_DISC; 6022 sdp->isp_devparam[tgt].actv_flags = 0; /* we don't know */ 6023 isp_prt(isp, ISP_LOGDEBUG0, sc2, sc4, 6024 0, tgt, sdp->isp_devparam[tgt].nvrm_flags, 6025 sdp->isp_devparam[tgt].nvrm_offset, 6026 sdp->isp_devparam[tgt].nvrm_period); 6027 sdp->isp_devparam[tgt].goal_offset = 6028 sdp->isp_devparam[tgt].nvrm_offset; 6029 sdp->isp_devparam[tgt].goal_period = 6030 sdp->isp_devparam[tgt].nvrm_period; 6031 sdp->isp_devparam[tgt].goal_flags = 6032 sdp->isp_devparam[tgt].nvrm_flags; 6033 } 6034 } 6035 6036 static void 6037 isp_parse_nvram_1080(struct ispsoftc *isp, int bus, u_int8_t *nvram_data) 6038 { 6039 sdparam *sdp = (sdparam *) isp->isp_param; 6040 int tgt; 6041 6042 sdp += bus; 6043 6044 sdp->isp_fifo_threshold = 6045 ISP1080_NVRAM_FIFO_THRESHOLD(nvram_data); 6046 6047 sdp->isp_initiator_id = 6048 ISP1080_NVRAM_INITIATOR_ID(nvram_data, bus); 6049 6050 sdp->isp_bus_reset_delay = 6051 ISP1080_NVRAM_BUS_RESET_DELAY(nvram_data, bus); 6052 6053 sdp->isp_retry_count = 6054 ISP1080_NVRAM_BUS_RETRY_COUNT(nvram_data, bus); 6055 6056 sdp->isp_retry_delay = 6057 ISP1080_NVRAM_BUS_RETRY_DELAY(nvram_data, bus); 6058 6059 sdp->isp_async_data_setup = 6060 ISP1080_NVRAM_ASYNC_DATA_SETUP_TIME(nvram_data, bus); 6061 6062 sdp->isp_req_ack_active_neg = 6063 ISP1080_NVRAM_REQ_ACK_ACTIVE_NEGATION(nvram_data, bus); 6064 6065 sdp->isp_data_line_active_neg = 6066 ISP1080_NVRAM_DATA_LINE_ACTIVE_NEGATION(nvram_data, bus); 6067 6068 sdp->isp_data_dma_burst_enabl = 6069 ISP1080_NVRAM_BURST_ENABLE(nvram_data); 6070 6071 sdp->isp_cmd_dma_burst_enable = 6072 ISP1080_NVRAM_BURST_ENABLE(nvram_data); 6073 6074 sdp->isp_selection_timeout = 6075 ISP1080_NVRAM_SELECTION_TIMEOUT(nvram_data, bus); 6076 6077 sdp->isp_max_queue_depth = 6078 ISP1080_NVRAM_MAX_QUEUE_DEPTH(nvram_data, bus); 6079 6080 isp_prt(isp, ISP_LOGDEBUG0, sc0, sc4, 6081 bus, sdp->isp_fifo_threshold, sdp->isp_initiator_id, 6082 sdp->isp_bus_reset_delay, sdp->isp_retry_count, 6083 sdp->isp_retry_delay, sdp->isp_async_data_setup); 6084 isp_prt(isp, ISP_LOGDEBUG0, sc1, sc4, 6085 sdp->isp_req_ack_active_neg, sdp->isp_data_line_active_neg, 6086 sdp->isp_data_dma_burst_enabl, sdp->isp_cmd_dma_burst_enable, 6087 sdp->isp_selection_timeout, sdp->isp_max_queue_depth); 6088 6089 6090 for (tgt = 0; tgt < MAX_TARGETS; tgt++) { 6091 sdp->isp_devparam[tgt].dev_enable = 6092 ISP1080_NVRAM_TGT_DEVICE_ENABLE(nvram_data, tgt, bus); 6093 sdp->isp_devparam[tgt].exc_throttle = 6094 ISP1080_NVRAM_TGT_EXEC_THROTTLE(nvram_data, tgt, bus); 6095 sdp->isp_devparam[tgt].nvrm_offset = 6096 ISP1080_NVRAM_TGT_SYNC_OFFSET(nvram_data, tgt, bus); 6097 sdp->isp_devparam[tgt].nvrm_period = 6098 ISP1080_NVRAM_TGT_SYNC_PERIOD(nvram_data, tgt, bus); 6099 sdp->isp_devparam[tgt].nvrm_flags = 0; 6100 if (ISP1080_NVRAM_TGT_RENEG(nvram_data, tgt, bus)) 6101 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_RENEG; 6102 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_ARQ; 6103 if (ISP1080_NVRAM_TGT_TQING(nvram_data, tgt, bus)) 6104 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_TQING; 6105 if (ISP1080_NVRAM_TGT_SYNC(nvram_data, tgt, bus)) 6106 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_SYNC; 6107 if (ISP1080_NVRAM_TGT_WIDE(nvram_data, tgt, bus)) 6108 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_WIDE; 6109 if (ISP1080_NVRAM_TGT_PARITY(nvram_data, tgt, bus)) 6110 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_PARITY; 6111 if (ISP1080_NVRAM_TGT_DISC(nvram_data, tgt, bus)) 6112 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_DISC; 6113 sdp->isp_devparam[tgt].actv_flags = 0; 6114 isp_prt(isp, ISP_LOGDEBUG0, sc2, sc4, 6115 bus, tgt, sdp->isp_devparam[tgt].nvrm_flags, 6116 sdp->isp_devparam[tgt].nvrm_offset, 6117 sdp->isp_devparam[tgt].nvrm_period); 6118 sdp->isp_devparam[tgt].goal_offset = 6119 sdp->isp_devparam[tgt].nvrm_offset; 6120 sdp->isp_devparam[tgt].goal_period = 6121 sdp->isp_devparam[tgt].nvrm_period; 6122 sdp->isp_devparam[tgt].goal_flags = 6123 sdp->isp_devparam[tgt].nvrm_flags; 6124 } 6125 } 6126 6127 static void 6128 isp_parse_nvram_12160(struct ispsoftc *isp, int bus, u_int8_t *nvram_data) 6129 { 6130 sdparam *sdp = (sdparam *) isp->isp_param; 6131 int tgt; 6132 6133 sdp += bus; 6134 6135 sdp->isp_fifo_threshold = 6136 ISP12160_NVRAM_FIFO_THRESHOLD(nvram_data); 6137 6138 sdp->isp_initiator_id = 6139 ISP12160_NVRAM_INITIATOR_ID(nvram_data, bus); 6140 6141 sdp->isp_bus_reset_delay = 6142 ISP12160_NVRAM_BUS_RESET_DELAY(nvram_data, bus); 6143 6144 sdp->isp_retry_count = 6145 ISP12160_NVRAM_BUS_RETRY_COUNT(nvram_data, bus); 6146 6147 sdp->isp_retry_delay = 6148 ISP12160_NVRAM_BUS_RETRY_DELAY(nvram_data, bus); 6149 6150 sdp->isp_async_data_setup = 6151 ISP12160_NVRAM_ASYNC_DATA_SETUP_TIME(nvram_data, bus); 6152 6153 sdp->isp_req_ack_active_neg = 6154 ISP12160_NVRAM_REQ_ACK_ACTIVE_NEGATION(nvram_data, bus); 6155 6156 sdp->isp_data_line_active_neg = 6157 ISP12160_NVRAM_DATA_LINE_ACTIVE_NEGATION(nvram_data, bus); 6158 6159 sdp->isp_data_dma_burst_enabl = 6160 ISP12160_NVRAM_BURST_ENABLE(nvram_data); 6161 6162 sdp->isp_cmd_dma_burst_enable = 6163 ISP12160_NVRAM_BURST_ENABLE(nvram_data); 6164 6165 sdp->isp_selection_timeout = 6166 ISP12160_NVRAM_SELECTION_TIMEOUT(nvram_data, bus); 6167 6168 sdp->isp_max_queue_depth = 6169 ISP12160_NVRAM_MAX_QUEUE_DEPTH(nvram_data, bus); 6170 6171 isp_prt(isp, ISP_LOGDEBUG0, sc0, sc4, 6172 bus, sdp->isp_fifo_threshold, sdp->isp_initiator_id, 6173 sdp->isp_bus_reset_delay, sdp->isp_retry_count, 6174 sdp->isp_retry_delay, sdp->isp_async_data_setup); 6175 isp_prt(isp, ISP_LOGDEBUG0, sc1, sc4, 6176 sdp->isp_req_ack_active_neg, sdp->isp_data_line_active_neg, 6177 sdp->isp_data_dma_burst_enabl, sdp->isp_cmd_dma_burst_enable, 6178 sdp->isp_selection_timeout, sdp->isp_max_queue_depth); 6179 6180 for (tgt = 0; tgt < MAX_TARGETS; tgt++) { 6181 sdp->isp_devparam[tgt].dev_enable = 6182 ISP12160_NVRAM_TGT_DEVICE_ENABLE(nvram_data, tgt, bus); 6183 sdp->isp_devparam[tgt].exc_throttle = 6184 ISP12160_NVRAM_TGT_EXEC_THROTTLE(nvram_data, tgt, bus); 6185 sdp->isp_devparam[tgt].nvrm_offset = 6186 ISP12160_NVRAM_TGT_SYNC_OFFSET(nvram_data, tgt, bus); 6187 sdp->isp_devparam[tgt].nvrm_period = 6188 ISP12160_NVRAM_TGT_SYNC_PERIOD(nvram_data, tgt, bus); 6189 sdp->isp_devparam[tgt].nvrm_flags = 0; 6190 if (ISP12160_NVRAM_TGT_RENEG(nvram_data, tgt, bus)) 6191 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_RENEG; 6192 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_ARQ; 6193 if (ISP12160_NVRAM_TGT_TQING(nvram_data, tgt, bus)) 6194 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_TQING; 6195 if (ISP12160_NVRAM_TGT_SYNC(nvram_data, tgt, bus)) 6196 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_SYNC; 6197 if (ISP12160_NVRAM_TGT_WIDE(nvram_data, tgt, bus)) 6198 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_WIDE; 6199 if (ISP12160_NVRAM_TGT_PARITY(nvram_data, tgt, bus)) 6200 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_PARITY; 6201 if (ISP12160_NVRAM_TGT_DISC(nvram_data, tgt, bus)) 6202 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_DISC; 6203 sdp->isp_devparam[tgt].actv_flags = 0; 6204 isp_prt(isp, ISP_LOGDEBUG0, sc2, sc4, 6205 bus, tgt, sdp->isp_devparam[tgt].nvrm_flags, 6206 sdp->isp_devparam[tgt].nvrm_offset, 6207 sdp->isp_devparam[tgt].nvrm_period); 6208 sdp->isp_devparam[tgt].goal_offset = 6209 sdp->isp_devparam[tgt].nvrm_offset; 6210 sdp->isp_devparam[tgt].goal_period = 6211 sdp->isp_devparam[tgt].nvrm_period; 6212 sdp->isp_devparam[tgt].goal_flags = 6213 sdp->isp_devparam[tgt].nvrm_flags; 6214 } 6215 } 6216 6217 static void 6218 isp_parse_nvram_2100(struct ispsoftc *isp, u_int8_t *nvram_data) 6219 { 6220 fcparam *fcp = (fcparam *) isp->isp_param; 6221 u_int64_t wwn; 6222 6223 /* 6224 * There is NVRAM storage for both Port and Node entities- 6225 * but the Node entity appears to be unused on all the cards 6226 * I can find. However, we should account for this being set 6227 * at some point in the future. 6228 * 6229 * Qlogic WWNs have an NAA of 2, but usually nothing shows up in 6230 * bits 48..60. In the case of the 2202, it appears that they do 6231 * use bit 48 to distinguish between the two instances on the card. 6232 * The 2204, which I've never seen, *probably* extends this method. 6233 */ 6234 wwn = ISP2100_NVRAM_PORT_NAME(nvram_data); 6235 if (wwn) { 6236 isp_prt(isp, ISP_LOGCONFIG, "NVRAM Port WWN 0x%08x%08x", 6237 (u_int32_t) (wwn >> 32), (u_int32_t) (wwn & 0xffffffff)); 6238 if ((wwn >> 60) == 0) { 6239 wwn |= (((u_int64_t) 2)<< 60); 6240 } 6241 } 6242 fcp->isp_portwwn = wwn; 6243 if (IS_2200(isp) || IS_23XX(isp)) { 6244 wwn = ISP2200_NVRAM_NODE_NAME(nvram_data); 6245 if (wwn) { 6246 isp_prt(isp, ISP_LOGCONFIG, "NVRAM Node WWN 0x%08x%08x", 6247 (u_int32_t) (wwn >> 32), 6248 (u_int32_t) (wwn & 0xffffffff)); 6249 if ((wwn >> 60) == 0) { 6250 wwn |= (((u_int64_t) 2)<< 60); 6251 } 6252 } 6253 } else { 6254 wwn &= ~((u_int64_t) 0xfff << 48); 6255 } 6256 fcp->isp_nodewwn = wwn; 6257 6258 /* 6259 * Make sure we have both Node and Port as non-zero values. 6260 */ 6261 if (fcp->isp_nodewwn != 0 && fcp->isp_portwwn == 0) { 6262 fcp->isp_portwwn = fcp->isp_nodewwn; 6263 } else if (fcp->isp_nodewwn == 0 && fcp->isp_portwwn != 0) { 6264 fcp->isp_nodewwn = fcp->isp_portwwn; 6265 } 6266 6267 /* 6268 * Make the Node and Port values sane if they're NAA == 2. 6269 * This means to clear bits 48..56 for the Node WWN and 6270 * make sure that there's some non-zero value in 48..56 6271 * for the Port WWN. 6272 */ 6273 if (fcp->isp_nodewwn && fcp->isp_portwwn) { 6274 if ((fcp->isp_nodewwn & (((u_int64_t) 0xfff) << 48)) != 0 && 6275 (fcp->isp_nodewwn >> 60) == 2) { 6276 fcp->isp_nodewwn &= ~((u_int64_t) 0xfff << 48); 6277 } 6278 if ((fcp->isp_portwwn & (((u_int64_t) 0xfff) << 48)) == 0 && 6279 (fcp->isp_portwwn >> 60) == 2) { 6280 fcp->isp_portwwn |= ((u_int64_t) 1 << 56); 6281 } 6282 } 6283 6284 fcp->isp_maxalloc = 6285 ISP2100_NVRAM_MAXIOCBALLOCATION(nvram_data); 6286 fcp->isp_maxfrmlen = 6287 ISP2100_NVRAM_MAXFRAMELENGTH(nvram_data); 6288 fcp->isp_retry_delay = 6289 ISP2100_NVRAM_RETRY_DELAY(nvram_data); 6290 fcp->isp_retry_count = 6291 ISP2100_NVRAM_RETRY_COUNT(nvram_data); 6292 fcp->isp_loopid = 6293 ISP2100_NVRAM_HARDLOOPID(nvram_data); 6294 fcp->isp_execthrottle = 6295 ISP2100_NVRAM_EXECUTION_THROTTLE(nvram_data); 6296 fcp->isp_fwoptions = ISP2100_NVRAM_OPTIONS(nvram_data); 6297 isp_prt(isp, ISP_LOGDEBUG0, 6298 "NVRAM: maxfrmlen %d execthrottle %d fwoptions 0x%x loopid %x", 6299 fcp->isp_maxfrmlen, fcp->isp_execthrottle, fcp->isp_fwoptions, 6300 fcp->isp_loopid); 6301 } 6302 6303 #ifdef ISP_FW_CRASH_DUMP 6304 static void isp2200_fw_dump(struct ispsoftc *); 6305 static void isp2300_fw_dump(struct ispsoftc *); 6306 6307 static void 6308 isp2200_fw_dump(struct ispsoftc *isp) 6309 { 6310 int i, j; 6311 mbreg_t mbs; 6312 u_int16_t *ptr; 6313 6314 ptr = FCPARAM(isp)->isp_dump_data; 6315 if (ptr == NULL) { 6316 isp_prt(isp, ISP_LOGERR, 6317 "No place to dump RISC registers and SRAM"); 6318 return; 6319 } 6320 if (*ptr++) { 6321 isp_prt(isp, ISP_LOGERR, 6322 "dump area for RISC registers and SRAM already used"); 6323 return; 6324 } 6325 ISP_WRITE(isp, HCCR, HCCR_CMD_PAUSE); 6326 for (i = 0; i < 100; i++) { 6327 USEC_DELAY(100); 6328 if (ISP_READ(isp, HCCR) & HCCR_PAUSE) { 6329 break; 6330 } 6331 } 6332 if (ISP_READ(isp, HCCR) & HCCR_PAUSE) { 6333 /* 6334 * PBIU Registers 6335 */ 6336 for (i = 0; i < 8; i++) { 6337 *ptr++ = ISP_READ(isp, BIU_BLOCK + (i << 1)); 6338 } 6339 6340 /* 6341 * Mailbox Registers 6342 */ 6343 for (i = 0; i < 8; i++) { 6344 *ptr++ = ISP_READ(isp, MBOX_BLOCK + (i << 1)); 6345 } 6346 6347 /* 6348 * DMA Registers 6349 */ 6350 for (i = 0; i < 48; i++) { 6351 *ptr++ = ISP_READ(isp, DMA_BLOCK + 0x20 + (i << 1)); 6352 } 6353 6354 /* 6355 * RISC H/W Registers 6356 */ 6357 ISP_WRITE(isp, BIU2100_CSR, 0); 6358 for (i = 0; i < 16; i++) { 6359 *ptr++ = ISP_READ(isp, BIU_BLOCK + 0xA0 + (i << 1)); 6360 } 6361 6362 /* 6363 * RISC GP Registers 6364 */ 6365 for (j = 0; j < 8; j++) { 6366 ISP_WRITE(isp, BIU_BLOCK + 0xA4, 0x2000 + (j << 8)); 6367 for (i = 0; i < 16; i++) { 6368 *ptr++ = 6369 ISP_READ(isp, BIU_BLOCK + 0x80 + (i << 1)); 6370 } 6371 } 6372 6373 /* 6374 * Frame Buffer Hardware Registers 6375 */ 6376 ISP_WRITE(isp, BIU2100_CSR, 0x10); 6377 for (i = 0; i < 16; i++) { 6378 *ptr++ = ISP_READ(isp, BIU_BLOCK + 0x80 + (i << 1)); 6379 } 6380 6381 /* 6382 * Fibre Protocol Module 0 Hardware Registers 6383 */ 6384 ISP_WRITE(isp, BIU2100_CSR, 0x20); 6385 for (i = 0; i < 64; i++) { 6386 *ptr++ = ISP_READ(isp, BIU_BLOCK + 0x80 + (i << 1)); 6387 } 6388 6389 /* 6390 * Fibre Protocol Module 1 Hardware Registers 6391 */ 6392 ISP_WRITE(isp, BIU2100_CSR, 0x30); 6393 for (i = 0; i < 64; i++) { 6394 *ptr++ = ISP_READ(isp, BIU_BLOCK + 0x80 + (i << 1)); 6395 } 6396 } else { 6397 isp_prt(isp, ISP_LOGERR, "RISC Would Not Pause"); 6398 return; 6399 } 6400 isp_prt(isp, ISP_LOGALL, 6401 "isp_fw_dump: RISC registers dumped successfully"); 6402 ISP_WRITE(isp, BIU2100_CSR, BIU2100_SOFT_RESET); 6403 for (i = 0; i < 100; i++) { 6404 USEC_DELAY(100); 6405 if (ISP_READ(isp, OUTMAILBOX0) == 0) { 6406 break; 6407 } 6408 } 6409 if (ISP_READ(isp, OUTMAILBOX0) != 0) { 6410 isp_prt(isp, ISP_LOGERR, "Board Would Not Reset"); 6411 return; 6412 } 6413 ISP_WRITE(isp, HCCR, HCCR_CMD_PAUSE); 6414 for (i = 0; i < 100; i++) { 6415 USEC_DELAY(100); 6416 if (ISP_READ(isp, HCCR) & HCCR_PAUSE) { 6417 break; 6418 } 6419 } 6420 if ((ISP_READ(isp, HCCR) & HCCR_PAUSE) == 0) { 6421 isp_prt(isp, ISP_LOGERR, "RISC Would Not Pause After Reset"); 6422 return; 6423 } 6424 ISP_WRITE(isp, RISC_EMB, 0xf2); 6425 ISP_WRITE(isp, HCCR, HCCR_CMD_RELEASE); 6426 for (i = 0; i < 100; i++) { 6427 USEC_DELAY(100); 6428 if ((ISP_READ(isp, HCCR) & HCCR_PAUSE) == 0) { 6429 break; 6430 } 6431 } 6432 ENABLE_INTS(isp); 6433 mbs.param[0] = MBOX_READ_RAM_WORD; 6434 mbs.param[1] = 0x1000; 6435 isp->isp_mbxworkp = (void *) ptr; 6436 isp->isp_mbxwrk0 = 0xefff; /* continuation count */ 6437 isp->isp_mbxwrk1 = 0x1001; /* next SRAM address */ 6438 isp_control(isp, ISPCTL_RUN_MBOXCMD, &mbs); 6439 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 6440 isp_prt(isp, ISP_LOGWARN, 6441 "RAM DUMP FAILED @ WORD %x", isp->isp_mbxwrk1); 6442 return; 6443 } 6444 ptr = isp->isp_mbxworkp; /* finish fetch of final word */ 6445 *ptr++ = isp->isp_mboxtmp[2]; 6446 isp_prt(isp, ISP_LOGALL, "isp_fw_dump: SRAM dumped succesfully"); 6447 FCPARAM(isp)->isp_dump_data[0] = isp->isp_type; /* now used */ 6448 } 6449 6450 static void 6451 isp2300_fw_dump(struct ispsoftc *isp) 6452 { 6453 int i, j; 6454 mbreg_t mbs; 6455 u_int16_t *ptr; 6456 6457 ptr = FCPARAM(isp)->isp_dump_data; 6458 if (ptr == NULL) { 6459 isp_prt(isp, ISP_LOGERR, 6460 "No place to dump RISC registers and SRAM"); 6461 return; 6462 } 6463 if (*ptr++) { 6464 isp_prt(isp, ISP_LOGERR, 6465 "dump area for RISC registers and SRAM already used"); 6466 return; 6467 } 6468 ISP_WRITE(isp, HCCR, HCCR_CMD_PAUSE); 6469 for (i = 0; i < 100; i++) { 6470 USEC_DELAY(100); 6471 if (ISP_READ(isp, HCCR) & HCCR_PAUSE) { 6472 break; 6473 } 6474 } 6475 if (ISP_READ(isp, HCCR) & HCCR_PAUSE) { 6476 /* 6477 * PBIU registers 6478 */ 6479 for (i = 0; i < 8; i++) { 6480 *ptr++ = ISP_READ(isp, BIU_BLOCK + (i << 1)); 6481 } 6482 6483 /* 6484 * ReqQ-RspQ-Risc2Host Status registers 6485 */ 6486 for (i = 0; i < 8; i++) { 6487 *ptr++ = ISP_READ(isp, BIU_BLOCK + 0x10 + (i << 1)); 6488 } 6489 6490 /* 6491 * Mailbox Registers 6492 */ 6493 for (i = 0; i < 32; i++) { 6494 *ptr++ = 6495 ISP_READ(isp, PCI_MBOX_REGS2300_OFF + (i << 1)); 6496 } 6497 6498 /* 6499 * Auto Request Response DMA registers 6500 */ 6501 ISP_WRITE(isp, BIU2100_CSR, 0x40); 6502 for (i = 0; i < 32; i++) { 6503 *ptr++ = ISP_READ(isp, BIU_BLOCK + 0x80 + (i << 1)); 6504 } 6505 6506 /* 6507 * DMA registers 6508 */ 6509 ISP_WRITE(isp, BIU2100_CSR, 0x50); 6510 for (i = 0; i < 48; i++) { 6511 *ptr++ = ISP_READ(isp, BIU_BLOCK + 0x80 + (i << 1)); 6512 } 6513 6514 /* 6515 * RISC hardware registers 6516 */ 6517 ISP_WRITE(isp, BIU2100_CSR, 0); 6518 for (i = 0; i < 16; i++) { 6519 *ptr++ = ISP_READ(isp, BIU_BLOCK + 0xA0 + (i << 1)); 6520 } 6521 6522 /* 6523 * RISC GP? registers 6524 */ 6525 for (j = 0; j < 8; j++) { 6526 ISP_WRITE(isp, BIU_BLOCK + 0xA4, 0x2000 + (j << 9)); 6527 for (i = 0; i < 16; i++) { 6528 *ptr++ = 6529 ISP_READ(isp, BIU_BLOCK + 0x80 + (i << 1)); 6530 } 6531 } 6532 6533 /* 6534 * frame buffer hardware registers 6535 */ 6536 ISP_WRITE(isp, BIU2100_CSR, 0x10); 6537 for (i = 0; i < 64; i++) { 6538 *ptr++ = ISP_READ(isp, BIU_BLOCK + 0x80 + (i << 1)); 6539 } 6540 6541 /* 6542 * FPM B0 hardware registers 6543 */ 6544 ISP_WRITE(isp, BIU2100_CSR, 0x20); 6545 for (i = 0; i < 64; i++) { 6546 *ptr++ = ISP_READ(isp, BIU_BLOCK + 0x80 + (i << 1)); 6547 } 6548 6549 /* 6550 * FPM B1 hardware registers 6551 */ 6552 ISP_WRITE(isp, BIU2100_CSR, 0x30); 6553 for (i = 0; i < 64; i++) { 6554 *ptr++ = ISP_READ(isp, BIU_BLOCK + 0x80 + (i << 1)); 6555 } 6556 } else { 6557 isp_prt(isp, ISP_LOGERR, "RISC Would Not Pause"); 6558 return; 6559 } 6560 isp_prt(isp, ISP_LOGALL, 6561 "isp_fw_dump: RISC registers dumped successfully"); 6562 ISP_WRITE(isp, BIU2100_CSR, BIU2100_SOFT_RESET); 6563 for (i = 0; i < 100; i++) { 6564 USEC_DELAY(100); 6565 if (ISP_READ(isp, OUTMAILBOX0) == 0) { 6566 break; 6567 } 6568 } 6569 if (ISP_READ(isp, OUTMAILBOX0) != 0) { 6570 isp_prt(isp, ISP_LOGERR, "Board Would Not Reset"); 6571 return; 6572 } 6573 ENABLE_INTS(isp); 6574 mbs.param[0] = MBOX_READ_RAM_WORD; 6575 mbs.param[1] = 0x800; 6576 isp->isp_mbxworkp = (void *) ptr; 6577 isp->isp_mbxwrk0 = 0xf7ff; /* continuation count */ 6578 isp->isp_mbxwrk1 = 0x801; /* next SRAM address */ 6579 isp_control(isp, ISPCTL_RUN_MBOXCMD, &mbs); 6580 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 6581 isp_prt(isp, ISP_LOGWARN, 6582 "RAM DUMP FAILED @ WORD %x", isp->isp_mbxwrk1); 6583 return; 6584 } 6585 ptr = isp->isp_mbxworkp; /* finish fetch of final word */ 6586 *ptr++ = isp->isp_mboxtmp[2]; 6587 6588 /* 6589 * We don't have access to mailbox registers 8.. onward 6590 * in our 'common' device model- so we have to set it 6591 * here and hope it stays the same! 6592 */ 6593 ISP_WRITE(isp, PCI_MBOX_REGS2300_OFF + (8 << 1), 0x1); 6594 6595 mbs.param[0] = MBOX_READ_RAM_WORD_EXTENDED; 6596 mbs.param[1] = 0; 6597 isp->isp_mbxworkp = (void *) ptr; 6598 isp->isp_mbxwrk0 = 0xffff; /* continuation count */ 6599 isp->isp_mbxwrk1 = 0x1; /* next SRAM address */ 6600 isp_control(isp, ISPCTL_RUN_MBOXCMD, &mbs); 6601 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 6602 isp_prt(isp, ISP_LOGWARN, 6603 "RAM DUMP FAILED @ WORD %x", 0x10000 + isp->isp_mbxwrk1); 6604 return; 6605 } 6606 ptr = isp->isp_mbxworkp; /* finish final word */ 6607 *ptr++ = mbs.param[2]; 6608 isp_prt(isp, ISP_LOGALL, "isp_fw_dump: SRAM dumped succesfully"); 6609 FCPARAM(isp)->isp_dump_data[0] = isp->isp_type; /* now used */ 6610 } 6611 6612 void 6613 isp_fw_dump(struct ispsoftc *isp) 6614 { 6615 if (IS_2200(isp)) 6616 isp2200_fw_dump(isp); 6617 else if (IS_23XX(isp)) 6618 isp2300_fw_dump(isp); 6619 } 6620 #endif 6621