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