isp.c revision 41524
1/* $Id: $ */
2/* isp.c 1.27 */
3/*
4 * Machine and OS Independent (well, as best as possible)
5 * code for the Qlogic ISP SCSI adapters.
6 *
7 *---------------------------------------
8 * Copyright (c) 1997, 1998 by Matthew Jacob
9 * NASA/Ames Research Center
10 * All rights reserved.
11 *---------------------------------------
12 *
13 * Redistribution and use in source and binary forms, with or without
14 * modification, are permitted provided that the following conditions
15 * are met:
16 * 1. Redistributions of source code must retain the above copyright
17 *    notice immediately at the beginning of the file, without modification,
18 *    this list of conditions, and the following disclaimer.
19 * 2. Redistributions in binary form must reproduce the above copyright
20 *    notice, this list of conditions and the following disclaimer in the
21 *    documentation and/or other materials provided with the distribution.
22 * 3. The name of the author may not be used to endorse or promote products
23 *    derived from this software without specific prior written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
26 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
29 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
31 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
34 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35 * SUCH DAMAGE.
36 */
37
38/*
39 * Inspiration and ideas about this driver are from Erik Moe's Linux driver
40 * (qlogicisp.c) and Dave Miller's SBus version of same (qlogicisp.c). Some
41 * ideas dredged from the Solaris driver.
42 */
43
44/*
45 * Include header file appropriate for platform we're building on.
46 */
47
48#ifdef	__NetBSD__
49#include <dev/ic/isp_netbsd.h>
50#endif
51#ifdef	__FreeBSD__
52#include <dev/isp/isp_freebsd.h>
53#endif
54#ifdef	__linux__
55#include <isp_linux.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#ifdef	ISP_TARGET_MODE
68static const char tgtiqd[36] = {
69	0x03, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00,
70	0x51, 0x4C, 0x4F, 0x47, 0x49, 0x43, 0x20, 0x20,
71#ifdef	__NetBSD__
72	0x4E, 0x45, 0x54, 0x42, 0x53, 0x44, 0x20, 0x20,
73#else
74# ifdef	__FreeBSD__
75	0x46, 0x52, 0x45, 0x45, 0x42, 0x52, 0x44, 0x20,
76# else
77#  ifdef linux
78	0x4C, 0x49, 0x4E, 0x55, 0x58, 0x20, 0x20, 0x20,
79#  else
80#  endif
81# endif
82#endif
83	0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x20, 0x20,
84	0x20, 0x20, 0x20, 0x31
85};
86#endif
87
88
89/*
90 * Local function prototypes.
91 */
92static int isp_parse_async __P((struct ispsoftc *, int));
93static int isp_handle_other_response
94__P((struct ispsoftc *, ispstatusreq_t *, u_int8_t *));
95#ifdef	ISP_TARGET_MODE
96static int isp_modify_lun __P((struct ispsoftc *, int, int, int));
97static void isp_notify_ack __P((struct ispsoftc *, void *));
98static void isp_handle_atio __P((struct ispsoftc *, void *));
99static void isp_handle_atio2 __P((struct ispsoftc *, void *));
100static void isp_handle_ctio __P((struct ispsoftc *, void *));
101static void isp_handle_ctio2 __P((struct ispsoftc *, void *));
102#endif
103static void isp_parse_status
104__P((struct ispsoftc *, ispstatusreq_t *, ISP_SCSI_XFER_T *));
105static void isp_fibre_init __P((struct ispsoftc *));
106static void isp_fw_state __P((struct ispsoftc *));
107static void isp_dumpregs __P((struct ispsoftc *, const char *));
108static void isp_dumpxflist __P((struct ispsoftc *));
109static void isp_prtstst __P((ispstatusreq_t *));
110static char *isp2100_fw_statename __P((int));
111static void isp_mboxcmd __P((struct ispsoftc *, mbreg_t *));
112
113static void isp_update  __P((struct ispsoftc *));
114static void isp_setdfltparm __P((struct ispsoftc *));
115static int isp_read_nvram __P((struct ispsoftc *));
116static void isp_rdnvram_word __P((struct ispsoftc *, int, u_int16_t *));
117
118/*
119 * Reset Hardware.
120 *
121 * Hit the chip over the head, download new f/w.
122 *
123 * Locking done elsewhere.
124 */
125void
126isp_reset(isp)
127	struct ispsoftc *isp;
128{
129	static char once = 1;
130	mbreg_t mbs;
131	int loops, i, dodnld = 1;
132	char *revname;
133
134	isp->isp_state = ISP_NILSTATE;
135
136	/*
137	 * Basic types (SCSI, FibreChannel and PCI or SBus)
138	 * have been set in the MD code. We figure out more
139	 * here.
140	 */
141	isp->isp_dblev = DFLT_DBLEVEL;
142	if (isp->isp_type & ISP_HA_FC) {
143		revname = "2100";
144	} else {
145		sdparam *sdp = isp->isp_param;
146
147		int rev = ISP_READ(isp, BIU_CONF0) & BIU_CONF0_HW_MASK;
148		switch (rev) {
149		default:
150			PRINTF("%s: unknown chip rev. 0x%x- assuming a 1020\n",
151			    isp->isp_name, rev);
152			/* FALLTHROUGH */
153		case 1:
154			revname = "1020";
155			isp->isp_type = ISP_HA_SCSI_1020;
156			sdp->isp_clock = 40;
157			break;
158		case 2:
159			/*
160			 * Some 1020A chips are Ultra Capable, but don't
161			 * run the clock rate up for that unless told to
162			 * do so by the Ultra Capable bits being set.
163			 */
164			revname = "1020A";
165			isp->isp_type = ISP_HA_SCSI_1020A;
166			sdp->isp_clock = 40;
167			break;
168		case 3:
169			revname = "1040";
170			isp->isp_type = ISP_HA_SCSI_1040;
171			sdp->isp_clock = 60;
172			break;
173		case 4:
174			revname = "1040A";
175			isp->isp_type = ISP_HA_SCSI_1040A;
176			sdp->isp_clock = 60;
177			break;
178		case 5:
179			revname = "1040B";
180			isp->isp_type = ISP_HA_SCSI_1040B;
181			sdp->isp_clock = 60;
182			break;
183		}
184		/*
185		 * Try and figure out if we're connected to a differential bus.
186		 * You have to pause the RISC processor to read SXP registers.
187		 */
188		ISP_WRITE(isp, HCCR, HCCR_CMD_PAUSE);
189		i = 100;
190		while ((ISP_READ(isp, HCCR) & HCCR_PAUSE) == 0) {
191			SYS_DELAY(20);
192			if (--i == 0) {
193				PRINTF("%s: unable to pause RISC processor\n",
194				    isp->isp_name);
195				i = -1;
196				break;
197			}
198		}
199		if (i > 0) {
200			if (isp->isp_bustype != ISP_BT_SBUS) {
201				ISP_SETBITS(isp, BIU_CONF1, BIU_PCI_CONF1_SXP);
202			}
203			if (ISP_READ(isp, SXP_PINS_DIFF) & SXP_PINS_DIFF_MODE) {
204				IDPRINTF(2, ("%s: Differential Mode Set\n",
205				    isp->isp_name));
206				sdp->isp_diffmode = 1;
207			} else {
208				sdp->isp_diffmode = 0;
209			}
210
211			if (isp->isp_bustype != ISP_BT_SBUS) {
212				ISP_CLRBITS(isp, BIU_CONF1, BIU_PCI_CONF1_SXP);
213			}
214
215			/*
216			 * Figure out whether we're ultra capable.
217			 */
218			i = ISP_READ(isp, RISC_PSR);
219			if (isp->isp_bustype != ISP_BT_SBUS) {
220				i &= RISC_PSR_PCI_ULTRA;
221			} else {
222				i &= RISC_PSR_SBUS_ULTRA;
223			}
224			if (i) {
225				IDPRINTF(2, ("%s: Ultra Mode Capable\n",
226				    isp->isp_name));
227				sdp->isp_clock = 60;
228			} else {
229				sdp->isp_clock = 40;
230			}
231			/*
232			 * Restart processor
233			 */
234			ISP_WRITE(isp, HCCR, HCCR_CMD_RELEASE);
235		}
236		/*
237		 * Machine dependent clock (if set) overrides
238		 * our generic determinations.
239		 */
240		if (isp->isp_mdvec->dv_clock) {
241			if (isp->isp_mdvec->dv_clock < sdp->isp_clock) {
242				sdp->isp_clock = isp->isp_mdvec->dv_clock;
243			}
244		}
245	}
246
247	/*
248	 * Do MD specific pre initialization
249	 */
250	ISP_RESET0(isp);
251
252	if (once == 1) {
253		once = 0;
254		/*
255		 * Get the current running firmware revision out of the
256		 * chip before we hit it over the head (if this is our
257		 * first time through). Note that we store this as the
258		 * 'ROM' firmware revision- which it may not be. In any
259		 * case, we don't really use this yet, but we may in
260		 * the future.
261		 */
262		mbs.param[0] = MBOX_ABOUT_FIRMWARE;
263		isp_mboxcmd(isp, &mbs);
264		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
265			IDPRINTF(3, ("%s: initial ABOUT FIRMWARE command "
266			    "failed\n", isp->isp_name));
267		} else {
268			isp->isp_romfw_rev =
269			    (((u_int16_t) mbs.param[1]) << 10) + mbs.param[2];
270		}
271	}
272
273	/*
274	 * Hit the chip over the head with hammer,
275	 * and give the ISP a chance to recover.
276	 */
277
278	if (isp->isp_type & ISP_HA_SCSI) {
279		ISP_WRITE(isp, BIU_ICR, BIU_ICR_SOFT_RESET);
280		/*
281		 * A slight delay...
282		 */
283		SYS_DELAY(100);
284
285		/*
286		 * Clear data && control DMA engines.
287		 */
288		ISP_WRITE(isp, CDMA_CONTROL,
289		      DMA_CNTRL_CLEAR_CHAN | DMA_CNTRL_RESET_INT);
290		ISP_WRITE(isp, DDMA_CONTROL,
291		      DMA_CNTRL_CLEAR_CHAN | DMA_CNTRL_RESET_INT);
292	} else {
293		ISP_WRITE(isp, BIU2100_CSR, BIU2100_SOFT_RESET);
294		/*
295		 * A slight delay...
296		 */
297		SYS_DELAY(100);
298		ISP_WRITE(isp, CDMA2100_CONTROL,
299			DMA_CNTRL2100_CLEAR_CHAN | DMA_CNTRL2100_RESET_INT);
300		ISP_WRITE(isp, TDMA2100_CONTROL,
301			DMA_CNTRL2100_CLEAR_CHAN | DMA_CNTRL2100_RESET_INT);
302		ISP_WRITE(isp, RDMA2100_CONTROL,
303			DMA_CNTRL2100_CLEAR_CHAN | DMA_CNTRL2100_RESET_INT);
304	}
305
306	/*
307	 * Wait for ISP to be ready to go...
308	 */
309	loops = MBOX_DELAY_COUNT;
310	for (;;) {
311		if (isp->isp_type & ISP_HA_SCSI) {
312			if (!(ISP_READ(isp, BIU_ICR) & BIU_ICR_SOFT_RESET))
313				break;
314		} else {
315			if (!(ISP_READ(isp, BIU2100_CSR) & BIU2100_SOFT_RESET))
316				break;
317		}
318		SYS_DELAY(100);
319		if (--loops < 0) {
320			isp_dumpregs(isp, "chip reset timed out");
321			return;
322		}
323	}
324	/*
325	 * More initialization
326	 */
327	if (isp->isp_type & ISP_HA_SCSI) {
328		ISP_WRITE(isp, BIU_CONF1, 0);
329	} else {
330		ISP_WRITE(isp, BIU2100_CSR, 0);
331		/*
332		 * All 2100's are 60Mhz with fast rams onboard.
333		 */
334		ISP_WRITE(isp, RISC_MTR2100, 0x1212);
335	}
336
337	ISP_WRITE(isp, HCCR, HCCR_CMD_RESET);
338	SYS_DELAY(100);
339
340	if (isp->isp_type & ISP_HA_SCSI) {
341		ISP_SETBITS(isp, BIU_CONF1, isp->isp_mdvec->dv_conf1);
342		if (isp->isp_mdvec->dv_conf1 & BIU_BURST_ENABLE) {
343			ISP_SETBITS(isp, CDMA_CONF, DMA_ENABLE_BURST);
344			ISP_SETBITS(isp, DDMA_CONF, DMA_ENABLE_BURST);
345		}
346	}
347	ISP_WRITE(isp, HCCR, HCCR_CMD_RELEASE); /* release paused processor */
348
349	/*
350	 * Do MD specific post initialization
351	 */
352	ISP_RESET1(isp);
353
354	/*
355	 * Enable interrupts
356	 */
357	ENABLE_INTS(isp);
358
359	/*
360	 * Do some sanity checking.
361	 */
362	mbs.param[0] = MBOX_NO_OP;
363	isp_mboxcmd(isp, &mbs);
364	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
365		isp_dumpregs(isp, "NOP test failed");
366		return;
367	}
368
369	if (isp->isp_type & ISP_HA_SCSI) {
370		mbs.param[0] = MBOX_MAILBOX_REG_TEST;
371		mbs.param[1] = 0xdead;
372		mbs.param[2] = 0xbeef;
373		mbs.param[3] = 0xffff;
374		mbs.param[4] = 0x1111;
375		mbs.param[5] = 0xa5a5;
376		isp_mboxcmd(isp, &mbs);
377		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
378			isp_dumpregs(isp,
379				"Mailbox Register test didn't complete");
380			return;
381		}
382		if (mbs.param[1] != 0xdead || mbs.param[2] != 0xbeef ||
383		    mbs.param[3] != 0xffff || mbs.param[4] != 0x1111 ||
384		    mbs.param[5] != 0xa5a5) {
385			isp_dumpregs(isp, "Register Test Failed");
386			return;
387		}
388
389	}
390
391	/*
392	 * Download new Firmware, unless requested not to do so.
393	 * This is made slightly trickier in some cases where the
394	 * firmware of the ROM revision is newer than the revision
395	 * compiled into the driver. So, where we used to compare
396	 * versions of our f/w and the ROM f/w, now we just see
397	 * whether we have f/w at all and whether a config flag
398	 * has disabled our download.
399	 */
400	if ((isp->isp_mdvec->dv_fwlen == 0) ||
401	    (isp->isp_confopts & ISP_CFG_NORELOAD)) {
402		dodnld = 0;
403	}
404
405	if (dodnld) {
406		for (i = 0; i < isp->isp_mdvec->dv_fwlen; i++) {
407			mbs.param[0] = MBOX_WRITE_RAM_WORD;
408			mbs.param[1] = isp->isp_mdvec->dv_codeorg + i;
409			mbs.param[2] = isp->isp_mdvec->dv_ispfw[i];
410			isp_mboxcmd(isp, &mbs);
411			if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
412				isp_dumpregs(isp, "f/w download failed");
413				return;
414			}
415		}
416
417		if (isp->isp_mdvec->dv_fwlen) {
418			/*
419			 * Verify that it downloaded correctly.
420			 */
421			mbs.param[0] = MBOX_VERIFY_CHECKSUM;
422			mbs.param[1] = isp->isp_mdvec->dv_codeorg;
423			isp_mboxcmd(isp, &mbs);
424			if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
425				isp_dumpregs(isp, "ram checksum failure");
426				return;
427			}
428		}
429	} else {
430		IDPRINTF(3, ("%s: skipping f/w download\n", isp->isp_name));
431	}
432
433	/*
434	 * Now start it rolling.
435	 *
436	 * If we didn't actually download f/w,
437	 * we still need to (re)start it.
438	 */
439
440	mbs.param[0] = MBOX_EXEC_FIRMWARE;
441	mbs.param[1] = isp->isp_mdvec->dv_codeorg;
442	isp_mboxcmd(isp, &mbs);
443
444	if (isp->isp_type & ISP_HA_SCSI) {
445		sdparam *sdp = isp->isp_param;
446		/*
447		 * Set CLOCK RATE, but only if asked to.
448		 */
449		if (sdp->isp_clock) {
450			mbs.param[0] = MBOX_SET_CLOCK_RATE;
451			mbs.param[1] = sdp->isp_clock;
452			isp_mboxcmd(isp, &mbs);
453			if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
454				isp_dumpregs(isp, "failed to set CLOCKRATE");
455				/* but continue */
456			} else {
457				IDPRINTF(3, ("%s: setting input clock to %d\n",
458				    isp->isp_name, sdp->isp_clock));
459			}
460		}
461	}
462	mbs.param[0] = MBOX_ABOUT_FIRMWARE;
463	isp_mboxcmd(isp, &mbs);
464	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
465		isp_dumpregs(isp, "ABOUT FIRMWARE command failed");
466		return;
467	}
468	PRINTF("%s: Board Revision %s, %s F/W Revision %d.%d\n",
469		isp->isp_name, revname, dodnld? "loaded" : "resident",
470		mbs.param[1], mbs.param[2]);
471	isp->isp_fwrev = (((u_int16_t) mbs.param[1]) << 10) + mbs.param[2];
472	if (isp->isp_romfw_rev && dodnld) {
473		PRINTF("%s: Last F/W revision was %d.%d\n", isp->isp_name,
474		    isp->isp_romfw_rev >> 10, isp->isp_romfw_rev & 0x3ff);
475	}
476	isp_fw_state(isp);
477	isp->isp_state = ISP_RESETSTATE;
478}
479
480/*
481 * Initialize Hardware to known state
482 *
483 * Locks are held before coming here.
484 */
485
486void
487isp_init(isp)
488	struct ispsoftc *isp;
489{
490	sdparam *sdp;
491	mbreg_t mbs;
492	int tgt;
493
494	/*
495	 * Must do first.
496	 */
497	isp_setdfltparm(isp);
498
499	/*
500	 * If we're fibre, we have a completely different
501	 * initialization method.
502	 */
503
504	if (isp->isp_type & ISP_HA_FC) {
505		isp_fibre_init(isp);
506		return;
507	}
508	sdp = isp->isp_param;
509
510	/*
511	 * Set (possibly new) Initiator ID.
512	 */
513	mbs.param[0] = MBOX_SET_INIT_SCSI_ID;
514	mbs.param[1] = sdp->isp_initiator_id;
515	isp_mboxcmd(isp, &mbs);
516	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
517		isp_dumpregs(isp, "failed to set initiator id");
518		return;
519	}
520
521	/*
522	 * Set Retry Delay and Count
523	 */
524	mbs.param[0] = MBOX_SET_RETRY_COUNT;
525	mbs.param[1] = sdp->isp_retry_count;
526	mbs.param[2] = sdp->isp_retry_delay;
527	isp_mboxcmd(isp, &mbs);
528	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
529		isp_dumpregs(isp, "failed to set retry count and delay");
530		return;
531	}
532
533	/*
534	 * Set ASYNC DATA SETUP time. This is very important.
535	 */
536	mbs.param[0] = MBOX_SET_ASYNC_DATA_SETUP_TIME;
537	mbs.param[1] = sdp->isp_async_data_setup;
538	isp_mboxcmd(isp, &mbs);
539	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
540		isp_dumpregs(isp, "failed to set async data setup time");
541		return;
542	}
543
544	/*
545	 * Set ACTIVE Negation State.
546	 */
547	mbs.param[0] = MBOX_SET_ACTIVE_NEG_STATE;
548	mbs.param[1] =
549	    (sdp->isp_req_ack_active_neg << 4) |
550	    (sdp->isp_data_line_active_neg << 5);
551	isp_mboxcmd(isp, &mbs);
552	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
553		isp_dumpregs(isp, "failed to set active neg state");
554		return;
555	}
556
557	/*
558	 * Set the Tag Aging limit
559	 */
560
561	mbs.param[0] = MBOX_SET_TAG_AGE_LIMIT;
562	mbs.param[1] = sdp->isp_tag_aging;
563	isp_mboxcmd(isp, &mbs);
564	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
565		isp_dumpregs(isp, "failed to set tag age limit");
566		return;
567	}
568
569	/*
570	 * Set selection timeout.
571	 */
572
573	mbs.param[0] = MBOX_SET_SELECT_TIMEOUT;
574	mbs.param[1] = sdp->isp_selection_timeout;
575	isp_mboxcmd(isp, &mbs);
576	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
577		isp_dumpregs(isp, "failed to set selection timeout");
578		return;
579	}
580
581	/*
582	 * Set per-target parameters to a safe minimum.
583	 */
584
585	for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
586		int maxlun, lun;
587
588		if (sdp->isp_devparam[tgt].dev_enable == 0)
589			continue;
590
591		mbs.param[0] = MBOX_SET_TARGET_PARAMS;
592		mbs.param[1] = tgt << 8;
593		mbs.param[2] = DPARM_SAFE_DFLT;
594		mbs.param[3] = 0;
595		/*
596		 * It is not quite clear when this changed over so that
597		 * we could force narrow and async, so assume >= 7.55.
598		 *
599		 * Otherwise, a SCSI bus reset issued below will force
600		 * the back to the narrow, async state (but see note
601		 * below also). Technically we should also do without
602		 * Parity.
603		 */
604		if (isp->isp_fwrev >= ISP_FW_REV(7, 55)) {
605			mbs.param[2] |= DPARM_NARROW | DPARM_ASYNC;
606		}
607		sdp->isp_devparam[tgt].cur_dflags = mbs.param[2] >> 8;
608
609		IDPRINTF(3, ("\n%s: tgt %d cflags %x offset %x period %x\n",
610		    isp->isp_name, tgt, mbs.param[2], mbs.param[3] >> 8,
611		    mbs.param[3] & 0xff));
612		isp_mboxcmd(isp, &mbs);
613		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
614
615			PRINTF("%s: failed to set parameters for tgt %d\n",
616				isp->isp_name, tgt);
617
618			PRINTF("%s: flags %x offset %x period %x\n",
619				isp->isp_name, sdp->isp_devparam[tgt].dev_flags,
620				sdp->isp_devparam[tgt].sync_offset,
621				sdp->isp_devparam[tgt].sync_period);
622
623			mbs.param[0] = MBOX_SET_TARGET_PARAMS;
624			mbs.param[1] = tgt << 8;
625			mbs.param[2] = DPARM_SAFE_DFLT;
626			mbs.param[3] = 0;
627			isp_mboxcmd(isp, &mbs);
628			if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
629				PRINTF("%s: failed even to set defaults for "
630				    "target %d\n", isp->isp_name, tgt);
631				continue;
632			}
633		}
634
635		maxlun = (isp->isp_fwrev >= ISP_FW_REV(7, 55))? 32 : 8;
636		for (lun = 0; lun < maxlun; lun++) {
637			mbs.param[0] = MBOX_SET_DEV_QUEUE_PARAMS;
638			mbs.param[1] = (tgt << 8) | lun;
639			mbs.param[2] = sdp->isp_max_queue_depth;
640			mbs.param[3] = sdp->isp_devparam[tgt].exc_throttle;
641			isp_mboxcmd(isp, &mbs);
642			if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
643				PRINTF("%s: failed to set device queue "
644				    "parameters for target %d, lun %d\n",
645				    isp->isp_name, tgt, lun);
646				break;
647			}
648		}
649	}
650
651	/*
652	 * Set up DMA for the request and result mailboxes.
653	 */
654	if (ISP_MBOXDMASETUP(isp) != 0) {
655		PRINTF("%s: can't setup dma mailboxes\n", isp->isp_name);
656		return;
657	}
658
659	mbs.param[0] = MBOX_INIT_RES_QUEUE;
660	mbs.param[1] = RESULT_QUEUE_LEN;
661	mbs.param[2] = (u_int16_t) (isp->isp_result_dma >> 16);
662	mbs.param[3] = (u_int16_t) (isp->isp_result_dma & 0xffff);
663	mbs.param[4] = 0;
664	mbs.param[5] = 0;
665	isp_mboxcmd(isp, &mbs);
666	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
667		isp_dumpregs(isp, "set of response queue failed");
668		return;
669	}
670	isp->isp_residx = 0;
671
672	mbs.param[0] = MBOX_INIT_REQ_QUEUE;
673	mbs.param[1] = RQUEST_QUEUE_LEN;
674	mbs.param[2] = (u_int16_t) (isp->isp_rquest_dma >> 16);
675	mbs.param[3] = (u_int16_t) (isp->isp_rquest_dma & 0xffff);
676	mbs.param[4] = 0;
677	mbs.param[5] = 0;
678	isp_mboxcmd(isp, &mbs);
679	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
680		isp_dumpregs(isp, "set of request queue failed");
681		return;
682	}
683	isp->isp_reqidx = isp->isp_reqodx = 0;
684
685	/*
686	 * XXX: See whether or not for 7.55 F/W or later we
687	 * XXX: can do without this, and see whether we should
688	 * XXX: honor the NVRAM SCSI_RESET_DISABLE token.
689	 */
690	mbs.param[0] = MBOX_BUS_RESET;
691	mbs.param[1] = 3;
692	isp_mboxcmd(isp, &mbs);
693	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
694		isp_dumpregs(isp, "SCSI bus reset failed");
695	}
696	/*
697	 * This is really important to have set after a bus reset.
698	 */
699	isp->isp_sendmarker = 1;
700	isp->isp_state = ISP_INITSTATE;
701}
702
703/*
704 * Fibre Channel specific initialization.
705 *
706 * Locks are held before coming here.
707 */
708static void
709isp_fibre_init(isp)
710	struct ispsoftc *isp;
711{
712	fcparam *fcp;
713	isp_icb_t *icbp;
714	mbreg_t mbs;
715	int count, loopid;
716	u_int8_t lwfs;
717
718	fcp = isp->isp_param;
719
720	if (ISP_MBOXDMASETUP(isp) != 0) {
721		PRINTF("%s: can't setup DMA for mailboxes\n", isp->isp_name);
722		return;
723	}
724	/*
725	 * For systems that don't have BIOS methods for which
726	 * we can easily change the NVRAM based loopid, we'll
727	 * override that here. Note that when we initialize
728	 * the firmware we may get back a different loopid than
729	 * we asked for anyway. XXX This is probably not the
730	 * best way to figure this out XXX
731	 */
732#ifndef	__i386__
733	loopid = DEFAULT_LOOPID;
734#else
735	loopid = fcp->isp_loopid;
736#endif
737
738
739	icbp = (isp_icb_t *) fcp->isp_scratch;
740	bzero(icbp, sizeof (*icbp));
741
742	icbp->icb_version = ICB_VERSION1;
743#ifdef	ISP_TARGET_MODE
744	fcp->isp_fwoptions = ICBOPT_TGT_ENABLE|ICBOPT_INI_TGTTYPE;
745#else
746	fcp->isp_fwoptions = 0;
747#endif
748	fcp->isp_fwoptions |= ICBOPT_INI_ADISC|ICBOPT_FAIRNESS;
749	fcp->isp_fwoptions |= ICBOPT_PDBCHANGE_AE;
750	fcp->isp_fwoptions |= ICBOPT_HARD_ADDRESS;
751#ifdef	CHECKME
752	fcp->isp_fwoptions |= ICBOPT_USE_PORTNAME;
753#endif
754#ifdef	THIS_WORKED
755	/*
756	 * This has unhappiness in target mode
757	 */
758	fcp->isp_fwoptions |= ICBOPT_FULL_LOGIN;
759#endif
760	icbp->icb_fwoptions = fcp->isp_fwoptions;
761	icbp->icb_maxfrmlen = fcp->isp_maxfrmlen;
762	if (icbp->icb_maxfrmlen < ICB_MIN_FRMLEN ||
763	    icbp->icb_maxfrmlen > ICB_MAX_FRMLEN) {
764		PRINTF("%s: bad frame length (%d) from NVRAM- using %d\n",
765		    isp->isp_name, fcp->isp_maxfrmlen, ICB_DFLT_FRMLEN);
766	}
767	icbp->icb_maxalloc = fcp->isp_maxalloc;
768	icbp->icb_execthrottle = fcp->isp_execthrottle;
769	icbp->icb_retry_delay = fcp->isp_retry_delay;
770	icbp->icb_retry_count = fcp->isp_retry_count;
771	icbp->icb_hardaddr = fcp->isp_loopid;
772
773	MAKE_NODE_NAME_FROM_WWN(icbp->icb_nodename, fcp->isp_wwn);
774	if (icbp->icb_fwoptions & ICBOPT_USE_PORTNAME) {
775		u_int64_t portname = fcp->isp_wwn | (2LL << 56);
776		MAKE_NODE_NAME_FROM_WWN(icbp->icb_nodename, portname);
777	}
778	icbp->icb_rqstqlen = RQUEST_QUEUE_LEN;
779	icbp->icb_rsltqlen = RESULT_QUEUE_LEN;
780	icbp->icb_rqstaddr[RQRSP_ADDR0015] =
781	    (u_int16_t) (isp->isp_rquest_dma & 0xffff);
782	icbp->icb_rqstaddr[RQRSP_ADDR1631] =
783	    (u_int16_t) (isp->isp_rquest_dma >> 16);
784	icbp->icb_respaddr[RQRSP_ADDR0015] =
785	    (u_int16_t) (isp->isp_result_dma & 0xffff);
786	icbp->icb_respaddr[RQRSP_ADDR1631] =
787	    (u_int16_t) (isp->isp_result_dma >> 16);
788
789	for (count = 0; count < 10; count++) {
790		mbs.param[0] = MBOX_INIT_FIRMWARE;
791		mbs.param[1] = 0;
792		mbs.param[2] = (u_int16_t) (fcp->isp_scdma >> 16);
793		mbs.param[3] = (u_int16_t) (fcp->isp_scdma & 0xffff);
794		mbs.param[4] = 0;
795		mbs.param[5] = 0;
796		mbs.param[6] = 0;
797		mbs.param[7] = 0;
798
799		isp_mboxcmd(isp, &mbs);
800
801		switch (mbs.param[0]) {
802		case MBOX_COMMAND_COMPLETE:
803			count = 10;
804			break;
805		case ASYNC_LIP_OCCURRED:
806		case ASYNC_LOOP_UP:
807		case ASYNC_LOOP_DOWN:
808		case ASYNC_LOOP_RESET:
809		case ASYNC_PDB_CHANGED:
810		case ASYNC_CHANGE_NOTIFY:
811			if (count > 9) {
812				PRINTF("%s: too many retries to get going- "
813				    "giving up\n", isp->isp_name);
814				return;
815			}
816			break;
817		default:
818			isp_dumpregs(isp, "INIT FIRMWARE failed");
819			return;
820		}
821	}
822	isp->isp_reqidx = isp->isp_reqodx = 0;
823	isp->isp_residx = 0;
824
825	/*
826	 * Wait up to 5 seconds for FW to go to READY state.
827	 */
828	lwfs = FW_CONFIG_WAIT;
829	for (count = 0; count < 12000; count++) {
830		isp_fw_state(isp);
831		if (lwfs != fcp->isp_fwstate) {
832			PRINTF("%s: Firmware State %s -> %s\n",
833			    isp->isp_name, isp2100_fw_statename((int)lwfs),
834			    isp2100_fw_statename((int)fcp->isp_fwstate));
835			lwfs = fcp->isp_fwstate;
836		}
837		if (fcp->isp_fwstate == FW_READY) {
838			break;
839		}
840		SYS_DELAY(1000);	/* wait one millisecond */
841	}
842	isp->isp_sendmarker = 1;
843
844	/*
845	 * Get our Loop ID
846	 * (if possible)
847	 */
848	if (fcp->isp_fwstate == FW_READY) {
849		mbs.param[0] = MBOX_GET_LOOP_ID;
850		isp_mboxcmd(isp, &mbs);
851		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
852			isp_dumpregs(isp, "GET LOOP ID failed");
853			return;
854		}
855		fcp->isp_loopid = mbs.param[1];
856		fcp->isp_alpa = mbs.param[2];
857		PRINTF("%s: Loop ID %d, ALPA 0x%x\n", isp->isp_name,
858		    fcp->isp_loopid, fcp->isp_alpa);
859		isp->isp_state = ISP_INITSTATE;
860#ifdef	ISP_TARGET_MODE
861		DISABLE_INTS(isp);
862		if (isp_modify_lun(isp, 0, 1, 1)) {
863			PRINTF("%s: failed to enable target mode\n",
864			    isp->isp_name);
865		}
866		ENABLE_INTS(isp);
867#endif
868	} else {
869		PRINTF("%s: failed to go to FW READY state- will not attach\n",
870		    isp->isp_name);
871	}
872}
873
874/*
875 * Free any associated resources prior to decommissioning and
876 * set the card to a known state (so it doesn't wake up and kick
877 * us when we aren't expecting it to).
878 *
879 * Locks are held before coming here.
880 */
881void
882isp_uninit(isp)
883	struct ispsoftc *isp;
884{
885	/*
886	 * Leave with interrupts disabled.
887	 */
888	DISABLE_INTS(isp);
889
890	/*
891	 * Stop the watchdog timer (if started).
892	 */
893	STOP_WATCHDOG(isp_watch, isp);
894}
895
896
897/*
898 * Start a command. Locking is assumed done in the caller.
899 */
900
901int32_t
902ispscsicmd(xs)
903	ISP_SCSI_XFER_T *xs;
904{
905	struct ispsoftc *isp;
906	u_int8_t iptr, optr;
907	union {
908		ispreq_t *_reqp;
909		ispreqt2_t *_t2reqp;
910	} _u;
911#define	reqp	_u._reqp
912#define	t2reqp	_u._t2reqp
913#define	UZSIZE	max(sizeof (ispreq_t), sizeof (ispreqt2_t))
914	int i;
915
916	XS_INITERR(xs);
917	isp = XS_ISP(xs);
918
919	if (isp->isp_state != ISP_RUNSTATE) {
920		PRINTF("%s: adapter not ready\n", isp->isp_name);
921		XS_SETERR(xs, HBA_BOTCH);
922		return (CMD_COMPLETE);
923	}
924
925	/*
926	 * We *could* do the different sequence type that has clos
927	 * to the whole Queue Entry for the command,.
928	 */
929	if (XS_CDBLEN(xs) > ((isp->isp_type & ISP_HA_FC)? 16 : 12)) {
930		PRINTF("%s: unsupported cdb length (%d)\n",
931		    isp->isp_name, XS_CDBLEN(xs));
932		XS_SETERR(xs, HBA_BOTCH);
933		return (CMD_COMPLETE);
934	}
935
936	/*
937	 * First check to see if any HBA or Device
938	 * parameters need to be updated.
939	 */
940	if (isp->isp_update) {
941		isp_update(isp);
942	}
943
944	optr = isp->isp_reqodx = ISP_READ(isp, OUTMAILBOX4);
945	iptr = isp->isp_reqidx;
946
947	reqp = (ispreq_t *) ISP_QUEUE_ENTRY(isp->isp_rquest, iptr);
948	iptr = ISP_NXT_QENTRY(iptr, RQUEST_QUEUE_LEN);
949	if (iptr == optr) {
950		IDPRINTF(2, ("%s: Request Queue Overflow\n", isp->isp_name));
951		XS_SETERR(xs, HBA_BOTCH);
952		return (CMD_EAGAIN);
953	}
954	if (isp->isp_type & ISP_HA_FC) {
955		DISABLE_INTS(isp);
956	}
957
958	if (isp->isp_sendmarker) {
959		u_int8_t niptr;
960		ispmarkreq_t *marker = (ispmarkreq_t *) reqp;
961
962		bzero((void *) marker, sizeof (*marker));
963		marker->req_header.rqs_entry_count = 1;
964		marker->req_header.rqs_entry_type = RQSTYPE_MARKER;
965		marker->req_modifier = SYNC_ALL;
966
967		isp->isp_sendmarker = 0;
968
969		/*
970		 * Unconditionally update the input pointer anyway.
971		 */
972		ISP_WRITE(isp, INMAILBOX4, iptr);
973		isp->isp_reqidx = iptr;
974
975		niptr = ISP_NXT_QENTRY(iptr, RQUEST_QUEUE_LEN);
976		if (niptr == optr) {
977			if (isp->isp_type & ISP_HA_FC) {
978				ENABLE_INTS(isp);
979			}
980			IDPRINTF(2, ("%s: Request Queue Overflow+\n",
981			    isp->isp_name));
982			XS_SETERR(xs, HBA_BOTCH);
983			return (CMD_EAGAIN);
984		}
985		reqp = (ispreq_t *) ISP_QUEUE_ENTRY(isp->isp_rquest, iptr);
986		iptr = niptr;
987	}
988
989	bzero((void *) reqp, UZSIZE);
990	reqp->req_header.rqs_entry_count = 1;
991	if (isp->isp_type & ISP_HA_FC) {
992		reqp->req_header.rqs_entry_type = RQSTYPE_T2RQS;
993	} else {
994		reqp->req_header.rqs_entry_type = RQSTYPE_REQUEST;
995	}
996	reqp->req_header.rqs_flags = 0;
997	reqp->req_header.rqs_seqno = isp->isp_seqno++;
998
999	for (i = 0; i < RQUEST_QUEUE_LEN; i++) {
1000		if (isp->isp_xflist[i] == NULL)
1001			break;
1002	}
1003	if (i == RQUEST_QUEUE_LEN) {
1004		if (isp->isp_type & ISP_HA_FC)
1005			ENABLE_INTS(isp);
1006		IDPRINTF(2, ("%s: out of xflist pointers\n", isp->isp_name));
1007		XS_SETERR(xs, HBA_BOTCH);
1008		return (CMD_EAGAIN);
1009	} else {
1010		/*
1011		 * Never have a handle that is zero, so
1012		 * set req_handle off by one.
1013		 */
1014		isp->isp_xflist[i] = xs;
1015		reqp->req_handle = i+1;
1016	}
1017
1018	if (isp->isp_type & ISP_HA_FC) {
1019		/*
1020		 * See comment in isp_intr
1021		 */
1022		XS_RESID(xs) = 0;
1023		/*
1024		 * Fibre Channel always requires some kind of tag.
1025		 * If we're marked as "Can't Tag", just do simple
1026		 * instead of ordered tags. It's pretty clear to me
1027		 * that we shouldn't do head of queue tagging in
1028		 * this case.
1029		 */
1030		if (XS_CANTAG(xs)) {
1031			t2reqp->req_flags = XS_KINDOF_TAG(xs);
1032		} else {
1033 			t2reqp->req_flags = REQFLAG_STAG;
1034		}
1035	} else {
1036		sdparam *sdp = (sdparam *)isp->isp_param;
1037		if ((sdp->isp_devparam[XS_TGT(xs)].cur_dflags & DPARM_TQING) &&
1038		    XS_CANTAG(xs)) {
1039			reqp->req_flags = XS_KINDOF_TAG(xs);
1040		} else {
1041			reqp->req_flags = 0;
1042		}
1043	}
1044	reqp->req_target = XS_TGT(xs);
1045	if (isp->isp_type & ISP_HA_SCSI) {
1046		reqp->req_lun_trn = XS_LUN(xs);
1047		reqp->req_cdblen = XS_CDBLEN(xs);
1048	} else {
1049#ifdef	SCCLUN
1050		reqp->req_scclun = XS_LUN(xs);
1051#else
1052		reqp->req_lun_trn = XS_LUN(xs);
1053#endif
1054
1055	}
1056	bcopy((void *)XS_CDBP(xs), reqp->req_cdb, XS_CDBLEN(xs));
1057
1058	IDPRINTF(5, ("%s(%d.%d): START%d cmd 0x%x datalen %d\n", isp->isp_name,
1059	    XS_TGT(xs), XS_LUN(xs), reqp->req_header.rqs_seqno,
1060	    reqp->req_cdb[0], XS_XFRLEN(xs)));
1061
1062	reqp->req_time = XS_TIME(xs) / 1000;
1063	if (reqp->req_time == 0 && XS_TIME(xs))
1064		reqp->req_time = 1;
1065	i = ISP_DMASETUP(isp, xs, reqp, &iptr, optr);
1066	if (i != CMD_QUEUED) {
1067		if (isp->isp_type & ISP_HA_FC)
1068			ENABLE_INTS(isp);
1069		/*
1070		 * dmasetup sets actual error in packet, and
1071		 * return what we were given to return.
1072		 */
1073		return (i);
1074	}
1075	XS_SETERR(xs, HBA_NOERROR);
1076	ISP_WRITE(isp, INMAILBOX4, iptr);
1077	isp->isp_reqidx = iptr;
1078	if (isp->isp_type & ISP_HA_FC) {
1079		ENABLE_INTS(isp);
1080	}
1081	isp->isp_nactive++;
1082	return (CMD_QUEUED);
1083#undef	reqp
1084#undef	t2reqp
1085}
1086
1087/*
1088 * isp control
1089 * Locks (ints blocked) assumed held.
1090 */
1091
1092int
1093isp_control(isp, ctl, arg)
1094	struct ispsoftc *isp;
1095	ispctl_t ctl;
1096	void *arg;
1097{
1098	ISP_SCSI_XFER_T *xs;
1099	mbreg_t mbs;
1100	int i;
1101
1102	switch (ctl) {
1103	default:
1104		PRINTF("%s: isp_control unknown control op %x\n",
1105		    isp->isp_name, ctl);
1106		break;
1107
1108	case ISPCTL_RESET_BUS:
1109		mbs.param[0] = MBOX_BUS_RESET;
1110		mbs.param[1] = (isp->isp_type & ISP_HA_FC)? 5: 2;
1111		isp_mboxcmd(isp, &mbs);
1112		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
1113			isp_dumpregs(isp, "isp_control SCSI bus reset failed");
1114			break;
1115		}
1116		/*
1117		 * This is really important to have set after a bus reset.
1118		 */
1119		isp->isp_sendmarker = 1;
1120		PRINTF("%s: driver initiated bus reset\n", isp->isp_name);
1121		return (0);
1122
1123        case ISPCTL_RESET_DEV:
1124		/*
1125		 * Note that under parallel SCSI, this issues a BDR message.
1126		 * Under FC, we could probably be using ABORT TASK SET
1127		 * command.
1128		 */
1129
1130		mbs.param[0] = MBOX_ABORT_TARGET;
1131		mbs.param[1] = ((long)arg) << 8;
1132		mbs.param[2] = 2;	/* 'delay', in seconds */
1133		isp_mboxcmd(isp, &mbs);
1134		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
1135			isp_dumpregs(isp, "SCSI Target  reset failed");
1136			break;
1137		}
1138		PRINTF("%s: Target %d Reset Succeeded\n", isp->isp_name,
1139		    (int) ((long) arg));
1140		isp->isp_sendmarker = 1;
1141		return (0);
1142
1143        case ISPCTL_ABORT_CMD:
1144		xs = (ISP_SCSI_XFER_T *) arg;
1145		for (i = 0; i < RQUEST_QUEUE_LEN; i++) {
1146			if (xs == isp->isp_xflist[i]) {
1147				break;
1148			}
1149		}
1150		if (i == RQUEST_QUEUE_LEN) {
1151			PRINTF("%s: isp_control- cannot find command to abort "
1152			    "in active list\n", isp->isp_name);
1153			break;
1154		}
1155		mbs.param[0] = MBOX_ABORT;
1156#ifdef	SCCLUN
1157		if (isp->isp_type & ISP_HA_FC) {
1158			mbs.param[1] = XS_TGT(xs) << 8;
1159			mbs.param[4] = 0;
1160			mbs.param[5] = 0;
1161			mbs.param[6] = XS_LUN(xs);
1162		} else {
1163			mbs.param[1] = XS_TGT(xs) << 8 | XS_LUN(xs);
1164		}
1165#else
1166		mbs.param[1] = XS_TGT(xs) << 8 | XS_LUN(xs);
1167#endif
1168		mbs.param[2] = (i+1) >> 16;
1169		mbs.param[3] = (i+1) & 0xffff;
1170		isp_mboxcmd(isp, &mbs);
1171		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
1172			PRINTF("%s: isp_control MBOX_ABORT failure (code %x)\n",
1173			    isp->isp_name, mbs.param[0]);
1174			break;
1175		}
1176		PRINTF("%s: command for target %d lun %d was aborted\n",
1177		    isp->isp_name, XS_TGT(xs), XS_LUN(xs));
1178		return (0);
1179
1180	case ISPCTL_UPDATE_PARAMS:
1181		isp_update(isp);
1182		return(0);
1183	}
1184	return (-1);
1185}
1186
1187/*
1188 * Interrupt Service Routine(s).
1189 *
1190 * External (OS) framework has done the appropriate locking,
1191 * and the locking will be held throughout this function.
1192 */
1193
1194int
1195isp_intr(arg)
1196	void *arg;
1197{
1198	ISP_SCSI_XFER_T *complist[RESULT_QUEUE_LEN], *xs;
1199	struct ispsoftc *isp = arg;
1200	u_int8_t iptr, optr;
1201	u_int16_t isr;
1202	int i, ndone = 0;
1203
1204	isr = ISP_READ(isp, BIU_ISR);
1205	if (isp->isp_type & ISP_HA_FC) {
1206		if (isr == 0 || (isr & BIU2100_ISR_RISC_INT) == 0) {
1207			if (isr) {
1208				IDPRINTF(4, ("%s: isp_intr isr=%x\n",
1209					     isp->isp_name, isr));
1210			}
1211			return (0);
1212		}
1213	} else {
1214		if (isr == 0 || (isr & BIU_ISR_RISC_INT) == 0) {
1215			if (isr) {
1216				IDPRINTF(4, ("%s: isp_intr isr=%x\n",
1217					     isp->isp_name, isr));
1218			}
1219			return (0);
1220		}
1221	}
1222
1223	if (ISP_READ(isp, BIU_SEMA) & 1) {
1224		u_int16_t mbox = ISP_READ(isp, OUTMAILBOX0);
1225		if (isp_parse_async(isp, (int) mbox))
1226			return (1);
1227		ISP_WRITE(isp, BIU_SEMA, 0);
1228	}
1229
1230	ISP_WRITE(isp, HCCR, HCCR_CMD_CLEAR_RISC_INT);
1231
1232	optr = isp->isp_residx;
1233	iptr = ISP_READ(isp, OUTMAILBOX5);
1234
1235	if (optr == iptr) {
1236		IDPRINTF(4, ("why intr? isr %x iptr %x optr %x\n",
1237		    isr, optr, iptr));
1238	}
1239	ENABLE_INTS(isp);
1240
1241	while (optr != iptr) {
1242		ispstatusreq_t *sp;
1243		u_int8_t oop;
1244		int buddaboom = 0;
1245
1246		sp = (ispstatusreq_t *) ISP_QUEUE_ENTRY(isp->isp_result, optr);
1247		oop = optr;
1248		optr = ISP_NXT_QENTRY(optr, RESULT_QUEUE_LEN);
1249
1250		if (sp->req_header.rqs_entry_type != RQSTYPE_RESPONSE) {
1251			if (isp_handle_other_response(isp, sp, &optr) == 0) {
1252				ISP_WRITE(isp, INMAILBOX5, optr);
1253				continue;
1254			}
1255			/*
1256			 * It really has to be a bounced request just copied
1257			 * from the request queue to the response queue.
1258			 */
1259
1260			if (sp->req_header.rqs_entry_type != RQSTYPE_REQUEST) {
1261				ISP_WRITE(isp, INMAILBOX5, optr);
1262				continue;
1263			}
1264			PRINTF("%s: not RESPONSE in RESPONSE Queue "
1265			    "(type 0x%x) @ idx %d (next %d)\n", isp->isp_name,
1266			    sp->req_header.rqs_entry_type, oop, optr);
1267			buddaboom = 1;
1268		}
1269
1270		if (sp->req_header.rqs_flags & 0xf) {
1271			if (sp->req_header.rqs_flags & RQSFLAG_CONTINUATION) {
1272				ISP_WRITE(isp, INMAILBOX5, optr);
1273				continue;
1274			}
1275			PRINTF("%s: rqs_flags=%x", isp->isp_name,
1276				sp->req_header.rqs_flags & 0xf);
1277			if (sp->req_header.rqs_flags & RQSFLAG_FULL) {
1278				PRINTF("%s: internal queues full\n",
1279				    isp->isp_name);
1280				/* XXXX: this command *could* get restarted */
1281				buddaboom++;
1282			}
1283			if (sp->req_header.rqs_flags & RQSFLAG_BADHEADER) {
1284				PRINTF("%s: bad header\n", isp->isp_name);
1285				buddaboom++;
1286			}
1287			if (sp->req_header.rqs_flags & RQSFLAG_BADPACKET) {
1288				PRINTF("%s: bad request packet\n",
1289				    isp->isp_name);
1290				buddaboom++;
1291			}
1292		}
1293		if (sp->req_handle > RQUEST_QUEUE_LEN || sp->req_handle < 1) {
1294			PRINTF("%s: bad request handle %d\n", isp->isp_name,
1295				sp->req_handle);
1296			ISP_WRITE(isp, INMAILBOX5, optr);
1297			continue;
1298		}
1299		xs = (ISP_SCSI_XFER_T *) isp->isp_xflist[sp->req_handle - 1];
1300		if (xs == NULL) {
1301			PRINTF("%s: NULL xs in xflist (handle %x)\n",
1302			    isp->isp_name, sp->req_handle);
1303			isp_dumpxflist(isp);
1304			ISP_WRITE(isp, INMAILBOX5, optr);
1305			continue;
1306		}
1307		isp->isp_xflist[sp->req_handle - 1] = NULL;
1308		if (sp->req_status_flags & RQSTF_BUS_RESET) {
1309			isp->isp_sendmarker = 1;
1310		}
1311		if (buddaboom) {
1312			XS_SETERR(xs, HBA_BOTCH);
1313		}
1314		XS_STS(xs) = sp->req_scsi_status & 0xff;
1315		if (isp->isp_type & ISP_HA_SCSI) {
1316			if (sp->req_state_flags & RQSF_GOT_SENSE) {
1317				bcopy(sp->req_sense_data, XS_SNSP(xs),
1318					XS_SNSLEN(xs));
1319				XS_SNS_IS_VALID(xs);
1320			}
1321		} else {
1322			if (XS_STS(xs) == SCSI_CHECK) {
1323				XS_SNS_IS_VALID(xs);
1324				bcopy(sp->req_sense_data, XS_SNSP(xs),
1325					XS_SNSLEN(xs));
1326				sp->req_state_flags |= RQSF_GOT_SENSE;
1327			}
1328		}
1329		if (XS_NOERR(xs) && XS_STS(xs) == SCSI_BUSY) {
1330			XS_SETERR(xs, HBA_TGTBSY);
1331		}
1332
1333		if (sp->req_header.rqs_entry_type == RQSTYPE_RESPONSE) {
1334			if (XS_NOERR(xs)) {
1335			    if (sp->req_completion_status != RQCS_COMPLETE) {
1336				isp_parse_status(isp, sp, xs);
1337			    } else {
1338				XS_SETERR(xs, HBA_NOERROR);
1339			    }
1340			}
1341		} else {
1342			PRINTF("%s: unknown return %x\n", isp->isp_name,
1343				sp->req_header.rqs_entry_type);
1344			if (XS_NOERR(xs))
1345				XS_SETERR(xs, HBA_BOTCH);
1346		}
1347		if (isp->isp_type & ISP_HA_SCSI) {
1348			XS_RESID(xs) = sp->req_resid;
1349		} else if (sp->req_scsi_status & RQCS_RU) {
1350			XS_RESID(xs) = sp->req_resid;
1351			IDPRINTF(4, ("%s: cnt %d rsd %d\n", isp->isp_name,
1352				XS_XFRLEN(xs), sp->req_resid));
1353		}
1354		if (XS_XFRLEN(xs)) {
1355			ISP_DMAFREE(isp, xs, sp->req_handle - 1);
1356		}
1357		/*
1358		 * XXX: If we have a check condition, but no Sense Data,
1359		 * XXX: mark it as an error (ARQ failed). We need to
1360		 * XXX: to do a more distinct job because there may
1361		 * XXX: cases where ARQ is disabled.
1362		 */
1363		if (XS_STS(xs) == SCSI_CHECK && !(XS_IS_SNS_VALID(xs))) {
1364			if (XS_NOERR(xs)) {
1365				PRINTF("%s: ARQ failure for target %d lun %d\n",
1366				    isp->isp_name, XS_TGT(xs), XS_LUN(xs));
1367				XS_SETERR(xs, HBA_ARQFAIL);
1368			}
1369		}
1370		if ((isp->isp_dblev >= 5) ||
1371		    (isp->isp_dblev > 2 && !XS_NOERR(xs))) {
1372			PRINTF("%s(%d.%d): FIN%d dl%d resid%d STS %x",
1373			    isp->isp_name, XS_TGT(xs), XS_LUN(xs),
1374			    sp->req_header.rqs_seqno, XS_XFRLEN(xs),
1375			    XS_RESID(xs), XS_STS(xs));
1376			if (sp->req_state_flags & RQSF_GOT_SENSE) {
1377				PRINTF(" Skey: %x", XS_SNSKEY(xs));
1378				if (!(XS_IS_SNS_VALID(xs))) {
1379					PRINTF(" BUT NOT SET");
1380				}
1381			}
1382			PRINTF(" XS_ERR=0x%x\n", (unsigned int) XS_ERR(xs));
1383		}
1384
1385		ISP_WRITE(isp, INMAILBOX5, optr);
1386		if (isp->isp_nactive > 0)
1387		    isp->isp_nactive--;
1388		complist[ndone++] = xs;	/* defer completion call until later */
1389	}
1390	/*
1391	 * If we completed any commands, then it's valid to find out
1392	 * what the outpointer is.
1393	 */
1394	if (ndone) {
1395	 	isp->isp_reqodx = ISP_READ(isp, OUTMAILBOX4);
1396	}
1397	isp->isp_residx = optr;
1398	for (i = 0; i < ndone; i++) {
1399		xs = complist[i];
1400		if (xs) {
1401			XS_CMD_DONE(xs);
1402		}
1403	}
1404	return (1);
1405}
1406
1407/*
1408 * Support routines.
1409 */
1410
1411static int
1412isp_parse_async(isp, mbox)
1413	struct ispsoftc *isp;
1414	int mbox;
1415{
1416	switch (mbox) {
1417	case ASYNC_BUS_RESET:
1418		PRINTF("%s: SCSI bus reset detected\n", isp->isp_name);
1419		isp->isp_sendmarker = 1;
1420#ifdef	ISP_TARGET_MODE
1421		isp_notify_ack(isp, NULL);
1422#endif
1423		break;
1424
1425	case ASYNC_SYSTEM_ERROR:
1426		mbox = ISP_READ(isp, OUTMAILBOX1);
1427		PRINTF("%s: Internal FW Error @ RISC Addr 0x%x\n",
1428		    isp->isp_name, mbox);
1429		isp_restart(isp);
1430		/* no point continuing after this */
1431		return (1);
1432
1433	case ASYNC_RQS_XFER_ERR:
1434		PRINTF("%s: Request Queue Transfer Error\n", isp->isp_name);
1435		break;
1436
1437	case ASYNC_RSP_XFER_ERR:
1438		PRINTF("%s: Response Queue Transfer Error\n", isp->isp_name);
1439		break;
1440
1441	case ASYNC_QWAKEUP:
1442		/* don't need to be chatty */
1443		mbox = ISP_READ(isp, OUTMAILBOX4);
1444		break;
1445
1446	case ASYNC_TIMEOUT_RESET:
1447		PRINTF("%s: timeout initiated SCSI bus reset\n", isp->isp_name);
1448		isp->isp_sendmarker = 1;
1449#ifdef	ISP_TARGET_MODE
1450		isp_notify_ack(isp, NULL);
1451#endif
1452		break;
1453
1454	case ASYNC_DEVICE_RESET:
1455		PRINTF("%s: device reset\n", isp->isp_name);
1456#ifdef	ISP_TARGET_MODE
1457		isp_notify_ack(isp, NULL);
1458#endif
1459		break;
1460
1461	case ASYNC_EXTMSG_UNDERRUN:
1462		PRINTF("%s: extended message underrun\n", isp->isp_name);
1463		break;
1464
1465	case ASYNC_SCAM_INT:
1466		PRINTF("%s: SCAM interrupt\n", isp->isp_name);
1467		break;
1468
1469	case ASYNC_HUNG_SCSI:
1470		PRINTF("%s: stalled SCSI Bus after DATA Overrun\n",
1471		    isp->isp_name);
1472		/* XXX: Need to issue SCSI reset at this point */
1473		break;
1474
1475	case ASYNC_KILLED_BUS:
1476		PRINTF("%s: SCSI Bus reset after DATA Overrun\n",
1477		    isp->isp_name);
1478		break;
1479
1480	case ASYNC_BUS_TRANSIT:
1481		PRINTF("%s: LBD->HVD Transition 0x%x\n",
1482		    isp->isp_name, ISP_READ(isp, OUTMAILBOX1));
1483		break;
1484
1485	case ASYNC_CMD_CMPLT:
1486		PRINTF("%s: fast post completion\n", isp->isp_name);
1487#if	0
1488		fast_post_handle = (ISP_READ(isp, OUTMAILBOX1) << 16) |
1489		    ISP_READ(isp, OUTMAILBOX2);
1490#endif
1491		break;
1492
1493	case ASYNC_CTIO_DONE:
1494		/* Should only occur when Fast Posting Set for 2100s */
1495		PRINTF("%s: CTIO done\n", isp->isp_name);
1496		break;
1497
1498	case ASYNC_LIP_OCCURRED:
1499		PRINTF("%s: LIP occurred\n", isp->isp_name);
1500		break;
1501
1502	case ASYNC_LOOP_UP:
1503		PRINTF("%s: Loop UP\n", isp->isp_name);
1504		break;
1505
1506	case ASYNC_LOOP_DOWN:
1507		PRINTF("%s: Loop DOWN\n", isp->isp_name);
1508		break;
1509
1510	case ASYNC_LOOP_RESET:
1511		PRINTF("%s: Loop RESET\n", isp->isp_name);
1512#ifdef	ISP_TARGET_MODE
1513		isp_notify_ack(isp, NULL);
1514#endif
1515		break;
1516
1517	case ASYNC_PDB_CHANGED:
1518		PRINTF("%s: Port Database Changed\n", isp->isp_name);
1519		break;
1520
1521	case ASYNC_CHANGE_NOTIFY:
1522		PRINTF("%s: Name Server Database Changed\n", isp->isp_name);
1523		break;
1524
1525	default:
1526		PRINTF("%s: async %x\n", isp->isp_name, mbox);
1527		break;
1528	}
1529	return (0);
1530}
1531
1532static int
1533isp_handle_other_response(isp, sp, optrp)
1534	struct ispsoftc *isp;
1535	ispstatusreq_t *sp;
1536	u_int8_t *optrp;
1537{
1538	u_int8_t iptr, optr;
1539	int reqsize = 0;
1540	void *ireqp = NULL;
1541#ifdef	ISP_TARGET_MODE
1542	union {
1543		at_entry_t	*atio;
1544		at2_entry_t	*at2io;
1545		ct_entry_t	*ctio;
1546		ct2_entry_t	*ct2io;
1547		lun_entry_t	*lunen;
1548		in_entry_t	*inot;
1549		in_fcentry_t	*inot_fc;
1550		na_entry_t	*nack;
1551		na_fcentry_t	*nack_fc;
1552		void            *voidp;
1553#define	atio	un.atio
1554#define	at2io	un.at2io
1555#define	ctio	un.ctio
1556#define	ct2io	un.ct2io
1557#define	lunen	un.lunen
1558#define	inot	un.inot
1559#define	inot_fc	un.inot_fc
1560#define	nack	un.nack
1561#define	nack_fc	un.nack_fc
1562	} un;
1563
1564	un.voidp = sp;
1565#endif
1566
1567
1568	switch (sp->req_header.rqs_entry_type) {
1569	case RQSTYPE_REQUEST:
1570		return (-1);
1571#ifdef	ISP_TARGET_MODE
1572	case RQSTYPE_NOTIFY_ACK:
1573	{
1574		static const char *f =
1575			"%s: Notify Ack Status 0x%x Sequence Id 0x%x\n"
1576		/*
1577		 * The ISP is acknowleding our ack of an Immediate Notify.
1578		 */
1579		if (isp->isp_type & ISP_HA_FC) {
1580			PRINTF(f, isp->isp_name,
1581			    nack_fc->na-status, nack_fc->na_seqid);
1582		} else {
1583			PRINTF(f, isp->isp_name,
1584			    nack->na_status, nack->na_seqid);
1585		}
1586		break;
1587	}
1588	case RQSTYPE_NOTIFY:
1589	{
1590		u_int16_t seqid, status;
1591
1592		/*
1593		 * Either the ISP received a SCSI message it cannot handle
1594		 * or some other out of band condition (e.g., Port Logout)
1595		 * or it is returning an Immediate Notify entry we sent.
1596		 */
1597		if (isp->isp_type & ISP_HA_FC) {
1598			status = inot_fc->status;
1599			seqid = inot_fc->in_seqid;
1600		} else {
1601			status = inot->status;
1602			seqid = inot->seqid & 0xff;
1603		}
1604		PRINTF("%s: Immediate Notify Status 0x%x Sequence Id 0x%x\n",
1605		    isp->isp_name, status, seqid);
1606
1607		switch (status) {
1608		case IN_MSG_RECEIVED:
1609		case IN_IDE_RECEIVED:
1610			ptisp_got_msg(ptp, &inot);
1611			break;
1612		case IN_RSRC_UNAVAIL:
1613                        PRINTF("%s: Firmware out of ATIOs\n", isp->isp_name);
1614                        break;
1615                case IN_ABORT_TASK:
1616			PRINTF("%s: Abort Task iid %d rx_id 0x%x\n",
1617			    inot_fc->in_iid, seqid);
1618                        break;
1619                case IN_PORT_LOGOUT:
1620			PRINTF("%s: Port Logout for Initiator %d\n",
1621			    isp->isp_name, inot_fc->in_iid);
1622                        break;
1623                default:
1624			PRINTF("%s: bad status (0x%x) in Immediate Notify\n",
1625                            isp->isp_name, status);
1626                        break;
1627
1628		}
1629		isp_notify_ack(isp, un.voidp);
1630		reqsize = 0;
1631		break;
1632	}
1633	case RQSTYPE_ENABLE_LUN:
1634	case RQSTYPE_MODIFY_LUN:
1635		if (lunen->req_status != 1) {
1636		    PRINTF("%s: ENABLE/MODIFY LUN returned status 0x%x\n",
1637			isp->isp_name, lunen->req_status);
1638		}
1639		break;
1640	case RQSTYPE_ATIO2:
1641	{
1642		fcparam *fcp = isp->isp_param;
1643		ispctiot2_t local, *ct2 = NULL;
1644		ispatiot2_t *at2 = (ispatiot2_t *) sp;
1645		int s, lun;
1646
1647#ifdef	SCCLUN
1648		lun = at2->req_scclun;
1649#else
1650		lun = at2->req_lun;
1651#endif
1652		PRINTF("%s: atio2 loopid %d for lun %d rxid 0x%x flags0x%x "
1653		    "tflags0x%x ecodes0x%x rqstatus0x%x\n", isp->isp_name,
1654		    at2->req_initiator, lun, at2->req_rxid,
1655		    at2->req_flags, at2->req_taskflags, at2->req_execodes,
1656		    at2->req_status);
1657
1658		switch (at2->req_status & ~ATIO_SENSEVALID) {
1659		case ATIO_PATH_INVALID:
1660			PRINTF("%s: ATIO2 Path Invalid\n", isp->isp_name);
1661			break;
1662		case ATIO_NOCAP:
1663			PRINTF("%s: ATIO2 No Cap\n", isp->isp_name);
1664			break;
1665		case ATIO_BDR_MSG:
1666			PRINTF("%s: ATIO2 BDR Received\n", isp->isp_name);
1667			break;
1668		case ATIO_CDB_RECEIVED:
1669			ct2 = &local;
1670			break;
1671		default:
1672			PRINTF("%s: unknown req_status 0x%x\n", isp->isp_name,
1673			    at2->req_status);
1674			break;
1675		}
1676		if (ct2 == NULL) {
1677			/*
1678			 * Just do an ACCEPT on this fellow.
1679			 */
1680			at2->req_header.rqs_entry_type = RQSTYPE_ATIO2;
1681			at2->req_header.rqs_flags = 0;
1682			at2->req_flags = 1;
1683			ireqp = at2;
1684			reqsize = sizeof (*at2);
1685			break;
1686		}
1687		PRINTF("%s: datalen %d cdb0=0x%x\n", isp->isp_name,
1688		    at2->req_datalen, at2->req_cdb[0]);
1689		bzero ((void *) ct2, sizeof (*ct2));
1690		ct2->req_header.rqs_entry_type = RQSTYPE_CTIO2;
1691		ct2->req_header.rqs_entry_count = 1;
1692		ct2->req_header.rqs_flags = 0;
1693		ct2->req_header.rqs_seqno = isp->isp_seqno++;
1694		ct2->req_handle = (at2->req_initiator << 16) | lun;
1695#ifndef	SCCLUN
1696		ct2->req_lun = lun;
1697#endif
1698		ct2->req_initiator = at2->req_initiator;
1699		ct2->req_rxid = at2->req_rxid;
1700
1701		ct2->req_flags = CTIO_SEND_STATUS;
1702		switch (at2->req_cdb[0]) {
1703		case 0x0:		/* TUR */
1704			ct2->req_flags |= CTIO_NODATA | CTIO2_SMODE0;
1705			ct2->req_m.mode0.req_scsi_status = CTIO2_STATUS_VALID;
1706			break;
1707
1708		case 0x3:		/* REQUEST SENSE */
1709		case 0x12:		/* INQUIRE */
1710			ct2->req_flags |= CTIO_SEND_DATA | CTIO2_SMODE0;
1711			ct2->req_m.mode0.req_scsi_status = CTIO2_STATUS_VALID;
1712			ct2->req_seg_count = 1;
1713			if (at2->req_cdb[0] == 0x12) {
1714				s = sizeof(tgtiqd);
1715				bcopy((void *)tgtiqd, fcp->isp_scratch, s);
1716			} else {
1717				s = at2->req_datalen;
1718				bzero(fcp->isp_scratch, s);
1719			}
1720			ct2->req_m.mode0.req_dataseg[0].ds_base =
1721			    fcp->isp_scdma;
1722			ct2->req_m.mode0.req_dataseg[0].ds_count = s;
1723			ct2->req_m.mode0.req_datalen = s;
1724#if	1
1725			if (at2->req_datalen < s) {
1726				ct2->req_m.mode1.req_scsi_status |=
1727				    CTIO2_RESP_VALID|CTIO2_RSPOVERUN;
1728			} else if (at2->req_datalen > s) {
1729				ct2->req_m.mode1.req_scsi_status |=
1730				    CTIO2_RESP_VALID|CTIO2_RSPUNDERUN;
1731			}
1732#endif
1733			break;
1734
1735		default:		/* ALL OTHERS */
1736			ct2->req_flags |= CTIO_NODATA | CTIO2_SMODE1;
1737			ct2->req_m.mode1.req_scsi_status = 0;
1738#if	1
1739			if (at2->req_datalen) {
1740				ct2->req_m.mode1.req_scsi_status |=
1741				    CTIO2_RSPUNDERUN;
1742#if	BYTE_ORDER == BIG_ENDIAN
1743				ct2->req_resid[1] = at2->req_datalen & 0xff;
1744				ct2->req_resid[0] =
1745					(at2->req_datalen >> 8) & 0xff;
1746				ct2->req_resid[3] =
1747					(at2->req_datalen >> 16) & 0xff;
1748				ct2->req_resid[2] =
1749					(at2->req_datalen >> 24) & 0xff;
1750#else
1751				ct2->req_resid[0] = at2->req_datalen & 0xff;
1752				ct2->req_resid[1] =
1753					(at2->req_datalen >> 8) & 0xff;
1754				ct2->req_resid[2] =
1755					(at2->req_datalen >> 16) & 0xff;
1756				ct2->req_resid[3] =
1757					(at2->req_datalen >> 24) & 0xff;
1758#endif
1759			}
1760#endif
1761			if ((at2->req_status & ATIO_SENSEVALID) == 0) {
1762				ct2->req_m.mode1.req_sense_len = 18;
1763				ct2->req_m.mode1.req_scsi_status |= 2;
1764				ct2->req_m.mode1.req_response[0] = 0x70;
1765				ct2->req_m.mode1.req_response[2] = 0x2;
1766			} else {
1767				ct2->req_m.mode1.req_sense_len = 18;
1768				ct2->req_m.mode1.req_scsi_status |=
1769				    at2->req_scsi_status;
1770				bcopy((void *)at2->req_sense,
1771				    (void *)ct2->req_m.mode1.req_response,
1772				    sizeof (at2->req_sense));
1773			}
1774			break;
1775		}
1776		reqsize = sizeof (*ct2);
1777		ireqp = ct2;
1778		break;
1779	}
1780	case RQSTYPE_CTIO2:
1781	{
1782		ispatiot2_t *at2;
1783		ispctiot2_t *ct2 = (ispctiot2_t *) sp;
1784		PRINTF("%s: CTIO2 returned status 0x%x\n", isp->isp_name,
1785		    ct2->req_status);
1786		/*
1787	 	 * Return the ATIO to the board.
1788		 */
1789		at2 = (ispatiot2_t *) sp;
1790		at2->req_header.rqs_entry_type = RQSTYPE_ATIO2;
1791		at2->req_header.rqs_entry_count = 1;
1792		at2->req_header.rqs_flags = 0;
1793		at2->req_header.rqs_seqno = isp->isp_seqno++;
1794		at2->req_status = 1;
1795		reqsize = sizeof (*at2);
1796		ireqp = at2;
1797		break;
1798	}
1799#undef	atio
1800#undef	at2io
1801#undef	ctio
1802#undef	ct2io
1803#undef	lunen
1804#undef	inot
1805#undef	inot_fc
1806#undef	nack
1807#undef	nack_fc
1808#endif
1809	default:
1810		PRINTF("%s: other response type %x\n", isp->isp_name,
1811		    sp->req_header.rqs_entry_type);
1812		break;
1813	}
1814	if (reqsize) {
1815		void *reqp;
1816		optr = isp->isp_reqodx = ISP_READ(isp, OUTMAILBOX4);
1817		iptr = isp->isp_reqidx;
1818		reqp = (void *) ISP_QUEUE_ENTRY(isp->isp_rquest, iptr);
1819		iptr = ISP_NXT_QENTRY(iptr, RQUEST_QUEUE_LEN);
1820		if (iptr == optr) {
1821			PRINTF("%s: Request Queue Overflow other response\n",
1822			    isp->isp_name);
1823		} else {
1824			bcopy(ireqp, reqp, reqsize);
1825			ISP_WRITE(isp, INMAILBOX4, iptr);
1826			isp->isp_reqidx = iptr;
1827		}
1828	}
1829	return (0);
1830}
1831
1832#ifdef	ISP_TARGET_MODE
1833
1834static void isp_tmd_newcmd_dflt __P((void *, tmd_cmd_t *));
1835static void isp_tmd_event_dflt __P((void *, int));
1836static void isp_tmd_notify_dflt __P((void *, tmd_notify_t *));
1837
1838static void isp_tgt_data_xfer __P ((tmd_cmd_t *));
1839static void isp_tgt_endcmd __P ((tmd_cmd_t *, u_int8_t));
1840static void isp_tgt_done __P ((tmd_cmd_t *));
1841
1842static void
1843isp_tmd_newcmd_dflt(arg0, cmdp)
1844	void *arg0;
1845	tmd_cmd_t *cmdp;
1846{
1847}
1848
1849static void
1850isp_tmd_event_dflt(arg0, event)
1851	void *arg0;
1852	int event;
1853{
1854}
1855
1856static void
1857isp_tmd_notify_dflt(arg0, npt)
1858	void *arg0;
1859	tmd_notify_t *npt;
1860{
1861}
1862
1863/*
1864 * Locks held, and ints disabled (if FC).
1865 *
1866 * XXX: SETUP ONLY FOR INITIAL ENABLING RIGHT NOW
1867 */
1868static int
1869isp_modify_lun(isp, lun, icnt, ccnt)
1870	struct ispsoftc *isp;
1871	int lun;	/* logical unit to enable, modify, or disable */
1872	int icnt;	/* immediate notify count */
1873	int ccnt;	/* command count */
1874{
1875	isplun_t *ip = NULL;
1876	u_int8_t iptr, optr;
1877
1878	optr = isp->isp_reqodx = ISP_READ(isp, OUTMAILBOX4);
1879	iptr = isp->isp_reqidx;
1880	ip = (isplun_t *) ISP_QUEUE_ENTRY(isp->isp_rquest, iptr);
1881	iptr = ISP_NXT_QENTRY(iptr, RQUEST_QUEUE_LEN);
1882	if (iptr == optr) {
1883		PRINTF("%s: Request Queue Overflow in isp_modify_lun\n",
1884		    isp->isp_name);
1885		return (-1);
1886	}
1887
1888	bzero((void *) ip, sizeof (*ip));
1889	ip->req_header.rqs_entry_type = RQSTYPE_ENABLE_LUN;
1890	ip->req_header.rqs_entry_count = 1;
1891	ip->req_header.rqs_seqno = isp->isp_seqno++;
1892	ip->req_handle = RQSTYPE_ENABLE_LUN;
1893	if (isp->isp_type & ISP_HA_SCSI) {
1894		ip->req_lun = lun;
1895	}
1896	ip->req_cmdcount = ccnt;
1897	ip->req_imcount = icnt;
1898	ip->req_timeout = 0;	/* default 30 seconds */
1899	ISP_WRITE(isp, INMAILBOX4, iptr);
1900	isp->isp_reqidx = iptr;
1901	return (0);
1902}
1903
1904static void
1905isp_notify_ack(isp, ptrp)
1906	struct ispsoftc *isp;
1907	void *ptrp;
1908{
1909	void *reqp;
1910	u_int8_t iptr, optr;
1911	union {
1912		na_fcentry_t _naf;
1913		na_entry_t _nas;
1914	} un;
1915
1916	bzero((caddr_t)&un, sizeof (un));
1917	un._nas.na_header.rqs_entry_type = RQSTYPE_NOTIFY_ACK;
1918	un._nas.na_header.rqs_entry_count = 1;
1919
1920	if (isp->isp_type & ISP_HA_FC) {
1921		na_fcentry_t *na = &un._nas;
1922		if (ptrp) {
1923			in_fcentry_t *inp = ptrp;
1924			na->na_iid = inp->in_iid;
1925			na->na_lun = inp->in_lun;
1926			na->na_task_flags = inp->in_task_flags;
1927			na->na_seqid = inp->in_seqid;
1928			na->na_status = inp->in_status;
1929		} else {
1930			na->na_flags = NAFC_RST_CLRD;
1931		}
1932	} else {
1933		na_entry_t *na = &un._nas;
1934		if (ptrp) {
1935			in_entry_t *inp = ptrp;
1936			na->na_iid = inp->in_iid;
1937			na->na_lun = inp->in_lun;
1938			na->na_tgt = inp->in_tgt;
1939			na->na_seqid = inp->in_seqid;
1940		} else {
1941			na->na_flags = NA_RST_CLRD;
1942		}
1943	}
1944	optr = isp->isp_reqodx = ISP_READ(isp, OUTMAILBOX4);
1945	iptr = isp->isp_reqidx;
1946	reqp = (void *) ISP_QUEUE_ENTRY(isp->isp_rquest, iptr);
1947	iptr = ISP_NXT_QENTRY(iptr, RQUEST_QUEUE_LEN);
1948	if (iptr == optr) {
1949		PRINTF("%s: Request Queue Overflow For isp_notify_ack\n",
1950		    isp->isp_name);
1951	} else {
1952		bcopy(ireqp, reqp, sizeof (un));
1953		ISP_WRITE(isp, INMAILBOX4, iptr);
1954		isp->isp_reqidx = iptr;
1955	}
1956}
1957
1958/*
1959 * These are dummy stubs for now until the outside framework is plugged in.
1960 */
1961
1962static void
1963isp_handle_atio (isp, aep)
1964	struct ispsoftc *isp;
1965	at_entry_t *aep;
1966{
1967	int status, connected;
1968	tmd_cmd_t local, *cdp = &local;
1969
1970	/*
1971	 * Get the ATIO status and see if we're still connected.
1972	 */
1973	status = aep->at_status;
1974	connected = ((aep->at_flags & AT_NODISC) != 0);
1975
1976	PRINTF("%s: ATIO status=0x%x, connected=%d\n", isp->isp_name,
1977	    status, connected);
1978
1979	/*
1980	 * The firmware status (except for the SenseValid bit) indicates
1981	 * why this ATIO was sent to us.
1982	 * If SenseValid is set, the firware has recommended Sense Data.
1983	 * If the Disconnects Disabled bit is set in the flags field,
1984	 * we're still connected on the SCSI bus - i.e. the initiator
1985	 * did not set DiscPriv in the identify message. We don't care
1986	 * about this so it's ignored.
1987	 */
1988	switch(status & ~TGTSVALID) {
1989	case AT_PATH_INVALID:
1990		/*
1991		 * ATIO rejected by the firmware due to disabled lun.
1992		 */
1993		PRINTF("%s: Firmware rejected ATIO for disabled lun %d\n",
1994		    isp->isp_name, aep->at_lun);
1995		break;
1996
1997	case AT_PHASE_ERROR:
1998		/*
1999		 * Bus Pase Sequence error.
2000		 *
2001		 * The firmware should have filled in the correct
2002		 * sense data.
2003		 */
2004
2005
2006		if (status & TGTSVALID) {
2007			bcopy((caddr_t) aep->at_sense,
2008			    (caddr_t) &cdp->cd_sensedata,
2009			    sizeof (cdp->cd_sensedata));
2010			PRINTF("%s: Bus Phase Sequence error key 0x%x\n",
2011			    isp->isp_name, cdp->cd_sensedata[2] & 0xf);
2012		} else {
2013			PRINTF("%s: Bus Phase Sequence With No Sense\n",
2014			    isp->isp_name);
2015		}
2016		(*isp->isp_tmd_newcmd)(isp, cdp);
2017		break;
2018
2019	case AT_NOCAP:
2020		/*
2021		 * Requested Capability not available
2022		 * We sent an ATIO that overflowed the firmware's
2023		 * command resource count.
2024		 */
2025		PRINTF("%s: Firmware rejected ATIO, command count overflow\n",
2026		    isp->isp_name);
2027		break;
2028
2029	case AT_BDR_MSG:
2030		/*
2031		 * If we send an ATIO to the firmware to increment
2032		 * its command resource count, and the firmware is
2033		 * recovering from a Bus Device Reset, it returns
2034		 * the ATIO with this status.
2035		 */
2036		PRINTF("%s: ATIO returned with BDR received\n", isp->isp_name);
2037		break;
2038
2039	case AT_CDB:
2040		/*
2041		 * New CDB
2042		 */
2043		cdp->cd_hba = isp;
2044		cdp->cd_iid = aep->at_iid;
2045		cdp->cd_tgt = aep->at_tgt;
2046		cdp->cd_lun = aep->at_lun;
2047		cdp->cd_tagtype = aep->at_tag_type;
2048		cdp->cd_tagval = aep->at_tag_val;
2049		bcopy(aep->at_cdb, cdp->cd_cdb, 16);
2050		PRINTF("%s: CDB 0x%x itl %d/%d/%d\n", isp->isp_name,
2051		    cdp->cd_cdb[0], cdp->cd_iid, cdp->cd_tgt, cdp->cd_lun);
2052		(*isp->isp_tmd_newcmd)(isp, cdp);
2053		break;
2054
2055	default:
2056		PRINTF("%s: Unknown status (0x%x) in ATIO\n",
2057		    isp->isp_name, status);
2058		cdp->cd_hba = isp;
2059		cdp->cd_iid = aep->at_iid;
2060		cdp->cd_tgt = aep->at_tgt;
2061		cdp->cd_lun = aep->at_lun;
2062		cdp->cd_tagtype = aep->at_tag_type;
2063		cdp->cd_tagval = aep->at_tag_val;
2064		isp_tgtcmd_done(cdp);
2065		break;
2066	}
2067}
2068
2069static void
2070isp_handle_atio2(isp, aep)
2071	struct ispsoftc *isp;
2072	at2_entry_t *aep;
2073{
2074	int status;
2075	tmd_cmd_t local, *cdp = &local;
2076
2077	/*
2078	 * Get the ATIO2 status.
2079	 */
2080	status = aep->at_status;
2081	PRINTD("%s: ATIO2 status=0x%x\n", status);
2082
2083	/*
2084	 * The firmware status (except for the SenseValid bit) indicates
2085	 * why this ATIO was sent to us.
2086	 * If SenseValid is set, the firware has recommended Sense Data.
2087	 */
2088	switch(status & ~TGTSVALID) {
2089	case AT_PATH_INVALID:
2090		/*
2091		 * ATIO rejected by the firmware due to disabled lun.
2092		 */
2093		PRINTF("%s: Firmware rejected ATIO2 for disabled lun %d\n",
2094		    isp->isp_name, aep->at_lun);
2095		break;
2096
2097	case AT_NOCAP:
2098		/*
2099		 * Requested Capability not available
2100		 * We sent an ATIO that overflowed the firmware's
2101		 * command resource count.
2102		 */
2103		PRINTF("%s: Firmware rejected ATIO2, command count overflow\n",
2104		    isp->isp_name);
2105		break;
2106
2107	case AT_BDR_MSG:
2108		/*
2109		 * If we send an ATIO to the firmware to increment
2110		 * its command resource count, and the firmware is
2111		 * recovering from a Bus Device Reset, it returns
2112		 * the ATIO with this status.
2113		 */
2114		PRINTF("%s: ATIO2 returned with BDR rcvd\n", isp->isp_name);
2115		break;
2116
2117	case AT_CDB:
2118		/*
2119		 * New CDB
2120		 */
2121		cdp->cd_hba = isp;
2122		cdp->cd_iid = aep->at_iid;
2123		cdp->cd_tgt = 0;
2124		cdp->cd_lun = aep->at_lun;
2125		bcopy(aep->at_cdb, cdp->cd_cdb, 16);
2126		cdp->cd_rxid = aep->at_rxid;
2127		cdp->cp_origdlen = aep->at_datalen;
2128		cdp->cp_totbytes = 0;
2129		PRINTF("%s: CDB 0x%x rx_id 0x%x itl %d/%d/%d dlen %d\n",
2130		    isp->isp_name, cdp->cd_cdb[0], cdp->cd_tagval, cdp->cd_iid,
2131		    cdp->cd_tgt, cdp->cd_lun, aep->at_datalen);
2132		(*isp->isp_tmd_newcmd)(isp, cdp);
2133		break;
2134
2135	default:
2136		PRINTF("%s: Unknown status (0x%x) in ATIO2\n",
2137		    isp->isp_name, status);
2138		cdp->cd_hba = isp;
2139		cdp->cd_iid = aep->at_iid;
2140		cdp->cd_tgt = aep->at_tgt;
2141		cdp->cd_lun = aep->at_lun;
2142		cdp->cp_rxid = aep->at_rxid;
2143		isp_tgtcmd_done(cdp);
2144		break;
2145	}
2146}
2147
2148static void
2149isp_handle_ctio(isp, cep)
2150	struct ispsoftc *isp;
2151	ct_entry_t *aep;
2152{
2153}
2154
2155static void
2156isp_handle_ctio2(isp, cep)
2157	struct ispsoftc *isp;
2158	at2_entry_t *aep;
2159{
2160}
2161#endif
2162
2163static void
2164isp_parse_status(isp, sp, xs)
2165	struct ispsoftc *isp;
2166	ispstatusreq_t *sp;
2167	ISP_SCSI_XFER_T *xs;
2168{
2169	switch (sp->req_completion_status) {
2170	case RQCS_COMPLETE:
2171		XS_SETERR(xs, HBA_NOERROR);
2172		return;
2173
2174	case RQCS_INCOMPLETE:
2175		if ((sp->req_state_flags & RQSF_GOT_TARGET) == 0) {
2176			IDPRINTF(3, ("%s: Selection Timeout for target %d\n",
2177			    isp->isp_name, XS_TGT(xs)));
2178			XS_SETERR(xs, HBA_SELTIMEOUT);
2179			return;
2180		}
2181		PRINTF("%s: command incomplete for target %d lun %d, state "
2182		    "0x%x\n", isp->isp_name, XS_TGT(xs), XS_LUN(xs),
2183		    sp->req_state_flags);
2184		break;
2185
2186	case RQCS_DMA_ERROR:
2187		PRINTF("%s: DMA error for command on target %d, lun %d\n",
2188		    isp->isp_name, XS_TGT(xs), XS_LUN(xs));
2189		break;
2190
2191	case RQCS_TRANSPORT_ERROR:
2192		PRINTF("%s: transport error\n", isp->isp_name);
2193		isp_prtstst(sp);
2194		break;
2195
2196	case RQCS_RESET_OCCURRED:
2197		IDPRINTF(2, ("%s: bus reset destroyed command for target %d "
2198		    "lun %d\n", isp->isp_name, XS_TGT(xs), XS_LUN(xs)));
2199		isp->isp_sendmarker = 1;
2200		XS_SETERR(xs, HBA_BUSRESET);
2201		return;
2202
2203	case RQCS_ABORTED:
2204		PRINTF("%s: command aborted for target %d lun %d\n",
2205		    isp->isp_name, XS_TGT(xs), XS_LUN(xs));
2206		isp->isp_sendmarker = 1;
2207		XS_SETERR(xs, HBA_ABORTED);
2208		return;
2209
2210	case RQCS_TIMEOUT:
2211		IDPRINTF(2, ("%s: command timed out for target %d lun %d\n",
2212		    isp->isp_name, XS_TGT(xs), XS_LUN(xs)));
2213		XS_SETERR(xs, HBA_CMDTIMEOUT);
2214		return;
2215
2216	case RQCS_DATA_OVERRUN:
2217		if (isp->isp_type & ISP_HA_FC) {
2218			XS_RESID(xs) = sp->req_resid;
2219			break;
2220		}
2221		XS_SETERR(xs, HBA_DATAOVR);
2222		return;
2223
2224	case RQCS_COMMAND_OVERRUN:
2225		PRINTF("%s: command overrun for command on target %d, lun %d\n",
2226		    isp->isp_name, XS_TGT(xs), XS_LUN(xs));
2227		break;
2228
2229	case RQCS_STATUS_OVERRUN:
2230		PRINTF("%s: status overrun for command on target %d, lun %d\n",
2231		    isp->isp_name, XS_TGT(xs), XS_LUN(xs));
2232		break;
2233
2234	case RQCS_BAD_MESSAGE:
2235		PRINTF("%s: message not COMMAND COMPLETE after status on "
2236		    "target %d, lun %d\n", isp->isp_name, XS_TGT(xs),
2237		    XS_LUN(xs));
2238		break;
2239
2240	case RQCS_NO_MESSAGE_OUT:
2241		PRINTF("%s: No MESSAGE OUT phase after selection on "
2242		    "target %d, lun %d\n", isp->isp_name, XS_TGT(xs),
2243		    XS_LUN(xs));
2244		break;
2245
2246	case RQCS_EXT_ID_FAILED:
2247		PRINTF("%s: EXTENDED IDENTIFY failed on target %d, lun %d\n",
2248		    isp->isp_name, XS_TGT(xs), XS_LUN(xs));
2249		break;
2250
2251	case RQCS_IDE_MSG_FAILED:
2252		PRINTF("%s: target %d lun %d rejected INITIATOR DETECTED "
2253		    "ERROR message\n", isp->isp_name, XS_TGT(xs), XS_LUN(xs));
2254		break;
2255
2256	case RQCS_ABORT_MSG_FAILED:
2257		PRINTF("%s: target %d lun %d rejected ABORT message\n",
2258		    isp->isp_name, XS_TGT(xs), XS_LUN(xs));
2259		break;
2260
2261	case RQCS_REJECT_MSG_FAILED:
2262		PRINTF("%s: target %d lun %d rejected MESSAGE REJECT message\n",
2263		    isp->isp_name, XS_TGT(xs), XS_LUN(xs));
2264		break;
2265
2266	case RQCS_NOP_MSG_FAILED:
2267		PRINTF("%s: target %d lun %d rejected NOP message\n",
2268		    isp->isp_name, XS_TGT(xs), XS_LUN(xs));
2269		break;
2270
2271	case RQCS_PARITY_ERROR_MSG_FAILED:
2272		PRINTF("%s: target %d lun %d rejected MESSAGE PARITY ERROR "
2273		    "message\n", isp->isp_name, XS_TGT(xs), XS_LUN(xs));
2274		break;
2275
2276	case RQCS_DEVICE_RESET_MSG_FAILED:
2277		PRINTF("%s: target %d lun %d rejected BUS DEVICE RESET "
2278		    "message\n", isp->isp_name, XS_TGT(xs), XS_LUN(xs));
2279		break;
2280
2281	case RQCS_ID_MSG_FAILED:
2282		PRINTF("%s: target %d lun %d rejected IDENTIFY "
2283		    "message\n", isp->isp_name, XS_TGT(xs), XS_LUN(xs));
2284		break;
2285
2286	case RQCS_UNEXP_BUS_FREE:
2287		PRINTF("%s: target %d lun %d had an unexpected bus free\n",
2288		    isp->isp_name, XS_TGT(xs), XS_LUN(xs));
2289		break;
2290
2291	case RQCS_DATA_UNDERRUN:
2292		if (isp->isp_type & ISP_HA_FC) {
2293			XS_RESID(xs) = sp->req_resid;
2294			/* an UNDERRUN is not a botch ??? */
2295		}
2296		XS_SETERR(xs, HBA_NOERROR);
2297		return;
2298
2299	case RQCS_XACT_ERR1:
2300		PRINTF("%s: HBA attempted queued transaction with disconnect "
2301		    "not set for target %d lun %d\n", isp->isp_name, XS_TGT(xs),
2302		    XS_LUN(xs));
2303		break;
2304
2305	case RQCS_XACT_ERR2:
2306		PRINTF("%s: HBA attempted queued transaction to target "
2307		    "routine %d on target %d\n", isp->isp_name, XS_LUN(xs),
2308		    XS_TGT(xs));
2309		break;
2310
2311	case RQCS_XACT_ERR3:
2312		PRINTF("%s: HBA attempted queued transaction for target %d lun "
2313		    "%d when queueing disabled\n", isp->isp_name, XS_TGT(xs),
2314		    XS_LUN(xs));
2315		break;
2316
2317	case RQCS_BAD_ENTRY:
2318		PRINTF("%s: invalid IOCB entry type detected\n", isp->isp_name);
2319		break;
2320
2321	case RQCS_QUEUE_FULL:
2322		PRINTF("%s: internal queues full for target %d lun %d\n",
2323		    isp->isp_name, XS_TGT(xs), XS_LUN(xs));
2324		break;
2325
2326	case RQCS_PHASE_SKIPPED:
2327		PRINTF("%s: SCSI phase skipped (e.g., COMMAND COMPLETE w/o "
2328		    "STATUS phase) for target %d lun %d\n", isp->isp_name,
2329		    XS_TGT(xs), XS_LUN(xs));
2330		break;
2331
2332	case RQCS_ARQS_FAILED:
2333		PRINTF("%s: Auto Request Sense failed for target %d lun %d\n",
2334		    isp->isp_name, XS_TGT(xs), XS_LUN(xs));
2335		XS_SETERR(xs, HBA_ARQFAIL);
2336		return;
2337
2338	case RQCS_WIDE_FAILED:
2339		PRINTF("%s: Wide Negotiation failed for target %d lun %d\n",
2340		    isp->isp_name, XS_TGT(xs), XS_LUN(xs));
2341		if (isp->isp_type & ISP_HA_SCSI) {
2342			sdparam *sdp = isp->isp_param;
2343			isp->isp_update = 1;
2344			sdp->isp_devparam[XS_TGT(xs)].dev_update = 1;
2345			sdp->isp_devparam[XS_TGT(xs)].dev_flags &= ~DPARM_WIDE;
2346		}
2347		XS_SETERR(xs, HBA_NOERROR);
2348		return;
2349
2350	case RQCS_SYNCXFER_FAILED:
2351		PRINTF("%s: SDTR Message failed for target %d lun %d\n",
2352		    isp->isp_name, XS_TGT(xs), XS_LUN(xs));
2353		if (isp->isp_type & ISP_HA_SCSI) {
2354			sdparam *sdp = isp->isp_param;
2355			isp->isp_update = 1;
2356			sdp->isp_devparam[XS_TGT(xs)].dev_update = 1;
2357			sdp->isp_devparam[XS_TGT(xs)].dev_flags &= ~DPARM_SYNC;
2358		}
2359		break;
2360
2361	case RQCS_LVD_BUSERR:
2362		PRINTF("%s: Bad LVD Bus condition while talking to target %d "
2363		    "lun %d\n", isp->isp_name, XS_TGT(xs), XS_LUN(xs));
2364		break;
2365
2366	case RQCS_PORT_UNAVAILABLE:
2367		/*
2368		 * No such port on the loop. Moral equivalent of SELTIMEO
2369		 */
2370		IDPRINTF(3, ("%s: Port Unavailable for target %d\n",
2371		    isp->isp_name, XS_TGT(xs)));
2372		XS_SETERR(xs, HBA_SELTIMEOUT);
2373		return;
2374
2375	case RQCS_PORT_LOGGED_OUT:
2376		/*
2377		 * It was there (maybe)- treat as a selection timeout.
2378		 */
2379		PRINTF("%s: port logout for target %d\n",
2380			isp->isp_name, XS_TGT(xs));
2381		XS_SETERR(xs, HBA_SELTIMEOUT);
2382		return;
2383
2384	case RQCS_PORT_CHANGED:
2385		PRINTF("%s: port changed for target %d\n",
2386			isp->isp_name, XS_TGT(xs));
2387		break;
2388
2389	case RQCS_PORT_BUSY:
2390		PRINTF("%s: port busy for target %d\n",
2391			isp->isp_name, XS_TGT(xs));
2392		XS_SETERR(xs, HBA_TGTBSY);
2393		return;
2394
2395	default:
2396		PRINTF("%s: comp status %x\n", isp->isp_name,
2397		       sp->req_completion_status);
2398		break;
2399	}
2400	XS_SETERR(xs, HBA_BOTCH);
2401}
2402
2403#define	HINIB(x)			((x) >> 0x4)
2404#define	LONIB(x)			((x)  & 0xf)
2405#define MAKNIB(a, b)			(((a) << 4) | (b))
2406static u_int8_t mbpcnt[] = {
2407	MAKNIB(1, 1),	/* 0x00: MBOX_NO_OP */
2408	MAKNIB(5, 5),	/* 0x01: MBOX_LOAD_RAM */
2409	MAKNIB(2, 0),	/* 0x02: MBOX_EXEC_FIRMWARE */
2410	MAKNIB(5, 5),	/* 0x03: MBOX_DUMP_RAM */
2411	MAKNIB(3, 3),	/* 0x04: MBOX_WRITE_RAM_WORD */
2412	MAKNIB(2, 3),	/* 0x05: MBOX_READ_RAM_WORD */
2413	MAKNIB(6, 6),	/* 0x06: MBOX_MAILBOX_REG_TEST */
2414	MAKNIB(2, 3),	/* 0x07: MBOX_VERIFY_CHECKSUM	*/
2415	MAKNIB(1, 3),	/* 0x08: MBOX_ABOUT_FIRMWARE */
2416	MAKNIB(0, 0),	/* 0x09: */
2417	MAKNIB(0, 0),	/* 0x0a: */
2418	MAKNIB(0, 0),	/* 0x0b: */
2419	MAKNIB(0, 0),	/* 0x0c: */
2420	MAKNIB(0, 0),	/* 0x0d: */
2421	MAKNIB(1, 2),	/* 0x0e: MBOX_CHECK_FIRMWARE */
2422	MAKNIB(0, 0),	/* 0x0f: */
2423	MAKNIB(5, 5),	/* 0x10: MBOX_INIT_REQ_QUEUE */
2424	MAKNIB(6, 6),	/* 0x11: MBOX_INIT_RES_QUEUE */
2425	MAKNIB(4, 4),	/* 0x12: MBOX_EXECUTE_IOCB */
2426	MAKNIB(2, 2),	/* 0x13: MBOX_WAKE_UP	*/
2427	MAKNIB(1, 6),	/* 0x14: MBOX_STOP_FIRMWARE */
2428	MAKNIB(4, 4),	/* 0x15: MBOX_ABORT */
2429	MAKNIB(2, 2),	/* 0x16: MBOX_ABORT_DEVICE */
2430	MAKNIB(3, 3),	/* 0x17: MBOX_ABORT_TARGET */
2431	MAKNIB(2, 2),	/* 0x18: MBOX_BUS_RESET */
2432	MAKNIB(2, 3),	/* 0x19: MBOX_STOP_QUEUE */
2433	MAKNIB(2, 3),	/* 0x1a: MBOX_START_QUEUE */
2434	MAKNIB(2, 3),	/* 0x1b: MBOX_SINGLE_STEP_QUEUE */
2435	MAKNIB(2, 3),	/* 0x1c: MBOX_ABORT_QUEUE */
2436	MAKNIB(2, 4),	/* 0x1d: MBOX_GET_DEV_QUEUE_STATUS */
2437	MAKNIB(0, 0),	/* 0x1e: */
2438	MAKNIB(1, 3),	/* 0x1f: MBOX_GET_FIRMWARE_STATUS */
2439	MAKNIB(1, 3),	/* 0x20: MBOX_GET_INIT_SCSI_ID, MBOX_GET_LOOP_ID */
2440	MAKNIB(1, 2),	/* 0x21: MBOX_GET_SELECT_TIMEOUT */
2441	MAKNIB(1, 3),	/* 0x22: MBOX_GET_RETRY_COUNT	*/
2442	MAKNIB(1, 2),	/* 0x23: MBOX_GET_TAG_AGE_LIMIT */
2443	MAKNIB(1, 2),	/* 0x24: MBOX_GET_CLOCK_RATE */
2444	MAKNIB(1, 2),	/* 0x25: MBOX_GET_ACT_NEG_STATE */
2445	MAKNIB(1, 2),	/* 0x26: MBOX_GET_ASYNC_DATA_SETUP_TIME */
2446	MAKNIB(1, 3),	/* 0x27: MBOX_GET_PCI_PARAMS */
2447	MAKNIB(2, 4),	/* 0x28: MBOX_GET_TARGET_PARAMS */
2448	MAKNIB(2, 4),	/* 0x29: MBOX_GET_DEV_QUEUE_PARAMS */
2449	MAKNIB(0, 0),	/* 0x2a: */
2450	MAKNIB(0, 0),	/* 0x2b: */
2451	MAKNIB(0, 0),	/* 0x2c: */
2452	MAKNIB(0, 0),	/* 0x2d: */
2453	MAKNIB(0, 0),	/* 0x2e: */
2454	MAKNIB(0, 0),	/* 0x2f: */
2455	MAKNIB(2, 2),	/* 0x30: MBOX_SET_INIT_SCSI_ID */
2456	MAKNIB(2, 2),	/* 0x31: MBOX_SET_SELECT_TIMEOUT */
2457	MAKNIB(3, 3),	/* 0x32: MBOX_SET_RETRY_COUNT	*/
2458	MAKNIB(2, 2),	/* 0x33: MBOX_SET_TAG_AGE_LIMIT */
2459	MAKNIB(2, 2),	/* 0x34: MBOX_SET_CLOCK_RATE */
2460	MAKNIB(2, 2),	/* 0x35: MBOX_SET_ACTIVE_NEG_STATE */
2461	MAKNIB(2, 2),	/* 0x36: MBOX_SET_ASYNC_DATA_SETUP_TIME */
2462	MAKNIB(3, 3),	/* 0x37: MBOX_SET_PCI_CONTROL_PARAMS */
2463	MAKNIB(4, 4),	/* 0x38: MBOX_SET_TARGET_PARAMS */
2464	MAKNIB(4, 4),	/* 0x39: MBOX_SET_DEV_QUEUE_PARAMS */
2465	MAKNIB(0, 0),	/* 0x3a: */
2466	MAKNIB(0, 0),	/* 0x3b: */
2467	MAKNIB(0, 0),	/* 0x3c: */
2468	MAKNIB(0, 0),	/* 0x3d: */
2469	MAKNIB(0, 0),	/* 0x3e: */
2470	MAKNIB(0, 0),	/* 0x3f: */
2471	MAKNIB(1, 2),	/* 0x40: MBOX_RETURN_BIOS_BLOCK_ADDR */
2472	MAKNIB(6, 1),	/* 0x41: MBOX_WRITE_FOUR_RAM_WORDS */
2473	MAKNIB(2, 3),	/* 0x42: MBOX_EXEC_BIOS_IOCB */
2474	MAKNIB(0, 0),	/* 0x43: */
2475	MAKNIB(0, 0),	/* 0x44: */
2476	MAKNIB(0, 0),	/* 0x45: */
2477	MAKNIB(0, 0),	/* 0x46: */
2478	MAKNIB(0, 0),	/* 0x47: */
2479	MAKNIB(0, 0),	/* 0x48: */
2480	MAKNIB(0, 0),	/* 0x49: */
2481	MAKNIB(0, 0),	/* 0x4a: */
2482	MAKNIB(0, 0),	/* 0x4b: */
2483	MAKNIB(0, 0),	/* 0x4c: */
2484	MAKNIB(0, 0),	/* 0x4d: */
2485	MAKNIB(0, 0),	/* 0x4e: */
2486	MAKNIB(0, 0),	/* 0x4f: */
2487	MAKNIB(0, 0),	/* 0x50: */
2488	MAKNIB(0, 0),	/* 0x51: */
2489	MAKNIB(0, 0),	/* 0x52: */
2490	MAKNIB(0, 0),	/* 0x53: */
2491	MAKNIB(8, 0),	/* 0x54: MBOX_EXEC_COMMAND_IOCB_A64 */
2492	MAKNIB(0, 0),	/* 0x55: */
2493	MAKNIB(0, 0),	/* 0x56: */
2494	MAKNIB(0, 0),	/* 0x57: */
2495	MAKNIB(0, 0),	/* 0x58: */
2496	MAKNIB(0, 0),	/* 0x59: */
2497	MAKNIB(0, 0),	/* 0x5a: */
2498	MAKNIB(0, 0),	/* 0x5b: */
2499	MAKNIB(0, 0),	/* 0x5c: */
2500	MAKNIB(0, 0),	/* 0x5d: */
2501	MAKNIB(0, 0),	/* 0x5e: */
2502	MAKNIB(0, 0),	/* 0x5f: */
2503	MAKNIB(8, 6),	/* 0x60: MBOX_INIT_FIRMWARE */
2504	MAKNIB(0, 0),	/* 0x60: MBOX_GET_INIT_CONTROL_BLOCK  (FORMAT?) */
2505	MAKNIB(2, 1),	/* 0x62: MBOX_INIT_LIP */
2506	MAKNIB(8, 1),	/* 0x63: MBOX_GET_FC_AL_POSITION_MAP */
2507	MAKNIB(8, 1),	/* 0x64: MBOX_GET_PORT_DB */
2508	MAKNIB(3, 1),	/* 0x65: MBOX_CLEAR_ACA */
2509	MAKNIB(3, 1),	/* 0x66: MBOX_TARGET_RESET */
2510	MAKNIB(3, 1),	/* 0x67: MBOX_CLEAR_TASK_SET */
2511	MAKNIB(3, 1),	/* 0x69: MBOX_ABORT_TASK_SET */
2512	MAKNIB(1, 2)	/* 0x69: MBOX_GET_FW_STATE */
2513};
2514#define	NMBCOM	(sizeof (mbpcnt) / sizeof (mbpcnt[0]))
2515
2516static void
2517isp_mboxcmd(isp, mbp)
2518	struct ispsoftc *isp;
2519	mbreg_t *mbp;
2520{
2521	int outparam, inparam;
2522	int loops, dld = 0;
2523	u_int8_t opcode;
2524
2525	if (mbp->param[0] == ISP2100_SET_PCI_PARAM) {
2526		opcode = mbp->param[0] = MBOX_SET_PCI_PARAMETERS;
2527		inparam = 4;
2528		outparam = 4;
2529		goto command_known;
2530	} else if (mbp->param[0] > NMBCOM) {
2531		PRINTF("%s: bad command %x\n", isp->isp_name, mbp->param[0]);
2532		return;
2533	}
2534
2535	opcode = mbp->param[0];
2536	inparam = HINIB(mbpcnt[mbp->param[0]]);
2537	outparam =  LONIB(mbpcnt[mbp->param[0]]);
2538
2539	if (inparam == 0 && outparam == 0) {
2540		PRINTF("%s: no parameters for %x\n", isp->isp_name,
2541			mbp->param[0]);
2542		return;
2543	}
2544
2545
2546	/*
2547	 * Check for variants
2548	 */
2549#ifdef	SCCLUN
2550	if (isp->isp_type & ISP_HA_FC) {
2551		switch (mbp->param[0]) {
2552		case MBOX_ABORT:
2553			inparam = 7;
2554			break;
2555		case MBOX_ABORT_DEVICE:
2556		case MBOX_START_QUEUE:
2557		case MBOX_STOP_QUEUE:
2558		case MBOX_SINGLE_STEP_QUEUE:
2559		case MBOX_ABORT_QUEUE:
2560		case MBOX_GET_DEV_QUEUE_STATUS:
2561			inparam = 3;
2562			break;
2563		default:
2564			break;
2565		}
2566	}
2567#endif
2568
2569command_known:
2570
2571	/*
2572	 * Make sure we can send some words..
2573	 */
2574
2575	loops = MBOX_DELAY_COUNT;
2576	while ((ISP_READ(isp, HCCR) & HCCR_HOST_INT) != 0) {
2577		SYS_DELAY(100);
2578		if (--loops < 0) {
2579			PRINTF("%s: isp_mboxcmd timeout #1\n", isp->isp_name);
2580			if (dld++) {
2581				return;
2582			}
2583			PRINTF("%s: but we'll try again, isr=%x\n",
2584			    isp->isp_name, ISP_READ(isp, BIU_ISR));
2585			if (ISP_READ(isp, BIU_SEMA) & 1) {
2586				u_int16_t mbox = ISP_READ(isp, OUTMAILBOX0);
2587				if (isp_parse_async(isp, (int) mbox))
2588					return;
2589				ISP_WRITE(isp, BIU_SEMA, 0);
2590			}
2591			ISP_WRITE(isp, HCCR, HCCR_CMD_CLEAR_RISC_INT);
2592			goto command_known;
2593		}
2594	}
2595
2596	/*
2597	 * Write input parameters
2598	 */
2599	switch (inparam) {
2600	case 8: ISP_WRITE(isp, INMAILBOX7, mbp->param[7]); mbp->param[7] = 0;
2601	case 7: ISP_WRITE(isp, INMAILBOX6, mbp->param[6]); mbp->param[6] = 0;
2602	case 6: ISP_WRITE(isp, INMAILBOX5, mbp->param[5]); mbp->param[5] = 0;
2603	case 5: ISP_WRITE(isp, INMAILBOX4, mbp->param[4]); mbp->param[4] = 0;
2604	case 4: ISP_WRITE(isp, INMAILBOX3, mbp->param[3]); mbp->param[3] = 0;
2605	case 3: ISP_WRITE(isp, INMAILBOX2, mbp->param[2]); mbp->param[2] = 0;
2606	case 2: ISP_WRITE(isp, INMAILBOX1, mbp->param[1]); mbp->param[1] = 0;
2607	case 1: ISP_WRITE(isp, INMAILBOX0, mbp->param[0]); mbp->param[0] = 0;
2608	}
2609
2610	/*
2611	 * Clear semaphore on mailbox registers
2612	 */
2613	ISP_WRITE(isp, BIU_SEMA, 0);
2614
2615	/*
2616	 * Clear RISC int condition.
2617	 */
2618	ISP_WRITE(isp, HCCR, HCCR_CMD_CLEAR_RISC_INT);
2619
2620	/*
2621	 * Set Host Interrupt condition so that RISC will pick up mailbox regs.
2622	 */
2623	ISP_WRITE(isp, HCCR, HCCR_CMD_SET_HOST_INT);
2624
2625	/*
2626	 * Wait until RISC int is set, except 2100
2627	 */
2628	if ((isp->isp_type & ISP_HA_FC) == 0) {
2629		loops = MBOX_DELAY_COUNT;
2630		while ((ISP_READ(isp, BIU_ISR) & BIU_ISR_RISC_INT) == 0) {
2631			SYS_DELAY(100);
2632			if (--loops < 0) {
2633				PRINTF("%s: isp_mboxcmd timeout #2\n",
2634				    isp->isp_name);
2635				return;
2636			}
2637		}
2638	}
2639
2640	/*
2641	 * Check to make sure that the semaphore has been set.
2642	 */
2643	loops = MBOX_DELAY_COUNT;
2644	while ((ISP_READ(isp, BIU_SEMA) & 1) == 0) {
2645		SYS_DELAY(100);
2646		if (--loops < 0) {
2647			PRINTF("%s: isp_mboxcmd timeout #3\n", isp->isp_name);
2648			return;
2649		}
2650	}
2651
2652	/*
2653	 * Make sure that the MBOX_BUSY has gone away
2654	 */
2655	loops = MBOX_DELAY_COUNT;
2656	while (ISP_READ(isp, OUTMAILBOX0) == MBOX_BUSY) {
2657		SYS_DELAY(100);
2658		if (--loops < 0) {
2659			PRINTF("%s: isp_mboxcmd timeout #4\n", isp->isp_name);
2660			return;
2661		}
2662	}
2663
2664
2665	/*
2666	 * Pick up output parameters.
2667	 */
2668	switch (outparam) {
2669	case 8: mbp->param[7] = ISP_READ(isp, OUTMAILBOX7);
2670	case 7: mbp->param[6] = ISP_READ(isp, OUTMAILBOX6);
2671	case 6: mbp->param[5] = ISP_READ(isp, OUTMAILBOX5);
2672	case 5: mbp->param[4] = ISP_READ(isp, OUTMAILBOX4);
2673	case 4: mbp->param[3] = ISP_READ(isp, OUTMAILBOX3);
2674	case 3: mbp->param[2] = ISP_READ(isp, OUTMAILBOX2);
2675	case 2: mbp->param[1] = ISP_READ(isp, OUTMAILBOX1);
2676	case 1: mbp->param[0] = ISP_READ(isp, OUTMAILBOX0);
2677	}
2678
2679	/*
2680	 * Clear RISC int.
2681	 */
2682	ISP_WRITE(isp, HCCR, HCCR_CMD_CLEAR_RISC_INT);
2683
2684	/*
2685	 * Release semaphore on mailbox registers
2686	 */
2687	ISP_WRITE(isp, BIU_SEMA, 0);
2688
2689	/*
2690	 * Just to be chatty here...
2691	 */
2692	switch(mbp->param[0]) {
2693	case MBOX_COMMAND_COMPLETE:
2694		break;
2695	case MBOX_INVALID_COMMAND:
2696		IDPRINTF(2, ("%s: mbox cmd %x failed with INVALID_COMMAND\n",
2697		    isp->isp_name, opcode));
2698		break;
2699	case MBOX_HOST_INTERFACE_ERROR:
2700		PRINTF("%s: mbox cmd %x failed with HOST_INTERFACE_ERROR\n",
2701		    isp->isp_name, opcode);
2702		break;
2703	case MBOX_TEST_FAILED:
2704		PRINTF("%s: mbox cmd %x failed with TEST_FAILED\n",
2705		    isp->isp_name, opcode);
2706		break;
2707	case MBOX_COMMAND_ERROR:
2708		PRINTF("%s: mbox cmd %x failed with COMMAND_ERROR\n",
2709		    isp->isp_name, opcode);
2710		break;
2711	case MBOX_COMMAND_PARAM_ERROR:
2712		PRINTF("%s: mbox cmd %x failed with COMMAND_PARAM_ERROR\n",
2713		    isp->isp_name, opcode);
2714		break;
2715
2716	/*
2717	 * Be silent about these...
2718	 */
2719
2720	case ASYNC_LOOP_UP:
2721	case ASYNC_LIP_OCCURRED:
2722	case ASYNC_PDB_CHANGED:
2723		break;
2724
2725	default:
2726		/*
2727		 * The expected return of EXEC_FIRMWARE is zero.
2728		 */
2729		if ((opcode == MBOX_EXEC_FIRMWARE && mbp->param[0] != 0) ||
2730		    (opcode != MBOX_EXEC_FIRMWARE)) {
2731			PRINTF("%s: mbox cmd %x failed with error %x\n",
2732				isp->isp_name, opcode, mbp->param[0]);
2733		}
2734		break;
2735	}
2736}
2737
2738void
2739isp_lostcmd(isp, xs)
2740	struct ispsoftc *isp;
2741	ISP_SCSI_XFER_T *xs;
2742{
2743	mbreg_t mbs;
2744
2745	mbs.param[0] = MBOX_GET_FIRMWARE_STATUS;
2746	isp_mboxcmd(isp, &mbs);
2747	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
2748		isp_dumpregs(isp, "couldn't GET FIRMWARE STATUS");
2749		return;
2750	}
2751	if (mbs.param[1]) {
2752		PRINTF("%s: %d commands on completion queue\n",
2753		       isp->isp_name, mbs.param[1]);
2754	}
2755	if (XS_NULL(xs))
2756		return;
2757
2758	mbs.param[0] = MBOX_GET_DEV_QUEUE_STATUS;
2759	mbs.param[1] = (XS_TGT(xs) << 8) | XS_LUN(xs);
2760	isp_mboxcmd(isp, &mbs);
2761	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
2762		isp_dumpregs(isp, "couldn't GET DEVICE QUEUE STATUS");
2763		return;
2764	}
2765	PRINTF("%s: lost command for target %d lun %d, %d active of %d, "
2766		"Queue State: %x\n", isp->isp_name, XS_TGT(xs),
2767		XS_LUN(xs), mbs.param[2], mbs.param[3], mbs.param[1]);
2768
2769	isp_dumpregs(isp, "lost command");
2770	/*
2771	 * XXX: Need to try and do something to recover.
2772	 */
2773}
2774
2775static void
2776isp_dumpregs(isp, msg)
2777	struct ispsoftc *isp;
2778	const char *msg;
2779{
2780	PRINTF("%s: %s\n", isp->isp_name, msg);
2781	if (isp->isp_type & ISP_HA_SCSI)
2782		PRINTF("    biu_conf1=%x", ISP_READ(isp, BIU_CONF1));
2783	else
2784		PRINTF("    biu_csr=%x", ISP_READ(isp, BIU2100_CSR));
2785	PRINTF(" biu_icr=%x biu_isr=%x biu_sema=%x ", ISP_READ(isp, BIU_ICR),
2786	       ISP_READ(isp, BIU_ISR), ISP_READ(isp, BIU_SEMA));
2787	PRINTF("risc_hccr=%x\n", ISP_READ(isp, HCCR));
2788
2789	if (isp->isp_type & ISP_HA_SCSI) {
2790		ISP_WRITE(isp, HCCR, HCCR_CMD_PAUSE);
2791		PRINTF("    cdma_conf=%x cdma_sts=%x cdma_fifostat=%x\n",
2792			ISP_READ(isp, CDMA_CONF), ISP_READ(isp, CDMA_STATUS),
2793			ISP_READ(isp, CDMA_FIFO_STS));
2794		PRINTF("    ddma_conf=%x ddma_sts=%x ddma_fifostat=%x\n",
2795			ISP_READ(isp, DDMA_CONF), ISP_READ(isp, DDMA_STATUS),
2796			ISP_READ(isp, DDMA_FIFO_STS));
2797		PRINTF("    sxp_int=%x sxp_gross=%x sxp(scsi_ctrl)=%x\n",
2798			ISP_READ(isp, SXP_INTERRUPT),
2799			ISP_READ(isp, SXP_GROSS_ERR),
2800			ISP_READ(isp, SXP_PINS_CONTROL));
2801		ISP_WRITE(isp, HCCR, HCCR_CMD_RELEASE);
2802	}
2803	ISP_DUMPREGS(isp);
2804}
2805
2806static void
2807isp_dumpxflist(isp)
2808	struct ispsoftc *isp;
2809{
2810	volatile ISP_SCSI_XFER_T *xs;
2811	int i, hdp;
2812
2813	for (hdp = i = 0; i < RQUEST_QUEUE_LEN; i++) {
2814		xs = isp->isp_xflist[i];
2815		if (xs == NULL) {
2816			continue;
2817		}
2818		if (hdp == 0) {
2819			PRINTF("%s: active requests\n", isp->isp_name);
2820			hdp++;
2821		}
2822		PRINTF(" Active Handle %d: tgt %d lun %d dlen %d\n",
2823		    i+1, XS_TGT(xs), XS_LUN(xs), XS_XFRLEN(xs));
2824	}
2825}
2826
2827static void
2828isp_fw_state(isp)
2829	struct ispsoftc *isp;
2830{
2831	mbreg_t mbs;
2832	if (isp->isp_type & ISP_HA_FC) {
2833		int once = 0;
2834		fcparam *fcp = isp->isp_param;
2835again:
2836		mbs.param[0] = MBOX_GET_FW_STATE;
2837		isp_mboxcmd(isp, &mbs);
2838		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
2839			if (mbs.param[0] == ASYNC_LIP_OCCURRED ||
2840			    mbs.param[0] == ASYNC_PDB_CHANGED ||
2841			    mbs.param[0] == ASYNC_LOOP_UP) {
2842				if (once++ < 2) {
2843					goto again;
2844				}
2845			}
2846			isp_dumpregs(isp, "GET FIRMWARE STATE failed");
2847			return;
2848		}
2849		fcp->isp_fwstate = mbs.param[1];
2850	}
2851}
2852
2853static void
2854isp_update(isp)
2855	struct ispsoftc *isp;
2856{
2857	int tgt;
2858	mbreg_t mbs;
2859	sdparam *sdp;
2860
2861	isp->isp_update = 0;
2862
2863	if (isp->isp_type & ISP_HA_FC) {
2864		return;
2865	}
2866
2867	sdp = isp->isp_param;
2868	for (tgt = 0; tgt < MAX_TARGETS; tgt++) {
2869		if (sdp->isp_devparam[tgt].dev_enable == 0) {
2870			continue;
2871		}
2872		if (sdp->isp_devparam[tgt].dev_update == 0) {
2873			continue;
2874		}
2875
2876		mbs.param[0] = MBOX_SET_TARGET_PARAMS;
2877		mbs.param[1] = tgt << 8;
2878		mbs.param[2] = sdp->isp_devparam[tgt].dev_flags;
2879		mbs.param[3] =
2880			(sdp->isp_devparam[tgt].sync_offset << 8) |
2881			(sdp->isp_devparam[tgt].sync_period);
2882
2883		IDPRINTF(3, ("\n%s: tgt %d cflags %x offset %x period %x\n",
2884		    isp->isp_name, tgt, mbs.param[2], mbs.param[3] >> 8,
2885		    mbs.param[3] & 0xff));
2886
2887		isp_mboxcmd(isp, &mbs);
2888		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
2889			PRINTF("%s: failed to change SCSI parameters for "
2890			    "target %d\n", isp->isp_name, tgt);
2891		} else {
2892			char *wt;
2893			int x, flags;
2894
2895			flags = sdp->isp_devparam[tgt].cur_dflags =
2896			    sdp->isp_devparam[tgt].dev_flags;
2897
2898			x = sdp->isp_devparam[tgt].sync_period & 0xff;
2899			if (flags & DPARM_SYNC) {
2900				if (x == (ISP_20M_SYNCPARMS & 0xff)) {
2901					x = 20;
2902				} else if (x == (ISP_10M_SYNCPARMS & 0xff)) {
2903					x = 10;
2904				} else if (x == (ISP_08M_SYNCPARMS & 0xff)) {
2905					x = 8;
2906				} else if (x == (ISP_05M_SYNCPARMS & 0xff)) {
2907					x = 5;
2908				} else if (x == (ISP_04M_SYNCPARMS & 0xff)) {
2909					x = 4;
2910				} else {
2911					x = 0;
2912				}
2913			} else {
2914				x = 0;
2915			}
2916			switch (flags & (DPARM_WIDE|DPARM_TQING)) {
2917			case DPARM_WIDE:
2918				wt = ", 16 bit wide\n";
2919				break;
2920			case DPARM_TQING:
2921				wt = ", Tagged Queueing Enabled\n";
2922				break;
2923			case DPARM_WIDE|DPARM_TQING:
2924				wt = ", 16 bit wide, Tagged Queueing Enabled\n";
2925				break;
2926
2927			default:
2928				wt = "\n";
2929				break;
2930			}
2931			if (x) {
2932				IDPRINTF(3, ("%s: Target %d maximum Sync Mode "
2933				    "at %dMHz%s", isp->isp_name, tgt, x, wt));
2934			} else {
2935				IDPRINTF(3, ("%s: Target %d Async Mode%s",
2936				    isp->isp_name, tgt, wt));
2937			}
2938		}
2939		sdp->isp_devparam[tgt].dev_update = 0;
2940	}
2941}
2942
2943static void
2944isp_setdfltparm(isp)
2945	struct ispsoftc *isp;
2946{
2947	int i, use_nvram;
2948	mbreg_t mbs;
2949	sdparam *sdp;
2950
2951	/*
2952	 * Been there, done that, got the T-shirt...
2953	 */
2954	if (isp->isp_gotdparms) {
2955		IDPRINTF(3, ("%s: already have dparms\n", isp->isp_name));
2956		return;
2957	}
2958	isp->isp_gotdparms = 1;
2959
2960	use_nvram = (isp_read_nvram(isp) == 0);
2961	if (use_nvram) {
2962		return;
2963	}
2964	if (isp->isp_type & ISP_HA_FC) {
2965		fcparam *fcp = (fcparam *) isp->isp_param;
2966		fcp->isp_maxfrmlen = ICB_DFLT_FRMLEN;
2967		fcp->isp_maxalloc = 256;
2968		fcp->isp_execthrottle = 16;
2969		fcp->isp_retry_delay = 5;
2970		fcp->isp_retry_count = 0;
2971		/*
2972		 * It would be nice to fake up a WWN in case we don't
2973		 * get one out of NVRAM. Solaris does this for SOCAL
2974		 * cards that don't have SBus properties- it sets up
2975		 * a WWN based upon the system MAC Address.
2976		 */
2977		fcp->isp_wwn = 0;
2978		return;
2979	}
2980
2981	sdp = (sdparam *) isp->isp_param;
2982	mbs.param[0] = MBOX_GET_ACT_NEG_STATE;
2983	isp_mboxcmd(isp, &mbs);
2984	if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
2985		IDPRINTF(2, ("could not GET ACT NEG STATE\n"));
2986		sdp->isp_req_ack_active_neg = 1;
2987		sdp->isp_data_line_active_neg = 1;
2988	} else {
2989		sdp->isp_req_ack_active_neg = (mbs.param[1] >> 4) & 0x1;
2990		sdp->isp_data_line_active_neg = (mbs.param[1] >> 5) & 0x1;
2991	}
2992	for (i = 0; i < MAX_TARGETS; i++) {
2993
2994		mbs.param[0] = MBOX_GET_TARGET_PARAMS;
2995		mbs.param[1] = i << 8;
2996		isp_mboxcmd(isp, &mbs);
2997		if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
2998			PRINTF("%s: can't get SCSI parameters for target %d\n",
2999			    isp->isp_name, i);
3000			sdp->isp_devparam[i].sync_period = 0;
3001			sdp->isp_devparam[i].sync_offset = 0;
3002			sdp->isp_devparam[i].dev_flags = DPARM_SAFE_DFLT;
3003			continue;
3004		}
3005		sdp->isp_devparam[i].dev_flags = mbs.param[2];
3006
3007		/*
3008		 * The maximum period we can really see
3009		 * here is 100 (decimal), or 400 ns.
3010		 * For some unknown reason we sometimes
3011		 * get back wildass numbers from the
3012		 * boot device's parameters.
3013		 *
3014		 * XXX: Hmm- this may be based on a different
3015		 * XXX: clock rate.
3016		 */
3017		if ((mbs.param[3] & 0xff) <= 0x64) {
3018			sdp->isp_devparam[i].sync_period = mbs.param[3] & 0xff;
3019			sdp->isp_devparam[i].sync_offset = mbs.param[3] >> 8;
3020		}
3021
3022		/*
3023		 * It is not safe to run Ultra Mode with a clock < 60.
3024		 */
3025		if (((sdp->isp_clock && sdp->isp_clock < 60) ||
3026		    (isp->isp_type < ISP_HA_SCSI_1020A)) &&
3027		    (sdp->isp_devparam[i].sync_period ==
3028		    (ISP_20M_SYNCPARMS & 0xff))) {
3029			sdp->isp_devparam[i].sync_offset =
3030				ISP_10M_SYNCPARMS >> 8;
3031			sdp->isp_devparam[i].sync_period =
3032				ISP_10M_SYNCPARMS & 0xff;
3033		}
3034
3035	}
3036
3037	/*
3038	 * Set Default Host Adapter Parameters
3039	 */
3040	sdp->isp_cmd_dma_burst_enable = 1;
3041	sdp->isp_data_dma_burst_enabl = 1;
3042	sdp->isp_fifo_threshold = 0;
3043	sdp->isp_initiator_id = 7;
3044	if (isp->isp_type >= ISP_HA_SCSI_1040) {
3045		sdp->isp_async_data_setup = 9;
3046	} else {
3047		sdp->isp_async_data_setup = 6;
3048	}
3049	sdp->isp_selection_timeout = 250;
3050	sdp->isp_max_queue_depth = 128;
3051	sdp->isp_tag_aging = 8;
3052	sdp->isp_bus_reset_delay = 3;
3053	sdp->isp_retry_count = 0;
3054	sdp->isp_retry_delay = 1;
3055
3056	for (i = 0; i < MAX_TARGETS; i++) {
3057		sdp->isp_devparam[i].exc_throttle = 16;
3058		sdp->isp_devparam[i].dev_enable = 1;
3059	}
3060}
3061
3062/*
3063 * Re-initialize the ISP and complete all orphaned commands
3064 * with a 'botched' notice.
3065 *
3066 * Locks held prior to coming here.
3067 */
3068
3069void
3070isp_restart(isp)
3071	struct ispsoftc *isp;
3072{
3073	ISP_SCSI_XFER_T *tlist[RQUEST_QUEUE_LEN], *xs;
3074	int i;
3075
3076	for (i = 0; i < RQUEST_QUEUE_LEN; i++) {
3077		tlist[i] = (ISP_SCSI_XFER_T *) isp->isp_xflist[i];
3078		isp->isp_xflist[i] = NULL;
3079	}
3080	isp_reset(isp);
3081	if (isp->isp_state == ISP_RESETSTATE) {
3082		isp_init(isp);
3083		if (isp->isp_state == ISP_INITSTATE) {
3084			isp->isp_state = ISP_RUNSTATE;
3085		}
3086	}
3087	if (isp->isp_state != ISP_RUNSTATE) {
3088		PRINTF("%s: isp_restart cannot restart ISP\n", isp->isp_name);
3089	}
3090
3091	for (i = 0; i < RQUEST_QUEUE_LEN; i++) {
3092		xs = tlist[i];
3093		if (XS_NULL(xs)) {
3094			continue;
3095		}
3096		if (isp->isp_nactive > 0)
3097		    isp->isp_nactive--;
3098		XS_RESID(xs) = XS_XFRLEN(xs);
3099		XS_SETERR(xs, HBA_BUSRESET);
3100		XS_CMD_DONE(xs);
3101	}
3102}
3103
3104void
3105isp_watch(arg)
3106	void *arg;
3107{
3108	int i;
3109	struct ispsoftc *isp = arg;
3110	ISP_SCSI_XFER_T *xs;
3111	ISP_LOCKVAL_DECL;
3112
3113	/*
3114	 * Look for completely dead commands (but not polled ones).
3115	 */
3116	ISP_ILOCK(isp);
3117	for (i = 0; i < RQUEST_QUEUE_LEN; i++) {
3118		if ((xs = (ISP_SCSI_XFER_T *) isp->isp_xflist[i]) == NULL) {
3119			continue;
3120		}
3121		if (XS_TIME(xs) == 0) {
3122			continue;
3123		}
3124		XS_TIME(xs) -= (WATCH_INTERVAL * 1000);
3125		/*
3126		 * Avoid later thinking that this
3127		 * transaction is not being timed.
3128		 * Then give ourselves to watchdog
3129		 * periods of grace.
3130		 */
3131		if (XS_TIME(xs) == 0)
3132			XS_TIME(xs) = 1;
3133		else if (XS_TIME(xs) > -(2 * WATCH_INTERVAL * 1000)) {
3134			continue;
3135		}
3136		if (isp_control(isp, ISPCTL_ABORT_CMD, xs)) {
3137			PRINTF("%s: isp_watch failed to abort command\n",
3138			    isp->isp_name);
3139			isp_restart(isp);
3140			break;
3141		}
3142	}
3143	ISP_IUNLOCK(isp);
3144	RESTART_WATCHDOG(isp_watch, isp);
3145}
3146
3147/*
3148 * Miscellaneous debug statements.
3149 */
3150static void
3151isp_prtstst(sp)
3152	ispstatusreq_t *sp;
3153{
3154	PRINTF("states->");
3155	if (sp->req_state_flags & RQSF_GOT_BUS)
3156		PRINTF("GOT_BUS ");
3157	if (sp->req_state_flags & RQSF_GOT_TARGET)
3158		PRINTF("GOT_TGT ");
3159	if (sp->req_state_flags & RQSF_SENT_CDB)
3160		PRINTF("SENT_CDB ");
3161	if (sp->req_state_flags & RQSF_XFRD_DATA)
3162		PRINTF("XFRD_DATA ");
3163	if (sp->req_state_flags & RQSF_GOT_STATUS)
3164		PRINTF("GOT_STS ");
3165	if (sp->req_state_flags & RQSF_GOT_SENSE)
3166		PRINTF("GOT_SNS ");
3167	if (sp->req_state_flags & RQSF_XFER_COMPLETE)
3168		PRINTF("XFR_CMPLT ");
3169	PRINTF("\n");
3170	PRINTF("status->");
3171	if (sp->req_status_flags & RQSTF_DISCONNECT)
3172		PRINTF("Disconnect ");
3173	if (sp->req_status_flags & RQSTF_SYNCHRONOUS)
3174		PRINTF("Sync_xfr ");
3175	if (sp->req_status_flags & RQSTF_PARITY_ERROR)
3176		PRINTF("Parity ");
3177	if (sp->req_status_flags & RQSTF_BUS_RESET)
3178		PRINTF("Bus_Reset ");
3179	if (sp->req_status_flags & RQSTF_DEVICE_RESET)
3180		PRINTF("Device_Reset ");
3181	if (sp->req_status_flags & RQSTF_ABORTED)
3182		PRINTF("Aborted ");
3183	if (sp->req_status_flags & RQSTF_TIMEOUT)
3184		PRINTF("Timeout ");
3185	if (sp->req_status_flags & RQSTF_NEGOTIATION)
3186		PRINTF("Negotiation ");
3187	PRINTF("\n");
3188}
3189
3190static char *
3191isp2100_fw_statename(state)
3192	int state;
3193{
3194	switch(state) {
3195	case FW_CONFIG_WAIT:	return "Config Wait";
3196	case FW_WAIT_AL_PA:	return "Waiting for AL/PA";
3197	case FW_WAIT_LOGIN:	return "Wait Login";
3198	case FW_READY:		return "Ready";
3199	case FW_LOSS_OF_SYNC:	return "Loss Of Sync";
3200	case FW_ERROR:		return "Error";
3201	case FW_REINIT:		return "Re-Init";
3202	case FW_NON_PART:	return "Nonparticipating";
3203	default:		return "eh?";
3204	}
3205}
3206
3207/*
3208 * NVRAM Routines
3209 */
3210
3211static int
3212isp_read_nvram(isp)
3213	struct ispsoftc *isp;
3214{
3215	int i, amt;
3216	u_int8_t csum, minversion;
3217	union {
3218		u_int8_t _x[ISP2100_NVRAM_SIZE];
3219		u_int16_t _s[ISP2100_NVRAM_SIZE>>1];
3220	} _n;
3221#define	nvram_data	_n._x
3222#define	nvram_words	_n._s
3223
3224	if (isp->isp_type & ISP_HA_FC) {
3225		amt = ISP2100_NVRAM_SIZE;
3226		minversion = 1;
3227	} else {
3228		amt = ISP_NVRAM_SIZE;
3229		minversion = 2;
3230	}
3231
3232	/*
3233	 * Just read the first two words first to see if we have a valid
3234	 * NVRAM to continue reading the rest with.
3235	 */
3236	for (i = 0; i < 2; i++) {
3237		isp_rdnvram_word(isp, i, &nvram_words[i]);
3238	}
3239	if (nvram_data[0] != 'I' || nvram_data[1] != 'S' ||
3240	    nvram_data[2] != 'P') {
3241		if (isp->isp_bustype != ISP_BT_SBUS) {
3242			PRINTF("%s: invalid NVRAM header\n", isp->isp_name);
3243		}
3244		return (-1);
3245	}
3246	for (i = 2; i < amt>>1; i++) {
3247		isp_rdnvram_word(isp, i, &nvram_words[i]);
3248	}
3249	for (csum = 0, i = 0; i < amt; i++) {
3250		csum += nvram_data[i];
3251	}
3252	if (csum != 0) {
3253		PRINTF("%s: invalid NVRAM checksum\n", isp->isp_name);
3254		return (-1);
3255	}
3256	if (ISP_NVRAM_VERSION(nvram_data) < minversion) {
3257		PRINTF("%s: version %d NVRAM not understood\n", isp->isp_name,
3258		    ISP_NVRAM_VERSION(nvram_data));
3259		return (-1);
3260	}
3261
3262	if (isp->isp_type & ISP_HA_SCSI) {
3263		sdparam *sdp = (sdparam *) isp->isp_param;
3264
3265		/* XXX CHECK THIS FOR SANITY XXX */
3266		sdp->isp_fifo_threshold =
3267			ISP_NVRAM_FIFO_THRESHOLD(nvram_data);
3268
3269		sdp->isp_initiator_id =
3270			ISP_NVRAM_INITIATOR_ID(nvram_data);
3271
3272		sdp->isp_bus_reset_delay =
3273			ISP_NVRAM_BUS_RESET_DELAY(nvram_data);
3274
3275		sdp->isp_retry_count =
3276			ISP_NVRAM_BUS_RETRY_COUNT(nvram_data);
3277
3278		sdp->isp_retry_delay =
3279			ISP_NVRAM_BUS_RETRY_DELAY(nvram_data);
3280
3281		sdp->isp_async_data_setup =
3282			ISP_NVRAM_ASYNC_DATA_SETUP_TIME(nvram_data);
3283
3284		if (isp->isp_type >= ISP_HA_SCSI_1040) {
3285			if (sdp->isp_async_data_setup < 9) {
3286				sdp->isp_async_data_setup = 9;
3287			}
3288		} else {
3289			if (sdp->isp_async_data_setup != 6) {
3290				sdp->isp_async_data_setup = 6;
3291			}
3292		}
3293
3294		sdp->isp_req_ack_active_neg =
3295			ISP_NVRAM_REQ_ACK_ACTIVE_NEGATION(nvram_data);
3296
3297		sdp->isp_data_line_active_neg =
3298			ISP_NVRAM_DATA_LINE_ACTIVE_NEGATION(nvram_data);
3299
3300		sdp->isp_data_dma_burst_enabl =
3301			ISP_NVRAM_DATA_DMA_BURST_ENABLE(nvram_data);
3302
3303		sdp->isp_cmd_dma_burst_enable =
3304			ISP_NVRAM_CMD_DMA_BURST_ENABLE(nvram_data);
3305
3306		sdp->isp_tag_aging =
3307			ISP_NVRAM_TAG_AGE_LIMIT(nvram_data);
3308
3309		/* XXX ISP_NVRAM_FIFO_THRESHOLD_128 XXX */
3310
3311		sdp->isp_selection_timeout =
3312			ISP_NVRAM_SELECTION_TIMEOUT(nvram_data);
3313
3314		sdp->isp_max_queue_depth =
3315			ISP_NVRAM_MAX_QUEUE_DEPTH(nvram_data);
3316
3317		sdp->isp_fast_mttr = ISP_NVRAM_FAST_MTTR_ENABLE(nvram_data);
3318
3319		for (i = 0; i < 16; i++) {
3320			sdp->isp_devparam[i].dev_enable =
3321				ISP_NVRAM_TGT_DEVICE_ENABLE(nvram_data, i);
3322			sdp->isp_devparam[i].exc_throttle =
3323				ISP_NVRAM_TGT_EXEC_THROTTLE(nvram_data, i);
3324			sdp->isp_devparam[i].sync_offset =
3325				ISP_NVRAM_TGT_SYNC_OFFSET(nvram_data, i);
3326			sdp->isp_devparam[i].sync_period =
3327				ISP_NVRAM_TGT_SYNC_PERIOD(nvram_data, i);
3328
3329			if (isp->isp_type < ISP_HA_SCSI_1040) {
3330				/*
3331				 * If we're not ultra, we can't possibly
3332				 * be a shorter period than this.
3333				 */
3334				if (sdp->isp_devparam[i].sync_period < 0x19) {
3335					sdp->isp_devparam[i].sync_period =
3336					    0x19;
3337				}
3338				if (sdp->isp_devparam[i].sync_offset > 0xc) {
3339					sdp->isp_devparam[i].sync_offset =
3340					    0x0c;
3341				}
3342			} else {
3343				if (sdp->isp_devparam[i].sync_offset > 0x8) {
3344					sdp->isp_devparam[i].sync_offset = 0x8;
3345				}
3346			}
3347
3348			sdp->isp_devparam[i].dev_flags = 0;
3349
3350			if (ISP_NVRAM_TGT_RENEG(nvram_data, i))
3351				sdp->isp_devparam[i].dev_flags |= DPARM_RENEG;
3352			if (ISP_NVRAM_TGT_QFRZ(nvram_data, i)) {
3353				PRINTF("%s: not supporting QFRZ option for "
3354				    "target %d\n", isp->isp_name, i);
3355			}
3356			sdp->isp_devparam[i].dev_flags |= DPARM_ARQ;
3357			if (ISP_NVRAM_TGT_ARQ(nvram_data, i) == 0) {
3358				PRINTF("%s: not disabling ARQ option for "
3359				    "target %d\n", isp->isp_name, i);
3360			}
3361			if (ISP_NVRAM_TGT_TQING(nvram_data, i))
3362				sdp->isp_devparam[i].dev_flags |= DPARM_TQING;
3363			if (ISP_NVRAM_TGT_SYNC(nvram_data, i))
3364				sdp->isp_devparam[i].dev_flags |= DPARM_SYNC;
3365			if (ISP_NVRAM_TGT_WIDE(nvram_data, i))
3366				sdp->isp_devparam[i].dev_flags |= DPARM_WIDE;
3367			if (ISP_NVRAM_TGT_PARITY(nvram_data, i))
3368				sdp->isp_devparam[i].dev_flags |= DPARM_PARITY;
3369			if (ISP_NVRAM_TGT_DISC(nvram_data, i))
3370				sdp->isp_devparam[i].dev_flags |= DPARM_DISC;
3371		}
3372	} else {
3373		fcparam *fcp = (fcparam *) isp->isp_param;
3374		union {
3375			struct {
3376#if	BYTE_ORDER == BIG_ENDIAN
3377				u_int32_t hi32;
3378				u_int32_t lo32;
3379#else
3380				u_int32_t lo32;
3381				u_int32_t hi32;
3382#endif
3383			} wds;
3384			u_int64_t full64;
3385		} wwnstore;
3386
3387		wwnstore.full64 = ISP2100_NVRAM_NODE_NAME(nvram_data);
3388		PRINTF("%s: Adapter WWN 0x%08x%08x\n", isp->isp_name,
3389		    wwnstore.wds.hi32, wwnstore.wds.lo32);
3390		fcp->isp_wwn = wwnstore.full64;
3391		wwnstore.full64 = ISP2100_NVRAM_BOOT_NODE_NAME(nvram_data);
3392		if (wwnstore.full64 != 0) {
3393			PRINTF("%s: BOOT DEVICE WWN 0x%08x%08x\n",
3394			    isp->isp_name, wwnstore.wds.hi32,
3395			    wwnstore.wds.lo32);
3396		}
3397		fcp->isp_maxalloc =
3398			ISP2100_NVRAM_MAXIOCBALLOCATION(nvram_data);
3399		fcp->isp_maxfrmlen =
3400			ISP2100_NVRAM_MAXFRAMELENGTH(nvram_data);
3401		fcp->isp_retry_delay =
3402			ISP2100_NVRAM_RETRY_DELAY(nvram_data);
3403		fcp->isp_retry_count =
3404			ISP2100_NVRAM_RETRY_COUNT(nvram_data);
3405		fcp->isp_loopid =
3406			ISP2100_NVRAM_HARDLOOPID(nvram_data);
3407		fcp->isp_execthrottle =
3408			ISP2100_NVRAM_EXECUTION_THROTTLE(nvram_data);
3409	}
3410	return (0);
3411}
3412
3413static void
3414isp_rdnvram_word(isp, wo, rp)
3415	struct ispsoftc *isp;
3416	int wo;
3417	u_int16_t *rp;
3418{
3419	int i, cbits;
3420	u_int16_t bit, rqst;
3421
3422	ISP_WRITE(isp, BIU_NVRAM, BIU_NVRAM_SELECT);
3423	SYS_DELAY(2);
3424	ISP_WRITE(isp, BIU_NVRAM, BIU_NVRAM_SELECT|BIU_NVRAM_CLOCK);
3425	SYS_DELAY(2);
3426
3427	if (isp->isp_type & ISP_HA_FC) {
3428		wo &= ((ISP2100_NVRAM_SIZE >> 1) - 1);
3429		rqst = (ISP_NVRAM_READ << 8) | wo;
3430		cbits = 10;
3431	} else {
3432		wo &= ((ISP_NVRAM_SIZE >> 1) - 1);
3433		rqst = (ISP_NVRAM_READ << 6) | wo;
3434		cbits = 8;
3435	}
3436
3437	/*
3438	 * Clock the word select request out...
3439	 */
3440	for (i = cbits; i >= 0; i--) {
3441		if ((rqst >> i) & 1) {
3442			bit = BIU_NVRAM_SELECT | BIU_NVRAM_DATAOUT;
3443		} else {
3444			bit = BIU_NVRAM_SELECT;
3445		}
3446		ISP_WRITE(isp, BIU_NVRAM, bit);
3447		SYS_DELAY(2);
3448		ISP_WRITE(isp, BIU_NVRAM, bit | BIU_NVRAM_CLOCK);
3449		SYS_DELAY(2);
3450		ISP_WRITE(isp, BIU_NVRAM, bit);
3451		SYS_DELAY(2);
3452	}
3453	/*
3454	 * Now read the result back in (bits come back in MSB format).
3455	 */
3456	*rp = 0;
3457	for (i = 0; i < 16; i++) {
3458		u_int16_t rv;
3459		*rp <<= 1;
3460		ISP_WRITE(isp, BIU_NVRAM, BIU_NVRAM_SELECT|BIU_NVRAM_CLOCK);
3461		SYS_DELAY(2);
3462		rv = ISP_READ(isp, BIU_NVRAM);
3463		if (rv & BIU_NVRAM_DATAIN) {
3464			*rp |= 1;
3465		}
3466		SYS_DELAY(2);
3467		ISP_WRITE(isp, BIU_NVRAM, BIU_NVRAM_SELECT);
3468		SYS_DELAY(2);
3469	}
3470	ISP_WRITE(isp, BIU_NVRAM, 0);
3471	SYS_DELAY(2);
3472#if	BYTE_ORDER == BIG_ENDIAN
3473	*rp = ((*rp >> 8) | ((*rp & 0xff) << 8));
3474#endif
3475}
3476