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