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