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