2 * Copyright (c) 2009-2017 Alexander Motin <mav@FreeBSD.org>
3 * Copyright (c) 1997-2009 by Matthew Jacob
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
16 * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * Machine and OS Independent (well, as best as possible)
32 * code for the Qlogic ISP SCSI and FC-SCSI adapters.
36 * Inspiration and ideas about this driver are from Erik Moe's Linux driver
37 * (qlogicisp.c) and Dave Miller's SBus version of same (qlogicisp.c). Some
38 * ideas dredged from the Solaris driver.
42 * Include header file appropriate for platform we're building on.
45 #include <sys/cdefs.h>
46 __KERNEL_RCSID(0, "$NetBSD$");
47 #include <dev/ic/isp_netbsd.h>
50 #include <sys/cdefs.h>
51 __FBSDID("$FreeBSD$");
52 #include <dev/isp/isp_freebsd.h>
55 #include <dev/ic/isp_openbsd.h>
58 #include "isp_linux.h"
61 #include "isp_solaris.h"
67 #define MBOX_DELAY_COUNT 1000000 / 100
72 static const char notresp[] = "Unknown IOCB in RESPONSE Queue (type 0x%x) @ idx %d (next %d)";
73 static const char bun[] = "bad underrun (count %d, resid %d, status %s)";
74 static const char lipd[] = "Chan %d LIP destroyed %d active commands";
75 static const char sacq[] = "unable to acquire scratch area";
77 static const uint8_t alpa_map[] = {
78 0xef, 0xe8, 0xe4, 0xe2, 0xe1, 0xe0, 0xdc, 0xda,
79 0xd9, 0xd6, 0xd5, 0xd4, 0xd3, 0xd2, 0xd1, 0xce,
80 0xcd, 0xcc, 0xcb, 0xca, 0xc9, 0xc7, 0xc6, 0xc5,
81 0xc3, 0xbc, 0xba, 0xb9, 0xb6, 0xb5, 0xb4, 0xb3,
82 0xb2, 0xb1, 0xae, 0xad, 0xac, 0xab, 0xaa, 0xa9,
83 0xa7, 0xa6, 0xa5, 0xa3, 0x9f, 0x9e, 0x9d, 0x9b,
84 0x98, 0x97, 0x90, 0x8f, 0x88, 0x84, 0x82, 0x81,
85 0x80, 0x7c, 0x7a, 0x79, 0x76, 0x75, 0x74, 0x73,
86 0x72, 0x71, 0x6e, 0x6d, 0x6c, 0x6b, 0x6a, 0x69,
87 0x67, 0x66, 0x65, 0x63, 0x5c, 0x5a, 0x59, 0x56,
88 0x55, 0x54, 0x53, 0x52, 0x51, 0x4e, 0x4d, 0x4c,
89 0x4b, 0x4a, 0x49, 0x47, 0x46, 0x45, 0x43, 0x3c,
90 0x3a, 0x39, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31,
91 0x2e, 0x2d, 0x2c, 0x2b, 0x2a, 0x29, 0x27, 0x26,
92 0x25, 0x23, 0x1f, 0x1e, 0x1d, 0x1b, 0x18, 0x17,
93 0x10, 0x0f, 0x08, 0x04, 0x02, 0x01, 0x00
97 * Local function prototypes.
99 static void isp_parse_async(ispsoftc_t *, uint16_t);
100 static void isp_parse_async_fc(ispsoftc_t *, uint16_t);
101 static int isp_handle_other_response(ispsoftc_t *, int, isphdr_t *, uint32_t *);
102 static void isp_parse_status(ispsoftc_t *, ispstatusreq_t *, XS_T *, uint32_t *);
103 static void isp_parse_status_24xx(ispsoftc_t *, isp24xx_statusreq_t *, XS_T *, uint32_t *);
104 static void isp_fastpost_complete(ispsoftc_t *, uint32_t);
105 static void isp_scsi_init(ispsoftc_t *);
106 static void isp_scsi_channel_init(ispsoftc_t *, int);
107 static void isp_fibre_init(ispsoftc_t *);
108 static void isp_fibre_init_2400(ispsoftc_t *);
109 static void isp_clear_portdb(ispsoftc_t *, int);
110 static void isp_mark_portdb(ispsoftc_t *, int);
111 static int isp_plogx(ispsoftc_t *, int, uint16_t, uint32_t, int);
112 static int isp_port_login(ispsoftc_t *, uint16_t, uint32_t);
113 static int isp_port_logout(ispsoftc_t *, uint16_t, uint32_t);
114 static int isp_getpdb(ispsoftc_t *, int, uint16_t, isp_pdb_t *);
115 static int isp_gethandles(ispsoftc_t *, int, uint16_t *, int *, int);
116 static void isp_dump_chip_portdb(ispsoftc_t *, int);
117 static uint64_t isp_get_wwn(ispsoftc_t *, int, int, int);
118 static int isp_fclink_test(ispsoftc_t *, int, int);
119 static int isp_pdb_sync(ispsoftc_t *, int);
120 static int isp_scan_loop(ispsoftc_t *, int);
121 static int isp_gid_pt(ispsoftc_t *, int);
122 static int isp_scan_fabric(ispsoftc_t *, int);
123 static int isp_login_device(ispsoftc_t *, int, uint32_t, isp_pdb_t *, uint16_t *);
124 static int isp_send_change_request(ispsoftc_t *, int);
125 static int isp_register_fc4_type(ispsoftc_t *, int);
126 static int isp_register_fc4_features_24xx(ispsoftc_t *, int);
127 static int isp_register_port_name_24xx(ispsoftc_t *, int);
128 static int isp_register_node_name_24xx(ispsoftc_t *, int);
129 static uint16_t isp_next_handle(ispsoftc_t *, uint16_t *);
130 static int isp_fw_state(ispsoftc_t *, int);
131 static void isp_mboxcmd(ispsoftc_t *, mbreg_t *);
133 static void isp_spi_update(ispsoftc_t *, int);
134 static void isp_setdfltsdparm(ispsoftc_t *);
135 static void isp_setdfltfcparm(ispsoftc_t *, int);
136 static int isp_read_nvram(ispsoftc_t *, int);
137 static int isp_read_nvram_2400(ispsoftc_t *, uint8_t *);
138 static void isp_rdnvram_word(ispsoftc_t *, int, uint16_t *);
139 static void isp_rd_2400_nvram(ispsoftc_t *, uint32_t, uint32_t *);
140 static void isp_parse_nvram_1020(ispsoftc_t *, uint8_t *);
141 static void isp_parse_nvram_1080(ispsoftc_t *, int, uint8_t *);
142 static void isp_parse_nvram_12160(ispsoftc_t *, int, uint8_t *);
143 static void isp_parse_nvram_2100(ispsoftc_t *, uint8_t *);
144 static void isp_parse_nvram_2400(ispsoftc_t *, uint8_t *);
147 isp_change_fw_state(ispsoftc_t *isp, int chan, int state)
149 fcparam *fcp = FCPARAM(isp, chan);
151 if (fcp->isp_fwstate == state)
153 isp_prt(isp, ISP_LOGCONFIG|ISP_LOG_SANCFG,
154 "Chan %d Firmware state <%s->%s>", chan,
155 isp_fc_fw_statename(fcp->isp_fwstate), isp_fc_fw_statename(state));
156 fcp->isp_fwstate = state;
162 * Hit the chip over the head, download new f/w if available and set it running.
164 * Locking done elsewhere.
168 isp_reset(ispsoftc_t *isp, int do_load_defaults)
173 uint32_t code_org, val;
174 int loops, i, dodnld = 1;
175 const char *btype = "????";
176 static const char dcrc[] = "Downloaded RISC Code Checksum Failure";
179 * Basic types (SCSI, FibreChannel and PCI or SBus)
180 * have been set in the MD code. We figure out more
181 * here. Possibly more refined types based upon PCI
182 * identification. Chip revision has been gathered.
184 * After we've fired this chip up, zero out the conf1 register
185 * for SCSI adapters and do other settings for the 2100.
188 isp->isp_state = ISP_NILSTATE;
189 ISP_DISABLE_INTS(isp);
192 * Put the board into PAUSE mode (so we can read the SXP registers
193 * or write FPM/FBM registers).
196 ISP_WRITE(isp, BIU2400_HCCR, HCCR_2400_CMD_CLEAR_HOST_INT);
197 ISP_WRITE(isp, BIU2400_HCCR, HCCR_2400_CMD_CLEAR_RISC_INT);
198 ISP_WRITE(isp, BIU2400_HCCR, HCCR_2400_CMD_PAUSE);
200 ISP_WRITE(isp, HCCR, HCCR_CMD_PAUSE);
204 switch (isp->isp_type) {
235 * While we're paused, reset the FPM module and FBM
238 ISP_WRITE(isp, BIU2100_CSR, BIU2100_FPM0_REGS);
239 ISP_WRITE(isp, FPM_DIAG_CONFIG, FPM_SOFT_RESET);
240 ISP_WRITE(isp, BIU2100_CSR, BIU2100_FB_REGS);
241 ISP_WRITE(isp, FBM_CMD, FBMCMD_FIFO_RESET_ALL);
242 ISP_WRITE(isp, BIU2100_CSR, BIU2100_RISC_REGS);
244 } else if (IS_1240(isp)) {
249 sdp = SDPARAM(isp, 0);
250 sdp->isp_ultramode = 1;
251 sdp = SDPARAM(isp, 1);
252 sdp->isp_ultramode = 1;
254 * XXX: Should probably do some bus sensing.
256 } else if (IS_ULTRA3(isp)) {
257 sdparam *sdp = isp->isp_param;
259 isp->isp_clock = 100;
263 else if (IS_12160(isp))
267 sdp->isp_lvdmode = 1;
269 if (IS_DUALBUS(isp)) {
271 sdp->isp_lvdmode = 1;
273 } else if (IS_ULTRA2(isp)) {
274 static const char m[] = "bus %d is in %s Mode";
276 sdparam *sdp = SDPARAM(isp, 0);
278 isp->isp_clock = 100;
282 else if (IS_1080(isp))
287 l = ISP_READ(isp, SXP_PINS_DIFF) & ISP1080_MODE_MASK;
289 case ISP1080_LVD_MODE:
290 sdp->isp_lvdmode = 1;
291 isp_prt(isp, ISP_LOGCONFIG, m, 0, "LVD");
293 case ISP1080_HVD_MODE:
294 sdp->isp_diffmode = 1;
295 isp_prt(isp, ISP_LOGCONFIG, m, 0, "Differential");
297 case ISP1080_SE_MODE:
298 sdp->isp_ultramode = 1;
299 isp_prt(isp, ISP_LOGCONFIG, m, 0, "Single-Ended");
302 isp_prt(isp, ISP_LOGERR,
303 "unknown mode on bus %d (0x%x)", 0, l);
307 if (IS_DUALBUS(isp)) {
308 sdp = SDPARAM(isp, 1);
309 l = ISP_READ(isp, SXP_PINS_DIFF|SXP_BANK1_SELECT);
310 l &= ISP1080_MODE_MASK;
312 case ISP1080_LVD_MODE:
313 sdp->isp_lvdmode = 1;
314 isp_prt(isp, ISP_LOGCONFIG, m, 1, "LVD");
316 case ISP1080_HVD_MODE:
317 sdp->isp_diffmode = 1;
318 isp_prt(isp, ISP_LOGCONFIG,
319 m, 1, "Differential");
321 case ISP1080_SE_MODE:
322 sdp->isp_ultramode = 1;
323 isp_prt(isp, ISP_LOGCONFIG,
324 m, 1, "Single-Ended");
327 isp_prt(isp, ISP_LOGERR,
328 "unknown mode on bus %d (0x%x)", 1, l);
333 sdparam *sdp = SDPARAM(isp, 0);
334 i = ISP_READ(isp, BIU_CONF0) & BIU_CONF0_HW_MASK;
337 isp_prt(isp, ISP_LOGALL, "Unknown Chip Type 0x%x", i);
341 isp->isp_type = ISP_HA_SCSI_1020;
346 * Some 1020A chips are Ultra Capable, but don't
347 * run the clock rate up for that unless told to
348 * do so by the Ultra Capable bits being set.
351 isp->isp_type = ISP_HA_SCSI_1020A;
356 isp->isp_type = ISP_HA_SCSI_1040;
361 isp->isp_type = ISP_HA_SCSI_1040A;
366 isp->isp_type = ISP_HA_SCSI_1040B;
371 isp->isp_type = ISP_HA_SCSI_1040C;
376 * Now, while we're at it, gather info about ultra
377 * and/or differential mode.
379 if (ISP_READ(isp, SXP_PINS_DIFF) & SXP_PINS_DIFF_MODE) {
380 isp_prt(isp, ISP_LOGCONFIG, "Differential Mode");
381 sdp->isp_diffmode = 1;
383 sdp->isp_diffmode = 0;
385 i = ISP_READ(isp, RISC_PSR);
386 if (isp->isp_bustype == ISP_BT_SBUS) {
387 i &= RISC_PSR_SBUS_ULTRA;
389 i &= RISC_PSR_PCI_ULTRA;
392 isp_prt(isp, ISP_LOGCONFIG, "Ultra Mode Capable");
393 sdp->isp_ultramode = 1;
395 * If we're in Ultra Mode, we have to be 60MHz clock-
396 * even for the SBus version.
400 sdp->isp_ultramode = 0;
402 * Clock is known. Gronk.
407 * Machine dependent clock (if set) overrides
408 * our generic determinations.
410 if (isp->isp_mdvec->dv_clock) {
411 if (isp->isp_mdvec->dv_clock < isp->isp_clock) {
412 isp->isp_clock = isp->isp_mdvec->dv_clock;
418 * Hit the chip over the head with hammer,
419 * and give it a chance to recover.
423 ISP_WRITE(isp, BIU_ICR, BIU_ICR_SOFT_RESET);
430 * Clear data && control DMA engines.
432 ISP_WRITE(isp, CDMA_CONTROL, DMA_CNTRL_CLEAR_CHAN | DMA_CNTRL_RESET_INT);
433 ISP_WRITE(isp, DDMA_CONTROL, DMA_CNTRL_CLEAR_CHAN | DMA_CNTRL_RESET_INT);
436 } else if (IS_24XX(isp)) {
438 * Stop DMA and wait for it to stop.
440 ISP_WRITE(isp, BIU2400_CSR, BIU2400_DMA_STOP|(3 << 4));
441 for (val = loops = 0; loops < 30000; loops++) {
443 val = ISP_READ(isp, BIU2400_CSR);
444 if ((val & BIU2400_DMA_ACTIVE) == 0) {
448 if (val & BIU2400_DMA_ACTIVE) {
449 isp_prt(isp, ISP_LOGERR, "DMA Failed to Stop on Reset");
453 * Hold it in SOFT_RESET and STOP state for 100us.
455 ISP_WRITE(isp, BIU2400_CSR, BIU2400_SOFT_RESET|BIU2400_DMA_STOP|(3 << 4));
457 for (loops = 0; loops < 10000; loops++) {
459 val = ISP_READ(isp, OUTMAILBOX0);
461 for (val = loops = 0; loops < 500000; loops ++) {
462 val = ISP_READ(isp, BIU2400_CSR);
463 if ((val & BIU2400_SOFT_RESET) == 0) {
467 if (val & BIU2400_SOFT_RESET) {
468 isp_prt(isp, ISP_LOGERR, "Failed to come out of reset");
472 ISP_WRITE(isp, BIU2100_CSR, BIU2100_SOFT_RESET);
479 * Clear data && control DMA engines.
481 ISP_WRITE(isp, CDMA2100_CONTROL, DMA_CNTRL2100_CLEAR_CHAN | DMA_CNTRL2100_RESET_INT);
482 ISP_WRITE(isp, TDMA2100_CONTROL, DMA_CNTRL2100_CLEAR_CHAN | DMA_CNTRL2100_RESET_INT);
483 ISP_WRITE(isp, RDMA2100_CONTROL, DMA_CNTRL2100_CLEAR_CHAN | DMA_CNTRL2100_RESET_INT);
487 * Wait for ISP to be ready to go...
489 loops = MBOX_DELAY_COUNT;
492 if (!(ISP_READ(isp, BIU_ICR) & BIU_ICR_SOFT_RESET)) {
495 } else if (IS_24XX(isp)) {
496 if (ISP_READ(isp, OUTMAILBOX0) == 0) {
500 if (!(ISP_READ(isp, BIU2100_CSR) & BIU2100_SOFT_RESET))
505 ISP_DUMPREGS(isp, "chip reset timed out");
511 * After we've fired this chip up, zero out the conf1 register
512 * for SCSI adapters and other settings for the 2100.
516 ISP_WRITE(isp, BIU_CONF1, 0);
517 } else if (!IS_24XX(isp)) {
518 ISP_WRITE(isp, BIU2100_CSR, 0);
522 * Reset RISC Processor
525 ISP_WRITE(isp, BIU2400_HCCR, HCCR_2400_CMD_RESET);
526 ISP_WRITE(isp, BIU2400_HCCR, HCCR_2400_CMD_RELEASE);
527 ISP_WRITE(isp, BIU2400_HCCR, HCCR_2400_CMD_CLEAR_RESET);
529 ISP_WRITE(isp, HCCR, HCCR_CMD_RESET);
531 ISP_WRITE(isp, BIU_SEMA, 0);
535 * Post-RISC Reset stuff.
538 for (val = loops = 0; loops < 5000000; loops++) {
540 val = ISP_READ(isp, OUTMAILBOX0);
546 isp_prt(isp, ISP_LOGERR, "reset didn't clear");
549 } else if (IS_SCSI(isp)) {
550 uint16_t tmp = isp->isp_mdvec->dv_conf1;
552 * Busted FIFO. Turn off all but burst enables.
554 if (isp->isp_type == ISP_HA_SCSI_1040A) {
555 tmp &= BIU_BURST_ENABLE;
557 ISP_SETBITS(isp, BIU_CONF1, tmp);
558 if (tmp & BIU_BURST_ENABLE) {
559 ISP_SETBITS(isp, CDMA_CONF, DMA_ENABLE_BURST);
560 ISP_SETBITS(isp, DDMA_CONF, DMA_ENABLE_BURST);
562 if (SDPARAM(isp, 0)->isp_ptisp) {
563 if (SDPARAM(isp, 0)->isp_ultramode) {
564 while (ISP_READ(isp, RISC_MTR) != 0x1313) {
565 ISP_WRITE(isp, RISC_MTR, 0x1313);
566 ISP_WRITE(isp, HCCR, HCCR_CMD_STEP);
569 ISP_WRITE(isp, RISC_MTR, 0x1212);
572 * PTI specific register
574 ISP_WRITE(isp, RISC_EMB, DUAL_BANK);
576 ISP_WRITE(isp, RISC_MTR, 0x1212);
578 ISP_WRITE(isp, HCCR, HCCR_CMD_RELEASE);
580 ISP_WRITE(isp, RISC_MTR2100, 0x1212);
581 if (IS_2200(isp) || IS_23XX(isp)) {
582 ISP_WRITE(isp, HCCR, HCCR_2X00_DISABLE_PARITY_PAUSE);
584 ISP_WRITE(isp, HCCR, HCCR_CMD_RELEASE);
588 * Set up default request/response queue in-pointer/out-pointer
592 isp->isp_rqstinrp = BIU2400_REQINP;
593 isp->isp_rqstoutrp = BIU2400_REQOUTP;
594 isp->isp_respinrp = BIU2400_RSPINP;
595 isp->isp_respoutrp = BIU2400_RSPOUTP;
596 } else if (IS_23XX(isp)) {
597 isp->isp_rqstinrp = BIU_REQINP;
598 isp->isp_rqstoutrp = BIU_REQOUTP;
599 isp->isp_respinrp = BIU_RSPINP;
600 isp->isp_respoutrp = BIU_RSPOUTP;
602 isp->isp_rqstinrp = INMAILBOX4;
603 isp->isp_rqstoutrp = OUTMAILBOX4;
604 isp->isp_respinrp = OUTMAILBOX5;
605 isp->isp_respoutrp = INMAILBOX5;
607 ISP_WRITE(isp, isp->isp_rqstinrp, 0);
608 ISP_WRITE(isp, isp->isp_rqstoutrp, 0);
609 ISP_WRITE(isp, isp->isp_respinrp, 0);
610 ISP_WRITE(isp, isp->isp_respoutrp, 0);
613 ISP_WRITE(isp, BIU2400_PRI_REQINP, 0);
614 ISP_WRITE(isp, BIU2400_PRI_REQOUTP, 0);
616 ISP_WRITE(isp, BIU2400_ATIO_RSPINP, 0);
617 ISP_WRITE(isp, BIU2400_ATIO_RSPOUTP, 0);
620 if (!IS_24XX(isp) && isp->isp_bustype == ISP_BT_PCI) {
621 /* Make sure the BIOS is disabled */
622 ISP_WRITE(isp, HCCR, PCI_HCCR_CMD_BIOS);
626 * Wait for everything to finish firing up.
628 * Avoid doing this on early 2312s because you can generate a PCI
629 * parity error (chip breakage).
631 if (IS_2312(isp) && isp->isp_revision < 2) {
634 loops = MBOX_DELAY_COUNT;
635 while (ISP_READ(isp, OUTMAILBOX0) == MBOX_BUSY) {
638 isp_prt(isp, ISP_LOGERR, "MBOX_BUSY never cleared on reset");
645 * Up until this point we've done everything by just reading or
646 * setting registers. From this point on we rely on at least *some*
647 * kind of firmware running in the card.
651 * Do some sanity checking by running a NOP command.
652 * If it succeeds, the ROM firmware is now running.
654 MBSINIT(&mbs, MBOX_NO_OP, MBLOGALL, 0);
655 isp_mboxcmd(isp, &mbs);
656 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
657 isp_prt(isp, ISP_LOGERR, "NOP command failed (%x)", mbs.param[0]);
662 * Do some operational tests
664 if (IS_SCSI(isp) || IS_24XX(isp)) {
665 static const uint16_t patterns[MAX_MAILBOX] = {
666 0x0000, 0xdead, 0xbeef, 0xffff,
667 0xa5a5, 0x5a5a, 0x7f7f, 0x7ff7,
668 0x3421, 0xabcd, 0xdcba, 0xfeef,
669 0xbead, 0xdebe, 0x2222, 0x3333,
670 0x5555, 0x6666, 0x7777, 0xaaaa,
671 0xffff, 0xdddd, 0x9999, 0x1fbc,
672 0x6666, 0x6677, 0x1122, 0x33ff,
673 0x0000, 0x0001, 0x1000, 0x1010,
675 int nmbox = ISP_NMBOX(isp);
678 MBSINIT(&mbs, MBOX_MAILBOX_REG_TEST, MBLOGALL, 0);
679 for (i = 1; i < nmbox; i++) {
680 mbs.param[i] = patterns[i];
682 isp_mboxcmd(isp, &mbs);
683 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
686 for (i = 1; i < nmbox; i++) {
687 if (mbs.param[i] != patterns[i]) {
688 isp_prt(isp, ISP_LOGERR, "Register Test Failed at Register %d: should have 0x%04x but got 0x%04x", i, patterns[i], mbs.param[i]);
695 * Download new Firmware, unless requested not to do so.
696 * This is made slightly trickier in some cases where the
697 * firmware of the ROM revision is newer than the revision
698 * compiled into the driver. So, where we used to compare
699 * versions of our f/w and the ROM f/w, now we just see
700 * whether we have f/w at all and whether a config flag
701 * has disabled our download.
703 if ((isp->isp_mdvec->dv_ispfw == NULL) || (isp->isp_confopts & ISP_CFG_NORELOAD)) {
708 * Set up DMA for the request and response queues.
709 * We do this now so we can use the request queue
710 * for dma to load firmware from.
712 if (ISP_MBOXDMASETUP(isp) != 0) {
713 isp_prt(isp, ISP_LOGERR, "Cannot setup DMA");
719 code_org = ISP_CODE_ORG_2400;
720 } else if (IS_23XX(isp)) {
721 code_org = ISP_CODE_ORG_2300;
723 code_org = ISP_CODE_ORG;
726 isp->isp_loaded_fw = 0;
727 if (dodnld && IS_24XX(isp)) {
728 const uint32_t *ptr = isp->isp_mdvec->dv_ispfw;
732 * Keep loading until we run out of f/w.
734 code_org = ptr[2]; /* 1st load address is our start addr */
738 isp_prt(isp, ISP_LOGDEBUG0, "load 0x%x words of code at load address 0x%x", ptr[3], ptr[2]);
743 while (wi < ptr[3]) {
747 nw = min(wl, ISP_QUEUE_SIZE(RQUEST_QUEUE_LEN(isp)) / 4);
748 cp = isp->isp_rquest;
749 for (i = 0; i < nw; i++)
750 ISP_IOXPUT_32(isp, ptr[wi + i], &cp[i]);
751 MEMORYBARRIER(isp, SYNC_REQUEST, 0, ISP_QUEUE_SIZE(RQUEST_QUEUE_LEN(isp)), -1);
752 MBSINIT(&mbs, MBOX_LOAD_RISC_RAM, MBLOGALL, 0);
754 mbs.param[2] = DMA_WD1(isp->isp_rquest_dma);
755 mbs.param[3] = DMA_WD0(isp->isp_rquest_dma);
756 mbs.param[4] = nw >> 16;
758 mbs.param[6] = DMA_WD3(isp->isp_rquest_dma);
759 mbs.param[7] = DMA_WD2(isp->isp_rquest_dma);
760 mbs.param[8] = la >> 16;
761 isp_prt(isp, ISP_LOGDEBUG0, "LOAD RISC RAM %u words at load address 0x%x", nw, la);
762 isp_mboxcmd(isp, &mbs);
763 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
764 isp_prt(isp, ISP_LOGERR, "F/W download failed");
777 isp->isp_loaded_fw = 1;
778 } else if (dodnld && IS_23XX(isp)) {
779 const uint16_t *ptr = isp->isp_mdvec->dv_ispfw;
780 uint16_t wi, wl, segno;
789 isp_prt(isp, ISP_LOGDEBUG0, "load 0x%x words of code at load address 0x%x", ptr[3], la);
794 while (wi < ptr[3]) {
798 nw = min(wl, min((1 << 15), ISP_QUEUE_SIZE(RQUEST_QUEUE_LEN(isp)) / 2));
799 cp = isp->isp_rquest;
800 for (i = 0; i < nw; i++)
801 ISP_IOXPUT_16(isp, ptr[wi + i], &cp[i]);
802 MEMORYBARRIER(isp, SYNC_REQUEST, 0, ISP_QUEUE_SIZE(RQUEST_QUEUE_LEN(isp)), -1);
803 MBSINIT(&mbs, 0, MBLOGALL, 0);
805 mbs.param[0] = MBOX_LOAD_RISC_RAM_2100;
807 mbs.param[2] = DMA_WD1(isp->isp_rquest_dma);
808 mbs.param[3] = DMA_WD0(isp->isp_rquest_dma);
810 mbs.param[6] = DMA_WD3(isp->isp_rquest_dma);
811 mbs.param[7] = DMA_WD2(isp->isp_rquest_dma);
812 isp_prt(isp, ISP_LOGDEBUG1, "LOAD RISC RAM 2100 %u words at load address 0x%x\n", nw, la);
814 mbs.param[0] = MBOX_LOAD_RISC_RAM;
816 mbs.param[2] = DMA_WD1(isp->isp_rquest_dma);
817 mbs.param[3] = DMA_WD0(isp->isp_rquest_dma);
819 mbs.param[6] = DMA_WD3(isp->isp_rquest_dma);
820 mbs.param[7] = DMA_WD2(isp->isp_rquest_dma);
821 mbs.param[8] = la >> 16;
822 isp_prt(isp, ISP_LOGDEBUG1, "LOAD RISC RAM %u words at load address 0x%x\n", nw, la);
824 isp_mboxcmd(isp, &mbs);
825 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
826 isp_prt(isp, ISP_LOGERR, "F/W download failed");
843 * If we're a 2322, the firmware actually comes in
844 * three chunks. We loaded the first at the code_org
845 * address. The other two chunks, which follow right
846 * after each other in memory here, get loaded at
847 * addresses specfied at offset 0x9..0xB.
852 la = ptr[5] | ((ptr[4] & 0x3f) << 16);
854 isp->isp_loaded_fw = 1;
856 const uint16_t *ptr = isp->isp_mdvec->dv_ispfw;
860 isp_prt(isp, ISP_LOGDEBUG1,
861 "WRITE RAM %u words at load address 0x%x", wl, code_org);
862 for (i = 0; i < wl; i++) {
863 MBSINIT(&mbs, MBOX_WRITE_RAM_WORD, MBLOGNONE, 0);
864 mbs.param[1] = code_org + i;
865 mbs.param[2] = ptr[i];
866 isp_mboxcmd(isp, &mbs);
867 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
868 isp_prt(isp, ISP_LOGERR,
869 "F/W download failed at word %d", i);
873 } else if (IS_26XX(isp)) {
874 MBSINIT(&mbs, MBOX_LOAD_FLASH_FIRMWARE, MBLOGALL, 5000000);
877 isp_mboxcmd(isp, &mbs);
878 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
879 isp_prt(isp, ISP_LOGERR, "Flash F/W load failed");
883 isp_prt(isp, ISP_LOGDEBUG2, "skipping f/w download");
887 * If we loaded firmware, verify its checksum
889 if (isp->isp_loaded_fw) {
890 MBSINIT(&mbs, MBOX_VERIFY_CHECKSUM, MBLOGNONE, 0);
892 mbs.param[1] = code_org >> 16;
893 mbs.param[2] = code_org;
895 mbs.param[1] = code_org;
897 isp_mboxcmd(isp, &mbs);
898 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
899 isp_prt(isp, ISP_LOGERR, dcrc);
905 * Now start it rolling.
907 * If we didn't actually download f/w,
908 * we still need to (re)start it.
910 MBSINIT(&mbs, MBOX_EXEC_FIRMWARE, MBLOGALL, 5000000);
912 mbs.param[1] = code_org >> 16;
913 mbs.param[2] = code_org;
914 if (isp->isp_loaded_fw) {
919 } else if (IS_2322(isp)) {
920 mbs.param[1] = code_org;
921 if (isp->isp_loaded_fw) {
927 mbs.param[1] = code_org;
929 isp_mboxcmd(isp, &mbs);
930 if (IS_2322(isp) || IS_24XX(isp)) {
931 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
938 * Set CLOCK RATE, but only if asked to.
940 if (isp->isp_clock) {
941 MBSINIT(&mbs, MBOX_SET_CLOCK_RATE, MBLOGALL, 0);
942 mbs.param[1] = isp->isp_clock;
943 isp_mboxcmd(isp, &mbs);
944 /* we will try not to care if this fails */
949 * Ask the chip for the current firmware version.
950 * This should prove that the new firmware is working.
952 MBSINIT(&mbs, MBOX_ABOUT_FIRMWARE, MBLOGALL, 0);
953 isp_mboxcmd(isp, &mbs);
954 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
959 * The SBus firmware that we are using apparently does not return
960 * major, minor, micro revisions in the mailbox registers, which
961 * is really, really, annoying.
963 if (ISP_SBUS_SUPPORTED && isp->isp_bustype == ISP_BT_SBUS) {
965 #ifdef ISP_TARGET_MODE
966 isp->isp_fwrev[0] = 7;
967 isp->isp_fwrev[1] = 55;
969 isp->isp_fwrev[0] = 1;
970 isp->isp_fwrev[1] = 37;
972 isp->isp_fwrev[2] = 0;
975 isp->isp_fwrev[0] = mbs.param[1];
976 isp->isp_fwrev[1] = mbs.param[2];
977 isp->isp_fwrev[2] = mbs.param[3];
982 * We do not believe firmware attributes for 2100 code less
983 * than 1.17.0, unless it's the firmware we specifically
986 * Note that all 22XX and later f/w is greater than 1.X.0.
988 if ((ISP_FW_OLDER_THAN(isp, 1, 17, 1))) {
989 #ifdef USE_SMALLER_2100_FIRMWARE
990 isp->isp_fwattr = ISP_FW_ATTR_SCCLUN;
995 isp->isp_fwattr = mbs.param[6];
998 isp->isp_fwattr |= ((uint64_t) mbs.param[15]) << 16;
999 if (isp->isp_fwattr & ISP2400_FW_ATTR_EXTNDED) {
1001 (((uint64_t) mbs.param[16]) << 32) |
1002 (((uint64_t) mbs.param[17]) << 48);
1006 isp->isp_fwattr = 0;
1009 isp_prt(isp, ISP_LOGCONFIG, "Board Type %s, Chip Revision 0x%x, %s F/W Revision %d.%d.%d",
1010 btype, isp->isp_revision, dodnld? "loaded" : "resident", isp->isp_fwrev[0], isp->isp_fwrev[1], isp->isp_fwrev[2]);
1012 fwt = isp->isp_fwattr;
1014 buf = FCPARAM(isp, 0)->isp_scanscratch;
1015 ISP_SNPRINTF(buf, ISP_FC_SCRLEN, "Attributes:");
1016 if (fwt & ISP2400_FW_ATTR_CLASS2) {
1017 fwt ^=ISP2400_FW_ATTR_CLASS2;
1018 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s Class2", buf);
1020 if (fwt & ISP2400_FW_ATTR_IP) {
1021 fwt ^=ISP2400_FW_ATTR_IP;
1022 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s IP", buf);
1024 if (fwt & ISP2400_FW_ATTR_MULTIID) {
1025 fwt ^=ISP2400_FW_ATTR_MULTIID;
1026 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s MultiID", buf);
1028 if (fwt & ISP2400_FW_ATTR_SB2) {
1029 fwt ^=ISP2400_FW_ATTR_SB2;
1030 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s SB2", buf);
1032 if (fwt & ISP2400_FW_ATTR_T10CRC) {
1033 fwt ^=ISP2400_FW_ATTR_T10CRC;
1034 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s T10CRC", buf);
1036 if (fwt & ISP2400_FW_ATTR_VI) {
1037 fwt ^=ISP2400_FW_ATTR_VI;
1038 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s VI", buf);
1040 if (fwt & ISP2400_FW_ATTR_MQ) {
1041 fwt ^=ISP2400_FW_ATTR_MQ;
1042 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s MQ", buf);
1044 if (fwt & ISP2400_FW_ATTR_MSIX) {
1045 fwt ^=ISP2400_FW_ATTR_MSIX;
1046 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s MSIX", buf);
1048 if (fwt & ISP2400_FW_ATTR_FCOE) {
1049 fwt ^=ISP2400_FW_ATTR_FCOE;
1050 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s FCOE", buf);
1052 if (fwt & ISP2400_FW_ATTR_VP0) {
1053 fwt ^= ISP2400_FW_ATTR_VP0;
1054 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s VP0_Decoupling", buf);
1056 if (fwt & ISP2400_FW_ATTR_EXPFW) {
1057 fwt ^= ISP2400_FW_ATTR_EXPFW;
1058 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s (Experimental)", buf);
1060 if (fwt & ISP2400_FW_ATTR_HOTFW) {
1061 fwt ^= ISP2400_FW_ATTR_HOTFW;
1062 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s HotFW", buf);
1064 fwt &= ~ISP2400_FW_ATTR_EXTNDED;
1065 if (fwt & ISP2400_FW_ATTR_EXTVP) {
1066 fwt ^= ISP2400_FW_ATTR_EXTVP;
1067 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s ExtVP", buf);
1069 if (fwt & ISP2400_FW_ATTR_VN2VN) {
1070 fwt ^= ISP2400_FW_ATTR_VN2VN;
1071 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s VN2VN", buf);
1073 if (fwt & ISP2400_FW_ATTR_EXMOFF) {
1074 fwt ^= ISP2400_FW_ATTR_EXMOFF;
1075 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s EXMOFF", buf);
1077 if (fwt & ISP2400_FW_ATTR_NPMOFF) {
1078 fwt ^= ISP2400_FW_ATTR_NPMOFF;
1079 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s NPMOFF", buf);
1081 if (fwt & ISP2400_FW_ATTR_DIFCHOP) {
1082 fwt ^= ISP2400_FW_ATTR_DIFCHOP;
1083 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s DIFCHOP", buf);
1085 if (fwt & ISP2400_FW_ATTR_SRIOV) {
1086 fwt ^= ISP2400_FW_ATTR_SRIOV;
1087 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s SRIOV", buf);
1089 if (fwt & ISP2400_FW_ATTR_ASICTMP) {
1090 fwt ^= ISP2400_FW_ATTR_ASICTMP;
1091 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s ASICTMP", buf);
1093 if (fwt & ISP2400_FW_ATTR_ATIOMQ) {
1094 fwt ^= ISP2400_FW_ATTR_ATIOMQ;
1095 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s ATIOMQ", buf);
1098 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s (unknown 0x%08x%08x)", buf,
1099 (uint32_t) (fwt >> 32), (uint32_t) fwt);
1101 isp_prt(isp, ISP_LOGCONFIG, "%s", buf);
1102 } else if (IS_FC(isp)) {
1103 buf = FCPARAM(isp, 0)->isp_scanscratch;
1104 ISP_SNPRINTF(buf, ISP_FC_SCRLEN, "Attributes:");
1105 if (fwt & ISP_FW_ATTR_TMODE) {
1106 fwt ^=ISP_FW_ATTR_TMODE;
1107 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s TargetMode", buf);
1109 if (fwt & ISP_FW_ATTR_SCCLUN) {
1110 fwt ^=ISP_FW_ATTR_SCCLUN;
1111 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s SCC-Lun", buf);
1113 if (fwt & ISP_FW_ATTR_FABRIC) {
1114 fwt ^=ISP_FW_ATTR_FABRIC;
1115 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s Fabric", buf);
1117 if (fwt & ISP_FW_ATTR_CLASS2) {
1118 fwt ^=ISP_FW_ATTR_CLASS2;
1119 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s Class2", buf);
1121 if (fwt & ISP_FW_ATTR_FCTAPE) {
1122 fwt ^=ISP_FW_ATTR_FCTAPE;
1123 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s FC-Tape", buf);
1125 if (fwt & ISP_FW_ATTR_IP) {
1126 fwt ^=ISP_FW_ATTR_IP;
1127 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s IP", buf);
1129 if (fwt & ISP_FW_ATTR_VI) {
1130 fwt ^=ISP_FW_ATTR_VI;
1131 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s VI", buf);
1133 if (fwt & ISP_FW_ATTR_VI_SOLARIS) {
1134 fwt ^=ISP_FW_ATTR_VI_SOLARIS;
1135 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s VI_SOLARIS", buf);
1137 if (fwt & ISP_FW_ATTR_2KLOGINS) {
1138 fwt ^=ISP_FW_ATTR_2KLOGINS;
1139 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s 2K-Login", buf);
1142 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s (unknown 0x%08x%08x)", buf,
1143 (uint32_t) (fwt >> 32), (uint32_t) fwt);
1145 isp_prt(isp, ISP_LOGCONFIG, "%s", buf);
1149 MBSINIT(&mbs, MBOX_GET_RESOURCE_COUNT, MBLOGALL, 0);
1150 isp_mboxcmd(isp, &mbs);
1151 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
1154 isp->isp_maxcmds = mbs.param[3];
1156 MBSINIT(&mbs, MBOX_GET_FIRMWARE_STATUS, MBLOGALL, 0);
1157 isp_mboxcmd(isp, &mbs);
1158 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
1161 isp->isp_maxcmds = mbs.param[2];
1163 isp_prt(isp, ISP_LOGCONFIG, "%d max I/O command limit set", isp->isp_maxcmds);
1166 * If we don't have Multi-ID f/w loaded, we need to restrict channels to one.
1167 * Only make this check for non-SCSI cards (I'm not sure firmware attributes
1170 if (IS_FC(isp) && isp->isp_nchan > 1) {
1171 if (!ISP_CAP_MULTI_ID(isp)) {
1172 isp_prt(isp, ISP_LOGWARN, "non-MULTIID f/w loaded, "
1173 "only can enable 1 of %d channels", isp->isp_nchan);
1175 } else if (!ISP_CAP_VP0(isp)) {
1176 isp_prt(isp, ISP_LOGWARN, "We can not use MULTIID "
1177 "feature properly without VP0_Decoupling");
1183 * Final DMA setup after we got isp_maxcmds.
1185 if (ISP_MBOXDMASETUP(isp) != 0) {
1186 isp_prt(isp, ISP_LOGERR, "Cannot setup DMA");
1193 if (ISP_IRQSETUP(isp) != 0) {
1194 isp_prt(isp, ISP_LOGERR, "Cannot setup IRQ");
1197 ISP_ENABLE_INTS(isp);
1200 for (i = 0; i < isp->isp_nchan; i++)
1201 isp_change_fw_state(isp, i, FW_CONFIG_WAIT);
1204 isp->isp_state = ISP_RESETSTATE;
1207 * Okay- now that we have new firmware running, we now (re)set our
1208 * notion of how many luns we support. This is somewhat tricky because
1209 * if we haven't loaded firmware, we sometimes do not have an easy way
1210 * of knowing how many luns we support.
1212 * Expanded lun firmware gives you 32 luns for SCSI cards and
1213 * unlimited luns for Fibre Channel cards.
1215 * It turns out that even for QLogic 2100s with ROM 1.10 and above
1216 * we do get a firmware attributes word returned in mailbox register 6.
1218 * Because the lun is in a different position in the Request Queue
1219 * Entry structure for Fibre Channel with expanded lun firmware, we
1220 * can only support one lun (lun zero) when we don't know what kind
1221 * of firmware we're running.
1225 if (IS_ULTRA2(isp) || IS_ULTRA3(isp)) {
1226 isp->isp_maxluns = 32;
1228 isp->isp_maxluns = 8;
1231 isp->isp_maxluns = 8;
1234 if (ISP_CAP_SCCFW(isp)) {
1235 isp->isp_maxluns = 0; /* No limit -- 2/8 bytes */
1237 isp->isp_maxluns = 16;
1242 * We get some default values established. As a side
1243 * effect, NVRAM is read here (unless overriden by
1244 * a configuration flag).
1246 if (do_load_defaults) {
1248 isp_setdfltsdparm(isp);
1250 for (i = 0; i < isp->isp_nchan; i++) {
1251 isp_setdfltfcparm(isp, i);
1258 * Clean firmware shutdown.
1261 isp_stop(ispsoftc_t *isp)
1265 isp->isp_state = ISP_NILSTATE;
1266 MBSINIT(&mbs, MBOX_STOP_FIRMWARE, MBLOGALL, 500000);
1275 isp_mboxcmd(isp, &mbs);
1276 return (mbs.param[0] == MBOX_COMMAND_COMPLETE ? 0 : mbs.param[0]);
1280 * Hardware shutdown.
1283 isp_shutdown(ispsoftc_t *isp)
1286 if (isp->isp_state >= ISP_RESETSTATE)
1288 ISP_DISABLE_INTS(isp);
1291 ISP_WRITE(isp, BIU2400_ICR, 0);
1292 ISP_WRITE(isp, BIU2400_HCCR, HCCR_2400_CMD_PAUSE);
1294 ISP_WRITE(isp, BIU_ICR, 0);
1295 ISP_WRITE(isp, HCCR, HCCR_CMD_PAUSE);
1296 ISP_WRITE(isp, BIU2100_CSR, BIU2100_FPM0_REGS);
1297 ISP_WRITE(isp, FPM_DIAG_CONFIG, FPM_SOFT_RESET);
1298 ISP_WRITE(isp, BIU2100_CSR, BIU2100_FB_REGS);
1299 ISP_WRITE(isp, FBM_CMD, FBMCMD_FIFO_RESET_ALL);
1300 ISP_WRITE(isp, BIU2100_CSR, BIU2100_RISC_REGS);
1303 ISP_WRITE(isp, BIU_ICR, 0);
1304 ISP_WRITE(isp, HCCR, HCCR_CMD_PAUSE);
1309 * Initialize Parameters of Hardware to a known state.
1311 * Locks are held before coming here.
1314 isp_init(ispsoftc_t *isp)
1318 isp_fibre_init_2400(isp);
1320 isp_fibre_init(isp);
1328 isp_scsi_init(ispsoftc_t *isp)
1330 sdparam *sdp_chan0, *sdp_chan1;
1333 isp->isp_state = ISP_INITSTATE;
1335 sdp_chan0 = SDPARAM(isp, 0);
1336 sdp_chan1 = sdp_chan0;
1337 if (IS_DUALBUS(isp)) {
1338 sdp_chan1 = SDPARAM(isp, 1);
1341 /* First do overall per-card settings. */
1344 * If we have fast memory timing enabled, turn it on.
1346 if (sdp_chan0->isp_fast_mttr) {
1347 ISP_WRITE(isp, RISC_MTR, 0x1313);
1351 * Set Retry Delay and Count.
1352 * You set both channels at the same time.
1354 MBSINIT(&mbs, MBOX_SET_RETRY_COUNT, MBLOGALL, 0);
1355 mbs.param[1] = sdp_chan0->isp_retry_count;
1356 mbs.param[2] = sdp_chan0->isp_retry_delay;
1357 mbs.param[6] = sdp_chan1->isp_retry_count;
1358 mbs.param[7] = sdp_chan1->isp_retry_delay;
1359 isp_mboxcmd(isp, &mbs);
1360 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
1365 * Set ASYNC DATA SETUP time. This is very important.
1367 MBSINIT(&mbs, MBOX_SET_ASYNC_DATA_SETUP_TIME, MBLOGALL, 0);
1368 mbs.param[1] = sdp_chan0->isp_async_data_setup;
1369 mbs.param[2] = sdp_chan1->isp_async_data_setup;
1370 isp_mboxcmd(isp, &mbs);
1371 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
1376 * Set ACTIVE Negation State.
1378 MBSINIT(&mbs, MBOX_SET_ACT_NEG_STATE, MBLOGNONE, 0);
1380 (sdp_chan0->isp_req_ack_active_neg << 4) |
1381 (sdp_chan0->isp_data_line_active_neg << 5);
1383 (sdp_chan1->isp_req_ack_active_neg << 4) |
1384 (sdp_chan1->isp_data_line_active_neg << 5);
1385 isp_mboxcmd(isp, &mbs);
1386 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
1387 isp_prt(isp, ISP_LOGERR,
1388 "failed to set active negation state (%d,%d), (%d,%d)",
1389 sdp_chan0->isp_req_ack_active_neg,
1390 sdp_chan0->isp_data_line_active_neg,
1391 sdp_chan1->isp_req_ack_active_neg,
1392 sdp_chan1->isp_data_line_active_neg);
1399 * Set the Tag Aging limit
1401 MBSINIT(&mbs, MBOX_SET_TAG_AGE_LIMIT, MBLOGALL, 0);
1402 mbs.param[1] = sdp_chan0->isp_tag_aging;
1403 mbs.param[2] = sdp_chan1->isp_tag_aging;
1404 isp_mboxcmd(isp, &mbs);
1405 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
1406 isp_prt(isp, ISP_LOGERR, "failed to set tag age limit (%d,%d)",
1407 sdp_chan0->isp_tag_aging, sdp_chan1->isp_tag_aging);
1412 * Set selection timeout.
1414 MBSINIT(&mbs, MBOX_SET_SELECT_TIMEOUT, MBLOGALL, 0);
1415 mbs.param[1] = sdp_chan0->isp_selection_timeout;
1416 mbs.param[2] = sdp_chan1->isp_selection_timeout;
1417 isp_mboxcmd(isp, &mbs);
1418 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
1422 /* now do per-channel settings */
1423 isp_scsi_channel_init(isp, 0);
1424 if (IS_DUALBUS(isp))
1425 isp_scsi_channel_init(isp, 1);
1428 * Now enable request/response queues
1431 if (IS_ULTRA2(isp) || IS_1240(isp)) {
1432 MBSINIT(&mbs, MBOX_INIT_RES_QUEUE_A64, MBLOGALL, 0);
1433 mbs.param[1] = RESULT_QUEUE_LEN(isp);
1434 mbs.param[2] = DMA_WD1(isp->isp_result_dma);
1435 mbs.param[3] = DMA_WD0(isp->isp_result_dma);
1437 mbs.param[6] = DMA_WD3(isp->isp_result_dma);
1438 mbs.param[7] = DMA_WD2(isp->isp_result_dma);
1439 isp_mboxcmd(isp, &mbs);
1440 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
1443 isp->isp_residx = isp->isp_resodx = mbs.param[5];
1445 MBSINIT(&mbs, MBOX_INIT_REQ_QUEUE_A64, MBLOGALL, 0);
1446 mbs.param[1] = RQUEST_QUEUE_LEN(isp);
1447 mbs.param[2] = DMA_WD1(isp->isp_rquest_dma);
1448 mbs.param[3] = DMA_WD0(isp->isp_rquest_dma);
1450 mbs.param[6] = DMA_WD3(isp->isp_result_dma);
1451 mbs.param[7] = DMA_WD2(isp->isp_result_dma);
1452 isp_mboxcmd(isp, &mbs);
1453 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
1456 isp->isp_reqidx = isp->isp_reqodx = mbs.param[4];
1458 MBSINIT(&mbs, MBOX_INIT_RES_QUEUE, MBLOGALL, 0);
1459 mbs.param[1] = RESULT_QUEUE_LEN(isp);
1460 mbs.param[2] = DMA_WD1(isp->isp_result_dma);
1461 mbs.param[3] = DMA_WD0(isp->isp_result_dma);
1463 isp_mboxcmd(isp, &mbs);
1464 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
1467 isp->isp_residx = isp->isp_resodx = mbs.param[5];
1469 MBSINIT(&mbs, MBOX_INIT_REQ_QUEUE, MBLOGALL, 0);
1470 mbs.param[1] = RQUEST_QUEUE_LEN(isp);
1471 mbs.param[2] = DMA_WD1(isp->isp_rquest_dma);
1472 mbs.param[3] = DMA_WD0(isp->isp_rquest_dma);
1474 isp_mboxcmd(isp, &mbs);
1475 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
1478 isp->isp_reqidx = isp->isp_reqodx = mbs.param[4];
1482 * Turn on LVD transitions for ULTRA2 or better and other features
1484 * Now that we have 32 bit handles, don't do any fast posting
1485 * any more. For Ultra2/Ultra3 cards, we can turn on 32 bit RIO
1486 * operation or use fast posting. To be conservative, we'll only
1487 * do this for Ultra3 cards now because the other cards are so
1488 * rare for this author to find and test with.
1491 MBSINIT(&mbs, MBOX_SET_FW_FEATURES, MBLOGALL, 0);
1493 mbs.param[1] |= FW_FEATURE_LVD_NOTIFY;
1496 mbs.param[1] |= FW_FEATURE_FAST_POST;
1499 mbs.param[1] |= FW_FEATURE_RIO_32BIT;
1501 if (mbs.param[1] != 0) {
1502 uint16_t sfeat = mbs.param[1];
1503 isp_mboxcmd(isp, &mbs);
1504 if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
1505 isp_prt(isp, ISP_LOGINFO,
1506 "Enabled FW features (0x%x)", sfeat);
1510 isp->isp_state = ISP_RUNSTATE;
1514 isp_scsi_channel_init(ispsoftc_t *isp, int chan)
1520 sdp = SDPARAM(isp, chan);
1523 * Set (possibly new) Initiator ID.
1525 MBSINIT(&mbs, MBOX_SET_INIT_SCSI_ID, MBLOGALL, 0);
1526 mbs.param[1] = (chan << 7) | sdp->isp_initiator_id;
1527 isp_mboxcmd(isp, &mbs);
1528 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
1531 isp_prt(isp, ISP_LOGINFO, "Chan %d Initiator ID is %d",
1532 chan, sdp->isp_initiator_id);
1536 * Set current per-target parameters to an initial safe minimum.
1538 for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
1542 if (sdp->isp_devparam[tgt].dev_enable == 0) {
1545 #ifndef ISP_TARGET_MODE
1546 sdf = sdp->isp_devparam[tgt].goal_flags;
1547 sdf &= DPARM_SAFE_DFLT;
1549 * It is not quite clear when this changed over so that
1550 * we could force narrow and async for 1000/1020 cards,
1551 * but assume that this is only the case for loaded
1554 if (isp->isp_loaded_fw) {
1555 sdf |= DPARM_NARROW | DPARM_ASYNC;
1559 * The !$*!)$!$)* f/w uses the same index into some
1560 * internal table to decide how to respond to negotiations,
1561 * so if we've said "let's be safe" for ID X, and ID X
1562 * selects *us*, the negotiations will back to 'safe'
1563 * (as in narrow/async). What the f/w *should* do is
1564 * use the initiator id settings to decide how to respond.
1566 sdp->isp_devparam[tgt].goal_flags = sdf = DPARM_DEFAULT;
1568 MBSINIT(&mbs, MBOX_SET_TARGET_PARAMS, MBLOGNONE, 0);
1569 mbs.param[1] = (chan << 15) | (tgt << 8);
1571 if ((sdf & DPARM_SYNC) == 0) {
1575 (sdp->isp_devparam[tgt].goal_offset << 8) |
1576 (sdp->isp_devparam[tgt].goal_period);
1578 isp_prt(isp, ISP_LOGDEBUG0, "Initial Settings bus%d tgt%d flags 0x%x off 0x%x per 0x%x",
1579 chan, tgt, mbs.param[2], mbs.param[3] >> 8, mbs.param[3] & 0xff);
1580 isp_mboxcmd(isp, &mbs);
1581 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
1582 sdf = DPARM_SAFE_DFLT;
1583 MBSINIT(&mbs, MBOX_SET_TARGET_PARAMS, MBLOGALL, 0);
1584 mbs.param[1] = (tgt << 8) | (chan << 15);
1587 isp_mboxcmd(isp, &mbs);
1588 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
1594 * We don't update any information directly from the f/w
1595 * because we need to run at least one command to cause a
1596 * new state to be latched up. So, we just assume that we
1597 * converge to the values we just had set.
1599 * Ensure that we don't believe tagged queuing is enabled yet.
1600 * It turns out that sometimes the ISP just ignores our
1601 * attempts to set parameters for devices that it hasn't
1604 sdp->isp_devparam[tgt].actv_flags = sdf & ~DPARM_TQING;
1605 for (lun = 0; lun < (int) isp->isp_maxluns; lun++) {
1606 MBSINIT(&mbs, MBOX_SET_DEV_QUEUE_PARAMS, MBLOGALL, 0);
1607 mbs.param[1] = (chan << 15) | (tgt << 8) | lun;
1608 mbs.param[2] = sdp->isp_max_queue_depth;
1609 mbs.param[3] = sdp->isp_devparam[tgt].exc_throttle;
1610 isp_mboxcmd(isp, &mbs);
1611 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
1616 for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
1617 if (sdp->isp_devparam[tgt].dev_refresh) {
1618 sdp->sendmarker = 1;
1626 * Fibre Channel specific initialization.
1629 isp_fibre_init(ispsoftc_t *isp)
1632 isp_icb_t local, *icbp = &local;
1636 * We only support one channel on non-24XX cards
1638 fcp = FCPARAM(isp, 0);
1639 if (fcp->role == ISP_ROLE_NONE)
1642 isp->isp_state = ISP_INITSTATE;
1643 ISP_MEMZERO(icbp, sizeof (*icbp));
1644 icbp->icb_version = ICB_VERSION1;
1645 icbp->icb_fwoptions = fcp->isp_fwoptions;
1648 * Firmware Options are either retrieved from NVRAM or
1649 * are patched elsewhere. We check them for sanity here
1650 * and make changes based on board revision, but otherwise
1651 * let others decide policy.
1655 * If this is a 2100 < revision 5, we have to turn off FAIRNESS.
1657 if (IS_2100(isp) && isp->isp_revision < 5) {
1658 icbp->icb_fwoptions &= ~ICBOPT_FAIRNESS;
1662 * We have to use FULL LOGIN even though it resets the loop too much
1663 * because otherwise port database entries don't get updated after
1664 * a LIP- this is a known f/w bug for 2100 f/w less than 1.17.0.
1666 if (!ISP_FW_NEWER_THAN(isp, 1, 17, 0)) {
1667 icbp->icb_fwoptions |= ICBOPT_FULL_LOGIN;
1671 * Insist on Port Database Update Async notifications
1673 icbp->icb_fwoptions |= ICBOPT_PDBCHANGE_AE;
1676 * Make sure that target role reflects into fwoptions.
1678 if (fcp->role & ISP_ROLE_TARGET) {
1679 icbp->icb_fwoptions |= ICBOPT_TGT_ENABLE;
1681 icbp->icb_fwoptions &= ~ICBOPT_TGT_ENABLE;
1685 * For some reason my 2200 does not generate ATIOs in target mode
1686 * if initiator is disabled. Extra logins are better then target
1687 * not working at all.
1689 if ((fcp->role & ISP_ROLE_INITIATOR) || IS_2100(isp) || IS_2200(isp)) {
1690 icbp->icb_fwoptions &= ~ICBOPT_INI_DISABLE;
1692 icbp->icb_fwoptions |= ICBOPT_INI_DISABLE;
1695 icbp->icb_maxfrmlen = DEFAULT_FRAMESIZE(isp);
1696 if (icbp->icb_maxfrmlen < ICB_MIN_FRMLEN || icbp->icb_maxfrmlen > ICB_MAX_FRMLEN) {
1697 isp_prt(isp, ISP_LOGERR, "bad frame length (%d) from NVRAM- using %d", DEFAULT_FRAMESIZE(isp), ICB_DFLT_FRMLEN);
1698 icbp->icb_maxfrmlen = ICB_DFLT_FRMLEN;
1700 icbp->icb_maxalloc = fcp->isp_maxalloc;
1701 if (icbp->icb_maxalloc < 1) {
1702 isp_prt(isp, ISP_LOGERR, "bad maximum allocation (%d)- using 16", fcp->isp_maxalloc);
1703 icbp->icb_maxalloc = 16;
1705 icbp->icb_execthrottle = DEFAULT_EXEC_THROTTLE(isp);
1706 if (icbp->icb_execthrottle < 1) {
1707 isp_prt(isp, ISP_LOGERR, "bad execution throttle of %d- using %d", DEFAULT_EXEC_THROTTLE(isp), ICB_DFLT_THROTTLE);
1708 icbp->icb_execthrottle = ICB_DFLT_THROTTLE;
1710 icbp->icb_retry_delay = fcp->isp_retry_delay;
1711 icbp->icb_retry_count = fcp->isp_retry_count;
1712 if (fcp->isp_loopid < LOCAL_LOOP_LIM) {
1713 icbp->icb_hardaddr = fcp->isp_loopid;
1714 if (isp->isp_confopts & ISP_CFG_OWNLOOPID)
1715 icbp->icb_fwoptions |= ICBOPT_HARD_ADDRESS;
1717 icbp->icb_fwoptions |= ICBOPT_PREV_ADDRESS;
1721 * Right now we just set extended options to prefer point-to-point
1722 * over loop based upon some soft config options.
1724 * NB: for the 2300, ICBOPT_EXTENDED is required.
1728 * We can't have Fast Posting any more- we now
1729 * have 32 bit handles.
1731 icbp->icb_fwoptions &= ~ICBOPT_FAST_POST;
1732 } else if (IS_2200(isp) || IS_23XX(isp)) {
1733 icbp->icb_fwoptions |= ICBOPT_EXTENDED;
1735 icbp->icb_xfwoptions = fcp->isp_xfwoptions;
1737 if (ISP_CAP_FCTAPE(isp)) {
1738 if (isp->isp_confopts & ISP_CFG_NOFCTAPE)
1739 icbp->icb_xfwoptions &= ~ICBXOPT_FCTAPE;
1741 if (isp->isp_confopts & ISP_CFG_FCTAPE)
1742 icbp->icb_xfwoptions |= ICBXOPT_FCTAPE;
1744 if (icbp->icb_xfwoptions & ICBXOPT_FCTAPE) {
1745 icbp->icb_fwoptions &= ~ICBOPT_FULL_LOGIN; /* per documents */
1746 icbp->icb_xfwoptions |= ICBXOPT_FCTAPE_CCQ|ICBXOPT_FCTAPE_CONFIRM;
1747 FCPARAM(isp, 0)->fctape_enabled = 1;
1749 FCPARAM(isp, 0)->fctape_enabled = 0;
1752 icbp->icb_xfwoptions &= ~ICBXOPT_FCTAPE;
1753 FCPARAM(isp, 0)->fctape_enabled = 0;
1757 * Prefer or force Point-To-Point instead Loop?
1759 switch (isp->isp_confopts & ISP_CFG_PORT_PREF) {
1760 case ISP_CFG_LPORT_ONLY:
1761 icbp->icb_xfwoptions &= ~ICBXOPT_TOPO_MASK;
1762 icbp->icb_xfwoptions |= ICBXOPT_LOOP_ONLY;
1764 case ISP_CFG_NPORT_ONLY:
1765 icbp->icb_xfwoptions &= ~ICBXOPT_TOPO_MASK;
1766 icbp->icb_xfwoptions |= ICBXOPT_PTP_ONLY;
1769 icbp->icb_xfwoptions &= ~ICBXOPT_TOPO_MASK;
1770 icbp->icb_xfwoptions |= ICBXOPT_LOOP_2_PTP;
1773 icbp->icb_xfwoptions &= ~ICBXOPT_TOPO_MASK;
1774 icbp->icb_xfwoptions |= ICBXOPT_PTP_2_LOOP;
1777 /* Let NVRAM settings define it if they are sane */
1778 switch (icbp->icb_xfwoptions & ICBXOPT_TOPO_MASK) {
1779 case ICBXOPT_PTP_2_LOOP:
1780 case ICBXOPT_PTP_ONLY:
1781 case ICBXOPT_LOOP_ONLY:
1782 case ICBXOPT_LOOP_2_PTP:
1785 icbp->icb_xfwoptions &= ~ICBXOPT_TOPO_MASK;
1786 icbp->icb_xfwoptions |= ICBXOPT_LOOP_2_PTP;
1792 * We can't have Fast Posting any more- we now
1793 * have 32 bit handles.
1795 * RIO seemed to have to much breakage.
1797 * Just opt for safety.
1799 icbp->icb_xfwoptions &= ~ICBXOPT_RIO_16BIT;
1800 icbp->icb_fwoptions &= ~ICBOPT_FAST_POST;
1803 * QLogic recommends that FAST Posting be turned
1804 * off for 23XX cards and instead allow the HBA
1805 * to write response queue entries and interrupt
1806 * after a delay (ZIO).
1808 icbp->icb_fwoptions &= ~ICBOPT_FAST_POST;
1809 if ((fcp->isp_xfwoptions & ICBXOPT_TIMER_MASK) == ICBXOPT_ZIO) {
1810 icbp->icb_xfwoptions |= ICBXOPT_ZIO;
1811 icbp->icb_idelaytimer = 10;
1813 icbp->icb_zfwoptions = fcp->isp_zfwoptions;
1814 if (isp->isp_confopts & ISP_CFG_1GB) {
1815 icbp->icb_zfwoptions &= ~ICBZOPT_RATE_MASK;
1816 icbp->icb_zfwoptions |= ICBZOPT_RATE_1GB;
1817 } else if (isp->isp_confopts & ISP_CFG_2GB) {
1818 icbp->icb_zfwoptions &= ~ICBZOPT_RATE_MASK;
1819 icbp->icb_zfwoptions |= ICBZOPT_RATE_2GB;
1821 switch (icbp->icb_zfwoptions & ICBZOPT_RATE_MASK) {
1822 case ICBZOPT_RATE_1GB:
1823 case ICBZOPT_RATE_2GB:
1824 case ICBZOPT_RATE_AUTO:
1827 icbp->icb_zfwoptions &= ~ICBZOPT_RATE_MASK;
1828 icbp->icb_zfwoptions |= ICBZOPT_RATE_AUTO;
1837 * For 22XX > 2.1.26 && 23XX, set some options.
1839 if (ISP_FW_NEWER_THAN(isp, 2, 26, 0)) {
1840 MBSINIT(&mbs, MBOX_SET_FIRMWARE_OPTIONS, MBLOGALL, 0);
1841 mbs.param[1] = IFCOPT1_DISF7SWTCH|IFCOPT1_LIPASYNC|IFCOPT1_LIPF8;
1844 if (ISP_FW_NEWER_THAN(isp, 3, 16, 0)) {
1845 mbs.param[1] |= IFCOPT1_EQFQASYNC|IFCOPT1_CTIO_RETRY;
1846 if (fcp->role & ISP_ROLE_TARGET) {
1847 if (ISP_FW_NEWER_THAN(isp, 3, 25, 0)) {
1848 mbs.param[1] |= IFCOPT1_ENAPURE;
1850 mbs.param[3] = IFCOPT3_NOPRLI;
1853 isp_mboxcmd(isp, &mbs);
1854 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
1858 icbp->icb_logintime = ICB_LOGIN_TOV;
1860 #ifdef ISP_TARGET_MODE
1861 if (icbp->icb_fwoptions & ICBOPT_TGT_ENABLE) {
1862 icbp->icb_lunenables = 0xffff;
1863 icbp->icb_ccnt = 0xff;
1864 icbp->icb_icnt = 0xff;
1865 icbp->icb_lunetimeout = ICB_LUN_ENABLE_TOV;
1868 if (fcp->isp_wwnn && fcp->isp_wwpn) {
1869 icbp->icb_fwoptions |= ICBOPT_BOTH_WWNS;
1870 MAKE_NODE_NAME_FROM_WWN(icbp->icb_nodename, fcp->isp_wwnn);
1871 MAKE_NODE_NAME_FROM_WWN(icbp->icb_portname, fcp->isp_wwpn);
1872 isp_prt(isp, ISP_LOGDEBUG1,
1873 "Setting ICB Node 0x%08x%08x Port 0x%08x%08x",
1874 ((uint32_t) (fcp->isp_wwnn >> 32)),
1875 ((uint32_t) (fcp->isp_wwnn)),
1876 ((uint32_t) (fcp->isp_wwpn >> 32)),
1877 ((uint32_t) (fcp->isp_wwpn)));
1878 } else if (fcp->isp_wwpn) {
1879 icbp->icb_fwoptions &= ~ICBOPT_BOTH_WWNS;
1880 MAKE_NODE_NAME_FROM_WWN(icbp->icb_portname, fcp->isp_wwpn);
1881 isp_prt(isp, ISP_LOGDEBUG1,
1882 "Setting ICB Port 0x%08x%08x",
1883 ((uint32_t) (fcp->isp_wwpn >> 32)),
1884 ((uint32_t) (fcp->isp_wwpn)));
1886 isp_prt(isp, ISP_LOGERR, "No valid WWNs to use");
1889 icbp->icb_rqstqlen = RQUEST_QUEUE_LEN(isp);
1890 if (icbp->icb_rqstqlen < 1) {
1891 isp_prt(isp, ISP_LOGERR, "bad request queue length");
1893 icbp->icb_rsltqlen = RESULT_QUEUE_LEN(isp);
1894 if (icbp->icb_rsltqlen < 1) {
1895 isp_prt(isp, ISP_LOGERR, "bad result queue length");
1897 icbp->icb_rqstaddr[RQRSP_ADDR0015] = DMA_WD0(isp->isp_rquest_dma);
1898 icbp->icb_rqstaddr[RQRSP_ADDR1631] = DMA_WD1(isp->isp_rquest_dma);
1899 icbp->icb_rqstaddr[RQRSP_ADDR3247] = DMA_WD2(isp->isp_rquest_dma);
1900 icbp->icb_rqstaddr[RQRSP_ADDR4863] = DMA_WD3(isp->isp_rquest_dma);
1901 icbp->icb_respaddr[RQRSP_ADDR0015] = DMA_WD0(isp->isp_result_dma);
1902 icbp->icb_respaddr[RQRSP_ADDR1631] = DMA_WD1(isp->isp_result_dma);
1903 icbp->icb_respaddr[RQRSP_ADDR3247] = DMA_WD2(isp->isp_result_dma);
1904 icbp->icb_respaddr[RQRSP_ADDR4863] = DMA_WD3(isp->isp_result_dma);
1906 if (FC_SCRATCH_ACQUIRE(isp, 0)) {
1907 isp_prt(isp, ISP_LOGERR, sacq);
1910 isp_prt(isp, ISP_LOGDEBUG0, "isp_fibre_init: fwopt 0x%x xfwopt 0x%x zfwopt 0x%x",
1911 icbp->icb_fwoptions, icbp->icb_xfwoptions, icbp->icb_zfwoptions);
1913 isp_put_icb(isp, icbp, (isp_icb_t *)fcp->isp_scratch);
1914 if (isp->isp_dblev & ISP_LOGDEBUG1) {
1915 isp_print_bytes(isp, "isp_fibre_init",
1916 sizeof(*icbp), fcp->isp_scratch);
1922 MBSINIT(&mbs, MBOX_INIT_FIRMWARE, MBLOGALL, 30000000);
1924 mbs.param[2] = DMA_WD1(fcp->isp_scdma);
1925 mbs.param[3] = DMA_WD0(fcp->isp_scdma);
1926 mbs.param[6] = DMA_WD3(fcp->isp_scdma);
1927 mbs.param[7] = DMA_WD2(fcp->isp_scdma);
1928 isp_prt(isp, ISP_LOGDEBUG0, "INIT F/W from %p (%08x%08x)",
1929 fcp->isp_scratch, (uint32_t) ((uint64_t)fcp->isp_scdma >> 32),
1930 (uint32_t) fcp->isp_scdma);
1931 MEMORYBARRIER(isp, SYNC_SFORDEV, 0, sizeof (*icbp), 0);
1932 isp_mboxcmd(isp, &mbs);
1933 FC_SCRATCH_RELEASE(isp, 0);
1934 if (mbs.param[0] != MBOX_COMMAND_COMPLETE)
1936 isp->isp_reqidx = 0;
1937 isp->isp_reqodx = 0;
1938 isp->isp_residx = 0;
1939 isp->isp_resodx = 0;
1942 * Whatever happens, we're now committed to being here.
1944 isp->isp_state = ISP_RUNSTATE;
1948 isp_fibre_init_2400(ispsoftc_t *isp)
1951 isp_icb_2400_t local, *icbp = &local;
1956 * Check to see whether all channels have *some* kind of role
1958 for (chan = 0; chan < isp->isp_nchan; chan++) {
1959 fcp = FCPARAM(isp, chan);
1960 if (fcp->role != ISP_ROLE_NONE) {
1964 if (chan == isp->isp_nchan) {
1965 isp_prt(isp, ISP_LOG_WARN1, "all %d channels with role 'none'", chan);
1969 isp->isp_state = ISP_INITSTATE;
1972 * Start with channel 0.
1974 fcp = FCPARAM(isp, 0);
1977 * Turn on LIP F8 async event (1)
1979 MBSINIT(&mbs, MBOX_SET_FIRMWARE_OPTIONS, MBLOGALL, 0);
1981 isp_mboxcmd(isp, &mbs);
1982 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
1986 ISP_MEMZERO(icbp, sizeof (*icbp));
1987 icbp->icb_fwoptions1 = fcp->isp_fwoptions;
1988 icbp->icb_fwoptions2 = fcp->isp_xfwoptions;
1989 icbp->icb_fwoptions3 = fcp->isp_zfwoptions;
1990 if (isp->isp_nchan > 1 && ISP_CAP_VP0(isp)) {
1991 icbp->icb_fwoptions1 &= ~ICB2400_OPT1_INI_DISABLE;
1992 icbp->icb_fwoptions1 |= ICB2400_OPT1_TGT_ENABLE;
1994 if (fcp->role & ISP_ROLE_TARGET)
1995 icbp->icb_fwoptions1 |= ICB2400_OPT1_TGT_ENABLE;
1997 icbp->icb_fwoptions1 &= ~ICB2400_OPT1_TGT_ENABLE;
1998 if (fcp->role & ISP_ROLE_INITIATOR)
1999 icbp->icb_fwoptions1 &= ~ICB2400_OPT1_INI_DISABLE;
2001 icbp->icb_fwoptions1 |= ICB2400_OPT1_INI_DISABLE;
2004 icbp->icb_version = ICB_VERSION1;
2005 icbp->icb_maxfrmlen = DEFAULT_FRAMESIZE(isp);
2006 if (icbp->icb_maxfrmlen < ICB_MIN_FRMLEN || icbp->icb_maxfrmlen > ICB_MAX_FRMLEN) {
2007 isp_prt(isp, ISP_LOGERR, "bad frame length (%d) from NVRAM- using %d", DEFAULT_FRAMESIZE(isp), ICB_DFLT_FRMLEN);
2008 icbp->icb_maxfrmlen = ICB_DFLT_FRMLEN;
2011 icbp->icb_execthrottle = DEFAULT_EXEC_THROTTLE(isp);
2012 if (icbp->icb_execthrottle < 1) {
2013 isp_prt(isp, ISP_LOGERR, "bad execution throttle of %d- using %d", DEFAULT_EXEC_THROTTLE(isp), ICB_DFLT_THROTTLE);
2014 icbp->icb_execthrottle = ICB_DFLT_THROTTLE;
2018 * Set target exchange count. Take half if we are supporting both roles.
2020 if (icbp->icb_fwoptions1 & ICB2400_OPT1_TGT_ENABLE) {
2021 icbp->icb_xchgcnt = isp->isp_maxcmds;
2022 if ((icbp->icb_fwoptions1 & ICB2400_OPT1_INI_DISABLE) == 0)
2023 icbp->icb_xchgcnt >>= 1;
2026 if (fcp->isp_loopid < LOCAL_LOOP_LIM) {
2027 icbp->icb_hardaddr = fcp->isp_loopid;
2028 if (isp->isp_confopts & ISP_CFG_OWNLOOPID)
2029 icbp->icb_fwoptions1 |= ICB2400_OPT1_HARD_ADDRESS;
2031 icbp->icb_fwoptions1 |= ICB2400_OPT1_PREV_ADDRESS;
2034 if (isp->isp_confopts & ISP_CFG_NOFCTAPE) {
2035 icbp->icb_fwoptions2 &= ~ICB2400_OPT2_FCTAPE;
2037 if (isp->isp_confopts & ISP_CFG_FCTAPE) {
2038 icbp->icb_fwoptions2 |= ICB2400_OPT2_FCTAPE;
2041 for (chan = 0; chan < isp->isp_nchan; chan++) {
2042 if (icbp->icb_fwoptions2 & ICB2400_OPT2_FCTAPE)
2043 FCPARAM(isp, chan)->fctape_enabled = 1;
2045 FCPARAM(isp, chan)->fctape_enabled = 0;
2048 switch (isp->isp_confopts & ISP_CFG_PORT_PREF) {
2049 case ISP_CFG_LPORT_ONLY:
2050 icbp->icb_fwoptions2 &= ~ICB2400_OPT2_TOPO_MASK;
2051 icbp->icb_fwoptions2 |= ICB2400_OPT2_LOOP_ONLY;
2053 case ISP_CFG_NPORT_ONLY:
2054 icbp->icb_fwoptions2 &= ~ICB2400_OPT2_TOPO_MASK;
2055 icbp->icb_fwoptions2 |= ICB2400_OPT2_PTP_ONLY;
2058 /* ISP_CFG_PTP_2_LOOP not available in 24XX/25XX */
2060 icbp->icb_fwoptions2 &= ~ICB2400_OPT2_TOPO_MASK;
2061 icbp->icb_fwoptions2 |= ICB2400_OPT2_LOOP_2_PTP;
2064 /* Let NVRAM settings define it if they are sane */
2065 switch (icbp->icb_fwoptions2 & ICB2400_OPT2_TOPO_MASK) {
2066 case ICB2400_OPT2_LOOP_ONLY:
2067 case ICB2400_OPT2_PTP_ONLY:
2068 case ICB2400_OPT2_LOOP_2_PTP:
2071 icbp->icb_fwoptions2 &= ~ICB2400_OPT2_TOPO_MASK;
2072 icbp->icb_fwoptions2 |= ICB2400_OPT2_LOOP_2_PTP;
2077 switch (icbp->icb_fwoptions2 & ICB2400_OPT2_TIMER_MASK) {
2078 case ICB2400_OPT2_ZIO:
2079 case ICB2400_OPT2_ZIO1:
2080 icbp->icb_idelaytimer = 0;
2085 isp_prt(isp, ISP_LOGWARN, "bad value %x in fwopt2 timer field", icbp->icb_fwoptions2 & ICB2400_OPT2_TIMER_MASK);
2086 icbp->icb_fwoptions2 &= ~ICB2400_OPT2_TIMER_MASK;
2091 /* Use handshake to reduce global lock congestion. */
2092 icbp->icb_fwoptions2 |= ICB2400_OPT2_ENA_IHR;
2093 icbp->icb_fwoptions2 |= ICB2400_OPT2_ENA_IHA;
2096 if ((icbp->icb_fwoptions3 & ICB2400_OPT3_RSPSZ_MASK) == 0) {
2097 icbp->icb_fwoptions3 |= ICB2400_OPT3_RSPSZ_24;
2099 if (isp->isp_confopts & ISP_CFG_1GB) {
2100 icbp->icb_fwoptions3 &= ~ICB2400_OPT3_RATE_MASK;
2101 icbp->icb_fwoptions3 |= ICB2400_OPT3_RATE_1GB;
2102 } else if (isp->isp_confopts & ISP_CFG_2GB) {
2103 icbp->icb_fwoptions3 &= ~ICB2400_OPT3_RATE_MASK;
2104 icbp->icb_fwoptions3 |= ICB2400_OPT3_RATE_2GB;
2105 } else if (isp->isp_confopts & ISP_CFG_4GB) {
2106 icbp->icb_fwoptions3 &= ~ICB2400_OPT3_RATE_MASK;
2107 icbp->icb_fwoptions3 |= ICB2400_OPT3_RATE_4GB;
2108 } else if (isp->isp_confopts & ISP_CFG_8GB) {
2109 icbp->icb_fwoptions3 &= ~ICB2400_OPT3_RATE_MASK;
2110 icbp->icb_fwoptions3 |= ICB2400_OPT3_RATE_8GB;
2111 } else if (isp->isp_confopts & ISP_CFG_16GB) {
2112 icbp->icb_fwoptions3 &= ~ICB2400_OPT3_RATE_MASK;
2113 icbp->icb_fwoptions3 |= ICB2400_OPT3_RATE_16GB;
2115 switch (icbp->icb_fwoptions3 & ICB2400_OPT3_RATE_MASK) {
2116 case ICB2400_OPT3_RATE_4GB:
2117 case ICB2400_OPT3_RATE_8GB:
2118 case ICB2400_OPT3_RATE_16GB:
2119 case ICB2400_OPT3_RATE_AUTO:
2121 case ICB2400_OPT3_RATE_2GB:
2122 if (isp->isp_type <= ISP_HA_FC_2500)
2125 case ICB2400_OPT3_RATE_1GB:
2126 if (isp->isp_type <= ISP_HA_FC_2400)
2130 icbp->icb_fwoptions3 &= ~ICB2400_OPT3_RATE_MASK;
2131 icbp->icb_fwoptions3 |= ICB2400_OPT3_RATE_AUTO;
2135 icbp->icb_logintime = ICB_LOGIN_TOV;
2137 if (fcp->isp_wwnn && fcp->isp_wwpn) {
2138 icbp->icb_fwoptions1 |= ICB2400_OPT1_BOTH_WWNS;
2139 MAKE_NODE_NAME_FROM_WWN(icbp->icb_portname, fcp->isp_wwpn);
2140 MAKE_NODE_NAME_FROM_WWN(icbp->icb_nodename, fcp->isp_wwnn);
2141 isp_prt(isp, ISP_LOGDEBUG1, "Setting ICB Node 0x%08x%08x Port 0x%08x%08x", ((uint32_t) (fcp->isp_wwnn >> 32)), ((uint32_t) (fcp->isp_wwnn)),
2142 ((uint32_t) (fcp->isp_wwpn >> 32)), ((uint32_t) (fcp->isp_wwpn)));
2143 } else if (fcp->isp_wwpn) {
2144 icbp->icb_fwoptions1 &= ~ICB2400_OPT1_BOTH_WWNS;
2145 MAKE_NODE_NAME_FROM_WWN(icbp->icb_portname, fcp->isp_wwpn);
2146 isp_prt(isp, ISP_LOGDEBUG1, "Setting ICB Node to be same as Port 0x%08x%08x", ((uint32_t) (fcp->isp_wwpn >> 32)), ((uint32_t) (fcp->isp_wwpn)));
2148 isp_prt(isp, ISP_LOGERR, "No valid WWNs to use");
2151 icbp->icb_retry_count = fcp->isp_retry_count;
2153 icbp->icb_rqstqlen = RQUEST_QUEUE_LEN(isp);
2154 if (icbp->icb_rqstqlen < 8) {
2155 isp_prt(isp, ISP_LOGERR, "bad request queue length %d", icbp->icb_rqstqlen);
2158 icbp->icb_rsltqlen = RESULT_QUEUE_LEN(isp);
2159 if (icbp->icb_rsltqlen < 8) {
2160 isp_prt(isp, ISP_LOGERR, "bad result queue length %d",
2161 icbp->icb_rsltqlen);
2164 icbp->icb_rqstaddr[RQRSP_ADDR0015] = DMA_WD0(isp->isp_rquest_dma);
2165 icbp->icb_rqstaddr[RQRSP_ADDR1631] = DMA_WD1(isp->isp_rquest_dma);
2166 icbp->icb_rqstaddr[RQRSP_ADDR3247] = DMA_WD2(isp->isp_rquest_dma);
2167 icbp->icb_rqstaddr[RQRSP_ADDR4863] = DMA_WD3(isp->isp_rquest_dma);
2169 icbp->icb_respaddr[RQRSP_ADDR0015] = DMA_WD0(isp->isp_result_dma);
2170 icbp->icb_respaddr[RQRSP_ADDR1631] = DMA_WD1(isp->isp_result_dma);
2171 icbp->icb_respaddr[RQRSP_ADDR3247] = DMA_WD2(isp->isp_result_dma);
2172 icbp->icb_respaddr[RQRSP_ADDR4863] = DMA_WD3(isp->isp_result_dma);
2174 #ifdef ISP_TARGET_MODE
2175 /* unconditionally set up the ATIO queue if we support target mode */
2176 icbp->icb_atioqlen = RESULT_QUEUE_LEN(isp);
2177 if (icbp->icb_atioqlen < 8) {
2178 isp_prt(isp, ISP_LOGERR, "bad ATIO queue length %d", icbp->icb_atioqlen);
2181 icbp->icb_atioqaddr[RQRSP_ADDR0015] = DMA_WD0(isp->isp_atioq_dma);
2182 icbp->icb_atioqaddr[RQRSP_ADDR1631] = DMA_WD1(isp->isp_atioq_dma);
2183 icbp->icb_atioqaddr[RQRSP_ADDR3247] = DMA_WD2(isp->isp_atioq_dma);
2184 icbp->icb_atioqaddr[RQRSP_ADDR4863] = DMA_WD3(isp->isp_atioq_dma);
2185 isp_prt(isp, ISP_LOGDEBUG0, "isp_fibre_init_2400: atioq %04x%04x%04x%04x", DMA_WD3(isp->isp_atioq_dma), DMA_WD2(isp->isp_atioq_dma),
2186 DMA_WD1(isp->isp_atioq_dma), DMA_WD0(isp->isp_atioq_dma));
2189 if (ISP_CAP_MSIX(isp) && isp->isp_nirq >= 2) {
2190 icbp->icb_msixresp = 1;
2191 if (IS_26XX(isp) && isp->isp_nirq >= 3)
2192 icbp->icb_msixatio = 2;
2195 isp_prt(isp, ISP_LOGDEBUG0, "isp_fibre_init_2400: fwopt1 0x%x fwopt2 0x%x fwopt3 0x%x", icbp->icb_fwoptions1, icbp->icb_fwoptions2, icbp->icb_fwoptions3);
2197 isp_prt(isp, ISP_LOGDEBUG0, "isp_fibre_init_2400: rqst %04x%04x%04x%04x rsp %04x%04x%04x%04x", DMA_WD3(isp->isp_rquest_dma), DMA_WD2(isp->isp_rquest_dma),
2198 DMA_WD1(isp->isp_rquest_dma), DMA_WD0(isp->isp_rquest_dma), DMA_WD3(isp->isp_result_dma), DMA_WD2(isp->isp_result_dma),
2199 DMA_WD1(isp->isp_result_dma), DMA_WD0(isp->isp_result_dma));
2201 if (FC_SCRATCH_ACQUIRE(isp, 0)) {
2202 isp_prt(isp, ISP_LOGERR, sacq);
2205 ISP_MEMZERO(fcp->isp_scratch, ISP_FC_SCRLEN);
2206 isp_put_icb_2400(isp, icbp, fcp->isp_scratch);
2207 if (isp->isp_dblev & ISP_LOGDEBUG1) {
2208 isp_print_bytes(isp, "isp_fibre_init_2400",
2209 sizeof (*icbp), fcp->isp_scratch);
2213 * Now fill in information about any additional channels
2215 if (isp->isp_nchan > 1) {
2216 isp_icb_2400_vpinfo_t vpinfo, *vdst;
2217 vp_port_info_t pi, *pdst;
2221 vpinfo.vp_global_options = ICB2400_VPGOPT_GEN_RIDA;
2222 if (ISP_CAP_VP0(isp)) {
2223 vpinfo.vp_global_options |= ICB2400_VPGOPT_VP0_DECOUPLE;
2224 vpinfo.vp_count = isp->isp_nchan;
2227 vpinfo.vp_count = isp->isp_nchan - 1;
2230 off = fcp->isp_scratch;
2231 off += ICB2400_VPINFO_OFF;
2232 vdst = (isp_icb_2400_vpinfo_t *) off;
2233 isp_put_icb_2400_vpinfo(isp, &vpinfo, vdst);
2234 amt = ICB2400_VPINFO_OFF + sizeof (isp_icb_2400_vpinfo_t);
2235 for (; chan < isp->isp_nchan; chan++) {
2238 ISP_MEMZERO(&pi, sizeof (pi));
2239 fcp2 = FCPARAM(isp, chan);
2240 if (fcp2->role != ISP_ROLE_NONE) {
2241 pi.vp_port_options = ICB2400_VPOPT_ENABLED |
2242 ICB2400_VPOPT_ENA_SNSLOGIN;
2243 if (fcp2->role & ISP_ROLE_INITIATOR)
2244 pi.vp_port_options |= ICB2400_VPOPT_INI_ENABLE;
2245 if ((fcp2->role & ISP_ROLE_TARGET) == 0)
2246 pi.vp_port_options |= ICB2400_VPOPT_TGT_DISABLE;
2248 if (fcp2->isp_loopid < LOCAL_LOOP_LIM) {
2249 pi.vp_port_loopid = fcp2->isp_loopid;
2250 if (isp->isp_confopts & ISP_CFG_OWNLOOPID)
2251 pi.vp_port_options |= ICB2400_VPOPT_HARD_ADDRESS;
2253 pi.vp_port_options |= ICB2400_VPOPT_PREV_ADDRESS;
2255 MAKE_NODE_NAME_FROM_WWN(pi.vp_port_portname, fcp2->isp_wwpn);
2256 MAKE_NODE_NAME_FROM_WWN(pi.vp_port_nodename, fcp2->isp_wwnn);
2257 off = fcp->isp_scratch;
2258 if (ISP_CAP_VP0(isp))
2259 off += ICB2400_VPINFO_PORT_OFF(chan);
2261 off += ICB2400_VPINFO_PORT_OFF(chan - 1);
2262 pdst = (vp_port_info_t *) off;
2263 isp_put_vp_port_info(isp, &pi, pdst);
2264 amt += ICB2400_VPOPT_WRITE_SIZE;
2266 if (isp->isp_dblev & ISP_LOGDEBUG1) {
2267 isp_print_bytes(isp, "isp_fibre_init_2400",
2268 amt - ICB2400_VPINFO_OFF,
2269 (char *)fcp->isp_scratch + ICB2400_VPINFO_OFF);
2276 MBSINIT(&mbs, 0, MBLOGALL, 30000000);
2277 if (isp->isp_nchan > 1) {
2278 mbs.param[0] = MBOX_INIT_FIRMWARE_MULTI_ID;
2280 mbs.param[0] = MBOX_INIT_FIRMWARE;
2283 mbs.param[2] = DMA_WD1(fcp->isp_scdma);
2284 mbs.param[3] = DMA_WD0(fcp->isp_scdma);
2285 mbs.param[6] = DMA_WD3(fcp->isp_scdma);
2286 mbs.param[7] = DMA_WD2(fcp->isp_scdma);
2287 isp_prt(isp, ISP_LOGDEBUG0, "INIT F/W from %04x%04x%04x%04x", DMA_WD3(fcp->isp_scdma), DMA_WD2(fcp->isp_scdma), DMA_WD1(fcp->isp_scdma), DMA_WD0(fcp->isp_scdma));
2288 MEMORYBARRIER(isp, SYNC_SFORDEV, 0, sizeof (*icbp), 0);
2289 isp_mboxcmd(isp, &mbs);
2290 FC_SCRATCH_RELEASE(isp, 0);
2292 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
2295 isp->isp_reqidx = 0;
2296 isp->isp_reqodx = 0;
2297 isp->isp_residx = 0;
2298 isp->isp_resodx = 0;
2299 isp->isp_atioodx = 0;
2302 * Whatever happens, we're now committed to being here.
2304 isp->isp_state = ISP_RUNSTATE;
2308 isp_fc_enable_vp(ispsoftc_t *isp, int chan)
2310 fcparam *fcp = FCPARAM(isp, chan);
2313 uint8_t resp[QENTRY_LEN];
2315 /* Build a VP MODIFY command in memory */
2316 ISP_MEMZERO(&vp, sizeof(vp));
2317 vp.vp_mod_hdr.rqs_entry_type = RQSTYPE_VP_MODIFY;
2318 vp.vp_mod_hdr.rqs_entry_count = 1;
2320 vp.vp_mod_idx0 = chan;
2321 vp.vp_mod_cmd = VP_MODIFY_ENA;
2322 vp.vp_mod_ports[0].options = ICB2400_VPOPT_ENABLED |
2323 ICB2400_VPOPT_ENA_SNSLOGIN;
2324 if (fcp->role & ISP_ROLE_INITIATOR)
2325 vp.vp_mod_ports[0].options |= ICB2400_VPOPT_INI_ENABLE;
2326 if ((fcp->role & ISP_ROLE_TARGET) == 0)
2327 vp.vp_mod_ports[0].options |= ICB2400_VPOPT_TGT_DISABLE;
2328 if (fcp->isp_loopid < LOCAL_LOOP_LIM) {
2329 vp.vp_mod_ports[0].loopid = fcp->isp_loopid;
2330 if (isp->isp_confopts & ISP_CFG_OWNLOOPID)
2331 vp.vp_mod_ports[0].options |= ICB2400_VPOPT_HARD_ADDRESS;
2333 vp.vp_mod_ports[0].options |= ICB2400_VPOPT_PREV_ADDRESS;
2335 MAKE_NODE_NAME_FROM_WWN(vp.vp_mod_ports[0].wwpn, fcp->isp_wwpn);
2336 MAKE_NODE_NAME_FROM_WWN(vp.vp_mod_ports[0].wwnn, fcp->isp_wwnn);
2338 /* Prepare space for response in memory */
2339 memset(resp, 0xff, sizeof(resp));
2340 vp.vp_mod_hdl = isp_allocate_handle(isp, resp, ISP_HANDLE_CTRL);
2341 if (vp.vp_mod_hdl == 0) {
2342 isp_prt(isp, ISP_LOGERR,
2343 "%s: VP_MODIFY of Chan %d out of handles", __func__, chan);
2347 /* Send request and wait for response. */
2348 reqp = isp_getrqentry(isp);
2350 isp_prt(isp, ISP_LOGERR,
2351 "%s: VP_MODIFY of Chan %d out of rqent", __func__, chan);
2352 isp_destroy_handle(isp, vp.vp_mod_hdl);
2355 isp_put_vp_modify(isp, &vp, (vp_modify_t *)reqp);
2356 if (isp->isp_dblev & ISP_LOGDEBUG1)
2357 isp_print_bytes(isp, "IOCB VP_MODIFY", QENTRY_LEN, reqp);
2358 ISP_SYNC_REQUEST(isp);
2359 if (msleep(resp, &isp->isp_lock, 0, "VP_MODIFY", 5*hz) == EWOULDBLOCK) {
2360 isp_prt(isp, ISP_LOGERR,
2361 "%s: VP_MODIFY of Chan %d timed out", __func__, chan);
2362 isp_destroy_handle(isp, vp.vp_mod_hdl);
2365 if (isp->isp_dblev & ISP_LOGDEBUG1)
2366 isp_print_bytes(isp, "IOCB VP_MODIFY response", QENTRY_LEN, resp);
2367 isp_get_vp_modify(isp, (vp_modify_t *)resp, &vp);
2369 if (vp.vp_mod_hdr.rqs_flags != 0 || vp.vp_mod_status != VP_STS_OK) {
2370 isp_prt(isp, ISP_LOGERR,
2371 "%s: VP_MODIFY of Chan %d failed with flags %x status %d",
2372 __func__, chan, vp.vp_mod_hdr.rqs_flags, vp.vp_mod_status);
2379 isp_fc_disable_vp(ispsoftc_t *isp, int chan)
2383 uint8_t resp[QENTRY_LEN];
2385 /* Build a VP CTRL command in memory */
2386 ISP_MEMZERO(&vp, sizeof(vp));
2387 vp.vp_ctrl_hdr.rqs_entry_type = RQSTYPE_VP_CTRL;
2388 vp.vp_ctrl_hdr.rqs_entry_count = 1;
2389 if (ISP_CAP_VP0(isp)) {
2390 vp.vp_ctrl_status = 1;
2392 vp.vp_ctrl_status = 0;
2393 chan--; /* VP0 can not be controlled in this case. */
2395 vp.vp_ctrl_command = VP_CTRL_CMD_DISABLE_VP_LOGO_ALL;
2396 vp.vp_ctrl_vp_count = 1;
2397 vp.vp_ctrl_idmap[chan / 16] |= (1 << chan % 16);
2399 /* Prepare space for response in memory */
2400 memset(resp, 0xff, sizeof(resp));
2401 vp.vp_ctrl_handle = isp_allocate_handle(isp, resp, ISP_HANDLE_CTRL);
2402 if (vp.vp_ctrl_handle == 0) {
2403 isp_prt(isp, ISP_LOGERR,
2404 "%s: VP_CTRL of Chan %d out of handles", __func__, chan);
2408 /* Send request and wait for response. */
2409 reqp = isp_getrqentry(isp);
2411 isp_prt(isp, ISP_LOGERR,
2412 "%s: VP_CTRL of Chan %d out of rqent", __func__, chan);
2413 isp_destroy_handle(isp, vp.vp_ctrl_handle);
2416 isp_put_vp_ctrl_info(isp, &vp, (vp_ctrl_info_t *)reqp);
2417 if (isp->isp_dblev & ISP_LOGDEBUG1)
2418 isp_print_bytes(isp, "IOCB VP_CTRL", QENTRY_LEN, reqp);
2419 ISP_SYNC_REQUEST(isp);
2420 if (msleep(resp, &isp->isp_lock, 0, "VP_CTRL", 5*hz) == EWOULDBLOCK) {
2421 isp_prt(isp, ISP_LOGERR,
2422 "%s: VP_CTRL of Chan %d timed out", __func__, chan);
2423 isp_destroy_handle(isp, vp.vp_ctrl_handle);
2426 if (isp->isp_dblev & ISP_LOGDEBUG1)
2427 isp_print_bytes(isp, "IOCB VP_CTRL response", QENTRY_LEN, resp);
2428 isp_get_vp_ctrl_info(isp, (vp_ctrl_info_t *)resp, &vp);
2430 if (vp.vp_ctrl_hdr.rqs_flags != 0 || vp.vp_ctrl_status != 0) {
2431 isp_prt(isp, ISP_LOGERR,
2432 "%s: VP_CTRL of Chan %d failed with flags %x status %d %d",
2433 __func__, chan, vp.vp_ctrl_hdr.rqs_flags,
2434 vp.vp_ctrl_status, vp.vp_ctrl_index_fail);
2441 isp_fc_change_role(ispsoftc_t *isp, int chan, int new_role)
2443 fcparam *fcp = FCPARAM(isp, chan);
2444 int i, was, res = 0;
2446 if (chan >= isp->isp_nchan) {
2447 isp_prt(isp, ISP_LOGWARN, "%s: bad channel %d", __func__, chan);
2450 if (fcp->role == new_role)
2452 for (was = 0, i = 0; i < isp->isp_nchan; i++) {
2453 if (FCPARAM(isp, i)->role != ISP_ROLE_NONE)
2456 if (was == 0 || (was == 1 && fcp->role != ISP_ROLE_NONE)) {
2457 fcp->role = new_role;
2458 return (isp_reinit(isp, 0));
2460 if (fcp->role != ISP_ROLE_NONE) {
2461 res = isp_fc_disable_vp(isp, chan);
2462 isp_clear_portdb(isp, chan);
2464 fcp->role = new_role;
2465 if (fcp->role != ISP_ROLE_NONE)
2466 res = isp_fc_enable_vp(isp, chan);
2471 isp_clear_portdb(ispsoftc_t *isp, int chan)
2473 fcparam *fcp = FCPARAM(isp, chan);
2477 for (i = 0; i < MAX_FC_TARG; i++) {
2478 lp = &fcp->portdb[i];
2479 switch (lp->state) {
2480 case FC_PORTDB_STATE_DEAD:
2481 case FC_PORTDB_STATE_CHANGED:
2482 case FC_PORTDB_STATE_VALID:
2483 lp->state = FC_PORTDB_STATE_NIL;
2484 isp_async(isp, ISPASYNC_DEV_GONE, chan, lp);
2486 case FC_PORTDB_STATE_NIL:
2487 case FC_PORTDB_STATE_NEW:
2488 lp->state = FC_PORTDB_STATE_NIL;
2490 case FC_PORTDB_STATE_ZOMBIE:
2493 panic("Don't know how to clear state %d\n", lp->state);
2499 isp_mark_portdb(ispsoftc_t *isp, int chan)
2501 fcparam *fcp = FCPARAM(isp, chan);
2505 for (i = 0; i < MAX_FC_TARG; i++) {
2506 lp = &fcp->portdb[i];
2507 if (lp->state == FC_PORTDB_STATE_NIL)
2509 if (lp->portid >= DOMAIN_CONTROLLER_BASE &&
2510 lp->portid <= DOMAIN_CONTROLLER_END)
2512 fcp->portdb[i].probational = 1;
2517 * Perform an IOCB PLOGI or LOGO via EXECUTE IOCB A64 for 24XX cards
2518 * or via FABRIC LOGIN/FABRIC LOGOUT for other cards.
2521 isp_plogx(ispsoftc_t *isp, int chan, uint16_t handle, uint32_t portid, int flags)
2525 uint8_t resp[QENTRY_LEN];
2526 uint32_t sst, parm1;
2531 isp_prt(isp, ISP_LOG_SANCFG, "Chan %d PLOGX %s PortID 0x%06x nphdl 0x%x",
2532 chan, (flags & PLOGX_FLG_CMD_MASK) == PLOGX_FLG_CMD_PLOGI ?
2533 "Login":"Logout", portid, handle);
2534 if (!IS_24XX(isp)) {
2535 int action = flags & PLOGX_FLG_CMD_MASK;
2536 if (action == PLOGX_FLG_CMD_PLOGI) {
2537 return (isp_port_login(isp, handle, portid));
2538 } else if (action == PLOGX_FLG_CMD_LOGO) {
2539 return (isp_port_logout(isp, handle, portid));
2541 return (MBOX_INVALID_COMMAND);
2545 ISP_MEMZERO(&pl, sizeof(pl));
2546 pl.plogx_header.rqs_entry_count = 1;
2547 pl.plogx_header.rqs_entry_type = RQSTYPE_LOGIN;
2548 pl.plogx_nphdl = handle;
2549 pl.plogx_vphdl = chan;
2550 pl.plogx_portlo = portid;
2551 pl.plogx_rspsz_porthi = (portid >> 16) & 0xff;
2552 pl.plogx_flags = flags;
2554 /* Prepare space for response in memory */
2555 memset(resp, 0xff, sizeof(resp));
2556 pl.plogx_handle = isp_allocate_handle(isp, resp, ISP_HANDLE_CTRL);
2557 if (pl.plogx_handle == 0) {
2558 isp_prt(isp, ISP_LOGERR,
2559 "%s: PLOGX of Chan %d out of handles", __func__, chan);
2563 /* Send request and wait for response. */
2564 reqp = isp_getrqentry(isp);
2566 isp_prt(isp, ISP_LOGERR,
2567 "%s: PLOGX of Chan %d out of rqent", __func__, chan);
2568 isp_destroy_handle(isp, pl.plogx_handle);
2571 isp_put_plogx(isp, &pl, (isp_plogx_t *)reqp);
2572 if (isp->isp_dblev & ISP_LOGDEBUG1)
2573 isp_print_bytes(isp, "IOCB LOGX", QENTRY_LEN, reqp);
2574 FCPARAM(isp, chan)->isp_login_hdl = handle;
2575 ISP_SYNC_REQUEST(isp);
2576 if (msleep(resp, &isp->isp_lock, 0, "PLOGX", 3 * ICB_LOGIN_TOV * hz)
2578 isp_prt(isp, ISP_LOGERR,
2579 "%s: PLOGX of Chan %d timed out", __func__, chan);
2580 isp_destroy_handle(isp, pl.plogx_handle);
2583 FCPARAM(isp, chan)->isp_login_hdl = NIL_HANDLE;
2584 if (isp->isp_dblev & ISP_LOGDEBUG1)
2585 isp_print_bytes(isp, "IOCB LOGX response", QENTRY_LEN, resp);
2586 isp_get_plogx(isp, (isp_plogx_t *)resp, &pl);
2588 if (pl.plogx_status == PLOGX_STATUS_OK) {
2590 } else if (pl.plogx_status != PLOGX_STATUS_IOCBERR) {
2591 isp_prt(isp, ISP_LOGWARN,
2592 "status 0x%x on port login IOCB channel %d",
2593 pl.plogx_status, chan);
2597 sst = pl.plogx_ioparm[0].lo16 | (pl.plogx_ioparm[0].hi16 << 16);
2598 parm1 = pl.plogx_ioparm[1].lo16 | (pl.plogx_ioparm[1].hi16 << 16);
2605 case PLOGX_IOCBERR_NOLINK:
2608 case PLOGX_IOCBERR_NOIOCB:
2609 msg = "no IOCB buffer";
2611 case PLOGX_IOCBERR_NOXGHG:
2612 msg = "no Exchange Control Block";
2614 case PLOGX_IOCBERR_FAILED:
2615 ISP_SNPRINTF(buf, sizeof (buf), "reason 0x%x (last LOGIN state 0x%x)", parm1 & 0xff, (parm1 >> 8) & 0xff);
2618 case PLOGX_IOCBERR_NOFABRIC:
2621 case PLOGX_IOCBERR_NOTREADY:
2622 msg = "firmware not ready";
2624 case PLOGX_IOCBERR_NOLOGIN:
2625 ISP_SNPRINTF(buf, sizeof (buf), "not logged in (last state 0x%x)", parm1);
2627 rval = MBOX_NOT_LOGGED_IN;
2629 case PLOGX_IOCBERR_REJECT:
2630 ISP_SNPRINTF(buf, sizeof (buf), "LS_RJT = 0x%x", parm1);
2633 case PLOGX_IOCBERR_NOPCB:
2634 msg = "no PCB allocated";
2636 case PLOGX_IOCBERR_EINVAL:
2637 ISP_SNPRINTF(buf, sizeof (buf), "invalid parameter at offset 0x%x", parm1);
2640 case PLOGX_IOCBERR_PORTUSED:
2641 lev = ISP_LOG_SANCFG|ISP_LOG_WARN1;
2642 ISP_SNPRINTF(buf, sizeof (buf), "already logged in with N-Port handle 0x%x", parm1);
2644 rval = MBOX_PORT_ID_USED | (parm1 << 16);
2646 case PLOGX_IOCBERR_HNDLUSED:
2647 lev = ISP_LOG_SANCFG|ISP_LOG_WARN1;
2648 ISP_SNPRINTF(buf, sizeof (buf), "handle already used for PortID 0x%06x", parm1);
2650 rval = MBOX_LOOP_ID_USED;
2652 case PLOGX_IOCBERR_NOHANDLE:
2653 msg = "no handle allocated";
2655 case PLOGX_IOCBERR_NOFLOGI:
2656 msg = "no FLOGI_ACC";
2659 ISP_SNPRINTF(buf, sizeof (buf), "status %x from %x", pl.plogx_status, flags);
2664 isp_prt(isp, lev, "Chan %d PLOGX PortID 0x%06x to N-Port handle 0x%x: %s",
2665 chan, portid, handle, msg);
2671 isp_port_login(ispsoftc_t *isp, uint16_t handle, uint32_t portid)
2675 MBSINIT(&mbs, MBOX_FABRIC_LOGIN, MBLOGNONE, 500000);
2676 if (ISP_CAP_2KLOGIN(isp)) {
2677 mbs.param[1] = handle;
2678 mbs.ibits = (1 << 10);
2680 mbs.param[1] = handle << 8;
2682 mbs.param[2] = portid >> 16;
2683 mbs.param[3] = portid;
2684 mbs.logval = MBLOGNONE;
2685 mbs.timeout = 500000;
2686 isp_mboxcmd(isp, &mbs);
2688 switch (mbs.param[0]) {
2689 case MBOX_PORT_ID_USED:
2690 isp_prt(isp, ISP_LOG_SANCFG|ISP_LOG_WARN1, "isp_port_login: portid 0x%06x already logged in as 0x%x", portid, mbs.param[1]);
2691 return (MBOX_PORT_ID_USED | (mbs.param[1] << 16));
2693 case MBOX_LOOP_ID_USED:
2694 isp_prt(isp, ISP_LOG_SANCFG|ISP_LOG_WARN1, "isp_port_login: handle 0x%x in use for port id 0x%02xXXXX", handle, mbs.param[1] & 0xff);
2695 return (MBOX_LOOP_ID_USED);
2697 case MBOX_COMMAND_COMPLETE:
2700 case MBOX_COMMAND_ERROR:
2701 isp_prt(isp, ISP_LOG_SANCFG|ISP_LOG_WARN1, "isp_port_login: error 0x%x in PLOGI to port 0x%06x", mbs.param[1], portid);
2702 return (MBOX_COMMAND_ERROR);
2704 case MBOX_ALL_IDS_USED:
2705 isp_prt(isp, ISP_LOG_SANCFG|ISP_LOG_WARN1, "isp_port_login: all IDs used for fabric login");
2706 return (MBOX_ALL_IDS_USED);
2709 isp_prt(isp, ISP_LOG_SANCFG, "isp_port_login: error 0x%x on port login of 0x%06x@0x%0x", mbs.param[0], portid, handle);
2710 return (mbs.param[0]);
2715 * Pre-24XX fabric port logout
2717 * Note that portid is not used
2720 isp_port_logout(ispsoftc_t *isp, uint16_t handle, uint32_t portid)
2724 MBSINIT(&mbs, MBOX_FABRIC_LOGOUT, MBLOGNONE, 500000);
2725 if (ISP_CAP_2KLOGIN(isp)) {
2726 mbs.param[1] = handle;
2727 mbs.ibits = (1 << 10);
2729 mbs.param[1] = handle << 8;
2731 isp_mboxcmd(isp, &mbs);
2732 return (mbs.param[0] == MBOX_COMMAND_COMPLETE? 0 : mbs.param[0]);
2736 isp_getpdb(ispsoftc_t *isp, int chan, uint16_t id, isp_pdb_t *pdb)
2740 isp_pdb_21xx_t fred;
2741 isp_pdb_24xx_t bill;
2744 MBSINIT(&mbs, MBOX_GET_PORT_DB,
2745 MBLOGALL & ~MBLOGMASK(MBOX_COMMAND_PARAM_ERROR), 250000);
2747 mbs.ibits = (1 << 9)|(1 << 10);
2749 mbs.param[9] = chan;
2750 } else if (ISP_CAP_2KLOGIN(isp)) {
2753 mbs.param[1] = id << 8;
2755 mbs.param[2] = DMA_WD1(isp->isp_iocb_dma);
2756 mbs.param[3] = DMA_WD0(isp->isp_iocb_dma);
2757 mbs.param[6] = DMA_WD3(isp->isp_iocb_dma);
2758 mbs.param[7] = DMA_WD2(isp->isp_iocb_dma);
2759 MEMORYBARRIER(isp, SYNC_IFORDEV, 0, sizeof(un), chan);
2761 isp_mboxcmd(isp, &mbs);
2762 if (mbs.param[0] != MBOX_COMMAND_COMPLETE)
2763 return (mbs.param[0] | (mbs.param[1] << 16));
2765 MEMORYBARRIER(isp, SYNC_IFORCPU, 0, sizeof(un), chan);
2767 isp_get_pdb_24xx(isp, isp->isp_iocb, &un.bill);
2768 pdb->handle = un.bill.pdb_handle;
2769 pdb->prli_word3 = un.bill.pdb_prli_svc3;
2770 pdb->portid = BITS2WORD_24XX(un.bill.pdb_portid_bits);
2771 ISP_MEMCPY(pdb->portname, un.bill.pdb_portname, 8);
2772 ISP_MEMCPY(pdb->nodename, un.bill.pdb_nodename, 8);
2773 isp_prt(isp, ISP_LOGDEBUG0,
2774 "Chan %d handle 0x%x Port 0x%06x flags 0x%x curstate %x laststate %x",
2775 chan, id, pdb->portid, un.bill.pdb_flags,
2776 un.bill.pdb_curstate, un.bill.pdb_laststate);
2778 if (un.bill.pdb_curstate < PDB2400_STATE_PLOGI_DONE || un.bill.pdb_curstate > PDB2400_STATE_LOGGED_IN) {
2779 mbs.param[0] = MBOX_NOT_LOGGED_IN;
2780 return (mbs.param[0]);
2783 isp_get_pdb_21xx(isp, isp->isp_iocb, &un.fred);
2784 pdb->handle = un.fred.pdb_loopid;
2785 pdb->prli_word3 = un.fred.pdb_prli_svc3;
2786 pdb->portid = BITS2WORD(un.fred.pdb_portid_bits);
2787 ISP_MEMCPY(pdb->portname, un.fred.pdb_portname, 8);
2788 ISP_MEMCPY(pdb->nodename, un.fred.pdb_nodename, 8);
2789 isp_prt(isp, ISP_LOGDEBUG1,
2790 "Chan %d handle 0x%x Port 0x%06x", chan, id, pdb->portid);
2796 isp_gethandles(ispsoftc_t *isp, int chan, uint16_t *handles, int *num, int loop)
2798 fcparam *fcp = FCPARAM(isp, chan);
2800 isp_pnhle_21xx_t el1, *elp1;
2801 isp_pnhle_23xx_t el3, *elp3;
2802 isp_pnhle_24xx_t el4, *elp4;
2807 MBSINIT(&mbs, MBOX_GET_ID_LIST, MBLOGALL, 250000);
2809 mbs.param[2] = DMA_WD1(fcp->isp_scdma);
2810 mbs.param[3] = DMA_WD0(fcp->isp_scdma);
2811 mbs.param[6] = DMA_WD3(fcp->isp_scdma);
2812 mbs.param[7] = DMA_WD2(fcp->isp_scdma);
2813 mbs.param[8] = ISP_FC_SCRLEN;
2814 mbs.param[9] = chan;
2816 mbs.ibits = (1 << 1)|(1 << 2)|(1 << 3)|(1 << 6);
2817 mbs.param[1] = DMA_WD1(fcp->isp_scdma);
2818 mbs.param[2] = DMA_WD0(fcp->isp_scdma);
2819 mbs.param[3] = DMA_WD3(fcp->isp_scdma);
2820 mbs.param[6] = DMA_WD2(fcp->isp_scdma);
2822 if (FC_SCRATCH_ACQUIRE(isp, chan)) {
2823 isp_prt(isp, ISP_LOGERR, sacq);
2826 MEMORYBARRIER(isp, SYNC_SFORDEV, 0, ISP_FC_SCRLEN, chan);
2827 isp_mboxcmd(isp, &mbs);
2828 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
2829 FC_SCRATCH_RELEASE(isp, chan);
2830 return (mbs.param[0] | (mbs.param[1] << 16));
2832 MEMORYBARRIER(isp, SYNC_SFORCPU, 0, ISP_FC_SCRLEN, chan);
2833 elp1 = fcp->isp_scratch;
2834 elp3 = fcp->isp_scratch;
2835 elp4 = fcp->isp_scratch;
2836 for (i = 0, j = 0; i < mbs.param[1] && j < *num; i++) {
2838 isp_get_pnhle_24xx(isp, &elp4[i], &el4);
2839 p = el4.pnhle_port_id_lo |
2840 (el4.pnhle_port_id_hi << 16);
2841 h = el4.pnhle_handle;
2842 } else if (IS_23XX(isp)) {
2843 isp_get_pnhle_23xx(isp, &elp3[i], &el3);
2844 p = el3.pnhle_port_id_lo |
2845 (el3.pnhle_port_id_hi << 16);
2846 h = el3.pnhle_handle;
2848 isp_get_pnhle_21xx(isp, &elp1[i], &el1);
2849 p = el1.pnhle_port_id_lo |
2850 ((el1.pnhle_port_id_hi_handle & 0xff) << 16);
2851 h = el1.pnhle_port_id_hi_handle >> 8;
2853 if (loop && (p >> 8) != (fcp->isp_portid >> 8))
2858 FC_SCRATCH_RELEASE(isp, chan);
2863 isp_dump_chip_portdb(ispsoftc_t *isp, int chan)
2866 uint16_t lim, nphdl;
2868 isp_prt(isp, ISP_LOG_SANCFG|ISP_LOGINFO, "Chan %d chip port dump", chan);
2869 if (ISP_CAP_2KLOGIN(isp)) {
2874 for (nphdl = 0; nphdl != lim; nphdl++) {
2875 if (isp_getpdb(isp, chan, nphdl, &pdb)) {
2878 isp_prt(isp, ISP_LOG_SANCFG|ISP_LOGINFO, "Chan %d Handle 0x%04x "
2879 "PortID 0x%06x WWPN 0x%02x%02x%02x%02x%02x%02x%02x%02x",
2880 chan, nphdl, pdb.portid, pdb.portname[0], pdb.portname[1],
2881 pdb.portname[2], pdb.portname[3], pdb.portname[4],
2882 pdb.portname[5], pdb.portname[6], pdb.portname[7]);
2887 isp_get_wwn(ispsoftc_t *isp, int chan, int nphdl, int nodename)
2889 uint64_t wwn = INI_NONE;
2892 MBSINIT(&mbs, MBOX_GET_PORT_NAME,
2893 MBLOGALL & ~MBLOGMASK(MBOX_COMMAND_PARAM_ERROR), 500000);
2894 if (ISP_CAP_2KLOGIN(isp)) {
2895 mbs.param[1] = nphdl;
2899 mbs.param[9] = chan;
2902 mbs.param[1] = nphdl << 8;
2907 isp_mboxcmd(isp, &mbs);
2908 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
2913 (((uint64_t)(mbs.param[2] >> 8)) << 56) |
2914 (((uint64_t)(mbs.param[2] & 0xff)) << 48) |
2915 (((uint64_t)(mbs.param[3] >> 8)) << 40) |
2916 (((uint64_t)(mbs.param[3] & 0xff)) << 32) |
2917 (((uint64_t)(mbs.param[6] >> 8)) << 24) |
2918 (((uint64_t)(mbs.param[6] & 0xff)) << 16) |
2919 (((uint64_t)(mbs.param[7] >> 8)) << 8) |
2920 (((uint64_t)(mbs.param[7] & 0xff)));
2923 (((uint64_t)(mbs.param[2] & 0xff)) << 56) |
2924 (((uint64_t)(mbs.param[2] >> 8)) << 48) |
2925 (((uint64_t)(mbs.param[3] & 0xff)) << 40) |
2926 (((uint64_t)(mbs.param[3] >> 8)) << 32) |
2927 (((uint64_t)(mbs.param[6] & 0xff)) << 24) |
2928 (((uint64_t)(mbs.param[6] >> 8)) << 16) |
2929 (((uint64_t)(mbs.param[7] & 0xff)) << 8) |
2930 (((uint64_t)(mbs.param[7] >> 8)));
2936 * Make sure we have good FC link.
2940 isp_fclink_test(ispsoftc_t *isp, int chan, int usdelay)
2947 NANOTIME_T hra, hrb;
2949 fcp = FCPARAM(isp, chan);
2951 if (fcp->isp_loopstate < LOOP_HAVE_LINK)
2953 if (fcp->isp_loopstate >= LOOP_LTEST_DONE)
2956 isp_prt(isp, ISP_LOG_SANCFG, "Chan %d FC link test", chan);
2959 * Wait up to N microseconds for F/W to go to a ready state.
2963 isp_change_fw_state(isp, chan, isp_fw_state(isp, chan));
2964 if (fcp->isp_fwstate == FW_READY) {
2967 if (fcp->isp_loopstate < LOOP_HAVE_LINK)
2970 if ((NANOTIME_SUB(&hrb, &hra) / 1000 + 1000 >= usdelay))
2972 ISP_SLEEP(isp, 1000);
2974 if (fcp->isp_fwstate != FW_READY) {
2975 isp_prt(isp, ISP_LOG_SANCFG,
2976 "Chan %d Firmware is not ready (%s)",
2977 chan, isp_fc_fw_statename(fcp->isp_fwstate));
2982 * Get our Loop ID and Port ID.
2984 MBSINIT(&mbs, MBOX_GET_LOOP_ID, MBLOGALL, 0);
2985 mbs.param[9] = chan;
2986 isp_mboxcmd(isp, &mbs);
2987 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
2993 * Don't bother with fabric if we are using really old
2994 * 2100 firmware. It's just not worth it.
2996 if (ISP_FW_NEWER_THAN(isp, 1, 15, 37))
2997 fcp->isp_topo = TOPO_FL_PORT;
2999 fcp->isp_topo = TOPO_NL_PORT;
3001 int topo = (int) mbs.param[6];
3002 if (topo < TOPO_NL_PORT || topo > TOPO_PTP_STUB) {
3003 topo = TOPO_PTP_STUB;
3005 fcp->isp_topo = topo;
3007 fcp->isp_portid = mbs.param[2] | (mbs.param[3] << 16);
3009 if (!TOPO_IS_FABRIC(fcp->isp_topo)) {
3010 fcp->isp_loopid = mbs.param[1] & 0xff;
3011 } else if (fcp->isp_topo != TOPO_F_PORT) {
3012 uint8_t alpa = fcp->isp_portid;
3014 for (i = 0; alpa_map[i]; i++) {
3015 if (alpa_map[i] == alpa)
3019 fcp->isp_loopid = i;
3023 fcp->isp_loopstate = LOOP_HAVE_ADDR;
3025 fcp->isp_loopstate = LOOP_TESTING_LINK;
3027 if (fcp->isp_topo == TOPO_F_PORT || fcp->isp_topo == TOPO_FL_PORT) {
3028 nphdl = IS_24XX(isp) ? NPH_FL_ID : FL_ID;
3029 r = isp_getpdb(isp, chan, nphdl, &pdb);
3030 if (r != 0 || pdb.portid == 0) {
3032 fcp->isp_topo = TOPO_NL_PORT;
3034 isp_prt(isp, ISP_LOGWARN,
3035 "fabric topology, but cannot get info about fabric controller (0x%x)", r);
3036 fcp->isp_topo = TOPO_PTP_STUB;
3042 fcp->isp_fabric_params = mbs.param[7];
3043 fcp->isp_sns_hdl = NPH_SNS_ID;
3044 r = isp_register_fc4_type(isp, chan);
3045 if (fcp->isp_loopstate < LOOP_TESTING_LINK)
3049 r = isp_register_fc4_features_24xx(isp, chan);
3050 if (fcp->isp_loopstate < LOOP_TESTING_LINK)
3054 r = isp_register_port_name_24xx(isp, chan);
3055 if (fcp->isp_loopstate < LOOP_TESTING_LINK)
3059 isp_register_node_name_24xx(isp, chan);
3060 if (fcp->isp_loopstate < LOOP_TESTING_LINK)
3063 fcp->isp_sns_hdl = SNS_ID;
3064 r = isp_register_fc4_type(isp, chan);
3067 if (fcp->role == ISP_ROLE_TARGET)
3068 isp_send_change_request(isp, chan);
3073 /* Get link speed. */
3074 fcp->isp_gbspeed = 1;
3075 if (IS_23XX(isp) || IS_24XX(isp)) {
3076 MBSINIT(&mbs, MBOX_GET_SET_DATA_RATE, MBLOGALL, 3000000);
3077 mbs.param[1] = MBGSD_GET_RATE;
3078 /* mbs.param[2] undefined if we're just getting rate */
3079 isp_mboxcmd(isp, &mbs);
3080 if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
3081 if (mbs.param[1] == MBGSD_10GB)
3082 fcp->isp_gbspeed = 10;
3083 else if (mbs.param[1] == MBGSD_16GB)
3084 fcp->isp_gbspeed = 16;
3085 else if (mbs.param[1] == MBGSD_8GB)
3086 fcp->isp_gbspeed = 8;
3087 else if (mbs.param[1] == MBGSD_4GB)
3088 fcp->isp_gbspeed = 4;
3089 else if (mbs.param[1] == MBGSD_2GB)
3090 fcp->isp_gbspeed = 2;
3091 else if (mbs.param[1] == MBGSD_1GB)
3092 fcp->isp_gbspeed = 1;
3096 if (fcp->isp_loopstate < LOOP_TESTING_LINK) {
3098 isp_prt(isp, ISP_LOG_SANCFG,
3099 "Chan %d FC link test aborted", chan);
3102 fcp->isp_loopstate = LOOP_LTEST_DONE;
3103 isp_prt(isp, ISP_LOG_SANCFG|ISP_LOGCONFIG,
3104 "Chan %d WWPN %016jx WWNN %016jx",
3105 chan, (uintmax_t)fcp->isp_wwpn, (uintmax_t)fcp->isp_wwnn);
3106 isp_prt(isp, ISP_LOG_SANCFG|ISP_LOGCONFIG,
3107 "Chan %d %dGb %s PortID 0x%06x LoopID 0x%02x",
3108 chan, fcp->isp_gbspeed, isp_fc_toponame(fcp), fcp->isp_portid,
3110 isp_prt(isp, ISP_LOG_SANCFG, "Chan %d FC link test done", chan);
3115 * Complete the synchronization of our Port Database.
3117 * At this point, we've scanned the local loop (if any) and the fabric
3118 * and performed fabric logins on all new devices.
3120 * Our task here is to go through our port database removing any entities
3121 * that are still marked probational (issuing PLOGO for ones which we had
3122 * PLOGI'd into) or are dead, and notifying upper layers about new/changed
3126 isp_pdb_sync(ispsoftc_t *isp, int chan)
3128 fcparam *fcp = FCPARAM(isp, chan);
3132 if (fcp->isp_loopstate < LOOP_FSCAN_DONE)
3134 if (fcp->isp_loopstate >= LOOP_READY)
3137 isp_prt(isp, ISP_LOG_SANCFG, "Chan %d FC PDB sync", chan);
3139 fcp->isp_loopstate = LOOP_SYNCING_PDB;
3141 for (dbidx = 0; dbidx < MAX_FC_TARG; dbidx++) {
3142 lp = &fcp->portdb[dbidx];
3144 if (lp->state == FC_PORTDB_STATE_NIL)
3146 if (lp->probational && lp->state != FC_PORTDB_STATE_ZOMBIE)
3147 lp->state = FC_PORTDB_STATE_DEAD;
3148 switch (lp->state) {
3149 case FC_PORTDB_STATE_DEAD:
3150 lp->state = FC_PORTDB_STATE_NIL;
3151 isp_async(isp, ISPASYNC_DEV_GONE, chan, lp);
3152 if ((lp->portid & 0xffff00) != 0) {
3153 (void) isp_plogx(isp, chan, lp->handle,
3155 PLOGX_FLG_CMD_LOGO |
3156 PLOGX_FLG_IMPLICIT |
3157 PLOGX_FLG_FREE_NPHDL);
3160 * Note that we might come out of this with our state
3161 * set to FC_PORTDB_STATE_ZOMBIE.
3164 case FC_PORTDB_STATE_NEW:
3165 lp->state = FC_PORTDB_STATE_VALID;
3166 isp_async(isp, ISPASYNC_DEV_ARRIVED, chan, lp);
3168 case FC_PORTDB_STATE_CHANGED:
3169 lp->state = FC_PORTDB_STATE_VALID;
3170 isp_async(isp, ISPASYNC_DEV_CHANGED, chan, lp);
3171 lp->portid = lp->new_portid;
3172 lp->prli_word3 = lp->new_prli_word3;
3174 case FC_PORTDB_STATE_VALID:
3175 isp_async(isp, ISPASYNC_DEV_STAYED, chan, lp);
3177 case FC_PORTDB_STATE_ZOMBIE:
3180 isp_prt(isp, ISP_LOGWARN,
3181 "isp_pdb_sync: state %d for idx %d",
3183 isp_dump_portdb(isp, chan);
3187 if (fcp->isp_loopstate < LOOP_SYNCING_PDB) {
3188 isp_prt(isp, ISP_LOG_SANCFG,
3189 "Chan %d FC PDB sync aborted", chan);
3193 fcp->isp_loopstate = LOOP_READY;
3194 isp_prt(isp, ISP_LOG_SANCFG, "Chan %d FC PDB sync done", chan);
3199 isp_pdb_add_update(ispsoftc_t *isp, int chan, isp_pdb_t *pdb)
3202 uint64_t wwnn, wwpn;
3204 MAKE_WWN_FROM_NODE_NAME(wwnn, pdb->nodename);
3205 MAKE_WWN_FROM_NODE_NAME(wwpn, pdb->portname);
3207 /* Search port database for the same WWPN. */
3208 if (isp_find_pdb_by_wwpn(isp, chan, wwpn, &lp)) {
3209 if (!lp->probational) {
3210 isp_prt(isp, ISP_LOGERR,
3211 "Chan %d Port 0x%06x@0x%04x [%d] is not probational (0x%x)",
3212 chan, lp->portid, lp->handle,
3213 FC_PORTDB_TGT(isp, chan, lp), lp->state);
3214 isp_dump_portdb(isp, chan);
3217 lp->probational = 0;
3218 lp->node_wwn = wwnn;
3220 /* Old device, nothing new. */
3221 if (lp->portid == pdb->portid &&
3222 lp->handle == pdb->handle &&
3223 lp->prli_word3 == pdb->prli_word3) {
3224 if (lp->state != FC_PORTDB_STATE_NEW)
3225 lp->state = FC_PORTDB_STATE_VALID;
3226 isp_prt(isp, ISP_LOG_SANCFG,
3227 "Chan %d Port 0x%06x@0x%04x is valid",
3228 chan, pdb->portid, pdb->handle);
3232 /* Something has changed. */
3233 lp->state = FC_PORTDB_STATE_CHANGED;
3234 lp->handle = pdb->handle;
3235 lp->new_portid = pdb->portid;
3236 lp->new_prli_word3 = pdb->prli_word3;
3237 isp_prt(isp, ISP_LOG_SANCFG,
3238 "Chan %d Port 0x%06x@0x%04x is changed",
3239 chan, pdb->portid, pdb->handle);
3243 /* It seems like a new port. Find an empty slot for it. */
3244 if (!isp_find_pdb_empty(isp, chan, &lp)) {
3245 isp_prt(isp, ISP_LOGERR, "Chan %d out of portdb entries", chan);
3249 ISP_MEMZERO(lp, sizeof (fcportdb_t));
3250 lp->probational = 0;
3251 lp->state = FC_PORTDB_STATE_NEW;
3252 lp->portid = lp->new_portid = pdb->portid;
3253 lp->prli_word3 = lp->new_prli_word3 = pdb->prli_word3;
3254 lp->handle = pdb->handle;
3255 lp->port_wwn = wwpn;
3256 lp->node_wwn = wwnn;
3257 isp_prt(isp, ISP_LOG_SANCFG, "Chan %d Port 0x%06x@0x%04x is new",
3258 chan, pdb->portid, pdb->handle);
3262 * Fix port IDs for logged-in initiators on pre-2400 chips.
3263 * For those chips we are not receiving login events, adding initiators
3264 * based on ATIO requests, but there is no port ID in that structure.
3267 isp_fix_portids(ispsoftc_t *isp, int chan)
3269 fcparam *fcp = FCPARAM(isp, chan);
3274 for (i = 0; i < MAX_FC_TARG; i++) {
3275 fcportdb_t *lp = &fcp->portdb[i];
3277 if (lp->state == FC_PORTDB_STATE_NIL ||
3278 lp->state == FC_PORTDB_STATE_ZOMBIE)
3280 if (VALID_PORT(lp->portid))
3283 r = isp_getpdb(isp, chan, lp->handle, &pdb);
3284 if (fcp->isp_loopstate < LOOP_SCANNING_LOOP)
3287 isp_prt(isp, ISP_LOGDEBUG1,
3288 "Chan %d FC Scan Loop handle %d returned %x",
3289 chan, lp->handle, r);
3293 MAKE_WWN_FROM_NODE_NAME(wwpn, pdb.portname);
3294 if (lp->port_wwn != wwpn)
3296 lp->portid = lp->new_portid = pdb.portid;
3297 isp_prt(isp, ISP_LOG_SANCFG,
3298 "Chan %d Port 0x%06x@0x%04x is fixed",
3299 chan, pdb.portid, pdb.handle);
3304 * Scan local loop for devices.
3307 isp_scan_loop(ispsoftc_t *isp, int chan)
3309 fcparam *fcp = FCPARAM(isp, chan);
3315 if (fcp->isp_loopstate < LOOP_LTEST_DONE)
3317 if (fcp->isp_loopstate >= LOOP_LSCAN_DONE)
3320 isp_prt(isp, ISP_LOG_SANCFG, "Chan %d FC loop scan", chan);
3321 fcp->isp_loopstate = LOOP_SCANNING_LOOP;
3322 if (TOPO_IS_FABRIC(fcp->isp_topo)) {
3323 if (!IS_24XX(isp)) {
3324 isp_fix_portids(isp, chan);
3325 if (fcp->isp_loopstate < LOOP_SCANNING_LOOP)
3328 isp_prt(isp, ISP_LOG_SANCFG,
3329 "Chan %d FC loop scan done (no loop)", chan);
3330 fcp->isp_loopstate = LOOP_LSCAN_DONE;
3334 handles = (uint16_t *)fcp->isp_scanscratch;
3335 lim = ISP_FC_SCRLEN / 2;
3336 r = isp_gethandles(isp, chan, handles, &lim, 1);
3338 isp_prt(isp, ISP_LOG_SANCFG,
3339 "Chan %d Getting list of handles failed with %x", chan, r);
3340 isp_prt(isp, ISP_LOG_SANCFG,
3341 "Chan %d FC loop scan done (bad)", chan);
3345 isp_prt(isp, ISP_LOG_SANCFG, "Chan %d Got %d handles",
3349 * Run through the list and get the port database info for each one.
3351 isp_mark_portdb(isp, chan);
3352 for (idx = 0; idx < lim; idx++) {
3353 handle = handles[idx];
3356 * Don't scan "special" ids.
3358 if (ISP_CAP_2KLOGIN(isp)) {
3359 if (handle >= NPH_RESERVED)
3362 if (handle >= FL_ID && handle <= SNS_ID)
3367 * In older cards with older f/w GET_PORT_DATABASE has been
3368 * known to hang. This trick gets around that problem.
3370 if (IS_2100(isp) || IS_2200(isp)) {
3371 uint64_t node_wwn = isp_get_wwn(isp, chan, handle, 1);
3372 if (fcp->isp_loopstate < LOOP_SCANNING_LOOP) {
3374 isp_prt(isp, ISP_LOG_SANCFG,
3375 "Chan %d FC loop scan aborted", chan);
3378 if (node_wwn == INI_NONE) {
3384 * Get the port database entity for this index.
3386 r = isp_getpdb(isp, chan, handle, &pdb);
3387 if (fcp->isp_loopstate < LOOP_SCANNING_LOOP)
3390 isp_prt(isp, ISP_LOGDEBUG1,
3391 "Chan %d FC Scan Loop handle %d returned %x",
3396 isp_pdb_add_update(isp, chan, &pdb);
3398 if (fcp->isp_loopstate < LOOP_SCANNING_LOOP)
3400 fcp->isp_loopstate = LOOP_LSCAN_DONE;
3401 isp_prt(isp, ISP_LOG_SANCFG, "Chan %d FC loop scan done", chan);
3406 isp_ct_sns(ispsoftc_t *isp, int chan, uint32_t cmd_bcnt, uint32_t rsp_bcnt)
3408 fcparam *fcp = FCPARAM(isp, chan);
3411 if (isp->isp_dblev & ISP_LOGDEBUG1)
3412 isp_print_bytes(isp, "CT SNS request", cmd_bcnt, fcp->isp_scratch);
3413 MEMORYBARRIER(isp, SYNC_SFORDEV, 0, cmd_bcnt, chan);
3415 MBSINIT(&mbs, MBOX_SEND_SNS, MBLOGALL, 10000000);
3416 mbs.param[1] = cmd_bcnt >> 1;
3417 mbs.param[2] = DMA_WD1(fcp->isp_scdma);
3418 mbs.param[3] = DMA_WD0(fcp->isp_scdma);
3419 mbs.param[6] = DMA_WD3(fcp->isp_scdma);
3420 mbs.param[7] = DMA_WD2(fcp->isp_scdma);
3421 isp_mboxcmd(isp, &mbs);
3422 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
3423 if (mbs.param[0] == MBOX_INVALID_COMMAND) {
3430 MEMORYBARRIER(isp, SYNC_SFORCPU, 0, rsp_bcnt, chan);
3431 if (isp->isp_dblev & ISP_LOGDEBUG1)
3432 isp_print_bytes(isp, "CT response", rsp_bcnt, fcp->isp_scratch);
3437 isp_ct_passthru(ispsoftc_t *isp, int chan, uint32_t cmd_bcnt, uint32_t rsp_bcnt)
3439 fcparam *fcp = FCPARAM(isp, chan);
3442 uint8_t resp[QENTRY_LEN];
3444 if (isp->isp_dblev & ISP_LOGDEBUG1)
3445 isp_print_bytes(isp, "CT request", cmd_bcnt, fcp->isp_scratch);
3448 * Build a Passthrough IOCB in memory.
3450 ISP_MEMZERO(&pt, sizeof(pt));
3451 pt.ctp_header.rqs_entry_count = 1;
3452 pt.ctp_header.rqs_entry_type = RQSTYPE_CT_PASSTHRU;
3453 pt.ctp_nphdl = fcp->isp_sns_hdl;
3455 pt.ctp_vpidx = ISP_GET_VPIDX(isp, chan);
3458 pt.ctp_rsp_bcnt = rsp_bcnt;
3459 pt.ctp_cmd_bcnt = cmd_bcnt;
3460 pt.ctp_dataseg[0].ds_base = DMA_LO32(fcp->isp_scdma);
3461 pt.ctp_dataseg[0].ds_basehi = DMA_HI32(fcp->isp_scdma);
3462 pt.ctp_dataseg[0].ds_count = cmd_bcnt;
3463 pt.ctp_dataseg[1].ds_base = DMA_LO32(fcp->isp_scdma);
3464 pt.ctp_dataseg[1].ds_basehi = DMA_HI32(fcp->isp_scdma);
3465 pt.ctp_dataseg[1].ds_count = rsp_bcnt;
3467 /* Prepare space for response in memory */
3468 memset(resp, 0xff, sizeof(resp));
3469 pt.ctp_handle = isp_allocate_handle(isp, resp, ISP_HANDLE_CTRL);
3470 if (pt.ctp_handle == 0) {
3471 isp_prt(isp, ISP_LOGERR,
3472 "%s: CTP of Chan %d out of handles", __func__, chan);
3476 /* Send request and wait for response. */
3477 reqp = isp_getrqentry(isp);
3479 isp_prt(isp, ISP_LOGERR,
3480 "%s: CTP of Chan %d out of rqent", __func__, chan);
3481 isp_destroy_handle(isp, pt.ctp_handle);
3484 isp_put_ct_pt(isp, &pt, (isp_ct_pt_t *)reqp);
3485 if (isp->isp_dblev & ISP_LOGDEBUG1)
3486 isp_print_bytes(isp, "CT IOCB request", QENTRY_LEN, reqp);
3487 ISP_SYNC_REQUEST(isp);
3488 if (msleep(resp, &isp->isp_lock, 0, "CTP", pt.ctp_time*hz) == EWOULDBLOCK) {
3489 isp_prt(isp, ISP_LOGERR,
3490 "%s: CTP of Chan %d timed out", __func__, chan);
3491 isp_destroy_handle(isp, pt.ctp_handle);
3494 if (isp->isp_dblev & ISP_LOGDEBUG1)
3495 isp_print_bytes(isp, "CT IOCB response", QENTRY_LEN, resp);
3497 isp_get_ct_pt(isp, (isp_ct_pt_t *)resp, &pt);
3498 if (pt.ctp_status && pt.ctp_status != RQCS_DATA_UNDERRUN) {
3499 isp_prt(isp, ISP_LOGWARN,
3500 "Chan %d CT pass-through returned 0x%x",
3501 chan, pt.ctp_status);
3505 if (isp->isp_dblev & ISP_LOGDEBUG1)
3506 isp_print_bytes(isp, "CT response", rsp_bcnt, fcp->isp_scratch);
3512 * Scan the fabric for devices and add them to our port database.
3514 * Use the GID_PT command to get list of all Nx_Port IDs SNS knows.
3515 * Use GFF_ID and GFT_ID to check port type (FCP) and features (target).
3517 * For 2100-23XX cards, we use the SNS mailbox command to pass simple name
3518 * server commands to the switch management server via the QLogic f/w.
3520 * For the 24XX and above card, we use CT Pass-through IOCB.
3522 #define GIDLEN ISP_FC_SCRLEN
3523 #define NGENT ((GIDLEN - 16) >> 2)
3526 isp_gid_pt(ispsoftc_t *isp, int chan)
3528 fcparam *fcp = FCPARAM(isp, chan);
3530 sns_gid_pt_req_t rq;
3531 uint8_t *scp = fcp->isp_scratch;
3533 isp_prt(isp, ISP_LOGDEBUG0, "Chan %d requesting GID_PT", chan);
3534 if (FC_SCRATCH_ACQUIRE(isp, chan)) {
3535 isp_prt(isp, ISP_LOGERR, sacq);
3540 /* Build the CT command and execute via pass-through. */
3541 ISP_MEMZERO(&ct, sizeof (ct));
3542 ct.ct_revision = CT_REVISION;
3543 ct.ct_fcs_type = CT_FC_TYPE_FC;
3544 ct.ct_fcs_subtype = CT_FC_SUBTYPE_NS;
3545 ct.ct_cmd_resp = SNS_GID_PT;
3546 ct.ct_bcnt_resid = (GIDLEN - 16) >> 2;
3547 isp_put_ct_hdr(isp, &ct, (ct_hdr_t *)scp);
3548 scp[sizeof(ct)] = 0x7f; /* Port Type = Nx_Port */
3549 scp[sizeof(ct)+1] = 0; /* Domain_ID = any */
3550 scp[sizeof(ct)+2] = 0; /* Area_ID = any */
3551 scp[sizeof(ct)+3] = 0; /* Flags = no Area_ID */
3553 if (isp_ct_passthru(isp, chan, sizeof(ct) + sizeof(uint32_t), GIDLEN)) {
3554 FC_SCRATCH_RELEASE(isp, chan);
3558 /* Build the SNS request and execute via firmware. */
3559 ISP_MEMZERO(&rq, SNS_GID_PT_REQ_SIZE);
3560 rq.snscb_rblen = GIDLEN >> 1;
3561 rq.snscb_addr[RQRSP_ADDR0015] = DMA_WD0(fcp->isp_scdma);
3562 rq.snscb_addr[RQRSP_ADDR1631] = DMA_WD1(fcp->isp_scdma);
3563 rq.snscb_addr[RQRSP_ADDR3247] = DMA_WD2(fcp->isp_scdma);
3564 rq.snscb_addr[RQRSP_ADDR4863] = DMA_WD3(fcp->isp_scdma);
3566 rq.snscb_cmd = SNS_GID_PT;
3567 rq.snscb_mword_div_2 = NGENT;
3568 rq.snscb_port_type = 0x7f; /* Port Type = Nx_Port */
3569 rq.snscb_domain = 0; /* Domain_ID = any */
3570 rq.snscb_area = 0; /* Area_ID = any */
3571 rq.snscb_flags = 0; /* Flags = no Area_ID */
3572 isp_put_gid_pt_request(isp, &rq, (sns_gid_pt_req_t *)scp);
3574 if (isp_ct_sns(isp, chan, sizeof(rq), NGENT)) {
3575 FC_SCRATCH_RELEASE(isp, chan);
3580 isp_get_gid_xx_response(isp, (sns_gid_xx_rsp_t *)scp,
3581 (sns_gid_xx_rsp_t *)fcp->isp_scanscratch, NGENT);
3582 FC_SCRATCH_RELEASE(isp, chan);
3587 isp_gff_id(ispsoftc_t *isp, int chan, uint32_t portid)
3589 fcparam *fcp = FCPARAM(isp, chan);
3592 uint8_t *scp = fcp->isp_scratch;
3593 sns_gff_id_rsp_t rsp;
3596 if (!fcp->isp_use_gff_id) /* User may block GFF_ID use. */
3599 if (!IS_24XX(isp)) /* Old chips can't request GFF_ID. */
3602 isp_prt(isp, ISP_LOGDEBUG0, "Chan %d requesting GFF_ID", chan);
3603 if (FC_SCRATCH_ACQUIRE(isp, chan)) {
3604 isp_prt(isp, ISP_LOGERR, sacq);
3608 /* Build the CT command and execute via pass-through. */
3609 ISP_MEMZERO(&ct, sizeof (ct));
3610 ct.ct_revision = CT_REVISION;
3611 ct.ct_fcs_type = CT_FC_TYPE_FC;
3612 ct.ct_fcs_subtype = CT_FC_SUBTYPE_NS;
3613 ct.ct_cmd_resp = SNS_GFF_ID;
3614 ct.ct_bcnt_resid = (SNS_GFF_ID_RESP_SIZE - sizeof(ct)) / 4;
3615 isp_put_ct_hdr(isp, &ct, (ct_hdr_t *)scp);
3616 rp = (uint32_t *) &scp[sizeof(ct)];
3617 ISP_IOZPUT_32(isp, portid, rp);
3619 if (isp_ct_passthru(isp, chan, sizeof(ct) + sizeof(uint32_t),
3620 SNS_GFF_ID_RESP_SIZE)) {
3621 FC_SCRATCH_RELEASE(isp, chan);
3625 isp_get_gff_id_response(isp, (sns_gff_id_rsp_t *)scp, &rsp);
3626 if (rsp.snscb_cthdr.ct_cmd_resp == LS_ACC) {
3627 for (i = 0; i < 32; i++) {
3628 if (rsp.snscb_fc4_features[i] != 0) {
3633 if (((rsp.snscb_fc4_features[FC4_SCSI / 8] >>
3634 ((FC4_SCSI % 8) * 4)) & 0x01) != 0)
3636 /* Workaround for broken Brocade firmware. */
3637 if (((ISP_SWAP32(isp, rsp.snscb_fc4_features[FC4_SCSI / 8]) >>
3638 ((FC4_SCSI % 8) * 4)) & 0x01) != 0)
3641 FC_SCRATCH_RELEASE(isp, chan);
3642 isp_prt(isp, ISP_LOGDEBUG0, "Chan %d GFF_ID result is %d", chan, res);
3647 isp_gft_id(ispsoftc_t *isp, int chan, uint32_t portid)
3649 fcparam *fcp = FCPARAM(isp, chan);
3651 sns_gxx_id_req_t rq;
3653 uint8_t *scp = fcp->isp_scratch;
3654 sns_gft_id_rsp_t rsp;
3657 if (!fcp->isp_use_gft_id) /* User may block GFT_ID use. */
3660 isp_prt(isp, ISP_LOGDEBUG0, "Chan %d requesting GFT_ID", chan);
3661 if (FC_SCRATCH_ACQUIRE(isp, chan)) {
3662 isp_prt(isp, ISP_LOGERR, sacq);
3667 /* Build the CT command and execute via pass-through. */
3668 ISP_MEMZERO(&ct, sizeof (ct));
3669 ct.ct_revision = CT_REVISION;
3670 ct.ct_fcs_type = CT_FC_TYPE_FC;
3671 ct.ct_fcs_subtype = CT_FC_SUBTYPE_NS;
3672 ct.ct_cmd_resp = SNS_GFT_ID;
3673 ct.ct_bcnt_resid = (SNS_GFT_ID_RESP_SIZE - sizeof(ct)) / 4;
3674 isp_put_ct_hdr(isp, &ct, (ct_hdr_t *)scp);
3675 rp = (uint32_t *) &scp[sizeof(ct)];
3676 ISP_IOZPUT_32(isp, portid, rp);
3678 if (isp_ct_passthru(isp, chan, sizeof(ct) + sizeof(uint32_t),
3679 SNS_GFT_ID_RESP_SIZE)) {
3680 FC_SCRATCH_RELEASE(isp, chan);
3684 /* Build the SNS request and execute via firmware. */
3685 ISP_MEMZERO(&rq, SNS_GXX_ID_REQ_SIZE);
3686 rq.snscb_rblen = SNS_GFT_ID_RESP_SIZE >> 1;
3687 rq.snscb_addr[RQRSP_ADDR0015] = DMA_WD0(fcp->isp_scdma);
3688 rq.snscb_addr[RQRSP_ADDR1631] = DMA_WD1(fcp->isp_scdma);
3689 rq.snscb_addr[RQRSP_ADDR3247] = DMA_WD2(fcp->isp_scdma);
3690 rq.snscb_addr[RQRSP_ADDR4863] = DMA_WD3(fcp->isp_scdma);
3692 rq.snscb_cmd = SNS_GFT_ID;
3693 rq.snscb_mword_div_2 = (SNS_GFT_ID_RESP_SIZE - sizeof(ct)) / 4;
3694 rq.snscb_portid = portid;
3695 isp_put_gxx_id_request(isp, &rq, (sns_gxx_id_req_t *)scp);
3697 if (isp_ct_sns(isp, chan, sizeof(rq), SNS_GFT_ID_RESP_SIZE)) {
3698 FC_SCRATCH_RELEASE(isp, chan);
3703 isp_get_gft_id_response(isp, (sns_gft_id_rsp_t *)scp, &rsp);
3704 if (rsp.snscb_cthdr.ct_cmd_resp == LS_ACC) {
3705 for (i = 0; i < 8; i++) {
3706 if (rsp.snscb_fc4_types[i] != 0) {
3711 if (((rsp.snscb_fc4_types[FC4_SCSI / 32] >>
3712 (FC4_SCSI % 32)) & 0x01) != 0)
3715 FC_SCRATCH_RELEASE(isp, chan);
3716 isp_prt(isp, ISP_LOGDEBUG0, "Chan %d GFT_ID result is %d", chan, res);
3721 isp_scan_fabric(ispsoftc_t *isp, int chan)
3723 fcparam *fcp = FCPARAM(isp, chan);
3728 int portidx, portlim, r;
3729 sns_gid_xx_rsp_t *rs;
3731 if (fcp->isp_loopstate < LOOP_LSCAN_DONE)
3733 if (fcp->isp_loopstate >= LOOP_FSCAN_DONE)
3736 isp_prt(isp, ISP_LOG_SANCFG, "Chan %d FC fabric scan", chan);
3737 fcp->isp_loopstate = LOOP_SCANNING_FABRIC;
3738 if (!TOPO_IS_FABRIC(fcp->isp_topo)) {
3739 fcp->isp_loopstate = LOOP_FSCAN_DONE;
3740 isp_prt(isp, ISP_LOG_SANCFG,
3741 "Chan %d FC fabric scan done (no fabric)", chan);
3745 if (fcp->isp_loopstate < LOOP_SCANNING_FABRIC) {
3747 FC_SCRATCH_RELEASE(isp, chan);
3748 isp_prt(isp, ISP_LOG_SANCFG,
3749 "Chan %d FC fabric scan aborted", chan);
3754 * Make sure we still are logged into the fabric controller.
3756 nphdl = IS_24XX(isp) ? NPH_FL_ID : FL_ID;
3757 r = isp_getpdb(isp, chan, nphdl, &pdb);
3758 if ((r & 0xffff) == MBOX_NOT_LOGGED_IN) {
3759 isp_dump_chip_portdb(isp, chan);
3762 fcp->isp_loopstate = LOOP_LTEST_DONE;
3764 isp_prt(isp, ISP_LOG_SANCFG,
3765 "Chan %d FC fabric scan done (bad)", chan);
3769 /* Get list of port IDs from SNS. */
3770 r = isp_gid_pt(isp, chan);
3771 if (fcp->isp_loopstate < LOOP_SCANNING_FABRIC)
3774 fcp->isp_loopstate = LOOP_FSCAN_DONE;
3777 fcp->isp_loopstate = LOOP_LTEST_DONE; /* try again */
3781 rs = (sns_gid_xx_rsp_t *) fcp->isp_scanscratch;
3782 if (fcp->isp_loopstate < LOOP_SCANNING_FABRIC)
3784 if (rs->snscb_cthdr.ct_cmd_resp != LS_ACC) {
3786 /* FC-4 Type and Port Type not registered are not errors. */
3787 if (rs->snscb_cthdr.ct_reason == 9 &&
3788 (rs->snscb_cthdr.ct_explanation == 0x07 ||
3789 rs->snscb_cthdr.ct_explanation == 0x0a)) {
3790 level = ISP_LOG_SANCFG;
3792 level = ISP_LOGWARN;
3794 isp_prt(isp, level, "Chan %d Fabric Nameserver rejected GID_PT"
3795 " (Reason=0x%x Expl=0x%x)", chan,
3796 rs->snscb_cthdr.ct_reason,
3797 rs->snscb_cthdr.ct_explanation);
3798 fcp->isp_loopstate = LOOP_FSCAN_DONE;
3802 /* Check our buffer was big enough to get the full list. */
3803 for (portidx = 0; portidx < NGENT-1; portidx++) {
3804 if (rs->snscb_ports[portidx].control & 0x80)
3807 if ((rs->snscb_ports[portidx].control & 0x80) == 0) {
3808 isp_prt(isp, ISP_LOGWARN,
3809 "fabric too big for scratch area: increase ISP_FC_SCRLEN");
3811 portlim = portidx + 1;
3812 isp_prt(isp, ISP_LOG_SANCFG,
3813 "Chan %d Got %d ports back from name server", chan, portlim);
3815 /* Go through the list and remove duplicate port ids. */
3816 for (portidx = 0; portidx < portlim; portidx++) {
3820 ((rs->snscb_ports[portidx].portid[0]) << 16) |
3821 ((rs->snscb_ports[portidx].portid[1]) << 8) |
3822 ((rs->snscb_ports[portidx].portid[2]));
3824 for (npidx = portidx + 1; npidx < portlim; npidx++) {
3825 uint32_t new_portid =
3826 ((rs->snscb_ports[npidx].portid[0]) << 16) |
3827 ((rs->snscb_ports[npidx].portid[1]) << 8) |
3828 ((rs->snscb_ports[npidx].portid[2]));
3829 if (new_portid == portid) {
3834 if (npidx < portlim) {
3835 rs->snscb_ports[npidx].portid[0] = 0;
3836 rs->snscb_ports[npidx].portid[1] = 0;
3837 rs->snscb_ports[npidx].portid[2] = 0;
3838 isp_prt(isp, ISP_LOG_SANCFG, "Chan %d removing duplicate PortID 0x%06x entry from list", chan, portid);
3843 * We now have a list of Port IDs for all FC4 SCSI devices
3844 * that the Fabric Name server knows about.
3846 * For each entry on this list go through our port database looking
3847 * for probational entries- if we find one, then an old entry is
3848 * maybe still this one. We get some information to find out.
3850 * Otherwise, it's a new fabric device, and we log into it
3851 * (unconditionally). After searching the entire database
3852 * again to make sure that we never ever ever ever have more
3853 * than one entry that has the same PortID or the same
3854 * WWNN/WWPN duple, we enter the device into our database.
3856 isp_mark_portdb(isp, chan);
3857 for (portidx = 0; portidx < portlim; portidx++) {
3858 portid = ((rs->snscb_ports[portidx].portid[0]) << 16) |
3859 ((rs->snscb_ports[portidx].portid[1]) << 8) |
3860 ((rs->snscb_ports[portidx].portid[2]));
3861 isp_prt(isp, ISP_LOG_SANCFG,
3862 "Chan %d Checking fabric port 0x%06x", chan, portid);
3864 isp_prt(isp, ISP_LOG_SANCFG,
3865 "Chan %d Port at idx %d is zero",
3869 if (portid == fcp->isp_portid) {
3870 isp_prt(isp, ISP_LOG_SANCFG,
3871 "Chan %d Port 0x%06x is our", chan, portid);
3875 /* Now search the entire port database for the same portid. */
3876 if (isp_find_pdb_by_portid(isp, chan, portid, &lp)) {
3877 if (!lp->probational) {
3878 isp_prt(isp, ISP_LOGERR,
3879 "Chan %d Port 0x%06x@0x%04x [%d] is not probational (0x%x)",
3880 chan, lp->portid, lp->handle,
3881 FC_PORTDB_TGT(isp, chan, lp), lp->state);
3882 isp_dump_portdb(isp, chan);
3886 if (lp->state == FC_PORTDB_STATE_ZOMBIE)
3890 * See if we're still logged into it.
3892 * If we aren't, mark it as a dead device and
3893 * leave the new portid in the database entry
3894 * for somebody further along to decide what to
3895 * do (policy choice).
3897 * If we are, check to see if it's the same
3898 * device still (it should be). If for some
3899 * reason it isn't, mark it as a changed device
3900 * and leave the new portid and role in the
3901 * database entry for somebody further along to
3902 * decide what to do (policy choice).
3904 r = isp_getpdb(isp, chan, lp->handle, &pdb);
3905 if (fcp->isp_loopstate < LOOP_SCANNING_FABRIC)
3908 lp->state = FC_PORTDB_STATE_DEAD;
3909 isp_prt(isp, ISP_LOG_SANCFG,
3910 "Chan %d Port 0x%06x handle 0x%x is dead (%d)",
3911 chan, portid, lp->handle, r);
3915 isp_pdb_add_update(isp, chan, &pdb);
3920 if ((fcp->role & ISP_ROLE_INITIATOR) == 0) {
3921 isp_prt(isp, ISP_LOG_SANCFG,
3922 "Chan %d Port 0x%06x is not logged in", chan, portid);
3926 r = isp_gff_id(isp, chan, portid);
3928 isp_prt(isp, ISP_LOG_SANCFG,
3929 "Chan %d Port 0x%06x is not an FCP target", chan, portid);
3933 r = isp_gft_id(isp, chan, portid);
3935 isp_prt(isp, ISP_LOG_SANCFG,
3936 "Chan %d Port 0x%06x is not FCP", chan, portid);
3940 if (isp_login_device(isp, chan, portid, &pdb,
3941 &FCPARAM(isp, 0)->isp_lasthdl)) {
3942 if (fcp->isp_loopstate < LOOP_SCANNING_FABRIC)
3947 isp_pdb_add_update(isp, chan, &pdb);
3950 if (fcp->isp_loopstate < LOOP_SCANNING_FABRIC)
3952 fcp->isp_loopstate = LOOP_FSCAN_DONE;
3953 isp_prt(isp, ISP_LOG_SANCFG, "Chan %d FC fabric scan done", chan);
3958 * Find an unused handle and try and use to login to a port.
3961 isp_login_device(ispsoftc_t *isp, int chan, uint32_t portid, isp_pdb_t *p, uint16_t *ohp)
3966 if (ISP_CAP_2KLOGIN(isp)) {
3972 handle = isp_next_handle(isp, ohp);
3973 for (i = 0; i < lim; i++) {
3974 if (FCPARAM(isp, chan)->isp_loopstate != LOOP_SCANNING_FABRIC)
3977 /* Check if this handle is free. */
3978 r = isp_getpdb(isp, chan, handle, p);
3980 if (p->portid != portid) {
3981 /* This handle is busy, try next one. */
3982 handle = isp_next_handle(isp, ohp);
3987 if (FCPARAM(isp, chan)->isp_loopstate != LOOP_SCANNING_FABRIC)
3991 * Now try and log into the device
3993 r = isp_plogx(isp, chan, handle, portid, PLOGX_FLG_CMD_PLOGI);
3996 } else if ((r & 0xffff) == MBOX_PORT_ID_USED) {
3998 * If we get here, then the firmwware still thinks we're logged into this device, but with a different
3999 * handle. We need to break that association. We used to try and just substitute the handle, but then
4000 * failed to get any data via isp_getpdb (below).
4002 if (isp_plogx(isp, chan, r >> 16, portid, PLOGX_FLG_CMD_LOGO | PLOGX_FLG_IMPLICIT | PLOGX_FLG_FREE_NPHDL)) {
4003 isp_prt(isp, ISP_LOGERR, "baw... logout of %x failed", r >> 16);
4005 if (FCPARAM(isp, chan)->isp_loopstate != LOOP_SCANNING_FABRIC)
4007 r = isp_plogx(isp, chan, handle, portid, PLOGX_FLG_CMD_PLOGI);
4011 } else if ((r & 0xffff) == MBOX_LOOP_ID_USED) {
4012 /* Try the next handle. */
4013 handle = isp_next_handle(isp, ohp);
4022 isp_prt(isp, ISP_LOGWARN, "Chan %d PLOGI 0x%06x failed", chan, portid);
4027 * If we successfully logged into it, get the PDB for it
4028 * so we can crosscheck that it is still what we think it
4029 * is and that we also have the role it plays
4031 r = isp_getpdb(isp, chan, handle, p);
4033 isp_prt(isp, ISP_LOGERR, "Chan %d new device 0x%06x@0x%x disappeared", chan, portid, handle);
4037 if (p->handle != handle || p->portid != portid) {
4038 isp_prt(isp, ISP_LOGERR, "Chan %d new device 0x%06x@0x%x changed (0x%06x@0x%0x)",
4039 chan, portid, handle, p->portid, p->handle);
4046 isp_send_change_request(ispsoftc_t *isp, int chan)
4050 MBSINIT(&mbs, MBOX_SEND_CHANGE_REQUEST, MBLOGALL, 500000);
4051 mbs.param[1] = 0x03;
4052 mbs.param[9] = chan;
4053 isp_mboxcmd(isp, &mbs);
4054 if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
4057 isp_prt(isp, ISP_LOGWARN, "Chan %d Send Change Request: 0x%x",
4058 chan, mbs.param[0]);
4064 isp_register_fc4_type(ispsoftc_t *isp, int chan)
4066 fcparam *fcp = FCPARAM(isp, chan);
4068 ct_hdr_t *ct = &rp.rftid_hdr;
4069 uint8_t local[SNS_RFT_ID_REQ_SIZE];
4070 sns_screq_t *reqp = (sns_screq_t *) local;
4071 uint8_t *scp = fcp->isp_scratch;
4073 if (FC_SCRATCH_ACQUIRE(isp, chan)) {
4074 isp_prt(isp, ISP_LOGERR, sacq);
4079 /* Build the CT command and execute via pass-through. */
4080 ISP_MEMZERO(&rp, sizeof(rp));
4081 ct->ct_revision = CT_REVISION;
4082 ct->ct_fcs_type = CT_FC_TYPE_FC;
4083 ct->ct_fcs_subtype = CT_FC_SUBTYPE_NS;
4084 ct->ct_cmd_resp = SNS_RFT_ID;
4085 ct->ct_bcnt_resid = (sizeof (rft_id_t) - sizeof (ct_hdr_t)) >> 2;
4086 rp.rftid_portid[0] = fcp->isp_portid >> 16;
4087 rp.rftid_portid[1] = fcp->isp_portid >> 8;
4088 rp.rftid_portid[2] = fcp->isp_portid;
4089 rp.rftid_fc4types[FC4_SCSI >> 5] = 1 << (FC4_SCSI & 0x1f);
4090 isp_put_rft_id(isp, &rp, (rft_id_t *)scp);
4092 if (isp_ct_passthru(isp, chan, sizeof(rft_id_t), sizeof(ct_hdr_t))) {
4093 FC_SCRATCH_RELEASE(isp, chan);
4097 /* Build the SNS request and execute via firmware. */
4098 ISP_MEMZERO((void *) reqp, SNS_RFT_ID_REQ_SIZE);
4099 reqp->snscb_rblen = sizeof (ct_hdr_t) >> 1;
4100 reqp->snscb_addr[RQRSP_ADDR0015] = DMA_WD0(fcp->isp_scdma);
4101 reqp->snscb_addr[RQRSP_ADDR1631] = DMA_WD1(fcp->isp_scdma);
4102 reqp->snscb_addr[RQRSP_ADDR3247] = DMA_WD2(fcp->isp_scdma);
4103 reqp->snscb_addr[RQRSP_ADDR4863] = DMA_WD3(fcp->isp_scdma);
4104 reqp->snscb_sblen = 22;
4105 reqp->snscb_data[0] = SNS_RFT_ID;
4106 reqp->snscb_data[4] = fcp->isp_portid & 0xffff;
4107 reqp->snscb_data[5] = (fcp->isp_portid >> 16) & 0xff;
4108 reqp->snscb_data[6] = (1 << FC4_SCSI);
4109 isp_put_sns_request(isp, reqp, (sns_screq_t *)scp);
4111 if (isp_ct_sns(isp, chan, SNS_RFT_ID_REQ_SIZE, sizeof(ct_hdr_t))) {
4112 FC_SCRATCH_RELEASE(isp, chan);
4117 isp_get_ct_hdr(isp, (ct_hdr_t *) scp, ct);
4118 FC_SCRATCH_RELEASE(isp, chan);
4119 if (ct->ct_cmd_resp == LS_RJT) {
4120 isp_prt(isp, ISP_LOG_SANCFG|ISP_LOG_WARN1, "Chan %d Register FC4 Type rejected", chan);
4122 } else if (ct->ct_cmd_resp == LS_ACC) {
4123 isp_prt(isp, ISP_LOG_SANCFG, "Chan %d Register FC4 Type accepted", chan);
4125 isp_prt(isp, ISP_LOGWARN, "Chan %d Register FC4 Type: 0x%x", chan, ct->ct_cmd_resp);
4132 isp_register_fc4_features_24xx(ispsoftc_t *isp, int chan)
4134 fcparam *fcp = FCPARAM(isp, chan);
4137 uint8_t *scp = fcp->isp_scratch;
4139 if (FC_SCRATCH_ACQUIRE(isp, chan)) {
4140 isp_prt(isp, ISP_LOGERR, sacq);
4145 * Build the CT header and command in memory.
4147 ISP_MEMZERO(&rp, sizeof(rp));
4149 ct->ct_revision = CT_REVISION;
4150 ct->ct_fcs_type = CT_FC_TYPE_FC;
4151 ct->ct_fcs_subtype = CT_FC_SUBTYPE_NS;
4152 ct->ct_cmd_resp = SNS_RFF_ID;
4153 ct->ct_bcnt_resid = (sizeof (rff_id_t) - sizeof (ct_hdr_t)) >> 2;
4154 rp.rffid_portid[0] = fcp->isp_portid >> 16;
4155 rp.rffid_portid[1] = fcp->isp_portid >> 8;
4156 rp.rffid_portid[2] = fcp->isp_portid;
4157 rp.rffid_fc4features = 0;
4158 if (fcp->role & ISP_ROLE_TARGET)
4159 rp.rffid_fc4features |= 1;
4160 if (fcp->role & ISP_ROLE_INITIATOR)
4161 rp.rffid_fc4features |= 2;
4162 rp.rffid_fc4type = FC4_SCSI;
4163 isp_put_rff_id(isp, &rp, (rff_id_t *)scp);
4164 if (isp->isp_dblev & ISP_LOGDEBUG1)
4165 isp_print_bytes(isp, "CT request", sizeof(rft_id_t), scp);
4167 if (isp_ct_passthru(isp, chan, sizeof(rft_id_t), sizeof(ct_hdr_t))) {
4168 FC_SCRATCH_RELEASE(isp, chan);
4172 isp_get_ct_hdr(isp, (ct_hdr_t *) scp, ct);
4173 FC_SCRATCH_RELEASE(isp, chan);
4174 if (ct->ct_cmd_resp == LS_RJT) {
4175 isp_prt(isp, ISP_LOG_SANCFG|ISP_LOG_WARN1,
4176 "Chan %d Register FC4 Features rejected", chan);
4178 } else if (ct->ct_cmd_resp == LS_ACC) {
4179 isp_prt(isp, ISP_LOG_SANCFG,
4180 "Chan %d Register FC4 Features accepted", chan);
4182 isp_prt(isp, ISP_LOGWARN,
4183 "Chan %d Register FC4 Features: 0x%x", chan, ct->ct_cmd_resp);
4190 isp_register_port_name_24xx(ispsoftc_t *isp, int chan)
4192 fcparam *fcp = FCPARAM(isp, chan);
4195 uint8_t *scp = fcp->isp_scratch;
4198 if (FC_SCRATCH_ACQUIRE(isp, chan)) {
4199 isp_prt(isp, ISP_LOGERR, sacq);
4204 * Build the CT header and command in memory.
4206 ISP_MEMZERO(&rp, sizeof(rp));
4207 ct = &rp.rspnid_hdr;
4208 ct->ct_revision = CT_REVISION;
4209 ct->ct_fcs_type = CT_FC_TYPE_FC;
4210 ct->ct_fcs_subtype = CT_FC_SUBTYPE_NS;
4211 ct->ct_cmd_resp = SNS_RSPN_ID;
4212 rp.rspnid_portid[0] = fcp->isp_portid >> 16;
4213 rp.rspnid_portid[1] = fcp->isp_portid >> 8;
4214 rp.rspnid_portid[2] = fcp->isp_portid;
4215 rp.rspnid_length = 0;
4216 len = offsetof(rspn_id_t, rspnid_name);
4217 mtx_lock(&prison0.pr_mtx);
4218 rp.rspnid_length += sprintf(&scp[len + rp.rspnid_length],
4219 "%s", prison0.pr_hostname[0] ? prison0.pr_hostname : "FreeBSD");
4220 mtx_unlock(&prison0.pr_mtx);
4221 rp.rspnid_length += sprintf(&scp[len + rp.rspnid_length],
4222 ":%s", device_get_nameunit(isp->isp_dev));
4224 rp.rspnid_length += sprintf(&scp[len + rp.rspnid_length],
4227 len += rp.rspnid_length;
4228 ct->ct_bcnt_resid = (len - sizeof(ct_hdr_t)) >> 2;
4229 isp_put_rspn_id(isp, &rp, (rspn_id_t *)scp);
4231 if (isp_ct_passthru(isp, chan, len, sizeof(ct_hdr_t))) {
4232 FC_SCRATCH_RELEASE(isp, chan);
4236 isp_get_ct_hdr(isp, (ct_hdr_t *) scp, ct);
4237 FC_SCRATCH_RELEASE(isp, chan);
4238 if (ct->ct_cmd_resp == LS_RJT) {
4239 isp_prt(isp, ISP_LOG_SANCFG|ISP_LOG_WARN1,
4240 "Chan %d Register Symbolic Port Name rejected", chan);
4242 } else if (ct->ct_cmd_resp == LS_ACC) {
4243 isp_prt(isp, ISP_LOG_SANCFG,
4244 "Chan %d Register Symbolic Port Name accepted", chan);
4246 isp_prt(isp, ISP_LOGWARN,
4247 "Chan %d Register Symbolic Port Name: 0x%x", chan, ct->ct_cmd_resp);
4254 isp_register_node_name_24xx(ispsoftc_t *isp, int chan)
4256 fcparam *fcp = FCPARAM(isp, chan);
4259 uint8_t *scp = fcp->isp_scratch;
4262 if (FC_SCRATCH_ACQUIRE(isp, chan)) {
4263 isp_prt(isp, ISP_LOGERR, sacq);
4268 * Build the CT header and command in memory.
4270 ISP_MEMZERO(&rp, sizeof(rp));
4271 ct = &rp.rsnnnn_hdr;
4272 ct->ct_revision = CT_REVISION;
4273 ct->ct_fcs_type = CT_FC_TYPE_FC;
4274 ct->ct_fcs_subtype = CT_FC_SUBTYPE_NS;
4275 ct->ct_cmd_resp = SNS_RSNN_NN;
4276 MAKE_NODE_NAME_FROM_WWN(rp.rsnnnn_nodename, fcp->isp_wwnn);
4277 rp.rsnnnn_length = 0;
4278 len = offsetof(rsnn_nn_t, rsnnnn_name);
4279 mtx_lock(&prison0.pr_mtx);
4280 rp.rsnnnn_length += sprintf(&scp[len + rp.rsnnnn_length],
4281 "%s", prison0.pr_hostname[0] ? prison0.pr_hostname : "FreeBSD");
4282 mtx_unlock(&prison0.pr_mtx);
4283 len += rp.rsnnnn_length;
4284 ct->ct_bcnt_resid = (len - sizeof(ct_hdr_t)) >> 2;
4285 isp_put_rsnn_nn(isp, &rp, (rsnn_nn_t *)scp);
4287 if (isp_ct_passthru(isp, chan, len, sizeof(ct_hdr_t))) {
4288 FC_SCRATCH_RELEASE(isp, chan);
4292 isp_get_ct_hdr(isp, (ct_hdr_t *) scp, ct);
4293 FC_SCRATCH_RELEASE(isp, chan);
4294 if (ct->ct_cmd_resp == LS_RJT) {
4295 isp_prt(isp, ISP_LOG_SANCFG|ISP_LOG_WARN1,
4296 "Chan %d Register Symbolic Node Name rejected", chan);
4298 } else if (ct->ct_cmd_resp == LS_ACC) {
4299 isp_prt(isp, ISP_LOG_SANCFG,
4300 "Chan %d Register Symbolic Node Name accepted", chan);
4302 isp_prt(isp, ISP_LOGWARN,
4303 "Chan %d Register Symbolic Node Name: 0x%x", chan, ct->ct_cmd_resp);
4310 isp_next_handle(ispsoftc_t *isp, uint16_t *ohp)
4314 uint16_t handle, minh, maxh;
4317 if (ISP_CAP_2KLOGIN(isp)) {
4319 maxh = NPH_RESERVED - 1;
4327 if (handle == NIL_HANDLE) {
4331 if (handle > maxh) {
4333 isp_prt(isp, ISP_LOGERR, "Out of port handles!");
4334 return (NIL_HANDLE);
4339 for (chan = 0; chan < isp->isp_nchan; chan++) {
4340 fcp = FCPARAM(isp, chan);
4341 if (fcp->role == ISP_ROLE_NONE)
4343 for (i = 0; i < MAX_FC_TARG; i++) {
4344 if (fcp->portdb[i].state != FC_PORTDB_STATE_NIL &&
4345 fcp->portdb[i].handle == handle)
4354 * Start a command. Locking is assumed done in the caller.
4362 uint8_t local[QENTRY_LEN];
4367 int target, dmaresult;
4373 * Check command CDB length, etc.. We really are limited to 16 bytes
4374 * for Fibre Channel, but can do up to 44 bytes in parallel SCSI,
4375 * but probably only if we're running fairly new firmware (we'll
4376 * let the old f/w choke on an extended command queue entry).
4379 if (XS_CDBLEN(xs) > (IS_FC(isp)? 16 : 44) || XS_CDBLEN(xs) == 0) {
4380 isp_prt(isp, ISP_LOGERR, "unsupported cdb length (%d, CDB[0]=0x%x)", XS_CDBLEN(xs), XS_CDBP(xs)[0] & 0xff);
4381 XS_SETERR(xs, HBA_REQINVAL);
4382 return (CMD_COMPLETE);
4386 * Translate the target to device handle as appropriate, checking
4387 * for correct device state as well.
4389 target = XS_TGT(xs);
4391 fcparam *fcp = FCPARAM(isp, XS_CHANNEL(xs));
4393 if ((fcp->role & ISP_ROLE_INITIATOR) == 0) {
4394 isp_prt(isp, ISP_LOG_WARN1,
4395 "%d.%d.%jx I am not an initiator",
4396 XS_CHANNEL(xs), target, (uintmax_t)XS_LUN(xs));
4397 XS_SETERR(xs, HBA_SELTIMEOUT);
4398 return (CMD_COMPLETE);
4401 if (isp->isp_state != ISP_RUNSTATE) {
4402 isp_prt(isp, ISP_LOGERR, "Adapter not at RUNSTATE");
4403 XS_SETERR(xs, HBA_BOTCH);
4404 return (CMD_COMPLETE);
4407 isp_prt(isp, ISP_LOGDEBUG2, "XS_TGT(xs)=%d", target);
4408 lp = &fcp->portdb[target];
4409 if (target < 0 || target >= MAX_FC_TARG ||
4410 lp->is_target == 0) {
4411 XS_SETERR(xs, HBA_SELTIMEOUT);
4412 return (CMD_COMPLETE);
4414 if (fcp->isp_loopstate != LOOP_READY) {
4415 isp_prt(isp, ISP_LOGDEBUG1,
4416 "%d.%d.%jx loop is not ready",
4417 XS_CHANNEL(xs), target, (uintmax_t)XS_LUN(xs));
4418 return (CMD_RQLATER);
4420 if (lp->state == FC_PORTDB_STATE_ZOMBIE) {
4421 isp_prt(isp, ISP_LOGDEBUG1,
4422 "%d.%d.%jx target zombie",
4423 XS_CHANNEL(xs), target, (uintmax_t)XS_LUN(xs));
4424 return (CMD_RQLATER);
4426 if (lp->state != FC_PORTDB_STATE_VALID) {
4427 isp_prt(isp, ISP_LOGDEBUG1,
4428 "%d.%d.%jx bad db port state 0x%x",
4429 XS_CHANNEL(xs), target, (uintmax_t)XS_LUN(xs), lp->state);
4430 XS_SETERR(xs, HBA_SELTIMEOUT);
4431 return (CMD_COMPLETE);
4434 sdparam *sdp = SDPARAM(isp, XS_CHANNEL(xs));
4435 if (isp->isp_state != ISP_RUNSTATE) {
4436 isp_prt(isp, ISP_LOGERR, "Adapter not at RUNSTATE");
4437 XS_SETERR(xs, HBA_BOTCH);
4438 return (CMD_COMPLETE);
4442 isp_spi_update(isp, XS_CHANNEL(xs));
4449 qep = isp_getrqentry(isp);
4451 isp_prt(isp, ISP_LOG_WARN1, "Request Queue Overflow");
4452 XS_SETERR(xs, HBA_BOTCH);
4453 return (CMD_EAGAIN);
4455 XS_SETERR(xs, HBA_NOERROR);
4458 * Now see if we need to synchronize the ISP with respect to anything.
4459 * We do dual duty here (cough) for synchronizing for buses other
4460 * than which we got here to send a command to.
4462 reqp = (ispreq_t *) local;
4463 ISP_MEMZERO(local, QENTRY_LEN);
4464 if (ISP_TST_SENDMARKER(isp, XS_CHANNEL(xs))) {
4466 isp_marker_24xx_t *m = (isp_marker_24xx_t *) reqp;
4467 m->mrk_header.rqs_entry_count = 1;
4468 m->mrk_header.rqs_entry_type = RQSTYPE_MARKER;
4469 m->mrk_modifier = SYNC_ALL;
4470 m->mrk_vphdl = XS_CHANNEL(xs);
4471 isp_put_marker_24xx(isp, m, qep);
4473 isp_marker_t *m = (isp_marker_t *) reqp;
4474 m->mrk_header.rqs_entry_count = 1;
4475 m->mrk_header.rqs_entry_type = RQSTYPE_MARKER;
4476 m->mrk_target = (XS_CHANNEL(xs) << 7); /* bus # */
4477 m->mrk_modifier = SYNC_ALL;
4478 isp_put_marker(isp, m, qep);
4480 ISP_SYNC_REQUEST(isp);
4481 ISP_SET_SENDMARKER(isp, XS_CHANNEL(xs), 0);
4485 reqp->req_header.rqs_entry_count = 1;
4488 * Select and install Header Code.
4489 * Note that it might be overridden before going out
4490 * if we're on a 64 bit platform. The lower level
4491 * code (isp_send_cmd) will select the appropriate
4492 * 64 bit variant if it needs to.
4495 reqp->req_header.rqs_entry_type = RQSTYPE_T7RQS;
4496 } else if (IS_FC(isp)) {
4497 reqp->req_header.rqs_entry_type = RQSTYPE_T2RQS;
4499 if (XS_CDBLEN(xs) > 12) {
4500 reqp->req_header.rqs_entry_type = RQSTYPE_CMDONLY;
4502 reqp->req_header.rqs_entry_type = RQSTYPE_REQUEST;
4507 * Set task attributes
4512 ttype = XS_TAG_TYPE(xs);
4514 ttype = REQFLAG_STAG;
4516 if (ttype == REQFLAG_OTAG) {
4517 ttype = FCP_CMND_TASK_ATTR_ORDERED;
4518 } else if (ttype == REQFLAG_HTAG) {
4519 ttype = FCP_CMND_TASK_ATTR_HEAD;
4521 ttype = FCP_CMND_TASK_ATTR_SIMPLE;
4523 ((ispreqt7_t *)reqp)->req_task_attribute = ttype;
4524 } else if (IS_FC(isp)) {
4526 * See comment in isp_intr_respq
4528 /* XS_SET_RESID(xs, 0); */
4531 * Fibre Channel always requires some kind of tag.
4532 * The Qlogic drivers seem be happy not to use a tag,
4533 * but this breaks for some devices (IBM drives).
4536 ((ispreqt2_t *)reqp)->req_flags = XS_TAG_TYPE(xs);
4538 ((ispreqt2_t *)reqp)->req_flags = REQFLAG_STAG;
4541 sdparam *sdp = SDPARAM(isp, XS_CHANNEL(xs));
4542 if ((sdp->isp_devparam[target].actv_flags & DPARM_TQING) && XS_TAG_P(xs)) {
4543 reqp->req_flags = XS_TAG_TYPE(xs);
4548 * NB: we do not support long CDBs (yet)
4550 cdblen = XS_CDBLEN(xs);
4553 if (cdblen > sizeof (reqp->req_cdb)) {
4554 isp_prt(isp, ISP_LOGERR, "Command Length %u too long for this chip", cdblen);
4555 XS_SETERR(xs, HBA_REQINVAL);
4556 return (CMD_COMPLETE);
4558 reqp->req_target = target | (XS_CHANNEL(xs) << 7);
4559 reqp->req_lun_trn = XS_LUN(xs);
4560 reqp->req_cdblen = cdblen;
4561 tptr = &reqp->req_time;
4562 cdbp = reqp->req_cdb;
4563 } else if (IS_24XX(isp)) {
4564 ispreqt7_t *t7 = (ispreqt7_t *)local;
4566 if (cdblen > sizeof (t7->req_cdb)) {
4567 isp_prt(isp, ISP_LOGERR, "Command Length %u too long for this chip", cdblen);
4568 XS_SETERR(xs, HBA_REQINVAL);
4569 return (CMD_COMPLETE);
4572 t7->req_nphdl = lp->handle;
4573 t7->req_tidlo = lp->portid;
4574 t7->req_tidhi = lp->portid >> 16;
4575 t7->req_vpidx = ISP_GET_VPIDX(isp, XS_CHANNEL(xs));
4576 be64enc(t7->req_lun, CAM_EXTLUN_BYTE_SWIZZLE(XS_LUN(xs)));
4577 if (FCPARAM(isp, XS_CHANNEL(xs))->fctape_enabled && (lp->prli_word3 & PRLI_WD3_RETRY)) {
4578 if (FCP_NEXT_CRN(isp, &t7->req_crn, xs)) {
4579 isp_prt(isp, ISP_LOG_WARN1,
4580 "%d.%d.%jx cannot generate next CRN",
4581 XS_CHANNEL(xs), target, (uintmax_t)XS_LUN(xs));
4582 XS_SETERR(xs, HBA_BOTCH);
4583 return (CMD_EAGAIN);
4586 tptr = &t7->req_time;
4589 ispreqt2_t *t2 = (ispreqt2_t *)local;
4591 if (cdblen > sizeof t2->req_cdb) {
4592 isp_prt(isp, ISP_LOGERR, "Command Length %u too long for this chip", cdblen);
4593 XS_SETERR(xs, HBA_REQINVAL);
4594 return (CMD_COMPLETE);
4596 if (FCPARAM(isp, XS_CHANNEL(xs))->fctape_enabled && (lp->prli_word3 & PRLI_WD3_RETRY)) {
4597 if (FCP_NEXT_CRN(isp, &t2->req_crn, xs)) {
4598 isp_prt(isp, ISP_LOG_WARN1,
4599 "%d.%d.%jx cannot generate next CRN",
4600 XS_CHANNEL(xs), target, (uintmax_t)XS_LUN(xs));
4601 XS_SETERR(xs, HBA_BOTCH);
4602 return (CMD_EAGAIN);
4605 if (ISP_CAP_2KLOGIN(isp)) {
4606 ispreqt2e_t *t2e = (ispreqt2e_t *)local;
4607 t2e->req_target = lp->handle;
4608 t2e->req_scclun = XS_LUN(xs);
4609 tptr = &t2e->req_time;
4610 cdbp = t2e->req_cdb;
4611 } else if (ISP_CAP_SCCFW(isp)) {
4612 t2->req_target = lp->handle;
4613 t2->req_scclun = XS_LUN(xs);
4614 tptr = &t2->req_time;
4617 t2->req_target = lp->handle;
4618 t2->req_lun_trn = XS_LUN(xs);
4619 tptr = &t2->req_time;
4623 *tptr = XS_TIME(xs);
4624 ISP_MEMCPY(cdbp, XS_CDBP(xs), cdblen);
4626 /* Whew. Thankfully the same for type 7 requests */
4627 reqp->req_handle = isp_allocate_handle(isp, xs, ISP_HANDLE_INITIATOR);
4628 if (reqp->req_handle == 0) {
4629 isp_prt(isp, ISP_LOG_WARN1, "out of xflist pointers");
4630 XS_SETERR(xs, HBA_BOTCH);
4631 return (CMD_EAGAIN);
4635 * Set up DMA and/or do any platform dependent swizzling of the request entry
4636 * so that the Qlogic F/W understands what is being asked of it.
4638 * The callee is responsible for adding all requests at this point.
4640 dmaresult = ISP_DMASETUP(isp, xs, reqp);
4641 if (dmaresult != CMD_QUEUED) {
4642 isp_destroy_handle(isp, reqp->req_handle);
4644 * dmasetup sets actual error in packet, and
4645 * return what we were given to return.
4649 isp_xs_prt(isp, xs, ISP_LOGDEBUG0, "START cmd cdb[0]=0x%x datalen %ld", XS_CDBP(xs)[0], (long) XS_XFRLEN(xs));
4650 return (CMD_QUEUED);
4655 * Locks (ints blocked) assumed held.
4659 isp_control(ispsoftc_t *isp, ispctl_t ctl, ...)
4668 case ISPCTL_RESET_BUS:
4670 * Issue a bus reset.
4673 isp_prt(isp, ISP_LOGERR, "BUS RESET NOT IMPLEMENTED");
4675 } else if (IS_FC(isp)) {
4680 chan = va_arg(ap, int);
4682 mbs.param[1] = SDPARAM(isp, chan)->isp_bus_reset_delay;
4683 if (mbs.param[1] < 2) {
4686 mbs.param[2] = chan;
4688 MBSINIT(&mbs, MBOX_BUS_RESET, MBLOGALL, 0);
4689 ISP_SET_SENDMARKER(isp, chan, 1);
4690 isp_mboxcmd(isp, &mbs);
4691 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
4694 isp_prt(isp, ISP_LOGINFO, "driver initiated bus reset of bus %d", chan);
4697 case ISPCTL_RESET_DEV:
4699 chan = va_arg(ap, int);
4700 tgt = va_arg(ap, int);
4703 uint8_t local[QENTRY_LEN];
4705 isp24xx_statusreq_t *sp;
4706 fcparam *fcp = FCPARAM(isp, chan);
4709 if (tgt < 0 || tgt >= MAX_FC_TARG) {
4710 isp_prt(isp, ISP_LOGWARN, "Chan %d trying to reset bad target %d", chan, tgt);
4713 lp = &fcp->portdb[tgt];
4714 if (lp->is_target == 0 ||
4715 lp->state != FC_PORTDB_STATE_VALID) {
4716 isp_prt(isp, ISP_LOGWARN, "Chan %d abort of no longer valid target %d", chan, tgt);
4720 tmf = (isp24xx_tmf_t *) local;
4721 ISP_MEMZERO(tmf, QENTRY_LEN);
4722 tmf->tmf_header.rqs_entry_type = RQSTYPE_TSK_MGMT;
4723 tmf->tmf_header.rqs_entry_count = 1;
4724 tmf->tmf_nphdl = lp->handle;
4726 tmf->tmf_timeout = 4;
4727 tmf->tmf_flags = ISP24XX_TMF_TARGET_RESET;
4728 tmf->tmf_tidlo = lp->portid;
4729 tmf->tmf_tidhi = lp->portid >> 16;
4730 tmf->tmf_vpidx = ISP_GET_VPIDX(isp, chan);
4731 isp_put_24xx_tmf(isp, tmf, isp->isp_iocb);
4732 if (isp->isp_dblev & ISP_LOGDEBUG1)
4733 isp_print_bytes(isp, "TMF IOCB request", QENTRY_LEN, isp->isp_iocb);
4734 MEMORYBARRIER(isp, SYNC_IFORDEV, 0, QENTRY_LEN, chan);
4735 fcp->sendmarker = 1;
4737 isp_prt(isp, ISP_LOGALL, "Chan %d Reset N-Port Handle 0x%04x @ Port 0x%06x", chan, lp->handle, lp->portid);
4738 MBSINIT(&mbs, MBOX_EXEC_COMMAND_IOCB_A64, MBLOGALL,
4739 MBCMD_DEFAULT_TIMEOUT + tmf->tmf_timeout * 1000000);
4740 mbs.param[1] = QENTRY_LEN;
4741 mbs.param[2] = DMA_WD1(isp->isp_iocb_dma);
4742 mbs.param[3] = DMA_WD0(isp->isp_iocb_dma);
4743 mbs.param[6] = DMA_WD3(isp->isp_iocb_dma);
4744 mbs.param[7] = DMA_WD2(isp->isp_iocb_dma);
4745 isp_mboxcmd(isp, &mbs);
4746 if (mbs.param[0] != MBOX_COMMAND_COMPLETE)
4749 MEMORYBARRIER(isp, SYNC_IFORCPU, QENTRY_LEN, QENTRY_LEN, chan);
4750 if (isp->isp_dblev & ISP_LOGDEBUG1)
4751 isp_print_bytes(isp, "TMF IOCB response", QENTRY_LEN, &((isp24xx_statusreq_t *)isp->isp_iocb)[1]);
4752 sp = (isp24xx_statusreq_t *) local;
4753 isp_get_24xx_response(isp, &((isp24xx_statusreq_t *)isp->isp_iocb)[1], sp);
4754 if (sp->req_completion_status == 0) {
4757 isp_prt(isp, ISP_LOGWARN, "Chan %d reset of target %d returned 0x%x", chan, tgt, sp->req_completion_status);
4759 } else if (IS_FC(isp)) {
4760 if (ISP_CAP_2KLOGIN(isp)) {
4762 mbs.ibits = (1 << 10);
4764 mbs.param[1] = (tgt << 8);
4767 mbs.param[1] = (chan << 15) | (tgt << 8);
4769 MBSINIT(&mbs, MBOX_ABORT_TARGET, MBLOGALL, 0);
4770 mbs.param[2] = 3; /* 'delay', in seconds */
4771 isp_mboxcmd(isp, &mbs);
4772 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
4775 isp_prt(isp, ISP_LOGINFO, "Target %d on Bus %d Reset Succeeded", tgt, chan);
4776 ISP_SET_SENDMARKER(isp, chan, 1);
4779 case ISPCTL_ABORT_CMD:
4781 xs = va_arg(ap, XS_T *);
4785 chan = XS_CHANNEL(xs);
4787 handle = isp_find_handle(isp, xs);
4789 isp_prt(isp, ISP_LOGWARN, "cannot find handle for command to abort");
4793 isp24xx_abrt_t local, *ab = &local;
4797 fcp = FCPARAM(isp, chan);
4798 if (tgt < 0 || tgt >= MAX_FC_TARG) {
4799 isp_prt(isp, ISP_LOGWARN, "Chan %d trying to abort bad target %d", chan, tgt);
4802 lp = &fcp->portdb[tgt];
4803 if (lp->is_target == 0 ||
4804 lp->state != FC_PORTDB_STATE_VALID) {
4805 isp_prt(isp, ISP_LOGWARN, "Chan %d abort of no longer valid target %d", chan, tgt);
4808 isp_prt(isp, ISP_LOGALL, "Chan %d Abort Cmd for N-Port 0x%04x @ Port 0x%06x", chan, lp->handle, lp->portid);
4809 ISP_MEMZERO(ab, QENTRY_LEN);
4810 ab->abrt_header.rqs_entry_type = RQSTYPE_ABORT_IO;
4811 ab->abrt_header.rqs_entry_count = 1;
4812 ab->abrt_handle = lp->handle;
4813 ab->abrt_cmd_handle = handle;
4814 ab->abrt_tidlo = lp->portid;
4815 ab->abrt_tidhi = lp->portid >> 16;
4816 ab->abrt_vpidx = ISP_GET_VPIDX(isp, chan);
4817 isp_put_24xx_abrt(isp, ab, isp->isp_iocb);
4818 if (isp->isp_dblev & ISP_LOGDEBUG1)
4819 isp_print_bytes(isp, "AB IOCB quest", QENTRY_LEN, isp->isp_iocb);
4820 MEMORYBARRIER(isp, SYNC_IFORDEV, 0, 2 * QENTRY_LEN, chan);
4822 ISP_MEMZERO(&mbs, sizeof (mbs));
4823 MBSINIT(&mbs, MBOX_EXEC_COMMAND_IOCB_A64, MBLOGALL, 5000000);
4824 mbs.param[1] = QENTRY_LEN;
4825 mbs.param[2] = DMA_WD1(isp->isp_iocb_dma);
4826 mbs.param[3] = DMA_WD0(isp->isp_iocb_dma);
4827 mbs.param[6] = DMA_WD3(isp->isp_iocb_dma);
4828 mbs.param[7] = DMA_WD2(isp->isp_iocb_dma);
4830 isp_mboxcmd(isp, &mbs);
4831 if (mbs.param[0] != MBOX_COMMAND_COMPLETE)
4834 MEMORYBARRIER(isp, SYNC_IFORCPU, QENTRY_LEN, QENTRY_LEN, chan);
4835 if (isp->isp_dblev & ISP_LOGDEBUG1)
4836 isp_print_bytes(isp, "AB IOCB response", QENTRY_LEN, &((isp24xx_abrt_t *)isp->isp_iocb)[1]);
4837 isp_get_24xx_abrt(isp, &((isp24xx_abrt_t *)isp->isp_iocb)[1], ab);
4838 if (ab->abrt_nphdl == ISP24XX_ABRT_OKAY) {
4841 isp_prt(isp, ISP_LOGWARN, "Chan %d handle %d abort returned 0x%x", chan, tgt, ab->abrt_nphdl);
4843 } else if (IS_FC(isp)) {
4844 if (ISP_CAP_SCCFW(isp)) {
4845 if (ISP_CAP_2KLOGIN(isp)) {
4848 mbs.param[1] = tgt << 8;
4850 mbs.param[6] = XS_LUN(xs);
4852 mbs.param[1] = tgt << 8 | XS_LUN(xs);
4855 mbs.param[1] = (chan << 15) | (tgt << 8) | XS_LUN(xs);
4857 MBSINIT(&mbs, MBOX_ABORT,
4858 MBLOGALL & ~MBLOGMASK(MBOX_COMMAND_ERROR), 0);
4859 mbs.param[2] = handle;
4860 isp_mboxcmd(isp, &mbs);
4861 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
4866 case ISPCTL_UPDATE_PARAMS:
4869 chan = va_arg(ap, int);
4871 isp_spi_update(isp, chan);
4874 case ISPCTL_FCLINK_TEST:
4879 chan = va_arg(ap, int);
4880 usdelay = va_arg(ap, int);
4885 return (isp_fclink_test(isp, chan, usdelay));
4889 case ISPCTL_SCAN_FABRIC:
4893 chan = va_arg(ap, int);
4895 return (isp_scan_fabric(isp, chan));
4899 case ISPCTL_SCAN_LOOP:
4903 chan = va_arg(ap, int);
4905 return (isp_scan_loop(isp, chan));
4909 case ISPCTL_PDB_SYNC:
4913 chan = va_arg(ap, int);
4915 return (isp_pdb_sync(isp, chan));
4919 case ISPCTL_SEND_LIP:
4921 if (IS_FC(isp) && !IS_24XX(isp)) {
4922 MBSINIT(&mbs, MBOX_INIT_LIP, MBLOGALL, 0);
4923 if (ISP_CAP_2KLOGIN(isp)) {
4924 mbs.ibits = (1 << 10);
4926 isp_mboxcmd(isp, &mbs);
4927 if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
4933 case ISPCTL_GET_PDB:
4937 chan = va_arg(ap, int);
4938 tgt = va_arg(ap, int);
4939 pdb = va_arg(ap, isp_pdb_t *);
4941 return (isp_getpdb(isp, chan, tgt, pdb));
4945 case ISPCTL_GET_NAMES:
4947 uint64_t *wwnn, *wwnp;
4949 chan = va_arg(ap, int);
4950 tgt = va_arg(ap, int);
4951 wwnn = va_arg(ap, uint64_t *);
4952 wwnp = va_arg(ap, uint64_t *);
4954 if (wwnn == NULL && wwnp == NULL) {
4958 *wwnn = isp_get_wwn(isp, chan, tgt, 1);
4959 if (*wwnn == INI_NONE) {
4964 *wwnp = isp_get_wwn(isp, chan, tgt, 0);
4965 if (*wwnp == INI_NONE) {
4971 case ISPCTL_RUN_MBOXCMD:
4974 mbr = va_arg(ap, mbreg_t *);
4976 isp_mboxcmd(isp, mbr);
4985 p = va_arg(ap, isp_plcmd_t *);
4988 if ((p->flags & PLOGX_FLG_CMD_MASK) != PLOGX_FLG_CMD_PLOGI || (p->handle != NIL_HANDLE)) {
4989 return (isp_plogx(isp, p->channel, p->handle, p->portid, p->flags));
4992 isp_next_handle(isp, &p->handle);
4993 r = isp_plogx(isp, p->channel, p->handle, p->portid, p->flags);
4994 if ((r & 0xffff) == MBOX_PORT_ID_USED) {
4995 p->handle = r >> 16;
4999 } while ((r & 0xffff) == MBOX_LOOP_ID_USED);
5002 case ISPCTL_CHANGE_ROLE:
5007 chan = va_arg(ap, int);
5008 role = va_arg(ap, int);
5010 r = isp_fc_change_role(isp, chan, role);
5015 isp_prt(isp, ISP_LOGERR, "Unknown Control Opcode 0x%x", ctl);
5023 * Interrupt Service Routine(s).
5025 * External (OS) framework has done the appropriate locking,
5026 * and the locking will be held throughout this function.
5029 #ifdef ISP_TARGET_MODE
5031 isp_intr_atioq(ispsoftc_t *isp)
5033 uint8_t qe[QENTRY_LEN];
5036 uint32_t iptr, optr, oop;
5038 iptr = ISP_READ(isp, BIU2400_ATIO_RSPINP);
5039 optr = isp->isp_atioodx;
5040 while (optr != iptr) {
5042 MEMORYBARRIER(isp, SYNC_ATIOQ, oop, QENTRY_LEN, -1);
5043 addr = ISP_QUEUE_ENTRY(isp->isp_atioq, oop);
5044 isp_get_hdr(isp, addr, (isphdr_t *)qe);
5045 hp = (isphdr_t *)qe;
5046 switch (hp->rqs_entry_type) {
5047 case RQSTYPE_NOTIFY:
5049 (void) isp_target_notify(isp, addr, &oop);
5052 isp_print_qentry(isp, "?ATIOQ entry?", oop, addr);
5055 optr = ISP_NXT_QENTRY(oop, RESULT_QUEUE_LEN(isp));
5057 if (isp->isp_atioodx != optr) {
5058 ISP_WRITE(isp, BIU2400_ATIO_RSPOUTP, optr);
5059 isp->isp_atioodx = optr;
5065 isp_intr_async(ispsoftc_t *isp, uint16_t event)
5069 isp_parse_async_fc(isp, event);
5071 isp_parse_async(isp, event);
5075 isp_intr_mbox(ispsoftc_t *isp, uint16_t mbox0)
5079 if (!isp->isp_mboxbsy) {
5080 isp_prt(isp, ISP_LOGWARN, "mailbox 0x%x with no waiters", mbox0);
5083 obits = isp->isp_obits;
5084 isp->isp_mboxtmp[0] = mbox0;
5085 for (i = 1; i < ISP_NMBOX(isp); i++) {
5086 if ((obits & (1 << i)) == 0)
5088 isp->isp_mboxtmp[i] = ISP_READ(isp, MBOX_OFF(i));
5090 MBOX_NOTIFY_COMPLETE(isp);
5094 isp_intr_respq(ispsoftc_t *isp)
5097 uint8_t qe[QENTRY_LEN];
5098 ispstatusreq_t *sp = (ispstatusreq_t *)qe;
5099 isp24xx_statusreq_t *sp2 = (isp24xx_statusreq_t *)qe;
5101 uint8_t *resp, *snsp;
5102 int buddaboom, completion_status, cont = 0, etype, i;
5103 int req_status_flags, req_state_flags, scsi_status;
5104 uint32_t iptr, junk, cptr, optr, rlen, slen, sptr, totslen, resid;
5107 * We can't be getting this now.
5109 if (isp->isp_state != ISP_RUNSTATE) {
5110 isp_prt(isp, ISP_LOGINFO, "respq interrupt when not ready");
5114 iptr = ISP_READ(isp, isp->isp_respinrp);
5115 /* Debounce the 2300 if revision less than 2. */
5116 if (IS_2100(isp) || (IS_2300(isp) && isp->isp_revision < 2)) {
5119 iptr = ISP_READ(isp, isp->isp_respinrp);
5120 } while (junk != iptr);
5122 isp->isp_residx = iptr;
5124 optr = isp->isp_resodx;
5125 while (optr != iptr) {
5127 hp = (isphdr_t *) ISP_QUEUE_ENTRY(isp->isp_result, cptr);
5128 optr = ISP_NXT_QENTRY(optr, RESULT_QUEUE_LEN(isp));
5131 * Synchronize our view of this response queue entry.
5133 MEMORYBARRIER(isp, SYNC_RESULT, cptr, QENTRY_LEN, -1);
5134 if (isp->isp_dblev & ISP_LOGDEBUG1)
5135 isp_print_qentry(isp, "Response Queue Entry", cptr, hp);
5136 isp_get_hdr(isp, hp, &sp->req_header);
5137 etype = sp->req_header.rqs_entry_type;
5139 /* We expected Status Continuation, but got different IOCB. */
5140 if (cont > 0 && etype != RQSTYPE_STATUS_CONT) {
5145 if (IS_24XX(isp) && etype == RQSTYPE_RESPONSE) {
5146 isp_get_24xx_response(isp, (isp24xx_statusreq_t *)hp, sp2);
5147 scsi_status = sp2->req_scsi_status;
5148 completion_status = sp2->req_completion_status;
5149 req_status_flags = 0;
5150 if ((scsi_status & 0xff) != 0)
5151 req_state_flags = RQSF_GOT_STATUS;
5153 req_state_flags = 0;
5154 resid = sp2->req_resid;
5155 } else if (etype == RQSTYPE_RESPONSE) {
5156 isp_get_response(isp, (ispstatusreq_t *) hp, sp);
5157 scsi_status = sp->req_scsi_status;
5158 completion_status = sp->req_completion_status;
5159 req_status_flags = sp->req_status_flags;
5160 req_state_flags = sp->req_state_flags;
5161 resid = sp->req_resid;
5162 } else if (etype == RQSTYPE_RIO1) {
5163 isp_rio1_t *rio = (isp_rio1_t *) qe;
5164 isp_get_rio1(isp, (isp_rio1_t *) hp, rio);
5165 for (i = 0; i < rio->req_header.rqs_seqno; i++) {
5166 isp_fastpost_complete(isp, rio->req_handles[i]);
5168 ISP_MEMZERO(hp, QENTRY_LEN); /* PERF */
5170 } else if (etype == RQSTYPE_RIO2) {
5171 isp_prt(isp, ISP_LOGERR, "dropping RIO2 response");
5172 ISP_MEMZERO(hp, QENTRY_LEN); /* PERF */
5174 } else if (etype == RQSTYPE_STATUS_CONT) {
5175 ispstatus_cont_t *scp = (ispstatus_cont_t *)qe;
5176 isp_get_cont_response(isp, (ispstatus_cont_t *)hp, scp);
5178 i = min(cont, sizeof(scp->req_sense_data));
5179 XS_SENSE_APPEND(cont_xs, scp->req_sense_data, i);
5184 isp_prt(isp, ISP_LOGDEBUG0|ISP_LOG_CWARN,
5185 "Expecting Status Continuations for %u bytes",
5189 isp_prt(isp, ISP_LOG_WARN1, "Ignored Continuation Response");
5191 ISP_MEMZERO(hp, QENTRY_LEN); /* PERF */
5193 } else if (isp_handle_other_response(isp, etype, hp, &cptr)) {
5194 /* More then one IOCB could be consumed. */
5195 while (sptr != cptr) {
5196 ISP_MEMZERO(hp, QENTRY_LEN); /* PERF */
5197 sptr = ISP_NXT_QENTRY(sptr, RESULT_QUEUE_LEN(isp));
5198 hp = (isphdr_t *)ISP_QUEUE_ENTRY(isp->isp_result, sptr);
5200 ISP_MEMZERO(hp, QENTRY_LEN); /* PERF */
5201 optr = ISP_NXT_QENTRY(cptr, RESULT_QUEUE_LEN(isp));
5204 /* We don't know what was this -- log and skip. */
5205 isp_prt(isp, ISP_LOGERR, notresp, etype, cptr, optr);
5206 ISP_MEMZERO(hp, QENTRY_LEN); /* PERF */
5211 if (sp->req_header.rqs_flags & RQSFLAG_MASK) {
5212 if (sp->req_header.rqs_flags & RQSFLAG_CONTINUATION) {
5213 isp_print_qentry(isp, "unexpected continuation segment",
5217 if (sp->req_header.rqs_flags & RQSFLAG_FULL) {
5218 isp_prt(isp, ISP_LOG_WARN1, "internal queues full");
5220 * We'll synthesize a QUEUE FULL message below.
5223 if (sp->req_header.rqs_flags & RQSFLAG_BADHEADER) {
5224 isp_print_qentry(isp, "bad header flag",
5228 if (sp->req_header.rqs_flags & RQSFLAG_BADPACKET) {
5229 isp_print_qentry(isp, "bad request packet",
5233 if (sp->req_header.rqs_flags & RQSFLAG_BADCOUNT) {
5234 isp_print_qentry(isp, "invalid entry count",
5238 if (sp->req_header.rqs_flags & RQSFLAG_BADORDER) {
5239 isp_print_qentry(isp, "invalid IOCB ordering",
5245 xs = isp_find_xs(isp, sp->req_handle);
5247 uint8_t ts = completion_status & 0xff;
5249 * Only whine if this isn't the expected fallout of
5250 * aborting the command or resetting the target.
5252 if (etype != RQSTYPE_RESPONSE) {
5253 isp_prt(isp, ISP_LOGERR, "cannot find handle 0x%x (type 0x%x)", sp->req_handle, etype);
5254 } else if (ts != RQCS_ABORTED && ts != RQCS_RESET_OCCURRED) {
5255 isp_prt(isp, ISP_LOGERR, "cannot find handle 0x%x (status 0x%x)", sp->req_handle, ts);
5257 ISP_MEMZERO(hp, QENTRY_LEN); /* PERF */
5260 if (req_status_flags & RQSTF_BUS_RESET) {
5261 isp_prt(isp, ISP_LOG_WARN1, "%d.%d.%jx bus was reset",
5262 XS_CHANNEL(xs), XS_TGT(xs), (uintmax_t)XS_LUN(xs));
5263 XS_SETERR(xs, HBA_BUSRESET);
5264 ISP_SET_SENDMARKER(isp, XS_CHANNEL(xs), 1);
5267 isp_prt(isp, ISP_LOG_WARN1, "%d.%d.%jx buddaboom",
5268 XS_CHANNEL(xs), XS_TGT(xs), (uintmax_t)XS_LUN(xs));
5269 XS_SETERR(xs, HBA_BOTCH);
5273 rlen = slen = totslen = 0;
5274 if (IS_24XX(isp) && (scsi_status & (RQCS_RV|RQCS_SV)) != 0) {
5275 resp = sp2->req_rsp_sense;
5276 rlen = sp2->req_response_len;
5277 } else if (IS_FC(isp) && (scsi_status & RQCS_RV) != 0) {
5278 resp = sp->req_response;
5279 rlen = sp->req_response_len;
5281 if (IS_FC(isp) && (scsi_status & RQCS_SV) != 0) {
5283 * Fibre Channel F/W doesn't say we got status
5284 * if there's Sense Data instead. I guess they
5285 * think it goes w/o saying.
5287 req_state_flags |= RQSF_GOT_STATUS|RQSF_GOT_SENSE;
5289 snsp = sp2->req_rsp_sense;
5291 totslen = sp2->req_sense_len;
5292 slen = sizeof(sp2->req_rsp_sense) - rlen;
5294 snsp = sp->req_sense_data;
5295 totslen = sp->req_sense_len;
5296 slen = sizeof(sp->req_sense_data);
5298 } else if (IS_SCSI(isp) && (req_state_flags & RQSF_GOT_SENSE)) {
5299 snsp = sp->req_sense_data;
5300 totslen = sp->req_sense_len;
5301 slen = sizeof (sp->req_sense_data);
5305 if (req_state_flags & RQSF_GOT_STATUS)
5306 *XS_STSP(xs) = scsi_status & 0xff;
5308 if (rlen >= 4 && resp[FCP_RSPNS_CODE_OFFSET] != 0) {
5311 const char *rnames[10] = {
5312 "Task Management function complete",
5313 "FCP_DATA length different than FCP_BURST_LEN",
5314 "FCP_CMND fields invalid",
5315 "FCP_DATA parameter mismatch with FCP_DATA_RO",
5316 "Task Management function rejected",
5317 "Task Management function failed",
5320 "Task Management function succeeded",
5321 "Task Management function incorrect logical unit number",
5323 uint8_t code = resp[FCP_RSPNS_CODE_OFFSET];
5324 if (code >= 10 || rnames[code] == NULL) {
5325 ISP_SNPRINTF(lb, sizeof(lb),
5326 "Unknown FCP Response Code 0x%x", code);
5331 isp_xs_prt(isp, xs, ISP_LOGWARN,
5332 "FCP RESPONSE, LENGTH %u: %s CDB0=0x%02x",
5333 rlen, ptr, XS_CDBP(xs)[0] & 0xff);
5334 if (code != 0 && code != 8)
5335 XS_SETERR(xs, HBA_BOTCH);
5338 isp_parse_status_24xx(isp, sp2, xs, &resid);
5340 isp_parse_status(isp, sp, xs, &resid);
5341 if ((XS_NOERR(xs) || XS_ERR(xs) == HBA_NOERROR) &&
5342 (*XS_STSP(xs) == SCSI_BUSY))
5343 XS_SETERR(xs, HBA_TGTBSY);
5345 XS_SET_RESID(xs, resid);
5347 * A new synchronous rate was negotiated for
5348 * this target. Mark state such that we'll go
5349 * look up that which has changed later.
5351 if (req_status_flags & RQSTF_NEGOTIATION) {
5353 sdparam *sdp = SDPARAM(isp, XS_CHANNEL(xs));
5354 sdp->isp_devparam[t].dev_refresh = 1;
5358 if (req_status_flags & RQSF_XFER_COMPLETE) {
5359 XS_SET_RESID(xs, 0);
5360 } else if (scsi_status & RQCS_RESID) {
5361 XS_SET_RESID(xs, resid);
5363 XS_SET_RESID(xs, 0);
5367 XS_SAVE_SENSE(xs, snsp, slen);
5368 if (totslen > slen) {
5369 cont = totslen - slen;
5371 isp_prt(isp, ISP_LOGDEBUG0|ISP_LOG_CWARN,
5372 "Expecting Status Continuations for %u bytes",
5376 isp_prt(isp, ISP_LOGDEBUG2, "asked for %lu got raw resid %lu settled for %lu",
5377 (u_long)XS_XFRLEN(xs), (u_long)resid, (u_long)XS_GET_RESID(xs));
5380 ISP_DMAFREE(isp, xs, sp->req_handle);
5381 isp_destroy_handle(isp, sp->req_handle);
5383 ISP_MEMZERO(hp, QENTRY_LEN); /* PERF */
5385 /* Complete command if we expect no Status Continuations. */
5390 /* We haven't received all Status Continuations, but that is it. */
5394 /* If we processed any IOCBs, let ISP know about it. */
5395 if (optr != isp->isp_resodx) {
5396 ISP_WRITE(isp, isp->isp_respoutrp, optr);
5397 isp->isp_resodx = optr;
5402 * Parse an ASYNC mailbox complete
5405 isp_parse_async(ispsoftc_t *isp, uint16_t mbox)
5407 uint32_t h1 = 0, h2 = 0;
5411 * Pick up the channel, but not if this is a ASYNC_RIO32_2,
5412 * where Mailboxes 6/7 have the second handle.
5414 if (mbox != ASYNC_RIO32_2) {
5415 if (IS_DUALBUS(isp)) {
5416 chan = ISP_READ(isp, OUTMAILBOX6);
5419 isp_prt(isp, ISP_LOGDEBUG2, "Async Mbox 0x%x", mbox);
5422 case ASYNC_BUS_RESET:
5423 ISP_SET_SENDMARKER(isp, chan, 1);
5424 #ifdef ISP_TARGET_MODE
5425 isp_target_async(isp, chan, mbox);
5427 isp_async(isp, ISPASYNC_BUS_RESET, chan);
5429 case ASYNC_SYSTEM_ERROR:
5430 isp->isp_state = ISP_CRASHED;
5432 * Were we waiting for a mailbox command to complete?
5433 * If so, it's dead, so wake up the waiter.
5435 if (isp->isp_mboxbsy) {
5437 isp->isp_mboxtmp[0] = MBOX_HOST_INTERFACE_ERROR;
5438 MBOX_NOTIFY_COMPLETE(isp);
5441 * It's up to the handler for isp_async to reinit stuff and
5442 * restart the firmware
5444 isp_async(isp, ISPASYNC_FW_CRASH);
5447 case ASYNC_RQS_XFER_ERR:
5448 isp_prt(isp, ISP_LOGERR, "Request Queue Transfer Error");
5451 case ASYNC_RSP_XFER_ERR:
5452 isp_prt(isp, ISP_LOGERR, "Response Queue Transfer Error");
5457 * We've just been notified that the Queue has woken up.
5458 * We don't need to be chatty about this- just unlatch things
5461 mbox = ISP_READ(isp, isp->isp_rqstoutrp);
5464 case ASYNC_TIMEOUT_RESET:
5465 isp_prt(isp, ISP_LOGWARN, "timeout initiated SCSI bus reset of chan %d", chan);
5466 ISP_SET_SENDMARKER(isp, chan, 1);
5467 #ifdef ISP_TARGET_MODE
5468 isp_target_async(isp, chan, mbox);
5472 case ASYNC_DEVICE_RESET:
5473 isp_prt(isp, ISP_LOGINFO, "device reset on chan %d", chan);
5474 ISP_SET_SENDMARKER(isp, chan, 1);
5475 #ifdef ISP_TARGET_MODE
5476 isp_target_async(isp, chan, mbox);
5480 case ASYNC_EXTMSG_UNDERRUN:
5481 isp_prt(isp, ISP_LOGWARN, "extended message underrun");
5484 case ASYNC_SCAM_INT:
5485 isp_prt(isp, ISP_LOGINFO, "SCAM interrupt");
5488 case ASYNC_HUNG_SCSI:
5489 isp_prt(isp, ISP_LOGERR, "stalled SCSI Bus after DATA Overrun");
5490 /* XXX: Need to issue SCSI reset at this point */
5493 case ASYNC_KILLED_BUS:
5494 isp_prt(isp, ISP_LOGERR, "SCSI Bus reset after DATA Overrun");
5497 case ASYNC_BUS_TRANSIT:
5498 mbox = ISP_READ(isp, OUTMAILBOX2);
5499 switch (mbox & SXP_PINS_MODE_MASK) {
5500 case SXP_PINS_LVD_MODE:
5501 isp_prt(isp, ISP_LOGINFO, "Transition to LVD mode");
5502 SDPARAM(isp, chan)->isp_diffmode = 0;
5503 SDPARAM(isp, chan)->isp_ultramode = 0;
5504 SDPARAM(isp, chan)->isp_lvdmode = 1;
5506 case SXP_PINS_HVD_MODE:
5507 isp_prt(isp, ISP_LOGINFO,
5508 "Transition to Differential mode");
5509 SDPARAM(isp, chan)->isp_diffmode = 1;
5510 SDPARAM(isp, chan)->isp_ultramode = 0;
5511 SDPARAM(isp, chan)->isp_lvdmode = 0;
5513 case SXP_PINS_SE_MODE:
5514 isp_prt(isp, ISP_LOGINFO,
5515 "Transition to Single Ended mode");
5516 SDPARAM(isp, chan)->isp_diffmode = 0;
5517 SDPARAM(isp, chan)->isp_ultramode = 1;
5518 SDPARAM(isp, chan)->isp_lvdmode = 0;
5521 isp_prt(isp, ISP_LOGWARN,
5522 "Transition to Unknown Mode 0x%x", mbox);
5526 * XXX: Set up to renegotiate again!
5528 /* Can only be for a 1080... */
5529 ISP_SET_SENDMARKER(isp, chan, 1);
5532 case ASYNC_CMD_CMPLT:
5534 if (!IS_ULTRA3(isp)) {
5535 isp_prt(isp, ISP_LOGERR, "unexpected fast posting completion");
5539 h1 = (ISP_READ(isp, OUTMAILBOX2) << 16) | ISP_READ(isp, OUTMAILBOX1);
5543 h1 = (ISP_READ(isp, OUTMAILBOX2) << 16) | ISP_READ(isp, OUTMAILBOX1);
5544 h2 = (ISP_READ(isp, OUTMAILBOX7) << 16) | ISP_READ(isp, OUTMAILBOX6);
5552 isp_prt(isp, ISP_LOGERR, "unexpected 16 bit RIO handle");
5555 isp_prt(isp, ISP_LOGWARN, "%s: unhandled async code 0x%x", __func__, mbox);
5560 isp_prt(isp, ISP_LOGDEBUG3, "fast post/rio completion of 0x%08x", h1);
5561 isp_fastpost_complete(isp, h1);
5563 isp_prt(isp, ISP_LOGDEBUG3, "fast post/rio completion of 0x%08x", h2);
5564 isp_fastpost_complete(isp, h2);
5570 isp_parse_async_fc(ispsoftc_t *isp, uint16_t mbox)
5575 if (IS_DUALBUS(isp)) {
5576 chan = ISP_READ(isp, OUTMAILBOX6);
5580 isp_prt(isp, ISP_LOGDEBUG2, "Async Mbox 0x%x", mbox);
5583 case ASYNC_SYSTEM_ERROR:
5584 isp->isp_state = ISP_CRASHED;
5585 FCPARAM(isp, chan)->isp_loopstate = LOOP_NIL;
5586 isp_change_fw_state(isp, chan, FW_CONFIG_WAIT);
5588 * Were we waiting for a mailbox command to complete?
5589 * If so, it's dead, so wake up the waiter.
5591 if (isp->isp_mboxbsy) {
5593 isp->isp_mboxtmp[0] = MBOX_HOST_INTERFACE_ERROR;
5594 MBOX_NOTIFY_COMPLETE(isp);
5597 * It's up to the handler for isp_async to reinit stuff and
5598 * restart the firmware
5600 isp_async(isp, ISPASYNC_FW_CRASH);
5603 case ASYNC_RQS_XFER_ERR:
5604 isp_prt(isp, ISP_LOGERR, "Request Queue Transfer Error");
5607 case ASYNC_RSP_XFER_ERR:
5608 isp_prt(isp, ISP_LOGERR, "Response Queue Transfer Error");
5612 #ifdef ISP_TARGET_MODE
5614 isp_prt(isp, ISP_LOGERR, "ATIO Queue Transfer Error");
5618 isp_prt(isp, ISP_LOGERR, "%s: unexpected ASYNC_QWAKEUP code", __func__);
5621 case ASYNC_CMD_CMPLT:
5622 isp_fastpost_complete(isp, (ISP_READ(isp, OUTMAILBOX2) << 16) | ISP_READ(isp, OUTMAILBOX1));
5625 case ASYNC_RIOZIO_STALL:
5626 isp_intr_respq(isp);
5629 case ASYNC_CTIO_DONE:
5630 #ifdef ISP_TARGET_MODE
5631 isp_target_async(isp, (ISP_READ(isp, OUTMAILBOX2) << 16) |
5632 ISP_READ(isp, OUTMAILBOX1), mbox);
5634 isp_prt(isp, ISP_LOGWARN, "unexpected ASYNC CTIO done");
5637 case ASYNC_LIP_ERROR:
5638 case ASYNC_LIP_NOS_OLS_RECV:
5639 case ASYNC_LIP_OCCURRED:
5642 * These are broadcast events that have to be sent across
5643 * all active channels.
5645 for (chan = 0; chan < isp->isp_nchan; chan++) {
5646 fcp = FCPARAM(isp, chan);
5647 int topo = fcp->isp_topo;
5649 if (fcp->role == ISP_ROLE_NONE)
5651 if (fcp->isp_loopstate > LOOP_HAVE_LINK)
5652 fcp->isp_loopstate = LOOP_HAVE_LINK;
5653 ISP_SET_SENDMARKER(isp, chan, 1);
5654 isp_async(isp, ISPASYNC_LIP, chan);
5655 #ifdef ISP_TARGET_MODE
5656 isp_target_async(isp, chan, mbox);
5659 * We've had problems with data corruption occurring on
5660 * commands that complete (with no apparent error) after
5661 * we receive a LIP. This has been observed mostly on
5662 * Local Loop topologies. To be safe, let's just mark
5663 * all active initiator commands as dead.
5665 if (topo == TOPO_NL_PORT || topo == TOPO_FL_PORT) {
5667 for (i = j = 0; i < isp->isp_maxcmds; i++) {
5671 hdp = &isp->isp_xflist[i];
5672 if (ISP_H2HT(hdp->handle) != ISP_HANDLE_INITIATOR) {
5676 if (XS_CHANNEL(xs) != chan) {
5680 isp_prt(isp, ISP_LOG_WARN1,
5681 "%d.%d.%jx bus reset set at %s:%u",
5682 XS_CHANNEL(xs), XS_TGT(xs),
5683 (uintmax_t)XS_LUN(xs),
5684 __func__, __LINE__);
5685 XS_SETERR(xs, HBA_BUSRESET);
5688 isp_prt(isp, ISP_LOGERR, lipd, chan, j);
5696 * This is a broadcast event that has to be sent across
5697 * all active channels.
5699 for (chan = 0; chan < isp->isp_nchan; chan++) {
5700 fcp = FCPARAM(isp, chan);
5701 if (fcp->role == ISP_ROLE_NONE)
5703 fcp->isp_linkstate = 1;
5704 if (fcp->isp_loopstate < LOOP_HAVE_LINK)
5705 fcp->isp_loopstate = LOOP_HAVE_LINK;
5706 ISP_SET_SENDMARKER(isp, chan, 1);
5707 isp_async(isp, ISPASYNC_LOOP_UP, chan);
5708 #ifdef ISP_TARGET_MODE
5709 isp_target_async(isp, chan, mbox);
5714 case ASYNC_LOOP_DOWN:
5716 * This is a broadcast event that has to be sent across
5717 * all active channels.
5719 for (chan = 0; chan < isp->isp_nchan; chan++) {
5720 fcp = FCPARAM(isp, chan);
5721 if (fcp->role == ISP_ROLE_NONE)
5723 ISP_SET_SENDMARKER(isp, chan, 1);
5724 fcp->isp_linkstate = 0;
5725 fcp->isp_loopstate = LOOP_NIL;
5726 isp_async(isp, ISPASYNC_LOOP_DOWN, chan);
5727 #ifdef ISP_TARGET_MODE
5728 isp_target_async(isp, chan, mbox);
5733 case ASYNC_LOOP_RESET:
5735 * This is a broadcast event that has to be sent across
5736 * all active channels.
5738 for (chan = 0; chan < isp->isp_nchan; chan++) {
5739 fcp = FCPARAM(isp, chan);
5740 if (fcp->role == ISP_ROLE_NONE)
5742 ISP_SET_SENDMARKER(isp, chan, 1);
5743 if (fcp->isp_loopstate > LOOP_HAVE_LINK)
5744 fcp->isp_loopstate = LOOP_HAVE_LINK;
5745 isp_async(isp, ISPASYNC_LOOP_RESET, chan);
5746 #ifdef ISP_TARGET_MODE
5747 isp_target_async(isp, chan, mbox);
5752 case ASYNC_PDB_CHANGED:
5754 int echan, nphdl, nlstate, reason;
5756 if (IS_23XX(isp) || IS_24XX(isp)) {
5757 nphdl = ISP_READ(isp, OUTMAILBOX1);
5758 nlstate = ISP_READ(isp, OUTMAILBOX2);
5760 nphdl = nlstate = 0xffff;
5763 reason = ISP_READ(isp, OUTMAILBOX3) >> 8;
5766 if (ISP_CAP_MULTI_ID(isp)) {
5767 chan = ISP_READ(isp, OUTMAILBOX3) & 0xff;
5768 if (chan == 0xff || nphdl == NIL_HANDLE) {
5770 echan = isp->isp_nchan - 1;
5771 } else if (chan >= isp->isp_nchan) {
5779 for (; chan <= echan; chan++) {
5780 fcp = FCPARAM(isp, chan);
5781 if (fcp->role == ISP_ROLE_NONE)
5783 if (fcp->isp_loopstate > LOOP_LTEST_DONE) {
5784 if (nphdl != NIL_HANDLE &&
5785 nphdl == fcp->isp_login_hdl &&
5786 reason == PDB24XX_AE_OPN_2)
5788 fcp->isp_loopstate = LOOP_LTEST_DONE;
5789 } else if (fcp->isp_loopstate < LOOP_HAVE_LINK)
5790 fcp->isp_loopstate = LOOP_HAVE_LINK;
5791 isp_async(isp, ISPASYNC_CHANGE_NOTIFY, chan,
5792 ISPASYNC_CHANGE_PDB, nphdl, nlstate, reason);
5796 case ASYNC_CHANGE_NOTIFY:
5800 portid = ((ISP_READ(isp, OUTMAILBOX1) & 0xff) << 16) |
5801 ISP_READ(isp, OUTMAILBOX2);
5802 if (ISP_CAP_MULTI_ID(isp)) {
5803 chan = ISP_READ(isp, OUTMAILBOX3) & 0xff;
5804 if (chan >= isp->isp_nchan)
5809 fcp = FCPARAM(isp, chan);
5810 if (fcp->role == ISP_ROLE_NONE)
5812 if (fcp->isp_loopstate > LOOP_LTEST_DONE)
5813 fcp->isp_loopstate = LOOP_LTEST_DONE;
5814 else if (fcp->isp_loopstate < LOOP_HAVE_LINK)
5815 fcp->isp_loopstate = LOOP_HAVE_LINK;
5816 isp_async(isp, ISPASYNC_CHANGE_NOTIFY, chan,
5817 ISPASYNC_CHANGE_SNS, portid);
5820 case ASYNC_ERR_LOGGING_DISABLED:
5821 isp_prt(isp, ISP_LOGWARN, "Error logging disabled (reason 0x%x)",
5822 ISP_READ(isp, OUTMAILBOX1));
5824 case ASYNC_CONNMODE:
5826 * This only applies to 2100 amd 2200 cards
5828 if (!IS_2200(isp) && !IS_2100(isp)) {
5829 isp_prt(isp, ISP_LOGWARN, "bad card for ASYNC_CONNMODE event");
5833 mbox = ISP_READ(isp, OUTMAILBOX1);
5836 isp_prt(isp, ISP_LOGINFO,
5837 "Point-to-Point -> Loop mode");
5840 isp_prt(isp, ISP_LOGINFO,
5841 "Loop -> Point-to-Point mode");
5843 case ISP_CONN_BADLIP:
5844 isp_prt(isp, ISP_LOGWARN,
5845 "Point-to-Point -> Loop mode (BAD LIP)");
5847 case ISP_CONN_FATAL:
5848 isp->isp_state = ISP_CRASHED;
5849 isp_prt(isp, ISP_LOGERR, "FATAL CONNECTION ERROR");
5850 isp_async(isp, ISPASYNC_FW_CRASH);
5852 case ISP_CONN_LOOPBACK:
5853 isp_prt(isp, ISP_LOGWARN,
5854 "Looped Back in Point-to-Point mode");
5857 isp_prt(isp, ISP_LOGWARN,
5858 "Unknown connection mode (0x%x)", mbox);
5861 ISP_SET_SENDMARKER(isp, chan, 1);
5862 FCPARAM(isp, chan)->isp_loopstate = LOOP_HAVE_LINK;
5863 isp_async(isp, ISPASYNC_CHANGE_NOTIFY, chan, ISPASYNC_CHANGE_OTHER);
5865 case ASYNC_P2P_INIT_ERR:
5866 isp_prt(isp, ISP_LOGWARN, "P2P init error (reason 0x%x)",
5867 ISP_READ(isp, OUTMAILBOX1));
5871 isp_prt(isp, ISP_LOGWARN, "Receive Error");
5873 isp_prt(isp, ISP_LOGWARN, "unexpected ASYNC_RCV_ERR");
5876 case ASYNC_RJT_SENT: /* same as ASYNC_QFULL_SENT */
5878 isp_prt(isp, ISP_LOGTDEBUG0, "LS_RJT sent");
5881 isp_prt(isp, ISP_LOGTDEBUG0, "QFULL sent");
5884 case ASYNC_FW_RESTART_COMPLETE:
5885 isp_prt(isp, ISP_LOGDEBUG0, "FW restart complete");
5887 case ASYNC_TEMPERATURE_ALERT:
5888 isp_prt(isp, ISP_LOGERR, "Temperature alert (subcode 0x%x)",
5889 ISP_READ(isp, OUTMAILBOX1));
5891 case ASYNC_AUTOLOAD_FW_COMPLETE:
5892 isp_prt(isp, ISP_LOGDEBUG0, "Autoload FW init complete");
5894 case ASYNC_AUTOLOAD_FW_FAILURE:
5895 isp_prt(isp, ISP_LOGERR, "Autoload FW init failure");
5898 isp_prt(isp, ISP_LOGWARN, "Unknown Async Code 0x%x", mbox);
5904 * Handle other response entries. A pointer to the request queue output
5905 * index is here in case we want to eat several entries at once, although
5906 * this is not used currently.
5910 isp_handle_other_response(ispsoftc_t *isp, int type, isphdr_t *hp, uint32_t *optrp)
5914 uint32_t hdl, portid;
5918 case RQSTYPE_MARKER:
5919 isp_prt(isp, ISP_LOG_WARN1, "Marker Response");
5921 case RQSTYPE_RPT_ID_ACQ:
5922 isp_get_ridacq(isp, (isp_ridacq_t *)hp, &rid);
5923 portid = (uint32_t)rid.ridacq_vp_port_hi << 16 |
5924 rid.ridacq_vp_port_lo;
5925 if (rid.ridacq_format == 0) {
5926 for (chan = 0; chan < isp->isp_nchan; chan++) {
5927 fcparam *fcp = FCPARAM(isp, chan);
5928 if (fcp->role == ISP_ROLE_NONE)
5930 c = (chan == 0) ? 127 : (chan - 1);
5931 if (rid.ridacq_map[c / 16] & (1 << (c % 16)) ||
5933 fcp->isp_loopstate = LOOP_HAVE_LINK;
5934 isp_async(isp, ISPASYNC_CHANGE_NOTIFY,
5935 chan, ISPASYNC_CHANGE_OTHER);
5937 fcp->isp_loopstate = LOOP_NIL;
5938 isp_async(isp, ISPASYNC_LOOP_DOWN,
5943 fcparam *fcp = FCPARAM(isp, rid.ridacq_vp_index);
5944 if (rid.ridacq_vp_status == RIDACQ_STS_COMPLETE ||
5945 rid.ridacq_vp_status == RIDACQ_STS_CHANGED) {
5946 fcp->isp_topo = (rid.ridacq_map[0] >> 9) & 0x7;
5947 fcp->isp_portid = portid;
5948 fcp->isp_loopstate = LOOP_HAVE_ADDR;
5949 isp_async(isp, ISPASYNC_CHANGE_NOTIFY,
5950 rid.ridacq_vp_index, ISPASYNC_CHANGE_OTHER);
5952 fcp->isp_loopstate = LOOP_NIL;
5953 isp_async(isp, ISPASYNC_LOOP_DOWN,
5954 rid.ridacq_vp_index);
5958 case RQSTYPE_CT_PASSTHRU:
5959 case RQSTYPE_VP_MODIFY:
5960 case RQSTYPE_VP_CTRL:
5962 ISP_IOXGET_32(isp, (uint32_t *)(hp + 1), hdl);
5963 ptr = isp_find_xs(isp, hdl);
5965 isp_destroy_handle(isp, hdl);
5966 memcpy(ptr, hp, QENTRY_LEN);
5972 case RQSTYPE_NOTIFY:
5973 case RQSTYPE_NOTIFY_ACK:
5979 case RQSTYPE_ABTS_RCVD:
5980 case RQSTYPE_ABTS_RSP:
5981 #ifdef ISP_TARGET_MODE
5982 return (isp_target_notify(isp, (ispstatusreq_t *) hp, optrp));
5985 case RQSTYPE_REQUEST:
5992 isp_parse_status(ispsoftc_t *isp, ispstatusreq_t *sp, XS_T *xs, uint32_t *rp)
5994 switch (sp->req_completion_status & 0xff) {
5997 XS_SETERR(xs, HBA_NOERROR);
6001 case RQCS_INCOMPLETE:
6002 if ((sp->req_state_flags & RQSF_GOT_TARGET) == 0) {
6003 isp_xs_prt(isp, xs, ISP_LOG_WARN1, "Selection Timeout @ %s:%d", __func__, __LINE__);
6005 XS_SETERR(xs, HBA_SELTIMEOUT);
6006 *rp = XS_XFRLEN(xs);
6010 isp_xs_prt(isp, xs, ISP_LOGERR, "Command Incomplete, state 0x%x", sp->req_state_flags);
6013 case RQCS_DMA_ERROR:
6014 isp_xs_prt(isp, xs, ISP_LOGERR, "DMA Error");
6015 *rp = XS_XFRLEN(xs);
6018 case RQCS_TRANSPORT_ERROR:
6021 ISP_SNPRINTF(buf, sizeof (buf), "states=>");
6022 if (sp->req_state_flags & RQSF_GOT_BUS) {
6023 ISP_SNPRINTF(buf, sizeof (buf), "%s GOT_BUS", buf);
6025 if (sp->req_state_flags & RQSF_GOT_TARGET) {
6026 ISP_SNPRINTF(buf, sizeof (buf), "%s GOT_TGT", buf);
6028 if (sp->req_state_flags & RQSF_SENT_CDB) {
6029 ISP_SNPRINTF(buf, sizeof (buf), "%s SENT_CDB", buf);
6031 if (sp->req_state_flags & RQSF_XFRD_DATA) {
6032 ISP_SNPRINTF(buf, sizeof (buf), "%s XFRD_DATA", buf);
6034 if (sp->req_state_flags & RQSF_GOT_STATUS) {
6035 ISP_SNPRINTF(buf, sizeof (buf), "%s GOT_STS", buf);
6037 if (sp->req_state_flags & RQSF_GOT_SENSE) {
6038 ISP_SNPRINTF(buf, sizeof (buf), "%s GOT_SNS", buf);
6040 if (sp->req_state_flags & RQSF_XFER_COMPLETE) {
6041 ISP_SNPRINTF(buf, sizeof (buf), "%s XFR_CMPLT", buf);
6043 ISP_SNPRINTF(buf, sizeof (buf), "%s\nstatus=>", buf);
6044 if (sp->req_status_flags & RQSTF_DISCONNECT) {
6045 ISP_SNPRINTF(buf, sizeof (buf), "%s Disconnect", buf);
6047 if (sp->req_status_flags & RQSTF_SYNCHRONOUS) {
6048 ISP_SNPRINTF(buf, sizeof (buf), "%s Sync_xfr", buf);
6050 if (sp->req_status_flags & RQSTF_PARITY_ERROR) {
6051 ISP_SNPRINTF(buf, sizeof (buf), "%s Parity", buf);
6053 if (sp->req_status_flags & RQSTF_BUS_RESET) {
6054 ISP_SNPRINTF(buf, sizeof (buf), "%s Bus_Reset", buf);
6056 if (sp->req_status_flags & RQSTF_DEVICE_RESET) {
6057 ISP_SNPRINTF(buf, sizeof (buf), "%s Device_Reset", buf);
6059 if (sp->req_status_flags & RQSTF_ABORTED) {
6060 ISP_SNPRINTF(buf, sizeof (buf), "%s Aborted", buf);
6062 if (sp->req_status_flags & RQSTF_TIMEOUT) {
6063 ISP_SNPRINTF(buf, sizeof (buf), "%s Timeout", buf);
6065 if (sp->req_status_flags & RQSTF_NEGOTIATION) {
6066 ISP_SNPRINTF(buf, sizeof (buf), "%s Negotiation", buf);
6068 isp_xs_prt(isp, xs, ISP_LOGERR, "Transport Error: %s", buf);
6069 *rp = XS_XFRLEN(xs);
6072 case RQCS_RESET_OCCURRED:
6075 isp_xs_prt(isp, xs, ISP_LOGWARN, "Bus Reset destroyed command");
6076 for (chan = 0; chan < isp->isp_nchan; chan++) {
6077 FCPARAM(isp, chan)->sendmarker = 1;
6080 XS_SETERR(xs, HBA_BUSRESET);
6082 *rp = XS_XFRLEN(xs);
6086 isp_xs_prt(isp, xs, ISP_LOGERR, "Command Aborted");
6087 ISP_SET_SENDMARKER(isp, XS_CHANNEL(xs), 1);
6089 XS_SETERR(xs, HBA_ABORTED);
6094 isp_xs_prt(isp, xs, ISP_LOGWARN, "Command timed out");
6096 * XXX: Check to see if we logged out of the device.
6099 XS_SETERR(xs, HBA_CMDTIMEOUT);
6103 case RQCS_DATA_OVERRUN:
6104 XS_SET_RESID(xs, sp->req_resid);
6105 isp_xs_prt(isp, xs, ISP_LOGERR, "data overrun (%ld)", (long) XS_GET_RESID(xs));
6107 XS_SETERR(xs, HBA_DATAOVR);
6111 case RQCS_COMMAND_OVERRUN:
6112 isp_xs_prt(isp, xs, ISP_LOGERR, "command overrun");
6115 case RQCS_STATUS_OVERRUN:
6116 isp_xs_prt(isp, xs, ISP_LOGERR, "status overrun");
6119 case RQCS_BAD_MESSAGE:
6120 isp_xs_prt(isp, xs, ISP_LOGERR, "msg not COMMAND COMPLETE after status");
6123 case RQCS_NO_MESSAGE_OUT:
6124 isp_xs_prt(isp, xs, ISP_LOGERR, "No MESSAGE OUT phase after selection");
6127 case RQCS_EXT_ID_FAILED:
6128 isp_xs_prt(isp, xs, ISP_LOGERR, "EXTENDED IDENTIFY failed");
6131 case RQCS_IDE_MSG_FAILED:
6132 isp_xs_prt(isp, xs, ISP_LOGERR, "INITIATOR DETECTED ERROR rejected");
6135 case RQCS_ABORT_MSG_FAILED:
6136 isp_xs_prt(isp, xs, ISP_LOGERR, "ABORT OPERATION rejected");
6139 case RQCS_REJECT_MSG_FAILED:
6140 isp_xs_prt(isp, xs, ISP_LOGERR, "MESSAGE REJECT rejected");
6143 case RQCS_NOP_MSG_FAILED:
6144 isp_xs_prt(isp, xs, ISP_LOGERR, "NOP rejected");
6147 case RQCS_PARITY_ERROR_MSG_FAILED:
6148 isp_xs_prt(isp, xs, ISP_LOGERR, "MESSAGE PARITY ERROR rejected");
6151 case RQCS_DEVICE_RESET_MSG_FAILED:
6152 isp_xs_prt(isp, xs, ISP_LOGWARN, "BUS DEVICE RESET rejected");
6155 case RQCS_ID_MSG_FAILED:
6156 isp_xs_prt(isp, xs, ISP_LOGERR, "IDENTIFY rejected");
6159 case RQCS_UNEXP_BUS_FREE:
6160 isp_xs_prt(isp, xs, ISP_LOGERR, "Unexpected Bus Free");
6163 case RQCS_DATA_UNDERRUN:
6166 int ru_marked = (sp->req_scsi_status & RQCS_RU) != 0;
6167 if (!ru_marked || sp->req_resid > XS_XFRLEN(xs)) {
6168 isp_xs_prt(isp, xs, ISP_LOGWARN, bun, XS_XFRLEN(xs), sp->req_resid, (ru_marked)? "marked" : "not marked");
6170 XS_SETERR(xs, HBA_BOTCH);
6175 XS_SET_RESID(xs, sp->req_resid);
6177 XS_SETERR(xs, HBA_NOERROR);
6182 case RQCS_XACT_ERR1:
6183 isp_xs_prt(isp, xs, ISP_LOGERR, "HBA attempted queued transaction with disconnect not set");
6186 case RQCS_XACT_ERR2:
6187 isp_xs_prt(isp, xs, ISP_LOGERR,
6188 "HBA attempted queued transaction to target routine %jx",
6189 (uintmax_t)XS_LUN(xs));
6192 case RQCS_XACT_ERR3:
6193 isp_xs_prt(isp, xs, ISP_LOGERR, "HBA attempted queued cmd when queueing disabled");
6196 case RQCS_BAD_ENTRY:
6197 isp_prt(isp, ISP_LOGERR, "Invalid IOCB entry type detected");
6200 case RQCS_QUEUE_FULL:
6201 isp_xs_prt(isp, xs, ISP_LOG_WARN1, "internal queues full status 0x%x", *XS_STSP(xs));
6204 * If QFULL or some other status byte is set, then this
6205 * isn't an error, per se.
6207 * Unfortunately, some QLogic f/w writers have, in
6208 * some cases, omitted to *set* status to QFULL.
6211 if (*XS_STSP(xs) != SCSI_GOOD && XS_NOERR(xs)) {
6212 XS_SETERR(xs, HBA_NOERROR);
6217 *XS_STSP(xs) = SCSI_QFULL;
6218 XS_SETERR(xs, HBA_NOERROR);
6221 case RQCS_PHASE_SKIPPED:
6222 isp_xs_prt(isp, xs, ISP_LOGERR, "SCSI phase skipped");
6225 case RQCS_ARQS_FAILED:
6226 isp_xs_prt(isp, xs, ISP_LOGERR, "Auto Request Sense Failed");
6228 XS_SETERR(xs, HBA_ARQFAIL);
6232 case RQCS_WIDE_FAILED:
6233 isp_xs_prt(isp, xs, ISP_LOGERR, "Wide Negotiation Failed");
6235 sdparam *sdp = SDPARAM(isp, XS_CHANNEL(xs));
6236 sdp->isp_devparam[XS_TGT(xs)].goal_flags &= ~DPARM_WIDE;
6237 sdp->isp_devparam[XS_TGT(xs)].dev_update = 1;
6241 XS_SETERR(xs, HBA_NOERROR);
6245 case RQCS_SYNCXFER_FAILED:
6246 isp_xs_prt(isp, xs, ISP_LOGERR, "SDTR Message Failed");
6248 sdparam *sdp = SDPARAM(isp, XS_CHANNEL(xs));
6249 sdp += XS_CHANNEL(xs);
6250 sdp->isp_devparam[XS_TGT(xs)].goal_flags &= ~DPARM_SYNC;
6251 sdp->isp_devparam[XS_TGT(xs)].dev_update = 1;
6256 case RQCS_LVD_BUSERR:
6257 isp_xs_prt(isp, xs, ISP_LOGERR, "Bad LVD condition");
6260 case RQCS_PORT_UNAVAILABLE:
6262 * No such port on the loop. Moral equivalent of SELTIMEO
6264 case RQCS_PORT_LOGGED_OUT:
6267 uint8_t sts = sp->req_completion_status & 0xff;
6268 fcparam *fcp = FCPARAM(isp, 0);
6272 * It was there (maybe)- treat as a selection timeout.
6274 if (sts == RQCS_PORT_UNAVAILABLE) {
6275 reason = "unavailable";
6280 isp_prt(isp, ISP_LOGINFO, "port %s for target %d", reason, XS_TGT(xs));
6282 /* XXX: Should we trigger rescan or FW announce change? */
6285 lp = &fcp->portdb[XS_TGT(xs)];
6286 if (lp->state == FC_PORTDB_STATE_ZOMBIE) {
6287 *XS_STSP(xs) = SCSI_BUSY;
6288 XS_SETERR(xs, HBA_TGTBSY);
6290 XS_SETERR(xs, HBA_SELTIMEOUT);
6294 case RQCS_PORT_CHANGED:
6295 isp_prt(isp, ISP_LOGWARN, "port changed for target %d", XS_TGT(xs));
6297 *XS_STSP(xs) = SCSI_BUSY;
6298 XS_SETERR(xs, HBA_TGTBSY);
6302 case RQCS_PORT_BUSY:
6303 isp_prt(isp, ISP_LOGWARN, "port busy for target %d", XS_TGT(xs));
6305 *XS_STSP(xs) = SCSI_BUSY;
6306 XS_SETERR(xs, HBA_TGTBSY);
6311 isp_prt(isp, ISP_LOGERR, "Unknown Completion Status 0x%x", sp->req_completion_status);
6315 XS_SETERR(xs, HBA_BOTCH);
6320 isp_parse_status_24xx(ispsoftc_t *isp, isp24xx_statusreq_t *sp, XS_T *xs, uint32_t *rp)
6322 int ru_marked, sv_marked;
6323 int chan = XS_CHANNEL(xs);
6325 switch (sp->req_completion_status) {
6328 XS_SETERR(xs, HBA_NOERROR);
6332 case RQCS_DMA_ERROR:
6333 isp_xs_prt(isp, xs, ISP_LOGERR, "DMA error");
6336 case RQCS_TRANSPORT_ERROR:
6337 isp_xs_prt(isp, xs, ISP_LOGERR, "Transport Error");
6340 case RQCS_RESET_OCCURRED:
6341 isp_xs_prt(isp, xs, ISP_LOGWARN, "reset destroyed command");
6342 FCPARAM(isp, chan)->sendmarker = 1;
6344 XS_SETERR(xs, HBA_BUSRESET);
6349 isp_xs_prt(isp, xs, ISP_LOGERR, "Command Aborted");
6350 FCPARAM(isp, chan)->sendmarker = 1;
6352 XS_SETERR(xs, HBA_ABORTED);
6357 isp_xs_prt(isp, xs, ISP_LOGWARN, "Command Timed Out");
6359 XS_SETERR(xs, HBA_CMDTIMEOUT);
6363 case RQCS_DATA_OVERRUN:
6364 XS_SET_RESID(xs, sp->req_resid);
6365 isp_xs_prt(isp, xs, ISP_LOGERR, "Data Overrun");
6367 XS_SETERR(xs, HBA_DATAOVR);
6371 case RQCS_24XX_DRE: /* data reassembly error */
6372 isp_prt(isp, ISP_LOGERR, "Chan %d data reassembly error for target %d", chan, XS_TGT(xs));
6374 XS_SETERR(xs, HBA_ABORTED);
6376 *rp = XS_XFRLEN(xs);
6379 case RQCS_24XX_TABORT: /* aborted by target */
6380 isp_prt(isp, ISP_LOGERR, "Chan %d target %d sent ABTS", chan, XS_TGT(xs));
6382 XS_SETERR(xs, HBA_ABORTED);
6386 case RQCS_DATA_UNDERRUN:
6387 ru_marked = (sp->req_scsi_status & RQCS_RU) != 0;
6389 * We can get an underrun w/o things being marked
6390 * if we got a non-zero status.
6392 sv_marked = (sp->req_scsi_status & (RQCS_SV|RQCS_RV)) != 0;
6393 if ((ru_marked == 0 && sv_marked == 0) ||
6394 (sp->req_resid > XS_XFRLEN(xs))) {
6395 isp_xs_prt(isp, xs, ISP_LOGWARN, bun, XS_XFRLEN(xs), sp->req_resid, (ru_marked)? "marked" : "not marked");
6397 XS_SETERR(xs, HBA_BOTCH);
6401 XS_SET_RESID(xs, sp->req_resid);
6402 isp_xs_prt(isp, xs, ISP_LOG_WARN1, "Data Underrun (%d) for command 0x%x", sp->req_resid, XS_CDBP(xs)[0] & 0xff);
6404 XS_SETERR(xs, HBA_NOERROR);
6408 case RQCS_PORT_UNAVAILABLE:
6410 * No such port on the loop. Moral equivalent of SELTIMEO
6412 case RQCS_PORT_LOGGED_OUT:
6415 uint8_t sts = sp->req_completion_status & 0xff;
6416 fcparam *fcp = FCPARAM(isp, XS_CHANNEL(xs));
6420 * It was there (maybe)- treat as a selection timeout.
6422 if (sts == RQCS_PORT_UNAVAILABLE) {
6423 reason = "unavailable";
6428 isp_prt(isp, ISP_LOGINFO, "Chan %d port %s for target %d",
6429 chan, reason, XS_TGT(xs));
6431 /* XXX: Should we trigger rescan or FW announce change? */
6434 lp = &fcp->portdb[XS_TGT(xs)];
6435 if (lp->state == FC_PORTDB_STATE_ZOMBIE) {
6436 *XS_STSP(xs) = SCSI_BUSY;
6437 XS_SETERR(xs, HBA_TGTBSY);
6439 XS_SETERR(xs, HBA_SELTIMEOUT);
6443 case RQCS_PORT_CHANGED:
6444 isp_prt(isp, ISP_LOGWARN, "port changed for target %d chan %d", XS_TGT(xs), chan);
6446 *XS_STSP(xs) = SCSI_BUSY;
6447 XS_SETERR(xs, HBA_TGTBSY);
6451 case RQCS_24XX_ENOMEM: /* f/w resource unavailable */
6452 isp_prt(isp, ISP_LOGWARN, "f/w resource unavailable for target %d chan %d", XS_TGT(xs), chan);
6454 *XS_STSP(xs) = SCSI_BUSY;
6455 XS_SETERR(xs, HBA_TGTBSY);
6459 case RQCS_24XX_TMO: /* task management overrun */
6460 isp_prt(isp, ISP_LOGWARN, "command for target %d overlapped task management for chan %d", XS_TGT(xs), chan);
6462 *XS_STSP(xs) = SCSI_BUSY;
6463 XS_SETERR(xs, HBA_TGTBSY);
6468 isp_prt(isp, ISP_LOGERR, "Unknown Completion Status 0x%x on chan %d", sp->req_completion_status, chan);
6472 XS_SETERR(xs, HBA_BOTCH);
6477 isp_fastpost_complete(ispsoftc_t *isp, uint32_t fph)
6484 xs = isp_find_xs(isp, fph);
6486 isp_prt(isp, ISP_LOGWARN,
6487 "Command for fast post handle 0x%x not found", fph);
6490 isp_destroy_handle(isp, fph);
6493 * Since we don't have a result queue entry item,
6494 * we must believe that SCSI status is zero and
6495 * that all data transferred.
6497 XS_SET_RESID(xs, 0);
6498 *XS_STSP(xs) = SCSI_GOOD;
6499 if (XS_XFRLEN(xs)) {
6500 ISP_DMAFREE(isp, xs, fph);
6505 #define ISP_SCSI_IBITS(op) (mbpscsi[((op)<<1)])
6506 #define ISP_SCSI_OBITS(op) (mbpscsi[((op)<<1) + 1])
6507 #define ISP_SCSI_OPMAP(in, out) in, out
6508 static const uint8_t mbpscsi[] = {
6509 ISP_SCSI_OPMAP(0x01, 0x01), /* 0x00: MBOX_NO_OP */
6510 ISP_SCSI_OPMAP(0x1f, 0x01), /* 0x01: MBOX_LOAD_RAM */
6511 ISP_SCSI_OPMAP(0x03, 0x01), /* 0x02: MBOX_EXEC_FIRMWARE */
6512 ISP_SCSI_OPMAP(0x1f, 0x01), /* 0x03: MBOX_DUMP_RAM */
6513 ISP_SCSI_OPMAP(0x07, 0x07), /* 0x04: MBOX_WRITE_RAM_WORD */
6514 ISP_SCSI_OPMAP(0x03, 0x07), /* 0x05: MBOX_READ_RAM_WORD */
6515 ISP_SCSI_OPMAP(0x3f, 0x3f), /* 0x06: MBOX_MAILBOX_REG_TEST */
6516 ISP_SCSI_OPMAP(0x07, 0x07), /* 0x07: MBOX_VERIFY_CHECKSUM */
6517 ISP_SCSI_OPMAP(0x01, 0x0f), /* 0x08: MBOX_ABOUT_FIRMWARE */
6518 ISP_SCSI_OPMAP(0x00, 0x00), /* 0x09: */
6519 ISP_SCSI_OPMAP(0x00, 0x00), /* 0x0a: */
6520 ISP_SCSI_OPMAP(0x00, 0x00), /* 0x0b: */
6521 ISP_SCSI_OPMAP(0x00, 0x00), /* 0x0c: */
6522 ISP_SCSI_OPMAP(0x00, 0x00), /* 0x0d: */
6523 ISP_SCSI_OPMAP(0x01, 0x05), /* 0x0e: MBOX_CHECK_FIRMWARE */
6524 ISP_SCSI_OPMAP(0x00, 0x00), /* 0x0f: */
6525 ISP_SCSI_OPMAP(0x1f, 0x1f), /* 0x10: MBOX_INIT_REQ_QUEUE */
6526 ISP_SCSI_OPMAP(0x3f, 0x3f), /* 0x11: MBOX_INIT_RES_QUEUE */
6527 ISP_SCSI_OPMAP(0x0f, 0x0f), /* 0x12: MBOX_EXECUTE_IOCB */
6528 ISP_SCSI_OPMAP(0x03, 0x03), /* 0x13: MBOX_WAKE_UP */
6529 ISP_SCSI_OPMAP(0x01, 0x3f), /* 0x14: MBOX_STOP_FIRMWARE */
6530 ISP_SCSI_OPMAP(0x0f, 0x0f), /* 0x15: MBOX_ABORT */
6531 ISP_SCSI_OPMAP(0x03, 0x03), /* 0x16: MBOX_ABORT_DEVICE */
6532 ISP_SCSI_OPMAP(0x07, 0x07), /* 0x17: MBOX_ABORT_TARGET */
6533 ISP_SCSI_OPMAP(0x07, 0x07), /* 0x18: MBOX_BUS_RESET */
6534 ISP_SCSI_OPMAP(0x03, 0x07), /* 0x19: MBOX_STOP_QUEUE */
6535 ISP_SCSI_OPMAP(0x03, 0x07), /* 0x1a: MBOX_START_QUEUE */
6536 ISP_SCSI_OPMAP(0x03, 0x07), /* 0x1b: MBOX_SINGLE_STEP_QUEUE */
6537 ISP_SCSI_OPMAP(0x03, 0x07), /* 0x1c: MBOX_ABORT_QUEUE */
6538 ISP_SCSI_OPMAP(0x03, 0x4f), /* 0x1d: MBOX_GET_DEV_QUEUE_STATUS */
6539 ISP_SCSI_OPMAP(0x00, 0x00), /* 0x1e: */
6540 ISP_SCSI_OPMAP(0x01, 0x07), /* 0x1f: MBOX_GET_FIRMWARE_STATUS */
6541 ISP_SCSI_OPMAP(0x01, 0x07), /* 0x20: MBOX_GET_INIT_SCSI_ID */
6542 ISP_SCSI_OPMAP(0x01, 0x07), /* 0x21: MBOX_GET_SELECT_TIMEOUT */
6543 ISP_SCSI_OPMAP(0x01, 0xc7), /* 0x22: MBOX_GET_RETRY_COUNT */
6544 ISP_SCSI_OPMAP(0x01, 0x07), /* 0x23: MBOX_GET_TAG_AGE_LIMIT */
6545 ISP_SCSI_OPMAP(0x01, 0x03), /* 0x24: MBOX_GET_CLOCK_RATE */
6546 ISP_SCSI_OPMAP(0x01, 0x07), /* 0x25: MBOX_GET_ACT_NEG_STATE */
6547 ISP_SCSI_OPMAP(0x01, 0x07), /* 0x26: MBOX_GET_ASYNC_DATA_SETUP_TIME */
6548 ISP_SCSI_OPMAP(0x01, 0x07), /* 0x27: MBOX_GET_PCI_PARAMS */
6549 ISP_SCSI_OPMAP(0x03, 0x4f), /* 0x28: MBOX_GET_TARGET_PARAMS */
6550 ISP_SCSI_OPMAP(0x03, 0x0f), /* 0x29: MBOX_GET_DEV_QUEUE_PARAMS */
6551 ISP_SCSI_OPMAP(0x01, 0x07), /* 0x2a: MBOX_GET_RESET_DELAY_PARAMS */
6552 ISP_SCSI_OPMAP(0x00, 0x00), /* 0x2b: */
6553 ISP_SCSI_OPMAP(0x00, 0x00), /* 0x2c: */
6554 ISP_SCSI_OPMAP(0x00, 0x00), /* 0x2d: */
6555 ISP_SCSI_OPMAP(0x00, 0x00), /* 0x2e: */
6556 ISP_SCSI_OPMAP(0x00, 0x00), /* 0x2f: */
6557 ISP_SCSI_OPMAP(0x03, 0x03), /* 0x30: MBOX_SET_INIT_SCSI_ID */
6558 ISP_SCSI_OPMAP(0x07, 0x07), /* 0x31: MBOX_SET_SELECT_TIMEOUT */
6559 ISP_SCSI_OPMAP(0xc7, 0xc7), /* 0x32: MBOX_SET_RETRY_COUNT */
6560 ISP_SCSI_OPMAP(0x07, 0x07), /* 0x33: MBOX_SET_TAG_AGE_LIMIT */
6561 ISP_SCSI_OPMAP(0x03, 0x03), /* 0x34: MBOX_SET_CLOCK_RATE */
6562 ISP_SCSI_OPMAP(0x07, 0x07), /* 0x35: MBOX_SET_ACT_NEG_STATE */
6563 ISP_SCSI_OPMAP(0x07, 0x07), /* 0x36: MBOX_SET_ASYNC_DATA_SETUP_TIME */
6564 ISP_SCSI_OPMAP(0x07, 0x07), /* 0x37: MBOX_SET_PCI_CONTROL_PARAMS */
6565 ISP_SCSI_OPMAP(0x4f, 0x4f), /* 0x38: MBOX_SET_TARGET_PARAMS */
6566 ISP_SCSI_OPMAP(0x0f, 0x0f), /* 0x39: MBOX_SET_DEV_QUEUE_PARAMS */
6567 ISP_SCSI_OPMAP(0x07, 0x07), /* 0x3a: MBOX_SET_RESET_DELAY_PARAMS */
6568 ISP_SCSI_OPMAP(0x00, 0x00), /* 0x3b: */
6569 ISP_SCSI_OPMAP(0x00, 0x00), /* 0x3c: */
6570 ISP_SCSI_OPMAP(0x00, 0x00), /* 0x3d: */
6571 ISP_SCSI_OPMAP(0x00, 0x00), /* 0x3e: */
6572 ISP_SCSI_OPMAP(0x00, 0x00), /* 0x3f: */
6573 ISP_SCSI_OPMAP(0x01, 0x03), /* 0x40: MBOX_RETURN_BIOS_BLOCK_ADDR */
6574 ISP_SCSI_OPMAP(0x3f, 0x01), /* 0x41: MBOX_WRITE_FOUR_RAM_WORDS */
6575 ISP_SCSI_OPMAP(0x03, 0x07), /* 0x42: MBOX_EXEC_BIOS_IOCB */
6576 ISP_SCSI_OPMAP(0x00, 0x00), /* 0x43: */
6577 ISP_SCSI_OPMAP(0x00, 0x00), /* 0x44: */
6578 ISP_SCSI_OPMAP(0x03, 0x03), /* 0x45: SET SYSTEM PARAMETER */
6579 ISP_SCSI_OPMAP(0x01, 0x03), /* 0x46: GET SYSTEM PARAMETER */
6580 ISP_SCSI_OPMAP(0x00, 0x00), /* 0x47: */
6581 ISP_SCSI_OPMAP(0x01, 0xcf), /* 0x48: GET SCAM CONFIGURATION */
6582 ISP_SCSI_OPMAP(0xcf, 0xcf), /* 0x49: SET SCAM CONFIGURATION */
6583 ISP_SCSI_OPMAP(0x03, 0x03), /* 0x4a: MBOX_SET_FIRMWARE_FEATURES */
6584 ISP_SCSI_OPMAP(0x01, 0x03), /* 0x4b: MBOX_GET_FIRMWARE_FEATURES */
6585 ISP_SCSI_OPMAP(0x00, 0x00), /* 0x4c: */
6586 ISP_SCSI_OPMAP(0x00, 0x00), /* 0x4d: */
6587 ISP_SCSI_OPMAP(0x00, 0x00), /* 0x4e: */
6588 ISP_SCSI_OPMAP(0x00, 0x00), /* 0x4f: */
6589 ISP_SCSI_OPMAP(0xdf, 0xdf), /* 0x50: LOAD RAM A64 */
6590 ISP_SCSI_OPMAP(0xdf, 0xdf), /* 0x51: DUMP RAM A64 */
6591 ISP_SCSI_OPMAP(0xdf, 0xff), /* 0x52: INITIALIZE REQUEST QUEUE A64 */
6592 ISP_SCSI_OPMAP(0xef, 0xff), /* 0x53: INITIALIZE RESPONSE QUEUE A64 */
6593 ISP_SCSI_OPMAP(0xcf, 0x01), /* 0x54: EXECUCUTE COMMAND IOCB A64 */
6594 ISP_SCSI_OPMAP(0x07, 0x01), /* 0x55: ENABLE TARGET MODE */
6595 ISP_SCSI_OPMAP(0x03, 0x0f), /* 0x56: GET TARGET STATUS */
6596 ISP_SCSI_OPMAP(0x00, 0x00), /* 0x57: */
6597 ISP_SCSI_OPMAP(0x00, 0x00), /* 0x58: */
6598 ISP_SCSI_OPMAP(0x00, 0x00), /* 0x59: */
6599 ISP_SCSI_OPMAP(0x03, 0x03), /* 0x5a: SET DATA OVERRUN RECOVERY MODE */
6600 ISP_SCSI_OPMAP(0x01, 0x03), /* 0x5b: GET DATA OVERRUN RECOVERY MODE */
6601 ISP_SCSI_OPMAP(0x0f, 0x0f), /* 0x5c: SET HOST DATA */
6602 ISP_SCSI_OPMAP(0x01, 0x01) /* 0x5d: GET NOST DATA */
6604 #define MAX_SCSI_OPCODE 0x5d
6606 static const char *scsi_mbcmd_names[] = {
6623 "INIT REQUEST QUEUE",
6624 "INIT RESULT QUEUE",
6634 "SINGLE STEP QUEUE",
6636 "GET DEV QUEUE STATUS",
6638 "GET FIRMWARE STATUS",
6640 "GET SELECT TIMEOUT",
6642 "GET TAG AGE LIMIT",
6644 "GET ACT NEG STATE",
6645 "GET ASYNC DATA SETUP TIME",
6647 "GET TARGET PARAMS",
6648 "GET DEV QUEUE PARAMS",
6649 "GET RESET DELAY PARAMS",
6656 "SET SELECT TIMEOUT",
6658 "SET TAG AGE LIMIT",
6660 "SET ACT NEG STATE",
6661 "SET ASYNC DATA SETUP TIME",
6662 "SET PCI CONTROL PARAMS",
6663 "SET TARGET PARAMS",
6664 "SET DEV QUEUE PARAMS",
6665 "SET RESET DELAY PARAMS",
6671 "RETURN BIOS BLOCK ADDR",
6672 "WRITE FOUR RAM WORDS",
6676 "SET SYSTEM PARAMETER",
6677 "GET SYSTEM PARAMETER",
6679 "GET SCAM CONFIGURATION",
6680 "SET SCAM CONFIGURATION",
6681 "SET FIRMWARE FEATURES",
6682 "GET FIRMWARE FEATURES",
6689 "INITIALIZE REQUEST QUEUE A64",
6690 "INITIALIZE RESPONSE QUEUE A64",
6692 "ENABLE TARGET MODE",
6693 "GET TARGET MODE STATE",
6697 "SET DATA OVERRUN RECOVERY MODE",
6698 "GET DATA OVERRUN RECOVERY MODE",
6703 #define ISP_FC_IBITS(op) ((mbpfc[((op)<<3) + 0] << 24) | (mbpfc[((op)<<3) + 1] << 16) | (mbpfc[((op)<<3) + 2] << 8) | (mbpfc[((op)<<3) + 3]))
6704 #define ISP_FC_OBITS(op) ((mbpfc[((op)<<3) + 4] << 24) | (mbpfc[((op)<<3) + 5] << 16) | (mbpfc[((op)<<3) + 6] << 8) | (mbpfc[((op)<<3) + 7]))
6706 #define ISP_FC_OPMAP(in0, out0) 0, 0, 0, in0, 0, 0, 0, out0
6707 #define ISP_FC_OPMAP_HALF(in1, in0, out1, out0) 0, 0, in1, in0, 0, 0, out1, out0
6708 #define ISP_FC_OPMAP_FULL(in3, in2, in1, in0, out3, out2, out1, out0) in3, in2, in1, in0, out3, out2, out1, out0
6709 static const uint32_t mbpfc[] = {
6710 ISP_FC_OPMAP(0x01, 0x01), /* 0x00: MBOX_NO_OP */
6711 ISP_FC_OPMAP(0x1f, 0x01), /* 0x01: MBOX_LOAD_RAM */
6712 ISP_FC_OPMAP_HALF(0x07, 0xff, 0x00, 0x03), /* 0x02: MBOX_EXEC_FIRMWARE */
6713 ISP_FC_OPMAP(0xdf, 0x01), /* 0x03: MBOX_DUMP_RAM */
6714 ISP_FC_OPMAP(0x07, 0x07), /* 0x04: MBOX_WRITE_RAM_WORD */
6715 ISP_FC_OPMAP(0x03, 0x07), /* 0x05: MBOX_READ_RAM_WORD */
6716 ISP_FC_OPMAP_FULL(0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff), /* 0x06: MBOX_MAILBOX_REG_TEST */
6717 ISP_FC_OPMAP(0x07, 0x07), /* 0x07: MBOX_VERIFY_CHECKSUM */
6718 ISP_FC_OPMAP_FULL(0x0, 0x0, 0x0, 0x01, 0x0, 0x3, 0x80, 0x7f), /* 0x08: MBOX_ABOUT_FIRMWARE */
6719 ISP_FC_OPMAP(0xdf, 0x01), /* 0x09: MBOX_LOAD_RISC_RAM_2100 */
6720 ISP_FC_OPMAP(0xdf, 0x01), /* 0x0a: DUMP RAM */
6721 ISP_FC_OPMAP_HALF(0x1, 0xff, 0x0, 0x01), /* 0x0b: MBOX_LOAD_RISC_RAM */
6722 ISP_FC_OPMAP(0x00, 0x00), /* 0x0c: */
6723 ISP_FC_OPMAP_HALF(0x1, 0x0f, 0x0, 0x01), /* 0x0d: MBOX_WRITE_RAM_WORD_EXTENDED */
6724 ISP_FC_OPMAP(0x01, 0x05), /* 0x0e: MBOX_CHECK_FIRMWARE */
6725 ISP_FC_OPMAP_HALF(0x1, 0x03, 0x0, 0x0d), /* 0x0f: MBOX_READ_RAM_WORD_EXTENDED */
6726 ISP_FC_OPMAP(0x1f, 0x11), /* 0x10: MBOX_INIT_REQ_QUEUE */
6727 ISP_FC_OPMAP(0x2f, 0x21), /* 0x11: MBOX_INIT_RES_QUEUE */
6728 ISP_FC_OPMAP(0x0f, 0x01), /* 0x12: MBOX_EXECUTE_IOCB */
6729 ISP_FC_OPMAP(0x03, 0x03), /* 0x13: MBOX_WAKE_UP */
6730 ISP_FC_OPMAP_HALF(0x1, 0xff, 0x0, 0x03), /* 0x14: MBOX_STOP_FIRMWARE */
6731 ISP_FC_OPMAP(0x4f, 0x01), /* 0x15: MBOX_ABORT */
6732 ISP_FC_OPMAP(0x07, 0x01), /* 0x16: MBOX_ABORT_DEVICE */
6733 ISP_FC_OPMAP(0x07, 0x01), /* 0x17: MBOX_ABORT_TARGET */
6734 ISP_FC_OPMAP(0x03, 0x03), /* 0x18: MBOX_BUS_RESET */
6735 ISP_FC_OPMAP(0x07, 0x05), /* 0x19: MBOX_STOP_QUEUE */
6736 ISP_FC_OPMAP(0x07, 0x05), /* 0x1a: MBOX_START_QUEUE */
6737 ISP_FC_OPMAP(0x07, 0x05), /* 0x1b: MBOX_SINGLE_STEP_QUEUE */
6738 ISP_FC_OPMAP(0x07, 0x05), /* 0x1c: MBOX_ABORT_QUEUE */
6739 ISP_FC_OPMAP(0x07, 0x03), /* 0x1d: MBOX_GET_DEV_QUEUE_STATUS */
6740 ISP_FC_OPMAP(0x00, 0x00), /* 0x1e: */
6741 ISP_FC_OPMAP(0x01, 0x07), /* 0x1f: MBOX_GET_FIRMWARE_STATUS */
6742 ISP_FC_OPMAP_HALF(0x2, 0x01, 0x7e, 0xcf), /* 0x20: MBOX_GET_LOOP_ID */
6743 ISP_FC_OPMAP(0x00, 0x00), /* 0x21: */
6744 ISP_FC_OPMAP(0x03, 0x4b), /* 0x22: MBOX_GET_TIMEOUT_PARAMS */
6745 ISP_FC_OPMAP(0x00, 0x00), /* 0x23: */
6746 ISP_FC_OPMAP(0x00, 0x00), /* 0x24: */
6747 ISP_FC_OPMAP(0x00, 0x00), /* 0x25: */
6748 ISP_FC_OPMAP(0x00, 0x00), /* 0x26: */
6749 ISP_FC_OPMAP(0x00, 0x00), /* 0x27: */
6750 ISP_FC_OPMAP(0x01, 0x03), /* 0x28: MBOX_GET_FIRMWARE_OPTIONS */
6751 ISP_FC_OPMAP(0x03, 0x07), /* 0x29: MBOX_GET_PORT_QUEUE_PARAMS */
6752 ISP_FC_OPMAP(0x00, 0x00), /* 0x2a: */
6753 ISP_FC_OPMAP(0x00, 0x00), /* 0x2b: */
6754 ISP_FC_OPMAP(0x00, 0x00), /* 0x2c: */
6755 ISP_FC_OPMAP(0x00, 0x00), /* 0x2d: */
6756 ISP_FC_OPMAP(0x00, 0x00), /* 0x2e: */
6757 ISP_FC_OPMAP(0x00, 0x00), /* 0x2f: */
6758 ISP_FC_OPMAP(0x00, 0x00), /* 0x30: */
6759 ISP_FC_OPMAP(0x00, 0x00), /* 0x31: */
6760 ISP_FC_OPMAP(0x4b, 0x4b), /* 0x32: MBOX_SET_TIMEOUT_PARAMS */
6761 ISP_FC_OPMAP(0x00, 0x00), /* 0x33: */
6762 ISP_FC_OPMAP(0x00, 0x00), /* 0x34: */
6763 ISP_FC_OPMAP(0x00, 0x00), /* 0x35: */
6764 ISP_FC_OPMAP(0x00, 0x00), /* 0x36: */
6765 ISP_FC_OPMAP(0x00, 0x00), /* 0x37: */
6766 ISP_FC_OPMAP(0x0f, 0x01), /* 0x38: MBOX_SET_FIRMWARE_OPTIONS */
6767 ISP_FC_OPMAP(0x0f, 0x07), /* 0x39: MBOX_SET_PORT_QUEUE_PARAMS */
6768 ISP_FC_OPMAP(0x00, 0x00), /* 0x3a: */
6769 ISP_FC_OPMAP(0x00, 0x00), /* 0x3b: */
6770 ISP_FC_OPMAP(0x00, 0x00), /* 0x3c: */
6771 ISP_FC_OPMAP(0x00, 0x00), /* 0x3d: */
6772 ISP_FC_OPMAP(0x00, 0x00), /* 0x3e: */
6773 ISP_FC_OPMAP(0x00, 0x00), /* 0x3f: */
6774 ISP_FC_OPMAP(0x03, 0x01), /* 0x40: MBOX_LOOP_PORT_BYPASS */
6775 ISP_FC_OPMAP(0x03, 0x01), /* 0x41: MBOX_LOOP_PORT_ENABLE */
6776 ISP_FC_OPMAP_HALF(0x0, 0x01, 0x1f, 0xcf), /* 0x42: MBOX_GET_RESOURCE_COUNT */
6777 ISP_FC_OPMAP(0x01, 0x01), /* 0x43: MBOX_REQUEST_OFFLINE_MODE */
6778 ISP_FC_OPMAP(0x00, 0x00), /* 0x44: */
6779 ISP_FC_OPMAP(0x00, 0x00), /* 0x45: */
6780 ISP_FC_OPMAP(0x00, 0x00), /* 0x46: */
6781 ISP_FC_OPMAP(0xcf, 0x03), /* 0x47: GET PORT_DATABASE ENHANCED */
6782 ISP_FC_OPMAP(0xcf, 0x0f), /* 0x48: MBOX_INIT_FIRMWARE_MULTI_ID */
6783 ISP_FC_OPMAP(0xcd, 0x01), /* 0x49: MBOX_GET_VP_DATABASE */
6784 ISP_FC_OPMAP_HALF(0x2, 0xcd, 0x0, 0x01), /* 0x4a: MBOX_GET_VP_DATABASE_ENTRY */
6785 ISP_FC_OPMAP(0x00, 0x00), /* 0x4b: */
6786 ISP_FC_OPMAP(0x00, 0x00), /* 0x4c: */
6787 ISP_FC_OPMAP(0x00, 0x00), /* 0x4d: */
6788 ISP_FC_OPMAP(0x00, 0x00), /* 0x4e: */
6789 ISP_FC_OPMAP(0x00, 0x00), /* 0x4f: */
6790 ISP_FC_OPMAP(0x00, 0x00), /* 0x50: */
6791 ISP_FC_OPMAP(0x00, 0x00), /* 0x51: */
6792 ISP_FC_OPMAP(0x00, 0x00), /* 0x52: */
6793 ISP_FC_OPMAP(0x00, 0x00), /* 0x53: */
6794 ISP_FC_OPMAP(0xcf, 0x01), /* 0x54: EXECUTE IOCB A64 */
6795 ISP_FC_OPMAP(0x00, 0x00), /* 0x55: */
6796 ISP_FC_OPMAP(0x00, 0x00), /* 0x56: */
6797 ISP_FC_OPMAP(0x00, 0x00), /* 0x57: */
6798 ISP_FC_OPMAP(0x00, 0x00), /* 0x58: */
6799 ISP_FC_OPMAP(0x00, 0x00), /* 0x59: */
6800 ISP_FC_OPMAP(0x00, 0x00), /* 0x5a: */
6801 ISP_FC_OPMAP(0x03, 0x01), /* 0x5b: MBOX_DRIVER_HEARTBEAT */
6802 ISP_FC_OPMAP(0xcf, 0x01), /* 0x5c: MBOX_FW_HEARTBEAT */
6803 ISP_FC_OPMAP(0x07, 0x1f), /* 0x5d: MBOX_GET_SET_DATA_RATE */
6804 ISP_FC_OPMAP(0x00, 0x00), /* 0x5e: */
6805 ISP_FC_OPMAP(0x00, 0x00), /* 0x5f: */
6806 ISP_FC_OPMAP(0xcf, 0x0f), /* 0x60: MBOX_INIT_FIRMWARE */
6807 ISP_FC_OPMAP(0x00, 0x00), /* 0x61: */
6808 ISP_FC_OPMAP(0x01, 0x01), /* 0x62: MBOX_INIT_LIP */
6809 ISP_FC_OPMAP(0xcd, 0x03), /* 0x63: MBOX_GET_FC_AL_POSITION_MAP */
6810 ISP_FC_OPMAP(0xcf, 0x01), /* 0x64: MBOX_GET_PORT_DB */
6811 ISP_FC_OPMAP(0x07, 0x01), /* 0x65: MBOX_CLEAR_ACA */
6812 ISP_FC_OPMAP(0x07, 0x01), /* 0x66: MBOX_TARGET_RESET */
6813 ISP_FC_OPMAP(0x07, 0x01), /* 0x67: MBOX_CLEAR_TASK_SET */
6814 ISP_FC_OPMAP(0x07, 0x01), /* 0x68: MBOX_ABORT_TASK_SET */
6815 ISP_FC_OPMAP(0x01, 0x07), /* 0x69: MBOX_GET_FW_STATE */
6816 ISP_FC_OPMAP_HALF(0x6, 0x03, 0x0, 0xcf), /* 0x6a: MBOX_GET_PORT_NAME */
6817 ISP_FC_OPMAP(0xcf, 0x01), /* 0x6b: MBOX_GET_LINK_STATUS */
6818 ISP_FC_OPMAP(0x0f, 0x01), /* 0x6c: MBOX_INIT_LIP_RESET */
6819 ISP_FC_OPMAP(0x00, 0x00), /* 0x6d: */
6820 ISP_FC_OPMAP(0xcf, 0x03), /* 0x6e: MBOX_SEND_SNS */
6821 ISP_FC_OPMAP(0x0f, 0x07), /* 0x6f: MBOX_FABRIC_LOGIN */
6822 ISP_FC_OPMAP_HALF(0x02, 0x03, 0x00, 0x03), /* 0x70: MBOX_SEND_CHANGE_REQUEST */
6823 ISP_FC_OPMAP(0x03, 0x03), /* 0x71: MBOX_FABRIC_LOGOUT */
6824 ISP_FC_OPMAP(0x0f, 0x0f), /* 0x72: MBOX_INIT_LIP_LOGIN */
6825 ISP_FC_OPMAP(0x00, 0x00), /* 0x73: */
6826 ISP_FC_OPMAP(0x07, 0x01), /* 0x74: LOGIN LOOP PORT */
6827 ISP_FC_OPMAP_HALF(0x03, 0xcf, 0x00, 0x07), /* 0x75: GET PORT/NODE NAME LIST */
6828 ISP_FC_OPMAP(0x4f, 0x01), /* 0x76: SET VENDOR ID */
6829 ISP_FC_OPMAP(0xcd, 0x01), /* 0x77: INITIALIZE IP MAILBOX */
6830 ISP_FC_OPMAP(0x00, 0x00), /* 0x78: */
6831 ISP_FC_OPMAP(0x00, 0x00), /* 0x79: */
6832 ISP_FC_OPMAP(0x00, 0x00), /* 0x7a: */
6833 ISP_FC_OPMAP(0x00, 0x00), /* 0x7b: */
6834 ISP_FC_OPMAP_HALF(0x03, 0x4f, 0x00, 0x07), /* 0x7c: Get ID List */
6835 ISP_FC_OPMAP(0xcf, 0x01), /* 0x7d: SEND LFA */
6836 ISP_FC_OPMAP(0x0f, 0x01) /* 0x7e: LUN RESET */
6838 #define MAX_FC_OPCODE 0x7e
6842 * (1): this sets bits 21..16 in mailbox register #8, which we nominally
6843 * do not access at this time in the core driver. The caller is
6844 * responsible for setting this register first (Gross!). The assumption
6845 * is that we won't overflow.
6848 static const char *fc_mbcmd_names[] = {
6862 "WRITE RAM WORD EXTENDED",
6864 "READ RAM WORD EXTENDED",
6865 "INIT REQUEST QUEUE", /* 10h */
6866 "INIT RESULT QUEUE",
6876 "SINGLE STEP QUEUE",
6878 "GET DEV QUEUE STATUS",
6880 "GET FIRMWARE STATUS",
6881 "GET LOOP ID", /* 20h */
6883 "GET TIMEOUT PARAMS",
6889 "GET FIRMWARE OPTIONS",
6890 "GET PORT QUEUE PARAMS",
6891 "GENERATE SYSTEM ERROR",
6897 "WRITE SFP", /* 30h */
6899 "SET TIMEOUT PARAMS",
6905 "SET FIRMWARE OPTIONS",
6906 "SET PORT QUEUE PARAMS",
6910 "RESTART NIC FIRMWARE",
6913 "LOOP PORT BYPASS", /* 40h */
6915 "GET RESOURCE COUNT",
6916 "REQUEST NON PARTICIPATING MODE",
6917 "DIAGNOSTIC ECHO TEST",
6918 "DIAGNOSTIC LOOPBACK",
6920 "GET PORT DATABASE ENHANCED",
6921 "INIT FIRMWARE MULTI ID",
6923 "GET VP DATABASE ENTRY",
6929 "GET FCF LIST", /* 50h */
6930 "GET DCBX PARAMETERS",
6941 "FIRMWARE HEARTBEAT",
6942 "GET/SET DATA RATE",
6945 "INIT FIRMWARE", /* 60h */
6946 "GET INIT CONTROL BLOCK",
6948 "GET FC-AL POSITION MAP",
6949 "GET PORT DATABASE",
6958 "GET LINK STATS & PRIVATE DATA CNTS",
6961 "SEND CHANGE REQUEST", /* 70h */
6966 "GET PORT/NODE NAME LIST",
6968 "INITIALIZE IP MAILBOX",
6979 isp_mboxcmd(ispsoftc_t *isp, mbreg_t *mbp)
6981 const char *cname, *xname, *sname;
6982 char tname[16], mname[16];
6983 unsigned int ibits, obits, box, opcode;
6985 opcode = mbp->param[0];
6987 if (opcode > MAX_FC_OPCODE) {
6988 mbp->param[0] = MBOX_INVALID_COMMAND;
6989 isp_prt(isp, ISP_LOGERR, "Unknown Command 0x%x", opcode);
6992 cname = fc_mbcmd_names[opcode];
6993 ibits = ISP_FC_IBITS(opcode);
6994 obits = ISP_FC_OBITS(opcode);
6996 if (opcode > MAX_SCSI_OPCODE) {
6997 mbp->param[0] = MBOX_INVALID_COMMAND;
6998 isp_prt(isp, ISP_LOGERR, "Unknown Command 0x%x", opcode);
7001 cname = scsi_mbcmd_names[opcode];
7002 ibits = ISP_SCSI_IBITS(opcode);
7003 obits = ISP_SCSI_OBITS(opcode);
7005 if (cname == NULL) {
7007 ISP_SNPRINTF(tname, sizeof tname, "opcode %x", opcode);
7009 isp_prt(isp, ISP_LOGDEBUG3, "Mailbox Command '%s'", cname);
7012 * Pick up any additional bits that the caller might have set.
7014 ibits |= mbp->ibits;
7015 obits |= mbp->obits;
7018 * Mask any bits that the caller wants us to mask
7020 ibits &= mbp->ibitm;
7021 obits &= mbp->obitm;
7024 if (ibits == 0 && obits == 0) {
7025 mbp->param[0] = MBOX_COMMAND_PARAM_ERROR;
7026 isp_prt(isp, ISP_LOGERR, "no parameters for 0x%x", opcode);
7031 * Get exclusive usage of mailbox registers.
7033 if (MBOX_ACQUIRE(isp)) {
7034 mbp->param[0] = MBOX_REGS_BUSY;
7038 for (box = 0; box < ISP_NMBOX(isp); box++) {
7039 if (ibits & (1 << box)) {
7040 isp_prt(isp, ISP_LOGDEBUG3, "IN mbox %d = 0x%04x", box,
7042 ISP_WRITE(isp, MBOX_OFF(box), mbp->param[box]);
7044 isp->isp_mboxtmp[box] = mbp->param[box] = 0;
7047 isp->isp_lastmbxcmd = opcode;
7050 * We assume that we can't overwrite a previous command.
7052 isp->isp_obits = obits;
7053 isp->isp_mboxbsy = 1;
7056 * Set Host Interrupt condition so that RISC will pick up mailbox regs.
7059 ISP_WRITE(isp, BIU2400_HCCR, HCCR_2400_CMD_SET_HOST_INT);
7061 ISP_WRITE(isp, HCCR, HCCR_CMD_SET_HOST_INT);
7065 * While we haven't finished the command, spin our wheels here.
7067 MBOX_WAIT_COMPLETE(isp, mbp);
7070 * Did the command time out?
7072 if (mbp->param[0] == MBOX_TIMEOUT) {
7073 isp->isp_mboxbsy = 0;
7079 * Copy back output registers.
7081 for (box = 0; box < ISP_NMBOX(isp); box++) {
7082 if (obits & (1 << box)) {
7083 mbp->param[box] = isp->isp_mboxtmp[box];
7084 isp_prt(isp, ISP_LOGDEBUG3, "OUT mbox %d = 0x%04x", box,
7089 isp->isp_mboxbsy = 0;
7092 if (mbp->logval == 0 || mbp->param[0] == MBOX_COMMAND_COMPLETE)
7095 if ((mbp->param[0] & 0xbfe0) == 0 &&
7096 (mbp->logval & MBLOGMASK(mbp->param[0])) == 0)
7101 switch (mbp->param[0]) {
7102 case MBOX_INVALID_COMMAND:
7103 xname = "INVALID COMMAND";
7105 case MBOX_HOST_INTERFACE_ERROR:
7106 xname = "HOST INTERFACE ERROR";
7108 case MBOX_TEST_FAILED:
7109 xname = "TEST FAILED";
7111 case MBOX_COMMAND_ERROR:
7112 xname = "COMMAND ERROR";
7113 ISP_SNPRINTF(mname, sizeof(mname), " subcode 0x%x",
7117 case MBOX_COMMAND_PARAM_ERROR:
7118 xname = "COMMAND PARAMETER ERROR";
7120 case MBOX_PORT_ID_USED:
7121 xname = "PORT ID ALREADY IN USE";
7123 case MBOX_LOOP_ID_USED:
7124 xname = "LOOP ID ALREADY IN USE";
7126 case MBOX_ALL_IDS_USED:
7127 xname = "ALL LOOP IDS IN USE";
7129 case MBOX_NOT_LOGGED_IN:
7130 xname = "NOT LOGGED IN";
7132 case MBOX_LINK_DOWN_ERROR:
7133 xname = "LINK DOWN ERROR";
7135 case MBOX_LOOPBACK_ERROR:
7136 xname = "LOOPBACK ERROR";
7138 case MBOX_CHECKSUM_ERROR:
7139 xname = "CHECKSUM ERROR";
7141 case MBOX_INVALID_PRODUCT_KEY:
7142 xname = "INVALID PRODUCT KEY";
7144 case MBOX_REGS_BUSY:
7145 xname = "REGISTERS BUSY";
7151 ISP_SNPRINTF(mname, sizeof mname, "error 0x%x", mbp->param[0]);
7156 isp_prt(isp, ISP_LOGALL, "Mailbox Command '%s' failed (%s%s)",
7157 cname, xname, sname);
7162 isp_fw_state(ispsoftc_t *isp, int chan)
7167 MBSINIT(&mbs, MBOX_GET_FW_STATE, MBLOGALL, 0);
7168 isp_mboxcmd(isp, &mbs);
7169 if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
7170 return (mbs.param[1]);
7177 isp_spi_update(ispsoftc_t *isp, int chan)
7185 * There are no 'per-bus' settings for Fibre Channel.
7189 sdp = SDPARAM(isp, chan);
7192 for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
7193 uint16_t flags, period, offset;
7196 if (sdp->isp_devparam[tgt].dev_enable == 0) {
7197 sdp->isp_devparam[tgt].dev_update = 0;
7198 sdp->isp_devparam[tgt].dev_refresh = 0;
7199 isp_prt(isp, ISP_LOGDEBUG0, "skipping target %d bus %d update", tgt, chan);
7203 * If the goal is to update the status of the device,
7204 * take what's in goal_flags and try and set the device
7205 * toward that. Otherwise, if we're just refreshing the
7206 * current device state, get the current parameters.
7209 MBSINIT(&mbs, 0, MBLOGALL, 0);
7212 * Refresh overrides set
7214 if (sdp->isp_devparam[tgt].dev_refresh) {
7215 mbs.param[0] = MBOX_GET_TARGET_PARAMS;
7217 } else if (sdp->isp_devparam[tgt].dev_update) {
7218 mbs.param[0] = MBOX_SET_TARGET_PARAMS;
7221 * Make sure goal_flags has "Renegotiate on Error"
7222 * on and "Freeze Queue on Error" off.
7224 sdp->isp_devparam[tgt].goal_flags |= DPARM_RENEG;
7225 sdp->isp_devparam[tgt].goal_flags &= ~DPARM_QFRZ;
7226 mbs.param[2] = sdp->isp_devparam[tgt].goal_flags;
7229 * Insist that PARITY must be enabled
7230 * if SYNC or WIDE is enabled.
7232 if ((mbs.param[2] & (DPARM_SYNC|DPARM_WIDE)) != 0) {
7233 mbs.param[2] |= DPARM_PARITY;
7236 if (mbs.param[2] & DPARM_SYNC) {
7238 (sdp->isp_devparam[tgt].goal_offset << 8) |
7239 (sdp->isp_devparam[tgt].goal_period);
7242 * A command completion later that has
7243 * RQSTF_NEGOTIATION set can cause
7244 * the dev_refresh/announce cycle also.
7246 * Note: It is really important to update our current
7247 * flags with at least the state of TAG capabilities-
7248 * otherwise we might try and send a tagged command
7249 * when we have it all turned off. So change it here
7250 * to say that current already matches goal.
7252 sdp->isp_devparam[tgt].actv_flags &= ~DPARM_TQING;
7253 sdp->isp_devparam[tgt].actv_flags |=
7254 (sdp->isp_devparam[tgt].goal_flags & DPARM_TQING);
7255 isp_prt(isp, ISP_LOGDEBUG0, "bus %d set tgt %d flags 0x%x off 0x%x period 0x%x",
7256 chan, tgt, mbs.param[2], mbs.param[3] >> 8, mbs.param[3] & 0xff);
7261 mbs.param[1] = (chan << 15) | (tgt << 8);
7262 isp_mboxcmd(isp, &mbs);
7263 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
7267 sdp->sendmarker = 1;
7268 sdp->isp_devparam[tgt].dev_update = 0;
7269 sdp->isp_devparam[tgt].dev_refresh = 1;
7271 sdp->isp_devparam[tgt].dev_refresh = 0;
7272 flags = mbs.param[2];
7273 period = mbs.param[3] & 0xff;
7274 offset = mbs.param[3] >> 8;
7275 sdp->isp_devparam[tgt].actv_flags = flags;
7276 sdp->isp_devparam[tgt].actv_period = period;
7277 sdp->isp_devparam[tgt].actv_offset = offset;
7278 isp_async(isp, ISPASYNC_NEW_TGT_PARAMS, chan, tgt);
7282 for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
7283 if (sdp->isp_devparam[tgt].dev_update ||
7284 sdp->isp_devparam[tgt].dev_refresh) {
7292 isp_setdfltsdparm(ispsoftc_t *isp)
7295 sdparam *sdp, *sdp1;
7297 sdp = SDPARAM(isp, 0);
7298 if (IS_DUALBUS(isp))
7304 * Establish some default parameters.
7306 sdp->isp_cmd_dma_burst_enable = 0;
7307 sdp->isp_data_dma_burst_enabl = 1;
7308 sdp->isp_fifo_threshold = 0;
7309 sdp->isp_initiator_id = DEFAULT_IID(isp, 0);
7310 if (isp->isp_type >= ISP_HA_SCSI_1040) {
7311 sdp->isp_async_data_setup = 9;
7313 sdp->isp_async_data_setup = 6;
7315 sdp->isp_selection_timeout = 250;
7316 sdp->isp_max_queue_depth = MAXISPREQUEST(isp);
7317 sdp->isp_tag_aging = 8;
7318 sdp->isp_bus_reset_delay = 5;
7320 * Don't retry selection, busy or queue full automatically- reflect
7323 sdp->isp_retry_count = 0;
7324 sdp->isp_retry_delay = 0;
7326 for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
7327 sdp->isp_devparam[tgt].exc_throttle = ISP_EXEC_THROTTLE;
7328 sdp->isp_devparam[tgt].dev_enable = 1;
7332 * The trick here is to establish a default for the default (honk!)
7333 * state (goal_flags). Then try and get the current status from
7334 * the card to fill in the current state. We don't, in fact, set
7335 * the default to the SAFE default state- that's not the goal state.
7337 for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
7339 sdp->isp_devparam[tgt].actv_offset = 0;
7340 sdp->isp_devparam[tgt].actv_period = 0;
7341 sdp->isp_devparam[tgt].actv_flags = 0;
7343 sdp->isp_devparam[tgt].goal_flags =
7344 sdp->isp_devparam[tgt].nvrm_flags = DPARM_DEFAULT;
7347 * We default to Wide/Fast for versions less than a 1040
7348 * (unless it's SBus).
7350 if (IS_ULTRA3(isp)) {
7351 off = ISP_80M_SYNCPARMS >> 8;
7352 per = ISP_80M_SYNCPARMS & 0xff;
7353 } else if (IS_ULTRA2(isp)) {
7354 off = ISP_40M_SYNCPARMS >> 8;
7355 per = ISP_40M_SYNCPARMS & 0xff;
7356 } else if (IS_1240(isp)) {
7357 off = ISP_20M_SYNCPARMS >> 8;
7358 per = ISP_20M_SYNCPARMS & 0xff;
7359 } else if ((isp->isp_bustype == ISP_BT_SBUS &&
7360 isp->isp_type < ISP_HA_SCSI_1020A) ||
7361 (isp->isp_bustype == ISP_BT_PCI &&
7362 isp->isp_type < ISP_HA_SCSI_1040) ||
7363 (isp->isp_clock && isp->isp_clock < 60) ||
7364 (sdp->isp_ultramode == 0)) {
7365 off = ISP_10M_SYNCPARMS >> 8;
7366 per = ISP_10M_SYNCPARMS & 0xff;
7368 off = ISP_20M_SYNCPARMS_1040 >> 8;
7369 per = ISP_20M_SYNCPARMS_1040 & 0xff;
7371 sdp->isp_devparam[tgt].goal_offset =
7372 sdp->isp_devparam[tgt].nvrm_offset = off;
7373 sdp->isp_devparam[tgt].goal_period =
7374 sdp->isp_devparam[tgt].nvrm_period = per;
7379 * If we're a dual bus card, just copy the data over
7383 sdp1->isp_initiator_id = DEFAULT_IID(isp, 1);
7387 * If we've not been told to avoid reading NVRAM, try and read it.
7388 * If we're successful reading it, we can then return because NVRAM
7389 * will tell us what the desired settings are. Otherwise, we establish
7390 * some reasonable 'fake' nvram and goal defaults.
7392 if ((isp->isp_confopts & ISP_CFG_NONVRAM) == 0) {
7395 if (isp_read_nvram(isp, 0) == 0) {
7396 if (IS_DUALBUS(isp)) {
7397 if (isp_read_nvram(isp, 1) == 0) {
7402 MBSINIT(&mbs, MBOX_GET_ACT_NEG_STATE, MBLOGNONE, 0);
7403 isp_mboxcmd(isp, &mbs);
7404 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
7405 sdp->isp_req_ack_active_neg = 1;
7406 sdp->isp_data_line_active_neg = 1;
7408 sdp1->isp_req_ack_active_neg = 1;
7409 sdp1->isp_data_line_active_neg = 1;
7412 sdp->isp_req_ack_active_neg =
7413 (mbs.param[1] >> 4) & 0x1;
7414 sdp->isp_data_line_active_neg =
7415 (mbs.param[1] >> 5) & 0x1;
7417 sdp1->isp_req_ack_active_neg =
7418 (mbs.param[2] >> 4) & 0x1;
7419 sdp1->isp_data_line_active_neg =
7420 (mbs.param[2] >> 5) & 0x1;
7428 isp_setdfltfcparm(ispsoftc_t *isp, int chan)
7430 fcparam *fcp = FCPARAM(isp, chan);
7433 * Establish some default parameters.
7435 fcp->role = DEFAULT_ROLE(isp, chan);
7436 fcp->isp_maxalloc = ICB_DFLT_ALLOC;
7437 fcp->isp_retry_delay = ICB_DFLT_RDELAY;
7438 fcp->isp_retry_count = ICB_DFLT_RCOUNT;
7439 fcp->isp_loopid = DEFAULT_LOOPID(isp, chan);
7440 fcp->isp_wwnn_nvram = DEFAULT_NODEWWN(isp, chan);
7441 fcp->isp_wwpn_nvram = DEFAULT_PORTWWN(isp, chan);
7442 fcp->isp_fwoptions = 0;
7443 fcp->isp_xfwoptions = 0;
7444 fcp->isp_zfwoptions = 0;
7445 fcp->isp_lasthdl = NIL_HANDLE;
7446 fcp->isp_login_hdl = NIL_HANDLE;
7449 fcp->isp_fwoptions |= ICB2400_OPT1_FAIRNESS;
7450 fcp->isp_fwoptions |= ICB2400_OPT1_HARD_ADDRESS;
7451 if (isp->isp_confopts & ISP_CFG_FULL_DUPLEX)
7452 fcp->isp_fwoptions |= ICB2400_OPT1_FULL_DUPLEX;
7453 fcp->isp_fwoptions |= ICB2400_OPT1_BOTH_WWNS;
7454 fcp->isp_xfwoptions |= ICB2400_OPT2_LOOP_2_PTP;
7455 fcp->isp_zfwoptions |= ICB2400_OPT3_RATE_AUTO;
7457 fcp->isp_fwoptions |= ICBOPT_FAIRNESS;
7458 fcp->isp_fwoptions |= ICBOPT_PDBCHANGE_AE;
7459 fcp->isp_fwoptions |= ICBOPT_HARD_ADDRESS;
7460 if (isp->isp_confopts & ISP_CFG_FULL_DUPLEX)
7461 fcp->isp_fwoptions |= ICBOPT_FULL_DUPLEX;
7463 * Make sure this is turned off now until we get
7464 * extended options from NVRAM
7466 fcp->isp_fwoptions &= ~ICBOPT_EXTENDED;
7467 fcp->isp_xfwoptions |= ICBXOPT_LOOP_2_PTP;
7468 fcp->isp_zfwoptions |= ICBZOPT_RATE_AUTO;
7473 * Now try and read NVRAM unless told to not do so.
7474 * This will set fcparam's isp_wwnn_nvram && isp_wwpn_nvram.
7476 if ((isp->isp_confopts & ISP_CFG_NONVRAM) == 0) {
7479 * Give a couple of tries at reading NVRAM.
7481 for (i = 0; i < 2; i++) {
7482 j = isp_read_nvram(isp, chan);
7488 isp->isp_confopts |= ISP_CFG_NONVRAM;
7492 fcp->isp_wwnn = ACTIVE_NODEWWN(isp, chan);
7493 fcp->isp_wwpn = ACTIVE_PORTWWN(isp, chan);
7494 isp_prt(isp, ISP_LOGCONFIG, "Chan %d 0x%08x%08x/0x%08x%08x Role %s",
7495 chan, (uint32_t) (fcp->isp_wwnn >> 32), (uint32_t) (fcp->isp_wwnn),
7496 (uint32_t) (fcp->isp_wwpn >> 32), (uint32_t) (fcp->isp_wwpn),
7497 isp_class3_roles[fcp->role]);
7501 * Re-initialize the ISP and complete all orphaned commands
7502 * with a 'botched' notice. The reset/init routines should
7503 * not disturb an already active list of commands.
7507 isp_reinit(ispsoftc_t *isp, int do_load_defaults)
7511 if (isp->isp_state > ISP_RESETSTATE)
7513 if (isp->isp_state != ISP_RESETSTATE)
7514 isp_reset(isp, do_load_defaults);
7515 if (isp->isp_state != ISP_RESETSTATE) {
7517 isp_prt(isp, ISP_LOGERR, "%s: cannot reset card", __func__);
7522 if (isp->isp_state > ISP_RESETSTATE &&
7523 isp->isp_state != ISP_RUNSTATE) {
7525 isp_prt(isp, ISP_LOGERR, "%s: cannot init card", __func__);
7526 ISP_DISABLE_INTS(isp);
7529 * If we're in ISP_ROLE_NONE, turn off the lasers.
7531 if (!IS_24XX(isp)) {
7532 ISP_WRITE(isp, BIU2100_CSR, BIU2100_FPM0_REGS);
7533 ISP_WRITE(isp, FPM_DIAG_CONFIG, FPM_SOFT_RESET);
7534 ISP_WRITE(isp, BIU2100_CSR, BIU2100_FB_REGS);
7535 ISP_WRITE(isp, FBM_CMD, FBMCMD_FIFO_RESET_ALL);
7536 ISP_WRITE(isp, BIU2100_CSR, BIU2100_RISC_REGS);
7542 isp_clear_commands(isp);
7544 for (i = 0; i < isp->isp_nchan; i++)
7545 isp_clear_portdb(isp, i);
7554 isp_read_nvram(ispsoftc_t *isp, int bus)
7557 uint8_t csum, minversion;
7559 uint8_t _x[ISP2400_NVRAM_SIZE];
7560 uint16_t _s[ISP2400_NVRAM_SIZE>>1];
7562 #define nvram_data _n._x
7563 #define nvram_words _n._s
7566 return (isp_read_nvram_2400(isp, nvram_data));
7567 } else if (IS_FC(isp)) {
7568 amt = ISP2100_NVRAM_SIZE;
7570 } else if (IS_ULTRA2(isp)) {
7571 amt = ISP1080_NVRAM_SIZE;
7574 amt = ISP_NVRAM_SIZE;
7578 for (i = 0; i < amt>>1; i++) {
7579 isp_rdnvram_word(isp, i, &nvram_words[i]);
7582 if (nvram_data[0] != 'I' || nvram_data[1] != 'S' ||
7583 nvram_data[2] != 'P') {
7584 if (isp->isp_bustype != ISP_BT_SBUS) {
7585 isp_prt(isp, ISP_LOGWARN, "invalid NVRAM header");
7586 isp_prt(isp, ISP_LOGDEBUG0, "%x %x %x", nvram_data[0], nvram_data[1], nvram_data[2]);
7592 for (csum = 0, i = 0; i < amt; i++) {
7593 csum += nvram_data[i];
7596 isp_prt(isp, ISP_LOGWARN, "invalid NVRAM checksum");
7601 if (ISP_NVRAM_VERSION(nvram_data) < minversion) {
7602 isp_prt(isp, ISP_LOGWARN, "version %d NVRAM not understood",
7603 ISP_NVRAM_VERSION(nvram_data));
7608 if (IS_ULTRA3(isp)) {
7609 isp_parse_nvram_12160(isp, bus, nvram_data);
7610 } else if (IS_1080(isp)) {
7611 isp_parse_nvram_1080(isp, bus, nvram_data);
7612 } else if (IS_1280(isp) || IS_1240(isp)) {
7613 isp_parse_nvram_1080(isp, bus, nvram_data);
7614 } else if (IS_SCSI(isp)) {
7615 isp_parse_nvram_1020(isp, nvram_data);
7617 isp_parse_nvram_2100(isp, nvram_data);
7627 isp_read_nvram_2400(ispsoftc_t *isp, uint8_t *nvram_data)
7630 uint32_t addr, csum, lwrds, *dptr;
7632 if (isp->isp_port) {
7633 addr = ISP2400_NVRAM_PORT1_ADDR;
7635 addr = ISP2400_NVRAM_PORT0_ADDR;
7638 dptr = (uint32_t *) nvram_data;
7639 for (lwrds = 0; lwrds < ISP2400_NVRAM_SIZE >> 2; lwrds++) {
7640 isp_rd_2400_nvram(isp, addr++, dptr++);
7642 if (nvram_data[0] != 'I' || nvram_data[1] != 'S' ||
7643 nvram_data[2] != 'P') {
7644 isp_prt(isp, ISP_LOGWARN, "invalid NVRAM header (%x %x %x)",
7645 nvram_data[0], nvram_data[1], nvram_data[2]);
7649 dptr = (uint32_t *) nvram_data;
7650 for (csum = 0, lwrds = 0; lwrds < ISP2400_NVRAM_SIZE >> 2; lwrds++) {
7652 ISP_IOXGET_32(isp, &dptr[lwrds], tmp);
7656 isp_prt(isp, ISP_LOGWARN, "invalid NVRAM checksum");
7660 isp_parse_nvram_2400(isp, nvram_data);
7666 isp_rdnvram_word(ispsoftc_t *isp, int wo, uint16_t *rp)
7669 uint16_t bit, rqst, junk;
7671 ISP_WRITE(isp, BIU_NVRAM, BIU_NVRAM_SELECT);
7673 ISP_WRITE(isp, BIU_NVRAM, BIU_NVRAM_SELECT|BIU_NVRAM_CLOCK);
7677 wo &= ((ISP2100_NVRAM_SIZE >> 1) - 1);
7678 if (IS_2312(isp) && isp->isp_port) {
7681 rqst = (ISP_NVRAM_READ << 8) | wo;
7683 } else if (IS_ULTRA2(isp)) {
7684 wo &= ((ISP1080_NVRAM_SIZE >> 1) - 1);
7685 rqst = (ISP_NVRAM_READ << 8) | wo;
7688 wo &= ((ISP_NVRAM_SIZE >> 1) - 1);
7689 rqst = (ISP_NVRAM_READ << 6) | wo;
7694 * Clock the word select request out...
7696 for (i = cbits; i >= 0; i--) {
7697 if ((rqst >> i) & 1) {
7698 bit = BIU_NVRAM_SELECT | BIU_NVRAM_DATAOUT;
7700 bit = BIU_NVRAM_SELECT;
7702 ISP_WRITE(isp, BIU_NVRAM, bit);
7704 junk = ISP_READ(isp, BIU_NVRAM); /* force PCI flush */
7705 ISP_WRITE(isp, BIU_NVRAM, bit | BIU_NVRAM_CLOCK);
7707 junk = ISP_READ(isp, BIU_NVRAM); /* force PCI flush */
7708 ISP_WRITE(isp, BIU_NVRAM, bit);
7710 junk = ISP_READ(isp, BIU_NVRAM); /* force PCI flush */
7713 * Now read the result back in (bits come back in MSB format).
7716 for (i = 0; i < 16; i++) {
7719 ISP_WRITE(isp, BIU_NVRAM, BIU_NVRAM_SELECT|BIU_NVRAM_CLOCK);
7721 rv = ISP_READ(isp, BIU_NVRAM);
7722 if (rv & BIU_NVRAM_DATAIN) {
7726 ISP_WRITE(isp, BIU_NVRAM, BIU_NVRAM_SELECT);
7728 junk = ISP_READ(isp, BIU_NVRAM); /* force PCI flush */
7730 ISP_WRITE(isp, BIU_NVRAM, 0);
7732 junk = ISP_READ(isp, BIU_NVRAM); /* force PCI flush */
7733 ISP_SWIZZLE_NVRAM_WORD(isp, rp);
7737 isp_rd_2400_nvram(ispsoftc_t *isp, uint32_t addr, uint32_t *rp)
7740 uint32_t base = 0x7ffe0000;
7744 base = 0x7fe7c000; /* XXX: Observation, may be wrong. */
7745 } else if (IS_25XX(isp)) {
7746 base = 0x7ff00000 | 0x48000;
7748 ISP_WRITE(isp, BIU2400_FLASH_ADDR, base | addr);
7749 for (loops = 0; loops < 5000; loops++) {
7751 tmp = ISP_READ(isp, BIU2400_FLASH_ADDR);
7752 if ((tmp & (1U << 31)) != 0) {
7756 if (tmp & (1U << 31)) {
7757 *rp = ISP_READ(isp, BIU2400_FLASH_DATA);
7758 ISP_SWIZZLE_NVRAM_LONG(isp, rp);
7765 isp_parse_nvram_1020(ispsoftc_t *isp, uint8_t *nvram_data)
7767 sdparam *sdp = SDPARAM(isp, 0);
7770 sdp->isp_fifo_threshold =
7771 ISP_NVRAM_FIFO_THRESHOLD(nvram_data) |
7772 (ISP_NVRAM_FIFO_THRESHOLD_128(nvram_data) << 2);
7774 if ((isp->isp_confopts & ISP_CFG_OWNLOOPID) == 0)
7775 sdp->isp_initiator_id = ISP_NVRAM_INITIATOR_ID(nvram_data);
7777 sdp->isp_bus_reset_delay =
7778 ISP_NVRAM_BUS_RESET_DELAY(nvram_data);
7780 sdp->isp_retry_count =
7781 ISP_NVRAM_BUS_RETRY_COUNT(nvram_data);
7783 sdp->isp_retry_delay =
7784 ISP_NVRAM_BUS_RETRY_DELAY(nvram_data);
7786 sdp->isp_async_data_setup =
7787 ISP_NVRAM_ASYNC_DATA_SETUP_TIME(nvram_data);
7789 if (isp->isp_type >= ISP_HA_SCSI_1040) {
7790 if (sdp->isp_async_data_setup < 9) {
7791 sdp->isp_async_data_setup = 9;
7794 if (sdp->isp_async_data_setup != 6) {
7795 sdp->isp_async_data_setup = 6;
7799 sdp->isp_req_ack_active_neg =
7800 ISP_NVRAM_REQ_ACK_ACTIVE_NEGATION(nvram_data);
7802 sdp->isp_data_line_active_neg =
7803 ISP_NVRAM_DATA_LINE_ACTIVE_NEGATION(nvram_data);
7805 sdp->isp_data_dma_burst_enabl =
7806 ISP_NVRAM_DATA_DMA_BURST_ENABLE(nvram_data);
7808 sdp->isp_cmd_dma_burst_enable =
7809 ISP_NVRAM_CMD_DMA_BURST_ENABLE(nvram_data);
7811 sdp->isp_tag_aging =
7812 ISP_NVRAM_TAG_AGE_LIMIT(nvram_data);
7814 sdp->isp_selection_timeout =
7815 ISP_NVRAM_SELECTION_TIMEOUT(nvram_data);
7817 sdp->isp_max_queue_depth =
7818 ISP_NVRAM_MAX_QUEUE_DEPTH(nvram_data);
7820 sdp->isp_fast_mttr = ISP_NVRAM_FAST_MTTR_ENABLE(nvram_data);
7822 for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
7823 sdp->isp_devparam[tgt].dev_enable =
7824 ISP_NVRAM_TGT_DEVICE_ENABLE(nvram_data, tgt);
7825 sdp->isp_devparam[tgt].exc_throttle =
7826 ISP_NVRAM_TGT_EXEC_THROTTLE(nvram_data, tgt);
7827 sdp->isp_devparam[tgt].nvrm_offset =
7828 ISP_NVRAM_TGT_SYNC_OFFSET(nvram_data, tgt);
7829 sdp->isp_devparam[tgt].nvrm_period =
7830 ISP_NVRAM_TGT_SYNC_PERIOD(nvram_data, tgt);
7832 * We probably shouldn't lie about this, but it
7833 * it makes it much safer if we limit NVRAM values
7836 if (isp->isp_type < ISP_HA_SCSI_1040) {
7838 * If we're not ultra, we can't possibly
7839 * be a shorter period than this.
7841 if (sdp->isp_devparam[tgt].nvrm_period < 0x19) {
7842 sdp->isp_devparam[tgt].nvrm_period = 0x19;
7844 if (sdp->isp_devparam[tgt].nvrm_offset > 0xc) {
7845 sdp->isp_devparam[tgt].nvrm_offset = 0x0c;
7848 if (sdp->isp_devparam[tgt].nvrm_offset > 0x8) {
7849 sdp->isp_devparam[tgt].nvrm_offset = 0x8;
7852 sdp->isp_devparam[tgt].nvrm_flags = 0;
7853 if (ISP_NVRAM_TGT_RENEG(nvram_data, tgt))
7854 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_RENEG;
7855 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_ARQ;
7856 if (ISP_NVRAM_TGT_TQING(nvram_data, tgt))
7857 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_TQING;
7858 if (ISP_NVRAM_TGT_SYNC(nvram_data, tgt))
7859 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_SYNC;
7860 if (ISP_NVRAM_TGT_WIDE(nvram_data, tgt))
7861 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_WIDE;
7862 if (ISP_NVRAM_TGT_PARITY(nvram_data, tgt))
7863 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_PARITY;
7864 if (ISP_NVRAM_TGT_DISC(nvram_data, tgt))
7865 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_DISC;
7866 sdp->isp_devparam[tgt].actv_flags = 0; /* we don't know */
7867 sdp->isp_devparam[tgt].goal_offset =
7868 sdp->isp_devparam[tgt].nvrm_offset;
7869 sdp->isp_devparam[tgt].goal_period =
7870 sdp->isp_devparam[tgt].nvrm_period;
7871 sdp->isp_devparam[tgt].goal_flags =
7872 sdp->isp_devparam[tgt].nvrm_flags;
7877 isp_parse_nvram_1080(ispsoftc_t *isp, int bus, uint8_t *nvram_data)
7879 sdparam *sdp = SDPARAM(isp, bus);
7882 sdp->isp_fifo_threshold =
7883 ISP1080_NVRAM_FIFO_THRESHOLD(nvram_data);
7885 if ((isp->isp_confopts & ISP_CFG_OWNLOOPID) == 0)
7886 sdp->isp_initiator_id = ISP1080_NVRAM_INITIATOR_ID(nvram_data, bus);
7888 sdp->isp_bus_reset_delay =
7889 ISP1080_NVRAM_BUS_RESET_DELAY(nvram_data, bus);
7891 sdp->isp_retry_count =
7892 ISP1080_NVRAM_BUS_RETRY_COUNT(nvram_data, bus);
7894 sdp->isp_retry_delay =
7895 ISP1080_NVRAM_BUS_RETRY_DELAY(nvram_data, bus);
7897 sdp->isp_async_data_setup =
7898 ISP1080_NVRAM_ASYNC_DATA_SETUP_TIME(nvram_data, bus);
7900 sdp->isp_req_ack_active_neg =
7901 ISP1080_NVRAM_REQ_ACK_ACTIVE_NEGATION(nvram_data, bus);
7903 sdp->isp_data_line_active_neg =
7904 ISP1080_NVRAM_DATA_LINE_ACTIVE_NEGATION(nvram_data, bus);
7906 sdp->isp_data_dma_burst_enabl =
7907 ISP1080_NVRAM_BURST_ENABLE(nvram_data);
7909 sdp->isp_cmd_dma_burst_enable =
7910 ISP1080_NVRAM_BURST_ENABLE(nvram_data);
7912 sdp->isp_selection_timeout =
7913 ISP1080_NVRAM_SELECTION_TIMEOUT(nvram_data, bus);
7915 sdp->isp_max_queue_depth =
7916 ISP1080_NVRAM_MAX_QUEUE_DEPTH(nvram_data, bus);
7918 for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
7919 sdp->isp_devparam[tgt].dev_enable =
7920 ISP1080_NVRAM_TGT_DEVICE_ENABLE(nvram_data, tgt, bus);
7921 sdp->isp_devparam[tgt].exc_throttle =
7922 ISP1080_NVRAM_TGT_EXEC_THROTTLE(nvram_data, tgt, bus);
7923 sdp->isp_devparam[tgt].nvrm_offset =
7924 ISP1080_NVRAM_TGT_SYNC_OFFSET(nvram_data, tgt, bus);
7925 sdp->isp_devparam[tgt].nvrm_period =
7926 ISP1080_NVRAM_TGT_SYNC_PERIOD(nvram_data, tgt, bus);
7927 sdp->isp_devparam[tgt].nvrm_flags = 0;
7928 if (ISP1080_NVRAM_TGT_RENEG(nvram_data, tgt, bus))
7929 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_RENEG;
7930 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_ARQ;
7931 if (ISP1080_NVRAM_TGT_TQING(nvram_data, tgt, bus))
7932 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_TQING;
7933 if (ISP1080_NVRAM_TGT_SYNC(nvram_data, tgt, bus))
7934 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_SYNC;
7935 if (ISP1080_NVRAM_TGT_WIDE(nvram_data, tgt, bus))
7936 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_WIDE;
7937 if (ISP1080_NVRAM_TGT_PARITY(nvram_data, tgt, bus))
7938 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_PARITY;
7939 if (ISP1080_NVRAM_TGT_DISC(nvram_data, tgt, bus))
7940 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_DISC;
7941 sdp->isp_devparam[tgt].actv_flags = 0;
7942 sdp->isp_devparam[tgt].goal_offset =
7943 sdp->isp_devparam[tgt].nvrm_offset;
7944 sdp->isp_devparam[tgt].goal_period =
7945 sdp->isp_devparam[tgt].nvrm_period;
7946 sdp->isp_devparam[tgt].goal_flags =
7947 sdp->isp_devparam[tgt].nvrm_flags;
7952 isp_parse_nvram_12160(ispsoftc_t *isp, int bus, uint8_t *nvram_data)
7954 sdparam *sdp = SDPARAM(isp, bus);
7957 sdp->isp_fifo_threshold =
7958 ISP12160_NVRAM_FIFO_THRESHOLD(nvram_data);
7960 if ((isp->isp_confopts & ISP_CFG_OWNLOOPID) == 0)
7961 sdp->isp_initiator_id = ISP12160_NVRAM_INITIATOR_ID(nvram_data, bus);
7963 sdp->isp_bus_reset_delay =
7964 ISP12160_NVRAM_BUS_RESET_DELAY(nvram_data, bus);
7966 sdp->isp_retry_count =
7967 ISP12160_NVRAM_BUS_RETRY_COUNT(nvram_data, bus);
7969 sdp->isp_retry_delay =
7970 ISP12160_NVRAM_BUS_RETRY_DELAY(nvram_data, bus);
7972 sdp->isp_async_data_setup =
7973 ISP12160_NVRAM_ASYNC_DATA_SETUP_TIME(nvram_data, bus);
7975 sdp->isp_req_ack_active_neg =
7976 ISP12160_NVRAM_REQ_ACK_ACTIVE_NEGATION(nvram_data, bus);
7978 sdp->isp_data_line_active_neg =
7979 ISP12160_NVRAM_DATA_LINE_ACTIVE_NEGATION(nvram_data, bus);
7981 sdp->isp_data_dma_burst_enabl =
7982 ISP12160_NVRAM_BURST_ENABLE(nvram_data);
7984 sdp->isp_cmd_dma_burst_enable =
7985 ISP12160_NVRAM_BURST_ENABLE(nvram_data);
7987 sdp->isp_selection_timeout =
7988 ISP12160_NVRAM_SELECTION_TIMEOUT(nvram_data, bus);
7990 sdp->isp_max_queue_depth =
7991 ISP12160_NVRAM_MAX_QUEUE_DEPTH(nvram_data, bus);
7993 for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
7994 sdp->isp_devparam[tgt].dev_enable =
7995 ISP12160_NVRAM_TGT_DEVICE_ENABLE(nvram_data, tgt, bus);
7996 sdp->isp_devparam[tgt].exc_throttle =
7997 ISP12160_NVRAM_TGT_EXEC_THROTTLE(nvram_data, tgt, bus);
7998 sdp->isp_devparam[tgt].nvrm_offset =
7999 ISP12160_NVRAM_TGT_SYNC_OFFSET(nvram_data, tgt, bus);
8000 sdp->isp_devparam[tgt].nvrm_period =
8001 ISP12160_NVRAM_TGT_SYNC_PERIOD(nvram_data, tgt, bus);
8002 sdp->isp_devparam[tgt].nvrm_flags = 0;
8003 if (ISP12160_NVRAM_TGT_RENEG(nvram_data, tgt, bus))
8004 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_RENEG;
8005 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_ARQ;
8006 if (ISP12160_NVRAM_TGT_TQING(nvram_data, tgt, bus))
8007 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_TQING;
8008 if (ISP12160_NVRAM_TGT_SYNC(nvram_data, tgt, bus))
8009 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_SYNC;
8010 if (ISP12160_NVRAM_TGT_WIDE(nvram_data, tgt, bus))
8011 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_WIDE;
8012 if (ISP12160_NVRAM_TGT_PARITY(nvram_data, tgt, bus))
8013 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_PARITY;
8014 if (ISP12160_NVRAM_TGT_DISC(nvram_data, tgt, bus))
8015 sdp->isp_devparam[tgt].nvrm_flags |= DPARM_DISC;
8016 sdp->isp_devparam[tgt].actv_flags = 0;
8017 sdp->isp_devparam[tgt].goal_offset =
8018 sdp->isp_devparam[tgt].nvrm_offset;
8019 sdp->isp_devparam[tgt].goal_period =
8020 sdp->isp_devparam[tgt].nvrm_period;
8021 sdp->isp_devparam[tgt].goal_flags =
8022 sdp->isp_devparam[tgt].nvrm_flags;
8027 isp_parse_nvram_2100(ispsoftc_t *isp, uint8_t *nvram_data)
8029 fcparam *fcp = FCPARAM(isp, 0);
8033 * There is NVRAM storage for both Port and Node entities-
8034 * but the Node entity appears to be unused on all the cards
8035 * I can find. However, we should account for this being set
8036 * at some point in the future.
8038 * Qlogic WWNs have an NAA of 2, but usually nothing shows up in
8039 * bits 48..60. In the case of the 2202, it appears that they do
8040 * use bit 48 to distinguish between the two instances on the card.
8041 * The 2204, which I've never seen, *probably* extends this method.
8043 wwn = ISP2100_NVRAM_PORT_NAME(nvram_data);
8045 isp_prt(isp, ISP_LOGCONFIG, "NVRAM Port WWN 0x%08x%08x",
8046 (uint32_t) (wwn >> 32), (uint32_t) (wwn));
8047 if ((wwn >> 60) == 0) {
8048 wwn |= (((uint64_t) 2)<< 60);
8051 fcp->isp_wwpn_nvram = wwn;
8052 if (IS_2200(isp) || IS_23XX(isp)) {
8053 wwn = ISP2100_NVRAM_NODE_NAME(nvram_data);
8055 isp_prt(isp, ISP_LOGCONFIG, "NVRAM Node WWN 0x%08x%08x",
8056 (uint32_t) (wwn >> 32),
8058 if ((wwn >> 60) == 0) {
8059 wwn |= (((uint64_t) 2)<< 60);
8062 wwn = fcp->isp_wwpn_nvram & ~((uint64_t) 0xfff << 48);
8065 wwn &= ~((uint64_t) 0xfff << 48);
8067 fcp->isp_wwnn_nvram = wwn;
8069 fcp->isp_maxalloc = ISP2100_NVRAM_MAXIOCBALLOCATION(nvram_data);
8070 if ((isp->isp_confopts & ISP_CFG_OWNFSZ) == 0) {
8071 DEFAULT_FRAMESIZE(isp) =
8072 ISP2100_NVRAM_MAXFRAMELENGTH(nvram_data);
8074 fcp->isp_retry_delay = ISP2100_NVRAM_RETRY_DELAY(nvram_data);
8075 fcp->isp_retry_count = ISP2100_NVRAM_RETRY_COUNT(nvram_data);
8076 if ((isp->isp_confopts & ISP_CFG_OWNLOOPID) == 0) {
8077 fcp->isp_loopid = ISP2100_NVRAM_HARDLOOPID(nvram_data);
8079 if ((isp->isp_confopts & ISP_CFG_OWNEXCTHROTTLE) == 0) {
8080 DEFAULT_EXEC_THROTTLE(isp) =
8081 ISP2100_NVRAM_EXECUTION_THROTTLE(nvram_data);
8083 fcp->isp_fwoptions = ISP2100_NVRAM_OPTIONS(nvram_data);
8084 isp_prt(isp, ISP_LOGDEBUG0,
8085 "NVRAM 0x%08x%08x 0x%08x%08x maxalloc %d maxframelen %d",
8086 (uint32_t) (fcp->isp_wwnn_nvram >> 32),
8087 (uint32_t) fcp->isp_wwnn_nvram,
8088 (uint32_t) (fcp->isp_wwpn_nvram >> 32),
8089 (uint32_t) fcp->isp_wwpn_nvram,
8090 ISP2100_NVRAM_MAXIOCBALLOCATION(nvram_data),
8091 ISP2100_NVRAM_MAXFRAMELENGTH(nvram_data));
8092 isp_prt(isp, ISP_LOGDEBUG0,
8093 "execthrottle %d fwoptions 0x%x hardloop %d tov %d",
8094 ISP2100_NVRAM_EXECUTION_THROTTLE(nvram_data),
8095 ISP2100_NVRAM_OPTIONS(nvram_data),
8096 ISP2100_NVRAM_HARDLOOPID(nvram_data),
8097 ISP2100_NVRAM_TOV(nvram_data));
8098 fcp->isp_xfwoptions = ISP2100_XFW_OPTIONS(nvram_data);
8099 fcp->isp_zfwoptions = ISP2100_ZFW_OPTIONS(nvram_data);
8100 isp_prt(isp, ISP_LOGDEBUG0, "xfwoptions 0x%x zfw options 0x%x",
8101 ISP2100_XFW_OPTIONS(nvram_data), ISP2100_ZFW_OPTIONS(nvram_data));
8105 isp_parse_nvram_2400(ispsoftc_t *isp, uint8_t *nvram_data)
8107 fcparam *fcp = FCPARAM(isp, 0);
8110 isp_prt(isp, ISP_LOGDEBUG0,
8111 "NVRAM 0x%08x%08x 0x%08x%08x exchg_cnt %d maxframelen %d",
8112 (uint32_t) (ISP2400_NVRAM_NODE_NAME(nvram_data) >> 32),
8113 (uint32_t) (ISP2400_NVRAM_NODE_NAME(nvram_data)),
8114 (uint32_t) (ISP2400_NVRAM_PORT_NAME(nvram_data) >> 32),
8115 (uint32_t) (ISP2400_NVRAM_PORT_NAME(nvram_data)),
8116 ISP2400_NVRAM_EXCHANGE_COUNT(nvram_data),
8117 ISP2400_NVRAM_MAXFRAMELENGTH(nvram_data));
8118 isp_prt(isp, ISP_LOGDEBUG0,
8119 "NVRAM execthr %d loopid %d fwopt1 0x%x fwopt2 0x%x fwopt3 0x%x",
8120 ISP2400_NVRAM_EXECUTION_THROTTLE(nvram_data),
8121 ISP2400_NVRAM_HARDLOOPID(nvram_data),
8122 ISP2400_NVRAM_FIRMWARE_OPTIONS1(nvram_data),
8123 ISP2400_NVRAM_FIRMWARE_OPTIONS2(nvram_data),
8124 ISP2400_NVRAM_FIRMWARE_OPTIONS3(nvram_data));
8126 wwn = ISP2400_NVRAM_PORT_NAME(nvram_data);
8127 fcp->isp_wwpn_nvram = wwn;
8129 wwn = ISP2400_NVRAM_NODE_NAME(nvram_data);
8131 if ((wwn >> 60) != 2 && (wwn >> 60) != 5) {
8135 if (wwn == 0 && (fcp->isp_wwpn_nvram >> 60) == 2) {
8136 wwn = fcp->isp_wwpn_nvram;
8137 wwn &= ~((uint64_t) 0xfff << 48);
8139 fcp->isp_wwnn_nvram = wwn;
8141 if (ISP2400_NVRAM_EXCHANGE_COUNT(nvram_data)) {
8142 fcp->isp_maxalloc = ISP2400_NVRAM_EXCHANGE_COUNT(nvram_data);
8144 if ((isp->isp_confopts & ISP_CFG_OWNFSZ) == 0) {
8145 DEFAULT_FRAMESIZE(isp) =
8146 ISP2400_NVRAM_MAXFRAMELENGTH(nvram_data);
8148 if ((isp->isp_confopts & ISP_CFG_OWNLOOPID) == 0) {
8149 fcp->isp_loopid = ISP2400_NVRAM_HARDLOOPID(nvram_data);
8151 if ((isp->isp_confopts & ISP_CFG_OWNEXCTHROTTLE) == 0) {
8152 DEFAULT_EXEC_THROTTLE(isp) =
8153 ISP2400_NVRAM_EXECUTION_THROTTLE(nvram_data);
8155 fcp->isp_fwoptions = ISP2400_NVRAM_FIRMWARE_OPTIONS1(nvram_data);
8156 fcp->isp_xfwoptions = ISP2400_NVRAM_FIRMWARE_OPTIONS2(nvram_data);
8157 fcp->isp_zfwoptions = ISP2400_NVRAM_FIRMWARE_OPTIONS3(nvram_data);