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