1 /* $FreeBSD$ */ 2 /* 3 * Machine and OS Independent (well, as best as possible) 4 * code for the Qlogic ISP SCSI adapters. 5 * 6 * Copyright (c) 1997, 1998, 1999, 2000 by Matthew Jacob 7 * Feral Software 8 * All rights reserved. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice immediately at the beginning of the file, without modification, 15 * this list of conditions, and the following disclaimer. 16 * 2. The name of the author may not be used to endorse or promote products 17 * derived from this software without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR 23 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 * SUCH DAMAGE. 30 */ 31 32 /* 33 * Inspiration and ideas about this driver are from Erik Moe's Linux driver 34 * (qlogicisp.c) and Dave Miller's SBus version of same (qlogicisp.c). Some 35 * ideas dredged from the Solaris driver. 36 */ 37 38 /* 39 * Include header file appropriate for platform we're building on. 40 */ 41 42 #ifdef __NetBSD__ 43 #include <dev/ic/isp_netbsd.h> 44 #endif 45 #ifdef __FreeBSD__ 46 #include <dev/isp/isp_freebsd.h> 47 #endif 48 #ifdef __OpenBSD__ 49 #include <dev/ic/isp_openbsd.h> 50 #endif 51 #ifdef __linux__ 52 #include "isp_linux.h" 53 #endif 54 #ifdef __svr4__ 55 #include "isp_solaris.h" 56 #endif 57 58 /* 59 * General defines 60 */ 61 62 #define MBOX_DELAY_COUNT 1000000 / 100 63 64 /* 65 * Local static data 66 */ 67 static const char warnlun[] = 68 "WARNING- cannot determine Expanded LUN capability- limiting to one LUN"; 69 static const char portshift[] = 70 "Target %d Loop ID 0x%x (Port 0x%x) => Loop 0x%x (Port 0x%x)"; 71 static const char portdup[] = 72 "Target %d duplicates Target %d- killing off both"; 73 static const char retained[] = 74 "Retaining Loop ID 0x%x for Target %d (Port 0x%x)"; 75 #ifdef ISP2100_FABRIC 76 static const char lretained[] = 77 "Retained login of Target %d (Loop ID 0x%x) Port 0x%x"; 78 static const char plogout[] = 79 "Logging out Target %d at Loop ID 0x%x (Port 0x%x)"; 80 static const char plogierr[] = 81 "Command Error in PLOGI for Port 0x%x (0x%x)"; 82 static const char nopdb[] = 83 "Could not get PDB for Device @ Port 0x%x"; 84 static const char pdbmfail1[] = 85 "PDB Loop ID info for Device @ Port 0x%x does not match up (0x%x)"; 86 static const char pdbmfail2[] = 87 "PDB Port info for Device @ Port 0x%x does not match up (0x%x)"; 88 static const char ldumped[] = 89 "Target %d (Loop ID 0x%x) Port 0x%x dumped after login info mismatch"; 90 #endif 91 static const char notresp[] = 92 "Not RESPONSE in RESPONSE Queue (type 0x%x) @ idx %d (next %d) nlooked %d"; 93 static const char xact1[] = 94 "HBA attempted queued transaction with disconnect not set for %d.%d.%d"; 95 static const char xact2[] = 96 "HBA attempted queued transaction to target routine %d on target %d bus %d"; 97 static const char xact3[] = 98 "HBA attempted queued cmd for %d.%d.%d when queueing disabled"; 99 static const char pskip[] = 100 "SCSI phase skipped for target %d.%d.%d"; 101 static const char topology[] = 102 "Loop ID %d, AL_PA 0x%x, Port ID 0x%x, Loop State 0x%x, Topology '%s'"; 103 static const char finmsg[] = 104 "(%d.%d.%d): FIN dl%d resid%d STS 0x%x SKEY %c XS_ERR=0x%x"; 105 /* 106 * Local function prototypes. 107 */ 108 static int isp_parse_async __P((struct ispsoftc *, int)); 109 static int isp_handle_other_response 110 __P((struct ispsoftc *, ispstatusreq_t *, u_int16_t *)); 111 static void isp_parse_status 112 __P((struct ispsoftc *, ispstatusreq_t *, XS_T *)); 113 static void isp_fastpost_complete __P((struct ispsoftc *, u_int32_t)); 114 static void isp_scsi_init __P((struct ispsoftc *)); 115 static void isp_scsi_channel_init __P((struct ispsoftc *, int)); 116 static void isp_fibre_init __P((struct ispsoftc *)); 117 static void isp_mark_getpdb_all __P((struct ispsoftc *)); 118 static int isp_getpdb __P((struct ispsoftc *, int, isp_pdb_t *)); 119 static u_int64_t isp_get_portname __P((struct ispsoftc *, int, int)); 120 static int isp_fclink_test __P((struct ispsoftc *, int)); 121 static char *isp2100_fw_statename __P((int)); 122 static int isp_same_lportdb __P((struct lportdb *, struct lportdb *)); 123 static int isp_pdb_sync __P((struct ispsoftc *, int)); 124 #ifdef ISP2100_FABRIC 125 static int isp_scan_fabric __P((struct ispsoftc *)); 126 static void isp_register_fc4_type __P((struct ispsoftc *)); 127 #endif 128 static void isp_fw_state __P((struct ispsoftc *)); 129 static void isp_mboxcmd __P((struct ispsoftc *, mbreg_t *, int)); 130 131 static void isp_update __P((struct ispsoftc *)); 132 static void isp_update_bus __P((struct ispsoftc *, int)); 133 static void isp_setdfltparm __P((struct ispsoftc *, int)); 134 static int isp_read_nvram __P((struct ispsoftc *)); 135 static void isp_rdnvram_word __P((struct ispsoftc *, int, u_int16_t *)); 136 static void isp_parse_nvram_1020 __P((struct ispsoftc *, u_int8_t *)); 137 static void isp_parse_nvram_1080 __P((struct ispsoftc *, int, u_int8_t *)); 138 static void isp_parse_nvram_12160 __P((struct ispsoftc *, int, u_int8_t *)); 139 static void isp_parse_nvram_2100 __P((struct ispsoftc *, u_int8_t *)); 140 141 /* 142 * Reset Hardware. 143 * 144 * Hit the chip over the head, download new f/w if available and set it running. 145 * 146 * Locking done elsewhere. 147 */ 148 void 149 isp_reset(isp) 150 struct ispsoftc *isp; 151 { 152 mbreg_t mbs; 153 int loops, i, touched, dodnld = 1; 154 char *revname = "????"; 155 156 isp->isp_state = ISP_NILSTATE; 157 158 159 /* 160 * Basic types (SCSI, FibreChannel and PCI or SBus) 161 * have been set in the MD code. We figure out more 162 * here. 163 * 164 * After we've fired this chip up, zero out the conf1 register 165 * for SCSI adapters and do other settings for the 2100. 166 */ 167 168 /* 169 * Get the current running firmware revision out of the 170 * chip before we hit it over the head (if this is our 171 * first time through). Note that we store this as the 172 * 'ROM' firmware revision- which it may not be. In any 173 * case, we don't really use this yet, but we may in 174 * the future. 175 */ 176 if ((touched = isp->isp_touched) == 0) { 177 /* 178 * First see whether or not we're sitting in the ISP PROM. 179 * If we've just been reset, we'll have the string "ISP " 180 * spread through outgoing mailbox registers 1-3. 181 */ 182 if (ISP_READ(isp, OUTMAILBOX1) != 0x4953 || 183 ISP_READ(isp, OUTMAILBOX2) != 0x5020 || 184 ISP_READ(isp, OUTMAILBOX3) != 0x2020) { 185 /* 186 * Just in case it was paused... 187 */ 188 ISP_WRITE(isp, HCCR, HCCR_CMD_RELEASE); 189 mbs.param[0] = MBOX_ABOUT_FIRMWARE; 190 isp_mboxcmd(isp, &mbs, MBOX_COMMAND_ERROR); 191 /* 192 * This *shouldn't* fail..... 193 */ 194 if (mbs.param[0] == MBOX_COMMAND_COMPLETE) { 195 isp->isp_romfw_rev[0] = mbs.param[1]; 196 isp->isp_romfw_rev[1] = mbs.param[2]; 197 isp->isp_romfw_rev[2] = mbs.param[3]; 198 } 199 } 200 isp->isp_touched = 1; 201 } 202 203 DISABLE_INTS(isp); 204 205 /* 206 * Put the board into PAUSE mode (so we can read the SXP registers). 207 */ 208 ISP_WRITE(isp, HCCR, HCCR_CMD_PAUSE); 209 210 if (IS_FC(isp)) { 211 switch (isp->isp_type) { 212 case ISP_HA_FC_2100: 213 revname = "2100"; 214 break; 215 case ISP_HA_FC_2200: 216 revname = "2200"; 217 break; 218 default: 219 break; 220 } 221 } else if (IS_1240(isp)) { 222 sdparam *sdp = isp->isp_param; 223 revname = "1240"; 224 isp->isp_clock = 60; 225 sdp->isp_ultramode = 1; 226 sdp++; 227 sdp->isp_ultramode = 1; 228 /* 229 * XXX: Should probably do some bus sensing. 230 */ 231 } else if (IS_ULTRA2(isp)) { 232 static const char m[] = "bus %d is in %s Mode"; 233 u_int16_t l; 234 sdparam *sdp = isp->isp_param; 235 236 isp->isp_clock = 100; 237 238 if (IS_1280(isp)) 239 revname = "1280"; 240 else if (IS_1080(isp)) 241 revname = "1080"; 242 else if (IS_12160(isp)) 243 revname = "12160"; 244 else 245 revname = "<UNKLVD>"; 246 247 l = ISP_READ(isp, SXP_PINS_DIFF) & ISP1080_MODE_MASK; 248 switch (l) { 249 case ISP1080_LVD_MODE: 250 sdp->isp_lvdmode = 1; 251 isp_prt(isp, ISP_LOGCONFIG, m, 0, "LVD"); 252 break; 253 case ISP1080_HVD_MODE: 254 sdp->isp_diffmode = 1; 255 isp_prt(isp, ISP_LOGCONFIG, m, 0, "Differential"); 256 break; 257 case ISP1080_SE_MODE: 258 sdp->isp_ultramode = 1; 259 isp_prt(isp, ISP_LOGCONFIG, m, 0, "Single-Ended"); 260 break; 261 default: 262 isp_prt(isp, ISP_LOGERR, 263 "unknown mode on bus %d (0x%x)", 0, l); 264 break; 265 } 266 267 if (IS_DUALBUS(isp)) { 268 sdp++; 269 l = ISP_READ(isp, SXP_PINS_DIFF|SXP_BANK1_SELECT); 270 l &= ISP1080_MODE_MASK; 271 switch(l) { 272 case ISP1080_LVD_MODE: 273 sdp->isp_lvdmode = 1; 274 isp_prt(isp, ISP_LOGCONFIG, m, 1, "LVD"); 275 break; 276 case ISP1080_HVD_MODE: 277 sdp->isp_diffmode = 1; 278 isp_prt(isp, ISP_LOGCONFIG, 279 m, 1, "Differential"); 280 break; 281 case ISP1080_SE_MODE: 282 sdp->isp_ultramode = 1; 283 isp_prt(isp, ISP_LOGCONFIG, 284 m, 1, "Single-Ended"); 285 break; 286 default: 287 isp_prt(isp, ISP_LOGERR, 288 "unknown mode on bus %d (0x%x)", 1, l); 289 break; 290 } 291 } 292 } else { 293 sdparam *sdp = isp->isp_param; 294 i = ISP_READ(isp, BIU_CONF0) & BIU_CONF0_HW_MASK; 295 switch (i) { 296 default: 297 isp_prt(isp, ISP_LOGALL, "Unknown Chip Type 0x%x", i); 298 /* FALLTHROUGH */ 299 case 1: 300 revname = "1020"; 301 isp->isp_type = ISP_HA_SCSI_1020; 302 isp->isp_clock = 40; 303 break; 304 case 2: 305 /* 306 * Some 1020A chips are Ultra Capable, but don't 307 * run the clock rate up for that unless told to 308 * do so by the Ultra Capable bits being set. 309 */ 310 revname = "1020A"; 311 isp->isp_type = ISP_HA_SCSI_1020A; 312 isp->isp_clock = 40; 313 break; 314 case 3: 315 revname = "1040"; 316 isp->isp_type = ISP_HA_SCSI_1040; 317 isp->isp_clock = 60; 318 break; 319 case 4: 320 revname = "1040A"; 321 isp->isp_type = ISP_HA_SCSI_1040A; 322 isp->isp_clock = 60; 323 break; 324 case 5: 325 revname = "1040B"; 326 isp->isp_type = ISP_HA_SCSI_1040B; 327 isp->isp_clock = 60; 328 break; 329 case 6: 330 revname = "1040C"; 331 isp->isp_type = ISP_HA_SCSI_1040C; 332 isp->isp_clock = 60; 333 break; 334 } 335 /* 336 * Now, while we're at it, gather info about ultra 337 * and/or differential mode. 338 */ 339 if (ISP_READ(isp, SXP_PINS_DIFF) & SXP_PINS_DIFF_MODE) { 340 isp_prt(isp, ISP_LOGCONFIG, "Differential Mode"); 341 sdp->isp_diffmode = 1; 342 } else { 343 sdp->isp_diffmode = 0; 344 } 345 i = ISP_READ(isp, RISC_PSR); 346 if (isp->isp_bustype == ISP_BT_SBUS) { 347 i &= RISC_PSR_SBUS_ULTRA; 348 } else { 349 i &= RISC_PSR_PCI_ULTRA; 350 } 351 if (i != 0) { 352 isp_prt(isp, ISP_LOGCONFIG, "Ultra Mode Capable"); 353 sdp->isp_ultramode = 1; 354 /* 355 * If we're in Ultra Mode, we have to be 60Mhz clock- 356 * even for the SBus version. 357 */ 358 isp->isp_clock = 60; 359 } else { 360 sdp->isp_ultramode = 0; 361 /* 362 * Clock is known. Gronk. 363 */ 364 } 365 366 /* 367 * Machine dependent clock (if set) overrides 368 * our generic determinations. 369 */ 370 if (isp->isp_mdvec->dv_clock) { 371 if (isp->isp_mdvec->dv_clock < isp->isp_clock) { 372 isp->isp_clock = isp->isp_mdvec->dv_clock; 373 } 374 } 375 376 } 377 378 /* 379 * Clear instrumentation 380 */ 381 isp->isp_intcnt = isp->isp_intbogus = 0; 382 383 /* 384 * Do MD specific pre initialization 385 */ 386 ISP_RESET0(isp); 387 388 again: 389 390 /* 391 * Hit the chip over the head with hammer, 392 * and give the ISP a chance to recover. 393 */ 394 395 if (IS_SCSI(isp)) { 396 ISP_WRITE(isp, BIU_ICR, BIU_ICR_SOFT_RESET); 397 /* 398 * A slight delay... 399 */ 400 USEC_DELAY(100); 401 402 /* 403 * Clear data && control DMA engines. 404 */ 405 ISP_WRITE(isp, CDMA_CONTROL, 406 DMA_CNTRL_CLEAR_CHAN | DMA_CNTRL_RESET_INT); 407 ISP_WRITE(isp, DDMA_CONTROL, 408 DMA_CNTRL_CLEAR_CHAN | DMA_CNTRL_RESET_INT); 409 410 411 } else { 412 ISP_WRITE(isp, BIU2100_CSR, BIU2100_SOFT_RESET); 413 /* 414 * A slight delay... 415 */ 416 USEC_DELAY(100); 417 418 /* 419 * Clear data && control DMA engines. 420 */ 421 ISP_WRITE(isp, CDMA2100_CONTROL, 422 DMA_CNTRL2100_CLEAR_CHAN | DMA_CNTRL2100_RESET_INT); 423 ISP_WRITE(isp, TDMA2100_CONTROL, 424 DMA_CNTRL2100_CLEAR_CHAN | DMA_CNTRL2100_RESET_INT); 425 ISP_WRITE(isp, RDMA2100_CONTROL, 426 DMA_CNTRL2100_CLEAR_CHAN | DMA_CNTRL2100_RESET_INT); 427 } 428 429 /* 430 * Wait for ISP to be ready to go... 431 */ 432 loops = MBOX_DELAY_COUNT; 433 for (;;) { 434 if (IS_SCSI(isp)) { 435 if (!(ISP_READ(isp, BIU_ICR) & BIU_ICR_SOFT_RESET)) 436 break; 437 } else { 438 if (!(ISP_READ(isp, BIU2100_CSR) & BIU2100_SOFT_RESET)) 439 break; 440 } 441 USEC_DELAY(100); 442 if (--loops < 0) { 443 ISP_DUMPREGS(isp, "chip reset timed out"); 444 return; 445 } 446 } 447 448 /* 449 * After we've fired this chip up, zero out the conf1 register 450 * for SCSI adapters and other settings for the 2100. 451 */ 452 453 if (IS_SCSI(isp)) { 454 ISP_WRITE(isp, BIU_CONF1, 0); 455 } else { 456 ISP_WRITE(isp, BIU2100_CSR, 0); 457 } 458 459 /* 460 * Reset RISC Processor 461 */ 462 ISP_WRITE(isp, HCCR, HCCR_CMD_RESET); 463 USEC_DELAY(100); 464 465 /* 466 * Establish some initial burst rate stuff. 467 * (only for the 1XX0 boards). This really should 468 * be done later after fetching from NVRAM. 469 */ 470 if (IS_SCSI(isp)) { 471 u_int16_t tmp = isp->isp_mdvec->dv_conf1; 472 /* 473 * Busted FIFO. Turn off all but burst enables. 474 */ 475 if (isp->isp_type == ISP_HA_SCSI_1040A) { 476 tmp &= BIU_BURST_ENABLE; 477 } 478 ISP_SETBITS(isp, BIU_CONF1, tmp); 479 if (tmp & BIU_BURST_ENABLE) { 480 ISP_SETBITS(isp, CDMA_CONF, DMA_ENABLE_BURST); 481 ISP_SETBITS(isp, DDMA_CONF, DMA_ENABLE_BURST); 482 } 483 #ifdef PTI_CARDS 484 if (((sdparam *) isp->isp_param)->isp_ultramode) { 485 while (ISP_READ(isp, RISC_MTR) != 0x1313) { 486 ISP_WRITE(isp, RISC_MTR, 0x1313); 487 ISP_WRITE(isp, HCCR, HCCR_CMD_STEP); 488 } 489 } else { 490 ISP_WRITE(isp, RISC_MTR, 0x1212); 491 } 492 /* 493 * PTI specific register 494 */ 495 ISP_WRITE(isp, RISC_EMB, DUAL_BANK) 496 #else 497 ISP_WRITE(isp, RISC_MTR, 0x1212); 498 #endif 499 } else { 500 ISP_WRITE(isp, RISC_MTR2100, 0x1212); 501 } 502 503 ISP_WRITE(isp, HCCR, HCCR_CMD_RELEASE); /* release paused processor */ 504 505 /* 506 * Do MD specific post initialization 507 */ 508 ISP_RESET1(isp); 509 510 /* 511 * Wait for everything to finish firing up... 512 */ 513 loops = MBOX_DELAY_COUNT; 514 while (ISP_READ(isp, OUTMAILBOX0) == MBOX_BUSY) { 515 USEC_DELAY(100); 516 if (--loops < 0) { 517 isp_prt(isp, ISP_LOGERR, 518 "MBOX_BUSY never cleared on reset"); 519 return; 520 } 521 } 522 523 /* 524 * Up until this point we've done everything by just reading or 525 * setting registers. From this point on we rely on at least *some* 526 * kind of firmware running in the card. 527 */ 528 529 /* 530 * Do some sanity checking. 531 */ 532 mbs.param[0] = MBOX_NO_OP; 533 isp_mboxcmd(isp, &mbs, MBLOGALL); 534 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 535 return; 536 } 537 538 if (IS_SCSI(isp)) { 539 mbs.param[0] = MBOX_MAILBOX_REG_TEST; 540 mbs.param[1] = 0xdead; 541 mbs.param[2] = 0xbeef; 542 mbs.param[3] = 0xffff; 543 mbs.param[4] = 0x1111; 544 mbs.param[5] = 0xa5a5; 545 isp_mboxcmd(isp, &mbs, MBLOGALL); 546 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 547 return; 548 } 549 if (mbs.param[1] != 0xdead || mbs.param[2] != 0xbeef || 550 mbs.param[3] != 0xffff || mbs.param[4] != 0x1111 || 551 mbs.param[5] != 0xa5a5) { 552 isp_prt(isp, ISP_LOGERR, 553 "Register Test Failed (0x%x 0x%x 0x%x 0x%x 0x%x)", 554 mbs.param[1], mbs.param[2], mbs.param[3], 555 mbs.param[4], mbs.param[5]); 556 return; 557 } 558 559 } 560 561 /* 562 * Download new Firmware, unless requested not to do so. 563 * This is made slightly trickier in some cases where the 564 * firmware of the ROM revision is newer than the revision 565 * compiled into the driver. So, where we used to compare 566 * versions of our f/w and the ROM f/w, now we just see 567 * whether we have f/w at all and whether a config flag 568 * has disabled our download. 569 */ 570 if ((isp->isp_mdvec->dv_ispfw == NULL) || 571 (isp->isp_confopts & ISP_CFG_NORELOAD)) { 572 dodnld = 0; 573 } 574 575 if (dodnld) { 576 u_int16_t fwlen = isp->isp_mdvec->dv_ispfw[3]; 577 for (i = 0; i < fwlen; i++) { 578 mbs.param[0] = MBOX_WRITE_RAM_WORD; 579 mbs.param[1] = ISP_CODE_ORG + i; 580 mbs.param[2] = isp->isp_mdvec->dv_ispfw[i]; 581 isp_mboxcmd(isp, &mbs, MBLOGNONE); 582 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 583 isp_prt(isp, ISP_LOGERR, 584 "F/W download failed at word %d", i); 585 dodnld = 0; 586 goto again; 587 } 588 } 589 590 /* 591 * Verify that it downloaded correctly. 592 */ 593 mbs.param[0] = MBOX_VERIFY_CHECKSUM; 594 mbs.param[1] = ISP_CODE_ORG; 595 isp_mboxcmd(isp, &mbs, MBLOGNONE); 596 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 597 isp_prt(isp, ISP_LOGERR, "Ram Checksum Failure"); 598 return; 599 } 600 isp->isp_loaded_fw = 1; 601 } else { 602 isp->isp_loaded_fw = 0; 603 isp_prt(isp, ISP_LOGDEBUG2, "skipping f/w download"); 604 } 605 606 /* 607 * Now start it rolling. 608 * 609 * If we didn't actually download f/w, 610 * we still need to (re)start it. 611 */ 612 613 mbs.param[0] = MBOX_EXEC_FIRMWARE; 614 mbs.param[1] = ISP_CODE_ORG; 615 isp_mboxcmd(isp, &mbs, MBLOGNONE); 616 /* give it a chance to start */ 617 USEC_SLEEP(isp, 500); 618 619 if (IS_SCSI(isp)) { 620 /* 621 * Set CLOCK RATE, but only if asked to. 622 */ 623 if (isp->isp_clock) { 624 mbs.param[0] = MBOX_SET_CLOCK_RATE; 625 mbs.param[1] = isp->isp_clock; 626 isp_mboxcmd(isp, &mbs, MBLOGALL); 627 /* we will try not to care if this fails */ 628 } 629 } 630 631 mbs.param[0] = MBOX_ABOUT_FIRMWARE; 632 isp_mboxcmd(isp, &mbs, MBLOGALL); 633 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 634 return; 635 } 636 isp_prt(isp, ISP_LOGCONFIG, 637 "Board Revision %s, %s F/W Revision %d.%d.%d", revname, 638 dodnld? "loaded" : "resident", mbs.param[1], mbs.param[2], 639 mbs.param[3]); 640 if (IS_FC(isp)) { 641 if (ISP_READ(isp, BIU2100_CSR) & BIU2100_PCI64) { 642 isp_prt(isp, ISP_LOGCONFIG, 643 "Installed in 64-Bit PCI slot"); 644 } 645 } 646 647 isp->isp_fwrev[0] = mbs.param[1]; 648 isp->isp_fwrev[1] = mbs.param[2]; 649 isp->isp_fwrev[2] = mbs.param[3]; 650 if (isp->isp_romfw_rev[0] || isp->isp_romfw_rev[1] || 651 isp->isp_romfw_rev[2]) { 652 isp_prt(isp, ISP_LOGCONFIG, "Last F/W revision was %d.%d.%d", 653 isp->isp_romfw_rev[0], isp->isp_romfw_rev[1], 654 isp->isp_romfw_rev[2]); 655 } 656 657 mbs.param[0] = MBOX_GET_FIRMWARE_STATUS; 658 isp_mboxcmd(isp, &mbs, MBLOGALL); 659 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 660 return; 661 } 662 isp->isp_maxcmds = mbs.param[2]; 663 isp_prt(isp, ISP_LOGINFO, 664 "%d max I/O commands supported", mbs.param[2]); 665 isp_fw_state(isp); 666 667 /* 668 * Set up DMA for the request and result mailboxes. 669 */ 670 if (ISP_MBOXDMASETUP(isp) != 0) { 671 isp_prt(isp, ISP_LOGERR, "Cannot setup DMA"); 672 return; 673 } 674 isp->isp_state = ISP_RESETSTATE; 675 676 /* 677 * Okay- now that we have new firmware running, we now (re)set our 678 * notion of how many luns we support. This is somewhat tricky because 679 * if we haven't loaded firmware, we don't have an easy way of telling 680 * how many luns we support. 681 * 682 * We'll make a simplifying assumption- if we loaded firmware, we 683 * are running with expanded lun firmware, otherwise not. 684 * 685 * Expanded lun firmware gives you 32 luns for SCSI cards and 686 * 65536 luns for Fibre Channel cards. 687 * 688 * Because the lun is in a a different position in the Request Queue 689 * Entry structure for Fibre Channel with expanded lun firmware, we 690 * can only support one lun (lun zero) when we don't know what kind 691 * of firmware we're running. 692 * 693 * Note that we only do this once (the first time thru isp_reset) 694 * because we may be called again after firmware has been loaded once 695 * and released. 696 */ 697 if (touched == 0) { 698 if (dodnld) { 699 if (IS_SCSI(isp)) { 700 isp->isp_maxluns = 32; 701 } else { 702 isp->isp_maxluns = 65536; 703 } 704 } else { 705 if (IS_SCSI(isp)) { 706 isp->isp_maxluns = 8; 707 } else { 708 isp_prt(isp, ISP_LOGALL, warnlun); 709 isp->isp_maxluns = 1; 710 } 711 } 712 } 713 } 714 715 /* 716 * Initialize Parameters of Hardware to a known state. 717 * 718 * Locks are held before coming here. 719 */ 720 721 void 722 isp_init(isp) 723 struct ispsoftc *isp; 724 { 725 /* 726 * Must do this first to get defaults established. 727 */ 728 isp_setdfltparm(isp, 0); 729 if (IS_DUALBUS(isp)) { 730 isp_setdfltparm(isp, 1); 731 } 732 if ((isp->isp_confopts & ISP_CFG_NOINIT) == 0) { 733 if (IS_FC(isp)) { 734 isp_fibre_init(isp); 735 } else { 736 isp_scsi_init(isp); 737 } 738 } 739 } 740 741 static void 742 isp_scsi_init(isp) 743 struct ispsoftc *isp; 744 { 745 sdparam *sdp_chan0, *sdp_chan1; 746 mbreg_t mbs; 747 748 sdp_chan0 = isp->isp_param; 749 sdp_chan1 = sdp_chan0; 750 if (IS_DUALBUS(isp)) { 751 sdp_chan1++; 752 } 753 754 /* First do overall per-card settings. */ 755 756 /* 757 * If we have fast memory timing enabled, turn it on. 758 */ 759 if (sdp_chan0->isp_fast_mttr) { 760 ISP_WRITE(isp, RISC_MTR, 0x1313); 761 } 762 763 /* 764 * Set Retry Delay and Count. 765 * You set both channels at the same time. 766 */ 767 mbs.param[0] = MBOX_SET_RETRY_COUNT; 768 mbs.param[1] = sdp_chan0->isp_retry_count; 769 mbs.param[2] = sdp_chan0->isp_retry_delay; 770 mbs.param[6] = sdp_chan1->isp_retry_count; 771 mbs.param[7] = sdp_chan1->isp_retry_delay; 772 773 isp_mboxcmd(isp, &mbs, MBLOGALL); 774 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 775 return; 776 } 777 778 /* 779 * Set ASYNC DATA SETUP time. This is very important. 780 */ 781 mbs.param[0] = MBOX_SET_ASYNC_DATA_SETUP_TIME; 782 mbs.param[1] = sdp_chan0->isp_async_data_setup; 783 mbs.param[2] = sdp_chan1->isp_async_data_setup; 784 isp_mboxcmd(isp, &mbs, MBLOGALL); 785 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 786 return; 787 } 788 789 /* 790 * Set ACTIVE Negation State. 791 */ 792 mbs.param[0] = MBOX_SET_ACT_NEG_STATE; 793 mbs.param[1] = 794 (sdp_chan0->isp_req_ack_active_neg << 4) | 795 (sdp_chan0->isp_data_line_active_neg << 5); 796 mbs.param[2] = 797 (sdp_chan1->isp_req_ack_active_neg << 4) | 798 (sdp_chan1->isp_data_line_active_neg << 5); 799 800 isp_mboxcmd(isp, &mbs, MBLOGNONE); 801 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 802 isp_prt(isp, ISP_LOGERR, 803 "failed to set active negation state (%d,%d), (%d,%d)", 804 sdp_chan0->isp_req_ack_active_neg, 805 sdp_chan0->isp_data_line_active_neg, 806 sdp_chan1->isp_req_ack_active_neg, 807 sdp_chan1->isp_data_line_active_neg); 808 /* 809 * But don't return. 810 */ 811 } 812 813 /* 814 * Set the Tag Aging limit 815 */ 816 mbs.param[0] = MBOX_SET_TAG_AGE_LIMIT; 817 mbs.param[1] = sdp_chan0->isp_tag_aging; 818 mbs.param[2] = sdp_chan1->isp_tag_aging; 819 isp_mboxcmd(isp, &mbs, MBLOGALL); 820 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 821 isp_prt(isp, ISP_LOGERR, "failed to set tag age limit (%d,%d)", 822 sdp_chan0->isp_tag_aging, sdp_chan1->isp_tag_aging); 823 return; 824 } 825 826 /* 827 * Set selection timeout. 828 */ 829 mbs.param[0] = MBOX_SET_SELECT_TIMEOUT; 830 mbs.param[1] = sdp_chan0->isp_selection_timeout; 831 mbs.param[2] = sdp_chan1->isp_selection_timeout; 832 isp_mboxcmd(isp, &mbs, MBLOGALL); 833 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 834 return; 835 } 836 837 /* now do per-channel settings */ 838 isp_scsi_channel_init(isp, 0); 839 if (IS_DUALBUS(isp)) 840 isp_scsi_channel_init(isp, 1); 841 842 /* 843 * Now enable request/response queues 844 */ 845 846 mbs.param[0] = MBOX_INIT_RES_QUEUE; 847 mbs.param[1] = RESULT_QUEUE_LEN(isp); 848 mbs.param[2] = DMA_MSW(isp->isp_result_dma); 849 mbs.param[3] = DMA_LSW(isp->isp_result_dma); 850 mbs.param[4] = 0; 851 mbs.param[5] = 0; 852 isp_mboxcmd(isp, &mbs, MBLOGALL); 853 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 854 return; 855 } 856 isp->isp_residx = mbs.param[5]; 857 858 mbs.param[0] = MBOX_INIT_REQ_QUEUE; 859 mbs.param[1] = RQUEST_QUEUE_LEN(isp); 860 mbs.param[2] = DMA_MSW(isp->isp_rquest_dma); 861 mbs.param[3] = DMA_LSW(isp->isp_rquest_dma); 862 mbs.param[4] = 0; 863 isp_mboxcmd(isp, &mbs, MBLOGALL); 864 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 865 return; 866 } 867 isp->isp_reqidx = isp->isp_reqodx = mbs.param[4]; 868 869 /* 870 * Turn on Fast Posting, LVD transitions 871 * 872 * Ultra2 F/W always has had fast posting (and LVD transitions) 873 * 874 * Ultra and older (i.e., SBus) cards may not. It's just safer 875 * to assume not for them. 876 */ 877 878 mbs.param[0] = MBOX_SET_FW_FEATURES; 879 mbs.param[1] = 0; 880 if (IS_ULTRA2(isp)) 881 mbs.param[1] |= FW_FEATURE_LVD_NOTIFY; 882 if (IS_ULTRA2(isp) || IS_1240(isp)) 883 mbs.param[1] |= FW_FEATURE_FAST_POST; 884 if (mbs.param[1] != 0) { 885 u_int16_t sfeat = mbs.param[1]; 886 isp_mboxcmd(isp, &mbs, MBLOGALL); 887 if (mbs.param[0] == MBOX_COMMAND_COMPLETE) { 888 isp_prt(isp, ISP_LOGINFO, 889 "Enabled FW features (0x%x)", sfeat); 890 } 891 } 892 893 /* 894 * Let the outer layers decide whether to issue a SCSI bus reset. 895 */ 896 isp->isp_state = ISP_INITSTATE; 897 } 898 899 static void 900 isp_scsi_channel_init(isp, channel) 901 struct ispsoftc *isp; 902 int channel; 903 { 904 sdparam *sdp; 905 mbreg_t mbs; 906 int tgt; 907 908 sdp = isp->isp_param; 909 sdp += channel; 910 911 /* 912 * Set (possibly new) Initiator ID. 913 */ 914 mbs.param[0] = MBOX_SET_INIT_SCSI_ID; 915 mbs.param[1] = (channel << 7) | sdp->isp_initiator_id; 916 isp_mboxcmd(isp, &mbs, MBLOGALL); 917 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 918 return; 919 } 920 isp_prt(isp, ISP_LOGINFO, "Initiator ID is %d", sdp->isp_initiator_id); 921 922 923 /* 924 * Set current per-target parameters to a safe minimum. 925 */ 926 for (tgt = 0; tgt < MAX_TARGETS; tgt++) { 927 int lun; 928 u_int16_t sdf; 929 930 if (sdp->isp_devparam[tgt].dev_enable == 0) { 931 continue; 932 } 933 sdf = DPARM_SAFE_DFLT; 934 /* 935 * It is not quite clear when this changed over so that 936 * we could force narrow and async for 1000/1020 cards, 937 * but assume that this is only the case for loaded 938 * firmware. 939 */ 940 if (isp->isp_loaded_fw) { 941 sdf |= DPARM_NARROW | DPARM_ASYNC; 942 } 943 mbs.param[0] = MBOX_SET_TARGET_PARAMS; 944 mbs.param[1] = (tgt << 8) | (channel << 15); 945 mbs.param[2] = sdf; 946 if ((sdf & DPARM_SYNC) == 0) { 947 mbs.param[3] = 0; 948 } else { 949 mbs.param[3] = 950 (sdp->isp_devparam[tgt].sync_offset << 8) | 951 (sdp->isp_devparam[tgt].sync_period); 952 } 953 isp_mboxcmd(isp, &mbs, MBLOGALL); 954 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 955 sdf = DPARM_SAFE_DFLT; 956 mbs.param[0] = MBOX_SET_TARGET_PARAMS; 957 mbs.param[1] = (tgt << 8) | (channel << 15); 958 mbs.param[2] = sdf; 959 mbs.param[3] = 0; 960 isp_mboxcmd(isp, &mbs, MBLOGALL); 961 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 962 continue; 963 } 964 } 965 966 /* 967 * We don't update any information directly from the f/w 968 * because we need to run at least one command to cause a 969 * new state to be latched up. So, we just assume that we 970 * converge to the values we just had set. 971 * 972 * Ensure that we don't believe tagged queuing is enabled yet. 973 * It turns out that sometimes the ISP just ignores our 974 * attempts to set parameters for devices that it hasn't 975 * seen yet. 976 */ 977 sdp->isp_devparam[tgt].cur_dflags = sdf & ~DPARM_TQING; 978 for (lun = 0; lun < (int) isp->isp_maxluns; lun++) { 979 mbs.param[0] = MBOX_SET_DEV_QUEUE_PARAMS; 980 mbs.param[1] = (channel << 15) | (tgt << 8) | lun; 981 mbs.param[2] = sdp->isp_max_queue_depth; 982 mbs.param[3] = sdp->isp_devparam[tgt].exc_throttle; 983 isp_mboxcmd(isp, &mbs, MBLOGALL); 984 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 985 break; 986 } 987 } 988 } 989 for (tgt = 0; tgt < MAX_TARGETS; tgt++) { 990 if (sdp->isp_devparam[tgt].dev_refresh) { 991 isp->isp_sendmarker |= (1 << channel); 992 isp->isp_update |= (1 << channel); 993 break; 994 } 995 } 996 } 997 998 /* 999 * Fibre Channel specific initialization. 1000 * 1001 * Locks are held before coming here. 1002 */ 1003 static void 1004 isp_fibre_init(isp) 1005 struct ispsoftc *isp; 1006 { 1007 fcparam *fcp; 1008 isp_icb_t *icbp; 1009 mbreg_t mbs; 1010 int loopid; 1011 u_int64_t nwwn, pwwn; 1012 1013 fcp = isp->isp_param; 1014 1015 loopid = DEFAULT_LOOPID(isp); 1016 icbp = (isp_icb_t *) fcp->isp_scratch; 1017 MEMZERO(icbp, sizeof (*icbp)); 1018 1019 icbp->icb_version = ICB_VERSION1; 1020 1021 /* 1022 * Firmware Options are either retrieved from NVRAM or 1023 * are patched elsewhere. We check them for sanity here 1024 * and make changes based on board revision, but otherwise 1025 * let others decide policy. 1026 */ 1027 1028 /* 1029 * If this is a 2100 < revision 5, we have to turn off FAIRNESS. 1030 */ 1031 if ((isp->isp_type == ISP_HA_FC_2100) && isp->isp_revision < 5) { 1032 fcp->isp_fwoptions &= ~ICBOPT_FAIRNESS; 1033 } 1034 1035 /* 1036 * We have to use FULL LOGIN even though it resets the loop too much 1037 * because otherwise port database entries don't get updated after 1038 * a LIP- this is a known f/w bug for 2100 f/w less than 1.17.0. 1039 */ 1040 if (ISP_FW_REVX(isp->isp_fwrev) < ISP_FW_REV(1, 17, 0)) { 1041 fcp->isp_fwoptions |= ICBOPT_FULL_LOGIN; 1042 } 1043 1044 /* 1045 * Insist on Port Database Update Async notifications 1046 */ 1047 fcp->isp_fwoptions |= ICBOPT_PDBCHANGE_AE; 1048 1049 /* 1050 * We don't set ICBOPT_PORTNAME because we want our 1051 * Node Name && Port Names to be distinct. 1052 */ 1053 1054 icbp->icb_fwoptions = fcp->isp_fwoptions; 1055 icbp->icb_maxfrmlen = fcp->isp_maxfrmlen; 1056 if (icbp->icb_maxfrmlen < ICB_MIN_FRMLEN || 1057 icbp->icb_maxfrmlen > ICB_MAX_FRMLEN) { 1058 isp_prt(isp, ISP_LOGERR, 1059 "bad frame length (%d) from NVRAM- using %d", 1060 fcp->isp_maxfrmlen, ICB_DFLT_FRMLEN); 1061 icbp->icb_maxfrmlen = ICB_DFLT_FRMLEN; 1062 } 1063 icbp->icb_maxalloc = fcp->isp_maxalloc; 1064 if (icbp->icb_maxalloc < 1) { 1065 isp_prt(isp, ISP_LOGERR, 1066 "bad maximum allocation (%d)- using 16", fcp->isp_maxalloc); 1067 icbp->icb_maxalloc = 16; 1068 } 1069 icbp->icb_execthrottle = fcp->isp_execthrottle; 1070 if (icbp->icb_execthrottle < 1) { 1071 isp_prt(isp, ISP_LOGERR, 1072 "bad execution throttle of %d- using 16", 1073 fcp->isp_execthrottle); 1074 icbp->icb_execthrottle = ICB_DFLT_THROTTLE; 1075 } 1076 icbp->icb_retry_delay = fcp->isp_retry_delay; 1077 icbp->icb_retry_count = fcp->isp_retry_count; 1078 icbp->icb_hardaddr = loopid; 1079 /* 1080 * Right now we just set extended options to prefer point-to-point 1081 * over loop based upon some soft config options. 1082 */ 1083 if (IS_2200(isp)) { 1084 icbp->icb_fwoptions |= ICBOPT_EXTENDED; 1085 /* 1086 * Prefer or force Point-To-Point instead Loop? 1087 */ 1088 switch(isp->isp_confopts & ISP_CFG_PORT_PREF) { 1089 case ISP_CFG_NPORT: 1090 icbp->icb_xfwoptions = ICBXOPT_PTP_2_LOOP; 1091 break; 1092 case ISP_CFG_NPORT_ONLY: 1093 icbp->icb_xfwoptions = ICBXOPT_PTP_ONLY; 1094 break; 1095 case ISP_CFG_LPORT_ONLY: 1096 icbp->icb_xfwoptions = ICBXOPT_LOOP_ONLY; 1097 break; 1098 default: 1099 icbp->icb_xfwoptions = ICBXOPT_LOOP_2_PTP; 1100 break; 1101 } 1102 } 1103 icbp->icb_logintime = 60; /* 60 second login timeout */ 1104 1105 nwwn = ISP_NODEWWN(isp); 1106 pwwn = ISP_PORTWWN(isp); 1107 if (nwwn && pwwn) { 1108 MAKE_NODE_NAME_FROM_WWN(icbp->icb_nodename, nwwn); 1109 MAKE_NODE_NAME_FROM_WWN(icbp->icb_portname, pwwn); 1110 isp_prt(isp, ISP_LOGDEBUG1, 1111 "Setting ICB Node 0x%08x%08x Port 0x%08x%08x", 1112 ((u_int32_t) (nwwn >> 32)), 1113 ((u_int32_t) (nwwn & 0xffffffff)), 1114 ((u_int32_t) (pwwn >> 32)), 1115 ((u_int32_t) (pwwn & 0xffffffff))); 1116 } else { 1117 isp_prt(isp, ISP_LOGDEBUG1, "Not using any WWNs"); 1118 fcp->isp_fwoptions &= ~(ICBOPT_USE_PORTNAME|ICBOPT_FULL_LOGIN); 1119 } 1120 icbp->icb_rqstqlen = RQUEST_QUEUE_LEN(isp); 1121 icbp->icb_rsltqlen = RESULT_QUEUE_LEN(isp); 1122 icbp->icb_rqstaddr[RQRSP_ADDR0015] = DMA_LSW(isp->isp_rquest_dma); 1123 icbp->icb_rqstaddr[RQRSP_ADDR1631] = DMA_MSW(isp->isp_rquest_dma); 1124 icbp->icb_respaddr[RQRSP_ADDR0015] = DMA_LSW(isp->isp_result_dma); 1125 icbp->icb_respaddr[RQRSP_ADDR1631] = DMA_MSW(isp->isp_result_dma); 1126 isp_prt(isp, ISP_LOGDEBUG1, 1127 "isp_fibre_init: fwoptions 0x%x", fcp->isp_fwoptions); 1128 ISP_SWIZZLE_ICB(isp, icbp); 1129 1130 /* 1131 * Do this *before* initializing the firmware. 1132 */ 1133 isp_mark_getpdb_all(isp); 1134 fcp->isp_fwstate = FW_CONFIG_WAIT; 1135 fcp->isp_loopstate = LOOP_NIL; 1136 1137 mbs.param[0] = MBOX_INIT_FIRMWARE; 1138 mbs.param[1] = 0; 1139 mbs.param[2] = DMA_MSW(fcp->isp_scdma); 1140 mbs.param[3] = DMA_LSW(fcp->isp_scdma); 1141 mbs.param[4] = 0; 1142 mbs.param[5] = 0; 1143 mbs.param[6] = 0; 1144 mbs.param[7] = 0; 1145 isp_mboxcmd(isp, &mbs, MBLOGALL); 1146 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 1147 return; 1148 } 1149 isp->isp_reqidx = isp->isp_reqodx = 0; 1150 isp->isp_residx = 0; 1151 isp->isp_sendmarker = 1; 1152 1153 /* 1154 * Whatever happens, we're now committed to being here. 1155 */ 1156 isp->isp_state = ISP_INITSTATE; 1157 } 1158 1159 /* 1160 * Fibre Channel Support- get the port database for the id. 1161 * 1162 * Locks are held before coming here. Return 0 if success, 1163 * else failure. 1164 */ 1165 1166 static void 1167 isp_mark_getpdb_all(isp) 1168 struct ispsoftc *isp; 1169 { 1170 fcparam *fcp = (fcparam *) isp->isp_param; 1171 int i; 1172 for (i = 0; i < MAX_FC_TARG; i++) { 1173 fcp->portdb[i].valid = 0; 1174 } 1175 } 1176 1177 static int 1178 isp_getpdb(isp, id, pdbp) 1179 struct ispsoftc *isp; 1180 int id; 1181 isp_pdb_t *pdbp; 1182 { 1183 fcparam *fcp = (fcparam *) isp->isp_param; 1184 mbreg_t mbs; 1185 1186 mbs.param[0] = MBOX_GET_PORT_DB; 1187 mbs.param[1] = id << 8; 1188 mbs.param[2] = DMA_MSW(fcp->isp_scdma); 1189 mbs.param[3] = DMA_LSW(fcp->isp_scdma); 1190 /* 1191 * Unneeded. For the 2100, except for initializing f/w, registers 1192 * 4/5 have to not be written to. 1193 * mbs.param[4] = 0; 1194 * mbs.param[5] = 0; 1195 * 1196 */ 1197 mbs.param[6] = 0; 1198 mbs.param[7] = 0; 1199 isp_mboxcmd(isp, &mbs, MBLOGALL & ~MBOX_COMMAND_PARAM_ERROR); 1200 if (mbs.param[0] == MBOX_COMMAND_COMPLETE) { 1201 ISP_UNSWIZZLE_AND_COPY_PDBP(isp, pdbp, fcp->isp_scratch); 1202 return (0); 1203 } 1204 return (-1); 1205 } 1206 1207 static u_int64_t 1208 isp_get_portname(isp, loopid, nodename) 1209 struct ispsoftc *isp; 1210 int loopid; 1211 int nodename; 1212 { 1213 u_int64_t wwn = 0; 1214 mbreg_t mbs; 1215 1216 mbs.param[0] = MBOX_GET_PORT_NAME; 1217 mbs.param[1] = loopid << 8; 1218 if (nodename) 1219 mbs.param[1] |= 1; 1220 isp_mboxcmd(isp, &mbs, MBLOGALL & ~MBOX_COMMAND_PARAM_ERROR); 1221 if (mbs.param[0] == MBOX_COMMAND_COMPLETE) { 1222 wwn = 1223 (((u_int64_t)(mbs.param[2] & 0xff)) << 56) | 1224 (((u_int64_t)(mbs.param[2] >> 8)) << 48) | 1225 (((u_int64_t)(mbs.param[3] & 0xff)) << 40) | 1226 (((u_int64_t)(mbs.param[3] >> 8)) << 32) | 1227 (((u_int64_t)(mbs.param[6] & 0xff)) << 24) | 1228 (((u_int64_t)(mbs.param[6] >> 8)) << 16) | 1229 (((u_int64_t)(mbs.param[7] & 0xff)) << 8) | 1230 (((u_int64_t)(mbs.param[7] >> 8))); 1231 } 1232 return (wwn); 1233 } 1234 1235 /* 1236 * Make sure we have good FC link and know our Loop ID. 1237 */ 1238 1239 static int 1240 isp_fclink_test(isp, usdelay) 1241 struct ispsoftc *isp; 1242 int usdelay; 1243 { 1244 static char *toponames[] = { 1245 "Private Loop", 1246 "FL Port", 1247 "N-Port to N-Port", 1248 "F Port", 1249 "F Port (no FLOGI_ACC response)" 1250 }; 1251 mbreg_t mbs; 1252 int count; 1253 u_int8_t lwfs; 1254 fcparam *fcp; 1255 #if defined(ISP2100_FABRIC) 1256 isp_pdb_t pdb; 1257 #endif 1258 fcp = isp->isp_param; 1259 1260 /* 1261 * XXX: Here is where we would start a 'loop dead' timeout 1262 */ 1263 1264 /* 1265 * Wait up to N microseconds for F/W to go to a ready state. 1266 */ 1267 lwfs = FW_CONFIG_WAIT; 1268 count = 0; 1269 while (count < usdelay) { 1270 u_int64_t enano; 1271 u_int32_t wrk; 1272 NANOTIME_T hra, hrb; 1273 1274 GET_NANOTIME(&hra); 1275 isp_fw_state(isp); 1276 if (lwfs != fcp->isp_fwstate) { 1277 isp_prt(isp, ISP_LOGINFO, "Firmware State <%s->%s>", 1278 isp2100_fw_statename((int)lwfs), 1279 isp2100_fw_statename((int)fcp->isp_fwstate)); 1280 lwfs = fcp->isp_fwstate; 1281 } 1282 if (fcp->isp_fwstate == FW_READY) { 1283 break; 1284 } 1285 GET_NANOTIME(&hrb); 1286 1287 /* 1288 * Get the elapsed time in nanoseconds. 1289 * Always guaranteed to be non-zero. 1290 */ 1291 enano = NANOTIME_SUB(&hrb, &hra); 1292 1293 isp_prt(isp, ISP_LOGDEBUG3, "usec%d: 0x%lx->0x%lx enano %lu", 1294 count, (long) GET_NANOSEC(&hra), (long) GET_NANOSEC(&hrb), 1295 (enano > ((u_int64_t)0xffffffff))? 0xffffffff : 1296 (unsigned long) (enano & 0xffffffff)); 1297 1298 /* 1299 * If the elapsed time is less than 1 millisecond, 1300 * delay a period of time up to that millisecond of 1301 * waiting. 1302 * 1303 * This peculiar code is an attempt to try and avoid 1304 * invoking u_int64_t math support functions for some 1305 * platforms where linkage is a problem. 1306 */ 1307 if (enano < (1000 * 1000)) { 1308 count += 1000; 1309 enano = (1000 * 1000) - enano; 1310 while (enano > (u_int64_t) 4000000000U) { 1311 USEC_SLEEP(isp, 4000000); 1312 enano -= (u_int64_t) 4000000000U; 1313 } 1314 wrk = enano; 1315 USEC_SLEEP(isp, wrk/1000); 1316 } else { 1317 while (enano > (u_int64_t) 4000000000U) { 1318 count += 4000000; 1319 enano -= (u_int64_t) 4000000000U; 1320 } 1321 wrk = enano; 1322 count += (wrk / 1000); 1323 } 1324 } 1325 1326 /* 1327 * If we haven't gone to 'ready' state, return. 1328 */ 1329 if (fcp->isp_fwstate != FW_READY) { 1330 return (-1); 1331 } 1332 1333 /* 1334 * Get our Loop ID (if possible). We really need to have it. 1335 */ 1336 mbs.param[0] = MBOX_GET_LOOP_ID; 1337 isp_mboxcmd(isp, &mbs, MBLOGALL); 1338 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 1339 return (-1); 1340 } 1341 fcp->isp_loopid = mbs.param[1]; 1342 if (IS_2200(isp)) { 1343 int topo = (int) mbs.param[6]; 1344 if (topo < TOPO_NL_PORT || topo > TOPO_PTP_STUB) 1345 topo = TOPO_PTP_STUB; 1346 fcp->isp_topo = topo; 1347 } else { 1348 fcp->isp_topo = TOPO_NL_PORT; 1349 } 1350 fcp->isp_alpa = mbs.param[2]; 1351 1352 #if defined(ISP2100_FABRIC) 1353 fcp->isp_onfabric = 0; 1354 if (fcp->isp_topo != TOPO_N_PORT && 1355 isp_getpdb(isp, FL_PORT_ID, &pdb) == 0) { 1356 struct lportdb *lp; 1357 if (IS_2100(isp)) { 1358 fcp->isp_topo = TOPO_FL_PORT; 1359 } 1360 fcp->isp_portid = mbs.param[2] | (((int)mbs.param[3]) << 16); 1361 fcp->isp_onfabric = 1; 1362 1363 /* 1364 * Save the Fabric controller's port database entry. 1365 */ 1366 lp = &fcp->portdb[FL_PORT_ID]; 1367 lp->node_wwn = 1368 (((u_int64_t)pdb.pdb_nodename[0]) << 56) | 1369 (((u_int64_t)pdb.pdb_nodename[1]) << 48) | 1370 (((u_int64_t)pdb.pdb_nodename[2]) << 40) | 1371 (((u_int64_t)pdb.pdb_nodename[3]) << 32) | 1372 (((u_int64_t)pdb.pdb_nodename[4]) << 24) | 1373 (((u_int64_t)pdb.pdb_nodename[5]) << 16) | 1374 (((u_int64_t)pdb.pdb_nodename[6]) << 8) | 1375 (((u_int64_t)pdb.pdb_nodename[7])); 1376 lp->port_wwn = 1377 (((u_int64_t)pdb.pdb_portname[0]) << 56) | 1378 (((u_int64_t)pdb.pdb_portname[1]) << 48) | 1379 (((u_int64_t)pdb.pdb_portname[2]) << 40) | 1380 (((u_int64_t)pdb.pdb_portname[3]) << 32) | 1381 (((u_int64_t)pdb.pdb_portname[4]) << 24) | 1382 (((u_int64_t)pdb.pdb_portname[5]) << 16) | 1383 (((u_int64_t)pdb.pdb_portname[6]) << 8) | 1384 (((u_int64_t)pdb.pdb_portname[7])); 1385 lp->roles = 1386 (pdb.pdb_prli_svc3 & SVC3_ROLE_MASK) >> SVC3_ROLE_SHIFT; 1387 lp->portid = BITS2WORD(pdb.pdb_portid_bits); 1388 lp->loopid = pdb.pdb_loopid; 1389 lp->loggedin = lp->valid = 1; 1390 isp_register_fc4_type(isp); 1391 } else 1392 #endif 1393 { 1394 fcp->isp_portid = mbs.param[2]; 1395 fcp->isp_onfabric = 0; 1396 fcp->portdb[FL_PORT_ID].valid = 0; 1397 } 1398 1399 isp_prt(isp, ISP_LOGINFO, topology, fcp->isp_loopid, fcp->isp_alpa, 1400 fcp->isp_portid, fcp->isp_loopstate, toponames[fcp->isp_topo]); 1401 1402 return (0); 1403 } 1404 1405 static char * 1406 isp2100_fw_statename(state) 1407 int state; 1408 { 1409 switch(state) { 1410 case FW_CONFIG_WAIT: return "Config Wait"; 1411 case FW_WAIT_AL_PA: return "Waiting for AL_PA"; 1412 case FW_WAIT_LOGIN: return "Wait Login"; 1413 case FW_READY: return "Ready"; 1414 case FW_LOSS_OF_SYNC: return "Loss Of Sync"; 1415 case FW_ERROR: return "Error"; 1416 case FW_REINIT: return "Re-Init"; 1417 case FW_NON_PART: return "Nonparticipating"; 1418 default: return "?????"; 1419 } 1420 } 1421 1422 static int 1423 isp_same_lportdb(a, b) 1424 struct lportdb *a, *b; 1425 { 1426 /* 1427 * We decide two lports are the same if they have non-zero and 1428 * identical port WWNs and identical loop IDs. 1429 */ 1430 1431 if (a->port_wwn == 0 || a->port_wwn != b->port_wwn || 1432 a->loopid != b->loopid || a->roles != b->roles) { 1433 return (0); 1434 } else { 1435 return (1); 1436 } 1437 } 1438 1439 /* 1440 * Synchronize our soft copy of the port database with what the f/w thinks 1441 * (with a view toward possibly for a specific target....) 1442 */ 1443 1444 static int 1445 isp_pdb_sync(isp, target) 1446 struct ispsoftc *isp; 1447 int target; 1448 { 1449 struct lportdb *lp, *tport; 1450 fcparam *fcp = isp->isp_param; 1451 isp_pdb_t pdb; 1452 int loopid, frange, prange, lim; 1453 1454 #ifdef ISP2100_FABRIC 1455 /* 1456 * XXX: If we do this *after* building up our local port database, 1457 * XXX: the commands simply don't work. 1458 */ 1459 /* 1460 * (Re)discover all fabric devices 1461 */ 1462 if (fcp->isp_onfabric) 1463 (void) isp_scan_fabric(isp); 1464 #endif 1465 1466 1467 switch (fcp->isp_topo) { 1468 case TOPO_F_PORT: 1469 case TOPO_PTP_STUB: 1470 frange = prange = 0; 1471 break; 1472 case TOPO_N_PORT: 1473 frange = FC_SNS_ID+1; 1474 prange = 2; 1475 break; 1476 default: 1477 frange = FC_SNS_ID+1; 1478 prange = FL_PORT_ID; 1479 break; 1480 } 1481 1482 /* 1483 * Run through the local loop ports and get port database info 1484 * for each loop ID. 1485 * 1486 * There's a somewhat unexplained situation where the f/w passes back 1487 * the wrong database entity- if that happens, just restart (up to 1488 * FL_PORT_ID times). 1489 */ 1490 tport = fcp->tport; 1491 1492 /* 1493 * make sure the temp port database is clean... 1494 */ 1495 MEMZERO((void *) tport, sizeof (tport)); 1496 1497 for (lim = loopid = 0; loopid < prange; loopid++) { 1498 lp = &tport[loopid]; 1499 lp->node_wwn = isp_get_portname(isp, loopid, 1); 1500 if (fcp->isp_loopstate < LOOP_PDB_RCVD) 1501 return (-1); 1502 if (lp->node_wwn == 0) 1503 continue; 1504 lp->port_wwn = isp_get_portname(isp, loopid, 0); 1505 if (fcp->isp_loopstate < LOOP_PDB_RCVD) 1506 return (-1); 1507 if (lp->port_wwn == 0) { 1508 lp->node_wwn = 0; 1509 continue; 1510 } 1511 1512 /* 1513 * Get an entry.... 1514 */ 1515 if (isp_getpdb(isp, loopid, &pdb) != 0) { 1516 if (fcp->isp_loopstate < LOOP_PDB_RCVD) 1517 return (-1); 1518 continue; 1519 } 1520 1521 if (fcp->isp_loopstate < LOOP_PDB_RCVD) 1522 return (-1); 1523 1524 /* 1525 * If the returned database element doesn't match what we 1526 * asked for, restart the process entirely (up to a point...). 1527 */ 1528 if (pdb.pdb_loopid != loopid) { 1529 loopid = 0; 1530 if (lim++ < FL_PORT_ID) { 1531 continue; 1532 } 1533 isp_prt(isp, ISP_LOGWARN, 1534 "giving up on synchronizing the port database"); 1535 return (-1); 1536 } 1537 1538 /* 1539 * Save the pertinent info locally. 1540 */ 1541 lp->node_wwn = 1542 (((u_int64_t)pdb.pdb_nodename[0]) << 56) | 1543 (((u_int64_t)pdb.pdb_nodename[1]) << 48) | 1544 (((u_int64_t)pdb.pdb_nodename[2]) << 40) | 1545 (((u_int64_t)pdb.pdb_nodename[3]) << 32) | 1546 (((u_int64_t)pdb.pdb_nodename[4]) << 24) | 1547 (((u_int64_t)pdb.pdb_nodename[5]) << 16) | 1548 (((u_int64_t)pdb.pdb_nodename[6]) << 8) | 1549 (((u_int64_t)pdb.pdb_nodename[7])); 1550 lp->port_wwn = 1551 (((u_int64_t)pdb.pdb_portname[0]) << 56) | 1552 (((u_int64_t)pdb.pdb_portname[1]) << 48) | 1553 (((u_int64_t)pdb.pdb_portname[2]) << 40) | 1554 (((u_int64_t)pdb.pdb_portname[3]) << 32) | 1555 (((u_int64_t)pdb.pdb_portname[4]) << 24) | 1556 (((u_int64_t)pdb.pdb_portname[5]) << 16) | 1557 (((u_int64_t)pdb.pdb_portname[6]) << 8) | 1558 (((u_int64_t)pdb.pdb_portname[7])); 1559 lp->roles = 1560 (pdb.pdb_prli_svc3 & SVC3_ROLE_MASK) >> SVC3_ROLE_SHIFT; 1561 lp->portid = BITS2WORD(pdb.pdb_portid_bits); 1562 lp->loopid = pdb.pdb_loopid; 1563 /* 1564 * Do a quick check to see whether this matches the saved port 1565 * database for the same loopid. We do this here to save 1566 * searching later (if possible). Note that this fails over 1567 * time as things shuffle on the loop- we get the current 1568 * loop state (where loop id as an index matches loop id in 1569 * use) and then compare it to our saved database which 1570 * never shifts. 1571 */ 1572 if (target >= 0 && isp_same_lportdb(lp, &fcp->portdb[target])) { 1573 lp->valid = 1; 1574 } 1575 } 1576 1577 /* 1578 * If we get this far, we've settled our differences with the f/w 1579 * and we can say that the loop state is ready. 1580 */ 1581 fcp->isp_loopstate = LOOP_READY; 1582 1583 /* 1584 * Mark all of the permanent local loop database entries as invalid. 1585 */ 1586 for (loopid = 0; loopid < FL_PORT_ID; loopid++) { 1587 fcp->portdb[loopid].valid = 0; 1588 } 1589 1590 /* 1591 * Now merge our local copy of the port database into our saved copy. 1592 * Notify the outer layers of new devices arriving. 1593 */ 1594 for (loopid = 0; loopid < prange; loopid++) { 1595 int i; 1596 1597 /* 1598 * If we don't have a non-zero Port WWN, we're not here. 1599 */ 1600 if (tport[loopid].port_wwn == 0) { 1601 continue; 1602 } 1603 1604 /* 1605 * If we've already marked our tmp copy as valid, 1606 * this means that we've decided that it's the 1607 * same as our saved data base. This didn't include 1608 * the 'valid' marking so we have set that here. 1609 */ 1610 if (tport[loopid].valid) { 1611 fcp->portdb[loopid].valid = 1; 1612 continue; 1613 } 1614 1615 /* 1616 * For the purposes of deciding whether this is the 1617 * 'same' device or not, we only search for an identical 1618 * Port WWN. Node WWNs may or may not be the same as 1619 * the Port WWN, and there may be multiple different 1620 * Port WWNs with the same Node WWN. It would be chaos 1621 * to have multiple identical Port WWNs, so we don't 1622 * allow that. 1623 */ 1624 1625 for (i = 0; i < FL_PORT_ID; i++) { 1626 int j; 1627 if (fcp->portdb[i].port_wwn == 0) 1628 continue; 1629 if (fcp->portdb[i].port_wwn != tport[loopid].port_wwn) 1630 continue; 1631 /* 1632 * We found this WWN elsewhere- it's changed 1633 * loopids then. We don't change it's actual 1634 * position in our cached port database- we 1635 * just change the actual loop ID we'd use. 1636 */ 1637 if (fcp->portdb[i].loopid != loopid) { 1638 isp_prt(isp, ISP_LOGINFO, portshift, i, 1639 fcp->portdb[i].loopid, 1640 fcp->portdb[i].portid, loopid, 1641 tport[loopid].portid); 1642 } 1643 fcp->portdb[i].portid = tport[loopid].portid; 1644 fcp->portdb[i].loopid = loopid; 1645 fcp->portdb[i].valid = 1; 1646 fcp->portdb[i].roles = tport[loopid].roles; 1647 1648 /* 1649 * Now make sure this Port WWN doesn't exist elsewhere 1650 * in the port database. 1651 */ 1652 for (j = i+1; j < FL_PORT_ID; j++) { 1653 if (fcp->portdb[i].port_wwn != 1654 fcp->portdb[j].port_wwn) { 1655 continue; 1656 } 1657 isp_prt(isp, ISP_LOGWARN, portdup, j, i); 1658 /* 1659 * Invalidate the 'old' *and* 'new' ones. 1660 * This is really harsh and not quite right, 1661 * but if this happens, we really don't know 1662 * who is what at this point. 1663 */ 1664 fcp->portdb[i].valid = 0; 1665 fcp->portdb[j].valid = 0; 1666 } 1667 break; 1668 } 1669 1670 /* 1671 * If we didn't traverse the entire port database, 1672 * then we found (and remapped) an existing entry. 1673 * No need to notify anyone- go for the next one. 1674 */ 1675 if (i < FL_PORT_ID) { 1676 continue; 1677 } 1678 1679 /* 1680 * We've not found this Port WWN anywhere. It's a new entry. 1681 * See if we can leave it where it is (with target == loopid). 1682 */ 1683 if (fcp->portdb[loopid].port_wwn != 0) { 1684 for (lim = 0; lim < FL_PORT_ID; lim++) { 1685 if (fcp->portdb[lim].port_wwn == 0) 1686 break; 1687 } 1688 /* "Cannot Happen" */ 1689 if (lim == FL_PORT_ID) { 1690 isp_prt(isp, ISP_LOGWARN, "Remap Overflow"); 1691 continue; 1692 } 1693 i = lim; 1694 } else { 1695 i = loopid; 1696 } 1697 1698 /* 1699 * NB: The actual loopid we use here is loopid- we may 1700 * in fact be at a completely different index (target). 1701 */ 1702 fcp->portdb[i].loopid = loopid; 1703 fcp->portdb[i].port_wwn = tport[loopid].port_wwn; 1704 fcp->portdb[i].node_wwn = tport[loopid].node_wwn; 1705 fcp->portdb[i].roles = tport[loopid].roles; 1706 fcp->portdb[i].portid = tport[loopid].portid; 1707 fcp->portdb[i].valid = 1; 1708 1709 /* 1710 * Tell the outside world we've arrived. 1711 */ 1712 (void) isp_async(isp, ISPASYNC_LOGGED_INOUT, &i); 1713 } 1714 1715 /* 1716 * Now find all previously used targets that are now invalid and 1717 * notify the outer layers that they're gone. 1718 */ 1719 for (lp = fcp->portdb; lp < &fcp->portdb[prange]; lp++) { 1720 if (lp->valid || lp->port_wwn == 0) 1721 continue; 1722 1723 /* 1724 * Tell the outside world we've gone away. 1725 */ 1726 loopid = lp - fcp->portdb; 1727 (void) isp_async(isp, ISPASYNC_LOGGED_INOUT, &loopid); 1728 MEMZERO((void *) lp, sizeof (*lp)); 1729 } 1730 1731 #ifdef ISP2100_FABRIC 1732 /* 1733 * Now log in any fabric devices 1734 */ 1735 for (lp = &fcp->portdb[frange]; 1736 lp < &fcp->portdb[MAX_FC_TARG]; lp++) { 1737 u_int32_t portid; 1738 mbreg_t mbs; 1739 1740 loopid = lp - fcp->portdb; 1741 if (loopid >= FL_PORT_ID && loopid <= FC_SNS_ID) { 1742 continue; 1743 } 1744 1745 /* 1746 * Anything here? 1747 */ 1748 if (lp->port_wwn == 0) { 1749 continue; 1750 } 1751 1752 /* 1753 * Don't try to log into yourself. 1754 */ 1755 if ((portid = lp->portid) == fcp->isp_portid) { 1756 continue; 1757 } 1758 1759 1760 /* 1761 * If we'd been logged in- see if we still are and we haven't 1762 * changed. If so, no need to log ourselves out, etc.. 1763 * 1764 * Unfortunately, our charming Qlogic f/w has decided to 1765 * return a valid port database entry for a fabric device 1766 * that has, in fact, gone away. And it hangs trying to 1767 * log it out. 1768 */ 1769 if (lp->loggedin && 1770 isp_getpdb(isp, lp->loopid, &pdb) == 0) { 1771 int nrole; 1772 u_int64_t nwwnn, nwwpn; 1773 nwwnn = 1774 (((u_int64_t)pdb.pdb_nodename[0]) << 56) | 1775 (((u_int64_t)pdb.pdb_nodename[1]) << 48) | 1776 (((u_int64_t)pdb.pdb_nodename[2]) << 40) | 1777 (((u_int64_t)pdb.pdb_nodename[3]) << 32) | 1778 (((u_int64_t)pdb.pdb_nodename[4]) << 24) | 1779 (((u_int64_t)pdb.pdb_nodename[5]) << 16) | 1780 (((u_int64_t)pdb.pdb_nodename[6]) << 8) | 1781 (((u_int64_t)pdb.pdb_nodename[7])); 1782 nwwpn = 1783 (((u_int64_t)pdb.pdb_portname[0]) << 56) | 1784 (((u_int64_t)pdb.pdb_portname[1]) << 48) | 1785 (((u_int64_t)pdb.pdb_portname[2]) << 40) | 1786 (((u_int64_t)pdb.pdb_portname[3]) << 32) | 1787 (((u_int64_t)pdb.pdb_portname[4]) << 24) | 1788 (((u_int64_t)pdb.pdb_portname[5]) << 16) | 1789 (((u_int64_t)pdb.pdb_portname[6]) << 8) | 1790 (((u_int64_t)pdb.pdb_portname[7])); 1791 nrole = (pdb.pdb_prli_svc3 & SVC3_ROLE_MASK) >> 1792 SVC3_ROLE_SHIFT; 1793 if (pdb.pdb_loopid == lp->loopid && lp->portid == 1794 (u_int32_t) BITS2WORD(pdb.pdb_portid_bits) && 1795 nwwnn == lp->node_wwn && nwwpn == lp->port_wwn && 1796 lp->roles == nrole) { 1797 lp->loggedin = lp->valid = 1; 1798 isp_prt(isp, ISP_LOGINFO, lretained, 1799 (int) (lp - fcp->portdb), 1800 (int) lp->loopid, lp->portid); 1801 continue; 1802 } 1803 } 1804 1805 /* 1806 * Force a logout if we were logged in. 1807 */ 1808 if (lp->loggedin) { 1809 mbs.param[0] = MBOX_FABRIC_LOGOUT; 1810 mbs.param[1] = lp->loopid << 8; 1811 mbs.param[2] = 0; 1812 mbs.param[3] = 0; 1813 isp_mboxcmd(isp, &mbs, MBLOGNONE); 1814 lp->loggedin = 0; 1815 isp_prt(isp, ISP_LOGINFO, plogout, 1816 (int) (lp - fcp->portdb), lp->loopid, lp->portid); 1817 } 1818 1819 /* 1820 * And log in.... 1821 */ 1822 loopid = lp - fcp->portdb; 1823 lp->loopid = 0; 1824 do { 1825 mbs.param[0] = MBOX_FABRIC_LOGIN; 1826 mbs.param[1] = loopid << 8; 1827 mbs.param[2] = portid >> 16; 1828 mbs.param[3] = portid & 0xffff; 1829 if (IS_2200(isp)) { 1830 /* only issue a PLOGI if not logged in */ 1831 mbs.param[1] |= 0x1; 1832 } 1833 isp_mboxcmd(isp, &mbs, MBLOGALL & ~(MBOX_LOOP_ID_USED | 1834 MBOX_PORT_ID_USED | MBOX_COMMAND_ERROR)); 1835 switch (mbs.param[0]) { 1836 case MBOX_LOOP_ID_USED: 1837 /* 1838 * Try the next available loop id. 1839 */ 1840 loopid++; 1841 break; 1842 case MBOX_PORT_ID_USED: 1843 /* 1844 * This port is already logged in. 1845 * Snaffle the loop id it's using if it's 1846 * nonzero, otherwise we're hosed. 1847 */ 1848 if (mbs.param[1] != 0) { 1849 loopid = mbs.param[1]; 1850 isp_prt(isp, ISP_LOGINFO, retained, 1851 loopid, (int) (lp - fcp->portdb), 1852 lp->portid); 1853 } else { 1854 loopid = MAX_FC_TARG; 1855 break; 1856 } 1857 /* FALLTHROUGH */ 1858 case MBOX_COMMAND_COMPLETE: 1859 lp->loggedin = 1; 1860 lp->loopid = loopid; 1861 break; 1862 case MBOX_COMMAND_ERROR: 1863 isp_prt(isp, ISP_LOGINFO, plogierr, 1864 portid, mbs.param[1]); 1865 /* FALLTHROUGH */ 1866 case MBOX_ALL_IDS_USED: /* We're outta IDs */ 1867 default: 1868 loopid = MAX_FC_TARG; 1869 break; 1870 } 1871 } while (lp->loopid == 0 && loopid < MAX_FC_TARG); 1872 1873 /* 1874 * If we get here and we haven't set a Loop ID, 1875 * we failed to log into this device. 1876 */ 1877 1878 if (lp->loopid == 0) { 1879 continue; 1880 } 1881 1882 /* 1883 * Make sure we can get the approriate port information. 1884 */ 1885 if (isp_getpdb(isp, lp->loopid, &pdb) != 0) { 1886 isp_prt(isp, ISP_LOGWARN, nopdb, lp->portid); 1887 goto dump_em; 1888 } 1889 1890 if (pdb.pdb_loopid != lp->loopid) { 1891 isp_prt(isp, ISP_LOGWARN, pdbmfail1, 1892 lp->portid, pdb.pdb_loopid); 1893 goto dump_em; 1894 } 1895 1896 if (lp->portid != (u_int32_t) BITS2WORD(pdb.pdb_portid_bits)) { 1897 isp_prt(isp, ISP_LOGWARN, pdbmfail2, 1898 lp->portid, BITS2WORD(pdb.pdb_portid_bits)); 1899 goto dump_em; 1900 } 1901 1902 lp->roles = 1903 (pdb.pdb_prli_svc3 & SVC3_ROLE_MASK) >> SVC3_ROLE_SHIFT; 1904 lp->node_wwn = 1905 (((u_int64_t)pdb.pdb_nodename[0]) << 56) | 1906 (((u_int64_t)pdb.pdb_nodename[1]) << 48) | 1907 (((u_int64_t)pdb.pdb_nodename[2]) << 40) | 1908 (((u_int64_t)pdb.pdb_nodename[3]) << 32) | 1909 (((u_int64_t)pdb.pdb_nodename[4]) << 24) | 1910 (((u_int64_t)pdb.pdb_nodename[5]) << 16) | 1911 (((u_int64_t)pdb.pdb_nodename[6]) << 8) | 1912 (((u_int64_t)pdb.pdb_nodename[7])); 1913 lp->port_wwn = 1914 (((u_int64_t)pdb.pdb_portname[0]) << 56) | 1915 (((u_int64_t)pdb.pdb_portname[1]) << 48) | 1916 (((u_int64_t)pdb.pdb_portname[2]) << 40) | 1917 (((u_int64_t)pdb.pdb_portname[3]) << 32) | 1918 (((u_int64_t)pdb.pdb_portname[4]) << 24) | 1919 (((u_int64_t)pdb.pdb_portname[5]) << 16) | 1920 (((u_int64_t)pdb.pdb_portname[6]) << 8) | 1921 (((u_int64_t)pdb.pdb_portname[7])); 1922 /* 1923 * Check to make sure this all makes sense. 1924 */ 1925 if (lp->node_wwn && lp->port_wwn) { 1926 lp->valid = 1; 1927 loopid = lp - fcp->portdb; 1928 (void) isp_async(isp, ISPASYNC_LOGGED_INOUT, &loopid); 1929 continue; 1930 } 1931 dump_em: 1932 lp->valid = 0; 1933 isp_prt(isp, ISP_LOGINFO, 1934 ldumped, loopid, lp->loopid, lp->portid); 1935 mbs.param[0] = MBOX_FABRIC_LOGOUT; 1936 mbs.param[1] = lp->loopid << 8; 1937 mbs.param[2] = 0; 1938 mbs.param[3] = 0; 1939 isp_mboxcmd(isp, &mbs, MBLOGNONE); 1940 } 1941 #endif 1942 /* 1943 * If we get here, we've for sure seen not only a valid loop 1944 * but know what is or isn't on it, so mark this for usage 1945 * in isp_start. 1946 */ 1947 fcp->loop_seen_once = 1; 1948 return (0); 1949 } 1950 1951 #ifdef ISP2100_FABRIC 1952 static int 1953 isp_scan_fabric(isp) 1954 struct ispsoftc *isp; 1955 { 1956 fcparam *fcp = isp->isp_param; 1957 u_int32_t portid, first_nz_portid; 1958 sns_screq_t *reqp; 1959 sns_scrsp_t *resp; 1960 mbreg_t mbs; 1961 int hicap; 1962 1963 reqp = (sns_screq_t *) fcp->isp_scratch; 1964 resp = (sns_scrsp_t *) (&((char *)fcp->isp_scratch)[0x100]); 1965 first_nz_portid = portid = fcp->isp_portid; 1966 1967 for (hicap = 0; hicap < 1024; hicap++) { 1968 MEMZERO((void *) reqp, SNS_GAN_REQ_SIZE); 1969 reqp->snscb_rblen = SNS_GAN_RESP_SIZE >> 1; 1970 reqp->snscb_addr[RQRSP_ADDR0015] = 1971 DMA_LSW(fcp->isp_scdma + 0x100); 1972 reqp->snscb_addr[RQRSP_ADDR1631] = 1973 DMA_MSW(fcp->isp_scdma + 0x100); 1974 reqp->snscb_sblen = 6; 1975 reqp->snscb_data[0] = SNS_GAN; 1976 reqp->snscb_data[4] = portid & 0xffff; 1977 reqp->snscb_data[5] = (portid >> 16) & 0xff; 1978 ISP_SWIZZLE_SNS_REQ(isp, reqp); 1979 mbs.param[0] = MBOX_SEND_SNS; 1980 mbs.param[1] = SNS_GAN_REQ_SIZE >> 1; 1981 mbs.param[2] = DMA_MSW(fcp->isp_scdma); 1982 mbs.param[3] = DMA_LSW(fcp->isp_scdma); 1983 mbs.param[6] = 0; 1984 mbs.param[7] = 0; 1985 isp_mboxcmd(isp, &mbs, MBLOGALL); 1986 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 1987 return (-1); 1988 } 1989 ISP_UNSWIZZLE_SNS_RSP(isp, resp, SNS_GAN_RESP_SIZE >> 1); 1990 portid = (((u_int32_t) resp->snscb_port_id[0]) << 16) | 1991 (((u_int32_t) resp->snscb_port_id[1]) << 8) | 1992 (((u_int32_t) resp->snscb_port_id[2])); 1993 if (isp_async(isp, ISPASYNC_FABRIC_DEV, resp)) { 1994 return (-1); 1995 } 1996 if (first_nz_portid == 0 && portid) { 1997 first_nz_portid = portid; 1998 } 1999 if (first_nz_portid == portid) { 2000 return (0); 2001 } 2002 } 2003 /* 2004 * We either have a broken name server or a huge fabric if we get here. 2005 */ 2006 return (0); 2007 } 2008 2009 static void 2010 isp_register_fc4_type(struct ispsoftc *isp) 2011 { 2012 fcparam *fcp = isp->isp_param; 2013 sns_screq_t *reqp; 2014 mbreg_t mbs; 2015 2016 reqp = (sns_screq_t *) fcp->isp_scratch; 2017 MEMZERO((void *) reqp, SNS_RFT_REQ_SIZE); 2018 reqp->snscb_rblen = SNS_RFT_RESP_SIZE >> 1; 2019 reqp->snscb_addr[RQRSP_ADDR0015] = DMA_LSW(fcp->isp_scdma + 0x100); 2020 reqp->snscb_addr[RQRSP_ADDR1631] = DMA_MSW(fcp->isp_scdma + 0x100); 2021 reqp->snscb_sblen = 22; 2022 reqp->snscb_data[0] = SNS_RFT; 2023 reqp->snscb_data[4] = fcp->isp_portid & 0xffff; 2024 reqp->snscb_data[5] = (fcp->isp_portid >> 16) & 0xff; 2025 reqp->snscb_data[6] = 0x100; /* SCS - FCP */ 2026 #if 0 2027 reqp->snscb_data[6] |= 20; /* ISO/IEC 8802-2 LLC/SNAP */ 2028 #endif 2029 ISP_SWIZZLE_SNS_REQ(isp, reqp); 2030 mbs.param[0] = MBOX_SEND_SNS; 2031 mbs.param[1] = SNS_RFT_REQ_SIZE >> 1; 2032 mbs.param[2] = DMA_MSW(fcp->isp_scdma); 2033 mbs.param[3] = DMA_LSW(fcp->isp_scdma); 2034 mbs.param[6] = 0; 2035 mbs.param[7] = 0; 2036 isp_mboxcmd(isp, &mbs, MBLOGALL); 2037 if (mbs.param[0] == MBOX_COMMAND_COMPLETE) { 2038 isp_prt(isp, ISP_LOGINFO, "Register FC4 types succeeded"); 2039 } 2040 } 2041 #endif 2042 /* 2043 * Start a command. Locking is assumed done in the caller. 2044 */ 2045 2046 int 2047 isp_start(xs) 2048 XS_T *xs; 2049 { 2050 struct ispsoftc *isp; 2051 u_int16_t iptr, optr; 2052 union { 2053 ispreq_t *_reqp; 2054 ispreqt2_t *_t2reqp; 2055 } _u; 2056 #define reqp _u._reqp 2057 #define t2reqp _u._t2reqp 2058 #define UZSIZE max(sizeof (ispreq_t), sizeof (ispreqt2_t)) 2059 int target, i; 2060 2061 XS_INITERR(xs); 2062 isp = XS_ISP(xs); 2063 2064 if (isp->isp_state != ISP_RUNSTATE) { 2065 isp_prt(isp, ISP_LOGERR, "Adapter not at RUNSTATE"); 2066 XS_SETERR(xs, HBA_BOTCH); 2067 return (CMD_COMPLETE); 2068 } 2069 2070 /* 2071 * Check command CDB length, etc.. We really are limited to 16 bytes 2072 * for Fibre Channel, but can do up to 44 bytes in parallel SCSI, 2073 * but probably only if we're running fairly new firmware (we'll 2074 * let the old f/w choke on an extended command queue entry). 2075 */ 2076 2077 if (XS_CDBLEN(xs) > (IS_FC(isp)? 16 : 44) || XS_CDBLEN(xs) == 0) { 2078 isp_prt(isp, ISP_LOGERR, 2079 "unsupported cdb length (%d, CDB[0]=0x%x)", 2080 XS_CDBLEN(xs), XS_CDBP(xs)[0] & 0xff); 2081 XS_SETERR(xs, HBA_BOTCH); 2082 return (CMD_COMPLETE); 2083 } 2084 2085 /* 2086 * Check to see whether we have good firmware state still or 2087 * need to refresh our port database for this target. 2088 */ 2089 target = XS_TGT(xs); 2090 if (IS_FC(isp)) { 2091 fcparam *fcp = isp->isp_param; 2092 struct lportdb *lp; 2093 #if defined(ISP2100_FABRIC) 2094 /* 2095 * If we're not on a Fabric, we can't have a target 2096 * above FL_PORT_ID-1. 2097 * 2098 * If we're on a fabric and *not* connected as an F-port, 2099 * we can't have a target less than FC_SNS_ID+1. This 2100 * keeps us from having to sort out the difference between 2101 * local public loop devices and those which we might get 2102 * from a switch's database. 2103 */ 2104 if (fcp->isp_onfabric == 0) { 2105 if (target >= FL_PORT_ID) { 2106 XS_SETERR(xs, HBA_SELTIMEOUT); 2107 return (CMD_COMPLETE); 2108 } 2109 } else { 2110 if (target >= FL_PORT_ID && target <= FC_SNS_ID) { 2111 XS_SETERR(xs, HBA_SELTIMEOUT); 2112 return (CMD_COMPLETE); 2113 } 2114 if (fcp->isp_topo != TOPO_F_PORT && 2115 target < FL_PORT_ID) { 2116 XS_SETERR(xs, HBA_SELTIMEOUT); 2117 return (CMD_COMPLETE); 2118 } 2119 } 2120 #endif 2121 /* 2122 * Check for f/w being in ready state. If the f/w 2123 * isn't in ready state, then we don't know our 2124 * loop ID and the f/w hasn't completed logging 2125 * into all targets on the loop. If this is the 2126 * case, then bounce the command. We pretend this is 2127 * a SELECTION TIMEOUT error if we've never gone to 2128 * FW_READY state at all- in this case we may not 2129 * be hooked to a loop at all and we shouldn't hang 2130 * the machine for this. Otherwise, defer this command 2131 * until later. 2132 */ 2133 if (fcp->isp_fwstate != FW_READY) { 2134 /* 2135 * Give ourselves at most a 250ms delay. 2136 */ 2137 if (isp_fclink_test(isp, 250000)) { 2138 XS_SETERR(xs, HBA_SELTIMEOUT); 2139 if (fcp->loop_seen_once) { 2140 return (CMD_RQLATER); 2141 } else { 2142 return (CMD_COMPLETE); 2143 } 2144 } 2145 } 2146 2147 /* 2148 * If our loop state is such that we haven't yet received 2149 * a "Port Database Changed" notification (after a LIP or 2150 * a Loop Reset or firmware initialization), then defer 2151 * sending commands for a little while, but only if we've 2152 * seen a valid loop at one point (otherwise we can get 2153 * stuck at initialization time). 2154 */ 2155 if (fcp->isp_loopstate < LOOP_PDB_RCVD) { 2156 XS_SETERR(xs, HBA_SELTIMEOUT); 2157 if (fcp->loop_seen_once) { 2158 return (CMD_RQLATER); 2159 } else { 2160 return (CMD_COMPLETE); 2161 } 2162 } 2163 2164 /* 2165 * If our loop state is now such that we've just now 2166 * received a Port Database Change notification, then 2167 * we have to go off and (re)synchronize our port 2168 * database. 2169 */ 2170 if (fcp->isp_loopstate == LOOP_PDB_RCVD) { 2171 if (isp_pdb_sync(isp, target)) { 2172 XS_SETERR(xs, HBA_SELTIMEOUT); 2173 return (CMD_COMPLETE); 2174 } 2175 } 2176 2177 /* 2178 * XXX: Here's were we would cancel any loop_dead flag 2179 * XXX: also cancel in dead_loop timeout that's running 2180 */ 2181 2182 /* 2183 * Now check whether we should even think about pursuing this. 2184 */ 2185 lp = &fcp->portdb[target]; 2186 if (lp->valid == 0) { 2187 XS_SETERR(xs, HBA_SELTIMEOUT); 2188 return (CMD_COMPLETE); 2189 } 2190 if ((lp->roles & (SVC3_TGT_ROLE >> SVC3_ROLE_SHIFT)) == 0) { 2191 isp_prt(isp, ISP_LOGDEBUG2, 2192 "Target %d does not have target service", target); 2193 XS_SETERR(xs, HBA_SELTIMEOUT); 2194 return (CMD_COMPLETE); 2195 } 2196 /* 2197 * Now turn target into what the actual loop ID is. 2198 */ 2199 target = lp->loopid; 2200 } 2201 2202 /* 2203 * Next check to see if any HBA or Device 2204 * parameters need to be updated. 2205 */ 2206 if (isp->isp_update != 0) { 2207 isp_update(isp); 2208 } 2209 2210 if (isp_getrqentry(isp, &iptr, &optr, (void **) &reqp)) { 2211 isp_prt(isp, ISP_LOGDEBUG0, "Request Queue Overflow"); 2212 XS_SETERR(xs, HBA_BOTCH); 2213 return (CMD_EAGAIN); 2214 } 2215 2216 /* 2217 * Now see if we need to synchronize the ISP with respect to anything. 2218 * We do dual duty here (cough) for synchronizing for busses other 2219 * than which we got here to send a command to. 2220 */ 2221 if (isp->isp_sendmarker) { 2222 u_int8_t n = (IS_DUALBUS(isp)? 2: 1); 2223 /* 2224 * Check ports to send markers for... 2225 */ 2226 for (i = 0; i < n; i++) { 2227 if ((isp->isp_sendmarker & (1 << i)) == 0) { 2228 continue; 2229 } 2230 MEMZERO((void *) reqp, sizeof (*reqp)); 2231 reqp->req_header.rqs_entry_count = 1; 2232 reqp->req_header.rqs_entry_type = RQSTYPE_MARKER; 2233 reqp->req_modifier = SYNC_ALL; 2234 reqp->req_target = i << 7; /* insert bus number */ 2235 ISP_SWIZZLE_REQUEST(isp, reqp); 2236 ISP_ADD_REQUEST(isp, iptr); 2237 2238 if (isp_getrqentry(isp, &iptr, &optr, (void **)&reqp)) { 2239 isp_prt(isp, ISP_LOGDEBUG0, 2240 "Request Queue Overflow+"); 2241 XS_SETERR(xs, HBA_BOTCH); 2242 return (CMD_EAGAIN); 2243 } 2244 } 2245 } 2246 2247 MEMZERO((void *) reqp, UZSIZE); 2248 reqp->req_header.rqs_entry_count = 1; 2249 if (IS_FC(isp)) { 2250 reqp->req_header.rqs_entry_type = RQSTYPE_T2RQS; 2251 } else { 2252 if (XS_CDBLEN(xs) > 12) 2253 reqp->req_header.rqs_entry_type = RQSTYPE_CMDONLY; 2254 else 2255 reqp->req_header.rqs_entry_type = RQSTYPE_REQUEST; 2256 } 2257 reqp->req_header.rqs_flags = 0; 2258 reqp->req_header.rqs_seqno = 0; 2259 if (IS_FC(isp)) { 2260 /* 2261 * See comment in isp_intr 2262 */ 2263 XS_RESID(xs) = 0; 2264 2265 /* 2266 * Fibre Channel always requires some kind of tag. 2267 * The Qlogic drivers seem be happy not to use a tag, 2268 * but this breaks for some devices (IBM drives). 2269 */ 2270 if (XS_TAG_P(xs)) { 2271 t2reqp->req_flags = XS_TAG_TYPE(xs); 2272 } else { 2273 /* 2274 * If we don't know what tag to use, use HEAD OF QUEUE 2275 * for Request Sense or Ordered (for safety's sake). 2276 */ 2277 if (XS_CDBP(xs)[0] == 0x3) /* REQUEST SENSE */ 2278 t2reqp->req_flags = REQFLAG_HTAG; 2279 else 2280 t2reqp->req_flags = REQFLAG_OTAG; 2281 } 2282 } else { 2283 sdparam *sdp = (sdparam *)isp->isp_param; 2284 if ((sdp->isp_devparam[target].cur_dflags & DPARM_TQING) && 2285 XS_TAG_P(xs)) { 2286 reqp->req_flags = XS_TAG_TYPE(xs); 2287 } 2288 } 2289 reqp->req_target = target | (XS_CHANNEL(xs) << 7); 2290 if (IS_SCSI(isp)) { 2291 reqp->req_lun_trn = XS_LUN(xs); 2292 reqp->req_cdblen = XS_CDBLEN(xs); 2293 } else { 2294 if (isp->isp_maxluns > 16) 2295 t2reqp->req_scclun = XS_LUN(xs); 2296 else 2297 t2reqp->req_lun_trn = XS_LUN(xs); 2298 } 2299 MEMCPY(reqp->req_cdb, XS_CDBP(xs), XS_CDBLEN(xs)); 2300 2301 reqp->req_time = XS_TIME(xs) / 1000; 2302 if (reqp->req_time == 0 && XS_TIME(xs)) 2303 reqp->req_time = 1; 2304 2305 /* 2306 * Always give a bit more leeway to commands after a bus reset. 2307 * XXX: DOES NOT DISTINGUISH WHICH PORT MAY HAVE BEEN SYNCED 2308 */ 2309 if (isp->isp_sendmarker && reqp->req_time < 5) { 2310 reqp->req_time = 5; 2311 } 2312 if (isp_save_xs(isp, xs, &reqp->req_handle)) { 2313 isp_prt(isp, ISP_LOGDEBUG1, "out of xflist pointers"); 2314 XS_SETERR(xs, HBA_BOTCH); 2315 return (CMD_EAGAIN); 2316 } 2317 /* 2318 * Set up DMA and/or do any bus swizzling of the request entry 2319 * so that the Qlogic F/W understands what is being asked of it. 2320 */ 2321 i = ISP_DMASETUP(isp, xs, reqp, &iptr, optr); 2322 if (i != CMD_QUEUED) { 2323 isp_destroy_handle(isp, reqp->req_handle); 2324 /* 2325 * dmasetup sets actual error in packet, and 2326 * return what we were given to return. 2327 */ 2328 return (i); 2329 } 2330 XS_SETERR(xs, HBA_NOERROR); 2331 isp_prt(isp, ISP_LOGDEBUG2, 2332 "START cmd for %d.%d.%d cmd 0x%x datalen %d", 2333 XS_CHANNEL(xs), target, XS_LUN(xs), XS_CDBP(xs)[0], XS_XFRLEN(xs)); 2334 ISP_ADD_REQUEST(isp, iptr); 2335 isp->isp_nactive++; 2336 if (isp->isp_sendmarker) 2337 isp->isp_sendmarker = 0; 2338 return (CMD_QUEUED); 2339 #undef reqp 2340 #undef t2reqp 2341 } 2342 2343 /* 2344 * isp control 2345 * Locks (ints blocked) assumed held. 2346 */ 2347 2348 int 2349 isp_control(isp, ctl, arg) 2350 struct ispsoftc *isp; 2351 ispctl_t ctl; 2352 void *arg; 2353 { 2354 XS_T *xs; 2355 mbreg_t mbs; 2356 int bus, tgt; 2357 u_int32_t handle; 2358 2359 switch (ctl) { 2360 default: 2361 isp_prt(isp, ISP_LOGERR, "Unknown Control Opcode 0x%x", ctl); 2362 break; 2363 2364 case ISPCTL_RESET_BUS: 2365 /* 2366 * Issue a bus reset. 2367 */ 2368 mbs.param[0] = MBOX_BUS_RESET; 2369 mbs.param[2] = 0; 2370 if (IS_SCSI(isp)) { 2371 mbs.param[1] = 2372 ((sdparam *) isp->isp_param)->isp_bus_reset_delay; 2373 if (mbs.param[1] < 2) 2374 mbs.param[1] = 2; 2375 bus = *((int *) arg); 2376 if (IS_DUALBUS(isp)) 2377 mbs.param[2] = bus; 2378 } else { 2379 mbs.param[1] = 10; 2380 bus = 0; 2381 } 2382 isp->isp_sendmarker |= (1 << bus); 2383 isp_mboxcmd(isp, &mbs, MBLOGALL); 2384 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 2385 break; 2386 } 2387 isp_prt(isp, ISP_LOGINFO, 2388 "driver initiated bus reset of bus %d", bus); 2389 return (0); 2390 2391 case ISPCTL_RESET_DEV: 2392 tgt = (*((int *) arg)) & 0xffff; 2393 bus = (*((int *) arg)) >> 16; 2394 mbs.param[0] = MBOX_ABORT_TARGET; 2395 mbs.param[1] = (tgt << 8) | (bus << 15); 2396 mbs.param[2] = 3; /* 'delay', in seconds */ 2397 isp_mboxcmd(isp, &mbs, MBLOGALL); 2398 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 2399 break; 2400 } 2401 isp_prt(isp, ISP_LOGINFO, 2402 "Target %d on Bus %d Reset Succeeded", tgt, bus); 2403 isp->isp_sendmarker |= (1 << bus); 2404 return (0); 2405 2406 case ISPCTL_ABORT_CMD: 2407 xs = (XS_T *) arg; 2408 tgt = XS_TGT(xs); 2409 handle = isp_find_handle(isp, xs); 2410 if (handle == 0) { 2411 isp_prt(isp, ISP_LOGWARN, 2412 "cannot find handle for command to abort"); 2413 break; 2414 } 2415 bus = XS_CHANNEL(xs); 2416 mbs.param[0] = MBOX_ABORT; 2417 if (IS_FC(isp)) { 2418 if (isp->isp_maxluns > 16) { 2419 mbs.param[1] = tgt << 8; 2420 mbs.param[4] = 0; 2421 mbs.param[5] = 0; 2422 mbs.param[6] = XS_LUN(xs); 2423 } else { 2424 mbs.param[1] = tgt << 8 | XS_LUN(xs); 2425 } 2426 } else { 2427 mbs.param[1] = 2428 (bus << 15) | (XS_TGT(xs) << 8) | XS_LUN(xs); 2429 } 2430 mbs.param[3] = handle >> 16; 2431 mbs.param[2] = handle & 0xffff; 2432 isp_mboxcmd(isp, &mbs, MBLOGALL & ~MBOX_COMMAND_ERROR); 2433 if (mbs.param[0] == MBOX_COMMAND_COMPLETE) { 2434 return (0); 2435 } 2436 /* 2437 * XXX: Look for command in the REQUEST QUEUE. That is, 2438 * XXX: It hasen't been picked up by firmware yet. 2439 */ 2440 break; 2441 2442 case ISPCTL_UPDATE_PARAMS: 2443 isp_update(isp); 2444 return (0); 2445 2446 case ISPCTL_FCLINK_TEST: 2447 if (IS_FC(isp)) { 2448 int usdelay = (arg)? *((int *) arg) : 250000; 2449 return (isp_fclink_test(isp, usdelay)); 2450 } 2451 break; 2452 2453 case ISPCTL_PDB_SYNC: 2454 if (IS_FC(isp)) { 2455 return (isp_pdb_sync(isp, -1)); 2456 } 2457 break; 2458 #ifdef ISP_TARGET_MODE 2459 case ISPCTL_TOGGLE_TMODE: 2460 { 2461 int ena = *(int *)arg; 2462 if (IS_SCSI(isp)) { 2463 mbs.param[0] = MBOX_ENABLE_TARGET_MODE; 2464 mbs.param[1] = (ena)? ENABLE_TARGET_FLAG : 0; 2465 isp_mboxcmd(isp, &mbs, MBLOGALL); 2466 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 2467 break; 2468 } 2469 } else { 2470 fcparam *fcp = isp->isp_param; 2471 /* 2472 * We assume somebody has quiesced this bus. 2473 */ 2474 if (ena) { 2475 if (fcp->isp_fwoptions & ICBOPT_TGT_ENABLE) { 2476 return (0); 2477 } 2478 fcp->isp_fwoptions |= ICBOPT_TGT_ENABLE; 2479 } else { 2480 if (!(fcp->isp_fwoptions & ICBOPT_TGT_ENABLE)) { 2481 return (0); 2482 } 2483 fcp->isp_fwoptions &= ~ICBOPT_TGT_ENABLE; 2484 } 2485 isp->isp_state = ISP_NILSTATE; 2486 isp_reset(isp); 2487 if (isp->isp_state != ISP_RESETSTATE) { 2488 break; 2489 } 2490 isp_init(isp); 2491 if ((isp->isp_confopts & ISP_CFG_NOINIT) == 0) { 2492 if (isp->isp_state == ISP_INITSTATE) { 2493 isp->isp_state = ISP_RUNSTATE; 2494 } 2495 } 2496 } 2497 return (0); 2498 } 2499 #endif 2500 } 2501 return (-1); 2502 } 2503 2504 /* 2505 * Interrupt Service Routine(s). 2506 * 2507 * External (OS) framework has done the appropriate locking, 2508 * and the locking will be held throughout this function. 2509 */ 2510 2511 /* 2512 * Limit our stack depth by sticking with the max likely number 2513 * of completions on a request queue at any one time. 2514 */ 2515 #define MAX_REQUESTQ_COMPLETIONS 32 2516 2517 int 2518 isp_intr(arg) 2519 void *arg; 2520 { 2521 struct ispsoftc *isp = arg; 2522 XS_T *complist[MAX_REQUESTQ_COMPLETIONS], *xs; 2523 u_int16_t iptr, optr, isr, sema, junk; 2524 int i, nlooked = 0, ndone = 0; 2525 2526 if (IS_2100(isp)) { 2527 i = 0; 2528 do { 2529 isr = ISP_READ(isp, BIU_ISR); 2530 junk = ISP_READ(isp, BIU_ISR); 2531 } while (isr != junk && ++i < 1000); 2532 if (isr != junk) { 2533 isp_prt(isp, ISP_LOGWARN, 2534 "isr unsteady (%x, %x)", isr, junk); 2535 } 2536 i = 0; 2537 do { 2538 sema = ISP_READ(isp, BIU_SEMA); 2539 junk = ISP_READ(isp, BIU_SEMA); 2540 } while (sema != junk && ++i < 1000); 2541 if (sema != junk) { 2542 isp_prt(isp, ISP_LOGWARN, 2543 "sema unsteady (%x, %x)", sema, junk); 2544 } 2545 } else { 2546 isr = ISP_READ(isp, BIU_ISR); 2547 sema = ISP_READ(isp, BIU_SEMA); 2548 } 2549 isp_prt(isp, ISP_LOGDEBUG3, "isp_intr isr %x sem %x", isr, sema); 2550 isr &= INT_PENDING_MASK(isp); 2551 sema &= BIU_SEMA_LOCK; 2552 isp->isp_intcnt++; 2553 if (isr == 0 && sema == 0) { 2554 isp->isp_intbogus++; 2555 return (0); 2556 } 2557 2558 if (sema) { 2559 u_int16_t mbox; 2560 2561 if (IS_2100(isp)) { 2562 i = 0; 2563 do { 2564 mbox = ISP_READ(isp, OUTMAILBOX0); 2565 junk = ISP_READ(isp, OUTMAILBOX0);; 2566 } while (junk != mbox && ++i < 1000); 2567 if (mbox != junk) { 2568 isp_prt(isp, ISP_LOGWARN, 2569 "mailbox0 unsteady (%x, %x)", mbox, junk); 2570 ISP_WRITE(isp, BIU_SEMA, 0); 2571 ISP_WRITE(isp, HCCR, HCCR_CMD_CLEAR_RISC_INT); 2572 return (1); 2573 } 2574 } else { 2575 mbox = ISP_READ(isp, OUTMAILBOX0); 2576 } 2577 if (mbox & 0x4000) { 2578 int obits, i = 0; 2579 if ((obits = isp->isp_mboxbsy) != 0) { 2580 isp->isp_mboxtmp[i++] = mbox; 2581 for (i = 1; i < MAX_MAILBOX; i++) { 2582 if ((obits & (1 << i)) == 0) { 2583 continue; 2584 } 2585 isp->isp_mboxtmp[i] = 2586 ISP_READ(isp, MBOX_OFF(i)); 2587 } 2588 MBOX_NOTIFY_COMPLETE(isp); 2589 } else { 2590 isp_prt(isp, ISP_LOGWARN, 2591 "Mbox Command Async (0x%x) with no waiters", 2592 mbox); 2593 } 2594 } else { 2595 u_int32_t fhandle = isp_parse_async(isp, (int) mbox); 2596 isp_prt(isp, ISP_LOGDEBUG2, "Async Mbox 0x%x", mbox); 2597 if (fhandle > 0) { 2598 isp_fastpost_complete(isp, fhandle); 2599 } 2600 } 2601 if (IS_FC(isp) || isp->isp_state != ISP_RUNSTATE) { 2602 ISP_WRITE(isp, BIU_SEMA, 0); 2603 ISP_WRITE(isp, HCCR, HCCR_CMD_CLEAR_RISC_INT); 2604 return (1); 2605 } 2606 } 2607 2608 /* 2609 * We can't be getting this now. 2610 */ 2611 if (isp->isp_state != ISP_RUNSTATE) { 2612 isp_prt(isp, ISP_LOGWARN, 2613 "interrupt (isr=%x, sema=%x) when not ready", isr, sema); 2614 ISP_WRITE(isp, INMAILBOX5, ISP_READ(isp, OUTMAILBOX5)); 2615 ISP_WRITE(isp, HCCR, HCCR_CMD_CLEAR_RISC_INT); 2616 ISP_WRITE(isp, BIU_SEMA, 0); 2617 return (1); 2618 } 2619 2620 /* 2621 * You *must* read OUTMAILBOX5 prior to clearing the RISC interrupt. 2622 */ 2623 optr = isp->isp_residx; 2624 2625 if (IS_2100(isp)) { 2626 i = 0; 2627 do { 2628 iptr = ISP_READ(isp, OUTMAILBOX5); 2629 junk = ISP_READ(isp, OUTMAILBOX5); 2630 } while (junk != iptr && ++i < 1000); 2631 2632 if (iptr != junk) { 2633 ISP_WRITE(isp, HCCR, HCCR_CMD_CLEAR_RISC_INT); 2634 isp_prt(isp, ISP_LOGWARN, 2635 "mailbox5 unsteady (%x, %x)", iptr, junk); 2636 return (1); 2637 } 2638 } else { 2639 iptr = ISP_READ(isp, OUTMAILBOX5); 2640 } 2641 2642 if (sema) { 2643 ISP_WRITE(isp, BIU_SEMA, 0); 2644 } 2645 ISP_WRITE(isp, HCCR, HCCR_CMD_CLEAR_RISC_INT); 2646 2647 if (optr == iptr && sema == 0) { 2648 /* 2649 * There are a lot of these- reasons unknown- mostly on 2650 * faster Alpha machines. 2651 * 2652 * I tried delaying after writing HCCR_CMD_CLEAR_RISC_INT to 2653 * make sure the old interrupt went away (to avoid 'ringing' 2654 * effects), but that didn't stop this from occurring. 2655 */ 2656 junk = ISP_READ(isp, BIU_ISR); 2657 isp_prt(isp, ISP_LOGDEBUG2, 2658 "bogus intr- isr %x (%x) iptr %x optr %x", 2659 isr, junk, iptr, optr); 2660 } 2661 2662 while (optr != iptr) { 2663 ispstatusreq_t *sp; 2664 u_int16_t oop; 2665 int buddaboom = 0; 2666 2667 sp = (ispstatusreq_t *) ISP_QUEUE_ENTRY(isp->isp_result, optr); 2668 oop = optr; 2669 optr = ISP_NXT_QENTRY(optr, RESULT_QUEUE_LEN(isp)); 2670 nlooked++; 2671 /* 2672 * Do any appropriate unswizzling of what the Qlogic f/w has 2673 * written into memory so it makes sense to us. This is a 2674 * per-platform thing. Also includes any memory barriers. 2675 */ 2676 ISP_UNSWIZZLE_RESPONSE(isp, sp, oop); 2677 if (sp->req_header.rqs_entry_type != RQSTYPE_RESPONSE) { 2678 if (isp_handle_other_response(isp, sp, &optr) == 0) { 2679 MEMZERO(sp, sizeof (isphdr_t)); 2680 continue; 2681 } 2682 /* 2683 * It really has to be a bounced request just copied 2684 * from the request queue to the response queue. If 2685 * not, something bad has happened. 2686 */ 2687 if (sp->req_header.rqs_entry_type != RQSTYPE_REQUEST) { 2688 isp_prt(isp, ISP_LOGERR, notresp, 2689 sp->req_header.rqs_entry_type, oop, optr, 2690 nlooked); 2691 if (isp->isp_dblev & ISP_LOGDEBUG0) { 2692 isp_print_bytes(isp, "Queue Entry", 2693 QENTRY_LEN, sp); 2694 } 2695 MEMZERO(sp, sizeof (isphdr_t)); 2696 continue; 2697 } 2698 buddaboom = 1; 2699 } 2700 2701 if (sp->req_header.rqs_flags & 0xf) { 2702 #define _RQS_OFLAGS \ 2703 ~(RQSFLAG_CONTINUATION|RQSFLAG_FULL|RQSFLAG_BADHEADER|RQSFLAG_BADPACKET) 2704 if (sp->req_header.rqs_flags & RQSFLAG_CONTINUATION) { 2705 isp_prt(isp, ISP_LOGWARN, 2706 "continuation segment"); 2707 ISP_WRITE(isp, INMAILBOX5, optr); 2708 continue; 2709 } 2710 if (sp->req_header.rqs_flags & RQSFLAG_FULL) { 2711 isp_prt(isp, ISP_LOGDEBUG1, 2712 "internal queues full"); 2713 /* 2714 * We'll synthesize a QUEUE FULL message below. 2715 */ 2716 } 2717 if (sp->req_header.rqs_flags & RQSFLAG_BADHEADER) { 2718 isp_prt(isp, ISP_LOGERR, "bad header flag"); 2719 buddaboom++; 2720 } 2721 if (sp->req_header.rqs_flags & RQSFLAG_BADPACKET) { 2722 isp_prt(isp, ISP_LOGERR, "bad request packet"); 2723 buddaboom++; 2724 } 2725 if (sp->req_header.rqs_flags & _RQS_OFLAGS) { 2726 isp_prt(isp, ISP_LOGERR, 2727 "unknown flags (0x%x) in response", 2728 sp->req_header.rqs_flags); 2729 buddaboom++; 2730 } 2731 #undef _RQS_OFLAGS 2732 } 2733 if (sp->req_handle > isp->isp_maxcmds || sp->req_handle < 1) { 2734 MEMZERO(sp, sizeof (isphdr_t)); 2735 isp_prt(isp, ISP_LOGERR, 2736 "bad request handle %d", sp->req_handle); 2737 ISP_WRITE(isp, INMAILBOX5, optr); 2738 continue; 2739 } 2740 xs = isp_find_xs(isp, sp->req_handle); 2741 if (xs == NULL) { 2742 MEMZERO(sp, sizeof (isphdr_t)); 2743 isp_prt(isp, ISP_LOGERR, 2744 "cannot find handle 0x%x in xflist", 2745 sp->req_handle); 2746 ISP_WRITE(isp, INMAILBOX5, optr); 2747 continue; 2748 } 2749 isp_destroy_handle(isp, sp->req_handle); 2750 if (sp->req_status_flags & RQSTF_BUS_RESET) { 2751 isp->isp_sendmarker |= (1 << XS_CHANNEL(xs)); 2752 } 2753 if (buddaboom) { 2754 XS_SETERR(xs, HBA_BOTCH); 2755 } 2756 2757 if (IS_FC(isp) && (sp->req_scsi_status & RQCS_SV)) { 2758 /* 2759 * Fibre Channel F/W doesn't say we got status 2760 * if there's Sense Data instead. I guess they 2761 * think it goes w/o saying. 2762 */ 2763 sp->req_state_flags |= RQSF_GOT_STATUS; 2764 } 2765 if (sp->req_state_flags & RQSF_GOT_STATUS) { 2766 *XS_STSP(xs) = sp->req_scsi_status & 0xff; 2767 } 2768 2769 switch (sp->req_header.rqs_entry_type) { 2770 case RQSTYPE_RESPONSE: 2771 XS_SET_STATE_STAT(isp, xs, sp); 2772 isp_parse_status(isp, sp, xs); 2773 if ((XS_NOERR(xs) || XS_ERR(xs) == HBA_NOERROR) && 2774 (*XS_STSP(xs) == SCSI_BUSY)) { 2775 XS_SETERR(xs, HBA_TGTBSY); 2776 } 2777 if (IS_SCSI(isp)) { 2778 XS_RESID(xs) = sp->req_resid; 2779 if ((sp->req_state_flags & RQSF_GOT_STATUS) && 2780 (*XS_STSP(xs) == SCSI_CHECK) && 2781 (sp->req_state_flags & RQSF_GOT_SENSE)) { 2782 XS_SAVE_SENSE(xs, sp); 2783 } 2784 /* 2785 * A new synchronous rate was negotiated for 2786 * this target. Mark state such that we'll go 2787 * look up that which has changed later. 2788 */ 2789 if (sp->req_status_flags & RQSTF_NEGOTIATION) { 2790 int t = XS_TGT(xs); 2791 sdparam *sdp = isp->isp_param; 2792 sdp += XS_CHANNEL(xs); 2793 sdp->isp_devparam[t].dev_refresh = 1; 2794 isp->isp_update |= 2795 (1 << XS_CHANNEL(xs)); 2796 } 2797 } else { 2798 if (sp->req_status_flags & RQSF_XFER_COMPLETE) { 2799 XS_RESID(xs) = 0; 2800 } else if (sp->req_scsi_status & RQCS_RESID) { 2801 XS_RESID(xs) = sp->req_resid; 2802 } else { 2803 XS_RESID(xs) = 0; 2804 } 2805 if ((sp->req_state_flags & RQSF_GOT_STATUS) && 2806 (*XS_STSP(xs) == SCSI_CHECK) && 2807 (sp->req_scsi_status & RQCS_SV)) { 2808 XS_SAVE_SENSE(xs, sp); 2809 } 2810 } 2811 isp_prt(isp, ISP_LOGDEBUG2, "asked for %d got resid %d", 2812 XS_XFRLEN(xs), sp->req_resid); 2813 break; 2814 case RQSTYPE_REQUEST: 2815 if (sp->req_header.rqs_flags & RQSFLAG_FULL) { 2816 /* 2817 * Force Queue Full status. 2818 */ 2819 *XS_STSP(xs) = SCSI_QFULL; 2820 XS_SETERR(xs, HBA_NOERROR); 2821 } else if (XS_NOERR(xs)) { 2822 XS_SETERR(xs, HBA_BOTCH); 2823 } 2824 XS_RESID(xs) = XS_XFRLEN(xs); 2825 break; 2826 default: 2827 isp_prt(isp, ISP_LOGWARN, 2828 "unhandled respose queue type 0x%x", 2829 sp->req_header.rqs_entry_type); 2830 if (XS_NOERR(xs)) { 2831 XS_SETERR(xs, HBA_BOTCH); 2832 } 2833 break; 2834 } 2835 2836 /* 2837 * Free any dma resources. As a side effect, this may 2838 * also do any cache flushing necessary for data coherence. */ 2839 if (XS_XFRLEN(xs)) { 2840 ISP_DMAFREE(isp, xs, sp->req_handle); 2841 } 2842 2843 if (((isp->isp_dblev & (ISP_LOGDEBUG2|ISP_LOGDEBUG3))) || 2844 ((isp->isp_dblev & ISP_LOGDEBUG1) && !XS_NOERR(xs))) { 2845 char skey; 2846 if (sp->req_state_flags & RQSF_GOT_SENSE) { 2847 skey = XS_SNSKEY(xs) & 0xf; 2848 if (skey < 10) 2849 skey += '0'; 2850 else 2851 skey += 'a'; 2852 } else if (*XS_STSP(xs) == SCSI_CHECK) { 2853 skey = '?'; 2854 } else { 2855 skey = '.'; 2856 } 2857 isp_prt(isp, ISP_LOGALL, finmsg, XS_CHANNEL(xs), 2858 XS_TGT(xs), XS_LUN(xs), XS_XFRLEN(xs), XS_RESID(xs), 2859 *XS_STSP(xs), skey, XS_ERR(xs)); 2860 } 2861 2862 if (isp->isp_nactive > 0) 2863 isp->isp_nactive--; 2864 complist[ndone++] = xs; /* defer completion call until later */ 2865 MEMZERO(sp, sizeof (isphdr_t)); 2866 if (ndone == MAX_REQUESTQ_COMPLETIONS) { 2867 break; 2868 } 2869 } 2870 2871 /* 2872 * If we looked at any commands, then it's valid to find out 2873 * what the outpointer is. It also is a trigger to update the 2874 * ISP's notion of what we've seen so far. 2875 */ 2876 if (nlooked) { 2877 ISP_WRITE(isp, INMAILBOX5, optr); 2878 isp->isp_reqodx = ISP_READ(isp, OUTMAILBOX4); 2879 } 2880 2881 isp->isp_residx = optr; 2882 for (i = 0; i < ndone; i++) { 2883 xs = complist[i]; 2884 if (xs) { 2885 isp_done(xs); 2886 } 2887 } 2888 return (1); 2889 } 2890 2891 /* 2892 * Support routines. 2893 */ 2894 2895 static int 2896 isp_parse_async(isp, mbox) 2897 struct ispsoftc *isp; 2898 int mbox; 2899 { 2900 int bus; 2901 u_int32_t fast_post_handle = 0; 2902 2903 if (IS_DUALBUS(isp)) { 2904 bus = ISP_READ(isp, OUTMAILBOX6); 2905 } else { 2906 bus = 0; 2907 } 2908 2909 switch (mbox) { 2910 case ASYNC_BUS_RESET: 2911 isp->isp_sendmarker |= (1 << bus); 2912 #ifdef ISP_TARGET_MODE 2913 isp_target_async(isp, bus, mbox); 2914 #endif 2915 isp_async(isp, ISPASYNC_BUS_RESET, &bus); 2916 break; 2917 case ASYNC_SYSTEM_ERROR: 2918 mbox = ISP_READ(isp, OUTMAILBOX1); 2919 isp_prt(isp, ISP_LOGERR, 2920 "Internal FW Error @ RISC Addr 0x%x", mbox); 2921 isp_reinit(isp); 2922 #ifdef ISP_TARGET_MODE 2923 isp_target_async(isp, bus, mbox); 2924 #endif 2925 /* no point continuing after this */ 2926 return (-1); 2927 2928 case ASYNC_RQS_XFER_ERR: 2929 isp_prt(isp, ISP_LOGERR, "Request Queue Transfer Error"); 2930 break; 2931 2932 case ASYNC_RSP_XFER_ERR: 2933 isp_prt(isp, ISP_LOGERR, "Response Queue Transfer Error"); 2934 break; 2935 2936 case ASYNC_QWAKEUP: 2937 /* 2938 * We've just been notified that the Queue has woken up. 2939 * We don't need to be chatty about this- just unlatch things 2940 * and move on. 2941 */ 2942 mbox = ISP_READ(isp, OUTMAILBOX4); 2943 break; 2944 2945 case ASYNC_TIMEOUT_RESET: 2946 isp_prt(isp, ISP_LOGWARN, 2947 "timeout initiated SCSI bus reset of bus %d\n", bus); 2948 isp->isp_sendmarker |= (1 << bus); 2949 #ifdef ISP_TARGET_MODE 2950 isp_target_async(isp, bus, mbox); 2951 #endif 2952 break; 2953 2954 case ASYNC_DEVICE_RESET: 2955 isp_prt(isp, ISP_LOGINFO, "device reset on bus %d", bus); 2956 isp->isp_sendmarker |= (1 << bus); 2957 #ifdef ISP_TARGET_MODE 2958 isp_target_async(isp, bus, mbox); 2959 #endif 2960 break; 2961 2962 case ASYNC_EXTMSG_UNDERRUN: 2963 isp_prt(isp, ISP_LOGWARN, "extended message underrun"); 2964 break; 2965 2966 case ASYNC_SCAM_INT: 2967 isp_prt(isp, ISP_LOGINFO, "SCAM interrupt"); 2968 break; 2969 2970 case ASYNC_HUNG_SCSI: 2971 isp_prt(isp, ISP_LOGERR, 2972 "stalled SCSI Bus after DATA Overrun"); 2973 /* XXX: Need to issue SCSI reset at this point */ 2974 break; 2975 2976 case ASYNC_KILLED_BUS: 2977 isp_prt(isp, ISP_LOGERR, "SCSI Bus reset after DATA Overrun"); 2978 break; 2979 2980 case ASYNC_BUS_TRANSIT: 2981 mbox = ISP_READ(isp, OUTMAILBOX2); 2982 switch (mbox & 0x1c00) { 2983 case SXP_PINS_LVD_MODE: 2984 isp_prt(isp, ISP_LOGINFO, "Transition to LVD mode"); 2985 SDPARAM(isp)->isp_diffmode = 0; 2986 SDPARAM(isp)->isp_ultramode = 0; 2987 SDPARAM(isp)->isp_lvdmode = 1; 2988 break; 2989 case SXP_PINS_HVD_MODE: 2990 isp_prt(isp, ISP_LOGINFO, 2991 "Transition to Differential mode"); 2992 SDPARAM(isp)->isp_diffmode = 1; 2993 SDPARAM(isp)->isp_ultramode = 0; 2994 SDPARAM(isp)->isp_lvdmode = 0; 2995 break; 2996 case SXP_PINS_SE_MODE: 2997 isp_prt(isp, ISP_LOGINFO, 2998 "Transition to Single Ended mode"); 2999 SDPARAM(isp)->isp_diffmode = 0; 3000 SDPARAM(isp)->isp_ultramode = 1; 3001 SDPARAM(isp)->isp_lvdmode = 0; 3002 break; 3003 default: 3004 isp_prt(isp, ISP_LOGWARN, 3005 "Transition to Unknown Mode 0x%x", mbox); 3006 break; 3007 } 3008 /* 3009 * XXX: Set up to renegotiate again! 3010 */ 3011 /* Can only be for a 1080... */ 3012 isp->isp_sendmarker |= (1 << bus); 3013 break; 3014 3015 case ASYNC_CMD_CMPLT: 3016 fast_post_handle = (ISP_READ(isp, OUTMAILBOX2) << 16) | 3017 ISP_READ(isp, OUTMAILBOX1); 3018 isp_prt(isp, ISP_LOGDEBUG3, "fast post completion of %u", 3019 fast_post_handle); 3020 break; 3021 3022 case ASYNC_CTIO_DONE: 3023 #ifdef ISP_TARGET_MODE 3024 /* 3025 * Bus gets overloaded with the handle. Dual bus 3026 * cards don't put bus# into the handle. 3027 */ 3028 bus = (ISP_READ(isp, OUTMAILBOX2) << 16) | 3029 ISP_READ(isp, OUTMAILBOX1); 3030 isp_target_async(isp, bus, mbox); 3031 #else 3032 isp_prt(isp, ISP_LOGINFO, "Fast Posting CTIO done"); 3033 #endif 3034 break; 3035 3036 case ASYNC_LIP_OCCURRED: 3037 FCPARAM(isp)->isp_lipseq = 3038 ISP_READ(isp, OUTMAILBOX1); 3039 FCPARAM(isp)->isp_fwstate = FW_CONFIG_WAIT; 3040 FCPARAM(isp)->isp_loopstate = LOOP_LIP_RCVD; 3041 isp->isp_sendmarker = 1; 3042 isp_mark_getpdb_all(isp); 3043 isp_prt(isp, ISP_LOGINFO, "LIP occurred"); 3044 #ifdef ISP_TARGET_MODE 3045 isp_target_async(isp, bus, mbox); 3046 #endif 3047 break; 3048 3049 case ASYNC_LOOP_UP: 3050 isp->isp_sendmarker = 1; 3051 FCPARAM(isp)->isp_fwstate = FW_CONFIG_WAIT; 3052 FCPARAM(isp)->isp_loopstate = LOOP_LIP_RCVD; 3053 isp_mark_getpdb_all(isp); 3054 isp_async(isp, ISPASYNC_LOOP_UP, NULL); 3055 #ifdef ISP_TARGET_MODE 3056 isp_target_async(isp, bus, mbox); 3057 #endif 3058 break; 3059 3060 case ASYNC_LOOP_DOWN: 3061 isp->isp_sendmarker = 1; 3062 FCPARAM(isp)->isp_fwstate = FW_CONFIG_WAIT; 3063 FCPARAM(isp)->isp_loopstate = LOOP_NIL; 3064 isp_mark_getpdb_all(isp); 3065 isp_async(isp, ISPASYNC_LOOP_DOWN, NULL); 3066 #ifdef ISP_TARGET_MODE 3067 isp_target_async(isp, bus, mbox); 3068 #endif 3069 break; 3070 3071 case ASYNC_LOOP_RESET: 3072 isp->isp_sendmarker = 1; 3073 FCPARAM(isp)->isp_fwstate = FW_CONFIG_WAIT; 3074 FCPARAM(isp)->isp_loopstate = LOOP_NIL; 3075 isp_mark_getpdb_all(isp); 3076 isp_prt(isp, ISP_LOGINFO, "Loop RESET"); 3077 #ifdef ISP_TARGET_MODE 3078 isp_target_async(isp, bus, mbox); 3079 #endif 3080 break; 3081 3082 case ASYNC_PDB_CHANGED: 3083 isp->isp_sendmarker = 1; 3084 FCPARAM(isp)->isp_loopstate = LOOP_PDB_RCVD; 3085 isp_mark_getpdb_all(isp); 3086 isp_async(isp, ISPASYNC_CHANGE_NOTIFY, (void *) 0); 3087 break; 3088 3089 case ASYNC_CHANGE_NOTIFY: 3090 /* 3091 * Not correct, but it will force us to rescan the loop. 3092 */ 3093 FCPARAM(isp)->isp_loopstate = LOOP_PDB_RCVD; 3094 isp_mark_getpdb_all(isp); 3095 isp_async(isp, ISPASYNC_CHANGE_NOTIFY, (void *) 1); 3096 break; 3097 3098 case ASYNC_PTPMODE: 3099 if (FCPARAM(isp)->isp_onfabric) 3100 FCPARAM(isp)->isp_topo = TOPO_N_PORT; 3101 else 3102 FCPARAM(isp)->isp_topo = TOPO_F_PORT; 3103 isp_mark_getpdb_all(isp); 3104 isp->isp_sendmarker = 1; 3105 FCPARAM(isp)->isp_fwstate = FW_CONFIG_WAIT; 3106 FCPARAM(isp)->isp_loopstate = LOOP_LIP_RCVD; 3107 #ifdef ISP_TARGET_MODE 3108 isp_target_async(isp, bus, mbox); 3109 #endif 3110 isp_prt(isp, ISP_LOGINFO, "Point-to-Point mode"); 3111 break; 3112 3113 case ASYNC_CONNMODE: 3114 mbox = ISP_READ(isp, OUTMAILBOX1); 3115 switch (mbox) { 3116 case ISP_CONN_LOOP: 3117 isp_prt(isp, ISP_LOGINFO, "Point-to-Point->Loop mode"); 3118 break; 3119 case ISP_CONN_PTP: 3120 isp_prt(isp, ISP_LOGINFO, "Loop->Point-to-Point mode"); 3121 break; 3122 case ISP_CONN_BADLIP: 3123 isp_prt(isp, ISP_LOGWARN, 3124 "Point-to-Point->Loop mode (1)"); 3125 break; 3126 case ISP_CONN_FATAL: 3127 isp_prt(isp, ISP_LOGERR, "FATAL CONNECTION ERROR"); 3128 isp_reinit(isp); 3129 #ifdef ISP_TARGET_MODE 3130 isp_target_async(isp, bus, ASYNC_SYSTEM_ERROR); 3131 #endif 3132 /* no point continuing after this */ 3133 return (-1); 3134 3135 case ISP_CONN_LOOPBACK: 3136 isp_prt(isp, ISP_LOGWARN, 3137 "Looped Back in Point-to-Point mode"); 3138 } 3139 break; 3140 3141 default: 3142 isp_prt(isp, ISP_LOGWARN, "Unknown Async Code 0x%x", mbox); 3143 break; 3144 } 3145 return (fast_post_handle); 3146 } 3147 3148 /* 3149 * Handle other response entries. A pointer to the request queue output 3150 * index is here in case we want to eat several entries at once, although 3151 * this is not used currently. 3152 */ 3153 3154 static int 3155 isp_handle_other_response(isp, sp, optrp) 3156 struct ispsoftc *isp; 3157 ispstatusreq_t *sp; 3158 u_int16_t *optrp; 3159 { 3160 switch (sp->req_header.rqs_entry_type) { 3161 case RQSTYPE_STATUS_CONT: 3162 isp_prt(isp, ISP_LOGINFO, "Ignored Continuation Response"); 3163 return (0); 3164 case RQSTYPE_ATIO: 3165 case RQSTYPE_CTIO: 3166 case RQSTYPE_ENABLE_LUN: 3167 case RQSTYPE_MODIFY_LUN: 3168 case RQSTYPE_NOTIFY: 3169 case RQSTYPE_NOTIFY_ACK: 3170 case RQSTYPE_CTIO1: 3171 case RQSTYPE_ATIO2: 3172 case RQSTYPE_CTIO2: 3173 case RQSTYPE_CTIO3: 3174 #ifdef ISP_TARGET_MODE 3175 return (isp_target_notify(isp, sp, optrp)); 3176 #else 3177 optrp = optrp; 3178 /* FALLTHROUGH */ 3179 #endif 3180 case RQSTYPE_REQUEST: 3181 default: 3182 isp_prt(isp, ISP_LOGWARN, "Unhandled Response Type 0x%x", 3183 sp->req_header.rqs_entry_type); 3184 return (-1); 3185 } 3186 } 3187 3188 static void 3189 isp_parse_status(isp, sp, xs) 3190 struct ispsoftc *isp; 3191 ispstatusreq_t *sp; 3192 XS_T *xs; 3193 { 3194 switch (sp->req_completion_status & 0xff) { 3195 case RQCS_COMPLETE: 3196 if (XS_NOERR(xs)) { 3197 XS_SETERR(xs, HBA_NOERROR); 3198 } 3199 return; 3200 3201 case RQCS_INCOMPLETE: 3202 if ((sp->req_state_flags & RQSF_GOT_TARGET) == 0) { 3203 isp_prt(isp, ISP_LOGDEBUG1, 3204 "Selection Timeout for %d.%d.%d", 3205 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 3206 if (XS_NOERR(xs)) { 3207 XS_SETERR(xs, HBA_SELTIMEOUT); 3208 } 3209 return; 3210 } 3211 isp_prt(isp, ISP_LOGERR, 3212 "command incomplete for %d.%d.%d, state 0x%x", 3213 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs), 3214 sp->req_state_flags); 3215 break; 3216 3217 case RQCS_DMA_ERROR: 3218 isp_prt(isp, ISP_LOGERR, "DMA error for command on %d.%d.%d", 3219 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 3220 break; 3221 3222 case RQCS_TRANSPORT_ERROR: 3223 { 3224 char buf[172]; 3225 buf[0] = 0; 3226 STRNCAT(buf, "states=>", sizeof buf); 3227 if (sp->req_state_flags & RQSF_GOT_BUS) { 3228 STRNCAT(buf, " GOT_BUS", sizeof buf); 3229 } 3230 if (sp->req_state_flags & RQSF_GOT_TARGET) { 3231 STRNCAT(buf, " GOT_TGT", sizeof buf); 3232 } 3233 if (sp->req_state_flags & RQSF_SENT_CDB) { 3234 STRNCAT(buf, " SENT_CDB", sizeof buf); 3235 } 3236 if (sp->req_state_flags & RQSF_XFRD_DATA) { 3237 STRNCAT(buf, " XFRD_DATA", sizeof buf); 3238 } 3239 if (sp->req_state_flags & RQSF_GOT_STATUS) { 3240 STRNCAT(buf, " GOT_STS", sizeof buf); 3241 } 3242 if (sp->req_state_flags & RQSF_GOT_SENSE) { 3243 STRNCAT(buf, " GOT_SNS", sizeof buf); 3244 } 3245 if (sp->req_state_flags & RQSF_XFER_COMPLETE) { 3246 STRNCAT(buf, " XFR_CMPLT", sizeof buf); 3247 } 3248 STRNCAT(buf, "\nstatus=>", sizeof buf); 3249 if (sp->req_status_flags & RQSTF_DISCONNECT) { 3250 STRNCAT(buf, " Disconnect", sizeof buf); 3251 } 3252 if (sp->req_status_flags & RQSTF_SYNCHRONOUS) { 3253 STRNCAT(buf, " Sync_xfr", sizeof buf); 3254 } 3255 if (sp->req_status_flags & RQSTF_PARITY_ERROR) { 3256 STRNCAT(buf, " Parity", sizeof buf); 3257 } 3258 if (sp->req_status_flags & RQSTF_BUS_RESET) { 3259 STRNCAT(buf, " Bus_Reset", sizeof buf); 3260 } 3261 if (sp->req_status_flags & RQSTF_DEVICE_RESET) { 3262 STRNCAT(buf, " Device_Reset", sizeof buf); 3263 } 3264 if (sp->req_status_flags & RQSTF_ABORTED) { 3265 STRNCAT(buf, " Aborted", sizeof buf); 3266 } 3267 if (sp->req_status_flags & RQSTF_TIMEOUT) { 3268 STRNCAT(buf, " Timeout", sizeof buf); 3269 } 3270 if (sp->req_status_flags & RQSTF_NEGOTIATION) { 3271 STRNCAT(buf, " Negotiation", sizeof buf); 3272 } 3273 isp_prt(isp, ISP_LOGERR, "%s", buf); 3274 isp_prt(isp, ISP_LOGERR, "transport error for %d.%d.%d:\n%s", 3275 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs), buf); 3276 break; 3277 } 3278 case RQCS_RESET_OCCURRED: 3279 isp_prt(isp, ISP_LOGWARN, 3280 "bus reset destroyed command for %d.%d.%d", 3281 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 3282 isp->isp_sendmarker |= (1 << XS_CHANNEL(xs)); 3283 if (XS_NOERR(xs)) { 3284 XS_SETERR(xs, HBA_BUSRESET); 3285 } 3286 return; 3287 3288 case RQCS_ABORTED: 3289 isp_prt(isp, ISP_LOGERR, "command aborted for %d.%d.%d", 3290 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 3291 isp->isp_sendmarker |= (1 << XS_CHANNEL(xs)); 3292 if (XS_NOERR(xs)) { 3293 XS_SETERR(xs, HBA_ABORTED); 3294 } 3295 return; 3296 3297 case RQCS_TIMEOUT: 3298 isp_prt(isp, ISP_LOGWARN, "command timed out for %d.%d.%d", 3299 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 3300 if (XS_NOERR(xs)) { 3301 XS_SETERR(xs, HBA_CMDTIMEOUT); 3302 } 3303 return; 3304 3305 case RQCS_DATA_OVERRUN: 3306 XS_RESID(xs) = sp->req_resid; 3307 isp_prt(isp, ISP_LOGERR, "data overrun for command on %d.%d.%d", 3308 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 3309 if (XS_NOERR(xs)) { 3310 XS_SETERR(xs, HBA_DATAOVR); 3311 } 3312 return; 3313 3314 case RQCS_COMMAND_OVERRUN: 3315 isp_prt(isp, ISP_LOGERR, 3316 "command overrun for command on %d.%d.%d", 3317 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 3318 break; 3319 3320 case RQCS_STATUS_OVERRUN: 3321 isp_prt(isp, ISP_LOGERR, 3322 "status overrun for command on %d.%d.%d", 3323 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 3324 break; 3325 3326 case RQCS_BAD_MESSAGE: 3327 isp_prt(isp, ISP_LOGERR, 3328 "msg not COMMAND COMPLETE after status %d.%d.%d", 3329 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 3330 break; 3331 3332 case RQCS_NO_MESSAGE_OUT: 3333 isp_prt(isp, ISP_LOGERR, 3334 "No MESSAGE OUT phase after selection on %d.%d.%d", 3335 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 3336 break; 3337 3338 case RQCS_EXT_ID_FAILED: 3339 isp_prt(isp, ISP_LOGERR, "EXTENDED IDENTIFY failed %d.%d.%d", 3340 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 3341 break; 3342 3343 case RQCS_IDE_MSG_FAILED: 3344 isp_prt(isp, ISP_LOGERR, 3345 "INITIATOR DETECTED ERROR rejected by %d.%d.%d", 3346 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 3347 break; 3348 3349 case RQCS_ABORT_MSG_FAILED: 3350 isp_prt(isp, ISP_LOGERR, "ABORT OPERATION rejected by %d.%d.%d", 3351 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 3352 break; 3353 3354 case RQCS_REJECT_MSG_FAILED: 3355 isp_prt(isp, ISP_LOGERR, "MESSAGE REJECT rejected by %d.%d.%d", 3356 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 3357 break; 3358 3359 case RQCS_NOP_MSG_FAILED: 3360 isp_prt(isp, ISP_LOGERR, "NOP rejected by %d.%d.%d", 3361 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 3362 break; 3363 3364 case RQCS_PARITY_ERROR_MSG_FAILED: 3365 isp_prt(isp, ISP_LOGERR, 3366 "MESSAGE PARITY ERROR rejected by %d.%d.%d", 3367 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 3368 break; 3369 3370 case RQCS_DEVICE_RESET_MSG_FAILED: 3371 isp_prt(isp, ISP_LOGWARN, 3372 "BUS DEVICE RESET rejected by %d.%d.%d", 3373 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 3374 break; 3375 3376 case RQCS_ID_MSG_FAILED: 3377 isp_prt(isp, ISP_LOGERR, "IDENTIFY rejected by %d.%d.%d", 3378 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 3379 break; 3380 3381 case RQCS_UNEXP_BUS_FREE: 3382 isp_prt(isp, ISP_LOGERR, "%d.%d.%d had an unexpected bus free", 3383 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 3384 break; 3385 3386 case RQCS_DATA_UNDERRUN: 3387 XS_RESID(xs) = sp->req_resid; 3388 if (XS_NOERR(xs)) { 3389 XS_SETERR(xs, HBA_NOERROR); 3390 } 3391 return; 3392 3393 case RQCS_XACT_ERR1: 3394 isp_prt(isp, ISP_LOGERR, xact1, XS_CHANNEL(xs), 3395 XS_TGT(xs), XS_LUN(xs)); 3396 break; 3397 3398 case RQCS_XACT_ERR2: 3399 isp_prt(isp, ISP_LOGERR, xact2, 3400 XS_LUN(xs), XS_TGT(xs), XS_CHANNEL(xs)); 3401 break; 3402 3403 case RQCS_XACT_ERR3: 3404 isp_prt(isp, ISP_LOGERR, xact3, XS_TGT(xs), 3405 XS_LUN(xs), XS_CHANNEL(xs)); 3406 break; 3407 3408 case RQCS_BAD_ENTRY: 3409 isp_prt(isp, ISP_LOGERR, "Invalid IOCB entry type detected"); 3410 break; 3411 3412 case RQCS_QUEUE_FULL: 3413 isp_prt(isp, ISP_LOGDEBUG1, 3414 "internal queues full for %d.%d.%d status 0x%x", XS_TGT(xs), 3415 XS_LUN(xs), XS_CHANNEL(xs), *XS_STSP(xs)); 3416 /* 3417 * If QFULL or some other status byte is set, then this 3418 * isn't an error, per se. 3419 */ 3420 if (*XS_STSP(xs) != SCSI_GOOD && XS_NOERR(xs)) { 3421 XS_SETERR(xs, HBA_NOERROR); 3422 return; 3423 } 3424 break; 3425 3426 case RQCS_PHASE_SKIPPED: 3427 isp_prt(isp, ISP_LOGERR, pskip, 3428 XS_TGT(xs), XS_LUN(xs), XS_CHANNEL(xs)); 3429 break; 3430 3431 case RQCS_ARQS_FAILED: 3432 isp_prt(isp, ISP_LOGERR, 3433 "Auto Request Sense failed for %d.%d.%d", 3434 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 3435 if (XS_NOERR(xs)) { 3436 XS_SETERR(xs, HBA_ARQFAIL); 3437 } 3438 return; 3439 3440 case RQCS_WIDE_FAILED: 3441 isp_prt(isp, ISP_LOGERR, 3442 "Wide Negotiation failed for %d.%d.%d", 3443 XS_TGT(xs), XS_LUN(xs), XS_CHANNEL(xs)); 3444 if (IS_SCSI(isp)) { 3445 sdparam *sdp = isp->isp_param; 3446 sdp += XS_CHANNEL(xs); 3447 sdp->isp_devparam[XS_TGT(xs)].dev_flags &= ~DPARM_WIDE; 3448 sdp->isp_devparam[XS_TGT(xs)].dev_update = 1; 3449 isp->isp_update |= (1 << XS_CHANNEL(xs)); 3450 } 3451 if (XS_NOERR(xs)) { 3452 XS_SETERR(xs, HBA_NOERROR); 3453 } 3454 return; 3455 3456 case RQCS_SYNCXFER_FAILED: 3457 isp_prt(isp, ISP_LOGERR, 3458 "SDTR Message failed for target %d.%d.%d", 3459 XS_TGT(xs), XS_LUN(xs), XS_CHANNEL(xs)); 3460 if (IS_SCSI(isp)) { 3461 sdparam *sdp = isp->isp_param; 3462 sdp += XS_CHANNEL(xs); 3463 sdp->isp_devparam[XS_TGT(xs)].dev_flags &= ~DPARM_SYNC; 3464 sdp->isp_devparam[XS_TGT(xs)].dev_update = 1; 3465 isp->isp_update |= (1 << XS_CHANNEL(xs)); 3466 } 3467 break; 3468 3469 case RQCS_LVD_BUSERR: 3470 isp_prt(isp, ISP_LOGERR, 3471 "Bad LVD condition while talking to %d.%d.%d", 3472 XS_TGT(xs), XS_LUN(xs), XS_CHANNEL(xs)); 3473 break; 3474 3475 case RQCS_PORT_UNAVAILABLE: 3476 /* 3477 * No such port on the loop. Moral equivalent of SELTIMEO 3478 */ 3479 isp_prt(isp, ISP_LOGINFO, 3480 "Port Unavailable for target %d", XS_TGT(xs)); 3481 if (XS_NOERR(xs)) { 3482 XS_SETERR(xs, HBA_SELTIMEOUT); 3483 } 3484 return; 3485 3486 case RQCS_PORT_LOGGED_OUT: 3487 /* 3488 * It was there (maybe)- treat as a selection timeout. 3489 */ 3490 isp_prt(isp, ISP_LOGINFO, 3491 "port logout for target %d", XS_TGT(xs)); 3492 if (XS_NOERR(xs)) { 3493 XS_SETERR(xs, HBA_SELTIMEOUT); 3494 } 3495 return; 3496 3497 case RQCS_PORT_CHANGED: 3498 isp_prt(isp, ISP_LOGWARN, 3499 "port changed for target %d", XS_TGT(xs)); 3500 if (XS_NOERR(xs)) { 3501 XS_SETERR(xs, HBA_SELTIMEOUT); 3502 } 3503 return; 3504 3505 case RQCS_PORT_BUSY: 3506 isp_prt(isp, ISP_LOGWARN, 3507 "port busy for target %d", XS_TGT(xs)); 3508 if (XS_NOERR(xs)) { 3509 XS_SETERR(xs, HBA_TGTBSY); 3510 } 3511 return; 3512 3513 default: 3514 isp_prt(isp, ISP_LOGERR, "Unknown Completion Status 0x%x", 3515 sp->req_completion_status); 3516 break; 3517 } 3518 if (XS_NOERR(xs)) { 3519 XS_SETERR(xs, HBA_BOTCH); 3520 } 3521 } 3522 3523 static void 3524 isp_fastpost_complete(isp, fph) 3525 struct ispsoftc *isp; 3526 u_int32_t fph; 3527 { 3528 XS_T *xs; 3529 3530 if (fph < 1) { 3531 return; 3532 } 3533 xs = isp_find_xs(isp, fph); 3534 if (xs == NULL) { 3535 isp_prt(isp, ISP_LOGWARN, 3536 "Command for fast post handle 0x%x not found", fph); 3537 return; 3538 } 3539 isp_destroy_handle(isp, fph); 3540 3541 /* 3542 * Since we don't have a result queue entry item, 3543 * we must believe that SCSI status is zero and 3544 * that all data transferred. 3545 */ 3546 XS_SET_STATE_STAT(isp, xs, NULL); 3547 XS_RESID(xs) = 0; 3548 *XS_STSP(xs) = SCSI_GOOD; 3549 if (XS_XFRLEN(xs)) { 3550 ISP_DMAFREE(isp, xs, fph); 3551 } 3552 if (isp->isp_nactive) 3553 isp->isp_nactive--; 3554 isp_done(xs); 3555 } 3556 3557 #define HIBYT(x) ((x) >> 0x8) 3558 #define LOBYT(x) ((x) & 0xff) 3559 #define ISPOPMAP(a, b) (((a) << 8) | (b)) 3560 static u_int16_t mbpscsi[] = { 3561 ISPOPMAP(0x01, 0x01), /* 0x00: MBOX_NO_OP */ 3562 ISPOPMAP(0x1f, 0x01), /* 0x01: MBOX_LOAD_RAM */ 3563 ISPOPMAP(0x03, 0x01), /* 0x02: MBOX_EXEC_FIRMWARE */ 3564 ISPOPMAP(0x1f, 0x01), /* 0x03: MBOX_DUMP_RAM */ 3565 ISPOPMAP(0x07, 0x07), /* 0x04: MBOX_WRITE_RAM_WORD */ 3566 ISPOPMAP(0x03, 0x07), /* 0x05: MBOX_READ_RAM_WORD */ 3567 ISPOPMAP(0x3f, 0x3f), /* 0x06: MBOX_MAILBOX_REG_TEST */ 3568 ISPOPMAP(0x03, 0x07), /* 0x07: MBOX_VERIFY_CHECKSUM */ 3569 ISPOPMAP(0x01, 0x0f), /* 0x08: MBOX_ABOUT_FIRMWARE */ 3570 ISPOPMAP(0x00, 0x00), /* 0x09: */ 3571 ISPOPMAP(0x00, 0x00), /* 0x0a: */ 3572 ISPOPMAP(0x00, 0x00), /* 0x0b: */ 3573 ISPOPMAP(0x00, 0x00), /* 0x0c: */ 3574 ISPOPMAP(0x00, 0x00), /* 0x0d: */ 3575 ISPOPMAP(0x01, 0x05), /* 0x0e: MBOX_CHECK_FIRMWARE */ 3576 ISPOPMAP(0x00, 0x00), /* 0x0f: */ 3577 ISPOPMAP(0x1f, 0x1f), /* 0x10: MBOX_INIT_REQ_QUEUE */ 3578 ISPOPMAP(0x3f, 0x3f), /* 0x11: MBOX_INIT_RES_QUEUE */ 3579 ISPOPMAP(0x0f, 0x0f), /* 0x12: MBOX_EXECUTE_IOCB */ 3580 ISPOPMAP(0x03, 0x03), /* 0x13: MBOX_WAKE_UP */ 3581 ISPOPMAP(0x01, 0x3f), /* 0x14: MBOX_STOP_FIRMWARE */ 3582 ISPOPMAP(0x0f, 0x0f), /* 0x15: MBOX_ABORT */ 3583 ISPOPMAP(0x03, 0x03), /* 0x16: MBOX_ABORT_DEVICE */ 3584 ISPOPMAP(0x07, 0x07), /* 0x17: MBOX_ABORT_TARGET */ 3585 ISPOPMAP(0x07, 0x07), /* 0x18: MBOX_BUS_RESET */ 3586 ISPOPMAP(0x03, 0x07), /* 0x19: MBOX_STOP_QUEUE */ 3587 ISPOPMAP(0x03, 0x07), /* 0x1a: MBOX_START_QUEUE */ 3588 ISPOPMAP(0x03, 0x07), /* 0x1b: MBOX_SINGLE_STEP_QUEUE */ 3589 ISPOPMAP(0x03, 0x07), /* 0x1c: MBOX_ABORT_QUEUE */ 3590 ISPOPMAP(0x03, 0x4f), /* 0x1d: MBOX_GET_DEV_QUEUE_STATUS */ 3591 ISPOPMAP(0x00, 0x00), /* 0x1e: */ 3592 ISPOPMAP(0x01, 0x07), /* 0x1f: MBOX_GET_FIRMWARE_STATUS */ 3593 ISPOPMAP(0x01, 0x07), /* 0x20: MBOX_GET_INIT_SCSI_ID */ 3594 ISPOPMAP(0x01, 0x07), /* 0x21: MBOX_GET_SELECT_TIMEOUT */ 3595 ISPOPMAP(0x01, 0xc7), /* 0x22: MBOX_GET_RETRY_COUNT */ 3596 ISPOPMAP(0x01, 0x07), /* 0x23: MBOX_GET_TAG_AGE_LIMIT */ 3597 ISPOPMAP(0x01, 0x03), /* 0x24: MBOX_GET_CLOCK_RATE */ 3598 ISPOPMAP(0x01, 0x07), /* 0x25: MBOX_GET_ACT_NEG_STATE */ 3599 ISPOPMAP(0x01, 0x07), /* 0x26: MBOX_GET_ASYNC_DATA_SETUP_TIME */ 3600 ISPOPMAP(0x01, 0x07), /* 0x27: MBOX_GET_PCI_PARAMS */ 3601 ISPOPMAP(0x03, 0x4f), /* 0x28: MBOX_GET_TARGET_PARAMS */ 3602 ISPOPMAP(0x03, 0x0f), /* 0x29: MBOX_GET_DEV_QUEUE_PARAMS */ 3603 ISPOPMAP(0x01, 0x07), /* 0x2a: MBOX_GET_RESET_DELAY_PARAMS */ 3604 ISPOPMAP(0x00, 0x00), /* 0x2b: */ 3605 ISPOPMAP(0x00, 0x00), /* 0x2c: */ 3606 ISPOPMAP(0x00, 0x00), /* 0x2d: */ 3607 ISPOPMAP(0x00, 0x00), /* 0x2e: */ 3608 ISPOPMAP(0x00, 0x00), /* 0x2f: */ 3609 ISPOPMAP(0x03, 0x03), /* 0x30: MBOX_SET_INIT_SCSI_ID */ 3610 ISPOPMAP(0x07, 0x07), /* 0x31: MBOX_SET_SELECT_TIMEOUT */ 3611 ISPOPMAP(0xc7, 0xc7), /* 0x32: MBOX_SET_RETRY_COUNT */ 3612 ISPOPMAP(0x07, 0x07), /* 0x33: MBOX_SET_TAG_AGE_LIMIT */ 3613 ISPOPMAP(0x03, 0x03), /* 0x34: MBOX_SET_CLOCK_RATE */ 3614 ISPOPMAP(0x07, 0x07), /* 0x35: MBOX_SET_ACT_NEG_STATE */ 3615 ISPOPMAP(0x07, 0x07), /* 0x36: MBOX_SET_ASYNC_DATA_SETUP_TIME */ 3616 ISPOPMAP(0x07, 0x07), /* 0x37: MBOX_SET_PCI_CONTROL_PARAMS */ 3617 ISPOPMAP(0x4f, 0x4f), /* 0x38: MBOX_SET_TARGET_PARAMS */ 3618 ISPOPMAP(0x0f, 0x0f), /* 0x39: MBOX_SET_DEV_QUEUE_PARAMS */ 3619 ISPOPMAP(0x07, 0x07), /* 0x3a: MBOX_SET_RESET_DELAY_PARAMS */ 3620 ISPOPMAP(0x00, 0x00), /* 0x3b: */ 3621 ISPOPMAP(0x00, 0x00), /* 0x3c: */ 3622 ISPOPMAP(0x00, 0x00), /* 0x3d: */ 3623 ISPOPMAP(0x00, 0x00), /* 0x3e: */ 3624 ISPOPMAP(0x00, 0x00), /* 0x3f: */ 3625 ISPOPMAP(0x01, 0x03), /* 0x40: MBOX_RETURN_BIOS_BLOCK_ADDR */ 3626 ISPOPMAP(0x3f, 0x01), /* 0x41: MBOX_WRITE_FOUR_RAM_WORDS */ 3627 ISPOPMAP(0x03, 0x07), /* 0x42: MBOX_EXEC_BIOS_IOCB */ 3628 ISPOPMAP(0x00, 0x00), /* 0x43: */ 3629 ISPOPMAP(0x00, 0x00), /* 0x44: */ 3630 ISPOPMAP(0x03, 0x03), /* 0x45: SET SYSTEM PARAMETER */ 3631 ISPOPMAP(0x01, 0x03), /* 0x46: GET SYSTEM PARAMETER */ 3632 ISPOPMAP(0x00, 0x00), /* 0x47: */ 3633 ISPOPMAP(0x01, 0xcf), /* 0x48: GET SCAM CONFIGURATION */ 3634 ISPOPMAP(0xcf, 0xcf), /* 0x49: SET SCAM CONFIGURATION */ 3635 ISPOPMAP(0x03, 0x03), /* 0x4a: MBOX_SET_FIRMWARE_FEATURES */ 3636 ISPOPMAP(0x01, 0x03), /* 0x4b: MBOX_GET_FIRMWARE_FEATURES */ 3637 ISPOPMAP(0x00, 0x00), /* 0x4c: */ 3638 ISPOPMAP(0x00, 0x00), /* 0x4d: */ 3639 ISPOPMAP(0x00, 0x00), /* 0x4e: */ 3640 ISPOPMAP(0x00, 0x00), /* 0x4f: */ 3641 ISPOPMAP(0xdf, 0xdf), /* 0x50: LOAD RAM A64 */ 3642 ISPOPMAP(0xdf, 0xdf), /* 0x51: DUMP RAM A64 */ 3643 ISPOPMAP(0xdf, 0xdf), /* 0x52: INITIALIZE REQUEST QUEUE A64 */ 3644 ISPOPMAP(0xff, 0xff), /* 0x53: INITIALIZE RESPONSE QUEUE A64 */ 3645 ISPOPMAP(0xcf, 0xff), /* 0x54: EXECUTE IOCB A64 */ 3646 ISPOPMAP(0x03, 0x01), /* 0x55: ENABLE TARGET MODE */ 3647 ISPOPMAP(0x00, 0x00), /* 0x56: */ 3648 ISPOPMAP(0x00, 0x00), /* 0x57: */ 3649 ISPOPMAP(0x00, 0x00), /* 0x58: */ 3650 ISPOPMAP(0x00, 0x00), /* 0x59: */ 3651 ISPOPMAP(0x03, 0x03), /* 0x5a: SET DATA OVERRUN RECOVERY MODE */ 3652 ISPOPMAP(0x01, 0x03), /* 0x5b: GET DATA OVERRUN RECOVERY MODE */ 3653 ISPOPMAP(0x0f, 0x0f), /* 0x5c: SET HOST DATA */ 3654 ISPOPMAP(0x01, 0x01) /* 0x5d: GET NOST DATA */ 3655 }; 3656 3657 #ifndef ISP_STRIPEED 3658 static char *scsi_mbcmd_names[] = { 3659 "NO-OP", 3660 "LOAD RAM", 3661 "EXEC FIRMWARE", 3662 "DUMP RAM", 3663 "WRITE RAM WORD", 3664 "READ RAM WORD", 3665 "MAILBOX REG TEST", 3666 "VERIFY CHECKSUM", 3667 "ABOUT FIRMWARE", 3668 NULL, 3669 NULL, 3670 NULL, 3671 NULL, 3672 NULL, 3673 "CHECK FIRMWARE", 3674 NULL, 3675 "INIT REQUEST QUEUE", 3676 "INIT RESULT QUEUE", 3677 "EXECUTE IOCB", 3678 "WAKE UP", 3679 "STOP FIRMWARE", 3680 "ABORT", 3681 "ABORT DEVICE", 3682 "ABORT TARGET", 3683 "BUS RESET", 3684 "STOP QUEUE", 3685 "START QUEUE", 3686 "SINGLE STEP QUEUE", 3687 "ABORT QUEUE", 3688 "GET DEV QUEUE STATUS", 3689 NULL, 3690 "GET FIRMWARE STATUS", 3691 "GET INIT SCSI ID", 3692 "GET SELECT TIMEOUT", 3693 "GET RETRY COUNT", 3694 "GET TAG AGE LIMIT", 3695 "GET CLOCK RATE", 3696 "GET ACT NEG STATE", 3697 "GET ASYNC DATA SETUP TIME", 3698 "GET PCI PARAMS", 3699 "GET TARGET PARAMS", 3700 "GET DEV QUEUE PARAMS", 3701 "GET RESET DELAY PARAMS", 3702 NULL, 3703 NULL, 3704 NULL, 3705 NULL, 3706 NULL, 3707 "SET INIT SCSI ID", 3708 "SET SELECT TIMEOUT", 3709 "SET RETRY COUNT", 3710 "SET TAG AGE LIMIT", 3711 "SET CLOCK RATE", 3712 "SET ACT NEG STATE", 3713 "SET ASYNC DATA SETUP TIME", 3714 "SET PCI CONTROL PARAMS", 3715 "SET TARGET PARAMS", 3716 "SET DEV QUEUE PARAMS", 3717 "SET RESET DELAY PARAMS", 3718 NULL, 3719 NULL, 3720 NULL, 3721 NULL, 3722 NULL, 3723 "RETURN BIOS BLOCK ADDR", 3724 "WRITE FOUR RAM WORDS", 3725 "EXEC BIOS IOCB", 3726 NULL, 3727 NULL, 3728 "SET SYSTEM PARAMETER", 3729 "GET SYSTEM PARAMETER", 3730 NULL, 3731 "GET SCAM CONFIGURATION", 3732 "SET SCAM CONFIGURATION", 3733 "SET FIRMWARE FEATURES", 3734 "GET FIRMWARE FEATURES", 3735 NULL, 3736 NULL, 3737 NULL, 3738 NULL, 3739 "LOAD RAM A64", 3740 "DUMP RAM A64", 3741 "INITIALIZE REQUEST QUEUE A64", 3742 "INITIALIZE RESPONSE QUEUE A64", 3743 "EXECUTE IOCB A64", 3744 "ENABLE TARGET MODE", 3745 NULL, 3746 NULL, 3747 NULL, 3748 NULL, 3749 "SET DATA OVERRUN RECOVERY MODE", 3750 "GET DATA OVERRUN RECOVERY MODE", 3751 "SET HOST DATA", 3752 "GET NOST DATA", 3753 }; 3754 #endif 3755 3756 static u_int16_t mbpfc[] = { 3757 ISPOPMAP(0x01, 0x01), /* 0x00: MBOX_NO_OP */ 3758 ISPOPMAP(0x1f, 0x01), /* 0x01: MBOX_LOAD_RAM */ 3759 ISPOPMAP(0x03, 0x01), /* 0x02: MBOX_EXEC_FIRMWARE */ 3760 ISPOPMAP(0x1f, 0x01), /* 0x03: MBOX_DUMP_RAM */ 3761 ISPOPMAP(0x07, 0x07), /* 0x04: MBOX_WRITE_RAM_WORD */ 3762 ISPOPMAP(0x03, 0x07), /* 0x05: MBOX_READ_RAM_WORD */ 3763 ISPOPMAP(0xff, 0xff), /* 0x06: MBOX_MAILBOX_REG_TEST */ 3764 ISPOPMAP(0x03, 0x05), /* 0x07: MBOX_VERIFY_CHECKSUM */ 3765 ISPOPMAP(0x01, 0x0f), /* 0x08: MBOX_ABOUT_FIRMWARE */ 3766 ISPOPMAP(0xdf, 0x01), /* 0x09: LOAD RAM */ 3767 ISPOPMAP(0xdf, 0x01), /* 0x0a: DUMP RAM */ 3768 ISPOPMAP(0x00, 0x00), /* 0x0b: */ 3769 ISPOPMAP(0x00, 0x00), /* 0x0c: */ 3770 ISPOPMAP(0x00, 0x00), /* 0x0d: */ 3771 ISPOPMAP(0x01, 0x05), /* 0x0e: MBOX_CHECK_FIRMWARE */ 3772 ISPOPMAP(0x00, 0x00), /* 0x0f: */ 3773 ISPOPMAP(0x1f, 0x11), /* 0x10: MBOX_INIT_REQ_QUEUE */ 3774 ISPOPMAP(0x2f, 0x21), /* 0x11: MBOX_INIT_RES_QUEUE */ 3775 ISPOPMAP(0x0f, 0x01), /* 0x12: MBOX_EXECUTE_IOCB */ 3776 ISPOPMAP(0x03, 0x03), /* 0x13: MBOX_WAKE_UP */ 3777 ISPOPMAP(0x01, 0xff), /* 0x14: MBOX_STOP_FIRMWARE */ 3778 ISPOPMAP(0x4f, 0x01), /* 0x15: MBOX_ABORT */ 3779 ISPOPMAP(0x07, 0x01), /* 0x16: MBOX_ABORT_DEVICE */ 3780 ISPOPMAP(0x07, 0x01), /* 0x17: MBOX_ABORT_TARGET */ 3781 ISPOPMAP(0x03, 0x03), /* 0x18: MBOX_BUS_RESET */ 3782 ISPOPMAP(0x07, 0x05), /* 0x19: MBOX_STOP_QUEUE */ 3783 ISPOPMAP(0x07, 0x05), /* 0x1a: MBOX_START_QUEUE */ 3784 ISPOPMAP(0x07, 0x05), /* 0x1b: MBOX_SINGLE_STEP_QUEUE */ 3785 ISPOPMAP(0x07, 0x05), /* 0x1c: MBOX_ABORT_QUEUE */ 3786 ISPOPMAP(0x07, 0x03), /* 0x1d: MBOX_GET_DEV_QUEUE_STATUS */ 3787 ISPOPMAP(0x00, 0x00), /* 0x1e: */ 3788 ISPOPMAP(0x01, 0x07), /* 0x1f: MBOX_GET_FIRMWARE_STATUS */ 3789 ISPOPMAP(0x01, 0x4f), /* 0x20: MBOX_GET_LOOP_ID */ 3790 ISPOPMAP(0x00, 0x00), /* 0x21: */ 3791 ISPOPMAP(0x01, 0x07), /* 0x22: MBOX_GET_RETRY_COUNT */ 3792 ISPOPMAP(0x00, 0x00), /* 0x23: */ 3793 ISPOPMAP(0x00, 0x00), /* 0x24: */ 3794 ISPOPMAP(0x00, 0x00), /* 0x25: */ 3795 ISPOPMAP(0x00, 0x00), /* 0x26: */ 3796 ISPOPMAP(0x00, 0x00), /* 0x27: */ 3797 ISPOPMAP(0x0f, 0x1), /* 0x28: MBOX_GET_FIRMWARE_OPTIONS */ 3798 ISPOPMAP(0x03, 0x07), /* 0x29: MBOX_GET_PORT_QUEUE_PARAMS */ 3799 ISPOPMAP(0x00, 0x00), /* 0x2a: */ 3800 ISPOPMAP(0x00, 0x00), /* 0x2b: */ 3801 ISPOPMAP(0x00, 0x00), /* 0x2c: */ 3802 ISPOPMAP(0x00, 0x00), /* 0x2d: */ 3803 ISPOPMAP(0x00, 0x00), /* 0x2e: */ 3804 ISPOPMAP(0x00, 0x00), /* 0x2f: */ 3805 ISPOPMAP(0x00, 0x00), /* 0x30: */ 3806 ISPOPMAP(0x00, 0x00), /* 0x31: */ 3807 ISPOPMAP(0x07, 0x07), /* 0x32: MBOX_SET_RETRY_COUNT */ 3808 ISPOPMAP(0x00, 0x00), /* 0x33: */ 3809 ISPOPMAP(0x00, 0x00), /* 0x34: */ 3810 ISPOPMAP(0x00, 0x00), /* 0x35: */ 3811 ISPOPMAP(0x00, 0x00), /* 0x36: */ 3812 ISPOPMAP(0x00, 0x00), /* 0x37: */ 3813 ISPOPMAP(0x0f, 0x01), /* 0x38: MBOX_SET_FIRMWARE_OPTIONS */ 3814 ISPOPMAP(0x0f, 0x07), /* 0x39: MBOX_SET_PORT_QUEUE_PARAMS */ 3815 ISPOPMAP(0x00, 0x00), /* 0x3a: */ 3816 ISPOPMAP(0x00, 0x00), /* 0x3b: */ 3817 ISPOPMAP(0x00, 0x00), /* 0x3c: */ 3818 ISPOPMAP(0x00, 0x00), /* 0x3d: */ 3819 ISPOPMAP(0x00, 0x00), /* 0x3e: */ 3820 ISPOPMAP(0x00, 0x00), /* 0x3f: */ 3821 ISPOPMAP(0x03, 0x01), /* 0x40: MBOX_LOOP_PORT_BYPASS */ 3822 ISPOPMAP(0x03, 0x01), /* 0x41: MBOX_LOOP_PORT_ENABLE */ 3823 ISPOPMAP(0x03, 0x07), /* 0x42: MBOX_GET_RESOURCE_COUNTS */ 3824 ISPOPMAP(0x01, 0x01), /* 0x43: MBOX_REQUEST_NON_PARTICIPATING_MODE */ 3825 ISPOPMAP(0x00, 0x00), /* 0x44: */ 3826 ISPOPMAP(0x00, 0x00), /* 0x45: */ 3827 ISPOPMAP(0x00, 0x00), /* 0x46: */ 3828 ISPOPMAP(0xcf, 0x03), /* 0x47: GET PORT_DATABASE ENHANCED */ 3829 ISPOPMAP(0x00, 0x00), /* 0x48: */ 3830 ISPOPMAP(0x00, 0x00), /* 0x49: */ 3831 ISPOPMAP(0x00, 0x00), /* 0x4a: */ 3832 ISPOPMAP(0x00, 0x00), /* 0x4b: */ 3833 ISPOPMAP(0x00, 0x00), /* 0x4c: */ 3834 ISPOPMAP(0x00, 0x00), /* 0x4d: */ 3835 ISPOPMAP(0x00, 0x00), /* 0x4e: */ 3836 ISPOPMAP(0x00, 0x00), /* 0x4f: */ 3837 ISPOPMAP(0x00, 0x00), /* 0x50: */ 3838 ISPOPMAP(0x00, 0x00), /* 0x51: */ 3839 ISPOPMAP(0x00, 0x00), /* 0x52: */ 3840 ISPOPMAP(0x00, 0x00), /* 0x53: */ 3841 ISPOPMAP(0xcf, 0x01), /* 0x54: EXECUTE IOCB A64 */ 3842 ISPOPMAP(0x00, 0x00), /* 0x55: */ 3843 ISPOPMAP(0x00, 0x00), /* 0x56: */ 3844 ISPOPMAP(0x00, 0x00), /* 0x57: */ 3845 ISPOPMAP(0x00, 0x00), /* 0x58: */ 3846 ISPOPMAP(0x00, 0x00), /* 0x59: */ 3847 ISPOPMAP(0x00, 0x00), /* 0x5a: */ 3848 ISPOPMAP(0x00, 0x00), /* 0x5b: */ 3849 ISPOPMAP(0x00, 0x00), /* 0x5c: */ 3850 ISPOPMAP(0x00, 0x00), /* 0x5d: */ 3851 ISPOPMAP(0x00, 0x00), /* 0x5e: */ 3852 ISPOPMAP(0x00, 0x00), /* 0x5f: */ 3853 ISPOPMAP(0xfd, 0x31), /* 0x60: MBOX_INIT_FIRMWARE */ 3854 ISPOPMAP(0x00, 0x00), /* 0x61: */ 3855 ISPOPMAP(0x01, 0x01), /* 0x62: MBOX_INIT_LIP */ 3856 ISPOPMAP(0xcd, 0x03), /* 0x63: MBOX_GET_FC_AL_POSITION_MAP */ 3857 ISPOPMAP(0xcf, 0x01), /* 0x64: MBOX_GET_PORT_DB */ 3858 ISPOPMAP(0x07, 0x01), /* 0x65: MBOX_CLEAR_ACA */ 3859 ISPOPMAP(0x07, 0x01), /* 0x66: MBOX_TARGET_RESET */ 3860 ISPOPMAP(0x07, 0x01), /* 0x67: MBOX_CLEAR_TASK_SET */ 3861 ISPOPMAP(0x07, 0x01), /* 0x68: MBOX_ABORT_TASK_SET */ 3862 ISPOPMAP(0x01, 0x07), /* 0x69: MBOX_GET_FW_STATE */ 3863 ISPOPMAP(0x03, 0xcf), /* 0x6a: MBOX_GET_PORT_NAME */ 3864 ISPOPMAP(0xcf, 0x01), /* 0x6b: MBOX_GET_LINK_STATUS */ 3865 ISPOPMAP(0x0f, 0x01), /* 0x6c: MBOX_INIT_LIP_RESET */ 3866 ISPOPMAP(0x00, 0x00), /* 0x6d: */ 3867 ISPOPMAP(0xcf, 0x03), /* 0x6e: MBOX_SEND_SNS */ 3868 ISPOPMAP(0x0f, 0x07), /* 0x6f: MBOX_FABRIC_LOGIN */ 3869 ISPOPMAP(0x03, 0x01), /* 0x70: MBOX_SEND_CHANGE_REQUEST */ 3870 ISPOPMAP(0x03, 0x03), /* 0x71: MBOX_FABRIC_LOGOUT */ 3871 ISPOPMAP(0x0f, 0x0f), /* 0x72: MBOX_INIT_LIP_LOGIN */ 3872 ISPOPMAP(0x00, 0x00), /* 0x73: */ 3873 ISPOPMAP(0x07, 0x01), /* 0x74: LOGIN LOOP PORT */ 3874 ISPOPMAP(0xcf, 0x03), /* 0x75: GET PORT/NODE NAME LIST */ 3875 ISPOPMAP(0x4f, 0x01), /* 0x76: SET VENDOR ID */ 3876 ISPOPMAP(0xcd, 0x01), /* 0x77: INITIALIZE IP MAILBOX */ 3877 ISPOPMAP(0x00, 0x00), /* 0x78: */ 3878 ISPOPMAP(0x00, 0x00), /* 0x79: */ 3879 ISPOPMAP(0x00, 0x00), /* 0x7a: */ 3880 ISPOPMAP(0x00, 0x00), /* 0x7b: */ 3881 ISPOPMAP(0x4f, 0x03), /* 0x7c: Get ID List */ 3882 ISPOPMAP(0xcf, 0x01), /* 0x7d: SEND LFA */ 3883 ISPOPMAP(0x07, 0x01) /* 0x7e: Lun RESET */ 3884 }; 3885 3886 #ifndef ISP_STRIPPED 3887 static char *fc_mbcmd_names[] = { 3888 "NO-OP", 3889 "LOAD RAM", 3890 "EXEC FIRMWARE", 3891 "DUMP RAM", 3892 "WRITE RAM WORD", 3893 "READ RAM WORD", 3894 "MAILBOX REG TEST", 3895 "VERIFY CHECKSUM", 3896 "ABOUT FIRMWARE", 3897 "LOAD RAM", 3898 "DUMP RAM", 3899 NULL, 3900 NULL, 3901 NULL, 3902 "CHECK FIRMWARE", 3903 NULL, 3904 "INIT REQUEST QUEUE", 3905 "INIT RESULT QUEUE", 3906 "EXECUTE IOCB", 3907 "WAKE UP", 3908 "STOP FIRMWARE", 3909 "ABORT", 3910 "ABORT DEVICE", 3911 "ABORT TARGET", 3912 "BUS RESET", 3913 "STOP QUEUE", 3914 "START QUEUE", 3915 "SINGLE STEP QUEUE", 3916 "ABORT QUEUE", 3917 "GET DEV QUEUE STATUS", 3918 NULL, 3919 "GET FIRMWARE STATUS", 3920 "GET LOOP ID", 3921 NULL, 3922 "GET RETRY COUNT", 3923 NULL, 3924 NULL, 3925 NULL, 3926 NULL, 3927 NULL, 3928 "GET FIRMWARE OPTIONS", 3929 "GET PORT QUEUE PARAMS", 3930 NULL, 3931 NULL, 3932 NULL, 3933 NULL, 3934 NULL, 3935 NULL, 3936 NULL, 3937 NULL, 3938 "SET RETRY COUNT", 3939 NULL, 3940 NULL, 3941 NULL, 3942 NULL, 3943 NULL, 3944 "SET FIRMWARE OPTIONS", 3945 "SET PORT QUEUE PARAMS", 3946 NULL, 3947 NULL, 3948 NULL, 3949 NULL, 3950 NULL, 3951 NULL, 3952 "LOOP PORT BYPASS", 3953 "LOOP PORT ENABLE", 3954 "GET RESOURCE COUNTS", 3955 "REQUEST NON PARTICIPATING MODE", 3956 NULL, 3957 NULL, 3958 NULL, 3959 "GET PORT DATABASE,, ENHANCED", 3960 NULL, 3961 NULL, 3962 NULL, 3963 NULL, 3964 NULL, 3965 NULL, 3966 NULL, 3967 NULL, 3968 NULL, 3969 NULL, 3970 NULL, 3971 NULL, 3972 "EXECUTE IOCB A64", 3973 NULL, 3974 NULL, 3975 NULL, 3976 NULL, 3977 NULL, 3978 NULL, 3979 NULL, 3980 NULL, 3981 NULL, 3982 NULL, 3983 NULL, 3984 "INIT FIRMWARE", 3985 NULL, 3986 "INIT LIP", 3987 "GET FC-AL POSITION MAP", 3988 "GET PORT DATABASE", 3989 "CLEAR ACA", 3990 "TARGET RESET", 3991 "CLEAR TASK SET", 3992 "ABORT TASK SET", 3993 "GET FW STATE", 3994 "GET PORT NAME", 3995 "GET LINK STATUS", 3996 "INIT LIP RESET", 3997 NULL, 3998 "SEND SNS", 3999 "FABRIC LOGIN", 4000 "SEND CHANGE REQUEST", 4001 "FABRIC LOGOUT", 4002 "INIT LIP LOGIN", 4003 NULL, 4004 "LOGIN LOOP PORT", 4005 "GET PORT/NODE NAME LIST", 4006 "SET VENDOR ID", 4007 "INITIALIZE IP MAILBOX", 4008 NULL, 4009 NULL, 4010 NULL, 4011 NULL, 4012 "Get ID List", 4013 "SEND LFA", 4014 "Lun RESET" 4015 }; 4016 #endif 4017 4018 static void 4019 isp_mboxcmd(isp, mbp, logmask) 4020 struct ispsoftc *isp; 4021 mbreg_t *mbp; 4022 int logmask; 4023 { 4024 char *cname, *xname, tname[16], mname[16]; 4025 unsigned int lim, ibits, obits, box, opcode; 4026 u_int16_t *mcp; 4027 4028 if (IS_FC(isp)) { 4029 mcp = mbpfc; 4030 lim = (sizeof (mbpfc) / sizeof (mbpfc[0])); 4031 } else { 4032 mcp = mbpscsi; 4033 lim = (sizeof (mbpscsi) / sizeof (mbpscsi[0])); 4034 } 4035 4036 if ((opcode = mbp->param[0]) >= lim) { 4037 mbp->param[0] = MBOX_INVALID_COMMAND; 4038 isp_prt(isp, ISP_LOGERR, "Unknown Command 0x%x", opcode); 4039 return; 4040 } 4041 4042 ibits = HIBYT(mcp[opcode]) & NMBOX_BMASK(isp); 4043 obits = LOBYT(mcp[opcode]) & NMBOX_BMASK(isp); 4044 4045 if (ibits == 0 && obits == 0) { 4046 mbp->param[0] = MBOX_COMMAND_PARAM_ERROR; 4047 isp_prt(isp, ISP_LOGERR, "no parameters for 0x%x", opcode); 4048 return; 4049 } 4050 4051 /* 4052 * Get exclusive usage of mailbox registers. 4053 */ 4054 MBOX_ACQUIRE(isp); 4055 4056 for (box = 0; box < MAX_MAILBOX; box++) { 4057 if (ibits & (1 << box)) { 4058 ISP_WRITE(isp, MBOX_OFF(box), mbp->param[box]); 4059 } 4060 isp->isp_mboxtmp[box] = mbp->param[box] = 0; 4061 } 4062 4063 /* 4064 * We assume that we can't overwrite a previous command. 4065 */ 4066 isp->isp_mboxbsy = obits; 4067 4068 /* 4069 * Set Host Interrupt condition so that RISC will pick up mailbox regs. 4070 */ 4071 ISP_WRITE(isp, HCCR, HCCR_CMD_SET_HOST_INT); 4072 4073 /* 4074 * While we haven't finished the command, spin our wheels here. 4075 */ 4076 MBOX_WAIT_COMPLETE(isp); 4077 4078 /* 4079 * Copy back output registers. 4080 */ 4081 for (box = 0; box < MAX_MAILBOX; box++) { 4082 if (obits & (1 << box)) { 4083 mbp->param[box] = isp->isp_mboxtmp[box]; 4084 } 4085 } 4086 4087 MBOX_RELEASE(isp); 4088 4089 if (logmask == 0 || opcode == MBOX_EXEC_FIRMWARE) { 4090 return; 4091 } 4092 #ifdef ISP_STRIPPED 4093 cname = NULL; 4094 #else 4095 cname = (IS_FC(isp))? fc_mbcmd_names[opcode] : scsi_mbcmd_names[opcode]; 4096 #endif 4097 if (cname == NULL) { 4098 SNPRINTF(cname, sizeof tname, "opcode %x", opcode); 4099 } 4100 4101 /* 4102 * Just to be chatty here... 4103 */ 4104 xname = NULL; 4105 switch (mbp->param[0]) { 4106 case MBOX_COMMAND_COMPLETE: 4107 break; 4108 case MBOX_INVALID_COMMAND: 4109 if (logmask & MBLOGMASK(MBOX_COMMAND_COMPLETE)) 4110 xname = "INVALID COMMAND"; 4111 break; 4112 case MBOX_HOST_INTERFACE_ERROR: 4113 if (logmask & MBLOGMASK(MBOX_HOST_INTERFACE_ERROR)) 4114 xname = "HOST INTERFACE ERROR"; 4115 break; 4116 case MBOX_TEST_FAILED: 4117 if (logmask & MBLOGMASK(MBOX_TEST_FAILED)) 4118 xname = "TEST FAILED"; 4119 break; 4120 case MBOX_COMMAND_ERROR: 4121 if (logmask & MBLOGMASK(MBOX_COMMAND_ERROR)) 4122 xname = "COMMAND ERROR"; 4123 break; 4124 case MBOX_COMMAND_PARAM_ERROR: 4125 if (logmask & MBLOGMASK(MBOX_COMMAND_PARAM_ERROR)) 4126 xname = "COMMAND PARAMETER ERROR"; 4127 break; 4128 case MBOX_LOOP_ID_USED: 4129 if (logmask & MBLOGMASK(MBOX_LOOP_ID_USED)) 4130 xname = "LOOP ID ALREADY IN USE"; 4131 break; 4132 case MBOX_PORT_ID_USED: 4133 if (logmask & MBLOGMASK(MBOX_PORT_ID_USED)) 4134 xname = "PORT ID ALREADY IN USE"; 4135 break; 4136 case MBOX_ALL_IDS_USED: 4137 if (logmask & MBLOGMASK(MBOX_ALL_IDS_USED)) 4138 xname = "ALL LOOP IDS IN USE"; 4139 break; 4140 case 0: /* special case */ 4141 xname = "TIMEOUT"; 4142 break; 4143 default: 4144 SNPRINTF(mname, sizeof mname, "error 0x%x", mbp->param[0]); 4145 xname = mname; 4146 break; 4147 } 4148 if (xname) 4149 isp_prt(isp, ISP_LOGALL, "Mailbox Command '%s' failed (%s)", 4150 cname, xname); 4151 } 4152 4153 static void 4154 isp_fw_state(isp) 4155 struct ispsoftc *isp; 4156 { 4157 if (IS_FC(isp)) { 4158 mbreg_t mbs; 4159 fcparam *fcp = isp->isp_param; 4160 4161 mbs.param[0] = MBOX_GET_FW_STATE; 4162 isp_mboxcmd(isp, &mbs, MBLOGALL); 4163 if (mbs.param[0] == MBOX_COMMAND_COMPLETE) 4164 fcp->isp_fwstate = mbs.param[1]; 4165 } 4166 } 4167 4168 static void 4169 isp_update(isp) 4170 struct ispsoftc *isp; 4171 { 4172 int bus, upmask; 4173 4174 for (bus = 0, upmask = isp->isp_update; upmask != 0; bus++) { 4175 if (upmask & (1 << bus)) { 4176 isp_update_bus(isp, bus); 4177 } 4178 upmask &= ~(1 << bus); 4179 } 4180 } 4181 4182 static void 4183 isp_update_bus(isp, bus) 4184 struct ispsoftc *isp; 4185 int bus; 4186 { 4187 int tgt; 4188 mbreg_t mbs; 4189 sdparam *sdp; 4190 4191 isp->isp_update &= ~(1 << bus); 4192 if (IS_FC(isp)) { 4193 /* 4194 * There are no 'per-bus' settings for Fibre Channel. 4195 */ 4196 return; 4197 } 4198 sdp = isp->isp_param; 4199 sdp += bus; 4200 4201 for (tgt = 0; tgt < MAX_TARGETS; tgt++) { 4202 u_int16_t flags, period, offset; 4203 int get; 4204 4205 if (sdp->isp_devparam[tgt].dev_enable == 0) { 4206 sdp->isp_devparam[tgt].dev_update = 0; 4207 sdp->isp_devparam[tgt].dev_refresh = 0; 4208 isp_prt(isp, ISP_LOGDEBUG1, 4209 "skipping target %d bus %d update", tgt, bus); 4210 continue; 4211 } 4212 /* 4213 * If the goal is to update the status of the device, 4214 * take what's in dev_flags and try and set the device 4215 * toward that. Otherwise, if we're just refreshing the 4216 * current device state, get the current parameters. 4217 */ 4218 4219 /* 4220 * Refresh overrides set 4221 */ 4222 if (sdp->isp_devparam[tgt].dev_refresh) { 4223 mbs.param[0] = MBOX_GET_TARGET_PARAMS; 4224 sdp->isp_devparam[tgt].dev_refresh = 0; 4225 get = 1; 4226 } else if (sdp->isp_devparam[tgt].dev_update) { 4227 mbs.param[0] = MBOX_SET_TARGET_PARAMS; 4228 /* 4229 * Make sure dev_flags has "Renegotiate on Error" 4230 * on and "Freeze Queue on Error" off. 4231 */ 4232 sdp->isp_devparam[tgt].dev_flags |= DPARM_RENEG; 4233 sdp->isp_devparam[tgt].dev_flags &= ~DPARM_QFRZ; 4234 4235 mbs.param[2] = sdp->isp_devparam[tgt].dev_flags; 4236 4237 /* 4238 * Insist that PARITY must be enabled 4239 * if SYNC or WIDE is enabled. 4240 */ 4241 if ((mbs.param[2] & (DPARM_SYNC|DPARM_WIDE)) != 0) { 4242 mbs.param[2] |= DPARM_PARITY; 4243 } 4244 4245 if ((mbs.param[2] & DPARM_SYNC) == 0) { 4246 mbs.param[3] = 0; 4247 } else { 4248 mbs.param[3] = 4249 (sdp->isp_devparam[tgt].sync_offset << 8) | 4250 (sdp->isp_devparam[tgt].sync_period); 4251 } 4252 /* 4253 * A command completion later that has 4254 * RQSTF_NEGOTIATION set canl cause 4255 * the dev_refresh/announce cycle also. 4256 & 4257 * 4258 * Note: It is really important to update our current 4259 * flags with at least the state of TAG capabilities- 4260 * otherwise we might try and send a tagged command 4261 * when we have it all turned off. So change it here 4262 * to say that current already matches goal. 4263 */ 4264 sdp->isp_devparam[tgt].cur_dflags &= ~DPARM_TQING; 4265 sdp->isp_devparam[tgt].cur_dflags |= 4266 (sdp->isp_devparam[tgt].dev_flags & DPARM_TQING); 4267 isp_prt(isp, ISP_LOGDEBUG2, 4268 "bus %d set tgt %d flags 0x%x off 0x%x period 0x%x", 4269 bus, tgt, mbs.param[2], mbs.param[3] >> 8, 4270 mbs.param[3] & 0xff); 4271 sdp->isp_devparam[tgt].dev_update = 0; 4272 sdp->isp_devparam[tgt].dev_refresh = 1; 4273 get = 0; 4274 } else { 4275 continue; 4276 } 4277 mbs.param[1] = (bus << 15) | (tgt << 8) ; 4278 isp_mboxcmd(isp, &mbs, MBLOGALL); 4279 if (get == 0) { 4280 isp->isp_sendmarker |= (1 << bus); 4281 continue; 4282 } 4283 flags = mbs.param[2]; 4284 period = mbs.param[3] & 0xff; 4285 offset = mbs.param[3] >> 8; 4286 sdp->isp_devparam[tgt].cur_dflags = flags; 4287 sdp->isp_devparam[tgt].cur_period = period; 4288 sdp->isp_devparam[tgt].cur_offset = offset; 4289 get = (bus << 16) | tgt; 4290 (void) isp_async(isp, ISPASYNC_NEW_TGT_PARAMS, &get); 4291 } 4292 4293 for (tgt = 0; tgt < MAX_TARGETS; tgt++) { 4294 if (sdp->isp_devparam[tgt].dev_update || 4295 sdp->isp_devparam[tgt].dev_refresh) { 4296 isp->isp_update |= (1 << bus); 4297 break; 4298 } 4299 } 4300 } 4301 4302 static void 4303 isp_setdfltparm(isp, channel) 4304 struct ispsoftc *isp; 4305 int channel; 4306 { 4307 int tgt; 4308 mbreg_t mbs; 4309 sdparam *sdp; 4310 4311 if (IS_FC(isp)) { 4312 fcparam *fcp = (fcparam *) isp->isp_param; 4313 int nvfail; 4314 4315 fcp += channel; 4316 if (fcp->isp_gotdparms) { 4317 return; 4318 } 4319 fcp->isp_gotdparms = 1; 4320 fcp->isp_maxfrmlen = ICB_DFLT_FRMLEN; 4321 fcp->isp_maxalloc = ICB_DFLT_ALLOC; 4322 fcp->isp_execthrottle = ISP_EXEC_THROTTLE; 4323 fcp->isp_retry_delay = ICB_DFLT_RDELAY; 4324 fcp->isp_retry_count = ICB_DFLT_RCOUNT; 4325 /* Platform specific.... */ 4326 fcp->isp_loopid = DEFAULT_LOOPID(isp); 4327 fcp->isp_nodewwn = DEFAULT_NODEWWN(isp); 4328 fcp->isp_portwwn = DEFAULT_PORTWWN(isp); 4329 fcp->isp_fwoptions = 0; 4330 fcp->isp_fwoptions |= ICBOPT_FAIRNESS; 4331 fcp->isp_fwoptions |= ICBOPT_PDBCHANGE_AE; 4332 fcp->isp_fwoptions |= ICBOPT_HARD_ADDRESS; 4333 #ifndef ISP_NO_FASTPOST_FC 4334 fcp->isp_fwoptions |= ICBOPT_FAST_POST; 4335 #endif 4336 if (isp->isp_confopts & ISP_CFG_FULL_DUPLEX) 4337 fcp->isp_fwoptions |= ICBOPT_FULL_DUPLEX; 4338 4339 /* 4340 * Make sure this is turned off now until we get 4341 * extended options from NVRAM 4342 */ 4343 fcp->isp_fwoptions &= ~ICBOPT_EXTENDED; 4344 4345 /* 4346 * Now try and read NVRAM unless told to not do so. 4347 * This will set fcparam's isp_nodewwn && isp_portwwn. 4348 */ 4349 if ((isp->isp_confopts & ISP_CFG_NONVRAM) == 0) { 4350 nvfail = isp_read_nvram(isp); 4351 if (nvfail) 4352 isp->isp_confopts |= ISP_CFG_NONVRAM; 4353 } else { 4354 nvfail = 1; 4355 } 4356 /* 4357 * Set node && port to override platform set defaults 4358 * unless the nvram read failed (or none was done), 4359 * or the platform code wants to use what had been 4360 * set in the defaults. 4361 */ 4362 if (nvfail || (isp->isp_confopts & ISP_CFG_OWNWWN)) { 4363 isp_prt(isp, ISP_LOGCONFIG, 4364 "Using Node WWN 0x%08x%08x, Port WWN 0x%08x%08x", 4365 (u_int32_t) (DEFAULT_NODEWWN(isp) >> 32), 4366 (u_int32_t) (DEFAULT_NODEWWN(isp) & 0xffffffff), 4367 (u_int32_t) (DEFAULT_PORTWWN(isp) >> 32), 4368 (u_int32_t) (DEFAULT_PORTWWN(isp) & 0xffffffff)); 4369 isp->isp_confopts |= ISP_CFG_OWNWWN; 4370 ISP_NODEWWN(isp) = DEFAULT_NODEWWN(isp); 4371 ISP_PORTWWN(isp) = DEFAULT_PORTWWN(isp); 4372 } else { 4373 /* 4374 * We always start out with values derived 4375 * from NVRAM or our platform default. 4376 */ 4377 ISP_NODEWWN(isp) = fcp->isp_nodewwn; 4378 ISP_PORTWWN(isp) = fcp->isp_portwwn; 4379 } 4380 return; 4381 } 4382 4383 sdp = (sdparam *) isp->isp_param; 4384 sdp += channel; 4385 4386 /* 4387 * Been there, done that, got the T-shirt... 4388 */ 4389 if (sdp->isp_gotdparms) { 4390 return; 4391 } 4392 sdp->isp_gotdparms = 1; 4393 4394 /* 4395 * If we've not been told to avoid reading NVRAM, try and read it. 4396 * If we're successful reading it, we can return since NVRAM will 4397 * tell us the right thing to do. Otherwise, establish some reasonable 4398 * defaults. 4399 */ 4400 if ((isp->isp_confopts & ISP_CFG_NONVRAM) == 0) { 4401 if (isp_read_nvram(isp) == 0) { 4402 return; 4403 } 4404 } 4405 4406 /* 4407 * Now try and see whether we have specific values for them. 4408 */ 4409 if ((isp->isp_confopts & ISP_CFG_NONVRAM) == 0) { 4410 mbs.param[0] = MBOX_GET_ACT_NEG_STATE; 4411 isp_mboxcmd(isp, &mbs, MBLOGALL); 4412 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 4413 sdp->isp_req_ack_active_neg = 1; 4414 sdp->isp_data_line_active_neg = 1; 4415 } else { 4416 sdp->isp_req_ack_active_neg = 4417 (mbs.param[1+channel] >> 4) & 0x1; 4418 sdp->isp_data_line_active_neg = 4419 (mbs.param[1+channel] >> 5) & 0x1; 4420 } 4421 } else { 4422 sdp->isp_req_ack_active_neg = 1; 4423 sdp->isp_data_line_active_neg = 1; 4424 } 4425 4426 isp_prt(isp, ISP_LOGDEBUG1, 4427 "defaulting bus %d REQ/ACK Active Negation is %d", 4428 channel, sdp->isp_req_ack_active_neg); 4429 isp_prt(isp, ISP_LOGDEBUG1, 4430 "defaulting bus %d DATA Active Negation is %d", 4431 channel, sdp->isp_data_line_active_neg); 4432 4433 /* 4434 * The trick here is to establish a default for the default (honk!) 4435 * state (dev_flags). Then try and get the current status from 4436 * the card to fill in the current state. We don't, in fact, set 4437 * the default to the SAFE default state- that's not the goal state. 4438 */ 4439 for (tgt = 0; tgt < MAX_TARGETS; tgt++) { 4440 sdp->isp_devparam[tgt].cur_offset = 0; 4441 sdp->isp_devparam[tgt].cur_period = 0; 4442 sdp->isp_devparam[tgt].dev_flags = DPARM_DEFAULT; 4443 sdp->isp_devparam[tgt].cur_dflags = 0; 4444 /* 4445 * We default to Wide/Fast for versions less than a 1040 4446 * (unless it's SBus). 4447 */ 4448 if ((isp->isp_bustype == ISP_BT_SBUS && 4449 isp->isp_type < ISP_HA_SCSI_1020A) || 4450 (isp->isp_bustype == ISP_BT_PCI && 4451 isp->isp_type < ISP_HA_SCSI_1040) || 4452 (isp->isp_clock && isp->isp_clock < 60) || 4453 (sdp->isp_ultramode == 0)) { 4454 sdp->isp_devparam[tgt].sync_offset = 4455 ISP_10M_SYNCPARMS >> 8; 4456 sdp->isp_devparam[tgt].sync_period = 4457 ISP_10M_SYNCPARMS & 0xff; 4458 } else if (IS_ULTRA3(isp)) { 4459 sdp->isp_devparam[tgt].sync_offset = 4460 ISP_80M_SYNCPARMS >> 8; 4461 sdp->isp_devparam[tgt].sync_period = 4462 ISP_80M_SYNCPARMS & 0xff; 4463 } else if (IS_ULTRA2(isp)) { 4464 sdp->isp_devparam[tgt].sync_offset = 4465 ISP_40M_SYNCPARMS >> 8; 4466 sdp->isp_devparam[tgt].sync_period = 4467 ISP_40M_SYNCPARMS & 0xff; 4468 } else if (IS_1240(isp)) { 4469 sdp->isp_devparam[tgt].sync_offset = 4470 ISP_20M_SYNCPARMS >> 8; 4471 sdp->isp_devparam[tgt].sync_period = 4472 ISP_20M_SYNCPARMS & 0xff; 4473 } else { 4474 sdp->isp_devparam[tgt].sync_offset = 4475 ISP_20M_SYNCPARMS_1040 >> 8; 4476 sdp->isp_devparam[tgt].sync_period = 4477 ISP_20M_SYNCPARMS_1040 & 0xff; 4478 } 4479 4480 /* 4481 * Don't get current target parameters if we've been 4482 * told not to use NVRAM- it's really the same thing. 4483 */ 4484 if ((isp->isp_confopts & ISP_CFG_NONVRAM) == 0) { 4485 4486 mbs.param[0] = MBOX_GET_TARGET_PARAMS; 4487 mbs.param[1] = tgt << 8; 4488 isp_mboxcmd(isp, &mbs, MBLOGALL); 4489 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 4490 continue; 4491 } 4492 sdp->isp_devparam[tgt].cur_dflags = mbs.param[2]; 4493 sdp->isp_devparam[tgt].dev_flags = mbs.param[2]; 4494 sdp->isp_devparam[tgt].cur_period = mbs.param[3] & 0xff; 4495 sdp->isp_devparam[tgt].cur_offset = mbs.param[3] >> 8; 4496 4497 /* 4498 * The maximum period we can really see 4499 * here is 100 (decimal), or 400 ns. 4500 * For some unknown reason we sometimes 4501 * get back wildass numbers from the 4502 * boot device's parameters (alpha only). 4503 */ 4504 if ((mbs.param[3] & 0xff) <= 0x64) { 4505 sdp->isp_devparam[tgt].sync_period = 4506 mbs.param[3] & 0xff; 4507 sdp->isp_devparam[tgt].sync_offset = 4508 mbs.param[3] >> 8; 4509 } 4510 4511 /* 4512 * It is not safe to run Ultra Mode with a clock < 60. 4513 */ 4514 if (((isp->isp_clock && isp->isp_clock < 60) || 4515 (isp->isp_type < ISP_HA_SCSI_1020A)) && 4516 (sdp->isp_devparam[tgt].sync_period <= 4517 (ISP_20M_SYNCPARMS & 0xff))) { 4518 sdp->isp_devparam[tgt].sync_offset = 4519 ISP_10M_SYNCPARMS >> 8; 4520 sdp->isp_devparam[tgt].sync_period = 4521 ISP_10M_SYNCPARMS & 0xff; 4522 } 4523 } 4524 isp_prt(isp, ISP_LOGDEBUG1, 4525 "Initial bus %d tgt %d flags %x offset %x period %x", 4526 channel, tgt, sdp->isp_devparam[tgt].dev_flags, 4527 sdp->isp_devparam[tgt].sync_offset, 4528 sdp->isp_devparam[tgt].sync_period); 4529 } 4530 4531 /* 4532 * Establish default some more default parameters. 4533 */ 4534 sdp->isp_cmd_dma_burst_enable = 1; 4535 sdp->isp_data_dma_burst_enabl = 1; 4536 sdp->isp_fifo_threshold = 0; 4537 sdp->isp_initiator_id = DEFAULT_IID(isp); 4538 if (isp->isp_type >= ISP_HA_SCSI_1040) { 4539 sdp->isp_async_data_setup = 9; 4540 } else { 4541 sdp->isp_async_data_setup = 6; 4542 } 4543 sdp->isp_selection_timeout = 250; 4544 sdp->isp_max_queue_depth = MAXISPREQUEST(isp); 4545 sdp->isp_tag_aging = 8; 4546 sdp->isp_bus_reset_delay = 3; 4547 sdp->isp_retry_count = 2; 4548 sdp->isp_retry_delay = 2; 4549 4550 for (tgt = 0; tgt < MAX_TARGETS; tgt++) { 4551 sdp->isp_devparam[tgt].exc_throttle = ISP_EXEC_THROTTLE; 4552 sdp->isp_devparam[tgt].dev_enable = 1; 4553 } 4554 } 4555 4556 /* 4557 * Re-initialize the ISP and complete all orphaned commands 4558 * with a 'botched' notice. The reset/init routines should 4559 * not disturb an already active list of commands. 4560 * 4561 * Locks held prior to coming here. 4562 */ 4563 4564 void 4565 isp_reinit(isp) 4566 struct ispsoftc *isp; 4567 { 4568 XS_T *xs; 4569 u_int32_t handle; 4570 4571 isp_reset(isp); 4572 if (isp->isp_state == ISP_RESETSTATE) { 4573 isp_init(isp); 4574 if (isp->isp_state == ISP_INITSTATE) { 4575 isp->isp_state = ISP_RUNSTATE; 4576 } 4577 } 4578 if (isp->isp_state != ISP_RUNSTATE) { 4579 isp_prt(isp, ISP_LOGERR, "isp_reinit cannot restart ISP"); 4580 } 4581 isp->isp_nactive = 0; 4582 4583 for (handle = 1; (int) handle <= isp->isp_maxcmds; handle++) { 4584 xs = isp_find_xs(isp, handle); 4585 if (xs == NULL) { 4586 continue; 4587 } 4588 isp_destroy_handle(isp, handle); 4589 if (XS_XFRLEN(xs)) { 4590 ISP_DMAFREE(isp, xs, handle); 4591 XS_RESID(xs) = XS_XFRLEN(xs); 4592 } else { 4593 XS_RESID(xs) = 0; 4594 } 4595 XS_SETERR(xs, HBA_BUSRESET); 4596 isp_done(xs); 4597 } 4598 } 4599 4600 /* 4601 * NVRAM Routines 4602 */ 4603 static int 4604 isp_read_nvram(isp) 4605 struct ispsoftc *isp; 4606 { 4607 int i, amt; 4608 u_int8_t csum, minversion; 4609 union { 4610 u_int8_t _x[ISP2100_NVRAM_SIZE]; 4611 u_int16_t _s[ISP2100_NVRAM_SIZE>>1]; 4612 } _n; 4613 #define nvram_data _n._x 4614 #define nvram_words _n._s 4615 4616 if (IS_FC(isp)) { 4617 amt = ISP2100_NVRAM_SIZE; 4618 minversion = 1; 4619 } else if (IS_ULTRA2(isp)) { 4620 amt = ISP1080_NVRAM_SIZE; 4621 minversion = 0; 4622 } else { 4623 amt = ISP_NVRAM_SIZE; 4624 minversion = 2; 4625 } 4626 4627 /* 4628 * Just read the first two words first to see if we have a valid 4629 * NVRAM to continue reading the rest with. 4630 */ 4631 for (i = 0; i < 2; i++) { 4632 isp_rdnvram_word(isp, i, &nvram_words[i]); 4633 } 4634 if (nvram_data[0] != 'I' || nvram_data[1] != 'S' || 4635 nvram_data[2] != 'P') { 4636 if (isp->isp_bustype != ISP_BT_SBUS) { 4637 isp_prt(isp, ISP_LOGWARN, "invalid NVRAM header"); 4638 isp_prt(isp, ISP_LOGDEBUG0, "%x %x %x", 4639 nvram_data[0], nvram_data[1], nvram_data[2]); 4640 } 4641 return (-1); 4642 } 4643 for (i = 2; i < amt>>1; i++) { 4644 isp_rdnvram_word(isp, i, &nvram_words[i]); 4645 } 4646 for (csum = 0, i = 0; i < amt; i++) { 4647 csum += nvram_data[i]; 4648 } 4649 if (csum != 0) { 4650 isp_prt(isp, ISP_LOGWARN, "invalid NVRAM checksum"); 4651 return (-1); 4652 } 4653 if (ISP_NVRAM_VERSION(nvram_data) < minversion) { 4654 isp_prt(isp, ISP_LOGWARN, "version %d NVRAM not understood", 4655 ISP_NVRAM_VERSION(nvram_data)); 4656 return (-1); 4657 } 4658 4659 if (IS_ULTRA3(isp)) { 4660 isp_parse_nvram_12160(isp, 0, nvram_data); 4661 isp_parse_nvram_12160(isp, 1, nvram_data); 4662 } else if (IS_1080(isp)) { 4663 isp_parse_nvram_1080(isp, 0, nvram_data); 4664 } else if (IS_1280(isp) || IS_1240(isp)) { 4665 isp_parse_nvram_1080(isp, 0, nvram_data); 4666 isp_parse_nvram_1080(isp, 1, nvram_data); 4667 } else if (IS_SCSI(isp)) { 4668 isp_parse_nvram_1020(isp, nvram_data); 4669 } else { 4670 isp_parse_nvram_2100(isp, nvram_data); 4671 } 4672 return (0); 4673 #undef nvram_data 4674 #undef nvram_words 4675 } 4676 4677 static void 4678 isp_rdnvram_word(isp, wo, rp) 4679 struct ispsoftc *isp; 4680 int wo; 4681 u_int16_t *rp; 4682 { 4683 int i, cbits; 4684 u_int16_t bit, rqst; 4685 4686 ISP_WRITE(isp, BIU_NVRAM, BIU_NVRAM_SELECT); 4687 USEC_DELAY(2); 4688 ISP_WRITE(isp, BIU_NVRAM, BIU_NVRAM_SELECT|BIU_NVRAM_CLOCK); 4689 USEC_DELAY(2); 4690 4691 if (IS_FC(isp)) { 4692 wo &= ((ISP2100_NVRAM_SIZE >> 1) - 1); 4693 rqst = (ISP_NVRAM_READ << 8) | wo; 4694 cbits = 10; 4695 } else if (IS_ULTRA2(isp)) { 4696 wo &= ((ISP1080_NVRAM_SIZE >> 1) - 1); 4697 rqst = (ISP_NVRAM_READ << 8) | wo; 4698 cbits = 10; 4699 } else { 4700 wo &= ((ISP_NVRAM_SIZE >> 1) - 1); 4701 rqst = (ISP_NVRAM_READ << 6) | wo; 4702 cbits = 8; 4703 } 4704 4705 /* 4706 * Clock the word select request out... 4707 */ 4708 for (i = cbits; i >= 0; i--) { 4709 if ((rqst >> i) & 1) { 4710 bit = BIU_NVRAM_SELECT | BIU_NVRAM_DATAOUT; 4711 } else { 4712 bit = BIU_NVRAM_SELECT; 4713 } 4714 ISP_WRITE(isp, BIU_NVRAM, bit); 4715 USEC_DELAY(2); 4716 ISP_WRITE(isp, BIU_NVRAM, bit | BIU_NVRAM_CLOCK); 4717 USEC_DELAY(2); 4718 ISP_WRITE(isp, BIU_NVRAM, bit); 4719 USEC_DELAY(2); 4720 } 4721 /* 4722 * Now read the result back in (bits come back in MSB format). 4723 */ 4724 *rp = 0; 4725 for (i = 0; i < 16; i++) { 4726 u_int16_t rv; 4727 *rp <<= 1; 4728 ISP_WRITE(isp, BIU_NVRAM, BIU_NVRAM_SELECT|BIU_NVRAM_CLOCK); 4729 USEC_DELAY(2); 4730 rv = ISP_READ(isp, BIU_NVRAM); 4731 if (rv & BIU_NVRAM_DATAIN) { 4732 *rp |= 1; 4733 } 4734 USEC_DELAY(2); 4735 ISP_WRITE(isp, BIU_NVRAM, BIU_NVRAM_SELECT); 4736 USEC_DELAY(2); 4737 } 4738 ISP_WRITE(isp, BIU_NVRAM, 0); 4739 USEC_DELAY(2); 4740 ISP_SWIZZLE_NVRAM_WORD(isp, rp); 4741 } 4742 4743 static void 4744 isp_parse_nvram_1020(isp, nvram_data) 4745 struct ispsoftc *isp; 4746 u_int8_t *nvram_data; 4747 { 4748 int i; 4749 sdparam *sdp = (sdparam *) isp->isp_param; 4750 4751 sdp->isp_fifo_threshold = 4752 ISP_NVRAM_FIFO_THRESHOLD(nvram_data) | 4753 (ISP_NVRAM_FIFO_THRESHOLD_128(nvram_data) << 2); 4754 4755 sdp->isp_initiator_id = 4756 ISP_NVRAM_INITIATOR_ID(nvram_data); 4757 4758 sdp->isp_bus_reset_delay = 4759 ISP_NVRAM_BUS_RESET_DELAY(nvram_data); 4760 4761 sdp->isp_retry_count = 4762 ISP_NVRAM_BUS_RETRY_COUNT(nvram_data); 4763 4764 sdp->isp_retry_delay = 4765 ISP_NVRAM_BUS_RETRY_DELAY(nvram_data); 4766 4767 sdp->isp_async_data_setup = 4768 ISP_NVRAM_ASYNC_DATA_SETUP_TIME(nvram_data); 4769 4770 if (isp->isp_type >= ISP_HA_SCSI_1040) { 4771 if (sdp->isp_async_data_setup < 9) { 4772 sdp->isp_async_data_setup = 9; 4773 } 4774 } else { 4775 if (sdp->isp_async_data_setup != 6) { 4776 sdp->isp_async_data_setup = 6; 4777 } 4778 } 4779 4780 sdp->isp_req_ack_active_neg = 4781 ISP_NVRAM_REQ_ACK_ACTIVE_NEGATION(nvram_data); 4782 4783 sdp->isp_data_line_active_neg = 4784 ISP_NVRAM_DATA_LINE_ACTIVE_NEGATION(nvram_data); 4785 4786 sdp->isp_data_dma_burst_enabl = 4787 ISP_NVRAM_DATA_DMA_BURST_ENABLE(nvram_data); 4788 4789 sdp->isp_cmd_dma_burst_enable = 4790 ISP_NVRAM_CMD_DMA_BURST_ENABLE(nvram_data); 4791 4792 sdp->isp_tag_aging = 4793 ISP_NVRAM_TAG_AGE_LIMIT(nvram_data); 4794 4795 sdp->isp_selection_timeout = 4796 ISP_NVRAM_SELECTION_TIMEOUT(nvram_data); 4797 4798 sdp->isp_max_queue_depth = 4799 ISP_NVRAM_MAX_QUEUE_DEPTH(nvram_data); 4800 4801 sdp->isp_fast_mttr = ISP_NVRAM_FAST_MTTR_ENABLE(nvram_data); 4802 for (i = 0; i < MAX_TARGETS; i++) { 4803 sdp->isp_devparam[i].dev_enable = 4804 ISP_NVRAM_TGT_DEVICE_ENABLE(nvram_data, i); 4805 sdp->isp_devparam[i].exc_throttle = 4806 ISP_NVRAM_TGT_EXEC_THROTTLE(nvram_data, i); 4807 sdp->isp_devparam[i].sync_offset = 4808 ISP_NVRAM_TGT_SYNC_OFFSET(nvram_data, i); 4809 sdp->isp_devparam[i].sync_period = 4810 ISP_NVRAM_TGT_SYNC_PERIOD(nvram_data, i); 4811 4812 if (isp->isp_type < ISP_HA_SCSI_1040) { 4813 /* 4814 * If we're not ultra, we can't possibly 4815 * be a shorter period than this. 4816 */ 4817 if (sdp->isp_devparam[i].sync_period < 0x19) { 4818 sdp->isp_devparam[i].sync_period = 0x19; 4819 } 4820 if (sdp->isp_devparam[i].sync_offset > 0xc) { 4821 sdp->isp_devparam[i].sync_offset = 0x0c; 4822 } 4823 } else { 4824 if (sdp->isp_devparam[i].sync_offset > 0x8) { 4825 sdp->isp_devparam[i].sync_offset = 0x8; 4826 } 4827 } 4828 sdp->isp_devparam[i].dev_flags = 0; 4829 if (ISP_NVRAM_TGT_RENEG(nvram_data, i)) 4830 sdp->isp_devparam[i].dev_flags |= DPARM_RENEG; 4831 sdp->isp_devparam[i].dev_flags |= DPARM_ARQ; 4832 if (ISP_NVRAM_TGT_TQING(nvram_data, i)) 4833 sdp->isp_devparam[i].dev_flags |= DPARM_TQING; 4834 if (ISP_NVRAM_TGT_SYNC(nvram_data, i)) 4835 sdp->isp_devparam[i].dev_flags |= DPARM_SYNC; 4836 if (ISP_NVRAM_TGT_WIDE(nvram_data, i)) 4837 sdp->isp_devparam[i].dev_flags |= DPARM_WIDE; 4838 if (ISP_NVRAM_TGT_PARITY(nvram_data, i)) 4839 sdp->isp_devparam[i].dev_flags |= DPARM_PARITY; 4840 if (ISP_NVRAM_TGT_DISC(nvram_data, i)) 4841 sdp->isp_devparam[i].dev_flags |= DPARM_DISC; 4842 sdp->isp_devparam[i].cur_dflags = 0; /* we don't know */ 4843 } 4844 } 4845 4846 static void 4847 isp_parse_nvram_1080(isp, bus, nvram_data) 4848 struct ispsoftc *isp; 4849 int bus; 4850 u_int8_t *nvram_data; 4851 { 4852 int i; 4853 sdparam *sdp = (sdparam *) isp->isp_param; 4854 sdp += bus; 4855 4856 sdp->isp_fifo_threshold = 4857 ISP1080_NVRAM_FIFO_THRESHOLD(nvram_data); 4858 4859 sdp->isp_initiator_id = 4860 ISP1080_NVRAM_INITIATOR_ID(nvram_data, bus); 4861 4862 sdp->isp_bus_reset_delay = 4863 ISP1080_NVRAM_BUS_RESET_DELAY(nvram_data, bus); 4864 4865 sdp->isp_retry_count = 4866 ISP1080_NVRAM_BUS_RETRY_COUNT(nvram_data, bus); 4867 4868 sdp->isp_retry_delay = 4869 ISP1080_NVRAM_BUS_RETRY_DELAY(nvram_data, bus); 4870 4871 sdp->isp_async_data_setup = 4872 ISP1080_NVRAM_ASYNC_DATA_SETUP_TIME(nvram_data, 4873 bus); 4874 4875 sdp->isp_req_ack_active_neg = 4876 ISP1080_NVRAM_REQ_ACK_ACTIVE_NEGATION(nvram_data, 4877 bus); 4878 4879 sdp->isp_data_line_active_neg = 4880 ISP1080_NVRAM_DATA_LINE_ACTIVE_NEGATION(nvram_data, 4881 bus); 4882 4883 sdp->isp_data_dma_burst_enabl = 4884 ISP1080_NVRAM_BURST_ENABLE(nvram_data); 4885 4886 sdp->isp_cmd_dma_burst_enable = 4887 ISP1080_NVRAM_BURST_ENABLE(nvram_data); 4888 4889 sdp->isp_selection_timeout = 4890 ISP1080_NVRAM_SELECTION_TIMEOUT(nvram_data, bus); 4891 4892 sdp->isp_max_queue_depth = 4893 ISP1080_NVRAM_MAX_QUEUE_DEPTH(nvram_data, bus); 4894 4895 for (i = 0; i < MAX_TARGETS; i++) { 4896 sdp->isp_devparam[i].dev_enable = 4897 ISP1080_NVRAM_TGT_DEVICE_ENABLE(nvram_data, i, bus); 4898 sdp->isp_devparam[i].exc_throttle = 4899 ISP1080_NVRAM_TGT_EXEC_THROTTLE(nvram_data, i, bus); 4900 sdp->isp_devparam[i].sync_offset = 4901 ISP1080_NVRAM_TGT_SYNC_OFFSET(nvram_data, i, bus); 4902 sdp->isp_devparam[i].sync_period = 4903 ISP1080_NVRAM_TGT_SYNC_PERIOD(nvram_data, i, bus); 4904 sdp->isp_devparam[i].dev_flags = 0; 4905 if (ISP1080_NVRAM_TGT_RENEG(nvram_data, i, bus)) 4906 sdp->isp_devparam[i].dev_flags |= DPARM_RENEG; 4907 sdp->isp_devparam[i].dev_flags |= DPARM_ARQ; 4908 if (ISP1080_NVRAM_TGT_TQING(nvram_data, i, bus)) 4909 sdp->isp_devparam[i].dev_flags |= DPARM_TQING; 4910 if (ISP1080_NVRAM_TGT_SYNC(nvram_data, i, bus)) 4911 sdp->isp_devparam[i].dev_flags |= DPARM_SYNC; 4912 if (ISP1080_NVRAM_TGT_WIDE(nvram_data, i, bus)) 4913 sdp->isp_devparam[i].dev_flags |= DPARM_WIDE; 4914 if (ISP1080_NVRAM_TGT_PARITY(nvram_data, i, bus)) 4915 sdp->isp_devparam[i].dev_flags |= DPARM_PARITY; 4916 if (ISP1080_NVRAM_TGT_DISC(nvram_data, i, bus)) 4917 sdp->isp_devparam[i].dev_flags |= DPARM_DISC; 4918 sdp->isp_devparam[i].cur_dflags = 0; 4919 } 4920 } 4921 4922 static void 4923 isp_parse_nvram_12160(isp, bus, nvram_data) 4924 struct ispsoftc *isp; 4925 int bus; 4926 u_int8_t *nvram_data; 4927 { 4928 sdparam *sdp = (sdparam *) isp->isp_param; 4929 int i; 4930 4931 sdp += bus; 4932 4933 sdp->isp_fifo_threshold = 4934 ISP12160_NVRAM_FIFO_THRESHOLD(nvram_data); 4935 4936 sdp->isp_initiator_id = 4937 ISP12160_NVRAM_INITIATOR_ID(nvram_data, bus); 4938 4939 sdp->isp_bus_reset_delay = 4940 ISP12160_NVRAM_BUS_RESET_DELAY(nvram_data, bus); 4941 4942 sdp->isp_retry_count = 4943 ISP12160_NVRAM_BUS_RETRY_COUNT(nvram_data, bus); 4944 4945 sdp->isp_retry_delay = 4946 ISP12160_NVRAM_BUS_RETRY_DELAY(nvram_data, bus); 4947 4948 sdp->isp_async_data_setup = 4949 ISP12160_NVRAM_ASYNC_DATA_SETUP_TIME(nvram_data, 4950 bus); 4951 4952 sdp->isp_req_ack_active_neg = 4953 ISP12160_NVRAM_REQ_ACK_ACTIVE_NEGATION(nvram_data, 4954 bus); 4955 4956 sdp->isp_data_line_active_neg = 4957 ISP12160_NVRAM_DATA_LINE_ACTIVE_NEGATION(nvram_data, 4958 bus); 4959 4960 sdp->isp_data_dma_burst_enabl = 4961 ISP12160_NVRAM_BURST_ENABLE(nvram_data); 4962 4963 sdp->isp_cmd_dma_burst_enable = 4964 ISP12160_NVRAM_BURST_ENABLE(nvram_data); 4965 4966 sdp->isp_selection_timeout = 4967 ISP12160_NVRAM_SELECTION_TIMEOUT(nvram_data, bus); 4968 4969 sdp->isp_max_queue_depth = 4970 ISP12160_NVRAM_MAX_QUEUE_DEPTH(nvram_data, bus); 4971 4972 for (i = 0; i < MAX_TARGETS; i++) { 4973 sdp->isp_devparam[i].dev_enable = 4974 ISP12160_NVRAM_TGT_DEVICE_ENABLE(nvram_data, i, bus); 4975 sdp->isp_devparam[i].exc_throttle = 4976 ISP12160_NVRAM_TGT_EXEC_THROTTLE(nvram_data, i, bus); 4977 sdp->isp_devparam[i].sync_offset = 4978 ISP12160_NVRAM_TGT_SYNC_OFFSET(nvram_data, i, bus); 4979 sdp->isp_devparam[i].sync_period = 4980 ISP12160_NVRAM_TGT_SYNC_PERIOD(nvram_data, i, bus); 4981 sdp->isp_devparam[i].dev_flags = 0; 4982 if (ISP12160_NVRAM_TGT_RENEG(nvram_data, i, bus)) 4983 sdp->isp_devparam[i].dev_flags |= DPARM_RENEG; 4984 sdp->isp_devparam[i].dev_flags |= DPARM_ARQ; 4985 if (ISP12160_NVRAM_TGT_TQING(nvram_data, i, bus)) 4986 sdp->isp_devparam[i].dev_flags |= DPARM_TQING; 4987 if (ISP12160_NVRAM_TGT_SYNC(nvram_data, i, bus)) 4988 sdp->isp_devparam[i].dev_flags |= DPARM_SYNC; 4989 if (ISP12160_NVRAM_TGT_WIDE(nvram_data, i, bus)) 4990 sdp->isp_devparam[i].dev_flags |= DPARM_WIDE; 4991 if (ISP12160_NVRAM_TGT_PARITY(nvram_data, i, bus)) 4992 sdp->isp_devparam[i].dev_flags |= DPARM_PARITY; 4993 if (ISP12160_NVRAM_TGT_DISC(nvram_data, i, bus)) 4994 sdp->isp_devparam[i].dev_flags |= DPARM_DISC; 4995 sdp->isp_devparam[i].cur_dflags = 0; 4996 } 4997 } 4998 4999 static void 5000 isp_parse_nvram_2100(isp, nvram_data) 5001 struct ispsoftc *isp; 5002 u_int8_t *nvram_data; 5003 { 5004 fcparam *fcp = (fcparam *) isp->isp_param; 5005 u_int64_t wwn; 5006 5007 /* 5008 * There is NVRAM storage for both Port and Node entities- 5009 * but the Node entity appears to be unused on all the cards 5010 * I can find. However, we should account for this being set 5011 * at some point in the future. 5012 * 5013 * Qlogic WWNs have an NAA of 2, but usually nothing shows up in 5014 * bits 48..60. In the case of the 2202, it appears that they do 5015 * use bit 48 to distinguish between the two instances on the card. 5016 * The 2204, which I've never seen, *probably* extends this method. 5017 */ 5018 wwn = ISP2100_NVRAM_PORT_NAME(nvram_data); 5019 if (wwn) { 5020 isp_prt(isp, ISP_LOGCONFIG, "NVRAM Port WWN 0x%08x%08x", 5021 (u_int32_t) (wwn >> 32), (u_int32_t) (wwn & 0xffffffff)); 5022 if ((wwn >> 60) == 0) { 5023 wwn |= (((u_int64_t) 2)<< 60); 5024 } 5025 } 5026 fcp->isp_portwwn = wwn; 5027 wwn = ISP2100_NVRAM_NODE_NAME(nvram_data); 5028 if (wwn) { 5029 isp_prt(isp, ISP_LOGCONFIG, "NVRAM Node WWN 0x%08x%08x", 5030 (u_int32_t) (wwn >> 32), (u_int32_t) (wwn & 0xffffffff)); 5031 if ((wwn >> 60) == 0) { 5032 wwn |= (((u_int64_t) 2)<< 60); 5033 } 5034 } 5035 fcp->isp_nodewwn = wwn; 5036 5037 /* 5038 * Make sure we have both Node and Port as non-zero values. 5039 */ 5040 if (fcp->isp_nodewwn != 0 && fcp->isp_portwwn == 0) { 5041 fcp->isp_portwwn = fcp->isp_nodewwn; 5042 } else if (fcp->isp_nodewwn == 0 && fcp->isp_portwwn != 0) { 5043 fcp->isp_nodewwn = fcp->isp_portwwn; 5044 } 5045 5046 /* 5047 * Make the Node and Port values sane if they're NAA == 2. 5048 * This means to clear bits 48..56 for the Node WWN and 5049 * make sure that there's some non-zero value in 48..56 5050 * for the Port WWN. 5051 */ 5052 if (fcp->isp_nodewwn && fcp->isp_portwwn) { 5053 if ((fcp->isp_nodewwn & (((u_int64_t) 0xfff) << 48)) != 0 && 5054 (fcp->isp_nodewwn >> 60) == 2) { 5055 fcp->isp_nodewwn &= ~((u_int64_t) 0xfff << 48); 5056 } 5057 if ((fcp->isp_portwwn & (((u_int64_t) 0xfff) << 48)) == 0 && 5058 (fcp->isp_portwwn >> 60) == 2) { 5059 fcp->isp_portwwn |= ((u_int64_t) 1 << 56); 5060 } 5061 } 5062 5063 fcp->isp_maxalloc = 5064 ISP2100_NVRAM_MAXIOCBALLOCATION(nvram_data); 5065 fcp->isp_maxfrmlen = 5066 ISP2100_NVRAM_MAXFRAMELENGTH(nvram_data); 5067 fcp->isp_retry_delay = 5068 ISP2100_NVRAM_RETRY_DELAY(nvram_data); 5069 fcp->isp_retry_count = 5070 ISP2100_NVRAM_RETRY_COUNT(nvram_data); 5071 fcp->isp_loopid = 5072 ISP2100_NVRAM_HARDLOOPID(nvram_data); 5073 fcp->isp_execthrottle = 5074 ISP2100_NVRAM_EXECUTION_THROTTLE(nvram_data); 5075 fcp->isp_fwoptions = ISP2100_NVRAM_OPTIONS(nvram_data); 5076 isp_prt(isp, ISP_LOGDEBUG0, 5077 "fwoptions from nvram are 0x%x", fcp->isp_fwoptions); 5078 } 5079