isp.c revision 84598
1219820Sjeff/* $FreeBSD: head/sys/dev/isp/isp.c 84598 2001-10-06 20:41:18Z mjacob $ */ 2219820Sjeff/* 3219820Sjeff * Machine and OS Independent (well, as best as possible) 4219820Sjeff * code for the Qlogic ISP SCSI adapters. 5219820Sjeff * 6219820Sjeff * Copyright (c) 1997, 1998, 1999, 2000, 2001 by Matthew Jacob 7219820Sjeff * Feral Software 8219820Sjeff * All rights reserved. 9219820Sjeff * 10219820Sjeff * Redistribution and use in source and binary forms, with or without 11219820Sjeff * modification, are permitted provided that the following conditions 12219820Sjeff * are met: 13219820Sjeff * 1. Redistributions of source code must retain the above copyright 14219820Sjeff * notice immediately at the beginning of the file, without modification, 15219820Sjeff * this list of conditions, and the following disclaimer. 16219820Sjeff * 2. The name of the author may not be used to endorse or promote products 17219820Sjeff * derived from this software without specific prior written permission. 18219820Sjeff * 19219820Sjeff * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 20219820Sjeff * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21219820Sjeff * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22219820Sjeff * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR 23219820Sjeff * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24219820Sjeff * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25219820Sjeff * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26219820Sjeff * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27219820Sjeff * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28219820Sjeff * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29219820Sjeff * SUCH DAMAGE. 30219820Sjeff */ 31219820Sjeff 32219820Sjeff/* 33219820Sjeff * Inspiration and ideas about this driver are from Erik Moe's Linux driver 34219820Sjeff * (qlogicisp.c) and Dave Miller's SBus version of same (qlogicisp.c). Some 35219820Sjeff * ideas dredged from the Solaris driver. 36219820Sjeff */ 37219820Sjeff 38219820Sjeff/* 39219820Sjeff * Include header file appropriate for platform we're building on. 40219820Sjeff */ 41219820Sjeff 42219820Sjeff#ifdef __NetBSD__ 43219820Sjeff#include <dev/ic/isp_netbsd.h> 44219820Sjeff#endif 45219820Sjeff#ifdef __FreeBSD__ 46219820Sjeff#include <dev/isp/isp_freebsd.h> 47219820Sjeff#endif 48219820Sjeff#ifdef __OpenBSD__ 49219820Sjeff#include <dev/ic/isp_openbsd.h> 50219820Sjeff#endif 51219820Sjeff#ifdef __linux__ 52219820Sjeff#include "isp_linux.h" 53219820Sjeff#endif 54219820Sjeff#ifdef __svr4__ 55219820Sjeff#include "isp_solaris.h" 56219820Sjeff#endif 57219820Sjeff 58219820Sjeff/* 59219820Sjeff * General defines 60219820Sjeff */ 61219820Sjeff 62219820Sjeff#define MBOX_DELAY_COUNT 1000000 / 100 63219820Sjeff 64219820Sjeff/* 65219820Sjeff * Local static data 66219820Sjeff */ 67219820Sjeffstatic const char portshift[] = 68219820Sjeff "Target %d Loop ID 0x%x (Port 0x%x) => Loop 0x%x (Port 0x%x)"; 69219820Sjeffstatic const char portdup[] = 70219820Sjeff "Target %d duplicates Target %d- killing off both"; 71219820Sjeffstatic const char retained[] = 72219820Sjeff "Retaining Loop ID 0x%x for Target %d (Port 0x%x)"; 73219820Sjeffstatic const char lretained[] = 74219820Sjeff "Retained login of Target %d (Loop ID 0x%x) Port 0x%x"; 75219820Sjeffstatic const char plogout[] = 76219820Sjeff "Logging out Target %d at Loop ID 0x%x (Port 0x%x)"; 77219820Sjeffstatic const char plogierr[] = 78219820Sjeff "Command Error in PLOGI for Port 0x%x (0x%x)"; 79219820Sjeffstatic const char nopdb[] = 80219820Sjeff "Could not get PDB for Device @ Port 0x%x"; 81219820Sjeffstatic const char pdbmfail1[] = 82219820Sjeff "PDB Loop ID info for Device @ Port 0x%x does not match up (0x%x)"; 83219820Sjeffstatic const char pdbmfail2[] = 84219820Sjeff "PDB Port info for Device @ Port 0x%x does not match up (0x%x)"; 85219820Sjeffstatic const char ldumped[] = 86219820Sjeff "Target %d (Loop ID 0x%x) Port 0x%x dumped after login info mismatch"; 87219820Sjeffstatic const char notresp[] = 88219820Sjeff "Not RESPONSE in RESPONSE Queue (type 0x%x) @ idx %d (next %d) nlooked %d"; 89219820Sjeffstatic const char xact1[] = 90219820Sjeff "HBA attempted queued transaction with disconnect not set for %d.%d.%d"; 91219820Sjeffstatic const char xact2[] = 92219820Sjeff "HBA attempted queued transaction to target routine %d on target %d bus %d"; 93219820Sjeffstatic const char xact3[] = 94219820Sjeff "HBA attempted queued cmd for %d.%d.%d when queueing disabled"; 95219820Sjeffstatic const char pskip[] = 96219820Sjeff "SCSI phase skipped for target %d.%d.%d"; 97219820Sjeffstatic const char topology[] = 98219820Sjeff "Loop ID %d, AL_PA 0x%x, Port ID 0x%x, Loop State 0x%x, Topology '%s'"; 99219820Sjeffstatic const char finmsg[] = 100219820Sjeff "(%d.%d.%d): FIN dl%d resid %d STS 0x%x SKEY %c XS_ERR=0x%x"; 101219820Sjeffstatic const char sc0[] = 102219820Sjeff "%s CHAN %d FTHRSH %d IID %d RESETD %d RETRYC %d RETRYD %d ASD 0x%x"; 103219820Sjeffstatic const char sc1[] = 104219820Sjeff "%s RAAN 0x%x DLAN 0x%x DDMAB 0x%x CDMAB 0x%x SELTIME %d MQD %d"; 105219820Sjeffstatic const char sc2[] = "%s CHAN %d TGT %d FLAGS 0x%x 0x%x/0x%x"; 106219820Sjeffstatic const char sc3[] = "Generated"; 107219820Sjeffstatic const char sc4[] = "NVRAM"; 108219820Sjeff 109219820Sjeff/* 110219820Sjeff * Local function prototypes. 111219820Sjeff */ 112219820Sjeffstatic int isp_parse_async __P((struct ispsoftc *, int)); 113219820Sjeffstatic int isp_handle_other_response 114219820Sjeff__P((struct ispsoftc *, ispstatusreq_t *, u_int16_t *)); 115219820Sjeffstatic void isp_parse_status 116219820Sjeff__P((struct ispsoftc *, ispstatusreq_t *, XS_T *)); 117219820Sjeffstatic void isp_fastpost_complete __P((struct ispsoftc *, u_int16_t)); 118219820Sjeffstatic void isp_scsi_init __P((struct ispsoftc *)); 119219820Sjeffstatic void isp_scsi_channel_init __P((struct ispsoftc *, int)); 120219820Sjeffstatic void isp_fibre_init __P((struct ispsoftc *)); 121219820Sjeffstatic void isp_mark_getpdb_all __P((struct ispsoftc *)); 122219820Sjeffstatic int isp_getmap __P((struct ispsoftc *, fcpos_map_t *)); 123219820Sjeffstatic int isp_getpdb __P((struct ispsoftc *, int, isp_pdb_t *)); 124219820Sjeffstatic u_int64_t isp_get_portname __P((struct ispsoftc *, int, int)); 125219820Sjeffstatic int isp_fclink_test __P((struct ispsoftc *, int)); 126219820Sjeffstatic char *isp2100_fw_statename __P((int)); 127219820Sjeffstatic int isp_pdb_sync __P((struct ispsoftc *)); 128219820Sjeffstatic int isp_scan_loop __P((struct ispsoftc *)); 129219820Sjeffstatic int isp_scan_fabric __P((struct ispsoftc *)); 130219820Sjeffstatic void isp_register_fc4_type __P((struct ispsoftc *)); 131219820Sjeffstatic void isp_fw_state __P((struct ispsoftc *)); 132219820Sjeffstatic void isp_mboxcmd __P((struct ispsoftc *, mbreg_t *, int)); 133219820Sjeff 134219820Sjeffstatic void isp_update __P((struct ispsoftc *)); 135219820Sjeffstatic void isp_update_bus __P((struct ispsoftc *, int)); 136219820Sjeffstatic void isp_setdfltparm __P((struct ispsoftc *, int)); 137219820Sjeffstatic int isp_read_nvram __P((struct ispsoftc *)); 138219820Sjeffstatic void isp_rdnvram_word __P((struct ispsoftc *, int, u_int16_t *)); 139219820Sjeffstatic void isp_parse_nvram_1020 __P((struct ispsoftc *, u_int8_t *)); 140219820Sjeffstatic void isp_parse_nvram_1080 __P((struct ispsoftc *, int, u_int8_t *)); 141219820Sjeffstatic void isp_parse_nvram_12160 __P((struct ispsoftc *, int, u_int8_t *)); 142219820Sjeffstatic void isp_parse_nvram_2100 __P((struct ispsoftc *, u_int8_t *)); 143219820Sjeff 144219820Sjeff/* 145219820Sjeff * Reset Hardware. 146219820Sjeff * 147219820Sjeff * Hit the chip over the head, download new f/w if available and set it running. 148219820Sjeff * 149219820Sjeff * Locking done elsewhere. 150219820Sjeff */ 151219820Sjeff 152219820Sjeffvoid 153219820Sjeffisp_reset(struct ispsoftc *isp) 154219820Sjeff{ 155219820Sjeff mbreg_t mbs; 156219820Sjeff u_int16_t code_org; 157219820Sjeff int loops, i, touched, dodnld = 1; 158219820Sjeff char *btype = "????"; 159219820Sjeff 160219820Sjeff isp->isp_state = ISP_NILSTATE; 161219820Sjeff 162219820Sjeff /* 163219820Sjeff * Basic types (SCSI, FibreChannel and PCI or SBus) 164219820Sjeff * have been set in the MD code. We figure out more 165219820Sjeff * here. Possibly more refined types based upon PCI 166219820Sjeff * identification. Chip revision has been gathered. 167219820Sjeff * 168219820Sjeff * After we've fired this chip up, zero out the conf1 register 169219820Sjeff * for SCSI adapters and do other settings for the 2100. 170219820Sjeff */ 171219820Sjeff 172219820Sjeff /* 173219820Sjeff * Get the current running firmware revision out of the 174219820Sjeff * chip before we hit it over the head (if this is our 175219820Sjeff * first time through). Note that we store this as the 176219820Sjeff * 'ROM' firmware revision- which it may not be. In any 177219820Sjeff * case, we don't really use this yet, but we may in 178219820Sjeff * the future. 179219820Sjeff */ 180219820Sjeff if ((touched = isp->isp_touched) == 0) { 181219820Sjeff /* 182219820Sjeff * First see whether or not we're sitting in the ISP PROM. 183219820Sjeff * If we've just been reset, we'll have the string "ISP " 184219820Sjeff * spread through outgoing mailbox registers 1-3. We do 185219820Sjeff * this for PCI cards because otherwise we really don't 186219820Sjeff * know what state the card is in and we could hang if 187219820Sjeff * we try this command otherwise. 188219820Sjeff * 189219820Sjeff * For SBus cards, we just do this because they almost 190219820Sjeff * certainly will be running firmware by now. 191219820Sjeff */ 192219820Sjeff if (ISP_READ(isp, OUTMAILBOX1) != 0x4953 || 193219820Sjeff ISP_READ(isp, OUTMAILBOX2) != 0x5020 || 194219820Sjeff ISP_READ(isp, OUTMAILBOX3) != 0x2020) { 195219820Sjeff /* 196219820Sjeff * Just in case it was paused... 197219820Sjeff */ 198219820Sjeff ISP_WRITE(isp, HCCR, HCCR_CMD_RELEASE); 199219820Sjeff mbs.param[0] = MBOX_ABOUT_FIRMWARE; 200219820Sjeff isp_mboxcmd(isp, &mbs, MBLOGNONE); 201219820Sjeff if (mbs.param[0] == MBOX_COMMAND_COMPLETE) { 202219820Sjeff isp->isp_romfw_rev[0] = mbs.param[1]; 203219820Sjeff isp->isp_romfw_rev[1] = mbs.param[2]; 204219820Sjeff isp->isp_romfw_rev[2] = mbs.param[3]; 205219820Sjeff } 206219820Sjeff } 207219820Sjeff isp->isp_touched = 1; 208219820Sjeff } 209219820Sjeff 210219820Sjeff DISABLE_INTS(isp); 211219820Sjeff 212219820Sjeff /* 213219820Sjeff * Set up default request/response queue in-pointer/out-pointer 214219820Sjeff * register indices. 215219820Sjeff */ 216219820Sjeff if (IS_2300(isp)) { 217219820Sjeff isp->isp_rqstinrp = BIU_REQINP; 218219820Sjeff isp->isp_rqstoutrp = BIU_REQOUTP; 219219820Sjeff isp->isp_respinrp = BIU_RSPINP; 220219820Sjeff isp->isp_respoutrp = BIU_RSPOUTP; 221219820Sjeff } else { 222219820Sjeff isp->isp_rqstinrp = INMAILBOX4; 223219820Sjeff isp->isp_rqstoutrp = OUTMAILBOX4; 224219820Sjeff isp->isp_respinrp = OUTMAILBOX5; 225219820Sjeff isp->isp_respoutrp = INMAILBOX5; 226219820Sjeff } 227219820Sjeff 228219820Sjeff /* 229219820Sjeff * Put the board into PAUSE mode (so we can read the SXP registers 230219820Sjeff * or write FPM/FBM registers). 231219820Sjeff */ 232219820Sjeff ISP_WRITE(isp, HCCR, HCCR_CMD_PAUSE); 233219820Sjeff 234219820Sjeff if (IS_FC(isp)) { 235219820Sjeff switch (isp->isp_type) { 236219820Sjeff case ISP_HA_FC_2100: 237219820Sjeff btype = "2100"; 238219820Sjeff break; 239219820Sjeff case ISP_HA_FC_2200: 240219820Sjeff btype = "2200"; 241219820Sjeff break; 242219820Sjeff case ISP_HA_FC_2300: 243219820Sjeff btype = "2300"; 244219820Sjeff break; 245219820Sjeff default: 246219820Sjeff break; 247219820Sjeff } 248219820Sjeff /* 249219820Sjeff * While we're paused, reset the FPM module and FBM fifos. 250219820Sjeff */ 251219820Sjeff ISP_WRITE(isp, BIU2100_CSR, BIU2100_FPM0_REGS); 252219820Sjeff ISP_WRITE(isp, FPM_DIAG_CONFIG, FPM_SOFT_RESET); 253219820Sjeff ISP_WRITE(isp, BIU2100_CSR, BIU2100_FB_REGS); 254219820Sjeff ISP_WRITE(isp, FBM_CMD, FBMCMD_FIFO_RESET_ALL); 255219820Sjeff ISP_WRITE(isp, BIU2100_CSR, BIU2100_RISC_REGS); 256219820Sjeff } else if (IS_1240(isp)) { 257219820Sjeff sdparam *sdp = isp->isp_param; 258219820Sjeff btype = "1240"; 259219820Sjeff isp->isp_clock = 60; 260219820Sjeff sdp->isp_ultramode = 1; 261219820Sjeff sdp++; 262219820Sjeff sdp->isp_ultramode = 1; 263219820Sjeff /* 264219820Sjeff * XXX: Should probably do some bus sensing. 265219820Sjeff */ 266219820Sjeff } else if (IS_ULTRA2(isp)) { 267219820Sjeff static const char m[] = "bus %d is in %s Mode"; 268219820Sjeff u_int16_t l; 269219820Sjeff sdparam *sdp = isp->isp_param; 270219820Sjeff 271219820Sjeff isp->isp_clock = 100; 272219820Sjeff 273219820Sjeff if (IS_1280(isp)) 274219820Sjeff btype = "1280"; 275219820Sjeff else if (IS_1080(isp)) 276219820Sjeff btype = "1080"; 277219820Sjeff else if (IS_12160(isp)) 278219820Sjeff btype = "12160"; 279219820Sjeff else 280219820Sjeff btype = "<UNKLVD>"; 281219820Sjeff 282219820Sjeff l = ISP_READ(isp, SXP_PINS_DIFF) & ISP1080_MODE_MASK; 283219820Sjeff switch (l) { 284219820Sjeff case ISP1080_LVD_MODE: 285219820Sjeff sdp->isp_lvdmode = 1; 286219820Sjeff isp_prt(isp, ISP_LOGCONFIG, m, 0, "LVD"); 287219820Sjeff break; 288219820Sjeff case ISP1080_HVD_MODE: 289219820Sjeff sdp->isp_diffmode = 1; 290219820Sjeff isp_prt(isp, ISP_LOGCONFIG, m, 0, "Differential"); 291219820Sjeff break; 292219820Sjeff case ISP1080_SE_MODE: 293219820Sjeff sdp->isp_ultramode = 1; 294219820Sjeff isp_prt(isp, ISP_LOGCONFIG, m, 0, "Single-Ended"); 295219820Sjeff break; 296219820Sjeff default: 297219820Sjeff isp_prt(isp, ISP_LOGERR, 298219820Sjeff "unknown mode on bus %d (0x%x)", 0, l); 299219820Sjeff break; 300219820Sjeff } 301219820Sjeff 302219820Sjeff if (IS_DUALBUS(isp)) { 303219820Sjeff sdp++; 304219820Sjeff l = ISP_READ(isp, SXP_PINS_DIFF|SXP_BANK1_SELECT); 305219820Sjeff l &= ISP1080_MODE_MASK; 306219820Sjeff switch(l) { 307219820Sjeff case ISP1080_LVD_MODE: 308219820Sjeff sdp->isp_lvdmode = 1; 309219820Sjeff isp_prt(isp, ISP_LOGCONFIG, m, 1, "LVD"); 310219820Sjeff break; 311219820Sjeff case ISP1080_HVD_MODE: 312219820Sjeff sdp->isp_diffmode = 1; 313219820Sjeff isp_prt(isp, ISP_LOGCONFIG, 314219820Sjeff m, 1, "Differential"); 315219820Sjeff break; 316219820Sjeff case ISP1080_SE_MODE: 317219820Sjeff sdp->isp_ultramode = 1; 318219820Sjeff isp_prt(isp, ISP_LOGCONFIG, 319219820Sjeff m, 1, "Single-Ended"); 320219820Sjeff break; 321219820Sjeff default: 322219820Sjeff isp_prt(isp, ISP_LOGERR, 323219820Sjeff "unknown mode on bus %d (0x%x)", 1, l); 324219820Sjeff break; 325219820Sjeff } 326219820Sjeff } 327219820Sjeff } else { 328219820Sjeff sdparam *sdp = isp->isp_param; 329219820Sjeff i = ISP_READ(isp, BIU_CONF0) & BIU_CONF0_HW_MASK; 330219820Sjeff switch (i) { 331219820Sjeff default: 332219820Sjeff isp_prt(isp, ISP_LOGALL, "Unknown Chip Type 0x%x", i); 333219820Sjeff /* FALLTHROUGH */ 334219820Sjeff case 1: 335219820Sjeff btype = "1020"; 336219820Sjeff isp->isp_type = ISP_HA_SCSI_1020; 337219820Sjeff isp->isp_clock = 40; 338219820Sjeff break; 339219820Sjeff case 2: 340219820Sjeff /* 341219820Sjeff * Some 1020A chips are Ultra Capable, but don't 342219820Sjeff * run the clock rate up for that unless told to 343219820Sjeff * do so by the Ultra Capable bits being set. 344219820Sjeff */ 345219820Sjeff btype = "1020A"; 346219820Sjeff isp->isp_type = ISP_HA_SCSI_1020A; 347219820Sjeff isp->isp_clock = 40; 348219820Sjeff break; 349219820Sjeff case 3: 350219820Sjeff btype = "1040"; 351219820Sjeff isp->isp_type = ISP_HA_SCSI_1040; 352219820Sjeff isp->isp_clock = 60; 353219820Sjeff break; 354219820Sjeff case 4: 355219820Sjeff btype = "1040A"; 356219820Sjeff isp->isp_type = ISP_HA_SCSI_1040A; 357219820Sjeff isp->isp_clock = 60; 358219820Sjeff break; 359219820Sjeff case 5: 360219820Sjeff btype = "1040B"; 361219820Sjeff isp->isp_type = ISP_HA_SCSI_1040B; 362219820Sjeff isp->isp_clock = 60; 363219820Sjeff break; 364219820Sjeff case 6: 365219820Sjeff btype = "1040C"; 366219820Sjeff isp->isp_type = ISP_HA_SCSI_1040C; 367219820Sjeff isp->isp_clock = 60; 368219820Sjeff break; 369219820Sjeff } 370219820Sjeff /* 371219820Sjeff * Now, while we're at it, gather info about ultra 372219820Sjeff * and/or differential mode. 373219820Sjeff */ 374219820Sjeff if (ISP_READ(isp, SXP_PINS_DIFF) & SXP_PINS_DIFF_MODE) { 375255932Salfred isp_prt(isp, ISP_LOGCONFIG, "Differential Mode"); 376255932Salfred sdp->isp_diffmode = 1; 377255932Salfred } else { 378255932Salfred sdp->isp_diffmode = 0; 379255932Salfred } 380255932Salfred i = ISP_READ(isp, RISC_PSR); 381255932Salfred if (isp->isp_bustype == ISP_BT_SBUS) { 382255932Salfred i &= RISC_PSR_SBUS_ULTRA; 383255932Salfred } else { 384255932Salfred i &= RISC_PSR_PCI_ULTRA; 385255932Salfred } 386255932Salfred if (i != 0) { 387255932Salfred isp_prt(isp, ISP_LOGCONFIG, "Ultra Mode Capable"); 388255932Salfred sdp->isp_ultramode = 1; 389255932Salfred /* 390255932Salfred * If we're in Ultra Mode, we have to be 60Mhz clock- 391255932Salfred * even for the SBus version. 392255932Salfred */ 393255932Salfred isp->isp_clock = 60; 394255932Salfred } else { 395255932Salfred sdp->isp_ultramode = 0; 396255932Salfred /* 397219820Sjeff * Clock is known. Gronk. 398219820Sjeff */ 399219820Sjeff } 400219820Sjeff 401219820Sjeff /* 402219820Sjeff * Machine dependent clock (if set) overrides 403219820Sjeff * our generic determinations. 404219820Sjeff */ 405219820Sjeff if (isp->isp_mdvec->dv_clock) { 406219820Sjeff if (isp->isp_mdvec->dv_clock < isp->isp_clock) { 407219820Sjeff isp->isp_clock = isp->isp_mdvec->dv_clock; 408219820Sjeff } 409219820Sjeff } 410219820Sjeff 411219820Sjeff } 412219820Sjeff 413219820Sjeff /* 414219820Sjeff * Clear instrumentation 415219820Sjeff */ 416219820Sjeff isp->isp_intcnt = isp->isp_intbogus = 0; 417219820Sjeff 418219820Sjeff /* 419219820Sjeff * Do MD specific pre initialization 420219820Sjeff */ 421219820Sjeff ISP_RESET0(isp); 422219820Sjeff 423219820Sjeffagain: 424219820Sjeff 425219820Sjeff /* 426219820Sjeff * Hit the chip over the head with hammer, 427219820Sjeff * and give the ISP a chance to recover. 428219820Sjeff */ 429219820Sjeff 430219820Sjeff if (IS_SCSI(isp)) { 431219820Sjeff ISP_WRITE(isp, BIU_ICR, BIU_ICR_SOFT_RESET); 432219820Sjeff /* 433219820Sjeff * A slight delay... 434219820Sjeff */ 435219820Sjeff USEC_DELAY(100); 436219820Sjeff 437219820Sjeff /* 438219820Sjeff * Clear data && control DMA engines. 439219820Sjeff */ 440219820Sjeff ISP_WRITE(isp, CDMA_CONTROL, 441219820Sjeff DMA_CNTRL_CLEAR_CHAN | DMA_CNTRL_RESET_INT); 442219820Sjeff ISP_WRITE(isp, DDMA_CONTROL, 443219820Sjeff DMA_CNTRL_CLEAR_CHAN | DMA_CNTRL_RESET_INT); 444219820Sjeff 445219820Sjeff 446219820Sjeff } else { 447219820Sjeff ISP_WRITE(isp, BIU2100_CSR, BIU2100_SOFT_RESET); 448219820Sjeff /* 449219820Sjeff * A slight delay... 450219820Sjeff */ 451219820Sjeff USEC_DELAY(100); 452219820Sjeff 453219820Sjeff /* 454219820Sjeff * Clear data && control DMA engines. 455219820Sjeff */ 456219820Sjeff ISP_WRITE(isp, CDMA2100_CONTROL, 457219820Sjeff DMA_CNTRL2100_CLEAR_CHAN | DMA_CNTRL2100_RESET_INT); 458219820Sjeff ISP_WRITE(isp, TDMA2100_CONTROL, 459219820Sjeff DMA_CNTRL2100_CLEAR_CHAN | DMA_CNTRL2100_RESET_INT); 460219820Sjeff ISP_WRITE(isp, RDMA2100_CONTROL, 461219820Sjeff DMA_CNTRL2100_CLEAR_CHAN | DMA_CNTRL2100_RESET_INT); 462219820Sjeff } 463219820Sjeff 464219820Sjeff /* 465219820Sjeff * Wait for ISP to be ready to go... 466219820Sjeff */ 467219820Sjeff loops = MBOX_DELAY_COUNT; 468219820Sjeff for (;;) { 469219820Sjeff if (IS_SCSI(isp)) { 470219820Sjeff if (!(ISP_READ(isp, BIU_ICR) & BIU_ICR_SOFT_RESET)) 471219820Sjeff break; 472219820Sjeff } else { 473219820Sjeff if (!(ISP_READ(isp, BIU2100_CSR) & BIU2100_SOFT_RESET)) 474219820Sjeff break; 475219820Sjeff } 476219820Sjeff USEC_DELAY(100); 477219820Sjeff if (--loops < 0) { 478219820Sjeff ISP_DUMPREGS(isp, "chip reset timed out"); 479219820Sjeff return; 480219820Sjeff } 481219820Sjeff } 482219820Sjeff 483219820Sjeff /* 484219820Sjeff * After we've fired this chip up, zero out the conf1 register 485219820Sjeff * for SCSI adapters and other settings for the 2100. 486219820Sjeff */ 487219820Sjeff 488219820Sjeff if (IS_SCSI(isp)) { 489219820Sjeff ISP_WRITE(isp, BIU_CONF1, 0); 490219820Sjeff } else { 491219820Sjeff ISP_WRITE(isp, BIU2100_CSR, 0); 492219820Sjeff } 493219820Sjeff 494219820Sjeff /* 495219820Sjeff * Reset RISC Processor 496219820Sjeff */ 497219820Sjeff ISP_WRITE(isp, HCCR, HCCR_CMD_RESET); 498219820Sjeff USEC_DELAY(100); 499219820Sjeff /* Clear semaphore register (just to be sure) */ 500219820Sjeff ISP_WRITE(isp, BIU_SEMA, 0); 501219820Sjeff 502219820Sjeff /* 503219820Sjeff * Establish some initial burst rate stuff. 504219820Sjeff * (only for the 1XX0 boards). This really should 505219820Sjeff * be done later after fetching from NVRAM. 506219820Sjeff */ 507219820Sjeff if (IS_SCSI(isp)) { 508219820Sjeff u_int16_t tmp = isp->isp_mdvec->dv_conf1; 509219820Sjeff /* 510219820Sjeff * Busted FIFO. Turn off all but burst enables. 511219820Sjeff */ 512219820Sjeff if (isp->isp_type == ISP_HA_SCSI_1040A) { 513219820Sjeff tmp &= BIU_BURST_ENABLE; 514219820Sjeff } 515219820Sjeff ISP_SETBITS(isp, BIU_CONF1, tmp); 516219820Sjeff if (tmp & BIU_BURST_ENABLE) { 517219820Sjeff ISP_SETBITS(isp, CDMA_CONF, DMA_ENABLE_BURST); 518219820Sjeff ISP_SETBITS(isp, DDMA_CONF, DMA_ENABLE_BURST); 519219820Sjeff } 520219820Sjeff#ifdef PTI_CARDS 521219820Sjeff if (((sdparam *) isp->isp_param)->isp_ultramode) { 522219820Sjeff while (ISP_READ(isp, RISC_MTR) != 0x1313) { 523219820Sjeff ISP_WRITE(isp, RISC_MTR, 0x1313); 524219820Sjeff ISP_WRITE(isp, HCCR, HCCR_CMD_STEP); 525219820Sjeff } 526219820Sjeff } else { 527219820Sjeff ISP_WRITE(isp, RISC_MTR, 0x1212); 528219820Sjeff } 529219820Sjeff /* 530219820Sjeff * PTI specific register 531219820Sjeff */ 532219820Sjeff ISP_WRITE(isp, RISC_EMB, DUAL_BANK) 533219820Sjeff#else 534219820Sjeff ISP_WRITE(isp, RISC_MTR, 0x1212); 535219820Sjeff#endif 536219820Sjeff } else { 537219820Sjeff ISP_WRITE(isp, RISC_MTR2100, 0x1212); 538219820Sjeff if (IS_2200(isp) || IS_2300(isp)) { 539219820Sjeff ISP_WRITE(isp, HCCR, HCCR_2X00_DISABLE_PARITY_PAUSE); 540219820Sjeff } 541219820Sjeff } 542219820Sjeff 543219820Sjeff ISP_WRITE(isp, HCCR, HCCR_CMD_RELEASE); /* release paused processor */ 544219820Sjeff 545219820Sjeff /* 546219820Sjeff * Do MD specific post initialization 547219820Sjeff */ 548219820Sjeff ISP_RESET1(isp); 549219820Sjeff 550219820Sjeff /* 551219820Sjeff * Wait for everything to finish firing up. 552219820Sjeff * 553219820Sjeff * Avoid doing this on the 2312 because you can generate a PCI 554219820Sjeff * parity error (chip breakage). 555219820Sjeff */ 556219820Sjeff if (IS_2300(isp)) { 557219820Sjeff USEC_DELAY(5); 558219820Sjeff } else { 559219820Sjeff loops = MBOX_DELAY_COUNT; 560219820Sjeff while (ISP_READ(isp, OUTMAILBOX0) == MBOX_BUSY) { 561219820Sjeff USEC_DELAY(100); 562219820Sjeff if (--loops < 0) { 563219820Sjeff isp_prt(isp, ISP_LOGERR, 564219820Sjeff "MBOX_BUSY never cleared on reset"); 565219820Sjeff return; 566219820Sjeff } 567219820Sjeff } 568219820Sjeff } 569219820Sjeff 570219820Sjeff /* 571219820Sjeff * Up until this point we've done everything by just reading or 572219820Sjeff * setting registers. From this point on we rely on at least *some* 573219820Sjeff * kind of firmware running in the card. 574219820Sjeff */ 575219820Sjeff 576219820Sjeff /* 577219820Sjeff * Do some sanity checking. 578219820Sjeff */ 579219820Sjeff mbs.param[0] = MBOX_NO_OP; 580219820Sjeff isp_mboxcmd(isp, &mbs, MBLOGALL); 581255932Salfred if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 582255932Salfred return; 583255932Salfred } 584255932Salfred 585255932Salfred if (IS_SCSI(isp)) { 586255932Salfred mbs.param[0] = MBOX_MAILBOX_REG_TEST; 587255932Salfred mbs.param[1] = 0xdead; 588255932Salfred mbs.param[2] = 0xbeef; 589255932Salfred mbs.param[3] = 0xffff; 590255932Salfred mbs.param[4] = 0x1111; 591255932Salfred mbs.param[5] = 0xa5a5; 592255932Salfred isp_mboxcmd(isp, &mbs, MBLOGALL); 593219820Sjeff if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 594 return; 595 } 596 if (mbs.param[1] != 0xdead || mbs.param[2] != 0xbeef || 597 mbs.param[3] != 0xffff || mbs.param[4] != 0x1111 || 598 mbs.param[5] != 0xa5a5) { 599 isp_prt(isp, ISP_LOGERR, 600 "Register Test Failed (0x%x 0x%x 0x%x 0x%x 0x%x)", 601 mbs.param[1], mbs.param[2], mbs.param[3], 602 mbs.param[4], mbs.param[5]); 603 return; 604 } 605 606 } 607 608 /* 609 * Download new Firmware, unless requested not to do so. 610 * This is made slightly trickier in some cases where the 611 * firmware of the ROM revision is newer than the revision 612 * compiled into the driver. So, where we used to compare 613 * versions of our f/w and the ROM f/w, now we just see 614 * whether we have f/w at all and whether a config flag 615 * has disabled our download. 616 */ 617 if ((isp->isp_mdvec->dv_ispfw == NULL) || 618 (isp->isp_confopts & ISP_CFG_NORELOAD)) { 619 dodnld = 0; 620 } 621 622 if (IS_2300(isp)) 623 code_org = ISP_CODE_ORG_2300; 624 else 625 code_org = ISP_CODE_ORG; 626 627 if (dodnld) { 628 u_int16_t fwlen = isp->isp_mdvec->dv_ispfw[3]; 629 for (i = 0; i < fwlen; i++) { 630 mbs.param[0] = MBOX_WRITE_RAM_WORD; 631 mbs.param[1] = code_org + i; 632 mbs.param[2] = isp->isp_mdvec->dv_ispfw[i]; 633 isp_mboxcmd(isp, &mbs, MBLOGNONE); 634 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 635 isp_prt(isp, ISP_LOGERR, 636 "F/W download failed at word %d", i); 637 dodnld = 0; 638 goto again; 639 } 640 } 641 642 /* 643 * Verify that it downloaded correctly. 644 */ 645 mbs.param[0] = MBOX_VERIFY_CHECKSUM; 646 mbs.param[1] = code_org; 647 isp_mboxcmd(isp, &mbs, MBLOGNONE); 648 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 649 isp_prt(isp, ISP_LOGERR, "Ram Checksum Failure"); 650 return; 651 } 652 isp->isp_loaded_fw = 1; 653 } else { 654 isp->isp_loaded_fw = 0; 655 isp_prt(isp, ISP_LOGDEBUG2, "skipping f/w download"); 656 } 657 658 /* 659 * Now start it rolling. 660 * 661 * If we didn't actually download f/w, 662 * we still need to (re)start it. 663 */ 664 665 666 mbs.param[0] = MBOX_EXEC_FIRMWARE; 667 mbs.param[1] = code_org; 668 isp_mboxcmd(isp, &mbs, MBLOGNONE); 669 /* give it a chance to start */ 670 USEC_SLEEP(isp, 500); 671 672 if (IS_SCSI(isp)) { 673 /* 674 * Set CLOCK RATE, but only if asked to. 675 */ 676 if (isp->isp_clock) { 677 mbs.param[0] = MBOX_SET_CLOCK_RATE; 678 mbs.param[1] = isp->isp_clock; 679 isp_mboxcmd(isp, &mbs, MBLOGALL); 680 /* we will try not to care if this fails */ 681 } 682 } 683 684 mbs.param[0] = MBOX_ABOUT_FIRMWARE; 685 isp_mboxcmd(isp, &mbs, MBLOGALL); 686 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 687 return; 688 } 689 690 /* 691 * The SBus firmware that we are using apparently does not return 692 * major, minor, micro revisions in the mailbox registers, which 693 * is really, really, annoying. 694 */ 695 if (isp->isp_bustype == ISP_BT_SBUS) { 696 if (dodnld) { 697#ifdef ISP_TARGET_MODE 698 isp->isp_fwrev[0] = 7; 699 isp->isp_fwrev[1] = 55; 700#else 701 isp->isp_fwrev[0] = 1; 702 isp->isp_fwrev[1] = 37; 703#endif 704 isp->isp_fwrev[2] = 0; 705 } 706 } else { 707 isp->isp_fwrev[0] = mbs.param[1]; 708 isp->isp_fwrev[1] = mbs.param[2]; 709 isp->isp_fwrev[2] = mbs.param[3]; 710 } 711 isp_prt(isp, ISP_LOGCONFIG, 712 "Board Type %s, Chip Revision 0x%x, %s F/W Revision %d.%d.%d", 713 btype, isp->isp_revision, dodnld? "loaded" : "resident", 714 isp->isp_fwrev[0], isp->isp_fwrev[1], isp->isp_fwrev[2]); 715 716 if (IS_FC(isp)) { 717 /* 718 * We do not believe firmware attributes for 2100 code less 719 * than 1.17.0. 720 */ 721 if (IS_2100(isp) && 722 (ISP_FW_REVX(isp->isp_fwrev) < ISP_FW_REV(1, 17, 0))) { 723 FCPARAM(isp)->isp_fwattr = 0; 724 } else { 725 FCPARAM(isp)->isp_fwattr = mbs.param[6]; 726 isp_prt(isp, ISP_LOGDEBUG0, 727 "Firmware Attributes = 0x%x", mbs.param[6]); 728 } 729 if (ISP_READ(isp, BIU2100_CSR) & BIU2100_PCI64) { 730 isp_prt(isp, ISP_LOGCONFIG, 731 "Installed in 64-Bit PCI slot"); 732 } 733 } 734 735 if (isp->isp_romfw_rev[0] || isp->isp_romfw_rev[1] || 736 isp->isp_romfw_rev[2]) { 737 isp_prt(isp, ISP_LOGCONFIG, "Last F/W revision was %d.%d.%d", 738 isp->isp_romfw_rev[0], isp->isp_romfw_rev[1], 739 isp->isp_romfw_rev[2]); 740 } 741 742 mbs.param[0] = MBOX_GET_FIRMWARE_STATUS; 743 isp_mboxcmd(isp, &mbs, MBLOGALL); 744 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 745 return; 746 } 747 isp->isp_maxcmds = mbs.param[2]; 748 isp_prt(isp, ISP_LOGINFO, 749 "%d max I/O commands supported", mbs.param[2]); 750 isp_fw_state(isp); 751 752 /* 753 * Set up DMA for the request and result mailboxes. 754 */ 755 if (ISP_MBOXDMASETUP(isp) != 0) { 756 isp_prt(isp, ISP_LOGERR, "Cannot setup DMA"); 757 return; 758 } 759 isp->isp_state = ISP_RESETSTATE; 760 761 /* 762 * Okay- now that we have new firmware running, we now (re)set our 763 * notion of how many luns we support. This is somewhat tricky because 764 * if we haven't loaded firmware, we sometimes do not have an easy way 765 * of knowing how many luns we support. 766 * 767 * Expanded lun firmware gives you 32 luns for SCSI cards and 768 * 65536 luns for Fibre Channel cards. 769 * 770 * It turns out that even for QLogic 2100s with ROM 1.10 and above 771 * we do get a firmware attributes word returned in mailbox register 6. 772 * 773 * Because the lun is in a a different position in the Request Queue 774 * Entry structure for Fibre Channel with expanded lun firmware, we 775 * can only support one lun (lun zero) when we don't know what kind 776 * of firmware we're running. 777 * 778 * Note that we only do this once (the first time thru isp_reset) 779 * because we may be called again after firmware has been loaded once 780 * and released. 781 */ 782 if (touched == 0) { 783 if (IS_SCSI(isp)) { 784 if (dodnld) { 785 isp->isp_maxluns = 32; 786 } else { 787 isp->isp_maxluns = 8; 788 } 789 } else { 790 if (FCPARAM(isp)->isp_fwattr & ISP_FW_ATTR_SCCLUN) { 791 isp->isp_maxluns = 65536; 792 } else { 793 isp->isp_maxluns = 16; 794 } 795 } 796 } 797} 798 799/* 800 * Initialize Parameters of Hardware to a known state. 801 * 802 * Locks are held before coming here. 803 */ 804 805void 806isp_init(struct ispsoftc *isp) 807{ 808 /* 809 * Must do this first to get defaults established. 810 */ 811 isp_setdfltparm(isp, 0); 812 if (IS_DUALBUS(isp)) { 813 isp_setdfltparm(isp, 1); 814 } 815 if (IS_FC(isp)) { 816 isp_fibre_init(isp); 817 } else { 818 isp_scsi_init(isp); 819 } 820} 821 822static void 823isp_scsi_init(struct ispsoftc *isp) 824{ 825 sdparam *sdp_chan0, *sdp_chan1; 826 mbreg_t mbs; 827 828 sdp_chan0 = isp->isp_param; 829 sdp_chan1 = sdp_chan0; 830 if (IS_DUALBUS(isp)) { 831 sdp_chan1++; 832 } 833 834 /* 835 * If we have no role (neither target nor initiator), return. 836 */ 837 if (isp->isp_role == ISP_ROLE_NONE) { 838 return; 839 } 840 841 /* First do overall per-card settings. */ 842 843 /* 844 * If we have fast memory timing enabled, turn it on. 845 */ 846 if (sdp_chan0->isp_fast_mttr) { 847 ISP_WRITE(isp, RISC_MTR, 0x1313); 848 } 849 850 /* 851 * Set Retry Delay and Count. 852 * You set both channels at the same time. 853 */ 854 mbs.param[0] = MBOX_SET_RETRY_COUNT; 855 mbs.param[1] = sdp_chan0->isp_retry_count; 856 mbs.param[2] = sdp_chan0->isp_retry_delay; 857 mbs.param[6] = sdp_chan1->isp_retry_count; 858 mbs.param[7] = sdp_chan1->isp_retry_delay; 859 860 isp_mboxcmd(isp, &mbs, MBLOGALL); 861 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 862 return; 863 } 864 865 /* 866 * Set ASYNC DATA SETUP time. This is very important. 867 */ 868 mbs.param[0] = MBOX_SET_ASYNC_DATA_SETUP_TIME; 869 mbs.param[1] = sdp_chan0->isp_async_data_setup; 870 mbs.param[2] = sdp_chan1->isp_async_data_setup; 871 isp_mboxcmd(isp, &mbs, MBLOGALL); 872 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 873 return; 874 } 875 876 /* 877 * Set ACTIVE Negation State. 878 */ 879 mbs.param[0] = MBOX_SET_ACT_NEG_STATE; 880 mbs.param[1] = 881 (sdp_chan0->isp_req_ack_active_neg << 4) | 882 (sdp_chan0->isp_data_line_active_neg << 5); 883 mbs.param[2] = 884 (sdp_chan1->isp_req_ack_active_neg << 4) | 885 (sdp_chan1->isp_data_line_active_neg << 5); 886 887 isp_mboxcmd(isp, &mbs, MBLOGNONE); 888 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 889 isp_prt(isp, ISP_LOGERR, 890 "failed to set active negation state (%d,%d), (%d,%d)", 891 sdp_chan0->isp_req_ack_active_neg, 892 sdp_chan0->isp_data_line_active_neg, 893 sdp_chan1->isp_req_ack_active_neg, 894 sdp_chan1->isp_data_line_active_neg); 895 /* 896 * But don't return. 897 */ 898 } 899 900 /* 901 * Set the Tag Aging limit 902 */ 903 mbs.param[0] = MBOX_SET_TAG_AGE_LIMIT; 904 mbs.param[1] = sdp_chan0->isp_tag_aging; 905 mbs.param[2] = sdp_chan1->isp_tag_aging; 906 isp_mboxcmd(isp, &mbs, MBLOGALL); 907 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 908 isp_prt(isp, ISP_LOGERR, "failed to set tag age limit (%d,%d)", 909 sdp_chan0->isp_tag_aging, sdp_chan1->isp_tag_aging); 910 return; 911 } 912 913 /* 914 * Set selection timeout. 915 */ 916 mbs.param[0] = MBOX_SET_SELECT_TIMEOUT; 917 mbs.param[1] = sdp_chan0->isp_selection_timeout; 918 mbs.param[2] = sdp_chan1->isp_selection_timeout; 919 isp_mboxcmd(isp, &mbs, MBLOGALL); 920 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 921 return; 922 } 923 924 /* now do per-channel settings */ 925 isp_scsi_channel_init(isp, 0); 926 if (IS_DUALBUS(isp)) 927 isp_scsi_channel_init(isp, 1); 928 929 /* 930 * Now enable request/response queues 931 */ 932 933 mbs.param[0] = MBOX_INIT_RES_QUEUE; 934 mbs.param[1] = RESULT_QUEUE_LEN(isp); 935 mbs.param[2] = DMA_WD1(isp->isp_result_dma); 936 mbs.param[3] = DMA_WD0(isp->isp_result_dma); 937 mbs.param[4] = 0; 938 mbs.param[5] = 0; 939 isp_mboxcmd(isp, &mbs, MBLOGALL); 940 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 941 return; 942 } 943 isp->isp_residx = mbs.param[5]; 944 945 mbs.param[0] = MBOX_INIT_REQ_QUEUE; 946 mbs.param[1] = RQUEST_QUEUE_LEN(isp); 947 mbs.param[2] = DMA_WD1(isp->isp_rquest_dma); 948 mbs.param[3] = DMA_WD0(isp->isp_rquest_dma); 949 mbs.param[4] = 0; 950 isp_mboxcmd(isp, &mbs, MBLOGALL); 951 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 952 return; 953 } 954 isp->isp_reqidx = isp->isp_reqodx = mbs.param[4]; 955 956 /* 957 * Turn on Fast Posting, LVD transitions 958 * 959 * Ultra2 F/W always has had fast posting (and LVD transitions) 960 * 961 * Ultra and older (i.e., SBus) cards may not. It's just safer 962 * to assume not for them. 963 */ 964 965 mbs.param[0] = MBOX_SET_FW_FEATURES; 966 mbs.param[1] = 0; 967 if (IS_ULTRA2(isp)) 968 mbs.param[1] |= FW_FEATURE_LVD_NOTIFY; 969 if (IS_ULTRA2(isp) || IS_1240(isp)) 970 mbs.param[1] |= FW_FEATURE_FAST_POST; 971 if (mbs.param[1] != 0) { 972 u_int16_t sfeat = mbs.param[1]; 973 isp_mboxcmd(isp, &mbs, MBLOGALL); 974 if (mbs.param[0] == MBOX_COMMAND_COMPLETE) { 975 isp_prt(isp, ISP_LOGINFO, 976 "Enabled FW features (0x%x)", sfeat); 977 } 978 } 979 980 /* 981 * Let the outer layers decide whether to issue a SCSI bus reset. 982 */ 983 isp->isp_state = ISP_INITSTATE; 984} 985 986static void 987isp_scsi_channel_init(struct ispsoftc *isp, int channel) 988{ 989 sdparam *sdp; 990 mbreg_t mbs; 991 int tgt; 992 993 sdp = isp->isp_param; 994 sdp += channel; 995 996 /* 997 * Set (possibly new) Initiator ID. 998 */ 999 mbs.param[0] = MBOX_SET_INIT_SCSI_ID; 1000 mbs.param[1] = (channel << 7) | sdp->isp_initiator_id; 1001 isp_mboxcmd(isp, &mbs, MBLOGALL); 1002 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 1003 return; 1004 } 1005 isp_prt(isp, ISP_LOGINFO, "Initiator ID is %d on Channel %d", 1006 sdp->isp_initiator_id, channel); 1007 1008 1009 /* 1010 * Set current per-target parameters to an initial safe minimum. 1011 */ 1012 for (tgt = 0; tgt < MAX_TARGETS; tgt++) { 1013 int lun; 1014 u_int16_t sdf; 1015 1016 if (sdp->isp_devparam[tgt].dev_enable == 0) { 1017 continue; 1018 } 1019#ifndef ISP_TARGET_MODE 1020 sdf = sdp->isp_devparam[tgt].goal_flags; 1021 sdf &= DPARM_SAFE_DFLT; 1022 /* 1023 * It is not quite clear when this changed over so that 1024 * we could force narrow and async for 1000/1020 cards, 1025 * but assume that this is only the case for loaded 1026 * firmware. 1027 */ 1028 if (isp->isp_loaded_fw) { 1029 sdf |= DPARM_NARROW | DPARM_ASYNC; 1030 } 1031#else 1032 /* 1033 * The !$*!)$!$)* f/w uses the same index into some 1034 * internal table to decide how to respond to negotiations, 1035 * so if we've said "let's be safe" for ID X, and ID X 1036 * selects *us*, the negotiations will back to 'safe' 1037 * (as in narrow/async). What the f/w *should* do is 1038 * use the initiator id settings to decide how to respond. 1039 */ 1040 sdp->isp_devparam[tgt].goal_flags = sdf = DPARM_DEFAULT; 1041#endif 1042 mbs.param[0] = MBOX_SET_TARGET_PARAMS; 1043 mbs.param[1] = (channel << 15) | (tgt << 8); 1044 mbs.param[2] = sdf; 1045 if ((sdf & DPARM_SYNC) == 0) { 1046 mbs.param[3] = 0; 1047 } else { 1048 mbs.param[3] = 1049 (sdp->isp_devparam[tgt].goal_offset << 8) | 1050 (sdp->isp_devparam[tgt].goal_period); 1051 } 1052 isp_prt(isp, ISP_LOGDEBUG0, 1053 "Initial Settings bus%d tgt%d flags 0x%x off 0x%x per 0x%x", 1054 channel, tgt, mbs.param[2], mbs.param[3] >> 8, 1055 mbs.param[3] & 0xff); 1056 isp_mboxcmd(isp, &mbs, MBLOGNONE); 1057 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 1058 sdf = DPARM_SAFE_DFLT; 1059 mbs.param[0] = MBOX_SET_TARGET_PARAMS; 1060 mbs.param[1] = (tgt << 8) | (channel << 15); 1061 mbs.param[2] = sdf; 1062 mbs.param[3] = 0; 1063 isp_mboxcmd(isp, &mbs, MBLOGALL); 1064 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 1065 continue; 1066 } 1067 } 1068 1069 /* 1070 * We don't update any information directly from the f/w 1071 * because we need to run at least one command to cause a 1072 * new state to be latched up. So, we just assume that we 1073 * converge to the values we just had set. 1074 * 1075 * Ensure that we don't believe tagged queuing is enabled yet. 1076 * It turns out that sometimes the ISP just ignores our 1077 * attempts to set parameters for devices that it hasn't 1078 * seen yet. 1079 */ 1080 sdp->isp_devparam[tgt].actv_flags = sdf & ~DPARM_TQING; 1081 for (lun = 0; lun < (int) isp->isp_maxluns; lun++) { 1082 mbs.param[0] = MBOX_SET_DEV_QUEUE_PARAMS; 1083 mbs.param[1] = (channel << 15) | (tgt << 8) | lun; 1084 mbs.param[2] = sdp->isp_max_queue_depth; 1085 mbs.param[3] = sdp->isp_devparam[tgt].exc_throttle; 1086 isp_mboxcmd(isp, &mbs, MBLOGALL); 1087 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 1088 break; 1089 } 1090 } 1091 } 1092 for (tgt = 0; tgt < MAX_TARGETS; tgt++) { 1093 if (sdp->isp_devparam[tgt].dev_refresh) { 1094 isp->isp_sendmarker |= (1 << channel); 1095 isp->isp_update |= (1 << channel); 1096 break; 1097 } 1098 } 1099} 1100 1101/* 1102 * Fibre Channel specific initialization. 1103 * 1104 * Locks are held before coming here. 1105 */ 1106static void 1107isp_fibre_init(struct ispsoftc *isp) 1108{ 1109 fcparam *fcp; 1110 isp_icb_t *icbp; 1111 mbreg_t mbs; 1112 int loopid; 1113 u_int64_t nwwn, pwwn; 1114 1115 fcp = isp->isp_param; 1116 1117 /* 1118 * Do this *before* initializing the firmware. 1119 */ 1120 isp_mark_getpdb_all(isp); 1121 fcp->isp_fwstate = FW_CONFIG_WAIT; 1122 fcp->isp_loopstate = LOOP_NIL; 1123 1124 /* 1125 * If we have no role (neither target nor initiator), return. 1126 */ 1127 if (isp->isp_role == ISP_ROLE_NONE) { 1128 return; 1129 } 1130 1131 loopid = DEFAULT_LOOPID(isp); 1132 icbp = (isp_icb_t *) fcp->isp_scratch; 1133 MEMZERO(icbp, sizeof (*icbp)); 1134 1135 icbp->icb_version = ICB_VERSION1; 1136 1137 /* 1138 * Firmware Options are either retrieved from NVRAM or 1139 * are patched elsewhere. We check them for sanity here 1140 * and make changes based on board revision, but otherwise 1141 * let others decide policy. 1142 */ 1143 1144 /* 1145 * If this is a 2100 < revision 5, we have to turn off FAIRNESS. 1146 */ 1147 if ((isp->isp_type == ISP_HA_FC_2100) && isp->isp_revision < 5) { 1148 fcp->isp_fwoptions &= ~ICBOPT_FAIRNESS; 1149 } 1150 1151 /* 1152 * We have to use FULL LOGIN even though it resets the loop too much 1153 * because otherwise port database entries don't get updated after 1154 * a LIP- this is a known f/w bug for 2100 f/w less than 1.17.0. 1155 */ 1156 if (ISP_FW_REVX(isp->isp_fwrev) < ISP_FW_REV(1, 17, 0)) { 1157 fcp->isp_fwoptions |= ICBOPT_FULL_LOGIN; 1158 } 1159 1160 /* 1161 * Insist on Port Database Update Async notifications 1162 */ 1163 fcp->isp_fwoptions |= ICBOPT_PDBCHANGE_AE; 1164 1165 1166 /* 1167 * Make sure that target role reflects into fwoptions. 1168 */ 1169 if (isp->isp_role & ISP_ROLE_TARGET) { 1170 fcp->isp_fwoptions |= ICBOPT_TGT_ENABLE; 1171 } else { 1172 fcp->isp_fwoptions &= ~ICBOPT_TGT_ENABLE; 1173 } 1174 1175 /* 1176 * Propagate all of this into the ICB structure. 1177 */ 1178 icbp->icb_fwoptions = fcp->isp_fwoptions; 1179 icbp->icb_maxfrmlen = fcp->isp_maxfrmlen; 1180 if (icbp->icb_maxfrmlen < ICB_MIN_FRMLEN || 1181 icbp->icb_maxfrmlen > ICB_MAX_FRMLEN) { 1182 isp_prt(isp, ISP_LOGERR, 1183 "bad frame length (%d) from NVRAM- using %d", 1184 fcp->isp_maxfrmlen, ICB_DFLT_FRMLEN); 1185 icbp->icb_maxfrmlen = ICB_DFLT_FRMLEN; 1186 } 1187 icbp->icb_maxalloc = fcp->isp_maxalloc; 1188 if (icbp->icb_maxalloc < 1) { 1189 isp_prt(isp, ISP_LOGERR, 1190 "bad maximum allocation (%d)- using 16", fcp->isp_maxalloc); 1191 icbp->icb_maxalloc = 16; 1192 } 1193 icbp->icb_execthrottle = fcp->isp_execthrottle; 1194 if (icbp->icb_execthrottle < 1) { 1195 isp_prt(isp, ISP_LOGERR, 1196 "bad execution throttle of %d- using 16", 1197 fcp->isp_execthrottle); 1198 icbp->icb_execthrottle = ICB_DFLT_THROTTLE; 1199 } 1200 icbp->icb_retry_delay = fcp->isp_retry_delay; 1201 icbp->icb_retry_count = fcp->isp_retry_count; 1202 icbp->icb_hardaddr = loopid; 1203 /* 1204 * Right now we just set extended options to prefer point-to-point 1205 * over loop based upon some soft config options. 1206 * 1207 * NB: for the 2300, ICBOPT_EXTENDED is required. 1208 */ 1209 if (IS_2200(isp) || IS_2300(isp)) { 1210 icbp->icb_fwoptions |= ICBOPT_EXTENDED; 1211 /* 1212 * Prefer or force Point-To-Point instead Loop? 1213 */ 1214 switch(isp->isp_confopts & ISP_CFG_PORT_PREF) { 1215 case ISP_CFG_NPORT: 1216 icbp->icb_xfwoptions |= ICBXOPT_PTP_2_LOOP; 1217 break; 1218 case ISP_CFG_NPORT_ONLY: 1219 icbp->icb_xfwoptions |= ICBXOPT_PTP_ONLY; 1220 break; 1221 case ISP_CFG_LPORT_ONLY: 1222 icbp->icb_xfwoptions |= ICBXOPT_LOOP_ONLY; 1223 break; 1224 default: 1225 icbp->icb_xfwoptions |= ICBXOPT_LOOP_2_PTP; 1226 break; 1227 } 1228 if (IS_2300(isp)) { 1229 if (isp->isp_revision < 2) { 1230 icbp->icb_fwoptions &= ~ICBOPT_FAST_POST; 1231 } 1232 if (isp->isp_confopts & ISP_CFG_ONEGB) { 1233 icbp->icb_zfwoptions |= ICBZOPT_RATE_ONEGB; 1234 } else if (isp->isp_confopts & ISP_CFG_TWOGB) { 1235 icbp->icb_zfwoptions |= ICBZOPT_RATE_TWOGB; 1236 } else { 1237 icbp->icb_zfwoptions |= ICBZOPT_RATE_AUTO; 1238 } 1239 } 1240 } 1241 1242 if ((IS_2200(isp) && ISP_FW_REVX(isp->isp_fwrev) >= 1243 ISP_FW_REV(2, 1, 26)) || IS_2300(isp)) { 1244 /* 1245 * Turn on LIP F8 async event (1) 1246 * Turn on generate AE 8013 on all LIP Resets (2) 1247 * Disable LIP F7 switching (8) 1248 */ 1249 mbs.param[0] = MBOX_SET_FIRMWARE_OPTIONS; 1250 mbs.param[1] = 0xb; 1251 mbs.param[2] = 0; 1252 mbs.param[3] = 0; 1253 isp_mboxcmd(isp, &mbs, MBLOGALL); 1254 } 1255 icbp->icb_logintime = 30; /* 30 second login timeout */ 1256 1257 if (IS_2300(isp)) { 1258 ISP_WRITE(isp, isp->isp_rqstinrp, 0); 1259 ISP_WRITE(isp, isp->isp_rqstoutrp, 0); 1260 ISP_WRITE(isp, isp->isp_respinrp, 0); 1261 ISP_WRITE(isp, isp->isp_respoutrp, 0); 1262 } 1263 1264 nwwn = ISP_NODEWWN(isp); 1265 pwwn = ISP_PORTWWN(isp); 1266 if (nwwn && pwwn) { 1267 icbp->icb_fwoptions |= ICBOPT_BOTH_WWNS; 1268 MAKE_NODE_NAME_FROM_WWN(icbp->icb_nodename, nwwn); 1269 MAKE_NODE_NAME_FROM_WWN(icbp->icb_portname, pwwn); 1270 isp_prt(isp, ISP_LOGDEBUG1, 1271 "Setting ICB Node 0x%08x%08x Port 0x%08x%08x", 1272 ((u_int32_t) (nwwn >> 32)), 1273 ((u_int32_t) (nwwn & 0xffffffff)), 1274 ((u_int32_t) (pwwn >> 32)), 1275 ((u_int32_t) (pwwn & 0xffffffff))); 1276 } else { 1277 isp_prt(isp, ISP_LOGDEBUG1, "Not using any WWNs"); 1278 icbp->icb_fwoptions &= ~(ICBOPT_BOTH_WWNS|ICBOPT_FULL_LOGIN); 1279 } 1280 icbp->icb_rqstqlen = RQUEST_QUEUE_LEN(isp); 1281 icbp->icb_rsltqlen = RESULT_QUEUE_LEN(isp); 1282 icbp->icb_rqstaddr[RQRSP_ADDR0015] = DMA_WD0(isp->isp_rquest_dma); 1283 icbp->icb_rqstaddr[RQRSP_ADDR1631] = DMA_WD1(isp->isp_rquest_dma); 1284 icbp->icb_rqstaddr[RQRSP_ADDR3247] = DMA_WD2(isp->isp_rquest_dma); 1285 icbp->icb_rqstaddr[RQRSP_ADDR4863] = DMA_WD3(isp->isp_rquest_dma); 1286 icbp->icb_respaddr[RQRSP_ADDR0015] = DMA_WD0(isp->isp_result_dma); 1287 icbp->icb_respaddr[RQRSP_ADDR1631] = DMA_WD1(isp->isp_result_dma); 1288 icbp->icb_respaddr[RQRSP_ADDR3247] = DMA_WD2(isp->isp_result_dma); 1289 icbp->icb_respaddr[RQRSP_ADDR4863] = DMA_WD3(isp->isp_result_dma); 1290 isp_prt(isp, ISP_LOGDEBUG1, 1291 "isp_fibre_init: fwoptions 0x%x", fcp->isp_fwoptions); 1292 ISP_SWIZZLE_ICB(isp, icbp); 1293 1294 1295 /* 1296 * Init the firmware 1297 */ 1298 mbs.param[0] = MBOX_INIT_FIRMWARE; 1299 mbs.param[1] = 0; 1300 mbs.param[2] = DMA_WD1(fcp->isp_scdma); 1301 mbs.param[3] = DMA_WD0(fcp->isp_scdma); 1302 mbs.param[4] = 0; 1303 mbs.param[5] = 0; 1304 mbs.param[6] = DMA_WD3(fcp->isp_scdma); 1305 mbs.param[7] = DMA_WD2(fcp->isp_scdma); 1306 isp_mboxcmd(isp, &mbs, MBLOGALL); 1307 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 1308 return; 1309 } 1310 isp->isp_reqidx = isp->isp_reqodx = 0; 1311 isp->isp_residx = 0; 1312 isp->isp_sendmarker = 1; 1313 1314 /* 1315 * Whatever happens, we're now committed to being here. 1316 */ 1317 isp->isp_state = ISP_INITSTATE; 1318} 1319 1320/* 1321 * Fibre Channel Support- get the port database for the id. 1322 * 1323 * Locks are held before coming here. Return 0 if success, 1324 * else failure. 1325 */ 1326 1327static int 1328isp_getmap(struct ispsoftc *isp, fcpos_map_t *map) 1329{ 1330 fcparam *fcp = (fcparam *) isp->isp_param; 1331 mbreg_t mbs; 1332 1333 mbs.param[0] = MBOX_GET_FC_AL_POSITION_MAP; 1334 mbs.param[1] = 0; 1335 mbs.param[2] = DMA_WD1(fcp->isp_scdma); 1336 mbs.param[3] = DMA_WD0(fcp->isp_scdma); 1337 /* 1338 * Unneeded. For the 2100, except for initializing f/w, registers 1339 * 4/5 have to not be written to. 1340 * mbs.param[4] = 0; 1341 * mbs.param[5] = 0; 1342 * 1343 */ 1344 mbs.param[6] = 0; 1345 mbs.param[7] = 0; 1346 isp_mboxcmd(isp, &mbs, MBLOGALL & ~MBOX_COMMAND_PARAM_ERROR); 1347 if (mbs.param[0] == MBOX_COMMAND_COMPLETE) { 1348 MEMCPY(map, fcp->isp_scratch, sizeof (fcpos_map_t)); 1349 map->fwmap = mbs.param[1] != 0; 1350 return (0); 1351 } 1352 return (-1); 1353} 1354 1355static void 1356isp_mark_getpdb_all(struct ispsoftc *isp) 1357{ 1358 fcparam *fcp = (fcparam *) isp->isp_param; 1359 int i; 1360 for (i = 0; i < MAX_FC_TARG; i++) { 1361 fcp->portdb[i].valid = fcp->portdb[i].fabric_dev = 0; 1362 } 1363} 1364 1365static int 1366isp_getpdb(struct ispsoftc *isp, int id, isp_pdb_t *pdbp) 1367{ 1368 fcparam *fcp = (fcparam *) isp->isp_param; 1369 mbreg_t mbs; 1370 1371 mbs.param[0] = MBOX_GET_PORT_DB; 1372 mbs.param[1] = id << 8; 1373 mbs.param[2] = DMA_WD1(fcp->isp_scdma); 1374 mbs.param[3] = DMA_WD0(fcp->isp_scdma); 1375 /* 1376 * Unneeded. For the 2100, except for initializing f/w, registers 1377 * 4/5 have to not be written to. 1378 * mbs.param[4] = 0; 1379 * mbs.param[5] = 0; 1380 * 1381 */ 1382 mbs.param[6] = DMA_WD3(fcp->isp_scdma); 1383 mbs.param[7] = DMA_WD2(fcp->isp_scdma); 1384 isp_mboxcmd(isp, &mbs, MBLOGALL & ~MBOX_COMMAND_PARAM_ERROR); 1385 if (mbs.param[0] == MBOX_COMMAND_COMPLETE) { 1386 ISP_UNSWIZZLE_AND_COPY_PDBP(isp, pdbp, fcp->isp_scratch); 1387 return (0); 1388 } 1389 return (-1); 1390} 1391 1392static u_int64_t 1393isp_get_portname(struct ispsoftc *isp, int loopid, int nodename) 1394{ 1395 u_int64_t wwn = 0; 1396 mbreg_t mbs; 1397 1398 mbs.param[0] = MBOX_GET_PORT_NAME; 1399 mbs.param[1] = loopid << 8; 1400 if (nodename) 1401 mbs.param[1] |= 1; 1402 isp_mboxcmd(isp, &mbs, MBLOGALL & ~MBOX_COMMAND_PARAM_ERROR); 1403 if (mbs.param[0] == MBOX_COMMAND_COMPLETE) { 1404 wwn = 1405 (((u_int64_t)(mbs.param[2] & 0xff)) << 56) | 1406 (((u_int64_t)(mbs.param[2] >> 8)) << 48) | 1407 (((u_int64_t)(mbs.param[3] & 0xff)) << 40) | 1408 (((u_int64_t)(mbs.param[3] >> 8)) << 32) | 1409 (((u_int64_t)(mbs.param[6] & 0xff)) << 24) | 1410 (((u_int64_t)(mbs.param[6] >> 8)) << 16) | 1411 (((u_int64_t)(mbs.param[7] & 0xff)) << 8) | 1412 (((u_int64_t)(mbs.param[7] >> 8))); 1413 } 1414 return (wwn); 1415} 1416 1417/* 1418 * Make sure we have good FC link and know our Loop ID. 1419 */ 1420 1421static int 1422isp_fclink_test(struct ispsoftc *isp, int usdelay) 1423{ 1424 static char *toponames[] = { 1425 "Private Loop", 1426 "FL Port", 1427 "N-Port to N-Port", 1428 "F Port", 1429 "F Port (no FLOGI_ACC response)" 1430 }; 1431 mbreg_t mbs; 1432 int count, check_for_fabric; 1433 u_int8_t lwfs; 1434 fcparam *fcp; 1435 struct lportdb *lp; 1436 isp_pdb_t pdb; 1437 1438 fcp = isp->isp_param; 1439 1440 /* 1441 * XXX: Here is where we would start a 'loop dead' timeout 1442 */ 1443 1444 /* 1445 * Wait up to N microseconds for F/W to go to a ready state. 1446 */ 1447 lwfs = FW_CONFIG_WAIT; 1448 count = 0; 1449 while (count < usdelay) { 1450 u_int64_t enano; 1451 u_int32_t wrk; 1452 NANOTIME_T hra, hrb; 1453 1454 GET_NANOTIME(&hra); 1455 isp_fw_state(isp); 1456 if (lwfs != fcp->isp_fwstate) { 1457 isp_prt(isp, ISP_LOGINFO, "Firmware State <%s->%s>", 1458 isp2100_fw_statename((int)lwfs), 1459 isp2100_fw_statename((int)fcp->isp_fwstate)); 1460 lwfs = fcp->isp_fwstate; 1461 } 1462 if (fcp->isp_fwstate == FW_READY) { 1463 break; 1464 } 1465 GET_NANOTIME(&hrb); 1466 1467 /* 1468 * Get the elapsed time in nanoseconds. 1469 * Always guaranteed to be non-zero. 1470 */ 1471 enano = NANOTIME_SUB(&hrb, &hra); 1472 1473 isp_prt(isp, ISP_LOGDEBUG1, 1474 "usec%d: 0x%lx->0x%lx enano 0x%x%08x", 1475 count, (long) GET_NANOSEC(&hra), (long) GET_NANOSEC(&hrb), 1476 (u_int32_t)(enano >> 32), (u_int32_t)(enano & 0xffffffff)); 1477 1478 /* 1479 * If the elapsed time is less than 1 millisecond, 1480 * delay a period of time up to that millisecond of 1481 * waiting. 1482 * 1483 * This peculiar code is an attempt to try and avoid 1484 * invoking u_int64_t math support functions for some 1485 * platforms where linkage is a problem. 1486 */ 1487 if (enano < (1000 * 1000)) { 1488 count += 1000; 1489 enano = (1000 * 1000) - enano; 1490 while (enano > (u_int64_t) 4000000000U) { 1491 USEC_SLEEP(isp, 4000000); 1492 enano -= (u_int64_t) 4000000000U; 1493 } 1494 wrk = enano; 1495 wrk /= 1000; 1496 USEC_SLEEP(isp, wrk); 1497 } else { 1498 while (enano > (u_int64_t) 4000000000U) { 1499 count += 4000000; 1500 enano -= (u_int64_t) 4000000000U; 1501 } 1502 wrk = enano; 1503 count += (wrk / 1000); 1504 } 1505 } 1506 1507 /* 1508 * If we haven't gone to 'ready' state, return. 1509 */ 1510 if (fcp->isp_fwstate != FW_READY) { 1511 return (-1); 1512 } 1513 1514 /* 1515 * Get our Loop ID (if possible). We really need to have it. 1516 */ 1517 mbs.param[0] = MBOX_GET_LOOP_ID; 1518 isp_mboxcmd(isp, &mbs, MBLOGALL); 1519 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 1520 return (-1); 1521 } 1522 fcp->isp_loopid = mbs.param[1]; 1523 if (IS_2200(isp) || IS_2300(isp)) { 1524 int topo = (int) mbs.param[6]; 1525 if (topo < TOPO_NL_PORT || topo > TOPO_PTP_STUB) 1526 topo = TOPO_PTP_STUB; 1527 fcp->isp_topo = topo; 1528 } else { 1529 fcp->isp_topo = TOPO_NL_PORT; 1530 } 1531 fcp->isp_portid = fcp->isp_alpa = mbs.param[2] & 0xff; 1532 1533 /* 1534 * Check to see if we're on a fabric by trying to see if we 1535 * can talk to the fabric name server. This can be a bit 1536 * tricky because if we're a 2100, we should check always 1537 * (in case we're connected to an server doing aliasing). 1538 */ 1539 fcp->isp_onfabric = 0; 1540 1541 if (IS_2100(isp)) 1542 check_for_fabric = 1; 1543 else if (fcp->isp_topo == TOPO_FL_PORT || fcp->isp_topo == TOPO_F_PORT) 1544 check_for_fabric = 1; 1545 else 1546 check_for_fabric = 0; 1547 1548 if (check_for_fabric && isp_getpdb(isp, FL_PORT_ID, &pdb) == 0) { 1549 int loopid = FL_PORT_ID; 1550 if (IS_2100(isp)) { 1551 fcp->isp_topo = TOPO_FL_PORT; 1552 } 1553 1554 if (BITS2WORD(pdb.pdb_portid_bits) == 0) { 1555 /* 1556 * Crock. 1557 */ 1558 fcp->isp_topo = TOPO_NL_PORT; 1559 goto not_on_fabric; 1560 } 1561 fcp->isp_portid = mbs.param[2] | ((int) mbs.param[3] << 16); 1562 1563 /* 1564 * Save the Fabric controller's port database entry. 1565 */ 1566 lp = &fcp->portdb[loopid]; 1567 lp->node_wwn = 1568 (((u_int64_t)pdb.pdb_nodename[0]) << 56) | 1569 (((u_int64_t)pdb.pdb_nodename[1]) << 48) | 1570 (((u_int64_t)pdb.pdb_nodename[2]) << 40) | 1571 (((u_int64_t)pdb.pdb_nodename[3]) << 32) | 1572 (((u_int64_t)pdb.pdb_nodename[4]) << 24) | 1573 (((u_int64_t)pdb.pdb_nodename[5]) << 16) | 1574 (((u_int64_t)pdb.pdb_nodename[6]) << 8) | 1575 (((u_int64_t)pdb.pdb_nodename[7])); 1576 lp->port_wwn = 1577 (((u_int64_t)pdb.pdb_portname[0]) << 56) | 1578 (((u_int64_t)pdb.pdb_portname[1]) << 48) | 1579 (((u_int64_t)pdb.pdb_portname[2]) << 40) | 1580 (((u_int64_t)pdb.pdb_portname[3]) << 32) | 1581 (((u_int64_t)pdb.pdb_portname[4]) << 24) | 1582 (((u_int64_t)pdb.pdb_portname[5]) << 16) | 1583 (((u_int64_t)pdb.pdb_portname[6]) << 8) | 1584 (((u_int64_t)pdb.pdb_portname[7])); 1585 lp->roles = 1586 (pdb.pdb_prli_svc3 & SVC3_ROLE_MASK) >> SVC3_ROLE_SHIFT; 1587 lp->portid = BITS2WORD(pdb.pdb_portid_bits); 1588 lp->loopid = pdb.pdb_loopid; 1589 lp->loggedin = lp->valid = 1; 1590 fcp->isp_onfabric = 1; 1591 (void) isp_async(isp, ISPASYNC_PROMENADE, &loopid); 1592 isp_register_fc4_type(isp); 1593 } else { 1594not_on_fabric: 1595 fcp->isp_onfabric = 0; 1596 fcp->portdb[FL_PORT_ID].valid = 0; 1597 } 1598 1599 fcp->isp_gbspeed = 1; 1600 if (IS_2300(isp)) { 1601 mbs.param[0] = MBOX_GET_SET_DATA_RATE; 1602 mbs.param[1] = MBGSD_GET_RATE; 1603 /* mbs.param[2] undefined if we're just getting rate */ 1604 isp_mboxcmd(isp, &mbs, MBLOGALL); 1605 if (mbs.param[0] == MBOX_COMMAND_COMPLETE) { 1606 if (mbs.param[1] == MBGSD_TWOGB) { 1607 isp_prt(isp, ISP_LOGINFO, "2Gb link speed/s"); 1608 fcp->isp_gbspeed = 2; 1609 } 1610 } 1611 } 1612 1613 isp_prt(isp, ISP_LOGINFO, topology, fcp->isp_loopid, fcp->isp_alpa, 1614 fcp->isp_portid, fcp->isp_loopstate, toponames[fcp->isp_topo]); 1615 1616 /* 1617 * Announce ourselves, too. This involves synthesizing an entry. 1618 */ 1619 if (fcp->isp_iid_set == 0) { 1620 fcp->isp_iid_set = 1; 1621 fcp->isp_iid = fcp->isp_loopid; 1622 lp = &fcp->portdb[fcp->isp_iid]; 1623 } else { 1624 lp = &fcp->portdb[fcp->isp_iid]; 1625 if (fcp->isp_portid != lp->portid || 1626 fcp->isp_loopid != lp->loopid || 1627 fcp->isp_nodewwn != ISP_NODEWWN(isp) || 1628 fcp->isp_portwwn != ISP_PORTWWN(isp)) { 1629 lp->valid = 0; 1630 count = fcp->isp_iid; 1631 (void) isp_async(isp, ISPASYNC_PROMENADE, &count); 1632 } 1633 } 1634 lp->loopid = fcp->isp_loopid; 1635 lp->portid = fcp->isp_portid; 1636 lp->node_wwn = ISP_NODEWWN(isp); 1637 lp->port_wwn = ISP_PORTWWN(isp); 1638 switch (isp->isp_role) { 1639 case ISP_ROLE_NONE: 1640 lp->roles = 0; 1641 break; 1642 case ISP_ROLE_TARGET: 1643 lp->roles = SVC3_TGT_ROLE >> SVC3_ROLE_SHIFT; 1644 break; 1645 case ISP_ROLE_INITIATOR: 1646 lp->roles = SVC3_INI_ROLE >> SVC3_ROLE_SHIFT; 1647 break; 1648 case ISP_ROLE_BOTH: 1649 lp->roles = (SVC3_INI_ROLE|SVC3_TGT_ROLE) >> SVC3_ROLE_SHIFT; 1650 break; 1651 } 1652 lp->loggedin = lp->valid = 1; 1653 count = fcp->isp_iid; 1654 (void) isp_async(isp, ISPASYNC_PROMENADE, &count); 1655 return (0); 1656} 1657 1658static char * 1659isp2100_fw_statename(int state) 1660{ 1661 switch(state) { 1662 case FW_CONFIG_WAIT: return "Config Wait"; 1663 case FW_WAIT_AL_PA: return "Waiting for AL_PA"; 1664 case FW_WAIT_LOGIN: return "Wait Login"; 1665 case FW_READY: return "Ready"; 1666 case FW_LOSS_OF_SYNC: return "Loss Of Sync"; 1667 case FW_ERROR: return "Error"; 1668 case FW_REINIT: return "Re-Init"; 1669 case FW_NON_PART: return "Nonparticipating"; 1670 default: return "?????"; 1671 } 1672} 1673 1674/* 1675 * Synchronize our soft copy of the port database with what the f/w thinks 1676 * (with a view toward possibly for a specific target....) 1677 */ 1678 1679static int 1680isp_pdb_sync(struct ispsoftc *isp) 1681{ 1682 struct lportdb *lp; 1683 fcparam *fcp = isp->isp_param; 1684 isp_pdb_t pdb; 1685 int loopid, base, lim; 1686 1687 /* 1688 * Make sure we're okay for doing this right now. 1689 */ 1690 if (fcp->isp_loopstate != LOOP_PDB_RCVD && 1691 fcp->isp_loopstate != LOOP_FSCAN_DONE && 1692 fcp->isp_loopstate != LOOP_LSCAN_DONE) { 1693 return (-1); 1694 } 1695 1696 if (fcp->isp_topo == TOPO_FL_PORT || fcp->isp_topo == TOPO_NL_PORT || 1697 fcp->isp_topo == TOPO_N_PORT) { 1698 if (fcp->isp_loopstate < LOOP_LSCAN_DONE) { 1699 if (isp_scan_loop(isp) != 0) { 1700 return (-1); 1701 } 1702 } 1703 } 1704 fcp->isp_loopstate = LOOP_SYNCING_PDB; 1705 1706 /* 1707 * If we get this far, we've settled our differences with the f/w 1708 * (for local loop device) and we can say that the loop state is ready. 1709 */ 1710 1711 if (fcp->isp_topo == TOPO_NL_PORT) { 1712 fcp->loop_seen_once = 1; 1713 fcp->isp_loopstate = LOOP_READY; 1714 return (0); 1715 } 1716 1717 /* 1718 * Find all Fabric Entities that didn't make it from one scan to the 1719 * next and let the world know they went away. Scan the whole database. 1720 */ 1721 for (lp = &fcp->portdb[0]; lp < &fcp->portdb[MAX_FC_TARG]; lp++) { 1722 if (lp->was_fabric_dev && lp->fabric_dev == 0) { 1723 loopid = lp - fcp->portdb; 1724 lp->valid = 0; /* should already be set */ 1725 (void) isp_async(isp, ISPASYNC_PROMENADE, &loopid); 1726 MEMZERO((void *) lp, sizeof (*lp)); 1727 continue; 1728 } 1729 lp->was_fabric_dev = lp->fabric_dev; 1730 } 1731 1732 if (fcp->isp_topo == TOPO_FL_PORT) 1733 base = FC_SNS_ID+1; 1734 else 1735 base = 0; 1736 1737 if (fcp->isp_topo == TOPO_N_PORT) 1738 lim = 1; 1739 else 1740 lim = MAX_FC_TARG; 1741 1742 /* 1743 * Now log in any fabric devices that the outer layer has 1744 * left for us to see. This seems the most sane policy 1745 * for the moment. 1746 */ 1747 for (lp = &fcp->portdb[base]; lp < &fcp->portdb[lim]; lp++) { 1748 u_int32_t portid; 1749 mbreg_t mbs; 1750 1751 loopid = lp - fcp->portdb; 1752 if (loopid >= FL_PORT_ID && loopid <= FC_SNS_ID) { 1753 continue; 1754 } 1755 1756 /* 1757 * Anything here? 1758 */ 1759 if (lp->port_wwn == 0) { 1760 continue; 1761 } 1762 1763 /* 1764 * Don't try to log into yourself. 1765 */ 1766 if ((portid = lp->portid) == fcp->isp_portid) { 1767 continue; 1768 } 1769 1770 1771 /* 1772 * If we'd been logged in- see if we still are and we haven't 1773 * changed. If so, no need to log ourselves out, etc.. 1774 * 1775 * Unfortunately, our charming Qlogic f/w has decided to 1776 * return a valid port database entry for a fabric device 1777 * that has, in fact, gone away. And it hangs trying to 1778 * log it out. 1779 */ 1780 if (lp->loggedin && 1781 isp_getpdb(isp, lp->loopid, &pdb) == 0) { 1782 int nrole; 1783 u_int64_t nwwnn, nwwpn; 1784 nwwnn = 1785 (((u_int64_t)pdb.pdb_nodename[0]) << 56) | 1786 (((u_int64_t)pdb.pdb_nodename[1]) << 48) | 1787 (((u_int64_t)pdb.pdb_nodename[2]) << 40) | 1788 (((u_int64_t)pdb.pdb_nodename[3]) << 32) | 1789 (((u_int64_t)pdb.pdb_nodename[4]) << 24) | 1790 (((u_int64_t)pdb.pdb_nodename[5]) << 16) | 1791 (((u_int64_t)pdb.pdb_nodename[6]) << 8) | 1792 (((u_int64_t)pdb.pdb_nodename[7])); 1793 nwwpn = 1794 (((u_int64_t)pdb.pdb_portname[0]) << 56) | 1795 (((u_int64_t)pdb.pdb_portname[1]) << 48) | 1796 (((u_int64_t)pdb.pdb_portname[2]) << 40) | 1797 (((u_int64_t)pdb.pdb_portname[3]) << 32) | 1798 (((u_int64_t)pdb.pdb_portname[4]) << 24) | 1799 (((u_int64_t)pdb.pdb_portname[5]) << 16) | 1800 (((u_int64_t)pdb.pdb_portname[6]) << 8) | 1801 (((u_int64_t)pdb.pdb_portname[7])); 1802 nrole = (pdb.pdb_prli_svc3 & SVC3_ROLE_MASK) >> 1803 SVC3_ROLE_SHIFT; 1804 if (pdb.pdb_loopid == lp->loopid && lp->portid == 1805 (u_int32_t) BITS2WORD(pdb.pdb_portid_bits) && 1806 nwwnn == lp->node_wwn && nwwpn == lp->port_wwn && 1807 lp->roles == nrole && lp->force_logout == 0) { 1808 lp->loggedin = lp->valid = 1; 1809 isp_prt(isp, ISP_LOGINFO, lretained, 1810 (int) (lp - fcp->portdb), 1811 (int) lp->loopid, lp->portid); 1812 continue; 1813 } 1814 } 1815 1816 lp->force_logout = 0; 1817 1818 if (fcp->isp_fwstate != FW_READY || 1819 fcp->isp_loopstate != LOOP_SYNCING_PDB) { 1820 return (-1); 1821 } 1822 1823 /* 1824 * Force a logout if we were logged in. 1825 */ 1826 if (lp->loggedin) { 1827 if (isp_getpdb(isp, lp->loopid, &pdb) == 0) { 1828 mbs.param[0] = MBOX_FABRIC_LOGOUT; 1829 mbs.param[1] = lp->loopid << 8; 1830 mbs.param[2] = 0; 1831 mbs.param[3] = 0; 1832 isp_mboxcmd(isp, &mbs, MBLOGNONE); 1833 lp->loggedin = 0; 1834 isp_prt(isp, ISP_LOGINFO, plogout, 1835 (int) (lp - fcp->portdb), lp->loopid, 1836 lp->portid); 1837 } 1838 lp->loggedin = 0; 1839 if (fcp->isp_fwstate != FW_READY || 1840 fcp->isp_loopstate != LOOP_SYNCING_PDB) { 1841 return (-1); 1842 } 1843 } 1844 1845 /* 1846 * And log in.... 1847 */ 1848 loopid = lp - fcp->portdb; 1849 lp->loopid = FL_PORT_ID; 1850 do { 1851 mbs.param[0] = MBOX_FABRIC_LOGIN; 1852 mbs.param[1] = loopid << 8; 1853 mbs.param[2] = portid >> 16; 1854 mbs.param[3] = portid & 0xffff; 1855 if (IS_2200(isp) || IS_2300(isp)) { 1856 /* only issue a PLOGI if not logged in */ 1857 mbs.param[1] |= 0x1; 1858 } 1859 isp_mboxcmd(isp, &mbs, MBLOGALL & ~(MBOX_LOOP_ID_USED | 1860 MBOX_PORT_ID_USED | MBOX_COMMAND_ERROR)); 1861 if (fcp->isp_fwstate != FW_READY || 1862 fcp->isp_loopstate != LOOP_SYNCING_PDB) { 1863 return (-1); 1864 } 1865 switch (mbs.param[0]) { 1866 case MBOX_LOOP_ID_USED: 1867 /* 1868 * Try the next available loop id. 1869 */ 1870 loopid++; 1871 break; 1872 case MBOX_PORT_ID_USED: 1873 /* 1874 * This port is already logged in. 1875 * Snaffle the loop id it's using if it's 1876 * nonzero, otherwise we're hosed. 1877 */ 1878 if (mbs.param[1] != 0) { 1879 loopid = mbs.param[1]; 1880 isp_prt(isp, ISP_LOGINFO, retained, 1881 loopid, (int) (lp - fcp->portdb), 1882 lp->portid); 1883 } else { 1884 loopid = MAX_FC_TARG; 1885 break; 1886 } 1887 /* FALLTHROUGH */ 1888 case MBOX_COMMAND_COMPLETE: 1889 lp->loggedin = 1; 1890 lp->loopid = loopid; 1891 break; 1892 case MBOX_COMMAND_ERROR: 1893 isp_prt(isp, ISP_LOGINFO, plogierr, 1894 portid, mbs.param[1]); 1895 /* FALLTHROUGH */ 1896 case MBOX_ALL_IDS_USED: /* We're outta IDs */ 1897 default: 1898 loopid = MAX_FC_TARG; 1899 break; 1900 } 1901 } while (lp->loopid == FL_PORT_ID && loopid < MAX_FC_TARG); 1902 1903 /* 1904 * If we get here and we haven't set a Loop ID, 1905 * we failed to log into this device. 1906 */ 1907 1908 if (lp->loopid == FL_PORT_ID) { 1909 lp->loopid = 0; 1910 continue; 1911 } 1912 1913 /* 1914 * Make sure we can get the approriate port information. 1915 */ 1916 if (isp_getpdb(isp, lp->loopid, &pdb) != 0) { 1917 isp_prt(isp, ISP_LOGWARN, nopdb, lp->portid); 1918 goto dump_em; 1919 } 1920 1921 if (fcp->isp_fwstate != FW_READY || 1922 fcp->isp_loopstate != LOOP_SYNCING_PDB) { 1923 return (-1); 1924 } 1925 1926 if (pdb.pdb_loopid != lp->loopid) { 1927 isp_prt(isp, ISP_LOGWARN, pdbmfail1, 1928 lp->portid, pdb.pdb_loopid); 1929 goto dump_em; 1930 } 1931 1932 if (lp->portid != (u_int32_t) BITS2WORD(pdb.pdb_portid_bits)) { 1933 isp_prt(isp, ISP_LOGWARN, pdbmfail2, 1934 lp->portid, BITS2WORD(pdb.pdb_portid_bits)); 1935 goto dump_em; 1936 } 1937 1938 lp->roles = 1939 (pdb.pdb_prli_svc3 & SVC3_ROLE_MASK) >> SVC3_ROLE_SHIFT; 1940 lp->node_wwn = 1941 (((u_int64_t)pdb.pdb_nodename[0]) << 56) | 1942 (((u_int64_t)pdb.pdb_nodename[1]) << 48) | 1943 (((u_int64_t)pdb.pdb_nodename[2]) << 40) | 1944 (((u_int64_t)pdb.pdb_nodename[3]) << 32) | 1945 (((u_int64_t)pdb.pdb_nodename[4]) << 24) | 1946 (((u_int64_t)pdb.pdb_nodename[5]) << 16) | 1947 (((u_int64_t)pdb.pdb_nodename[6]) << 8) | 1948 (((u_int64_t)pdb.pdb_nodename[7])); 1949 lp->port_wwn = 1950 (((u_int64_t)pdb.pdb_portname[0]) << 56) | 1951 (((u_int64_t)pdb.pdb_portname[1]) << 48) | 1952 (((u_int64_t)pdb.pdb_portname[2]) << 40) | 1953 (((u_int64_t)pdb.pdb_portname[3]) << 32) | 1954 (((u_int64_t)pdb.pdb_portname[4]) << 24) | 1955 (((u_int64_t)pdb.pdb_portname[5]) << 16) | 1956 (((u_int64_t)pdb.pdb_portname[6]) << 8) | 1957 (((u_int64_t)pdb.pdb_portname[7])); 1958 /* 1959 * Check to make sure this all makes sense. 1960 */ 1961 if (lp->node_wwn && lp->port_wwn) { 1962 lp->valid = 1; 1963 loopid = lp - fcp->portdb; 1964 (void) isp_async(isp, ISPASYNC_PROMENADE, &loopid); 1965 continue; 1966 } 1967dump_em: 1968 lp->valid = 0; 1969 isp_prt(isp, ISP_LOGINFO, 1970 ldumped, loopid, lp->loopid, lp->portid); 1971 mbs.param[0] = MBOX_FABRIC_LOGOUT; 1972 mbs.param[1] = lp->loopid << 8; 1973 mbs.param[2] = 0; 1974 mbs.param[3] = 0; 1975 isp_mboxcmd(isp, &mbs, MBLOGNONE); 1976 if (fcp->isp_fwstate != FW_READY || 1977 fcp->isp_loopstate != LOOP_SYNCING_PDB) { 1978 return (-1); 1979 } 1980 } 1981 /* 1982 * If we get here, we've for sure seen not only a valid loop 1983 * but know what is or isn't on it, so mark this for usage 1984 * in isp_start. 1985 */ 1986 fcp->loop_seen_once = 1; 1987 fcp->isp_loopstate = LOOP_READY; 1988 return (0); 1989} 1990 1991static int 1992isp_scan_loop(struct ispsoftc *isp) 1993{ 1994 struct lportdb *lp; 1995 fcparam *fcp = isp->isp_param; 1996 isp_pdb_t pdb; 1997 int loopid, lim, hival; 1998 1999 switch (fcp->isp_topo) { 2000 case TOPO_NL_PORT: 2001 hival = FL_PORT_ID; 2002 break; 2003 case TOPO_N_PORT: 2004 hival = 2; 2005 break; 2006 case TOPO_FL_PORT: 2007 hival = FC_PORT_ID; 2008 break; 2009 default: 2010 fcp->isp_loopstate = LOOP_LSCAN_DONE; 2011 return (0); 2012 } 2013 fcp->isp_loopstate = LOOP_SCANNING_LOOP; 2014 2015 /* 2016 * make sure the temp port database is clean... 2017 */ 2018 MEMZERO((void *)fcp->tport, sizeof (fcp->tport)); 2019 2020 /* 2021 * Run through the local loop ports and get port database info 2022 * for each loop ID. 2023 * 2024 * There's a somewhat unexplained situation where the f/w passes back 2025 * the wrong database entity- if that happens, just restart (up to 2026 * FL_PORT_ID times). 2027 */ 2028 for (lim = loopid = 0; loopid < hival; loopid++) { 2029 lp = &fcp->tport[loopid]; 2030 2031 /* 2032 * Don't even try for ourselves... 2033 */ 2034 if (loopid == fcp->isp_loopid) 2035 continue; 2036 2037 lp->node_wwn = isp_get_portname(isp, loopid, 1); 2038 if (fcp->isp_loopstate < LOOP_SCANNING_LOOP) 2039 return (-1); 2040 if (lp->node_wwn == 0) 2041 continue; 2042 lp->port_wwn = isp_get_portname(isp, loopid, 0); 2043 if (fcp->isp_loopstate < LOOP_SCANNING_LOOP) 2044 return (-1); 2045 if (lp->port_wwn == 0) { 2046 lp->node_wwn = 0; 2047 continue; 2048 } 2049 2050 /* 2051 * Get an entry.... 2052 */ 2053 if (isp_getpdb(isp, loopid, &pdb) != 0) { 2054 if (fcp->isp_loopstate < LOOP_SCANNING_LOOP) 2055 return (-1); 2056 continue; 2057 } 2058 if (fcp->isp_loopstate < LOOP_SCANNING_LOOP) { 2059 return (-1); 2060 } 2061 2062 /* 2063 * If the returned database element doesn't match what we 2064 * asked for, restart the process entirely (up to a point...). 2065 */ 2066 if (pdb.pdb_loopid != loopid) { 2067 loopid = 0; 2068 if (lim++ < hival) { 2069 continue; 2070 } 2071 isp_prt(isp, ISP_LOGWARN, 2072 "giving up on synchronizing the port database"); 2073 return (-1); 2074 } 2075 2076 /* 2077 * Save the pertinent info locally. 2078 */ 2079 lp->node_wwn = 2080 (((u_int64_t)pdb.pdb_nodename[0]) << 56) | 2081 (((u_int64_t)pdb.pdb_nodename[1]) << 48) | 2082 (((u_int64_t)pdb.pdb_nodename[2]) << 40) | 2083 (((u_int64_t)pdb.pdb_nodename[3]) << 32) | 2084 (((u_int64_t)pdb.pdb_nodename[4]) << 24) | 2085 (((u_int64_t)pdb.pdb_nodename[5]) << 16) | 2086 (((u_int64_t)pdb.pdb_nodename[6]) << 8) | 2087 (((u_int64_t)pdb.pdb_nodename[7])); 2088 lp->port_wwn = 2089 (((u_int64_t)pdb.pdb_portname[0]) << 56) | 2090 (((u_int64_t)pdb.pdb_portname[1]) << 48) | 2091 (((u_int64_t)pdb.pdb_portname[2]) << 40) | 2092 (((u_int64_t)pdb.pdb_portname[3]) << 32) | 2093 (((u_int64_t)pdb.pdb_portname[4]) << 24) | 2094 (((u_int64_t)pdb.pdb_portname[5]) << 16) | 2095 (((u_int64_t)pdb.pdb_portname[6]) << 8) | 2096 (((u_int64_t)pdb.pdb_portname[7])); 2097 lp->roles = 2098 (pdb.pdb_prli_svc3 & SVC3_ROLE_MASK) >> SVC3_ROLE_SHIFT; 2099 lp->portid = BITS2WORD(pdb.pdb_portid_bits); 2100 lp->loopid = pdb.pdb_loopid; 2101 } 2102 2103 /* 2104 * Mark all of the permanent local loop database entries as invalid 2105 * (except our own entry). 2106 */ 2107 for (loopid = 0; loopid < hival; loopid++) { 2108 if (loopid == fcp->isp_iid) { 2109 fcp->portdb[loopid].valid = 1; 2110 fcp->portdb[loopid].loopid = fcp->isp_loopid; 2111 continue; 2112 } 2113 fcp->portdb[loopid].valid = 0; 2114 } 2115 2116 /* 2117 * Now merge our local copy of the port database into our saved copy. 2118 * Notify the outer layers of new devices arriving. 2119 */ 2120 for (loopid = 0; loopid < hival; loopid++) { 2121 int i; 2122 2123 /* 2124 * If we don't have a non-zero Port WWN, we're not here. 2125 */ 2126 if (fcp->tport[loopid].port_wwn == 0) { 2127 continue; 2128 } 2129 2130 /* 2131 * Skip ourselves. 2132 */ 2133 if (loopid == fcp->isp_iid) { 2134 continue; 2135 } 2136 2137 /* 2138 * For the purposes of deciding whether this is the 2139 * 'same' device or not, we only search for an identical 2140 * Port WWN. Node WWNs may or may not be the same as 2141 * the Port WWN, and there may be multiple different 2142 * Port WWNs with the same Node WWN. It would be chaos 2143 * to have multiple identical Port WWNs, so we don't 2144 * allow that. 2145 */ 2146 2147 for (i = 0; i < hival; i++) { 2148 int j; 2149 if (fcp->portdb[i].port_wwn == 0) 2150 continue; 2151 if (fcp->portdb[i].port_wwn != 2152 fcp->tport[loopid].port_wwn) 2153 continue; 2154 /* 2155 * We found this WWN elsewhere- it's changed 2156 * loopids then. We don't change it's actual 2157 * position in our cached port database- we 2158 * just change the actual loop ID we'd use. 2159 */ 2160 if (fcp->portdb[i].loopid != loopid) { 2161 isp_prt(isp, ISP_LOGINFO, portshift, i, 2162 fcp->portdb[i].loopid, 2163 fcp->portdb[i].portid, loopid, 2164 fcp->tport[loopid].portid); 2165 } 2166 fcp->portdb[i].portid = fcp->tport[loopid].portid; 2167 fcp->portdb[i].loopid = loopid; 2168 fcp->portdb[i].valid = 1; 2169 fcp->portdb[i].roles = fcp->tport[loopid].roles; 2170 2171 /* 2172 * Now make sure this Port WWN doesn't exist elsewhere 2173 * in the port database. 2174 */ 2175 for (j = i+1; j < hival; j++) { 2176 if (fcp->portdb[i].port_wwn != 2177 fcp->portdb[j].port_wwn) { 2178 continue; 2179 } 2180 isp_prt(isp, ISP_LOGWARN, portdup, j, i); 2181 /* 2182 * Invalidate the 'old' *and* 'new' ones. 2183 * This is really harsh and not quite right, 2184 * but if this happens, we really don't know 2185 * who is what at this point. 2186 */ 2187 fcp->portdb[i].valid = 0; 2188 fcp->portdb[j].valid = 0; 2189 } 2190 break; 2191 } 2192 2193 /* 2194 * If we didn't traverse the entire port database, 2195 * then we found (and remapped) an existing entry. 2196 * No need to notify anyone- go for the next one. 2197 */ 2198 if (i < hival) { 2199 isp_prt(isp, ISP_LOGINFO, retained, 2200 fcp->portdb[i].loopid, i, fcp->portdb[i].portid); 2201 continue; 2202 } 2203 2204 /* 2205 * We've not found this Port WWN anywhere. It's a new entry. 2206 * See if we can leave it where it is (with target == loopid). 2207 */ 2208 if (fcp->portdb[loopid].port_wwn != 0) { 2209 for (lim = 0; lim < hival; lim++) { 2210 if (fcp->portdb[lim].port_wwn == 0) 2211 break; 2212 } 2213 /* "Cannot Happen" */ 2214 if (lim == hival) { 2215 isp_prt(isp, ISP_LOGWARN, "Remap Overflow"); 2216 continue; 2217 } 2218 i = lim; 2219 } else { 2220 i = loopid; 2221 } 2222 2223 /* 2224 * NB: The actual loopid we use here is loopid- we may 2225 * in fact be at a completely different index (target). 2226 */ 2227 fcp->portdb[i].loopid = loopid; 2228 fcp->portdb[i].port_wwn = fcp->tport[loopid].port_wwn; 2229 fcp->portdb[i].node_wwn = fcp->tport[loopid].node_wwn; 2230 fcp->portdb[i].roles = fcp->tport[loopid].roles; 2231 fcp->portdb[i].portid = fcp->tport[loopid].portid; 2232 fcp->portdb[i].valid = 1; 2233 2234 /* 2235 * Tell the outside world we've arrived. 2236 */ 2237 (void) isp_async(isp, ISPASYNC_PROMENADE, &i); 2238 } 2239 2240 /* 2241 * Now find all previously used targets that are now invalid and 2242 * notify the outer layers that they're gone. 2243 */ 2244 for (lp = &fcp->portdb[0]; lp < &fcp->portdb[hival]; lp++) { 2245 if (lp->valid || lp->port_wwn == 0) { 2246 continue; 2247 } 2248 2249 /* 2250 * Tell the outside world we've gone 2251 * away and erase our pdb entry. 2252 * 2253 */ 2254 loopid = lp - fcp->portdb; 2255 (void) isp_async(isp, ISPASYNC_PROMENADE, &loopid); 2256 MEMZERO((void *) lp, sizeof (*lp)); 2257 } 2258 fcp->isp_loopstate = LOOP_LSCAN_DONE; 2259 return (0); 2260} 2261 2262static int 2263isp_scan_fabric(struct ispsoftc *isp) 2264{ 2265 fcparam *fcp = isp->isp_param; 2266 u_int32_t portid, first_portid; 2267 sns_screq_t *reqp; 2268 sns_scrsp_t *resp; 2269 mbreg_t mbs; 2270 int hicap, first_portid_seen; 2271 2272 if (fcp->isp_onfabric == 0) { 2273 fcp->isp_loopstate = LOOP_FSCAN_DONE; 2274 return (0); 2275 } 2276 2277 reqp = (sns_screq_t *) fcp->isp_scratch; 2278 resp = (sns_scrsp_t *) (&((char *)fcp->isp_scratch)[0x100]); 2279 /* 2280 * Since Port IDs are 24 bits, we can check against having seen 2281 * anything yet with this value. 2282 */ 2283 first_portid = portid = fcp->isp_portid; 2284 fcp->isp_loopstate = LOOP_SCANNING_FABRIC; 2285 2286 for (first_portid_seen = hicap = 0; hicap < 65535; hicap++) { 2287 MEMZERO((void *) reqp, SNS_GAN_REQ_SIZE); 2288 reqp->snscb_rblen = SNS_GAN_RESP_SIZE >> 1; 2289 reqp->snscb_addr[RQRSP_ADDR0015] = 2290 DMA_WD0(fcp->isp_scdma + 0x100); 2291 reqp->snscb_addr[RQRSP_ADDR1631] = 2292 DMA_WD1(fcp->isp_scdma + 0x100); 2293 reqp->snscb_addr[RQRSP_ADDR3247] = 2294 DMA_WD2(fcp->isp_scdma + 0x100); 2295 reqp->snscb_addr[RQRSP_ADDR4863] = 2296 DMA_WD3(fcp->isp_scdma + 0x100); 2297 reqp->snscb_sblen = 6; 2298 reqp->snscb_data[0] = SNS_GAN; 2299 reqp->snscb_data[4] = portid & 0xffff; 2300 reqp->snscb_data[5] = (portid >> 16) & 0xff; 2301 ISP_SWIZZLE_SNS_REQ(isp, reqp); 2302 mbs.param[0] = MBOX_SEND_SNS; 2303 mbs.param[1] = SNS_GAN_REQ_SIZE >> 1; 2304 mbs.param[2] = DMA_WD1(fcp->isp_scdma); 2305 mbs.param[3] = DMA_WD0(fcp->isp_scdma); 2306 /* 2307 * Leave 4 and 5 alone 2308 */ 2309 mbs.param[6] = DMA_WD3(fcp->isp_scdma); 2310 mbs.param[7] = DMA_WD2(fcp->isp_scdma); 2311 isp_mboxcmd(isp, &mbs, MBLOGNONE); 2312 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 2313 if (fcp->isp_loopstate == LOOP_SCANNING_FABRIC) { 2314 fcp->isp_loopstate = LOOP_PDB_RCVD; 2315 } 2316 if (mbs.param[0] == MBOX_COMMAND_ERROR) { 2317 char tbuf[16]; 2318 char *m; 2319 switch (mbs.param[1]) { 2320 case 1: 2321 m = "No Loop"; 2322 break; 2323 case 2: 2324 m = "Failed to allocate IOCB buffer"; 2325 break; 2326 case 3: 2327 m = "Failed to allocate XCB buffer"; 2328 break; 2329 case 4: 2330 m = "timeout or transmit failed"; 2331 break; 2332 case 5: 2333 m = "no fabric loop"; 2334 break; 2335 case 6: 2336 m = "remote device not a target"; 2337 break; 2338 default: 2339 SNPRINTF(tbuf, sizeof tbuf, "%x", 2340 mbs.param[1]); 2341 m = tbuf; 2342 break; 2343 } 2344 isp_prt(isp, ISP_LOGERR, "SNS Failed- %s", m); 2345 } 2346 return (-1); 2347 } 2348 if (fcp->isp_fwstate != FW_READY || 2349 fcp->isp_loopstate < LOOP_SCANNING_FABRIC) { 2350 return (-1); 2351 } 2352 ISP_UNSWIZZLE_SNS_RSP(isp, resp, SNS_GAN_RESP_SIZE >> 1); 2353 portid = (((u_int32_t) resp->snscb_port_id[0]) << 16) | 2354 (((u_int32_t) resp->snscb_port_id[1]) << 8) | 2355 (((u_int32_t) resp->snscb_port_id[2])); 2356 (void) isp_async(isp, ISPASYNC_FABRIC_DEV, resp); 2357 if (first_portid == portid) { 2358 fcp->isp_loopstate = LOOP_FSCAN_DONE; 2359 return (0); 2360 } 2361 } 2362 2363 isp_prt(isp, ISP_LOGWARN, "broken fabric nameserver...*wheeze*..."); 2364 2365 /* 2366 * We either have a broken name server or a huge fabric if we get here. 2367 */ 2368 fcp->isp_loopstate = LOOP_FSCAN_DONE; 2369 return (0); 2370} 2371 2372static void 2373isp_register_fc4_type(struct ispsoftc *isp) 2374{ 2375 fcparam *fcp = isp->isp_param; 2376 sns_screq_t *reqp; 2377 mbreg_t mbs; 2378 2379 reqp = (sns_screq_t *) fcp->isp_scratch; 2380 MEMZERO((void *) reqp, SNS_RFT_REQ_SIZE); 2381 reqp->snscb_rblen = SNS_RFT_RESP_SIZE >> 1; 2382 reqp->snscb_addr[RQRSP_ADDR0015] = DMA_WD0(fcp->isp_scdma + 0x100); 2383 reqp->snscb_addr[RQRSP_ADDR1631] = DMA_WD1(fcp->isp_scdma + 0x100); 2384 reqp->snscb_addr[RQRSP_ADDR3247] = DMA_WD2(fcp->isp_scdma + 0x100); 2385 reqp->snscb_addr[RQRSP_ADDR4863] = DMA_WD3(fcp->isp_scdma + 0x100); 2386 reqp->snscb_sblen = 22; 2387 reqp->snscb_data[0] = SNS_RFT; 2388 reqp->snscb_data[4] = fcp->isp_portid & 0xffff; 2389 reqp->snscb_data[5] = (fcp->isp_portid >> 16) & 0xff; 2390 reqp->snscb_data[6] = 0x100; /* SCS - FCP */ 2391#if 0 2392 reqp->snscb_data[6] |= 20; /* ISO/IEC 8802-2 LLC/SNAP */ 2393#endif 2394 ISP_SWIZZLE_SNS_REQ(isp, reqp); 2395 mbs.param[0] = MBOX_SEND_SNS; 2396 mbs.param[1] = SNS_RFT_REQ_SIZE >> 1; 2397 mbs.param[2] = DMA_WD1(fcp->isp_scdma); 2398 mbs.param[3] = DMA_WD0(fcp->isp_scdma); 2399 /* 2400 * Leave 4 and 5 alone 2401 */ 2402 mbs.param[6] = DMA_WD3(fcp->isp_scdma); 2403 mbs.param[7] = DMA_WD2(fcp->isp_scdma); 2404 isp_mboxcmd(isp, &mbs, MBLOGALL); 2405 if (mbs.param[0] == MBOX_COMMAND_COMPLETE) { 2406 isp_prt(isp, ISP_LOGDEBUG0, "Register FC4 types succeeded"); 2407 } 2408} 2409 2410/* 2411 * Start a command. Locking is assumed done in the caller. 2412 */ 2413 2414int 2415isp_start(XS_T *xs) 2416{ 2417 struct ispsoftc *isp; 2418 u_int16_t iptr, optr, handle; 2419 union { 2420 ispreq_t *_reqp; 2421 ispreqt2_t *_t2reqp; 2422 } _u; 2423#define reqp _u._reqp 2424#define t2reqp _u._t2reqp 2425#define UZSIZE max(sizeof (ispreq_t), sizeof (ispreqt2_t)) 2426 int target, i; 2427 2428 XS_INITERR(xs); 2429 isp = XS_ISP(xs); 2430 2431 /* 2432 * Check to make sure we're supporting initiator role. 2433 */ 2434 if ((isp->isp_role & ISP_ROLE_INITIATOR) == 0) { 2435 XS_SETERR(xs, HBA_SELTIMEOUT); 2436 return (CMD_COMPLETE); 2437 } 2438 2439 /* 2440 * Now make sure we're running. 2441 */ 2442 2443 if (isp->isp_state != ISP_RUNSTATE) { 2444 isp_prt(isp, ISP_LOGERR, "Adapter not at RUNSTATE"); 2445 XS_SETERR(xs, HBA_BOTCH); 2446 return (CMD_COMPLETE); 2447 } 2448 2449 /* 2450 * Check command CDB length, etc.. We really are limited to 16 bytes 2451 * for Fibre Channel, but can do up to 44 bytes in parallel SCSI, 2452 * but probably only if we're running fairly new firmware (we'll 2453 * let the old f/w choke on an extended command queue entry). 2454 */ 2455 2456 if (XS_CDBLEN(xs) > (IS_FC(isp)? 16 : 44) || XS_CDBLEN(xs) == 0) { 2457 isp_prt(isp, ISP_LOGERR, 2458 "unsupported cdb length (%d, CDB[0]=0x%x)", 2459 XS_CDBLEN(xs), XS_CDBP(xs)[0] & 0xff); 2460 XS_SETERR(xs, HBA_BOTCH); 2461 return (CMD_COMPLETE); 2462 } 2463 2464 /* 2465 * Check to see whether we have good firmware state still or 2466 * need to refresh our port database for this target. 2467 */ 2468 target = XS_TGT(xs); 2469 if (IS_FC(isp)) { 2470 fcparam *fcp = isp->isp_param; 2471 struct lportdb *lp; 2472#ifdef HANDLE_LOOPSTATE_IN_OUTER_LAYERS 2473 if (fcp->isp_fwstate != FW_READY || 2474 fcp->isp_loopstate != LOOP_READY) { 2475 return (CMD_RQLATER); 2476 } 2477 2478 /* 2479 * If we're not on a Fabric, we can't have a target 2480 * above FL_PORT_ID-1. 2481 * 2482 * If we're on a fabric and *not* connected as an F-port, 2483 * we can't have a target less than FC_SNS_ID+1. This 2484 * keeps us from having to sort out the difference between 2485 * local public loop devices and those which we might get 2486 * from a switch's database. 2487 */ 2488 if (fcp->isp_onfabric == 0) { 2489 if (target >= FL_PORT_ID) { 2490 XS_SETERR(xs, HBA_SELTIMEOUT); 2491 return (CMD_COMPLETE); 2492 } 2493 } else { 2494 if (target >= FL_PORT_ID && target <= FC_SNS_ID) { 2495 XS_SETERR(xs, HBA_SELTIMEOUT); 2496 return (CMD_COMPLETE); 2497 } 2498 /* 2499 * We used to exclude having local loop ports 2500 * at the same time that we have fabric ports. 2501 * That is, we used to exclude having ports 2502 * at < FL_PORT_ID if we're FL-port. 2503 * 2504 * That's wrong. The only thing that could be 2505 * dicey is if the switch you're connected to 2506 * has these local loop ports appear on the 2507 * fabric and we somehow attach them twice. 2508 */ 2509 } 2510#else 2511 /* 2512 * Check for f/w being in ready state. If the f/w 2513 * isn't in ready state, then we don't know our 2514 * loop ID and the f/w hasn't completed logging 2515 * into all targets on the loop. If this is the 2516 * case, then bounce the command. We pretend this is 2517 * a SELECTION TIMEOUT error if we've never gone to 2518 * FW_READY state at all- in this case we may not 2519 * be hooked to a loop at all and we shouldn't hang 2520 * the machine for this. Otherwise, defer this command 2521 * until later. 2522 */ 2523 if (fcp->isp_fwstate != FW_READY) { 2524 /* 2525 * Give ourselves at most a 250ms delay. 2526 */ 2527 if (isp_fclink_test(isp, 250000)) { 2528 XS_SETERR(xs, HBA_SELTIMEOUT); 2529 if (fcp->loop_seen_once) { 2530 return (CMD_RQLATER); 2531 } else { 2532 return (CMD_COMPLETE); 2533 } 2534 } 2535 } 2536 2537 /* 2538 * If we're not on a Fabric, we can't have a target 2539 * above FL_PORT_ID-1. 2540 * 2541 * If we're on a fabric and *not* connected as an F-port, 2542 * we can't have a target less than FC_SNS_ID+1. This 2543 * keeps us from having to sort out the difference between 2544 * local public loop devices and those which we might get 2545 * from a switch's database. 2546 */ 2547 if (fcp->isp_onfabric == 0) { 2548 if (target >= FL_PORT_ID) { 2549 XS_SETERR(xs, HBA_SELTIMEOUT); 2550 return (CMD_COMPLETE); 2551 } 2552 } else { 2553 if (target >= FL_PORT_ID && target <= FC_SNS_ID) { 2554 XS_SETERR(xs, HBA_SELTIMEOUT); 2555 return (CMD_COMPLETE); 2556 } 2557 if (fcp->isp_topo != TOPO_F_PORT && 2558 target < FL_PORT_ID) { 2559 XS_SETERR(xs, HBA_SELTIMEOUT); 2560 return (CMD_COMPLETE); 2561 } 2562 } 2563 2564 /* 2565 * If our loop state is such that we haven't yet received 2566 * a "Port Database Changed" notification (after a LIP or 2567 * a Loop Reset or firmware initialization), then defer 2568 * sending commands for a little while, but only if we've 2569 * seen a valid loop at one point (otherwise we can get 2570 * stuck at initialization time). 2571 */ 2572 if (fcp->isp_loopstate < LOOP_PDB_RCVD) { 2573 XS_SETERR(xs, HBA_SELTIMEOUT); 2574 if (fcp->loop_seen_once) { 2575 return (CMD_RQLATER); 2576 } else { 2577 return (CMD_COMPLETE); 2578 } 2579 } 2580 2581 /* 2582 * If we're in the middle of loop or fabric scanning 2583 * or merging the port databases, retry this command later. 2584 */ 2585 if (fcp->isp_loopstate == LOOP_SCANNING_FABRIC || 2586 fcp->isp_loopstate == LOOP_SCANNING_LOOP || 2587 fcp->isp_loopstate == LOOP_SYNCING_PDB) { 2588 return (CMD_RQLATER); 2589 } 2590 2591 /* 2592 * If our loop state is now such that we've just now 2593 * received a Port Database Change notification, then 2594 * we have to go off and (re)scan the fabric. We back 2595 * out and try again later if this doesn't work. 2596 */ 2597 if (fcp->isp_loopstate == LOOP_PDB_RCVD && fcp->isp_onfabric) { 2598 if (isp_scan_fabric(isp)) { 2599 return (CMD_RQLATER); 2600 } 2601 if (fcp->isp_fwstate != FW_READY || 2602 fcp->isp_loopstate < LOOP_PDB_RCVD) { 2603 return (CMD_RQLATER); 2604 } 2605 } 2606 2607 /* 2608 * If our loop state is now such that we've just now 2609 * received a Port Database Change notification, then 2610 * we have to go off and (re)synchronize our port 2611 * database. 2612 */ 2613 if (fcp->isp_loopstate < LOOP_READY) { 2614 if (isp_pdb_sync(isp)) { 2615 return (CMD_RQLATER); 2616 } 2617 if (fcp->isp_fwstate != FW_READY || 2618 fcp->isp_loopstate != LOOP_READY) { 2619 return (CMD_RQLATER); 2620 } 2621 } 2622 2623 /* 2624 * XXX: Here's were we would cancel any loop_dead flag 2625 * XXX: also cancel in dead_loop timeout that's running 2626 */ 2627#endif 2628 2629 /* 2630 * Now check whether we should even think about pursuing this. 2631 */ 2632 lp = &fcp->portdb[target]; 2633 if (lp->valid == 0) { 2634 XS_SETERR(xs, HBA_SELTIMEOUT); 2635 return (CMD_COMPLETE); 2636 } 2637 if ((lp->roles & (SVC3_TGT_ROLE >> SVC3_ROLE_SHIFT)) == 0) { 2638 isp_prt(isp, ISP_LOGDEBUG2, 2639 "Target %d does not have target service", target); 2640 XS_SETERR(xs, HBA_SELTIMEOUT); 2641 return (CMD_COMPLETE); 2642 } 2643 /* 2644 * Now turn target into what the actual Loop ID is. 2645 */ 2646 target = lp->loopid; 2647 } 2648 2649 /* 2650 * Next check to see if any HBA or Device 2651 * parameters need to be updated. 2652 */ 2653 if (isp->isp_update != 0) { 2654 isp_update(isp); 2655 } 2656 2657 if (isp_getrqentry(isp, &iptr, &optr, (void **) &reqp)) { 2658 isp_prt(isp, ISP_LOGDEBUG0, "Request Queue Overflow"); 2659 XS_SETERR(xs, HBA_BOTCH); 2660 return (CMD_EAGAIN); 2661 } 2662 2663 /* 2664 * Now see if we need to synchronize the ISP with respect to anything. 2665 * We do dual duty here (cough) for synchronizing for busses other 2666 * than which we got here to send a command to. 2667 */ 2668 if (isp->isp_sendmarker) { 2669 u_int8_t n = (IS_DUALBUS(isp)? 2: 1); 2670 /* 2671 * Check ports to send markers for... 2672 */ 2673 for (i = 0; i < n; i++) { 2674 if ((isp->isp_sendmarker & (1 << i)) == 0) { 2675 continue; 2676 } 2677 MEMZERO((void *) reqp, sizeof (*reqp)); 2678 reqp->req_header.rqs_entry_count = 1; 2679 reqp->req_header.rqs_entry_type = RQSTYPE_MARKER; 2680 reqp->req_modifier = SYNC_ALL; 2681 reqp->req_target = i << 7; /* insert bus number */ 2682 ISP_SWIZZLE_REQUEST(isp, reqp); 2683 ISP_ADD_REQUEST(isp, iptr); 2684 2685 if (isp_getrqentry(isp, &iptr, &optr, (void **)&reqp)) { 2686 isp_prt(isp, ISP_LOGDEBUG0, 2687 "Request Queue Overflow+"); 2688 XS_SETERR(xs, HBA_BOTCH); 2689 return (CMD_EAGAIN); 2690 } 2691 } 2692 } 2693 2694 MEMZERO((void *) reqp, UZSIZE); 2695 reqp->req_header.rqs_entry_count = 1; 2696 if (IS_FC(isp)) { 2697 reqp->req_header.rqs_entry_type = RQSTYPE_T2RQS; 2698 } else { 2699 if (XS_CDBLEN(xs) > 12) 2700 reqp->req_header.rqs_entry_type = RQSTYPE_CMDONLY; 2701 else 2702 reqp->req_header.rqs_entry_type = RQSTYPE_REQUEST; 2703 } 2704 reqp->req_header.rqs_flags = 0; 2705 reqp->req_header.rqs_seqno = 0; 2706 if (IS_FC(isp)) { 2707 /* 2708 * See comment in isp_intr 2709 */ 2710 XS_RESID(xs) = 0; 2711 2712 /* 2713 * Fibre Channel always requires some kind of tag. 2714 * The Qlogic drivers seem be happy not to use a tag, 2715 * but this breaks for some devices (IBM drives). 2716 */ 2717 if (XS_TAG_P(xs)) { 2718 t2reqp->req_flags = XS_TAG_TYPE(xs); 2719 } else { 2720 /* 2721 * If we don't know what tag to use, use HEAD OF QUEUE 2722 * for Request Sense or Simple. 2723 */ 2724 if (XS_CDBP(xs)[0] == 0x3) /* REQUEST SENSE */ 2725 t2reqp->req_flags = REQFLAG_HTAG; 2726 else 2727 t2reqp->req_flags = REQFLAG_STAG; 2728 } 2729 } else { 2730 sdparam *sdp = (sdparam *)isp->isp_param; 2731 sdp += XS_CHANNEL(xs); 2732 if ((sdp->isp_devparam[target].actv_flags & DPARM_TQING) && 2733 XS_TAG_P(xs)) { 2734 reqp->req_flags = XS_TAG_TYPE(xs); 2735 } 2736 } 2737 reqp->req_target = target | (XS_CHANNEL(xs) << 7); 2738 if (IS_SCSI(isp)) { 2739 reqp->req_lun_trn = XS_LUN(xs); 2740 reqp->req_cdblen = XS_CDBLEN(xs); 2741 } else { 2742 if (FCPARAM(isp)->isp_fwattr & ISP_FW_ATTR_SCCLUN) 2743 t2reqp->req_scclun = XS_LUN(xs); 2744 else 2745 t2reqp->req_lun_trn = XS_LUN(xs); 2746 } 2747 MEMCPY(reqp->req_cdb, XS_CDBP(xs), XS_CDBLEN(xs)); 2748 2749 reqp->req_time = XS_TIME(xs) / 1000; 2750 if (reqp->req_time == 0 && XS_TIME(xs)) 2751 reqp->req_time = 1; 2752 2753 /* 2754 * Always give a bit more leeway to commands after a bus reset. 2755 * XXX: DOES NOT DISTINGUISH WHICH PORT MAY HAVE BEEN SYNCED 2756 */ 2757 if (isp->isp_sendmarker && reqp->req_time < 5) { 2758 reqp->req_time = 5; 2759 } 2760 if (isp_save_xs(isp, xs, &handle)) { 2761 isp_prt(isp, ISP_LOGDEBUG1, "out of xflist pointers"); 2762 XS_SETERR(xs, HBA_BOTCH); 2763 return (CMD_EAGAIN); 2764 } 2765 reqp->req_handle = handle; 2766 /* 2767 * Set up DMA and/or do any bus swizzling of the request entry 2768 * so that the Qlogic F/W understands what is being asked of it. 2769 */ 2770 i = ISP_DMASETUP(isp, xs, reqp, &iptr, optr); 2771 if (i != CMD_QUEUED) { 2772 isp_destroy_handle(isp, handle); 2773 /* 2774 * dmasetup sets actual error in packet, and 2775 * return what we were given to return. 2776 */ 2777 return (i); 2778 } 2779 XS_SETERR(xs, HBA_NOERROR); 2780 isp_prt(isp, ISP_LOGDEBUG2, 2781 "START cmd for %d.%d.%d cmd 0x%x datalen %ld", 2782 XS_CHANNEL(xs), target, XS_LUN(xs), XS_CDBP(xs)[0], 2783 (long) XS_XFRLEN(xs)); 2784 ISP_ADD_REQUEST(isp, iptr); 2785 isp->isp_nactive++; 2786 if (isp->isp_sendmarker) 2787 isp->isp_sendmarker = 0; 2788 return (CMD_QUEUED); 2789#undef reqp 2790#undef t2reqp 2791} 2792 2793/* 2794 * isp control 2795 * Locks (ints blocked) assumed held. 2796 */ 2797 2798int 2799isp_control(struct ispsoftc *isp, ispctl_t ctl, void *arg) 2800{ 2801 XS_T *xs; 2802 mbreg_t mbs; 2803 int bus, tgt; 2804 u_int16_t handle; 2805 2806 switch (ctl) { 2807 default: 2808 isp_prt(isp, ISP_LOGERR, "Unknown Control Opcode 0x%x", ctl); 2809 break; 2810 2811 case ISPCTL_RESET_BUS: 2812 /* 2813 * Issue a bus reset. 2814 */ 2815 mbs.param[0] = MBOX_BUS_RESET; 2816 mbs.param[2] = 0; 2817 if (IS_SCSI(isp)) { 2818 mbs.param[1] = 2819 ((sdparam *) isp->isp_param)->isp_bus_reset_delay; 2820 if (mbs.param[1] < 2) 2821 mbs.param[1] = 2; 2822 bus = *((int *) arg); 2823 if (IS_DUALBUS(isp)) 2824 mbs.param[2] = bus; 2825 } else { 2826 mbs.param[1] = 10; 2827 bus = 0; 2828 } 2829 isp->isp_sendmarker |= (1 << bus); 2830 isp_mboxcmd(isp, &mbs, MBLOGALL); 2831 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 2832 break; 2833 } 2834 isp_prt(isp, ISP_LOGINFO, 2835 "driver initiated bus reset of bus %d", bus); 2836 return (0); 2837 2838 case ISPCTL_RESET_DEV: 2839 tgt = (*((int *) arg)) & 0xffff; 2840 bus = (*((int *) arg)) >> 16; 2841 mbs.param[0] = MBOX_ABORT_TARGET; 2842 mbs.param[1] = (tgt << 8) | (bus << 15); 2843 mbs.param[2] = 3; /* 'delay', in seconds */ 2844 isp_mboxcmd(isp, &mbs, MBLOGALL); 2845 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 2846 break; 2847 } 2848 isp_prt(isp, ISP_LOGINFO, 2849 "Target %d on Bus %d Reset Succeeded", tgt, bus); 2850 isp->isp_sendmarker |= (1 << bus); 2851 return (0); 2852 2853 case ISPCTL_ABORT_CMD: 2854 xs = (XS_T *) arg; 2855 tgt = XS_TGT(xs); 2856 handle = isp_find_handle(isp, xs); 2857 if (handle == 0) { 2858 isp_prt(isp, ISP_LOGWARN, 2859 "cannot find handle for command to abort"); 2860 break; 2861 } 2862 bus = XS_CHANNEL(xs); 2863 mbs.param[0] = MBOX_ABORT; 2864 if (IS_FC(isp)) { 2865 if (FCPARAM(isp)->isp_fwattr & ISP_FW_ATTR_SCCLUN) { 2866 mbs.param[1] = tgt << 8; 2867 mbs.param[4] = 0; 2868 mbs.param[5] = 0; 2869 mbs.param[6] = XS_LUN(xs); 2870 } else { 2871 mbs.param[1] = tgt << 8 | XS_LUN(xs); 2872 } 2873 } else { 2874 mbs.param[1] = 2875 (bus << 15) | (XS_TGT(xs) << 8) | XS_LUN(xs); 2876 } 2877 mbs.param[3] = 0; 2878 mbs.param[2] = handle; 2879 isp_mboxcmd(isp, &mbs, MBLOGALL & ~MBOX_COMMAND_ERROR); 2880 if (mbs.param[0] == MBOX_COMMAND_COMPLETE) { 2881 return (0); 2882 } 2883 /* 2884 * XXX: Look for command in the REQUEST QUEUE. That is, 2885 * XXX: It hasen't been picked up by firmware yet. 2886 */ 2887 break; 2888 2889 case ISPCTL_UPDATE_PARAMS: 2890 2891 isp_update(isp); 2892 return (0); 2893 2894 case ISPCTL_FCLINK_TEST: 2895 2896 if (IS_FC(isp)) { 2897 int usdelay = (arg)? *((int *) arg) : 250000; 2898 return (isp_fclink_test(isp, usdelay)); 2899 } 2900 break; 2901 2902 case ISPCTL_SCAN_FABRIC: 2903 2904 if (IS_FC(isp)) { 2905 return (isp_scan_fabric(isp)); 2906 } 2907 break; 2908 2909 case ISPCTL_SCAN_LOOP: 2910 2911 if (IS_FC(isp)) { 2912 return (isp_scan_loop(isp)); 2913 } 2914 break; 2915 2916 case ISPCTL_PDB_SYNC: 2917 2918 if (IS_FC(isp)) { 2919 return (isp_pdb_sync(isp)); 2920 } 2921 break; 2922 2923 case ISPCTL_SEND_LIP: 2924 2925 if (IS_FC(isp)) { 2926 mbs.param[0] = MBOX_INIT_LIP; 2927 isp_mboxcmd(isp, &mbs, MBLOGALL); 2928 if (mbs.param[0] == MBOX_COMMAND_COMPLETE) { 2929 return (0); 2930 } 2931 } 2932 break; 2933 2934 case ISPCTL_GET_POSMAP: 2935 2936 if (IS_FC(isp) && arg) { 2937 return (isp_getmap(isp, arg)); 2938 } 2939 break; 2940 2941 case ISPCTL_RUN_MBOXCMD: 2942 2943 isp_mboxcmd(isp, arg, MBLOGALL); 2944 return(0); 2945 2946#ifdef ISP_TARGET_MODE 2947 case ISPCTL_TOGGLE_TMODE: 2948 { 2949 2950 /* 2951 * We don't check/set against role here- that's the 2952 * responsibility for the outer layer to coordinate. 2953 */ 2954 if (IS_SCSI(isp)) { 2955 int param = *(int *)arg; 2956 mbs.param[0] = MBOX_ENABLE_TARGET_MODE; 2957 mbs.param[1] = param & 0xffff; 2958 mbs.param[2] = param >> 16; 2959 isp_mboxcmd(isp, &mbs, MBLOGALL); 2960 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 2961 break; 2962 } 2963 } 2964 return (0); 2965 } 2966#endif 2967 } 2968 return (-1); 2969} 2970 2971/* 2972 * Interrupt Service Routine(s). 2973 * 2974 * External (OS) framework has done the appropriate locking, 2975 * and the locking will be held throughout this function. 2976 */ 2977 2978/* 2979 * Limit our stack depth by sticking with the max likely number 2980 * of completions on a request queue at any one time. 2981 */ 2982#define MAX_REQUESTQ_COMPLETIONS 32 2983 2984void 2985isp_intr(struct ispsoftc *isp, u_int16_t isr, u_int16_t sema, u_int16_t mbox) 2986{ 2987 XS_T *complist[MAX_REQUESTQ_COMPLETIONS], *xs; 2988 u_int16_t iptr, optr, junk; 2989 int i, nlooked = 0, ndone = 0; 2990 2991 /* 2992 * Is this a mailbox related interrupt? 2993 * The mailbox semaphore will be nonzero if so. 2994 */ 2995 if (sema) { 2996 if (mbox & 0x4000) { 2997 int obits, i = 0; 2998 if ((obits = isp->isp_mboxbsy) != 0) { 2999 isp->isp_mboxtmp[i++] = mbox; 3000 for (i = 1; i < MAX_MAILBOX; i++) { 3001 if ((obits & (1 << i)) == 0) { 3002 continue; 3003 } 3004 isp->isp_mboxtmp[i] = 3005 ISP_READ(isp, MBOX_OFF(i)); 3006 } 3007 MBOX_NOTIFY_COMPLETE(isp); 3008 } else { 3009 isp_prt(isp, ISP_LOGWARN, 3010 "Mbox Command Async (0x%x) with no waiters", 3011 mbox); 3012 } 3013 } else { 3014 int fhandle = isp_parse_async(isp, (int) mbox); 3015 isp_prt(isp, ISP_LOGDEBUG2, "Async Mbox 0x%x", mbox); 3016 if (fhandle > 0) { 3017 isp_fastpost_complete(isp, (u_int16_t) fhandle); 3018 } 3019 } 3020 if (IS_FC(isp) || isp->isp_state != ISP_RUNSTATE) { 3021 ISP_WRITE(isp, HCCR, HCCR_CMD_CLEAR_RISC_INT); 3022 ISP_WRITE(isp, BIU_SEMA, 0); 3023 return; 3024 } 3025 } 3026 3027 /* 3028 * We can't be getting this now. 3029 */ 3030 if (isp->isp_state != ISP_RUNSTATE) { 3031 isp_prt(isp, ISP_LOGWARN, 3032 "interrupt (ISR=%x SEMA=%x) when not ready", isr, sema); 3033 /* 3034 * Thank you very much! *Burrrp*! 3035 */ 3036 WRITE_RESPONSE_QUEUE_OUT_POINTER(isp, 3037 READ_RESPONSE_QUEUE_IN_POINTER(isp)); 3038 3039 ISP_WRITE(isp, HCCR, HCCR_CMD_CLEAR_RISC_INT); 3040 ISP_WRITE(isp, BIU_SEMA, 0); 3041 return; 3042 } 3043 3044 /* 3045 * Get the current Response Queue Out Pointer. 3046 * 3047 * If we're a 2300, we can ask what hardware what it thinks. 3048 */ 3049 if (IS_2300(isp)) { 3050 optr = ISP_READ(isp, isp->isp_respoutrp); 3051 if (isp->isp_residx != optr) { 3052 isp_prt(isp, ISP_LOGWARN, "optr %x soft optr %x", 3053 optr, isp->isp_residx); 3054 } 3055 } else { 3056 optr = isp->isp_residx; 3057 } 3058 3059 /* 3060 * You *must* read the Response Queue In Pointer 3061 * prior to clearing the RISC interrupt. 3062 */ 3063 if (IS_2100(isp) || IS_2300(isp)) { 3064 i = 0; 3065 do { 3066 iptr = READ_RESPONSE_QUEUE_IN_POINTER(isp); 3067 junk = READ_RESPONSE_QUEUE_IN_POINTER(isp); 3068 } while (junk != iptr && ++i < 1000); 3069 3070 if (iptr != junk) { 3071 ISP_WRITE(isp, HCCR, HCCR_CMD_CLEAR_RISC_INT); 3072 isp_prt(isp, ISP_LOGWARN, 3073 "Response Queue Out Pointer Unstable (%x, %x)", 3074 iptr, junk); 3075 return; 3076 } 3077 } else { 3078 iptr = READ_RESPONSE_QUEUE_IN_POINTER(isp); 3079 } 3080 3081 3082 if (optr == iptr && sema == 0) { 3083 /* 3084 * There are a lot of these- reasons unknown- mostly on 3085 * faster Alpha machines. 3086 * 3087 * I tried delaying after writing HCCR_CMD_CLEAR_RISC_INT to 3088 * make sure the old interrupt went away (to avoid 'ringing' 3089 * effects), but that didn't stop this from occurring. 3090 */ 3091 if (IS_2300(isp)) { 3092 USEC_DELAY(100); 3093 iptr = READ_RESPONSE_QUEUE_IN_POINTER(isp); 3094 junk = ISP_READ(isp, BIU_R2HSTSLO); 3095 } else { 3096 junk = ISP_READ(isp, BIU_ISR); 3097 } 3098 if (optr == iptr) { 3099 isp_prt(isp, ISP_LOGDEBUG0, 3100 "bogus intr- isr %x (%x) iptr %x optr %x", 3101 isr, junk, iptr, optr); 3102 isp->isp_intbogus++; 3103 } 3104 } 3105 ISP_WRITE(isp, HCCR, HCCR_CMD_CLEAR_RISC_INT); 3106 ISP_WRITE(isp, BIU_SEMA, 0); 3107 3108 while (optr != iptr) { 3109 ispstatusreq_t *sp; 3110 u_int16_t oop; 3111 int buddaboom = 0; 3112 3113 sp = (ispstatusreq_t *) ISP_QUEUE_ENTRY(isp->isp_result, optr); 3114 oop = optr; 3115 optr = ISP_NXT_QENTRY(optr, RESULT_QUEUE_LEN(isp)); 3116 nlooked++; 3117 /* 3118 * Do any appropriate unswizzling of what the Qlogic f/w has 3119 * written into memory so it makes sense to us. This is a 3120 * per-platform thing. Also includes any memory barriers. 3121 */ 3122 ISP_UNSWIZZLE_RESPONSE(isp, sp, oop); 3123 if (sp->req_header.rqs_entry_type != RQSTYPE_RESPONSE) { 3124 if (isp_handle_other_response(isp, sp, &optr) == 0) { 3125 MEMZERO(sp, sizeof (isphdr_t)); 3126 continue; 3127 } 3128 /* 3129 * It really has to be a bounced request just copied 3130 * from the request queue to the response queue. If 3131 * not, something bad has happened. 3132 */ 3133 if (sp->req_header.rqs_entry_type != RQSTYPE_REQUEST) { 3134 isp_prt(isp, ISP_LOGERR, notresp, 3135 sp->req_header.rqs_entry_type, oop, optr, 3136 nlooked); 3137 if (isp->isp_dblev & ISP_LOGDEBUG0) { 3138 isp_print_bytes(isp, "Queue Entry", 3139 QENTRY_LEN, sp); 3140 } 3141 MEMZERO(sp, sizeof (isphdr_t)); 3142 continue; 3143 } 3144 buddaboom = 1; 3145 } 3146 3147 if (sp->req_header.rqs_flags & 0xf) { 3148#define _RQS_OFLAGS \ 3149 ~(RQSFLAG_CONTINUATION|RQSFLAG_FULL|RQSFLAG_BADHEADER|RQSFLAG_BADPACKET) 3150 if (sp->req_header.rqs_flags & RQSFLAG_CONTINUATION) { 3151 isp_prt(isp, ISP_LOGWARN, 3152 "continuation segment"); 3153 WRITE_RESPONSE_QUEUE_OUT_POINTER(isp, optr); 3154 continue; 3155 } 3156 if (sp->req_header.rqs_flags & RQSFLAG_FULL) { 3157 isp_prt(isp, ISP_LOGDEBUG1, 3158 "internal queues full"); 3159 /* 3160 * We'll synthesize a QUEUE FULL message below. 3161 */ 3162 } 3163 if (sp->req_header.rqs_flags & RQSFLAG_BADHEADER) { 3164 isp_prt(isp, ISP_LOGERR, "bad header flag"); 3165 buddaboom++; 3166 } 3167 if (sp->req_header.rqs_flags & RQSFLAG_BADPACKET) { 3168 isp_prt(isp, ISP_LOGERR, "bad request packet"); 3169 buddaboom++; 3170 } 3171 if (sp->req_header.rqs_flags & _RQS_OFLAGS) { 3172 isp_prt(isp, ISP_LOGERR, 3173 "unknown flags (0x%x) in response", 3174 sp->req_header.rqs_flags); 3175 buddaboom++; 3176 } 3177#undef _RQS_OFLAGS 3178 } 3179 if (sp->req_handle > isp->isp_maxcmds || sp->req_handle < 1) { 3180 MEMZERO(sp, sizeof (isphdr_t)); 3181 isp_prt(isp, ISP_LOGERR, 3182 "bad request handle %d (type 0x%x, flags 0x%x)", 3183 sp->req_handle, sp->req_header.rqs_entry_type, 3184 sp->req_header.rqs_flags); 3185 WRITE_RESPONSE_QUEUE_OUT_POINTER(isp, optr); 3186 continue; 3187 } 3188 xs = isp_find_xs(isp, sp->req_handle); 3189 if (xs == NULL) { 3190 MEMZERO(sp, sizeof (isphdr_t)); 3191 isp_prt(isp, ISP_LOGERR, 3192 "cannot find handle 0x%x in xflist", 3193 sp->req_handle); 3194 WRITE_RESPONSE_QUEUE_OUT_POINTER(isp, optr); 3195 continue; 3196 } 3197 isp_destroy_handle(isp, sp->req_handle); 3198 if (sp->req_status_flags & RQSTF_BUS_RESET) { 3199 isp->isp_sendmarker |= (1 << XS_CHANNEL(xs)); 3200 } 3201 if (buddaboom) { 3202 XS_SETERR(xs, HBA_BOTCH); 3203 } 3204 3205 if (IS_FC(isp) && (sp->req_scsi_status & RQCS_SV)) { 3206 /* 3207 * Fibre Channel F/W doesn't say we got status 3208 * if there's Sense Data instead. I guess they 3209 * think it goes w/o saying. 3210 */ 3211 sp->req_state_flags |= RQSF_GOT_STATUS; 3212 } 3213 if (sp->req_state_flags & RQSF_GOT_STATUS) { 3214 *XS_STSP(xs) = sp->req_scsi_status & 0xff; 3215 } 3216 3217 switch (sp->req_header.rqs_entry_type) { 3218 case RQSTYPE_RESPONSE: 3219 XS_SET_STATE_STAT(isp, xs, sp); 3220 isp_parse_status(isp, sp, xs); 3221 if ((XS_NOERR(xs) || XS_ERR(xs) == HBA_NOERROR) && 3222 (*XS_STSP(xs) == SCSI_BUSY)) { 3223 XS_SETERR(xs, HBA_TGTBSY); 3224 } 3225 if (IS_SCSI(isp)) { 3226 XS_RESID(xs) = sp->req_resid; 3227 if ((sp->req_state_flags & RQSF_GOT_STATUS) && 3228 (*XS_STSP(xs) == SCSI_CHECK) && 3229 (sp->req_state_flags & RQSF_GOT_SENSE)) { 3230 XS_SAVE_SENSE(xs, sp); 3231 } 3232 /* 3233 * A new synchronous rate was negotiated for 3234 * this target. Mark state such that we'll go 3235 * look up that which has changed later. 3236 */ 3237 if (sp->req_status_flags & RQSTF_NEGOTIATION) { 3238 int t = XS_TGT(xs); 3239 sdparam *sdp = isp->isp_param; 3240 sdp += XS_CHANNEL(xs); 3241 sdp->isp_devparam[t].dev_refresh = 1; 3242 isp->isp_update |= 3243 (1 << XS_CHANNEL(xs)); 3244 } 3245 } else { 3246 if (sp->req_status_flags & RQSF_XFER_COMPLETE) { 3247 XS_RESID(xs) = 0; 3248 } else if (sp->req_scsi_status & RQCS_RESID) { 3249 XS_RESID(xs) = sp->req_resid; 3250 } else { 3251 XS_RESID(xs) = 0; 3252 } 3253 if ((sp->req_state_flags & RQSF_GOT_STATUS) && 3254 (*XS_STSP(xs) == SCSI_CHECK) && 3255 (sp->req_scsi_status & RQCS_SV)) { 3256 XS_SAVE_SENSE(xs, sp); 3257 /* solely for the benefit of debug */ 3258 sp->req_state_flags |= RQSF_GOT_SENSE; 3259 } 3260 } 3261 isp_prt(isp, ISP_LOGDEBUG2, 3262 "asked for %ld got resid %ld", (long) XS_XFRLEN(xs), 3263 (long) sp->req_resid); 3264 break; 3265 case RQSTYPE_REQUEST: 3266 if (sp->req_header.rqs_flags & RQSFLAG_FULL) { 3267 /* 3268 * Force Queue Full status. 3269 */ 3270 *XS_STSP(xs) = SCSI_QFULL; 3271 XS_SETERR(xs, HBA_NOERROR); 3272 } else if (XS_NOERR(xs)) { 3273 XS_SETERR(xs, HBA_BOTCH); 3274 } 3275 XS_RESID(xs) = XS_XFRLEN(xs); 3276 break; 3277 default: 3278 isp_prt(isp, ISP_LOGWARN, 3279 "unhandled response queue type 0x%x", 3280 sp->req_header.rqs_entry_type); 3281 if (XS_NOERR(xs)) { 3282 XS_SETERR(xs, HBA_BOTCH); 3283 } 3284 break; 3285 } 3286 3287 /* 3288 * Free any dma resources. As a side effect, this may 3289 * also do any cache flushing necessary for data coherence. */ 3290 if (XS_XFRLEN(xs)) { 3291 ISP_DMAFREE(isp, xs, sp->req_handle); 3292 } 3293 3294 if (((isp->isp_dblev & (ISP_LOGDEBUG2|ISP_LOGDEBUG3))) || 3295 ((isp->isp_dblev & ISP_LOGDEBUG1) && ((!XS_NOERR(xs)) || 3296 (*XS_STSP(xs) != SCSI_GOOD)))) { 3297 char skey; 3298 if (sp->req_state_flags & RQSF_GOT_SENSE) { 3299 skey = XS_SNSKEY(xs) & 0xf; 3300 if (skey < 10) 3301 skey += '0'; 3302 else 3303 skey += 'a' - 10; 3304 } else if (*XS_STSP(xs) == SCSI_CHECK) { 3305 skey = '?'; 3306 } else { 3307 skey = '.'; 3308 } 3309 isp_prt(isp, ISP_LOGALL, finmsg, XS_CHANNEL(xs), 3310 XS_TGT(xs), XS_LUN(xs), XS_XFRLEN(xs), XS_RESID(xs), 3311 *XS_STSP(xs), skey, XS_ERR(xs)); 3312 } 3313 3314 if (isp->isp_nactive > 0) 3315 isp->isp_nactive--; 3316 complist[ndone++] = xs; /* defer completion call until later */ 3317 MEMZERO(sp, sizeof (isphdr_t)); 3318 if (ndone == MAX_REQUESTQ_COMPLETIONS) { 3319 break; 3320 } 3321 } 3322 3323 /* 3324 * If we looked at any commands, then it's valid to find out 3325 * what the outpointer is. It also is a trigger to update the 3326 * ISP's notion of what we've seen so far. 3327 */ 3328 if (nlooked) { 3329 WRITE_RESPONSE_QUEUE_OUT_POINTER(isp, optr); 3330 /* 3331 * While we're at it, reqad the requst queue out pointer. 3332 */ 3333 isp->isp_reqodx = READ_REQUEST_QUEUE_OUT_POINTER(isp); 3334 } 3335 3336 isp->isp_residx = optr; 3337 for (i = 0; i < ndone; i++) { 3338 xs = complist[i]; 3339 if (xs) { 3340 isp_done(xs); 3341 } 3342 } 3343} 3344 3345/* 3346 * Support routines. 3347 */ 3348 3349static int 3350isp_parse_async(struct ispsoftc *isp, int mbox) 3351{ 3352 int bus; 3353 u_int16_t fast_post_handle = 0; 3354 3355 if (IS_DUALBUS(isp)) { 3356 bus = ISP_READ(isp, OUTMAILBOX6); 3357 } else { 3358 bus = 0; 3359 } 3360 3361 switch (mbox) { 3362 case ASYNC_BUS_RESET: 3363 isp->isp_sendmarker |= (1 << bus); 3364#ifdef ISP_TARGET_MODE 3365 isp_target_async(isp, bus, mbox); 3366#endif 3367 isp_async(isp, ISPASYNC_BUS_RESET, &bus); 3368 break; 3369 case ASYNC_SYSTEM_ERROR: 3370 isp_async(isp, ISPASYNC_FW_CRASH, NULL); 3371 /* no point continuing after this */ 3372 return (-1); 3373 3374 case ASYNC_RQS_XFER_ERR: 3375 isp_prt(isp, ISP_LOGERR, "Request Queue Transfer Error"); 3376 break; 3377 3378 case ASYNC_RSP_XFER_ERR: 3379 isp_prt(isp, ISP_LOGERR, "Response Queue Transfer Error"); 3380 break; 3381 3382 case ASYNC_QWAKEUP: 3383 /* 3384 * We've just been notified that the Queue has woken up. 3385 * We don't need to be chatty about this- just unlatch things 3386 * and move on. 3387 */ 3388 mbox = READ_REQUEST_QUEUE_OUT_POINTER(isp); 3389 break; 3390 3391 case ASYNC_TIMEOUT_RESET: 3392 isp_prt(isp, ISP_LOGWARN, 3393 "timeout initiated SCSI bus reset of bus %d", bus); 3394 isp->isp_sendmarker |= (1 << bus); 3395#ifdef ISP_TARGET_MODE 3396 isp_target_async(isp, bus, mbox); 3397#endif 3398 break; 3399 3400 case ASYNC_DEVICE_RESET: 3401 isp_prt(isp, ISP_LOGINFO, "device reset on bus %d", bus); 3402 isp->isp_sendmarker |= (1 << bus); 3403#ifdef ISP_TARGET_MODE 3404 isp_target_async(isp, bus, mbox); 3405#endif 3406 break; 3407 3408 case ASYNC_EXTMSG_UNDERRUN: 3409 isp_prt(isp, ISP_LOGWARN, "extended message underrun"); 3410 break; 3411 3412 case ASYNC_SCAM_INT: 3413 isp_prt(isp, ISP_LOGINFO, "SCAM interrupt"); 3414 break; 3415 3416 case ASYNC_HUNG_SCSI: 3417 isp_prt(isp, ISP_LOGERR, 3418 "stalled SCSI Bus after DATA Overrun"); 3419 /* XXX: Need to issue SCSI reset at this point */ 3420 break; 3421 3422 case ASYNC_KILLED_BUS: 3423 isp_prt(isp, ISP_LOGERR, "SCSI Bus reset after DATA Overrun"); 3424 break; 3425 3426 case ASYNC_BUS_TRANSIT: 3427 mbox = ISP_READ(isp, OUTMAILBOX2); 3428 switch (mbox & 0x1c00) { 3429 case SXP_PINS_LVD_MODE: 3430 isp_prt(isp, ISP_LOGINFO, "Transition to LVD mode"); 3431 SDPARAM(isp)->isp_diffmode = 0; 3432 SDPARAM(isp)->isp_ultramode = 0; 3433 SDPARAM(isp)->isp_lvdmode = 1; 3434 break; 3435 case SXP_PINS_HVD_MODE: 3436 isp_prt(isp, ISP_LOGINFO, 3437 "Transition to Differential mode"); 3438 SDPARAM(isp)->isp_diffmode = 1; 3439 SDPARAM(isp)->isp_ultramode = 0; 3440 SDPARAM(isp)->isp_lvdmode = 0; 3441 break; 3442 case SXP_PINS_SE_MODE: 3443 isp_prt(isp, ISP_LOGINFO, 3444 "Transition to Single Ended mode"); 3445 SDPARAM(isp)->isp_diffmode = 0; 3446 SDPARAM(isp)->isp_ultramode = 1; 3447 SDPARAM(isp)->isp_lvdmode = 0; 3448 break; 3449 default: 3450 isp_prt(isp, ISP_LOGWARN, 3451 "Transition to Unknown Mode 0x%x", mbox); 3452 break; 3453 } 3454 /* 3455 * XXX: Set up to renegotiate again! 3456 */ 3457 /* Can only be for a 1080... */ 3458 isp->isp_sendmarker |= (1 << bus); 3459 break; 3460 3461 case ASYNC_CMD_CMPLT: 3462 fast_post_handle = ISP_READ(isp, OUTMAILBOX1); 3463 isp_prt(isp, ISP_LOGDEBUG3, "fast post completion of %u", 3464 fast_post_handle); 3465 break; 3466 3467 case ASYNC_CTIO_DONE: 3468#ifdef ISP_TARGET_MODE 3469 /* 3470 * Bus gets overloaded with the handle. Dual bus 3471 * cards don't put bus# into the handle. 3472 */ 3473 bus = (ISP_READ(isp, OUTMAILBOX2) << 16) | 3474 ISP_READ(isp, OUTMAILBOX1); 3475 isp_target_async(isp, bus, mbox); 3476#else 3477 isp_prt(isp, ISP_LOGINFO, "Fast Posting CTIO done"); 3478#endif 3479 break; 3480 3481 case ASYNC_LIP_F8: 3482 case ASYNC_LIP_OCCURRED: 3483 FCPARAM(isp)->isp_lipseq = 3484 ISP_READ(isp, OUTMAILBOX1); 3485 FCPARAM(isp)->isp_fwstate = FW_CONFIG_WAIT; 3486 FCPARAM(isp)->isp_loopstate = LOOP_LIP_RCVD; 3487 isp->isp_sendmarker = 1; 3488 isp_mark_getpdb_all(isp); 3489 isp_async(isp, ISPASYNC_LIP, NULL); 3490#ifdef ISP_TARGET_MODE 3491 isp_target_async(isp, bus, mbox); 3492#endif 3493 /* 3494 * We've had problems with data corruption occuring on 3495 * commands that complete (with no apparent error) after 3496 * we receive a LIP. This has been observed mostly on 3497 * Local Loop topologies. To be safe, let's just mark 3498 * all active commands as dead. 3499 */ 3500 if (FCPARAM(isp)->isp_topo == TOPO_NL_PORT || 3501 FCPARAM(isp)->isp_topo == TOPO_FL_PORT) { 3502 int i, j; 3503 for (i = j = 0; i < isp->isp_maxcmds; i++) { 3504 XS_T *xs; 3505 xs = isp->isp_xflist[i]; 3506 if (xs != NULL) { 3507 j++; 3508 XS_SETERR(xs, HBA_BUSRESET); 3509 } 3510 } 3511 if (j) { 3512 isp_prt(isp, ISP_LOGERR, 3513 "LIP destroyed %d active commands", j); 3514 } 3515 } 3516 break; 3517 3518 case ASYNC_LOOP_UP: 3519 isp->isp_sendmarker = 1; 3520 FCPARAM(isp)->isp_fwstate = FW_CONFIG_WAIT; 3521 FCPARAM(isp)->isp_loopstate = LOOP_LIP_RCVD; 3522 isp_mark_getpdb_all(isp); 3523 isp_async(isp, ISPASYNC_LOOP_UP, NULL); 3524#ifdef ISP_TARGET_MODE 3525 isp_target_async(isp, bus, mbox); 3526#endif 3527 break; 3528 3529 case ASYNC_LOOP_DOWN: 3530 isp->isp_sendmarker = 1; 3531 FCPARAM(isp)->isp_fwstate = FW_CONFIG_WAIT; 3532 FCPARAM(isp)->isp_loopstate = LOOP_NIL; 3533 isp_mark_getpdb_all(isp); 3534 isp_async(isp, ISPASYNC_LOOP_DOWN, NULL); 3535#ifdef ISP_TARGET_MODE 3536 isp_target_async(isp, bus, mbox); 3537#endif 3538 break; 3539 3540 case ASYNC_LOOP_RESET: 3541 isp->isp_sendmarker = 1; 3542 FCPARAM(isp)->isp_fwstate = FW_CONFIG_WAIT; 3543 FCPARAM(isp)->isp_loopstate = LOOP_NIL; 3544 isp_mark_getpdb_all(isp); 3545 isp_async(isp, ISPASYNC_LOOP_RESET, NULL); 3546#ifdef ISP_TARGET_MODE 3547 isp_target_async(isp, bus, mbox); 3548#endif 3549 break; 3550 3551 case ASYNC_PDB_CHANGED: 3552 isp->isp_sendmarker = 1; 3553 FCPARAM(isp)->isp_loopstate = LOOP_PDB_RCVD; 3554 isp_mark_getpdb_all(isp); 3555 isp_async(isp, ISPASYNC_CHANGE_NOTIFY, ISPASYNC_CHANGE_PDB); 3556 break; 3557 3558 case ASYNC_CHANGE_NOTIFY: 3559 /* 3560 * Not correct, but it will force us to rescan the loop. 3561 */ 3562 FCPARAM(isp)->isp_loopstate = LOOP_PDB_RCVD; 3563 isp_mark_getpdb_all(isp); 3564 isp_async(isp, ISPASYNC_CHANGE_NOTIFY, ISPASYNC_CHANGE_SNS); 3565 break; 3566 3567 case ASYNC_PTPMODE: 3568 if (FCPARAM(isp)->isp_onfabric) 3569 FCPARAM(isp)->isp_topo = TOPO_F_PORT; 3570 else 3571 FCPARAM(isp)->isp_topo = TOPO_N_PORT; 3572 isp_mark_getpdb_all(isp); 3573 isp->isp_sendmarker = 1; 3574 FCPARAM(isp)->isp_fwstate = FW_CONFIG_WAIT; 3575 FCPARAM(isp)->isp_loopstate = LOOP_LIP_RCVD; 3576 isp_async(isp, ISPASYNC_CHANGE_NOTIFY, ISPASYNC_CHANGE_OTHER); 3577#ifdef ISP_TARGET_MODE 3578 isp_target_async(isp, bus, mbox); 3579#endif 3580 isp_prt(isp, ISP_LOGINFO, "Point-to-Point mode"); 3581 break; 3582 3583 case ASYNC_CONNMODE: 3584 mbox = ISP_READ(isp, OUTMAILBOX1); 3585 isp_mark_getpdb_all(isp); 3586 switch (mbox) { 3587 case ISP_CONN_LOOP: 3588 isp_prt(isp, ISP_LOGINFO, 3589 "Point-to-Point -> Loop mode"); 3590 break; 3591 case ISP_CONN_PTP: 3592 isp_prt(isp, ISP_LOGINFO, 3593 "Loop -> Point-to-Point mode"); 3594 break; 3595 case ISP_CONN_BADLIP: 3596 isp_prt(isp, ISP_LOGWARN, 3597 "Point-to-Point -> Loop mode (BAD LIP)"); 3598 break; 3599 case ISP_CONN_FATAL: 3600 isp_prt(isp, ISP_LOGERR, "FATAL CONNECTION ERROR"); 3601 isp_reinit(isp); 3602#ifdef ISP_TARGET_MODE 3603 isp_target_async(isp, bus, ASYNC_SYSTEM_ERROR); 3604#endif 3605 /* no point continuing after this */ 3606 return (-1); 3607 case ISP_CONN_LOOPBACK: 3608 isp_prt(isp, ISP_LOGWARN, 3609 "Looped Back in Point-to-Point mode"); 3610 break; 3611 default: 3612 isp_prt(isp, ISP_LOGWARN, 3613 "Unknown connection mode (0x%x)", mbox); 3614 break; 3615 } 3616 isp_async(isp, ISPASYNC_CHANGE_NOTIFY, ISPASYNC_CHANGE_OTHER); 3617 isp->isp_sendmarker = 1; 3618 FCPARAM(isp)->isp_fwstate = FW_CONFIG_WAIT; 3619 FCPARAM(isp)->isp_loopstate = LOOP_LIP_RCVD; 3620 break; 3621 3622 default: 3623 isp_prt(isp, ISP_LOGWARN, "Unknown Async Code 0x%x", mbox); 3624 break; 3625 } 3626 return (fast_post_handle); 3627} 3628 3629/* 3630 * Handle other response entries. A pointer to the request queue output 3631 * index is here in case we want to eat several entries at once, although 3632 * this is not used currently. 3633 */ 3634 3635static int 3636isp_handle_other_response(struct ispsoftc *isp, 3637 ispstatusreq_t *sp, u_int16_t *optrp) 3638{ 3639 switch (sp->req_header.rqs_entry_type) { 3640 case RQSTYPE_STATUS_CONT: 3641 isp_prt(isp, ISP_LOGINFO, "Ignored Continuation Response"); 3642 return (0); 3643 case RQSTYPE_ATIO: 3644 case RQSTYPE_CTIO: 3645 case RQSTYPE_ENABLE_LUN: 3646 case RQSTYPE_MODIFY_LUN: 3647 case RQSTYPE_NOTIFY: 3648 case RQSTYPE_NOTIFY_ACK: 3649 case RQSTYPE_CTIO1: 3650 case RQSTYPE_ATIO2: 3651 case RQSTYPE_CTIO2: 3652 case RQSTYPE_CTIO3: 3653#ifdef ISP_TARGET_MODE 3654 return (isp_target_notify(isp, sp, optrp)); 3655#else 3656 optrp = optrp; 3657 /* FALLTHROUGH */ 3658#endif 3659 case RQSTYPE_REQUEST: 3660 default: 3661 if (isp_async(isp, ISPASYNC_UNHANDLED_RESPONSE, sp)) { 3662 return (0); 3663 } 3664 isp_prt(isp, ISP_LOGWARN, "Unhandled Response Type 0x%x", 3665 sp->req_header.rqs_entry_type); 3666 return (-1); 3667 } 3668} 3669 3670static void 3671isp_parse_status(struct ispsoftc *isp, ispstatusreq_t *sp, XS_T *xs) 3672{ 3673 switch (sp->req_completion_status & 0xff) { 3674 case RQCS_COMPLETE: 3675 if (XS_NOERR(xs)) { 3676 XS_SETERR(xs, HBA_NOERROR); 3677 } 3678 return; 3679 3680 case RQCS_INCOMPLETE: 3681 if ((sp->req_state_flags & RQSF_GOT_TARGET) == 0) { 3682 isp_prt(isp, ISP_LOGDEBUG1, 3683 "Selection Timeout for %d.%d.%d", 3684 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 3685 if (XS_NOERR(xs)) { 3686 XS_SETERR(xs, HBA_SELTIMEOUT); 3687 } 3688 return; 3689 } 3690 isp_prt(isp, ISP_LOGERR, 3691 "command incomplete for %d.%d.%d, state 0x%x", 3692 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs), 3693 sp->req_state_flags); 3694 break; 3695 3696 case RQCS_DMA_ERROR: 3697 isp_prt(isp, ISP_LOGERR, "DMA error for command on %d.%d.%d", 3698 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 3699 break; 3700 3701 case RQCS_TRANSPORT_ERROR: 3702 { 3703 char buf[172]; 3704 buf[0] = 0; 3705 STRNCAT(buf, "states=>", sizeof buf); 3706 if (sp->req_state_flags & RQSF_GOT_BUS) { 3707 STRNCAT(buf, " GOT_BUS", sizeof buf); 3708 } 3709 if (sp->req_state_flags & RQSF_GOT_TARGET) { 3710 STRNCAT(buf, " GOT_TGT", sizeof buf); 3711 } 3712 if (sp->req_state_flags & RQSF_SENT_CDB) { 3713 STRNCAT(buf, " SENT_CDB", sizeof buf); 3714 } 3715 if (sp->req_state_flags & RQSF_XFRD_DATA) { 3716 STRNCAT(buf, " XFRD_DATA", sizeof buf); 3717 } 3718 if (sp->req_state_flags & RQSF_GOT_STATUS) { 3719 STRNCAT(buf, " GOT_STS", sizeof buf); 3720 } 3721 if (sp->req_state_flags & RQSF_GOT_SENSE) { 3722 STRNCAT(buf, " GOT_SNS", sizeof buf); 3723 } 3724 if (sp->req_state_flags & RQSF_XFER_COMPLETE) { 3725 STRNCAT(buf, " XFR_CMPLT", sizeof buf); 3726 } 3727 STRNCAT(buf, "\nstatus=>", sizeof buf); 3728 if (sp->req_status_flags & RQSTF_DISCONNECT) { 3729 STRNCAT(buf, " Disconnect", sizeof buf); 3730 } 3731 if (sp->req_status_flags & RQSTF_SYNCHRONOUS) { 3732 STRNCAT(buf, " Sync_xfr", sizeof buf); 3733 } 3734 if (sp->req_status_flags & RQSTF_PARITY_ERROR) { 3735 STRNCAT(buf, " Parity", sizeof buf); 3736 } 3737 if (sp->req_status_flags & RQSTF_BUS_RESET) { 3738 STRNCAT(buf, " Bus_Reset", sizeof buf); 3739 } 3740 if (sp->req_status_flags & RQSTF_DEVICE_RESET) { 3741 STRNCAT(buf, " Device_Reset", sizeof buf); 3742 } 3743 if (sp->req_status_flags & RQSTF_ABORTED) { 3744 STRNCAT(buf, " Aborted", sizeof buf); 3745 } 3746 if (sp->req_status_flags & RQSTF_TIMEOUT) { 3747 STRNCAT(buf, " Timeout", sizeof buf); 3748 } 3749 if (sp->req_status_flags & RQSTF_NEGOTIATION) { 3750 STRNCAT(buf, " Negotiation", sizeof buf); 3751 } 3752 isp_prt(isp, ISP_LOGERR, "%s", buf); 3753 isp_prt(isp, ISP_LOGERR, "transport error for %d.%d.%d:\n%s", 3754 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs), buf); 3755 break; 3756 } 3757 case RQCS_RESET_OCCURRED: 3758 isp_prt(isp, ISP_LOGWARN, 3759 "bus reset destroyed command for %d.%d.%d", 3760 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 3761 isp->isp_sendmarker |= (1 << XS_CHANNEL(xs)); 3762 if (XS_NOERR(xs)) { 3763 XS_SETERR(xs, HBA_BUSRESET); 3764 } 3765 return; 3766 3767 case RQCS_ABORTED: 3768 isp_prt(isp, ISP_LOGERR, "command aborted for %d.%d.%d", 3769 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 3770 isp->isp_sendmarker |= (1 << XS_CHANNEL(xs)); 3771 if (XS_NOERR(xs)) { 3772 XS_SETERR(xs, HBA_ABORTED); 3773 } 3774 return; 3775 3776 case RQCS_TIMEOUT: 3777 isp_prt(isp, ISP_LOGWARN, "command timed out for %d.%d.%d", 3778 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 3779 if (XS_NOERR(xs)) { 3780 XS_SETERR(xs, HBA_CMDTIMEOUT); 3781 } 3782 return; 3783 3784 case RQCS_DATA_OVERRUN: 3785 XS_RESID(xs) = sp->req_resid; 3786 isp_prt(isp, ISP_LOGERR, "data overrun for command on %d.%d.%d", 3787 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 3788 if (XS_NOERR(xs)) { 3789 XS_SETERR(xs, HBA_DATAOVR); 3790 } 3791 return; 3792 3793 case RQCS_COMMAND_OVERRUN: 3794 isp_prt(isp, ISP_LOGERR, 3795 "command overrun for command on %d.%d.%d", 3796 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 3797 break; 3798 3799 case RQCS_STATUS_OVERRUN: 3800 isp_prt(isp, ISP_LOGERR, 3801 "status overrun for command on %d.%d.%d", 3802 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 3803 break; 3804 3805 case RQCS_BAD_MESSAGE: 3806 isp_prt(isp, ISP_LOGERR, 3807 "msg not COMMAND COMPLETE after status %d.%d.%d", 3808 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 3809 break; 3810 3811 case RQCS_NO_MESSAGE_OUT: 3812 isp_prt(isp, ISP_LOGERR, 3813 "No MESSAGE OUT phase after selection on %d.%d.%d", 3814 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 3815 break; 3816 3817 case RQCS_EXT_ID_FAILED: 3818 isp_prt(isp, ISP_LOGERR, "EXTENDED IDENTIFY failed %d.%d.%d", 3819 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 3820 break; 3821 3822 case RQCS_IDE_MSG_FAILED: 3823 isp_prt(isp, ISP_LOGERR, 3824 "INITIATOR DETECTED ERROR rejected by %d.%d.%d", 3825 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 3826 break; 3827 3828 case RQCS_ABORT_MSG_FAILED: 3829 isp_prt(isp, ISP_LOGERR, "ABORT OPERATION rejected by %d.%d.%d", 3830 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 3831 break; 3832 3833 case RQCS_REJECT_MSG_FAILED: 3834 isp_prt(isp, ISP_LOGERR, "MESSAGE REJECT rejected by %d.%d.%d", 3835 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 3836 break; 3837 3838 case RQCS_NOP_MSG_FAILED: 3839 isp_prt(isp, ISP_LOGERR, "NOP rejected by %d.%d.%d", 3840 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 3841 break; 3842 3843 case RQCS_PARITY_ERROR_MSG_FAILED: 3844 isp_prt(isp, ISP_LOGERR, 3845 "MESSAGE PARITY ERROR rejected by %d.%d.%d", 3846 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 3847 break; 3848 3849 case RQCS_DEVICE_RESET_MSG_FAILED: 3850 isp_prt(isp, ISP_LOGWARN, 3851 "BUS DEVICE RESET rejected by %d.%d.%d", 3852 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 3853 break; 3854 3855 case RQCS_ID_MSG_FAILED: 3856 isp_prt(isp, ISP_LOGERR, "IDENTIFY rejected by %d.%d.%d", 3857 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 3858 break; 3859 3860 case RQCS_UNEXP_BUS_FREE: 3861 isp_prt(isp, ISP_LOGERR, "%d.%d.%d had an unexpected bus free", 3862 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 3863 break; 3864 3865 case RQCS_DATA_UNDERRUN: 3866 XS_RESID(xs) = sp->req_resid; 3867 if (XS_NOERR(xs)) { 3868 XS_SETERR(xs, HBA_NOERROR); 3869 } 3870 return; 3871 3872 case RQCS_XACT_ERR1: 3873 isp_prt(isp, ISP_LOGERR, xact1, XS_CHANNEL(xs), 3874 XS_TGT(xs), XS_LUN(xs)); 3875 break; 3876 3877 case RQCS_XACT_ERR2: 3878 isp_prt(isp, ISP_LOGERR, xact2, 3879 XS_LUN(xs), XS_TGT(xs), XS_CHANNEL(xs)); 3880 break; 3881 3882 case RQCS_XACT_ERR3: 3883 isp_prt(isp, ISP_LOGERR, xact3, 3884 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 3885 break; 3886 3887 case RQCS_BAD_ENTRY: 3888 isp_prt(isp, ISP_LOGERR, "Invalid IOCB entry type detected"); 3889 break; 3890 3891 case RQCS_QUEUE_FULL: 3892 isp_prt(isp, ISP_LOGDEBUG1, 3893 "internal queues full for %d.%d.%d status 0x%x", XS_TGT(xs), 3894 XS_LUN(xs), XS_CHANNEL(xs), *XS_STSP(xs)); 3895 /* 3896 * If QFULL or some other status byte is set, then this 3897 * isn't an error, per se. 3898 */ 3899 if (*XS_STSP(xs) != SCSI_GOOD && XS_NOERR(xs)) { 3900 XS_SETERR(xs, HBA_NOERROR); 3901 return; 3902 } 3903 break; 3904 3905 case RQCS_PHASE_SKIPPED: 3906 isp_prt(isp, ISP_LOGERR, pskip, XS_CHANNEL(xs), 3907 XS_TGT(xs), XS_LUN(xs)); 3908 break; 3909 3910 case RQCS_ARQS_FAILED: 3911 isp_prt(isp, ISP_LOGERR, 3912 "Auto Request Sense failed for %d.%d.%d", 3913 XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs)); 3914 if (XS_NOERR(xs)) { 3915 XS_SETERR(xs, HBA_ARQFAIL); 3916 } 3917 return; 3918 3919 case RQCS_WIDE_FAILED: 3920 isp_prt(isp, ISP_LOGERR, 3921 "Wide Negotiation failed for %d.%d.%d", 3922 XS_TGT(xs), XS_LUN(xs), XS_CHANNEL(xs)); 3923 if (IS_SCSI(isp)) { 3924 sdparam *sdp = isp->isp_param; 3925 sdp += XS_CHANNEL(xs); 3926 sdp->isp_devparam[XS_TGT(xs)].goal_flags &= ~DPARM_WIDE; 3927 sdp->isp_devparam[XS_TGT(xs)].dev_update = 1; 3928 isp->isp_update |= (1 << XS_CHANNEL(xs)); 3929 } 3930 if (XS_NOERR(xs)) { 3931 XS_SETERR(xs, HBA_NOERROR); 3932 } 3933 return; 3934 3935 case RQCS_SYNCXFER_FAILED: 3936 isp_prt(isp, ISP_LOGERR, 3937 "SDTR Message failed for target %d.%d.%d", 3938 XS_TGT(xs), XS_LUN(xs), XS_CHANNEL(xs)); 3939 if (IS_SCSI(isp)) { 3940 sdparam *sdp = isp->isp_param; 3941 sdp += XS_CHANNEL(xs); 3942 sdp->isp_devparam[XS_TGT(xs)].goal_flags &= ~DPARM_SYNC; 3943 sdp->isp_devparam[XS_TGT(xs)].dev_update = 1; 3944 isp->isp_update |= (1 << XS_CHANNEL(xs)); 3945 } 3946 break; 3947 3948 case RQCS_LVD_BUSERR: 3949 isp_prt(isp, ISP_LOGERR, 3950 "Bad LVD condition while talking to %d.%d.%d", 3951 XS_TGT(xs), XS_LUN(xs), XS_CHANNEL(xs)); 3952 break; 3953 3954 case RQCS_PORT_UNAVAILABLE: 3955 /* 3956 * No such port on the loop. Moral equivalent of SELTIMEO 3957 */ 3958 isp_prt(isp, ISP_LOGINFO, 3959 "Port Unavailable for target %d", XS_TGT(xs)); 3960 if (XS_NOERR(xs)) { 3961 XS_SETERR(xs, HBA_SELTIMEOUT); 3962 } 3963 return; 3964 case RQCS_PORT_LOGGED_OUT: 3965 /* 3966 * It was there (maybe)- treat as a selection timeout. 3967 */ 3968 isp_prt(isp, ISP_LOGINFO, 3969 "port logout for target %d", XS_TGT(xs)); 3970 if (XS_NOERR(xs)) { 3971 XS_SETERR(xs, HBA_SELTIMEOUT); 3972 } 3973 return; 3974 3975 case RQCS_PORT_CHANGED: 3976 isp_prt(isp, ISP_LOGWARN, 3977 "port changed for target %d", XS_TGT(xs)); 3978 if (XS_NOERR(xs)) { 3979 XS_SETERR(xs, HBA_SELTIMEOUT); 3980 } 3981 return; 3982 3983 case RQCS_PORT_BUSY: 3984 isp_prt(isp, ISP_LOGWARN, 3985 "port busy for target %d", XS_TGT(xs)); 3986 if (XS_NOERR(xs)) { 3987 XS_SETERR(xs, HBA_TGTBSY); 3988 } 3989 return; 3990 3991 default: 3992 isp_prt(isp, ISP_LOGERR, "Unknown Completion Status 0x%x", 3993 sp->req_completion_status); 3994 break; 3995 } 3996 if (XS_NOERR(xs)) { 3997 XS_SETERR(xs, HBA_BOTCH); 3998 } 3999} 4000 4001static void 4002isp_fastpost_complete(struct ispsoftc *isp, u_int16_t fph) 4003{ 4004 XS_T *xs; 4005 4006 if (fph == 0) { 4007 return; 4008 } 4009 xs = isp_find_xs(isp, fph); 4010 if (xs == NULL) { 4011 isp_prt(isp, ISP_LOGWARN, 4012 "Command for fast post handle 0x%x not found", fph); 4013 return; 4014 } 4015 isp_destroy_handle(isp, fph); 4016 4017 /* 4018 * Since we don't have a result queue entry item, 4019 * we must believe that SCSI status is zero and 4020 * that all data transferred. 4021 */ 4022 XS_SET_STATE_STAT(isp, xs, NULL); 4023 XS_RESID(xs) = 0; 4024 *XS_STSP(xs) = SCSI_GOOD; 4025 if (XS_XFRLEN(xs)) { 4026 ISP_DMAFREE(isp, xs, fph); 4027 } 4028 if (isp->isp_nactive) 4029 isp->isp_nactive--; 4030 isp_done(xs); 4031} 4032 4033#define HIBYT(x) ((x) >> 0x8) 4034#define LOBYT(x) ((x) & 0xff) 4035#define ISPOPMAP(a, b) (((a) << 8) | (b)) 4036static u_int16_t mbpscsi[] = { 4037 ISPOPMAP(0x01, 0x01), /* 0x00: MBOX_NO_OP */ 4038 ISPOPMAP(0x1f, 0x01), /* 0x01: MBOX_LOAD_RAM */ 4039 ISPOPMAP(0x03, 0x01), /* 0x02: MBOX_EXEC_FIRMWARE */ 4040 ISPOPMAP(0x1f, 0x01), /* 0x03: MBOX_DUMP_RAM */ 4041 ISPOPMAP(0x07, 0x07), /* 0x04: MBOX_WRITE_RAM_WORD */ 4042 ISPOPMAP(0x03, 0x07), /* 0x05: MBOX_READ_RAM_WORD */ 4043 ISPOPMAP(0x3f, 0x3f), /* 0x06: MBOX_MAILBOX_REG_TEST */ 4044 ISPOPMAP(0x03, 0x07), /* 0x07: MBOX_VERIFY_CHECKSUM */ 4045 ISPOPMAP(0x01, 0x0f), /* 0x08: MBOX_ABOUT_FIRMWARE */ 4046 ISPOPMAP(0x00, 0x00), /* 0x09: */ 4047 ISPOPMAP(0x00, 0x00), /* 0x0a: */ 4048 ISPOPMAP(0x00, 0x00), /* 0x0b: */ 4049 ISPOPMAP(0x00, 0x00), /* 0x0c: */ 4050 ISPOPMAP(0x00, 0x00), /* 0x0d: */ 4051 ISPOPMAP(0x01, 0x05), /* 0x0e: MBOX_CHECK_FIRMWARE */ 4052 ISPOPMAP(0x00, 0x00), /* 0x0f: */ 4053 ISPOPMAP(0x1f, 0x1f), /* 0x10: MBOX_INIT_REQ_QUEUE */ 4054 ISPOPMAP(0x3f, 0x3f), /* 0x11: MBOX_INIT_RES_QUEUE */ 4055 ISPOPMAP(0x0f, 0x0f), /* 0x12: MBOX_EXECUTE_IOCB */ 4056 ISPOPMAP(0x03, 0x03), /* 0x13: MBOX_WAKE_UP */ 4057 ISPOPMAP(0x01, 0x3f), /* 0x14: MBOX_STOP_FIRMWARE */ 4058 ISPOPMAP(0x0f, 0x0f), /* 0x15: MBOX_ABORT */ 4059 ISPOPMAP(0x03, 0x03), /* 0x16: MBOX_ABORT_DEVICE */ 4060 ISPOPMAP(0x07, 0x07), /* 0x17: MBOX_ABORT_TARGET */ 4061 ISPOPMAP(0x07, 0x07), /* 0x18: MBOX_BUS_RESET */ 4062 ISPOPMAP(0x03, 0x07), /* 0x19: MBOX_STOP_QUEUE */ 4063 ISPOPMAP(0x03, 0x07), /* 0x1a: MBOX_START_QUEUE */ 4064 ISPOPMAP(0x03, 0x07), /* 0x1b: MBOX_SINGLE_STEP_QUEUE */ 4065 ISPOPMAP(0x03, 0x07), /* 0x1c: MBOX_ABORT_QUEUE */ 4066 ISPOPMAP(0x03, 0x4f), /* 0x1d: MBOX_GET_DEV_QUEUE_STATUS */ 4067 ISPOPMAP(0x00, 0x00), /* 0x1e: */ 4068 ISPOPMAP(0x01, 0x07), /* 0x1f: MBOX_GET_FIRMWARE_STATUS */ 4069 ISPOPMAP(0x01, 0x07), /* 0x20: MBOX_GET_INIT_SCSI_ID */ 4070 ISPOPMAP(0x01, 0x07), /* 0x21: MBOX_GET_SELECT_TIMEOUT */ 4071 ISPOPMAP(0x01, 0xc7), /* 0x22: MBOX_GET_RETRY_COUNT */ 4072 ISPOPMAP(0x01, 0x07), /* 0x23: MBOX_GET_TAG_AGE_LIMIT */ 4073 ISPOPMAP(0x01, 0x03), /* 0x24: MBOX_GET_CLOCK_RATE */ 4074 ISPOPMAP(0x01, 0x07), /* 0x25: MBOX_GET_ACT_NEG_STATE */ 4075 ISPOPMAP(0x01, 0x07), /* 0x26: MBOX_GET_ASYNC_DATA_SETUP_TIME */ 4076 ISPOPMAP(0x01, 0x07), /* 0x27: MBOX_GET_PCI_PARAMS */ 4077 ISPOPMAP(0x03, 0x4f), /* 0x28: MBOX_GET_TARGET_PARAMS */ 4078 ISPOPMAP(0x03, 0x0f), /* 0x29: MBOX_GET_DEV_QUEUE_PARAMS */ 4079 ISPOPMAP(0x01, 0x07), /* 0x2a: MBOX_GET_RESET_DELAY_PARAMS */ 4080 ISPOPMAP(0x00, 0x00), /* 0x2b: */ 4081 ISPOPMAP(0x00, 0x00), /* 0x2c: */ 4082 ISPOPMAP(0x00, 0x00), /* 0x2d: */ 4083 ISPOPMAP(0x00, 0x00), /* 0x2e: */ 4084 ISPOPMAP(0x00, 0x00), /* 0x2f: */ 4085 ISPOPMAP(0x03, 0x03), /* 0x30: MBOX_SET_INIT_SCSI_ID */ 4086 ISPOPMAP(0x07, 0x07), /* 0x31: MBOX_SET_SELECT_TIMEOUT */ 4087 ISPOPMAP(0xc7, 0xc7), /* 0x32: MBOX_SET_RETRY_COUNT */ 4088 ISPOPMAP(0x07, 0x07), /* 0x33: MBOX_SET_TAG_AGE_LIMIT */ 4089 ISPOPMAP(0x03, 0x03), /* 0x34: MBOX_SET_CLOCK_RATE */ 4090 ISPOPMAP(0x07, 0x07), /* 0x35: MBOX_SET_ACT_NEG_STATE */ 4091 ISPOPMAP(0x07, 0x07), /* 0x36: MBOX_SET_ASYNC_DATA_SETUP_TIME */ 4092 ISPOPMAP(0x07, 0x07), /* 0x37: MBOX_SET_PCI_CONTROL_PARAMS */ 4093 ISPOPMAP(0x4f, 0x4f), /* 0x38: MBOX_SET_TARGET_PARAMS */ 4094 ISPOPMAP(0x0f, 0x0f), /* 0x39: MBOX_SET_DEV_QUEUE_PARAMS */ 4095 ISPOPMAP(0x07, 0x07), /* 0x3a: MBOX_SET_RESET_DELAY_PARAMS */ 4096 ISPOPMAP(0x00, 0x00), /* 0x3b: */ 4097 ISPOPMAP(0x00, 0x00), /* 0x3c: */ 4098 ISPOPMAP(0x00, 0x00), /* 0x3d: */ 4099 ISPOPMAP(0x00, 0x00), /* 0x3e: */ 4100 ISPOPMAP(0x00, 0x00), /* 0x3f: */ 4101 ISPOPMAP(0x01, 0x03), /* 0x40: MBOX_RETURN_BIOS_BLOCK_ADDR */ 4102 ISPOPMAP(0x3f, 0x01), /* 0x41: MBOX_WRITE_FOUR_RAM_WORDS */ 4103 ISPOPMAP(0x03, 0x07), /* 0x42: MBOX_EXEC_BIOS_IOCB */ 4104 ISPOPMAP(0x00, 0x00), /* 0x43: */ 4105 ISPOPMAP(0x00, 0x00), /* 0x44: */ 4106 ISPOPMAP(0x03, 0x03), /* 0x45: SET SYSTEM PARAMETER */ 4107 ISPOPMAP(0x01, 0x03), /* 0x46: GET SYSTEM PARAMETER */ 4108 ISPOPMAP(0x00, 0x00), /* 0x47: */ 4109 ISPOPMAP(0x01, 0xcf), /* 0x48: GET SCAM CONFIGURATION */ 4110 ISPOPMAP(0xcf, 0xcf), /* 0x49: SET SCAM CONFIGURATION */ 4111 ISPOPMAP(0x03, 0x03), /* 0x4a: MBOX_SET_FIRMWARE_FEATURES */ 4112 ISPOPMAP(0x01, 0x03), /* 0x4b: MBOX_GET_FIRMWARE_FEATURES */ 4113 ISPOPMAP(0x00, 0x00), /* 0x4c: */ 4114 ISPOPMAP(0x00, 0x00), /* 0x4d: */ 4115 ISPOPMAP(0x00, 0x00), /* 0x4e: */ 4116 ISPOPMAP(0x00, 0x00), /* 0x4f: */ 4117 ISPOPMAP(0xdf, 0xdf), /* 0x50: LOAD RAM A64 */ 4118 ISPOPMAP(0xdf, 0xdf), /* 0x51: DUMP RAM A64 */ 4119 ISPOPMAP(0xdf, 0xdf), /* 0x52: INITIALIZE REQUEST QUEUE A64 */ 4120 ISPOPMAP(0xff, 0xff), /* 0x53: INITIALIZE RESPONSE QUEUE A64 */ 4121 ISPOPMAP(0xcf, 0xff), /* 0x54: EXECUTE IOCB A64 */ 4122 ISPOPMAP(0x07, 0x01), /* 0x55: ENABLE TARGET MODE */ 4123 ISPOPMAP(0x03, 0x0f), /* 0x56: GET TARGET STATUS */ 4124 ISPOPMAP(0x00, 0x00), /* 0x57: */ 4125 ISPOPMAP(0x00, 0x00), /* 0x58: */ 4126 ISPOPMAP(0x00, 0x00), /* 0x59: */ 4127 ISPOPMAP(0x03, 0x03), /* 0x5a: SET DATA OVERRUN RECOVERY MODE */ 4128 ISPOPMAP(0x01, 0x03), /* 0x5b: GET DATA OVERRUN RECOVERY MODE */ 4129 ISPOPMAP(0x0f, 0x0f), /* 0x5c: SET HOST DATA */ 4130 ISPOPMAP(0x01, 0x01) /* 0x5d: GET NOST DATA */ 4131}; 4132 4133#ifndef ISP_STRIPPED 4134static char *scsi_mbcmd_names[] = { 4135 "NO-OP", 4136 "LOAD RAM", 4137 "EXEC FIRMWARE", 4138 "DUMP RAM", 4139 "WRITE RAM WORD", 4140 "READ RAM WORD", 4141 "MAILBOX REG TEST", 4142 "VERIFY CHECKSUM", 4143 "ABOUT FIRMWARE", 4144 NULL, 4145 NULL, 4146 NULL, 4147 NULL, 4148 NULL, 4149 "CHECK FIRMWARE", 4150 NULL, 4151 "INIT REQUEST QUEUE", 4152 "INIT RESULT QUEUE", 4153 "EXECUTE IOCB", 4154 "WAKE UP", 4155 "STOP FIRMWARE", 4156 "ABORT", 4157 "ABORT DEVICE", 4158 "ABORT TARGET", 4159 "BUS RESET", 4160 "STOP QUEUE", 4161 "START QUEUE", 4162 "SINGLE STEP QUEUE", 4163 "ABORT QUEUE", 4164 "GET DEV QUEUE STATUS", 4165 NULL, 4166 "GET FIRMWARE STATUS", 4167 "GET INIT SCSI ID", 4168 "GET SELECT TIMEOUT", 4169 "GET RETRY COUNT", 4170 "GET TAG AGE LIMIT", 4171 "GET CLOCK RATE", 4172 "GET ACT NEG STATE", 4173 "GET ASYNC DATA SETUP TIME", 4174 "GET PCI PARAMS", 4175 "GET TARGET PARAMS", 4176 "GET DEV QUEUE PARAMS", 4177 "GET RESET DELAY PARAMS", 4178 NULL, 4179 NULL, 4180 NULL, 4181 NULL, 4182 NULL, 4183 "SET INIT SCSI ID", 4184 "SET SELECT TIMEOUT", 4185 "SET RETRY COUNT", 4186 "SET TAG AGE LIMIT", 4187 "SET CLOCK RATE", 4188 "SET ACT NEG STATE", 4189 "SET ASYNC DATA SETUP TIME", 4190 "SET PCI CONTROL PARAMS", 4191 "SET TARGET PARAMS", 4192 "SET DEV QUEUE PARAMS", 4193 "SET RESET DELAY PARAMS", 4194 NULL, 4195 NULL, 4196 NULL, 4197 NULL, 4198 NULL, 4199 "RETURN BIOS BLOCK ADDR", 4200 "WRITE FOUR RAM WORDS", 4201 "EXEC BIOS IOCB", 4202 NULL, 4203 NULL, 4204 "SET SYSTEM PARAMETER", 4205 "GET SYSTEM PARAMETER", 4206 NULL, 4207 "GET SCAM CONFIGURATION", 4208 "SET SCAM CONFIGURATION", 4209 "SET FIRMWARE FEATURES", 4210 "GET FIRMWARE FEATURES", 4211 NULL, 4212 NULL, 4213 NULL, 4214 NULL, 4215 "LOAD RAM A64", 4216 "DUMP RAM A64", 4217 "INITIALIZE REQUEST QUEUE A64", 4218 "INITIALIZE RESPONSE QUEUE A64", 4219 "EXECUTE IOCB A64", 4220 "ENABLE TARGET MODE", 4221 "GET TARGET MODE STATE", 4222 NULL, 4223 NULL, 4224 NULL, 4225 "SET DATA OVERRUN RECOVERY MODE", 4226 "GET DATA OVERRUN RECOVERY MODE", 4227 "SET HOST DATA", 4228 "GET NOST DATA", 4229}; 4230#endif 4231 4232static u_int16_t mbpfc[] = { 4233 ISPOPMAP(0x01, 0x01), /* 0x00: MBOX_NO_OP */ 4234 ISPOPMAP(0x1f, 0x01), /* 0x01: MBOX_LOAD_RAM */ 4235 ISPOPMAP(0x03, 0x01), /* 0x02: MBOX_EXEC_FIRMWARE */ 4236 ISPOPMAP(0xdf, 0x01), /* 0x03: MBOX_DUMP_RAM */ 4237 ISPOPMAP(0x07, 0x07), /* 0x04: MBOX_WRITE_RAM_WORD */ 4238 ISPOPMAP(0x03, 0x07), /* 0x05: MBOX_READ_RAM_WORD */ 4239 ISPOPMAP(0xff, 0xff), /* 0x06: MBOX_MAILBOX_REG_TEST */ 4240 ISPOPMAP(0x03, 0x05), /* 0x07: MBOX_VERIFY_CHECKSUM */ 4241 ISPOPMAP(0x01, 0x4f), /* 0x08: MBOX_ABOUT_FIRMWARE */ 4242 ISPOPMAP(0xdf, 0x01), /* 0x09: LOAD RAM */ 4243 ISPOPMAP(0xdf, 0x01), /* 0x0a: DUMP RAM */ 4244 ISPOPMAP(0x00, 0x00), /* 0x0b: */ 4245 ISPOPMAP(0x00, 0x00), /* 0x0c: */ 4246 ISPOPMAP(0x00, 0x00), /* 0x0d: */ 4247 ISPOPMAP(0x01, 0x05), /* 0x0e: MBOX_CHECK_FIRMWARE */ 4248 ISPOPMAP(0x00, 0x00), /* 0x0f: */ 4249 ISPOPMAP(0x1f, 0x11), /* 0x10: MBOX_INIT_REQ_QUEUE */ 4250 ISPOPMAP(0x2f, 0x21), /* 0x11: MBOX_INIT_RES_QUEUE */ 4251 ISPOPMAP(0x0f, 0x01), /* 0x12: MBOX_EXECUTE_IOCB */ 4252 ISPOPMAP(0x03, 0x03), /* 0x13: MBOX_WAKE_UP */ 4253 ISPOPMAP(0x01, 0xff), /* 0x14: MBOX_STOP_FIRMWARE */ 4254 ISPOPMAP(0x4f, 0x01), /* 0x15: MBOX_ABORT */ 4255 ISPOPMAP(0x07, 0x01), /* 0x16: MBOX_ABORT_DEVICE */ 4256 ISPOPMAP(0x07, 0x01), /* 0x17: MBOX_ABORT_TARGET */ 4257 ISPOPMAP(0x03, 0x03), /* 0x18: MBOX_BUS_RESET */ 4258 ISPOPMAP(0x07, 0x05), /* 0x19: MBOX_STOP_QUEUE */ 4259 ISPOPMAP(0x07, 0x05), /* 0x1a: MBOX_START_QUEUE */ 4260 ISPOPMAP(0x07, 0x05), /* 0x1b: MBOX_SINGLE_STEP_QUEUE */ 4261 ISPOPMAP(0x07, 0x05), /* 0x1c: MBOX_ABORT_QUEUE */ 4262 ISPOPMAP(0x07, 0x03), /* 0x1d: MBOX_GET_DEV_QUEUE_STATUS */ 4263 ISPOPMAP(0x00, 0x00), /* 0x1e: */ 4264 ISPOPMAP(0x01, 0x07), /* 0x1f: MBOX_GET_FIRMWARE_STATUS */ 4265 ISPOPMAP(0x01, 0x4f), /* 0x20: MBOX_GET_LOOP_ID */ 4266 ISPOPMAP(0x00, 0x00), /* 0x21: */ 4267 ISPOPMAP(0x01, 0x07), /* 0x22: MBOX_GET_RETRY_COUNT */ 4268 ISPOPMAP(0x00, 0x00), /* 0x23: */ 4269 ISPOPMAP(0x00, 0x00), /* 0x24: */ 4270 ISPOPMAP(0x00, 0x00), /* 0x25: */ 4271 ISPOPMAP(0x00, 0x00), /* 0x26: */ 4272 ISPOPMAP(0x00, 0x00), /* 0x27: */ 4273 ISPOPMAP(0x01, 0x03), /* 0x28: MBOX_GET_FIRMWARE_OPTIONS */ 4274 ISPOPMAP(0x03, 0x07), /* 0x29: MBOX_GET_PORT_QUEUE_PARAMS */ 4275 ISPOPMAP(0x00, 0x00), /* 0x2a: */ 4276 ISPOPMAP(0x00, 0x00), /* 0x2b: */ 4277 ISPOPMAP(0x00, 0x00), /* 0x2c: */ 4278 ISPOPMAP(0x00, 0x00), /* 0x2d: */ 4279 ISPOPMAP(0x00, 0x00), /* 0x2e: */ 4280 ISPOPMAP(0x00, 0x00), /* 0x2f: */ 4281 ISPOPMAP(0x00, 0x00), /* 0x30: */ 4282 ISPOPMAP(0x00, 0x00), /* 0x31: */ 4283 ISPOPMAP(0x07, 0x07), /* 0x32: MBOX_SET_RETRY_COUNT */ 4284 ISPOPMAP(0x00, 0x00), /* 0x33: */ 4285 ISPOPMAP(0x00, 0x00), /* 0x34: */ 4286 ISPOPMAP(0x00, 0x00), /* 0x35: */ 4287 ISPOPMAP(0x00, 0x00), /* 0x36: */ 4288 ISPOPMAP(0x00, 0x00), /* 0x37: */ 4289 ISPOPMAP(0x0f, 0x01), /* 0x38: MBOX_SET_FIRMWARE_OPTIONS */ 4290 ISPOPMAP(0x0f, 0x07), /* 0x39: MBOX_SET_PORT_QUEUE_PARAMS */ 4291 ISPOPMAP(0x00, 0x00), /* 0x3a: */ 4292 ISPOPMAP(0x00, 0x00), /* 0x3b: */ 4293 ISPOPMAP(0x00, 0x00), /* 0x3c: */ 4294 ISPOPMAP(0x00, 0x00), /* 0x3d: */ 4295 ISPOPMAP(0x00, 0x00), /* 0x3e: */ 4296 ISPOPMAP(0x00, 0x00), /* 0x3f: */ 4297 ISPOPMAP(0x03, 0x01), /* 0x40: MBOX_LOOP_PORT_BYPASS */ 4298 ISPOPMAP(0x03, 0x01), /* 0x41: MBOX_LOOP_PORT_ENABLE */ 4299 ISPOPMAP(0x03, 0x07), /* 0x42: MBOX_GET_RESOURCE_COUNTS */ 4300 ISPOPMAP(0x01, 0x01), /* 0x43: MBOX_REQUEST_NON_PARTICIPATING_MODE */ 4301 ISPOPMAP(0x00, 0x00), /* 0x44: */ 4302 ISPOPMAP(0x00, 0x00), /* 0x45: */ 4303 ISPOPMAP(0x00, 0x00), /* 0x46: */ 4304 ISPOPMAP(0xcf, 0x03), /* 0x47: GET PORT_DATABASE ENHANCED */ 4305 ISPOPMAP(0x00, 0x00), /* 0x48: */ 4306 ISPOPMAP(0x00, 0x00), /* 0x49: */ 4307 ISPOPMAP(0x00, 0x00), /* 0x4a: */ 4308 ISPOPMAP(0x00, 0x00), /* 0x4b: */ 4309 ISPOPMAP(0x00, 0x00), /* 0x4c: */ 4310 ISPOPMAP(0x00, 0x00), /* 0x4d: */ 4311 ISPOPMAP(0x00, 0x00), /* 0x4e: */ 4312 ISPOPMAP(0x00, 0x00), /* 0x4f: */ 4313 ISPOPMAP(0x00, 0x00), /* 0x50: */ 4314 ISPOPMAP(0x00, 0x00), /* 0x51: */ 4315 ISPOPMAP(0x00, 0x00), /* 0x52: */ 4316 ISPOPMAP(0x00, 0x00), /* 0x53: */ 4317 ISPOPMAP(0xcf, 0x01), /* 0x54: EXECUTE IOCB A64 */ 4318 ISPOPMAP(0x00, 0x00), /* 0x55: */ 4319 ISPOPMAP(0x00, 0x00), /* 0x56: */ 4320 ISPOPMAP(0x00, 0x00), /* 0x57: */ 4321 ISPOPMAP(0x00, 0x00), /* 0x58: */ 4322 ISPOPMAP(0x00, 0x00), /* 0x59: */ 4323 ISPOPMAP(0x00, 0x00), /* 0x5a: */ 4324 ISPOPMAP(0x00, 0x00), /* 0x5b: */ 4325 ISPOPMAP(0x00, 0x00), /* 0x5c: */ 4326 ISPOPMAP(0x07, 0x03), /* 0x5d: MBOX_GET_SET_DATA_RATE */ 4327 ISPOPMAP(0x00, 0x00), /* 0x5e: */ 4328 ISPOPMAP(0x00, 0x00), /* 0x5f: */ 4329 ISPOPMAP(0xfd, 0x31), /* 0x60: MBOX_INIT_FIRMWARE */ 4330 ISPOPMAP(0x00, 0x00), /* 0x61: */ 4331 ISPOPMAP(0x01, 0x01), /* 0x62: MBOX_INIT_LIP */ 4332 ISPOPMAP(0xcd, 0x03), /* 0x63: MBOX_GET_FC_AL_POSITION_MAP */ 4333 ISPOPMAP(0xcf, 0x01), /* 0x64: MBOX_GET_PORT_DB */ 4334 ISPOPMAP(0x07, 0x01), /* 0x65: MBOX_CLEAR_ACA */ 4335 ISPOPMAP(0x07, 0x01), /* 0x66: MBOX_TARGET_RESET */ 4336 ISPOPMAP(0x07, 0x01), /* 0x67: MBOX_CLEAR_TASK_SET */ 4337 ISPOPMAP(0x07, 0x01), /* 0x68: MBOX_ABORT_TASK_SET */ 4338 ISPOPMAP(0x01, 0x07), /* 0x69: MBOX_GET_FW_STATE */ 4339 ISPOPMAP(0x03, 0xcf), /* 0x6a: MBOX_GET_PORT_NAME */ 4340 ISPOPMAP(0xcf, 0x01), /* 0x6b: MBOX_GET_LINK_STATUS */ 4341 ISPOPMAP(0x0f, 0x01), /* 0x6c: MBOX_INIT_LIP_RESET */ 4342 ISPOPMAP(0x00, 0x00), /* 0x6d: */ 4343 ISPOPMAP(0xcf, 0x03), /* 0x6e: MBOX_SEND_SNS */ 4344 ISPOPMAP(0x0f, 0x07), /* 0x6f: MBOX_FABRIC_LOGIN */ 4345 ISPOPMAP(0x03, 0x01), /* 0x70: MBOX_SEND_CHANGE_REQUEST */ 4346 ISPOPMAP(0x03, 0x03), /* 0x71: MBOX_FABRIC_LOGOUT */ 4347 ISPOPMAP(0x0f, 0x0f), /* 0x72: MBOX_INIT_LIP_LOGIN */ 4348 ISPOPMAP(0x00, 0x00), /* 0x73: */ 4349 ISPOPMAP(0x07, 0x01), /* 0x74: LOGIN LOOP PORT */ 4350 ISPOPMAP(0xcf, 0x03), /* 0x75: GET PORT/NODE NAME LIST */ 4351 ISPOPMAP(0x4f, 0x01), /* 0x76: SET VENDOR ID */ 4352 ISPOPMAP(0xcd, 0x01), /* 0x77: INITIALIZE IP MAILBOX */ 4353 ISPOPMAP(0x00, 0x00), /* 0x78: */ 4354 ISPOPMAP(0x00, 0x00), /* 0x79: */ 4355 ISPOPMAP(0x00, 0x00), /* 0x7a: */ 4356 ISPOPMAP(0x00, 0x00), /* 0x7b: */ 4357 ISPOPMAP(0x4f, 0x03), /* 0x7c: Get ID List */ 4358 ISPOPMAP(0xcf, 0x01), /* 0x7d: SEND LFA */ 4359 ISPOPMAP(0x07, 0x01) /* 0x7e: Lun RESET */ 4360}; 4361 4362#ifndef ISP_STRIPPED 4363static char *fc_mbcmd_names[] = { 4364 "NO-OP", 4365 "LOAD RAM", 4366 "EXEC FIRMWARE", 4367 "DUMP RAM", 4368 "WRITE RAM WORD", 4369 "READ RAM WORD", 4370 "MAILBOX REG TEST", 4371 "VERIFY CHECKSUM", 4372 "ABOUT FIRMWARE", 4373 "LOAD RAM", 4374 "DUMP RAM", 4375 NULL, 4376 NULL, 4377 NULL, 4378 "CHECK FIRMWARE", 4379 NULL, 4380 "INIT REQUEST QUEUE", 4381 "INIT RESULT QUEUE", 4382 "EXECUTE IOCB", 4383 "WAKE UP", 4384 "STOP FIRMWARE", 4385 "ABORT", 4386 "ABORT DEVICE", 4387 "ABORT TARGET", 4388 "BUS RESET", 4389 "STOP QUEUE", 4390 "START QUEUE", 4391 "SINGLE STEP QUEUE", 4392 "ABORT QUEUE", 4393 "GET DEV QUEUE STATUS", 4394 NULL, 4395 "GET FIRMWARE STATUS", 4396 "GET LOOP ID", 4397 NULL, 4398 "GET RETRY COUNT", 4399 NULL, 4400 NULL, 4401 NULL, 4402 NULL, 4403 NULL, 4404 "GET FIRMWARE OPTIONS", 4405 "GET PORT QUEUE PARAMS", 4406 NULL, 4407 NULL, 4408 NULL, 4409 NULL, 4410 NULL, 4411 NULL, 4412 NULL, 4413 NULL, 4414 "SET RETRY COUNT", 4415 NULL, 4416 NULL, 4417 NULL, 4418 NULL, 4419 NULL, 4420 "SET FIRMWARE OPTIONS", 4421 "SET PORT QUEUE PARAMS", 4422 NULL, 4423 NULL, 4424 NULL, 4425 NULL, 4426 NULL, 4427 NULL, 4428 "LOOP PORT BYPASS", 4429 "LOOP PORT ENABLE", 4430 "GET RESOURCE COUNTS", 4431 "REQUEST NON PARTICIPATING MODE", 4432 NULL, 4433 NULL, 4434 NULL, 4435 "GET PORT DATABASE,, ENHANCED", 4436 NULL, 4437 NULL, 4438 NULL, 4439 NULL, 4440 NULL, 4441 NULL, 4442 NULL, 4443 NULL, 4444 NULL, 4445 NULL, 4446 NULL, 4447 NULL, 4448 "EXECUTE IOCB A64", 4449 NULL, 4450 NULL, 4451 NULL, 4452 NULL, 4453 NULL, 4454 NULL, 4455 NULL, 4456 NULL, 4457 "GET/SET DATA RATE", 4458 NULL, 4459 NULL, 4460 "INIT FIRMWARE", 4461 NULL, 4462 "INIT LIP", 4463 "GET FC-AL POSITION MAP", 4464 "GET PORT DATABASE", 4465 "CLEAR ACA", 4466 "TARGET RESET", 4467 "CLEAR TASK SET", 4468 "ABORT TASK SET", 4469 "GET FW STATE", 4470 "GET PORT NAME", 4471 "GET LINK STATUS", 4472 "INIT LIP RESET", 4473 NULL, 4474 "SEND SNS", 4475 "FABRIC LOGIN", 4476 "SEND CHANGE REQUEST", 4477 "FABRIC LOGOUT", 4478 "INIT LIP LOGIN", 4479 NULL, 4480 "LOGIN LOOP PORT", 4481 "GET PORT/NODE NAME LIST", 4482 "SET VENDOR ID", 4483 "INITIALIZE IP MAILBOX", 4484 NULL, 4485 NULL, 4486 NULL, 4487 NULL, 4488 "Get ID List", 4489 "SEND LFA", 4490 "Lun RESET" 4491}; 4492#endif 4493 4494static void 4495isp_mboxcmd(struct ispsoftc *isp, mbreg_t *mbp, int logmask) 4496{ 4497 char *cname, *xname, tname[16], mname[16]; 4498 unsigned int lim, ibits, obits, box, opcode; 4499 u_int16_t *mcp; 4500 4501 if (IS_FC(isp)) { 4502 mcp = mbpfc; 4503 lim = (sizeof (mbpfc) / sizeof (mbpfc[0])); 4504 } else { 4505 mcp = mbpscsi; 4506 lim = (sizeof (mbpscsi) / sizeof (mbpscsi[0])); 4507 } 4508 4509 if ((opcode = mbp->param[0]) >= lim) { 4510 mbp->param[0] = MBOX_INVALID_COMMAND; 4511 isp_prt(isp, ISP_LOGERR, "Unknown Command 0x%x", opcode); 4512 return; 4513 } 4514 4515 ibits = HIBYT(mcp[opcode]) & NMBOX_BMASK(isp); 4516 obits = LOBYT(mcp[opcode]) & NMBOX_BMASK(isp); 4517 4518 if (ibits == 0 && obits == 0) { 4519 mbp->param[0] = MBOX_COMMAND_PARAM_ERROR; 4520 isp_prt(isp, ISP_LOGERR, "no parameters for 0x%x", opcode); 4521 return; 4522 } 4523 4524 /* 4525 * Get exclusive usage of mailbox registers. 4526 */ 4527 MBOX_ACQUIRE(isp); 4528 4529 for (box = 0; box < MAX_MAILBOX; box++) { 4530 if (ibits & (1 << box)) { 4531 ISP_WRITE(isp, MBOX_OFF(box), mbp->param[box]); 4532 } 4533 isp->isp_mboxtmp[box] = mbp->param[box] = 0; 4534 } 4535 4536 isp->isp_lastmbxcmd = opcode; 4537 4538 /* 4539 * We assume that we can't overwrite a previous command. 4540 */ 4541 isp->isp_mboxbsy = obits; 4542 4543 /* 4544 * Set Host Interrupt condition so that RISC will pick up mailbox regs. 4545 */ 4546 ISP_WRITE(isp, HCCR, HCCR_CMD_SET_HOST_INT); 4547 4548 /* 4549 * While we haven't finished the command, spin our wheels here. 4550 */ 4551 MBOX_WAIT_COMPLETE(isp); 4552 4553 /* 4554 * Copy back output registers. 4555 */ 4556 for (box = 0; box < MAX_MAILBOX; box++) { 4557 if (obits & (1 << box)) { 4558 mbp->param[box] = isp->isp_mboxtmp[box]; 4559 } 4560 } 4561 4562 MBOX_RELEASE(isp); 4563 4564 if (logmask == 0 || opcode == MBOX_EXEC_FIRMWARE) { 4565 return; 4566 } 4567#ifdef ISP_STRIPPED 4568 cname = NULL; 4569#else 4570 cname = (IS_FC(isp))? fc_mbcmd_names[opcode] : scsi_mbcmd_names[opcode]; 4571#endif 4572 if (cname == NULL) { 4573 cname = tname; 4574 SNPRINTF(tname, sizeof tname, "opcode %x", opcode); 4575 } 4576 4577 /* 4578 * Just to be chatty here... 4579 */ 4580 xname = NULL; 4581 switch (mbp->param[0]) { 4582 case MBOX_COMMAND_COMPLETE: 4583 break; 4584 case MBOX_INVALID_COMMAND: 4585 if (logmask & MBLOGMASK(MBOX_COMMAND_COMPLETE)) 4586 xname = "INVALID COMMAND"; 4587 break; 4588 case MBOX_HOST_INTERFACE_ERROR: 4589 if (logmask & MBLOGMASK(MBOX_HOST_INTERFACE_ERROR)) 4590 xname = "HOST INTERFACE ERROR"; 4591 break; 4592 case MBOX_TEST_FAILED: 4593 if (logmask & MBLOGMASK(MBOX_TEST_FAILED)) 4594 xname = "TEST FAILED"; 4595 break; 4596 case MBOX_COMMAND_ERROR: 4597 if (logmask & MBLOGMASK(MBOX_COMMAND_ERROR)) 4598 xname = "COMMAND ERROR"; 4599 break; 4600 case MBOX_COMMAND_PARAM_ERROR: 4601 if (logmask & MBLOGMASK(MBOX_COMMAND_PARAM_ERROR)) 4602 xname = "COMMAND PARAMETER ERROR"; 4603 break; 4604 case MBOX_LOOP_ID_USED: 4605 if (logmask & MBLOGMASK(MBOX_LOOP_ID_USED)) 4606 xname = "LOOP ID ALREADY IN USE"; 4607 break; 4608 case MBOX_PORT_ID_USED: 4609 if (logmask & MBLOGMASK(MBOX_PORT_ID_USED)) 4610 xname = "PORT ID ALREADY IN USE"; 4611 break; 4612 case MBOX_ALL_IDS_USED: 4613 if (logmask & MBLOGMASK(MBOX_ALL_IDS_USED)) 4614 xname = "ALL LOOP IDS IN USE"; 4615 break; 4616 case 0: /* special case */ 4617 xname = "TIMEOUT"; 4618 break; 4619 default: 4620 SNPRINTF(mname, sizeof mname, "error 0x%x", mbp->param[0]); 4621 xname = mname; 4622 break; 4623 } 4624 if (xname) 4625 isp_prt(isp, ISP_LOGALL, "Mailbox Command '%s' failed (%s)", 4626 cname, xname); 4627} 4628 4629static void 4630isp_fw_state(struct ispsoftc *isp) 4631{ 4632 if (IS_FC(isp)) { 4633 mbreg_t mbs; 4634 fcparam *fcp = isp->isp_param; 4635 4636 mbs.param[0] = MBOX_GET_FW_STATE; 4637 isp_mboxcmd(isp, &mbs, MBLOGALL); 4638 if (mbs.param[0] == MBOX_COMMAND_COMPLETE) { 4639 fcp->isp_fwstate = mbs.param[1]; 4640 } 4641 } 4642} 4643 4644static void 4645isp_update(struct ispsoftc *isp) 4646{ 4647 int bus, upmask; 4648 4649 for (bus = 0, upmask = isp->isp_update; upmask != 0; bus++) { 4650 if (upmask & (1 << bus)) { 4651 isp_update_bus(isp, bus); 4652 } 4653 upmask &= ~(1 << bus); 4654 } 4655} 4656 4657static void 4658isp_update_bus(struct ispsoftc *isp, int bus) 4659{ 4660 int tgt; 4661 mbreg_t mbs; 4662 sdparam *sdp; 4663 4664 isp->isp_update &= ~(1 << bus); 4665 if (IS_FC(isp)) { 4666 /* 4667 * There are no 'per-bus' settings for Fibre Channel. 4668 */ 4669 return; 4670 } 4671 sdp = isp->isp_param; 4672 sdp += bus; 4673 4674 for (tgt = 0; tgt < MAX_TARGETS; tgt++) { 4675 u_int16_t flags, period, offset; 4676 int get; 4677 4678 if (sdp->isp_devparam[tgt].dev_enable == 0) { 4679 sdp->isp_devparam[tgt].dev_update = 0; 4680 sdp->isp_devparam[tgt].dev_refresh = 0; 4681 isp_prt(isp, ISP_LOGDEBUG0, 4682 "skipping target %d bus %d update", tgt, bus); 4683 continue; 4684 } 4685 /* 4686 * If the goal is to update the status of the device, 4687 * take what's in goal_flags and try and set the device 4688 * toward that. Otherwise, if we're just refreshing the 4689 * current device state, get the current parameters. 4690 */ 4691 4692 /* 4693 * Refresh overrides set 4694 */ 4695 if (sdp->isp_devparam[tgt].dev_refresh) { 4696 mbs.param[0] = MBOX_GET_TARGET_PARAMS; 4697 sdp->isp_devparam[tgt].dev_refresh = 0; 4698 get = 1; 4699 } else if (sdp->isp_devparam[tgt].dev_update) { 4700 mbs.param[0] = MBOX_SET_TARGET_PARAMS; 4701 /* 4702 * Make sure goal_flags has "Renegotiate on Error" 4703 * on and "Freeze Queue on Error" off. 4704 */ 4705 sdp->isp_devparam[tgt].goal_flags |= DPARM_RENEG; 4706 sdp->isp_devparam[tgt].goal_flags &= ~DPARM_QFRZ; 4707 4708 mbs.param[2] = sdp->isp_devparam[tgt].goal_flags; 4709 4710 /* 4711 * Insist that PARITY must be enabled 4712 * if SYNC or WIDE is enabled. 4713 */ 4714 if ((mbs.param[2] & (DPARM_SYNC|DPARM_WIDE)) != 0) { 4715 mbs.param[2] |= DPARM_PARITY; 4716 } 4717 4718 if ((mbs.param[2] & DPARM_SYNC) == 0) { 4719 mbs.param[3] = 0; 4720 } else { 4721 mbs.param[3] = 4722 (sdp->isp_devparam[tgt].goal_offset << 8) | 4723 (sdp->isp_devparam[tgt].goal_period); 4724 } 4725 /* 4726 * A command completion later that has 4727 * RQSTF_NEGOTIATION set can cause 4728 * the dev_refresh/announce cycle also. 4729 * 4730 * Note: It is really important to update our current 4731 * flags with at least the state of TAG capabilities- 4732 * otherwise we might try and send a tagged command 4733 * when we have it all turned off. So change it here 4734 * to say that current already matches goal. 4735 */ 4736 sdp->isp_devparam[tgt].actv_flags &= ~DPARM_TQING; 4737 sdp->isp_devparam[tgt].actv_flags |= 4738 (sdp->isp_devparam[tgt].goal_flags & DPARM_TQING); 4739 isp_prt(isp, ISP_LOGDEBUG0, 4740 "bus %d set tgt %d flags 0x%x off 0x%x period 0x%x", 4741 bus, tgt, mbs.param[2], mbs.param[3] >> 8, 4742 mbs.param[3] & 0xff); 4743 sdp->isp_devparam[tgt].dev_update = 0; 4744 sdp->isp_devparam[tgt].dev_refresh = 1; 4745 get = 0; 4746 } else { 4747 continue; 4748 } 4749 mbs.param[1] = (bus << 15) | (tgt << 8); 4750 isp_mboxcmd(isp, &mbs, MBLOGALL); 4751 if (get == 0) { 4752 isp->isp_sendmarker |= (1 << bus); 4753 continue; 4754 } 4755 flags = mbs.param[2]; 4756 period = mbs.param[3] & 0xff; 4757 offset = mbs.param[3] >> 8; 4758 sdp->isp_devparam[tgt].actv_flags = flags; 4759 sdp->isp_devparam[tgt].actv_period = period; 4760 sdp->isp_devparam[tgt].actv_offset = offset; 4761 get = (bus << 16) | tgt; 4762 (void) isp_async(isp, ISPASYNC_NEW_TGT_PARAMS, &get); 4763 } 4764 4765 for (tgt = 0; tgt < MAX_TARGETS; tgt++) { 4766 if (sdp->isp_devparam[tgt].dev_update || 4767 sdp->isp_devparam[tgt].dev_refresh) { 4768 isp->isp_update |= (1 << bus); 4769 break; 4770 } 4771 } 4772} 4773 4774static void 4775isp_setdfltparm(struct ispsoftc *isp, int channel) 4776{ 4777 int tgt; 4778 mbreg_t mbs; 4779 sdparam *sdp; 4780 4781 if (IS_FC(isp)) { 4782 fcparam *fcp = (fcparam *) isp->isp_param; 4783 int nvfail; 4784 4785 fcp += channel; 4786 if (fcp->isp_gotdparms) { 4787 return; 4788 } 4789 fcp->isp_gotdparms = 1; 4790 fcp->isp_maxfrmlen = ICB_DFLT_FRMLEN; 4791 fcp->isp_maxalloc = ICB_DFLT_ALLOC; 4792 fcp->isp_execthrottle = ISP_EXEC_THROTTLE; 4793 fcp->isp_retry_delay = ICB_DFLT_RDELAY; 4794 fcp->isp_retry_count = ICB_DFLT_RCOUNT; 4795 /* Platform specific.... */ 4796 fcp->isp_loopid = DEFAULT_LOOPID(isp); 4797 fcp->isp_nodewwn = DEFAULT_NODEWWN(isp); 4798 fcp->isp_portwwn = DEFAULT_PORTWWN(isp); 4799 fcp->isp_fwoptions = 0; 4800 fcp->isp_fwoptions |= ICBOPT_FAIRNESS; 4801 fcp->isp_fwoptions |= ICBOPT_PDBCHANGE_AE; 4802 fcp->isp_fwoptions |= ICBOPT_HARD_ADDRESS; 4803#ifndef ISP_NO_FASTPOST_FC 4804 fcp->isp_fwoptions |= ICBOPT_FAST_POST; 4805#endif 4806 if (isp->isp_confopts & ISP_CFG_FULL_DUPLEX) 4807 fcp->isp_fwoptions |= ICBOPT_FULL_DUPLEX; 4808 4809 /* 4810 * Make sure this is turned off now until we get 4811 * extended options from NVRAM 4812 */ 4813 fcp->isp_fwoptions &= ~ICBOPT_EXTENDED; 4814 4815 /* 4816 * Now try and read NVRAM unless told to not do so. 4817 * This will set fcparam's isp_nodewwn && isp_portwwn. 4818 */ 4819 if ((isp->isp_confopts & ISP_CFG_NONVRAM) == 0) { 4820 nvfail = isp_read_nvram(isp); 4821 if (nvfail) 4822 isp->isp_confopts |= ISP_CFG_NONVRAM; 4823 } else { 4824 nvfail = 1; 4825 } 4826 /* 4827 * Set node && port to override platform set defaults 4828 * unless the nvram read failed (or none was done), 4829 * or the platform code wants to use what had been 4830 * set in the defaults. 4831 */ 4832 if (nvfail || (isp->isp_confopts & ISP_CFG_OWNWWN)) { 4833 isp_prt(isp, ISP_LOGCONFIG, 4834 "Using Node WWN 0x%08x%08x, Port WWN 0x%08x%08x", 4835 (u_int32_t) (DEFAULT_NODEWWN(isp) >> 32), 4836 (u_int32_t) (DEFAULT_NODEWWN(isp) & 0xffffffff), 4837 (u_int32_t) (DEFAULT_PORTWWN(isp) >> 32), 4838 (u_int32_t) (DEFAULT_PORTWWN(isp) & 0xffffffff)); 4839 isp->isp_confopts |= ISP_CFG_OWNWWN; 4840 ISP_NODEWWN(isp) = DEFAULT_NODEWWN(isp); 4841 ISP_PORTWWN(isp) = DEFAULT_PORTWWN(isp); 4842 } else { 4843 /* 4844 * We always start out with values derived 4845 * from NVRAM or our platform default. 4846 */ 4847 ISP_NODEWWN(isp) = fcp->isp_nodewwn; 4848 ISP_PORTWWN(isp) = fcp->isp_portwwn; 4849 } 4850 return; 4851 } 4852 4853 sdp = (sdparam *) isp->isp_param; 4854 sdp += channel; 4855 4856 /* 4857 * Been there, done that, got the T-shirt... 4858 */ 4859 if (sdp->isp_gotdparms) { 4860 return; 4861 } 4862 sdp->isp_gotdparms = 1; 4863 4864 /* 4865 * Establish some default parameters. 4866 */ 4867 sdp->isp_cmd_dma_burst_enable = 0; 4868 sdp->isp_data_dma_burst_enabl = 1; 4869 sdp->isp_fifo_threshold = 0; 4870 sdp->isp_initiator_id = DEFAULT_IID(isp); 4871 if (isp->isp_type >= ISP_HA_SCSI_1040) { 4872 sdp->isp_async_data_setup = 9; 4873 } else { 4874 sdp->isp_async_data_setup = 6; 4875 } 4876 sdp->isp_selection_timeout = 250; 4877 sdp->isp_max_queue_depth = MAXISPREQUEST(isp); 4878 sdp->isp_tag_aging = 8; 4879 sdp->isp_bus_reset_delay = 5; 4880 /* 4881 * Don't retry selection, busy or queue full automatically- reflect 4882 * these back to us. 4883 */ 4884 sdp->isp_retry_count = 0; 4885 sdp->isp_retry_delay = 0; 4886 4887 for (tgt = 0; tgt < MAX_TARGETS; tgt++) { 4888 sdp->isp_devparam[tgt].exc_throttle = ISP_EXEC_THROTTLE; 4889 sdp->isp_devparam[tgt].dev_enable = 1; 4890 } 4891 4892 /* 4893 * If we've not been told to avoid reading NVRAM, try and read it. 4894 * If we're successful reading it, we can then return because NVRAM 4895 * will tell us what the desired settings are. Otherwise, we establish 4896 * some reasonable 'fake' nvram and goal defaults. 4897 */ 4898 4899 if ((isp->isp_confopts & ISP_CFG_NONVRAM) == 0) { 4900 if (isp_read_nvram(isp) == 0) { 4901 return; 4902 } 4903 } 4904 4905 /* 4906 * Now try and see whether we have specific values for them. 4907 */ 4908 if ((isp->isp_confopts & ISP_CFG_NONVRAM) == 0) { 4909 mbs.param[0] = MBOX_GET_ACT_NEG_STATE; 4910 isp_mboxcmd(isp, &mbs, MBLOGNONE); 4911 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 4912 sdp->isp_req_ack_active_neg = 1; 4913 sdp->isp_data_line_active_neg = 1; 4914 } else { 4915 sdp->isp_req_ack_active_neg = 4916 (mbs.param[1+channel] >> 4) & 0x1; 4917 sdp->isp_data_line_active_neg = 4918 (mbs.param[1+channel] >> 5) & 0x1; 4919 } 4920 } 4921 4922 isp_prt(isp, ISP_LOGDEBUG0, sc0, sc3, 4923 0, sdp->isp_fifo_threshold, sdp->isp_initiator_id, 4924 sdp->isp_bus_reset_delay, sdp->isp_retry_count, 4925 sdp->isp_retry_delay, sdp->isp_async_data_setup); 4926 isp_prt(isp, ISP_LOGDEBUG0, sc1, sc3, 4927 sdp->isp_req_ack_active_neg, sdp->isp_data_line_active_neg, 4928 sdp->isp_data_dma_burst_enabl, sdp->isp_cmd_dma_burst_enable, 4929 sdp->isp_selection_timeout, sdp->isp_max_queue_depth); 4930 4931 /* 4932 * The trick here is to establish a default for the default (honk!) 4933 * state (goal_flags). Then try and get the current status from 4934 * the card to fill in the current state. We don't, in fact, set 4935 * the default to the SAFE default state- that's not the goal state. 4936 */ 4937 for (tgt = 0; tgt < MAX_TARGETS; tgt++) { 4938 u_int8_t off, per; 4939 sdp->isp_devparam[tgt].actv_offset = 0; 4940 sdp->isp_devparam[tgt].actv_period = 0; 4941 sdp->isp_devparam[tgt].actv_flags = 0; 4942 4943 sdp->isp_devparam[tgt].goal_flags = 4944 sdp->isp_devparam[tgt].nvrm_flags = DPARM_DEFAULT; 4945 4946 /* 4947 * We default to Wide/Fast for versions less than a 1040 4948 * (unless it's SBus). 4949 */ 4950 if (IS_ULTRA3(isp)) { 4951 off = ISP_80M_SYNCPARMS >> 8; 4952 per = ISP_80M_SYNCPARMS & 0xff; 4953 } else if (IS_ULTRA2(isp)) { 4954 off = ISP_40M_SYNCPARMS >> 8; 4955 per = ISP_40M_SYNCPARMS & 0xff; 4956 } else if (IS_1240(isp)) { 4957 off = ISP_20M_SYNCPARMS >> 8; 4958 per = ISP_20M_SYNCPARMS & 0xff; 4959 } else if ((isp->isp_bustype == ISP_BT_SBUS && 4960 isp->isp_type < ISP_HA_SCSI_1020A) || 4961 (isp->isp_bustype == ISP_BT_PCI && 4962 isp->isp_type < ISP_HA_SCSI_1040) || 4963 (isp->isp_clock && isp->isp_clock < 60) || 4964 (sdp->isp_ultramode == 0)) { 4965 off = ISP_10M_SYNCPARMS >> 8; 4966 per = ISP_10M_SYNCPARMS & 0xff; 4967 } else { 4968 off = ISP_20M_SYNCPARMS_1040 >> 8; 4969 per = ISP_20M_SYNCPARMS_1040 & 0xff; 4970 } 4971 sdp->isp_devparam[tgt].goal_offset = 4972 sdp->isp_devparam[tgt].nvrm_offset = off; 4973 sdp->isp_devparam[tgt].goal_period = 4974 sdp->isp_devparam[tgt].nvrm_period = per; 4975 4976 isp_prt(isp, ISP_LOGDEBUG0, sc2, sc3, 4977 channel, tgt, sdp->isp_devparam[tgt].nvrm_flags, 4978 sdp->isp_devparam[tgt].nvrm_offset, 4979 sdp->isp_devparam[tgt].nvrm_period); 4980 } 4981} 4982 4983/* 4984 * Re-initialize the ISP and complete all orphaned commands 4985 * with a 'botched' notice. The reset/init routines should 4986 * not disturb an already active list of commands. 4987 * 4988 * Locks held prior to coming here. 4989 */ 4990 4991void 4992isp_reinit(struct ispsoftc *isp) 4993{ 4994 XS_T *xs; 4995 u_int16_t handle; 4996 4997 isp_reset(isp); 4998 if (isp->isp_state != ISP_RESETSTATE) { 4999 isp_prt(isp, ISP_LOGERR, "isp_reinit cannot reset card"); 5000 goto skip; 5001 } 5002 isp_init(isp); 5003 if (isp->isp_role == ISP_ROLE_NONE) { 5004 goto skip; 5005 } 5006 if (isp->isp_state == ISP_INITSTATE) { 5007 isp->isp_state = ISP_RUNSTATE; 5008 } 5009 if (isp->isp_state != ISP_RUNSTATE) { 5010 isp_prt(isp, ISP_LOGERR, "isp_reinit cannot restart card"); 5011 } 5012skip: 5013 isp->isp_nactive = 0; 5014 5015 for (handle = 1; (int) handle <= isp->isp_maxcmds; handle++) { 5016 xs = isp_find_xs(isp, handle); 5017 if (xs == NULL) { 5018 continue; 5019 } 5020 isp_destroy_handle(isp, handle); 5021 if (XS_XFRLEN(xs)) { 5022 ISP_DMAFREE(isp, xs, handle); 5023 XS_RESID(xs) = XS_XFRLEN(xs); 5024 } else { 5025 XS_RESID(xs) = 0; 5026 } 5027 XS_SETERR(xs, HBA_BUSRESET); 5028 isp_done(xs); 5029 } 5030} 5031 5032/* 5033 * NVRAM Routines 5034 */ 5035static int 5036isp_read_nvram(struct ispsoftc *isp) 5037{ 5038 int i, amt; 5039 u_int8_t csum, minversion; 5040 union { 5041 u_int8_t _x[ISP2100_NVRAM_SIZE]; 5042 u_int16_t _s[ISP2100_NVRAM_SIZE>>1]; 5043 } _n; 5044#define nvram_data _n._x 5045#define nvram_words _n._s 5046 5047 if (IS_FC(isp)) { 5048 amt = ISP2100_NVRAM_SIZE; 5049 minversion = 1; 5050 } else if (IS_ULTRA2(isp)) { 5051 amt = ISP1080_NVRAM_SIZE; 5052 minversion = 0; 5053 } else { 5054 amt = ISP_NVRAM_SIZE; 5055 minversion = 2; 5056 } 5057 5058 /* 5059 * Just read the first two words first to see if we have a valid 5060 * NVRAM to continue reading the rest with. 5061 */ 5062 for (i = 0; i < 2; i++) { 5063 isp_rdnvram_word(isp, i, &nvram_words[i]); 5064 } 5065 if (nvram_data[0] != 'I' || nvram_data[1] != 'S' || 5066 nvram_data[2] != 'P') { 5067 if (isp->isp_bustype != ISP_BT_SBUS) { 5068 isp_prt(isp, ISP_LOGWARN, "invalid NVRAM header"); 5069 isp_prt(isp, ISP_LOGDEBUG0, "%x %x %x", 5070 nvram_data[0], nvram_data[1], nvram_data[2]); 5071 } 5072 return (-1); 5073 } 5074 for (i = 2; i < amt>>1; i++) { 5075 isp_rdnvram_word(isp, i, &nvram_words[i]); 5076 } 5077 for (csum = 0, i = 0; i < amt; i++) { 5078 csum += nvram_data[i]; 5079 } 5080 if (csum != 0) { 5081 isp_prt(isp, ISP_LOGWARN, "invalid NVRAM checksum"); 5082 return (-1); 5083 } 5084 if (ISP_NVRAM_VERSION(nvram_data) < minversion) { 5085 isp_prt(isp, ISP_LOGWARN, "version %d NVRAM not understood", 5086 ISP_NVRAM_VERSION(nvram_data)); 5087 return (-1); 5088 } 5089 5090 if (IS_ULTRA3(isp)) { 5091 isp_parse_nvram_12160(isp, 0, nvram_data); 5092 isp_parse_nvram_12160(isp, 1, nvram_data); 5093 } else if (IS_1080(isp)) { 5094 isp_parse_nvram_1080(isp, 0, nvram_data); 5095 } else if (IS_1280(isp) || IS_1240(isp)) { 5096 isp_parse_nvram_1080(isp, 0, nvram_data); 5097 isp_parse_nvram_1080(isp, 1, nvram_data); 5098 } else if (IS_SCSI(isp)) { 5099 isp_parse_nvram_1020(isp, nvram_data); 5100 } else { 5101 isp_parse_nvram_2100(isp, nvram_data); 5102 } 5103 return (0); 5104#undef nvram_data 5105#undef nvram_words 5106} 5107 5108static void 5109isp_rdnvram_word(struct ispsoftc *isp, int wo, u_int16_t *rp) 5110{ 5111 int i, cbits; 5112 u_int16_t bit, rqst; 5113 5114 ISP_WRITE(isp, BIU_NVRAM, BIU_NVRAM_SELECT); 5115 USEC_DELAY(2); 5116 ISP_WRITE(isp, BIU_NVRAM, BIU_NVRAM_SELECT|BIU_NVRAM_CLOCK); 5117 USEC_DELAY(2); 5118 5119 if (IS_FC(isp)) { 5120 wo &= ((ISP2100_NVRAM_SIZE >> 1) - 1); 5121 rqst = (ISP_NVRAM_READ << 8) | wo; 5122 cbits = 10; 5123 } else if (IS_ULTRA2(isp)) { 5124 wo &= ((ISP1080_NVRAM_SIZE >> 1) - 1); 5125 rqst = (ISP_NVRAM_READ << 8) | wo; 5126 cbits = 10; 5127 } else { 5128 wo &= ((ISP_NVRAM_SIZE >> 1) - 1); 5129 rqst = (ISP_NVRAM_READ << 6) | wo; 5130 cbits = 8; 5131 } 5132 5133 /* 5134 * Clock the word select request out... 5135 */ 5136 for (i = cbits; i >= 0; i--) { 5137 if ((rqst >> i) & 1) { 5138 bit = BIU_NVRAM_SELECT | BIU_NVRAM_DATAOUT; 5139 } else { 5140 bit = BIU_NVRAM_SELECT; 5141 } 5142 ISP_WRITE(isp, BIU_NVRAM, bit); 5143 USEC_DELAY(2); 5144 ISP_WRITE(isp, BIU_NVRAM, bit | BIU_NVRAM_CLOCK); 5145 USEC_DELAY(2); 5146 ISP_WRITE(isp, BIU_NVRAM, bit); 5147 USEC_DELAY(2); 5148 } 5149 /* 5150 * Now read the result back in (bits come back in MSB format). 5151 */ 5152 *rp = 0; 5153 for (i = 0; i < 16; i++) { 5154 u_int16_t rv; 5155 *rp <<= 1; 5156 ISP_WRITE(isp, BIU_NVRAM, BIU_NVRAM_SELECT|BIU_NVRAM_CLOCK); 5157 USEC_DELAY(2); 5158 rv = ISP_READ(isp, BIU_NVRAM); 5159 if (rv & BIU_NVRAM_DATAIN) { 5160 *rp |= 1; 5161 } 5162 USEC_DELAY(2); 5163 ISP_WRITE(isp, BIU_NVRAM, BIU_NVRAM_SELECT); 5164 USEC_DELAY(2); 5165 } 5166 ISP_WRITE(isp, BIU_NVRAM, 0); 5167 USEC_DELAY(2); 5168 ISP_SWIZZLE_NVRAM_WORD(isp, rp); 5169} 5170 5171static void 5172isp_parse_nvram_1020(struct ispsoftc *isp, u_int8_t *nvram_data) 5173{ 5174 sdparam *sdp = (sdparam *) isp->isp_param; 5175 int tgt; 5176 5177 sdp->isp_fifo_threshold = 5178 ISP_NVRAM_FIFO_THRESHOLD(nvram_data) | 5179 (ISP_NVRAM_FIFO_THRESHOLD_128(nvram_data) << 2); 5180 5181 sdp->isp_initiator_id = 5182 ISP_NVRAM_INITIATOR_ID(nvram_data); 5183 5184 sdp->isp_bus_reset_delay = 5185 ISP_NVRAM_BUS_RESET_DELAY(nvram_data); 5186 5187 sdp->isp_retry_count = 5188 ISP_NVRAM_BUS_RETRY_COUNT(nvram_data); 5189 5190 sdp->isp_retry_delay = 5191 ISP_NVRAM_BUS_RETRY_DELAY(nvram_data); 5192 5193 sdp->isp_async_data_setup = 5194 ISP_NVRAM_ASYNC_DATA_SETUP_TIME(nvram_data); 5195 5196 if (isp->isp_type >= ISP_HA_SCSI_1040) { 5197 if (sdp->isp_async_data_setup < 9) { 5198 sdp->isp_async_data_setup = 9; 5199 } 5200 } else { 5201 if (sdp->isp_async_data_setup != 6) { 5202 sdp->isp_async_data_setup = 6; 5203 } 5204 } 5205 5206 sdp->isp_req_ack_active_neg = 5207 ISP_NVRAM_REQ_ACK_ACTIVE_NEGATION(nvram_data); 5208 5209 sdp->isp_data_line_active_neg = 5210 ISP_NVRAM_DATA_LINE_ACTIVE_NEGATION(nvram_data); 5211 5212 sdp->isp_data_dma_burst_enabl = 5213 ISP_NVRAM_DATA_DMA_BURST_ENABLE(nvram_data); 5214 5215 sdp->isp_cmd_dma_burst_enable = 5216 ISP_NVRAM_CMD_DMA_BURST_ENABLE(nvram_data); 5217 5218 sdp->isp_tag_aging = 5219 ISP_NVRAM_TAG_AGE_LIMIT(nvram_data); 5220 5221 sdp->isp_selection_timeout = 5222 ISP_NVRAM_SELECTION_TIMEOUT(nvram_data); 5223 5224 sdp->isp_max_queue_depth = 5225 ISP_NVRAM_MAX_QUEUE_DEPTH(nvram_data); 5226 5227 sdp->isp_fast_mttr = ISP_NVRAM_FAST_MTTR_ENABLE(nvram_data); 5228 5229 isp_prt(isp, ISP_LOGDEBUG0, sc0, sc4, 5230 0, sdp->isp_fifo_threshold, sdp->isp_initiator_id, 5231 sdp->isp_bus_reset_delay, sdp->isp_retry_count, 5232 sdp->isp_retry_delay, sdp->isp_async_data_setup); 5233 isp_prt(isp, ISP_LOGDEBUG0, sc1, sc4, 5234 sdp->isp_req_ack_active_neg, sdp->isp_data_line_active_neg, 5235 sdp->isp_data_dma_burst_enabl, sdp->isp_cmd_dma_burst_enable, 5236 sdp->isp_selection_timeout, sdp->isp_max_queue_depth); 5237 5238 for (tgt = 0; tgt < MAX_TARGETS; tgt++) { 5239 sdp->isp_devparam[tgt].dev_enable = 5240 ISP_NVRAM_TGT_DEVICE_ENABLE(nvram_data, tgt); 5241 sdp->isp_devparam[tgt].exc_throttle = 5242 ISP_NVRAM_TGT_EXEC_THROTTLE(nvram_data, tgt); 5243 sdp->isp_devparam[tgt].nvrm_offset = 5244 ISP_NVRAM_TGT_SYNC_OFFSET(nvram_data, tgt); 5245 sdp->isp_devparam[tgt].nvrm_period = 5246 ISP_NVRAM_TGT_SYNC_PERIOD(nvram_data, tgt); 5247 /* 5248 * We probably shouldn't lie about this, but it 5249 * it makes it much safer if we limit NVRAM values 5250 * to sanity. 5251 */ 5252 if (isp->isp_type < ISP_HA_SCSI_1040) { 5253 /* 5254 * If we're not ultra, we can't possibly 5255 * be a shorter period than this. 5256 */ 5257 if (sdp->isp_devparam[tgt].nvrm_period < 0x19) { 5258 sdp->isp_devparam[tgt].nvrm_period = 0x19; 5259 } 5260 if (sdp->isp_devparam[tgt].nvrm_offset > 0xc) { 5261 sdp->isp_devparam[tgt].nvrm_offset = 0x0c; 5262 } 5263 } else { 5264 if (sdp->isp_devparam[tgt].nvrm_offset > 0x8) { 5265 sdp->isp_devparam[tgt].nvrm_offset = 0x8; 5266 } 5267 } 5268 sdp->isp_devparam[tgt].nvrm_flags = 0; 5269 if (ISP_NVRAM_TGT_RENEG(nvram_data, tgt)) 5270 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_RENEG; 5271 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_ARQ; 5272 if (ISP_NVRAM_TGT_TQING(nvram_data, tgt)) 5273 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_TQING; 5274 if (ISP_NVRAM_TGT_SYNC(nvram_data, tgt)) 5275 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_SYNC; 5276 if (ISP_NVRAM_TGT_WIDE(nvram_data, tgt)) 5277 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_WIDE; 5278 if (ISP_NVRAM_TGT_PARITY(nvram_data, tgt)) 5279 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_PARITY; 5280 if (ISP_NVRAM_TGT_DISC(nvram_data, tgt)) 5281 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_DISC; 5282 sdp->isp_devparam[tgt].actv_flags = 0; /* we don't know */ 5283 isp_prt(isp, ISP_LOGDEBUG0, sc2, sc4, 5284 0, tgt, sdp->isp_devparam[tgt].nvrm_flags, 5285 sdp->isp_devparam[tgt].nvrm_offset, 5286 sdp->isp_devparam[tgt].nvrm_period); 5287 sdp->isp_devparam[tgt].goal_offset = 5288 sdp->isp_devparam[tgt].nvrm_offset; 5289 sdp->isp_devparam[tgt].goal_period = 5290 sdp->isp_devparam[tgt].nvrm_period; 5291 sdp->isp_devparam[tgt].goal_flags = 5292 sdp->isp_devparam[tgt].nvrm_flags; 5293 } 5294} 5295 5296static void 5297isp_parse_nvram_1080(struct ispsoftc *isp, int bus, u_int8_t *nvram_data) 5298{ 5299 sdparam *sdp = (sdparam *) isp->isp_param; 5300 int tgt; 5301 5302 sdp += bus; 5303 5304 sdp->isp_fifo_threshold = 5305 ISP1080_NVRAM_FIFO_THRESHOLD(nvram_data); 5306 5307 sdp->isp_initiator_id = 5308 ISP1080_NVRAM_INITIATOR_ID(nvram_data, bus); 5309 5310 sdp->isp_bus_reset_delay = 5311 ISP1080_NVRAM_BUS_RESET_DELAY(nvram_data, bus); 5312 5313 sdp->isp_retry_count = 5314 ISP1080_NVRAM_BUS_RETRY_COUNT(nvram_data, bus); 5315 5316 sdp->isp_retry_delay = 5317 ISP1080_NVRAM_BUS_RETRY_DELAY(nvram_data, bus); 5318 5319 sdp->isp_async_data_setup = 5320 ISP1080_NVRAM_ASYNC_DATA_SETUP_TIME(nvram_data, bus); 5321 5322 sdp->isp_req_ack_active_neg = 5323 ISP1080_NVRAM_REQ_ACK_ACTIVE_NEGATION(nvram_data, bus); 5324 5325 sdp->isp_data_line_active_neg = 5326 ISP1080_NVRAM_DATA_LINE_ACTIVE_NEGATION(nvram_data, bus); 5327 5328 sdp->isp_data_dma_burst_enabl = 5329 ISP1080_NVRAM_BURST_ENABLE(nvram_data); 5330 5331 sdp->isp_cmd_dma_burst_enable = 5332 ISP1080_NVRAM_BURST_ENABLE(nvram_data); 5333 5334 sdp->isp_selection_timeout = 5335 ISP1080_NVRAM_SELECTION_TIMEOUT(nvram_data, bus); 5336 5337 sdp->isp_max_queue_depth = 5338 ISP1080_NVRAM_MAX_QUEUE_DEPTH(nvram_data, bus); 5339 5340 isp_prt(isp, ISP_LOGDEBUG0, sc0, sc4, 5341 bus, sdp->isp_fifo_threshold, sdp->isp_initiator_id, 5342 sdp->isp_bus_reset_delay, sdp->isp_retry_count, 5343 sdp->isp_retry_delay, sdp->isp_async_data_setup); 5344 isp_prt(isp, ISP_LOGDEBUG0, sc1, sc4, 5345 sdp->isp_req_ack_active_neg, sdp->isp_data_line_active_neg, 5346 sdp->isp_data_dma_burst_enabl, sdp->isp_cmd_dma_burst_enable, 5347 sdp->isp_selection_timeout, sdp->isp_max_queue_depth); 5348 5349 5350 for (tgt = 0; tgt < MAX_TARGETS; tgt++) { 5351 sdp->isp_devparam[tgt].dev_enable = 5352 ISP1080_NVRAM_TGT_DEVICE_ENABLE(nvram_data, tgt, bus); 5353 sdp->isp_devparam[tgt].exc_throttle = 5354 ISP1080_NVRAM_TGT_EXEC_THROTTLE(nvram_data, tgt, bus); 5355 sdp->isp_devparam[tgt].nvrm_offset = 5356 ISP1080_NVRAM_TGT_SYNC_OFFSET(nvram_data, tgt, bus); 5357 sdp->isp_devparam[tgt].nvrm_period = 5358 ISP1080_NVRAM_TGT_SYNC_PERIOD(nvram_data, tgt, bus); 5359 sdp->isp_devparam[tgt].nvrm_flags = 0; 5360 if (ISP1080_NVRAM_TGT_RENEG(nvram_data, tgt, bus)) 5361 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_RENEG; 5362 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_ARQ; 5363 if (ISP1080_NVRAM_TGT_TQING(nvram_data, tgt, bus)) 5364 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_TQING; 5365 if (ISP1080_NVRAM_TGT_SYNC(nvram_data, tgt, bus)) 5366 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_SYNC; 5367 if (ISP1080_NVRAM_TGT_WIDE(nvram_data, tgt, bus)) 5368 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_WIDE; 5369 if (ISP1080_NVRAM_TGT_PARITY(nvram_data, tgt, bus)) 5370 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_PARITY; 5371 if (ISP1080_NVRAM_TGT_DISC(nvram_data, tgt, bus)) 5372 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_DISC; 5373 sdp->isp_devparam[tgt].actv_flags = 0; 5374 isp_prt(isp, ISP_LOGDEBUG0, sc2, sc4, 5375 bus, tgt, sdp->isp_devparam[tgt].nvrm_flags, 5376 sdp->isp_devparam[tgt].nvrm_offset, 5377 sdp->isp_devparam[tgt].nvrm_period); 5378 sdp->isp_devparam[tgt].goal_offset = 5379 sdp->isp_devparam[tgt].nvrm_offset; 5380 sdp->isp_devparam[tgt].goal_period = 5381 sdp->isp_devparam[tgt].nvrm_period; 5382 sdp->isp_devparam[tgt].goal_flags = 5383 sdp->isp_devparam[tgt].nvrm_flags; 5384 } 5385} 5386 5387static void 5388isp_parse_nvram_12160(struct ispsoftc *isp, int bus, u_int8_t *nvram_data) 5389{ 5390 sdparam *sdp = (sdparam *) isp->isp_param; 5391 int tgt; 5392 5393 sdp += bus; 5394 5395 sdp->isp_fifo_threshold = 5396 ISP12160_NVRAM_FIFO_THRESHOLD(nvram_data); 5397 5398 sdp->isp_initiator_id = 5399 ISP12160_NVRAM_INITIATOR_ID(nvram_data, bus); 5400 5401 sdp->isp_bus_reset_delay = 5402 ISP12160_NVRAM_BUS_RESET_DELAY(nvram_data, bus); 5403 5404 sdp->isp_retry_count = 5405 ISP12160_NVRAM_BUS_RETRY_COUNT(nvram_data, bus); 5406 5407 sdp->isp_retry_delay = 5408 ISP12160_NVRAM_BUS_RETRY_DELAY(nvram_data, bus); 5409 5410 sdp->isp_async_data_setup = 5411 ISP12160_NVRAM_ASYNC_DATA_SETUP_TIME(nvram_data, bus); 5412 5413 sdp->isp_req_ack_active_neg = 5414 ISP12160_NVRAM_REQ_ACK_ACTIVE_NEGATION(nvram_data, bus); 5415 5416 sdp->isp_data_line_active_neg = 5417 ISP12160_NVRAM_DATA_LINE_ACTIVE_NEGATION(nvram_data, bus); 5418 5419 sdp->isp_data_dma_burst_enabl = 5420 ISP12160_NVRAM_BURST_ENABLE(nvram_data); 5421 5422 sdp->isp_cmd_dma_burst_enable = 5423 ISP12160_NVRAM_BURST_ENABLE(nvram_data); 5424 5425 sdp->isp_selection_timeout = 5426 ISP12160_NVRAM_SELECTION_TIMEOUT(nvram_data, bus); 5427 5428 sdp->isp_max_queue_depth = 5429 ISP12160_NVRAM_MAX_QUEUE_DEPTH(nvram_data, bus); 5430 5431 isp_prt(isp, ISP_LOGDEBUG0, sc0, sc4, 5432 bus, sdp->isp_fifo_threshold, sdp->isp_initiator_id, 5433 sdp->isp_bus_reset_delay, sdp->isp_retry_count, 5434 sdp->isp_retry_delay, sdp->isp_async_data_setup); 5435 isp_prt(isp, ISP_LOGDEBUG0, sc1, sc4, 5436 sdp->isp_req_ack_active_neg, sdp->isp_data_line_active_neg, 5437 sdp->isp_data_dma_burst_enabl, sdp->isp_cmd_dma_burst_enable, 5438 sdp->isp_selection_timeout, sdp->isp_max_queue_depth); 5439 5440 for (tgt = 0; tgt < MAX_TARGETS; tgt++) { 5441 sdp->isp_devparam[tgt].dev_enable = 5442 ISP12160_NVRAM_TGT_DEVICE_ENABLE(nvram_data, tgt, bus); 5443 sdp->isp_devparam[tgt].exc_throttle = 5444 ISP12160_NVRAM_TGT_EXEC_THROTTLE(nvram_data, tgt, bus); 5445 sdp->isp_devparam[tgt].nvrm_offset = 5446 ISP12160_NVRAM_TGT_SYNC_OFFSET(nvram_data, tgt, bus); 5447 sdp->isp_devparam[tgt].nvrm_period = 5448 ISP12160_NVRAM_TGT_SYNC_PERIOD(nvram_data, tgt, bus); 5449 sdp->isp_devparam[tgt].nvrm_flags = 0; 5450 if (ISP12160_NVRAM_TGT_RENEG(nvram_data, tgt, bus)) 5451 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_RENEG; 5452 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_ARQ; 5453 if (ISP12160_NVRAM_TGT_TQING(nvram_data, tgt, bus)) 5454 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_TQING; 5455 if (ISP12160_NVRAM_TGT_SYNC(nvram_data, tgt, bus)) 5456 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_SYNC; 5457 if (ISP12160_NVRAM_TGT_WIDE(nvram_data, tgt, bus)) 5458 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_WIDE; 5459 if (ISP12160_NVRAM_TGT_PARITY(nvram_data, tgt, bus)) 5460 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_PARITY; 5461 if (ISP12160_NVRAM_TGT_DISC(nvram_data, tgt, bus)) 5462 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_DISC; 5463 sdp->isp_devparam[tgt].actv_flags = 0; 5464 isp_prt(isp, ISP_LOGDEBUG0, sc2, sc4, 5465 bus, tgt, sdp->isp_devparam[tgt].nvrm_flags, 5466 sdp->isp_devparam[tgt].nvrm_offset, 5467 sdp->isp_devparam[tgt].nvrm_period); 5468 sdp->isp_devparam[tgt].goal_offset = 5469 sdp->isp_devparam[tgt].nvrm_offset; 5470 sdp->isp_devparam[tgt].goal_period = 5471 sdp->isp_devparam[tgt].nvrm_period; 5472 sdp->isp_devparam[tgt].goal_flags = 5473 sdp->isp_devparam[tgt].nvrm_flags; 5474 } 5475} 5476 5477static void 5478isp_parse_nvram_2100(struct ispsoftc *isp, u_int8_t *nvram_data) 5479{ 5480 fcparam *fcp = (fcparam *) isp->isp_param; 5481 u_int64_t wwn; 5482 5483 /* 5484 * There is NVRAM storage for both Port and Node entities- 5485 * but the Node entity appears to be unused on all the cards 5486 * I can find. However, we should account for this being set 5487 * at some point in the future. 5488 * 5489 * Qlogic WWNs have an NAA of 2, but usually nothing shows up in 5490 * bits 48..60. In the case of the 2202, it appears that they do 5491 * use bit 48 to distinguish between the two instances on the card. 5492 * The 2204, which I've never seen, *probably* extends this method. 5493 */ 5494 wwn = ISP2100_NVRAM_PORT_NAME(nvram_data); 5495 if (wwn) { 5496 isp_prt(isp, ISP_LOGCONFIG, "NVRAM Port WWN 0x%08x%08x", 5497 (u_int32_t) (wwn >> 32), (u_int32_t) (wwn & 0xffffffff)); 5498 if ((wwn >> 60) == 0) { 5499 wwn |= (((u_int64_t) 2)<< 60); 5500 } 5501 } 5502 fcp->isp_portwwn = wwn; 5503 wwn = ISP2100_NVRAM_NODE_NAME(nvram_data); 5504 if (wwn) { 5505 isp_prt(isp, ISP_LOGCONFIG, "NVRAM Node WWN 0x%08x%08x", 5506 (u_int32_t) (wwn >> 32), (u_int32_t) (wwn & 0xffffffff)); 5507 if ((wwn >> 60) == 0) { 5508 wwn |= (((u_int64_t) 2)<< 60); 5509 } 5510 } 5511 fcp->isp_nodewwn = wwn; 5512 5513 /* 5514 * Make sure we have both Node and Port as non-zero values. 5515 */ 5516 if (fcp->isp_nodewwn != 0 && fcp->isp_portwwn == 0) { 5517 fcp->isp_portwwn = fcp->isp_nodewwn; 5518 } else if (fcp->isp_nodewwn == 0 && fcp->isp_portwwn != 0) { 5519 fcp->isp_nodewwn = fcp->isp_portwwn; 5520 } 5521 5522 /* 5523 * Make the Node and Port values sane if they're NAA == 2. 5524 * This means to clear bits 48..56 for the Node WWN and 5525 * make sure that there's some non-zero value in 48..56 5526 * for the Port WWN. 5527 */ 5528 if (fcp->isp_nodewwn && fcp->isp_portwwn) { 5529 if ((fcp->isp_nodewwn & (((u_int64_t) 0xfff) << 48)) != 0 && 5530 (fcp->isp_nodewwn >> 60) == 2) { 5531 fcp->isp_nodewwn &= ~((u_int64_t) 0xfff << 48); 5532 } 5533 if ((fcp->isp_portwwn & (((u_int64_t) 0xfff) << 48)) == 0 && 5534 (fcp->isp_portwwn >> 60) == 2) { 5535 fcp->isp_portwwn |= ((u_int64_t) 1 << 56); 5536 } 5537 } 5538 5539 fcp->isp_maxalloc = 5540 ISP2100_NVRAM_MAXIOCBALLOCATION(nvram_data); 5541 fcp->isp_maxfrmlen = 5542 ISP2100_NVRAM_MAXFRAMELENGTH(nvram_data); 5543 fcp->isp_retry_delay = 5544 ISP2100_NVRAM_RETRY_DELAY(nvram_data); 5545 fcp->isp_retry_count = 5546 ISP2100_NVRAM_RETRY_COUNT(nvram_data); 5547 fcp->isp_loopid = 5548 ISP2100_NVRAM_HARDLOOPID(nvram_data); 5549 fcp->isp_execthrottle = 5550 ISP2100_NVRAM_EXECUTION_THROTTLE(nvram_data); 5551 fcp->isp_fwoptions = ISP2100_NVRAM_OPTIONS(nvram_data); 5552 isp_prt(isp, ISP_LOGDEBUG0, 5553 "NVRAM: maxfrmlen %d execthrottle %d fwoptions 0x%x", 5554 fcp->isp_maxfrmlen, fcp->isp_execthrottle, fcp->isp_fwoptions); 5555} 5556