xref: /netbsd-src/sys/dev/ic/aic7xxx.c (revision ace896fac114f559f7469472324fbe68bbe378e5)
1 /*	$NetBSD: aic7xxx.c,v 1.26 1997/10/09 02:17:36 jtk Exp $	*/
2 
3 /*
4  * Generic driver for the aic7xxx based adaptec SCSI controllers
5  * Product specific probe and attach routines can be found in:
6  * i386/eisa/aic7770.c	27/284X and aic7770 motherboard controllers
7  * pci/aic7870.c	3940, 2940, aic7880, aic7870 and aic7850 controllers
8  *
9  * Copyright (c) 1994, 1995, 1996 Justin T. Gibbs.
10  * All rights reserved.
11  *
12  * Redistribution and use in source and binary forms, with or without
13  * modification, are permitted provided that the following conditions
14  * are met:
15  * 1. Redistributions of source code must retain the above copyright
16  *    notice immediately at the beginning of the file, without modification,
17  *    this list of conditions, and the following disclaimer.
18  * 2. Redistributions in binary form must reproduce the above copyright
19  *    notice, this list of conditions and the following disclaimer in the
20  *    documentation and/or other materials provided with the distribution.
21  * 3. The name of the author may not be used to endorse or promote products
22  *    derived from this software without specific prior written permission.
23  *
24  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
25  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
28  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34  * SUCH DAMAGE.
35  *
36  * from Id: aic7xxx.c,v 1.75 1996/06/23 20:02:37 gibbs Exp
37  */
38 /*
39  * TODO:
40  *	Implement Target Mode
41  *
42  * A few notes on how SCB paging works...
43  *
44  * SCB paging takes advantage of the fact that devices stay disconnected
45  * from the bus a relatively long time and that while they're disconnected,
46  * having the SCBs for that device down on the host adapter is of little use.
47  * Instead we copy the SCB back up into kernel memory and reuse the SCB slot
48  * on the card to schedule another transaction.  This can be a real payoff
49  * when doing random I/O to tagged queueing devices since there are more
50  * transactions active at once for the device to sort for optimal seek
51  * reduction. The algorithm goes like this...
52  *
53  * At the sequencer level:
54  * 1) Disconnected SCBs are threaded onto a doubly linked list, headed by
55  *    DISCONNECTED_SCBH using the SCB_NEXT and SCB_PREV fields.  The most
56  *    recently disconnected device is always at the head.
57  *
58  * 2) The SCB has an added field SCB_TAG that corresponds to the kernel
59  *    SCB number (ie 0-254).
60  *
61  * 3) When a command is queued, the hardware index of the SCB it was downloaded
62  *    into is placed into the QINFIFO for easy indexing by the sequencer.
63  *
64  * 4) The tag field is used as the tag for tagged-queueing, for determining
65  *    the related kernel SCB, and is the value put into the QOUTFIFO
66  *    so the kernel doesn't have to upload the SCB to determine the kernel SCB
67  *    that completed on command completes.
68  *
69  * 5) When a reconnect occurs, the sequencer must scan the SCB array (even
70  *    in the tag case) looking for the appropriate SCB and if it can't find
71  *    it, it interrupts the kernel so it can page the SCB in.
72  *
73  * 6) If the sequencer is successful in finding the SCB, it removes it from
74  *    the doubly linked list of disconnected SCBS.
75  *
76  * At the kernel level:
77  * 1) There are four queues that a kernel SCB may reside on:
78  *	free_scbs - SCBs that are not in use and have a hardware slot assigned
79  *		    to them.
80  *      page_scbs - SCBs that are not in use and need to have a hardware slot
81  *		    assigned to them (i.e. they will most likely cause a page
82  *		    out event).
83  *	waiting_scbs - SCBs that are active, don't have an assigned hardware
84  *		    slot assigned to them and are waiting for either a
85  *		    disconnection or a command complete to free up a slot.
86  *	assigned_scbs - SCBs that were in the waiting_scbs queue, but were
87  *		    assigned a slot by ahc_free_scb.
88  *
89  * 2) When a new request comes in, an SCB is allocated from the free_scbs or
90  *    page_scbs queue with preference to SCBs on the free_scbs queue.
91  *
92  * 3) If there are no free slots (we retrieved the SCB off of the page_scbs
93  *    queue), the SCB is inserted onto the tail of the waiting_scbs list and
94  *    we attempt to run this queue down.
95  *
96  * 4) ahc_run_waiting_queues() looks at both the assigned_scbs and waiting_scbs
97  *    queues.  In the case of the assigned_scbs, the commands are immediately
98  *    downloaded and started.  For waiting_scbs, we page in all that we can
99  *    ensuring we don't create a resource deadlock (see comments in
100  *    ahc_run_waiting_queues()).
101  *
102  * 5) After we handle a bunch of command completes, we also try running the
103  *    queues since many SCBs may have disconnected since the last command
104  *    was started and we have at least one free slot on the card.
105  *
106  * 6) ahc_free_scb looks at the waiting_scbs queue for a transaction
107  *    requiring a slot and moves it to the assigned_scbs queue if it
108  *    finds one.  Otherwise it puts the current SCB onto the free_scbs
109  *    queue for later use.
110  *
111  * 7) The driver handles page-in requests from the sequencer in response to
112  *    the NO_MATCH sequencer interrupt.  For tagged commands, the appropriate
113  *    SCB is easily found since the tag is a direct index into our kernel SCB
114  *    array.  For non-tagged commands, we keep a separate array of 16 pointers
115  *    that point to the single possible SCB that was paged out for that target.
116  */
117 
118 #include <sys/param.h>
119 #include <sys/systm.h>
120 #if defined(__NetBSD__)
121 #include <sys/device.h>
122 #include <machine/bus.h>
123 #include <machine/intr.h>
124 #endif /* defined(__NetBSD__) */
125 
126 #include <sys/malloc.h>
127 #include <sys/buf.h>
128 #include <sys/proc.h>
129 
130 #include <dev/scsipi/scsi_all.h>
131 #include <dev/scsipi/scsipi_all.h>
132 #include <dev/scsipi/scsi_message.h>
133 #if defined(__NetBSD__)
134 #include <dev/scsipi/scsipi_debug.h>
135 #endif
136 #include <dev/scsipi/scsiconf.h>
137 
138 #if defined(__FreeBSD__)
139 #include <machine/clock.h>
140 #endif
141 
142 #include <vm/vm.h>
143 #include <vm/vm_param.h>
144 #include <vm/pmap.h>
145 
146 #if defined(__FreeBSD__)
147 #include <i386/scsi/aic7xxx.h>
148 
149 #include <dev/aic7xxx/aic7xxx_reg.h>
150 #endif /* defined(__FreeBSD__) */
151 
152 #if defined(__NetBSD__)
153 #include <dev/ic/aic7xxxreg.h>
154 #include <dev/ic/aic7xxxvar.h>
155 
156 #define bootverbose	1
157 
158 #define AIC_SCSI_TARGET scsipi_scsi.target
159 #define AIC_SCSI_LUN scsipi_scsi.lun
160 #define AIC_SCSI_SENSE sense.scsi_sense
161 
162 #define DEBUGTARG	DEBUGTARGET
163 #if DEBUGTARG < 0	/* Negative numbers for disabling cause warnings */
164 #undef DEBUGTARG
165 #define DEBUGTARG	17
166 #endif
167 #ifdef alpha		/* XXX */
168 /* XXX XXX NEED REAL DMA MAPPING SUPPORT XXX XXX */
169 extern vm_offset_t alpha_XXX_dmamap(vm_offset_t);
170 #undef vtophys
171 #define	vtophys(va)	alpha_XXX_dmamap((vm_offset_t) va)
172 #endif	/* alpha */
173 #endif /* defined(__NetBSD__) */
174 
175 #include <sys/kernel.h>
176 #define KVTOPHYS(x)   vtophys(x)
177 
178 #define MIN(a,b) ((a < b) ? a : b)
179 #define ALL_TARGETS -1
180 
181 #if defined(__FreeBSD__)
182 u_long ahc_unit = 0;
183 #define AIC_SCSI_TARGET target
184 #define AIC_SCSI_LUN lun
185 #define AIC_SCSI_SENSE scsi_sence
186 #endif
187 
188 #ifdef AHC_DEBUG
189 static int     ahc_debug = AHC_DEBUG;
190 #endif
191 
192 #ifdef AHC_BROKEN_CACHE
193 int ahc_broken_cache = 1;
194 
195 /*
196  * "wbinvd" cause writing back whole cache (both CPU internal & external)
197  * to memory, so that the instruction takes a lot of time.
198  * This makes machine slow.
199  */
200 #define	INVALIDATE_CACHE()	__asm __volatile("wbinvd")
201 #endif
202 
203 /**** bit definitions for SCSIDEF ****/
204 #define	HSCSIID		0x07		/* our SCSI ID */
205 #define HWSCSIID	0x0f		/* our SCSI ID if Wide Bus */
206 
207 static void	 ahcminphys __P((struct buf *bp));
208 static int32_t	 ahc_scsi_cmd __P((struct scsipi_xfer *xs));
209 static inline void pause_sequencer __P((struct ahc_data *ahc));
210 static inline void unpause_sequencer __P((struct ahc_data *ahc,
211 					  int unpause_always));
212 static inline void restart_sequencer __P((struct ahc_data *ahc));
213 
214 static struct scsipi_adapter ahc_switch =
215 {
216         ahc_scsi_cmd,
217         ahcminphys,
218         0,
219         0,
220 #if defined(__FreeBSD__)
221         0,
222         "ahc",
223         { 0, 0 }
224 #endif
225 };
226 
227 /* the below structure is so we have a default dev struct for our link struct */
228 static struct scsipi_device ahc_dev =
229 {
230     NULL,                       /* Use default error handler */
231     NULL,                       /* have a queue, served by this */
232     NULL,                       /* have no async handler */
233     NULL,                       /* Use default 'done' routine */
234 #if defined(__FreeBSD__)
235     "ahc",
236     0,
237     { 0, 0 }
238 #endif
239 };
240 
241 static inline void
242 pause_sequencer(ahc)
243 	struct ahc_data *ahc;
244 {
245 	AHC_OUTB(ahc, HCNTRL, ahc->pause);
246 
247 	/*
248 	 * Since the sequencer can disable pausing in a critical section, we
249 	 * must loop until it actually stops.
250 	 */
251 	while ((AHC_INB(ahc, HCNTRL) & PAUSE) == 0)
252 		;
253 }
254 
255 static inline void
256 unpause_sequencer(ahc, unpause_always)
257 	struct ahc_data *ahc;
258 	int unpause_always;
259 {
260 	if (unpause_always
261 	 ||(AHC_INB(ahc, INTSTAT) & (SCSIINT | SEQINT | BRKADRINT)) == 0)
262 		AHC_OUTB(ahc, HCNTRL, ahc->unpause);
263 }
264 
265 /*
266  * Restart the sequencer program from address zero
267  */
268 static inline void
269 restart_sequencer(ahc)
270 	struct ahc_data *ahc;
271 {
272 	do {
273 		AHC_OUTB(ahc, SEQCTL, SEQRESET|FASTMODE);
274 	} while((AHC_INB(ahc, SEQADDR0) != 0)
275 		|| (AHC_INB(ahc, SEQADDR1) != 0));
276 
277 	unpause_sequencer(ahc, /*unpause_always*/TRUE);
278 }
279 
280 #if defined(__NetBSD__)
281 /*
282  * Is device which is pointed by sc_link connected on second scsi bus ?
283  */
284 #define	IS_SCSIBUS_B(ahc, sc_link)	\
285 	((sc_link)->scsipi_scsi.scsibus == (ahc)->sc_link_b.scsipi_scsi.scsibus)
286 
287 /*
288  * convert FreeBSD's SCSI symbols to NetBSD's
289  */
290 #define	SCSI_NOMASK	SCSI_POLL
291 #define	opennings	openings
292 #endif
293 
294 static u_char	ahc_abort_wscb __P((struct ahc_data *ahc, struct scb *scbp,
295 				    u_char prev,
296 				    u_char timedout_scb, u_int32_t xs_error));
297 static void	ahc_add_waiting_scb __P((struct ahc_data *ahc,
298 					 struct scb *scb));
299 static void	ahc_done __P((struct ahc_data *ahc, struct scb *scbp));
300 static void	ahc_free_scb __P((struct ahc_data *ahc, struct scb *scb,
301 				  int flags));
302 static inline void ahc_send_scb __P((struct ahc_data *ahc, struct scb *scb));
303 static inline void ahc_fetch_scb __P((struct ahc_data *ahc, struct scb *scb));
304 static inline void ahc_page_scb __P((struct ahc_data *ahc, struct scb *out_scb,
305 				struct scb *in_scb));
306 static inline void ahc_run_waiting_queues __P((struct ahc_data *ahc));
307 static void	ahc_handle_seqint __P((struct ahc_data *ahc, u_int8_t intstat));
308 static struct scb *
309 		ahc_get_scb __P((struct ahc_data *ahc, int flags));
310 static void	ahc_loadseq __P((struct ahc_data *ahc));
311 static int	ahc_match_scb __P((struct scb *scb, int target, char channel));
312 static int	ahc_poll __P((struct ahc_data *ahc, int wait));
313 #ifdef AHC_DEBUG
314 static void	ahc_print_scb __P((struct scb *scb));
315 #endif
316 static int	ahc_reset_channel __P((struct ahc_data *ahc, char channel,
317 				       u_char timedout_scb, u_int32_t xs_error,
318 				       u_char initiate_reset));
319 static int	ahc_reset_device __P((struct ahc_data *ahc, int target,
320 				      char channel, u_char timedout_scb,
321 				      u_int32_t xs_error));
322 static void	ahc_reset_current_bus __P((struct ahc_data *ahc));
323 static void	ahc_run_done_queue __P((struct ahc_data *ahc));
324 static void	ahc_scsirate __P((struct ahc_data* ahc, u_int8_t *scsirate,
325 				  u_int8_t *period, u_int8_t *offset,
326 				  char channel, int target));
327 #if defined(__FreeBSD__)
328 static timeout_t
329 		ahc_timeout;
330 #elif defined(__NetBSD__)
331 static void	ahc_timeout __P((void *));
332 #endif
333 static void	ahc_busy_target __P((struct ahc_data *ahc,
334 				     int target, char channel));
335 static void	ahc_unbusy_target __P((struct ahc_data *ahc,
336 				       int target, char channel));
337 static void	ahc_construct_sdtr __P((struct ahc_data *ahc, int start_byte,
338 					u_int8_t period, u_int8_t offset));
339 static void	ahc_construct_wdtr __P((struct ahc_data *ahc, int start_byte,
340 					u_int8_t bus_width));
341 
342 #if defined(__NetBSD__)			/* XXX */
343 static void	ahc_xxx_enqueue __P((struct ahc_data *ahc,
344 		    struct scsipi_xfer *xs, int infront));
345 static struct scsipi_xfer *ahc_xxx_dequeue __P((struct ahc_data *ahc));
346 #endif
347 
348 #if defined(__FreeBSD__)
349 
350 char *ahc_name(ahc)
351 	struct ahc_data *ahc;
352 {
353 	static char name[10];
354 
355 	sprintf(name, "ahc%d", ahc->unit);
356 	return (name);
357 }
358 
359 #elif defined(__NetBSD__)
360 struct cfdriver ahc_cd = {
361 	NULL, "ahc", DV_DULL
362 };
363 #endif
364 
365 #ifdef  AHC_DEBUG
366 static void
367 ahc_print_scb(scb)
368         struct scb *scb;
369 {
370         printf("scb:%p control:0x%x tcl:0x%x cmdlen:%d cmdpointer:0x%lx\n"
371 	    ,scb
372 	    ,scb->control
373 	    ,scb->tcl
374 	    ,scb->cmdlen
375 	    ,(unsigned long) scb->cmdpointer );
376         printf("        datlen:%d data:0x%lx segs:0x%x segp:0x%lx\n"
377 	    ,scb->datalen
378 	    ,(unsigned long) scb->data
379 	    ,scb->SG_segment_count
380 	    ,(unsigned long) scb->SG_list_pointer);
381 	printf("	sg_addr:%lx sg_len:%ld\n"
382 	    ,(unsigned long) scb->ahc_dma[0].addr
383 	    ,(long) scb->ahc_dma[0].len);
384 }
385 
386 #endif
387 
388 static struct {
389         u_char errno;
390 	char *errmesg;
391 } hard_error[] = {
392 	{ ILLHADDR,  "Illegal Host Access" },
393 	{ ILLSADDR,  "Illegal Sequencer Address referenced" },
394 	{ ILLOPCODE, "Illegal Opcode in sequencer program" },
395 	{ PARERR,    "Sequencer Ram Parity Error" }
396 };
397 
398 
399 /*
400  * Valid SCSIRATE values.  (p. 3-17)
401  * Provides a mapping of tranfer periods in ns to the proper value to
402  * stick in the scsiscfr reg to use that transfer rate.
403  */
404 static struct {
405 	short sxfr;
406 	/* Rates in Ultra mode have bit 8 of sxfr set */
407 #define		ULTRA_SXFR 0x100
408 	int period; /* in ns/4 */
409 	char *rate;
410 } ahc_syncrates[] = {
411 	{ 0x100, 12, "20.0"  },
412 	{ 0x110, 15, "16.0"  },
413 	{ 0x120, 18, "13.4"  },
414 	{ 0x000, 25, "10.0"  },
415 	{ 0x010, 31,  "8.0"  },
416 	{ 0x020, 37,  "6.67" },
417 	{ 0x030, 43,  "5.7"  },
418 	{ 0x040, 50,  "5.0"  },
419 	{ 0x050, 56,  "4.4"  },
420 	{ 0x060, 62,  "4.0"  },
421 	{ 0x070, 68,  "3.6"  }
422 };
423 
424 static int ahc_num_syncrates =
425 	sizeof(ahc_syncrates) / sizeof(ahc_syncrates[0]);
426 
427 /*
428  * Allocate a controller structure for a new device and initialize it.
429  * ahc_reset should be called before now since we assume that the card
430  * is paused.
431  */
432 #if defined(__FreeBSD__)
433 struct ahc_data *
434 ahc_alloc(unit, iobase, type, flags)
435 	int unit;
436 	u_long iobase;
437 #elif defined(__NetBSD__)
438 void
439 ahc_construct(ahc, st, sh, type, flags)
440 	struct  ahc_data *ahc;
441 	bus_space_tag_t st;
442 	bus_space_handle_t sh;
443 #endif
444 	ahc_type type;
445 	ahc_flag flags;
446 {
447 
448 	/*
449 	 * find unit and check we have that many defined
450 	 */
451 
452 #if defined(__FreeBSD__)
453 	struct  ahc_data *ahc;
454 
455 	/*
456 	 * Allocate a storage area for us
457 	 */
458 
459 	ahc = malloc(sizeof(struct ahc_data), M_TEMP, M_NOWAIT);
460 	if (!ahc) {
461 		printf("ahc%d: cannot malloc!\n", unit);
462 		return NULL;
463 	}
464 	bzero(ahc, sizeof(struct ahc_data));
465 #endif
466 	STAILQ_INIT(&ahc->free_scbs);
467 	STAILQ_INIT(&ahc->page_scbs);
468 	STAILQ_INIT(&ahc->waiting_scbs);
469 	STAILQ_INIT(&ahc->assigned_scbs);
470 #if defined(__FreeBSD__)
471 	ahc->unit = unit;
472 #endif
473 #if defined(__FreeBSD__)
474 	ahc->baseport = iobase;
475 #elif defined(__NetBSD__)
476 	ahc->sc_st = st;
477 	ahc->sc_sh = sh;
478 #endif
479 	ahc->type = type;
480 	ahc->flags = flags;
481 	ahc->unpause = (AHC_INB(ahc, HCNTRL) & IRQMS) | INTEN;
482 	ahc->pause = ahc->unpause | PAUSE;
483 
484 #if defined(__FreeBSD__)
485 	return (ahc);
486 #endif
487 }
488 
489 void
490 ahc_free(ahc)
491 	struct ahc_data *ahc;
492 {
493 #if defined(__FreeBSD__)
494 	free(ahc, M_DEVBUF);
495 	return;
496 #endif
497 }
498 
499 void
500 #if defined(__FreeBSD__)
501 ahc_reset(iobase)
502 	u_long iobase;
503 #elif defined(__NetBSD__)
504 ahc_reset(devname, st, sh)
505 	char *devname;
506 	bus_space_tag_t st;
507 	bus_space_handle_t sh;
508 #endif
509 {
510         u_char hcntrl;
511 	int wait;
512 
513 	/* Retain the IRQ type accross the chip reset */
514 #if defined(__FreeBSD__)
515 	hcntrl = (inb(HCNTRL + iobase) & IRQMS) | INTEN;
516 
517 	outb(HCNTRL + iobase, CHIPRST | PAUSE);
518 #elif defined(__NetBSD__)
519 	hcntrl = (bus_space_read_1(st, sh, HCNTRL) & IRQMS) | INTEN;
520 
521 	bus_space_write_1(st, sh, HCNTRL, CHIPRST | PAUSE);
522 #endif
523 	/*
524 	 * Ensure that the reset has finished
525 	 */
526 	wait = 1000;
527 #if defined(__FreeBSD__)
528 	while (--wait && !(inb(HCNTRL + iobase) & CHIPRSTACK))
529 #elif defined(__NetBSD__)
530 	while (--wait && !(bus_space_read_1(st, sh, HCNTRL) & CHIPRSTACK))
531 #endif
532 		DELAY(1000);
533 	if(wait == 0) {
534 #if defined(__FreeBSD__)
535 		printf("ahc at 0x%lx: WARNING - Failed chip reset!  "
536 		       "Trying to initialize anyway.\n", iobase);
537 #elif defined(__NetBSD__)
538 		printf("%s: WARNING - Failed chip reset!  "
539 		       "Trying to initialize anyway.\n", devname);
540 #endif
541 	}
542 #if defined(__FreeBSD__)
543 	outb(HCNTRL + iobase, hcntrl | PAUSE);
544 #elif defined(__NetBSD__)
545 	bus_space_write_1(st, sh, HCNTRL, hcntrl | PAUSE);
546 #endif
547 }
548 
549 /*
550  * Look up the valid period to SCSIRATE conversion in our table.
551  */
552 static void
553 ahc_scsirate(ahc, scsirate, period, offset, channel, target )
554 	struct	 ahc_data *ahc;
555 	u_int8_t *scsirate;
556 	u_int8_t *period;
557 	u_int8_t *offset;
558 	char	 channel;
559 	int	 target;
560 {
561 	int i;
562 	u_int32_t ultra_enb_addr;
563 	u_int8_t  sxfrctl0;
564 	u_int8_t  ultra_enb;
565 
566 	i = ahc_num_syncrates; /* Default to async */
567 
568 	if (*period >= ahc_syncrates[0].period && *offset != 0) {
569 		for (i = 0; i < ahc_num_syncrates; i++) {
570 
571 			if (*period <= ahc_syncrates[i].period) {
572 				/*
573 				 * Watch out for Ultra speeds when ultra is not
574 				 * enabled and vice-versa.
575 				 */
576 				if(!(ahc->type & AHC_ULTRA)
577 				 && (ahc_syncrates[i].sxfr & ULTRA_SXFR)) {
578 					/*
579 					 * This should only happen if the
580 					 * drive is the first to negotiate
581 					 * and chooses a high rate.  We'll
582 					 * just move down the table util
583 					 * we hit a non ultra speed.
584 					 */
585 					continue;
586 				}
587 				*scsirate = (ahc_syncrates[i].sxfr & 0xF0)
588 					  | (*offset & 0x0f);
589 				*period = ahc_syncrates[i].period;
590 
591 				if(bootverbose) {
592 					printf("%s: target %d synchronous at %sMHz,"
593 					       " offset = 0x%x\n",
594 					        ahc_name(ahc), target,
595 						ahc_syncrates[i].rate, *offset );
596 				}
597 				break;
598 			}
599 		}
600 	}
601 	if (i >= ahc_num_syncrates) {
602 		/* Use asynchronous transfers. */
603 		*scsirate = 0;
604 		*period = 0;
605 		*offset = 0;
606 		if (bootverbose)
607 			printf("%s: target %d using asynchronous transfers\n",
608 			       ahc_name(ahc), target );
609 	}
610 	/*
611 	 * Ensure Ultra mode is set properly for
612 	 * this target.
613 	 */
614 	ultra_enb_addr = ULTRA_ENB;
615 	if(channel == 'B' || target > 7)
616 		ultra_enb_addr++;
617 	ultra_enb = AHC_INB(ahc, ultra_enb_addr);
618 	sxfrctl0 = AHC_INB(ahc, SXFRCTL0);
619 	if (*scsirate != 0 && ahc_syncrates[i].sxfr & ULTRA_SXFR) {
620 		ultra_enb |= 0x01 << (target & 0x07);
621 		sxfrctl0 |= ULTRAEN;
622 	}
623 	else {
624 		ultra_enb &= ~(0x01 << (target & 0x07));
625 		sxfrctl0 &= ~ULTRAEN;
626 	}
627 	AHC_OUTB(ahc, ultra_enb_addr, ultra_enb);
628 	AHC_OUTB(ahc, SXFRCTL0, sxfrctl0);
629 }
630 
631 /*
632  * Attach all the sub-devices we can find
633  */
634 int
635 ahc_attach(ahc)
636 	struct ahc_data *ahc;
637 {
638 #if defined(__FreeBSD__)
639 	struct scsibus_data *scbus;
640 #endif
641 
642 #if defined(__NetBSD__)			/* XXX */
643 	/*
644 	 * Initialize the software queue.
645 	 */
646 	LIST_INIT(&ahc->sc_xxxq);
647 #endif
648 
649 #ifdef AHC_BROKEN_CACHE
650 	if (cpu_class == CPUCLASS_386)	/* doesn't have "wbinvd" instruction */
651 		ahc_broken_cache = 0;
652 #endif
653 	/*
654 	 * fill in the prototype scsi_links.
655 	 */
656 #if defined(__FreeBSD__)
657 	ahc->sc_link.adapter_unit = ahc->unit;
658 	ahc->sc_link.adapter_targ = ahc->our_id;
659 	ahc->sc_link.fordriver = 0;
660 #elif defined(__NetBSD__)
661 	ahc->sc_link.type = BUS_SCSI;
662 	ahc->sc_link.scsipi_scsi.adapter_target = ahc->our_id;
663 	ahc->sc_link.scsipi_scsi.channel = 0;
664 	/*
665 	 * Set up max_target.
666 	 */
667 	ahc->sc_link.scsipi_scsi.max_target = (ahc->type & AHC_WIDE) ? 15 : 7;
668 #endif
669 	ahc->sc_link.adapter_softc = ahc;
670 	ahc->sc_link.adapter = &ahc_switch;
671 	ahc->sc_link.opennings = 2;
672 	ahc->sc_link.device = &ahc_dev;
673 #ifndef __NetBSD__
674 	ahc->sc_link.flags = DEBUGLEVEL;
675 #endif
676 
677 	if(ahc->type & AHC_TWIN) {
678 		/* Configure the second scsi bus */
679 		ahc->sc_link_b = ahc->sc_link;
680 #if defined(__FreeBSD__)
681 		ahc->sc_link_b.adapter_targ = ahc->our_id_b;
682 		ahc->sc_link_b.adapter_bus = 1;
683 		ahc->sc_link_b.fordriver = (void *)SELBUSB;
684 #elif defined(__NetBSD__)
685 		ahc->sc_link_b.scsipi_scsi.adapter_target = ahc->our_id_b;
686 		ahc->sc_link_b.scsipi_scsi.channel = 1;
687 #endif
688 	}
689 
690 
691 #if defined(__FreeBSD__)
692 	/*
693 	 * Prepare the scsibus_data area for the upperlevel
694 	 * scsi code.
695 	 */
696 	scbus = scsi_alloc_bus();
697 	if(!scbus)
698 		return 0;
699 	scbus->adapter_link = (ahc->flags & AHC_CHANNEL_B_PRIMARY) ?
700 				&ahc->sc_link_b : &ahc->sc_link;
701 	if(ahc->type & AHC_WIDE)
702 		scbus->maxtarg = 15;
703 
704 	/*
705 	 * ask the adapter what subunits are present
706 	 */
707 	if(bootverbose)
708 		printf("ahc%d: Probing channel %c\n", ahc->unit,
709 			(ahc->flags & AHC_CHANNEL_B_PRIMARY) ? 'B' : 'A');
710 	scsi_attachdevs(scbus);
711 	scbus = NULL;	/* Upper-level SCSI code owns this now */
712 
713 	if(ahc->type & AHC_TWIN) {
714 		scbus =  scsi_alloc_bus();
715 		if(!scbus)
716 			return 0;
717 		scbus->adapter_link = (ahc->flags & AHC_CHANNEL_B_PRIMARY) ?
718 					&ahc->sc_link : &ahc->sc_link_b;
719 		if(ahc->type & AHC_WIDE)
720 			scbus->maxtarg = 15;
721 		if(bootverbose)
722 			printf("ahc%d: Probing Channel %c\n", ahc->unit,
723 			       (ahc->flags & AHC_CHANNEL_B_PRIMARY) ? 'A': 'B');
724 		scsi_attachdevs(scbus);
725 		scbus = NULL;	/* Upper-level SCSI code owns this now */
726 	}
727 #elif defined(__NetBSD__)
728 	/*
729 	 * ask the adapter what subunits are present
730 	 */
731 	if ((ahc->flags & AHC_CHANNEL_B_PRIMARY) == 0) {
732 		/* make IS_SCSIBUS_B() == false, while probing channel A */
733 		ahc->sc_link_b.scsipi_scsi.scsibus = 0xff;
734 
735 		config_found((void *)ahc, &ahc->sc_link, scsiprint);
736 		if (ahc->type & AHC_TWIN)
737 			config_found((void *)ahc, &ahc->sc_link_b, scsiprint);
738 	} else {
739 		/*
740 		 * if implementation of IS_SCSIBUS_B() is changed to use
741 		 * ahc->sc_link.scsibus, then "ahc->sc_link.scsibus = 0xff;"
742 		 * is needed, here.
743 		 */
744 
745 		/* assert(ahc->type & AHC_TWIN); */
746 		config_found((void *)ahc, &ahc->sc_link_b, scsiprint);
747 		config_found((void *)ahc, &ahc->sc_link, scsiprint);
748 	}
749 #endif
750 	return 1;
751 }
752 
753 /*
754  * Send an SCB down to the card via PIO.
755  * We assume that the proper SCB is already selected in SCBPTR.
756  */
757 static inline void
758 ahc_send_scb(ahc, scb)
759         struct	ahc_data *ahc;
760         struct	scb *scb;
761 {
762 	AHC_OUTB(ahc, SCBCNT, SCBAUTO);
763 	if( ahc->type == AHC_284 )
764 		/* Can only do 8bit PIO */
765 		AHC_OUTSB(ahc, SCBARRAY, scb, SCB_PIO_TRANSFER_SIZE);
766 	else
767 		AHC_OUTSL(ahc, SCBARRAY, scb,
768 		      (SCB_PIO_TRANSFER_SIZE + 3) / 4);
769 	AHC_OUTB(ahc, SCBCNT, 0);
770 }
771 
772 /*
773  * Retrieve an SCB from the card via PIO.
774  * We assume that the proper SCB is already selected in SCBPTR.
775  */
776 static inline void
777 ahc_fetch_scb(ahc, scb)
778 	struct	ahc_data *ahc;
779 	struct	scb *scb;
780 {
781 	AHC_OUTB(ahc, SCBCNT, 0x80);	/* SCBAUTO */
782 
783 	/* Can only do 8bit PIO for reads */
784 	AHC_INSB(ahc, SCBARRAY, scb, SCB_PIO_TRANSFER_SIZE);
785 
786 	AHC_OUTB(ahc, SCBCNT, 0);
787 }
788 
789 /*
790  * Swap in_scbp for out_scbp down in the cards SCB array.
791  * We assume that the SCB for out_scbp is already selected in SCBPTR.
792  */
793 static inline void
794 ahc_page_scb(ahc, out_scbp, in_scbp)
795 	struct ahc_data *ahc;
796 	struct scb *out_scbp;
797 	struct scb *in_scbp;
798 {
799 	/* Page-out */
800 	ahc_fetch_scb(ahc, out_scbp);
801 	out_scbp->flags |= SCB_PAGED_OUT;
802 	if(!(out_scbp->control & TAG_ENB))
803 	{
804 		/* Stick in non-tagged array */
805 		int index =  (out_scbp->tcl >> 4)
806 			   | (out_scbp->tcl & SELBUSB);
807 		ahc->pagedout_ntscbs[index] = out_scbp;
808 	}
809 
810 	/* Page-in */
811 	in_scbp->position = out_scbp->position;
812 	out_scbp->position = SCB_LIST_NULL;
813 	ahc_send_scb(ahc, in_scbp);
814 	in_scbp->flags &= ~SCB_PAGED_OUT;
815 }
816 
817 static inline void
818 ahc_run_waiting_queues(ahc)
819 	struct ahc_data *ahc;
820 {
821 	struct scb* scb;
822 	u_char cur_scb;
823 
824 	if(!(ahc->assigned_scbs.stqh_first || ahc->waiting_scbs.stqh_first))
825 		return;
826 
827 	pause_sequencer(ahc);
828 	cur_scb = AHC_INB(ahc, SCBPTR);
829 
830 	/*
831 	 * First handle SCBs that are waiting but have been
832 	 * assigned a slot.
833 	 */
834 	while((scb = ahc->assigned_scbs.stqh_first) != NULL) {
835 		STAILQ_REMOVE_HEAD(&ahc->assigned_scbs, links);
836 		AHC_OUTB(ahc, SCBPTR, scb->position);
837 		ahc_send_scb(ahc, scb);
838 
839 		/* Mark this as an active command */
840 		scb->flags ^= SCB_ASSIGNEDQ|SCB_ACTIVE;
841 
842 		AHC_OUTB(ahc, QINFIFO, scb->position);
843 		if (!(scb->xs->flags & SCSI_NOMASK)) {
844 			timeout(ahc_timeout, (caddr_t)scb,
845 				(scb->xs->timeout * hz) / 1000);
846 		}
847 		SC_DEBUG(scb->xs->sc_link, SDEV_DB3, ("cmd_sent\n"));
848 	}
849 	/* Now deal with SCBs that require paging */
850 	if((scb = ahc->waiting_scbs.stqh_first) != NULL) {
851 		u_char disc_scb = AHC_INB(ahc, DISCONNECTED_SCBH);
852 		u_char active = AHC_INB(ahc, FLAGS) & (SELECTED|IDENTIFY_SEEN);
853 		int count = 0;
854 
855 		do {
856 			u_char next_scb;
857 
858 			/* Attempt to page this SCB in */
859 			if(disc_scb == SCB_LIST_NULL)
860 				break;
861 
862 			/*
863 			 * Check the next SCB on in the list.
864 			 */
865 			AHC_OUTB(ahc, SCBPTR, disc_scb);
866 			next_scb = AHC_INB(ahc, SCB_NEXT);
867 
868 			/*
869 			 * We have to be careful about when we allow
870 			 * an SCB to be paged out.  There must always
871 			 * be at least one slot available for a
872 			 * reconnecting target in case it references
873 			 * an SCB that has been paged out.  Our
874 			 * heuristic is that either the disconnected
875 			 * list has at least two entries in it or
876 			 * there is one entry and the sequencer is
877 			 * actively working on an SCB which implies that
878 			 * it will either complete or disconnect before
879 			 * another reconnection can occur.
880 			 */
881 			if((next_scb != SCB_LIST_NULL) || active)
882 			{
883 				u_char out_scbi;
884 				struct scb* out_scbp;
885 
886 				STAILQ_REMOVE_HEAD(&ahc->waiting_scbs, links);
887 
888 				/*
889 				 * Find the in-core SCB for the one
890 				 * we're paging out.
891 				 */
892 				out_scbi = AHC_INB(ahc, SCB_TAG);
893 				out_scbp = ahc->scbarray[out_scbi];
894 
895 				/* Do the page out */
896 				ahc_page_scb(ahc, out_scbp, scb);
897 
898 				/* Mark this as an active command */
899 				scb->flags ^= SCB_WAITINGQ|SCB_ACTIVE;
900 
901 				/* Queue the command */
902 				AHC_OUTB(ahc, QINFIFO, scb->position);
903 				if (!(scb->xs->flags & SCSI_NOMASK)) {
904 					timeout(ahc_timeout, (caddr_t)scb,
905 						(scb->xs->timeout * hz) / 1000);
906 				}
907 				SC_DEBUG(scb->xs->sc_link, SDEV_DB3,
908 					("cmd_paged-in\n"));
909 				count++;
910 
911 				/* Advance to the next disconnected SCB */
912 				disc_scb = next_scb;
913 			}
914 			else
915 				break;
916 		} while((scb = ahc->waiting_scbs.stqh_first) != NULL);
917 
918 		if(count) {
919 			/*
920 			 * Update the head of the disconnected list.
921 			 */
922 			AHC_OUTB(ahc, DISCONNECTED_SCBH, disc_scb);
923 			if(disc_scb != SCB_LIST_NULL) {
924 				AHC_OUTB(ahc, SCBPTR, disc_scb);
925 				AHC_OUTB(ahc, SCB_PREV, SCB_LIST_NULL);
926 			}
927 		}
928 	}
929 	/* Restore old position */
930 	AHC_OUTB(ahc, SCBPTR, cur_scb);
931 	unpause_sequencer(ahc, /*unpause_always*/FALSE);
932 }
933 
934 /*
935  * Add this SCB to the head of the "waiting for selection" list.
936  */
937 static
938 void ahc_add_waiting_scb(ahc, scb)
939 	struct ahc_data *ahc;
940 	struct scb *scb;
941 {
942 	u_char next;
943 	u_char curscb;
944 
945 	curscb = AHC_INB(ahc, SCBPTR);
946 	next = AHC_INB(ahc, WAITING_SCBH);
947 
948 	AHC_OUTB(ahc, SCBPTR, scb->position);
949 	AHC_OUTB(ahc, SCB_NEXT, next);
950 	AHC_OUTB(ahc, WAITING_SCBH, scb->position);
951 
952 	AHC_OUTB(ahc, SCBPTR, curscb);
953 }
954 
955 /*
956  * Catch an interrupt from the adapter
957  */
958 #if defined(__FreeBSD__)
959 void
960 #elif defined (__NetBSD__)
961 int
962 #endif
963 ahc_intr(arg)
964         void *arg;
965 {
966 	int     intstat;
967 	u_char	status;
968 	struct	scb *scb;
969 	struct	scsipi_xfer *xs;
970 	struct	ahc_data *ahc = (struct ahc_data *)arg;
971 
972 	intstat = AHC_INB(ahc, INTSTAT);
973 	/*
974 	 * Is this interrupt for me? or for
975 	 * someone who is sharing my interrupt?
976 	 */
977 	if (!(intstat & INT_PEND))
978 #if defined(__FreeBSD__)
979 		return;
980 #elif defined(__NetBSD__)
981 		return 0;
982 #endif
983 
984         if (intstat & BRKADRINT) {
985 		/* We upset the sequencer :-( */
986 
987 		/* Lookup the error message */
988 		int i, error = AHC_INB(ahc, ERROR);
989 		int num_errors =  sizeof(hard_error)/sizeof(hard_error[0]);
990 		for(i = 0; error != 1 && i < num_errors; i++)
991 			error >>= 1;
992                 panic("%s: brkadrint, %s at seqaddr = 0x%x\n",
993 		      ahc_name(ahc), hard_error[i].errmesg,
994 		      (AHC_INB(ahc, SEQADDR1) << 8) |
995 		      AHC_INB(ahc, SEQADDR0));
996         }
997         if (intstat & SEQINT)
998 		ahc_handle_seqint(ahc, intstat);
999 
1000 	if (intstat & SCSIINT) {
1001 
1002 		int scb_index = AHC_INB(ahc, SCB_TAG);
1003 		status = AHC_INB(ahc, SSTAT1);
1004 		scb = ahc->scbarray[scb_index];
1005 
1006 		if (status & SCSIRSTI) {
1007 			char channel;
1008 			channel = AHC_INB(ahc, SBLKCTL);
1009 			channel = channel & SELBUSB ? 'B' : 'A';
1010 			printf("%s: Someone reset channel %c\n",
1011 				ahc_name(ahc), channel);
1012 			ahc_reset_channel(ahc,
1013 					  channel,
1014 					  SCB_LIST_NULL,
1015 					  XS_BUSY,
1016 					  /* Initiate Reset */FALSE);
1017 			scb = NULL;
1018 		}
1019 		else if (!(scb && (scb->flags & SCB_ACTIVE))){
1020 			printf("%s: ahc_intr - referenced scb not "
1021 			       "valid during scsiint 0x%x scb(%d)\n",
1022 				ahc_name(ahc), status, scb_index);
1023 			AHC_OUTB(ahc, CLRSINT1, status);
1024 			unpause_sequencer(ahc, /*unpause_always*/TRUE);
1025 			AHC_OUTB(ahc, CLRINT, CLRSCSIINT);
1026 			scb = NULL;
1027 		}
1028 		else if (status & SCSIPERR) {
1029 			/*
1030 			 * Determine the bus phase and
1031 			 * queue an appropriate message
1032 			 */
1033 			char	*phase;
1034 			u_char	mesg_out = MSG_NOOP;
1035 			u_char	lastphase = AHC_INB(ahc, LASTPHASE);
1036 
1037 			xs = scb->xs;
1038 			scsi_print_addr(xs->sc_link);
1039 
1040 			switch(lastphase) {
1041 				case P_DATAOUT:
1042 					phase = "Data-Out";
1043 					break;
1044 				case P_DATAIN:
1045 					phase = "Data-In";
1046 					mesg_out = MSG_INITIATOR_DET_ERR;
1047 					break;
1048 				case P_COMMAND:
1049 					phase = "Command";
1050 					break;
1051 				case P_MESGOUT:
1052 					phase = "Message-Out";
1053 					break;
1054 				case P_STATUS:
1055 					phase = "Status";
1056 					mesg_out = MSG_INITIATOR_DET_ERR;
1057 					break;
1058 				case P_MESGIN:
1059 					phase = "Message-In";
1060 					mesg_out = MSG_PARITY_ERROR;
1061 					break;
1062 				default:
1063 					phase = "unknown";
1064 					break;
1065 			}
1066 			printf("parity error during %s phase.\n", phase);
1067 
1068 			/*
1069 			 * We've set the hardware to assert ATN if we
1070 			 * get a parity error on "in" phases, so all we
1071 			 * need to do is stuff the message buffer with
1072 			 * the appropriate message.  "In" phases have set
1073 			 * mesg_out to something other than MSG_NOP.
1074 			 */
1075 			if(mesg_out != MSG_NOOP) {
1076 				AHC_OUTB(ahc, MSG0, mesg_out);
1077 				AHC_OUTB(ahc, MSG_LEN, 1);
1078 			}
1079 			else
1080 				/*
1081 				 * Should we allow the target to make
1082 				 * this decision for us?
1083 				 */
1084 				xs->error = XS_DRIVER_STUFFUP;
1085 		}
1086 		else if (status & SELTO) {
1087 			u_char waiting;
1088 			u_char flags;
1089 
1090 			xs = scb->xs;
1091 			xs->error = XS_SELTIMEOUT;
1092 			/*
1093 			 * Clear any pending messages for the timed out
1094 			 * target, and mark the target as free
1095 			 */
1096 			flags = AHC_INB(ahc, FLAGS);
1097 			AHC_OUTB(ahc, MSG_LEN, 0);
1098 			ahc_unbusy_target(ahc, xs->sc_link->AIC_SCSI_TARGET,
1099 #if defined(__FreeBSD__)
1100 			 	((long)xs->sc_link->fordriver & SELBUSB)
1101 #elif defined(__NetBSD__)
1102 				IS_SCSIBUS_B(ahc, xs->sc_link)
1103 #endif
1104 				 	? 'B' : 'A');
1105 			/* Stop the selection */
1106 			AHC_OUTB(ahc, SCSISEQ, 0);
1107 
1108 			AHC_OUTB(ahc, SCB_CONTROL, 0);
1109 
1110 			AHC_OUTB(ahc, CLRSINT1, CLRSELTIMEO);
1111 
1112 			AHC_OUTB(ahc, CLRINT, CLRSCSIINT);
1113 
1114 			/* Shift the waiting for selection queue forward */
1115 			waiting = AHC_INB(ahc, WAITING_SCBH);
1116 			AHC_OUTB(ahc, SCBPTR, waiting);
1117 			waiting = AHC_INB(ahc, SCB_NEXT);
1118 			AHC_OUTB(ahc, WAITING_SCBH, waiting);
1119 
1120 			restart_sequencer(ahc);
1121 		}
1122 		else if (!(status & BUSFREE)) {
1123 		      scsi_print_addr(scb->xs->sc_link);
1124 		      printf("Unknown SCSIINT. Status = 0x%x\n", status);
1125 		      AHC_OUTB(ahc, CLRSINT1, status);
1126 		      unpause_sequencer(ahc, /*unpause_always*/TRUE);
1127 		      AHC_OUTB(ahc, CLRINT, CLRSCSIINT);
1128 		      scb = NULL;
1129 		}
1130 		if(scb != NULL) {
1131 		    /* We want to process the command */
1132 		    untimeout(ahc_timeout, (caddr_t)scb);
1133 		    ahc_done(ahc, scb);
1134 		}
1135 	}
1136 	if (intstat & CMDCMPLT) {
1137 		int   scb_index;
1138 
1139 		do {
1140 			scb_index = AHC_INB(ahc, QOUTFIFO);
1141 			scb = ahc->scbarray[scb_index];
1142 			if (!scb || !(scb->flags & SCB_ACTIVE)) {
1143 				printf("%s: WARNING "
1144 				       "no command for scb %d (cmdcmplt)\n"
1145 				       "QOUTCNT == %d\n",
1146 					ahc_name(ahc), scb_index,
1147 					AHC_INB(ahc, QOUTCNT));
1148 				AHC_OUTB(ahc, CLRINT, CLRCMDINT);
1149 				continue;
1150 			}
1151 			AHC_OUTB(ahc, CLRINT, CLRCMDINT);
1152 			untimeout(ahc_timeout, (caddr_t)scb);
1153 			ahc_done(ahc, scb);
1154 
1155 		} while (AHC_INB(ahc, QOUTCNT) & ahc->qcntmask);
1156 
1157 		ahc_run_waiting_queues(ahc);
1158 	}
1159 #if defined(__NetBSD__)
1160 	return 1;
1161 #endif
1162 }
1163 
1164 static void
1165 ahc_handle_seqint(ahc, intstat)
1166 	struct ahc_data *ahc;
1167 	u_int8_t intstat;
1168 {
1169 	struct scb *scb;
1170 	u_short targ_mask;
1171 	u_char target = (AHC_INB(ahc, SCSIID) >> 4) & 0x0f;
1172 	u_char scratch_offset = target;
1173 	char channel = AHC_INB(ahc, SBLKCTL) & SELBUSB ? 'B': 'A';
1174 
1175 	if (channel == 'B')
1176 		scratch_offset += 8;
1177 	targ_mask = (0x01 << scratch_offset);
1178 
1179 	switch (intstat & SEQINT_MASK) {
1180 	case NO_MATCH:
1181 		if (ahc->flags & AHC_PAGESCBS) {
1182 			/* SCB Page-in request */
1183 			u_char tag;
1184 			u_char next;
1185 			u_char disc_scb;
1186 			struct scb *outscb;
1187 			u_char arg_1 = AHC_INB(ahc, ARG_1);
1188 
1189 			/*
1190 			 * We should succeed, so set this now.
1191 			 * If we don't, and one of the methods
1192 			 * we use to aquire an SCB calls ahc_done,
1193 			 * we may wind up in our start routine
1194 			 * and unpause the adapter without giving
1195 			 * it the correct return value, which will
1196 			 * cause a hang.
1197 			 */
1198 			AHC_OUTB(ahc, RETURN_1, SCB_PAGEDIN);
1199 
1200 			if (arg_1 == SCB_LIST_NULL) {
1201 				/* Non-tagged command */
1202 				int index;
1203 
1204 				index = target|(channel == 'B' ? SELBUSB : 0);
1205 				scb = ahc->pagedout_ntscbs[index];
1206 			} else
1207 				scb = ahc->scbarray[arg_1];
1208 
1209 			if (!(scb->flags & SCB_PAGED_OUT))
1210 				panic("%s: Request to page in a non paged out "
1211 				      "SCB.", ahc_name(ahc));
1212 			/*
1213 			 * Now to pick the SCB to page out.
1214 			 * Either take a free SCB, an assigned SCB,
1215 			 * an SCB that just completed, the first
1216 			 * one on the disconnected SCB list, or
1217 			 * as a last resort a queued SCB.
1218 			 */
1219 			if (ahc->free_scbs.stqh_first) {
1220 				outscb = ahc->free_scbs.stqh_first;
1221 				STAILQ_REMOVE_HEAD(&ahc->free_scbs, links);
1222 				scb->position = outscb->position;
1223 				outscb->position = SCB_LIST_NULL;
1224 				STAILQ_INSERT_HEAD(&ahc->page_scbs, outscb,
1225 						   links);
1226 				AHC_OUTB(ahc, SCBPTR, scb->position);
1227 				ahc_send_scb(ahc, scb);
1228 				scb->flags &= ~SCB_PAGED_OUT;
1229 				goto pagein_done;
1230 			}
1231 			if (intstat & CMDCMPLT) {
1232 				int   scb_index;
1233 
1234 				AHC_OUTB(ahc, CLRINT, CLRCMDINT);
1235 				scb_index = AHC_INB(ahc, QOUTFIFO);
1236 				if (!(AHC_INB(ahc, QOUTCNT) & ahc->qcntmask))
1237 					intstat &= ~CMDCMPLT;
1238 
1239 				outscb = ahc->scbarray[scb_index];
1240 				if (!outscb || !(outscb->flags & SCB_ACTIVE)) {
1241 					printf("%s: WARNING no command for "
1242 					       "scb %d (cmdcmplt)\n",
1243 					       ahc_name(ahc),
1244 					       scb_index);
1245 					/*
1246 					 * Fall through in hopes of finding
1247 					 * another SCB
1248 					 */
1249 				} else {
1250 					scb->position = outscb->position;
1251 					outscb->position = SCB_LIST_NULL;
1252 					AHC_OUTB(ahc, SCBPTR, scb->position);
1253 					ahc_send_scb(ahc, scb);
1254 					scb->flags &= ~SCB_PAGED_OUT;
1255 					untimeout(ahc_timeout,
1256 						  (caddr_t)outscb);
1257 					ahc_done(ahc, outscb);
1258 					goto pagein_done;
1259 				}
1260 			}
1261 			disc_scb = AHC_INB(ahc, DISCONNECTED_SCBH);
1262 			if (disc_scb != SCB_LIST_NULL) {
1263 				AHC_OUTB(ahc, SCBPTR, disc_scb);
1264 				tag = AHC_INB(ahc, SCB_TAG);
1265 				outscb = ahc->scbarray[tag];
1266 				next = AHC_INB(ahc, SCB_NEXT);
1267 				if (next != SCB_LIST_NULL) {
1268 					AHC_OUTB(ahc, SCBPTR, next);
1269 					AHC_OUTB(ahc, SCB_PREV,
1270 						 SCB_LIST_NULL);
1271 					AHC_OUTB(ahc, SCBPTR, disc_scb);
1272 				}
1273 				AHC_OUTB(ahc, DISCONNECTED_SCBH, next);
1274 				ahc_page_scb(ahc, outscb, scb);
1275 			} else if (AHC_INB(ahc, QINCNT) & ahc->qcntmask) {
1276 				/*
1277 				 * Pull one of our queued commands
1278 				 * as a last resort
1279 				 */
1280 				disc_scb = AHC_INB(ahc, QINFIFO);
1281 				AHC_OUTB(ahc, SCBPTR, disc_scb);
1282 				tag = AHC_INB(ahc, SCB_TAG);
1283 				outscb = ahc->scbarray[tag];
1284 				if ((outscb->control & 0x23) != TAG_ENB) {
1285 					/*
1286 					 * This is not a simple tagged command
1287 					 * so its position in the queue
1288 					 * matters.  Take the command at the
1289 					 * end of the queue instead.
1290 					 */
1291 					int i;
1292 					u_char saved_queue[AHC_SCB_MAX];
1293 					u_char queued = AHC_INB(ahc, QINCNT)
1294 							& ahc->qcntmask;
1295 
1296 					/*
1297 					 * Count the command we removed
1298 					 * already
1299 					 */
1300 					saved_queue[0] = disc_scb;
1301 					queued++;
1302 
1303 					/* Empty the input queue */
1304 					for (i = 1; i < queued; i++)
1305 						saved_queue[i] = AHC_INB(ahc, QINFIFO);
1306 
1307 					/*
1308 					 * Put everyone back but the
1309 					 * last entry
1310 					 */
1311 					queued--;
1312 					for (i = 0; i < queued; i++)
1313 						AHC_OUTB(ahc, QINFIFO,
1314 							 saved_queue[i]);
1315 
1316 					AHC_OUTB(ahc, SCBPTR,
1317 						 saved_queue[queued]);
1318 					tag = AHC_INB(ahc, SCB_TAG);
1319 					outscb = ahc->scbarray[tag];
1320 				}
1321 				untimeout(ahc_timeout, (caddr_t)outscb);
1322 				scb->position = outscb->position;
1323 				outscb->position = SCB_LIST_NULL;
1324 				STAILQ_INSERT_HEAD(&ahc->waiting_scbs,
1325 						   outscb, links);
1326 				outscb->flags |= SCB_WAITINGQ;
1327 				ahc_send_scb(ahc, scb);
1328 				scb->flags &= ~SCB_PAGED_OUT;
1329 			}
1330 			else {
1331 				panic("Page-in request with no candidates");
1332 				AHC_OUTB(ahc, RETURN_1, 0);
1333 			}
1334 		  pagein_done:
1335 		} else {
1336 			printf("%s:%c:%d: no active SCB for reconnecting "
1337 			       "target - issuing ABORT\n",
1338 			       ahc_name(ahc), channel, target);
1339 			printf("SAVED_TCL == 0x%x\n",
1340 			       AHC_INB(ahc, SAVED_TCL));
1341 			ahc_unbusy_target(ahc, target, channel);
1342 			AHC_OUTB(ahc, SCB_CONTROL, 0);
1343 			AHC_OUTB(ahc, CLRSINT1, CLRSELTIMEO);
1344 			AHC_OUTB(ahc, RETURN_1, 0);
1345 		}
1346 		break;
1347 	case SEND_REJECT:
1348 	{
1349 		u_char rejbyte = AHC_INB(ahc, REJBYTE);
1350 		printf("%s:%c:%d: Warning - unknown message received from "
1351 		       "target (0x%x).  Rejecting\n",
1352 		       ahc_name(ahc), channel, target, rejbyte);
1353 		break;
1354 	}
1355 	case NO_IDENT:
1356 		panic("%s:%c:%d: Target did not send an IDENTIFY message. "
1357 		      "SAVED_TCL == 0x%x\n",
1358 		      ahc_name(ahc), channel, target,
1359 		      AHC_INB(ahc, SAVED_TCL));
1360 		break;
1361 	case BAD_PHASE:
1362 		printf("%s:%c:%d: unknown scsi bus phase.  Attempting to "
1363 		       "continue\n", ahc_name(ahc), channel, target);
1364 		break;
1365 	case EXTENDED_MSG:
1366 	{
1367 		u_int8_t message_length;
1368 		u_int8_t message_code;
1369 
1370 		message_length = AHC_INB(ahc, MSGIN_EXT_LEN);
1371 		message_code = AHC_INB(ahc, MSGIN_EXT_OPCODE);
1372 		switch(message_code) {
1373 		case MSG_EXT_SDTR:
1374 		{
1375 			u_int8_t period;
1376 			u_int8_t offset;
1377 			u_int8_t saved_offset;
1378 			u_int8_t targ_scratch;
1379 			u_int8_t maxoffset;
1380 			u_int8_t rate;
1381 
1382 			if (message_length != MSG_EXT_SDTR_LEN) {
1383 				AHC_OUTB(ahc, RETURN_1, SEND_REJ);
1384 				ahc->sdtrpending &= ~targ_mask;
1385 				break;
1386 			}
1387 			period = AHC_INB(ahc, MSGIN_EXT_BYTE0);
1388 			saved_offset = AHC_INB(ahc, MSGIN_EXT_BYTE1);
1389 			targ_scratch = AHC_INB(ahc, TARG_SCRATCH
1390 					       + scratch_offset);
1391 			if (targ_scratch & WIDEXFER)
1392 				maxoffset = MAX_OFFSET_16BIT;
1393 			else
1394 				maxoffset = MAX_OFFSET_8BIT;
1395 			offset = MIN(saved_offset, maxoffset);
1396 			ahc_scsirate(ahc, &rate, &period, &offset,
1397 				     channel, target);
1398 			/* Preserve the WideXfer flag */
1399 			targ_scratch = rate | (targ_scratch & WIDEXFER);
1400 
1401 			/*
1402 			 * Update both the target scratch area and the
1403 			 * current SCSIRATE.
1404 			 */
1405 			AHC_OUTB(ahc, TARG_SCRATCH + scratch_offset,
1406 				 targ_scratch);
1407 			AHC_OUTB(ahc, SCSIRATE, targ_scratch);
1408 
1409 			/*
1410 			 * See if we initiated Sync Negotiation
1411 			 * and didn't have to fall down to async
1412 			 * transfers.
1413 			 */
1414 			if ((ahc->sdtrpending & targ_mask) != 0
1415 			 && (saved_offset == offset)) {
1416 				/*
1417 				 * Don't send an SDTR back to
1418 				 * the target
1419 				 */
1420 				AHC_OUTB(ahc, RETURN_1, 0);
1421 				ahc->needsdtr &= ~targ_mask;
1422 				ahc->sdtrpending &= ~targ_mask;
1423 			} else {
1424 				/*
1425 				 * Send our own SDTR in reply
1426 				 */
1427 #ifdef AHC_DEBUG
1428 				if(ahc_debug & AHC_SHOWMISC)
1429 					printf("Sending SDTR!!\n");
1430 #endif
1431 				ahc_construct_sdtr(ahc, /*start_byte*/0,
1432 						   period, offset);
1433 				AHC_OUTB(ahc, RETURN_1, SEND_MSG);
1434 
1435 				/*
1436 				 * If we aren't starting a re-negotiation
1437 				 * because we had to go async in response
1438 				 * to a "too low" response from the target
1439 				 * clear the needsdtr flag for this target.
1440 				 */
1441 				if ((ahc->sdtrpending & targ_mask) == 0)
1442 					ahc->needsdtr &= ~targ_mask;
1443 				else
1444 					ahc->sdtrpending |= targ_mask;
1445 			}
1446 			break;
1447 		}
1448 		case MSG_EXT_WDTR:
1449 		{
1450 			u_int8_t scratch, bus_width;
1451 
1452 			if (message_length != MSG_EXT_WDTR_LEN) {
1453 				AHC_OUTB(ahc, RETURN_1, SEND_REJ);
1454 				ahc->wdtrpending &= ~targ_mask;
1455 				break;
1456 			}
1457 
1458 			bus_width = AHC_INB(ahc, MSGIN_EXT_BYTE0);
1459 			scratch = AHC_INB(ahc, TARG_SCRATCH
1460 					  + scratch_offset);
1461 
1462 			if (ahc->wdtrpending & targ_mask) {
1463 				/*
1464 				 * Don't send a WDTR back to the
1465 				 * target, since we asked first.
1466 				 */
1467 				AHC_OUTB(ahc, RETURN_1, 0);
1468 				switch(bus_width){
1469 				case BUS_8_BIT:
1470 					scratch &= 0x7f;
1471 					break;
1472 				case BUS_16_BIT:
1473 					if(bootverbose)
1474 						printf("%s: target %d using "
1475 						       "16Bit transfers\n",
1476 						       ahc_name(ahc), target);
1477 					scratch |= WIDEXFER;
1478 					break;
1479 				case BUS_32_BIT:
1480 					/*
1481 					 * How can we do 32bit transfers
1482 					 * on a 16bit bus?
1483 					 */
1484 					AHC_OUTB(ahc, RETURN_1, SEND_REJ);
1485 					printf("%s: target %d requested 32Bit "
1486 					       "transfers.  Rejecting...\n",
1487 					       ahc_name(ahc), target);
1488 					break;
1489 				default:
1490 					break;
1491 				}
1492 			} else {
1493 				/*
1494 				 * Send our own WDTR in reply
1495 				 */
1496 				switch(bus_width) {
1497 				case BUS_8_BIT:
1498 					scratch &= 0x7f;
1499 					break;
1500 				case BUS_32_BIT:
1501 				case BUS_16_BIT:
1502 					if(ahc->type & AHC_WIDE) {
1503 						/* Negotiate 16_BITS */
1504 						bus_width = BUS_16_BIT;
1505 						if(bootverbose)
1506 							printf("%s: target %d "
1507 							       "using 16Bit "
1508 							       "transfers\n",
1509 							       ahc_name(ahc),
1510 							       target);
1511 						scratch |= WIDEXFER;
1512 					} else
1513 						bus_width = BUS_8_BIT;
1514 					break;
1515 				default:
1516 					break;
1517 				}
1518 				ahc_construct_wdtr(ahc, /*start_byte*/0,
1519 						   bus_width);
1520 				AHC_OUTB(ahc, RETURN_1, SEND_MSG);
1521 			}
1522 
1523 			ahc->needwdtr &= ~targ_mask;
1524 			ahc->wdtrpending &= ~targ_mask;
1525 			AHC_OUTB(ahc, TARG_SCRATCH + scratch_offset, scratch);
1526 			AHC_OUTB(ahc, SCSIRATE, scratch);
1527 			break;
1528 		}
1529 		default:
1530 			/* Unknown extended message.  Reject it. */
1531 			AHC_OUTB(ahc, RETURN_1, SEND_REJ);
1532 		}
1533 	}
1534 	case REJECT_MSG:
1535 	{
1536 		/*
1537 		 * What we care about here is if we had an
1538 		 * outstanding SDTR or WDTR message for this
1539 		 * target.  If we did, this is a signal that
1540 		 * the target is refusing negotiation.
1541 		 */
1542 
1543 		u_char targ_scratch;
1544 
1545 		targ_scratch = AHC_INB(ahc, TARG_SCRATCH
1546 				       + scratch_offset);
1547 
1548 		if (ahc->wdtrpending & targ_mask){
1549 			/* note 8bit xfers and clear flag */
1550 			targ_scratch &= 0x7f;
1551 			ahc->needwdtr &= ~targ_mask;
1552 			ahc->wdtrpending &= ~targ_mask;
1553 #if !defined(__NetBSD__) || defined(DEBUG)
1554 			printf("%s:%c:%d: refuses WIDE negotiation.  Using "
1555 			       "8bit transfers\n", ahc_name(ahc),
1556 			       channel, target);
1557 #endif
1558 		} else if(ahc->sdtrpending & targ_mask){
1559 			/* note asynch xfers and clear flag */
1560 			targ_scratch &= 0xf0;
1561 			ahc->needsdtr &= ~targ_mask;
1562 			ahc->sdtrpending &= ~targ_mask;
1563 #if !defined(__NetBSD__) || defined(DEBUG)
1564 			printf("%s:%c:%d: refuses synchronous negotiation. "
1565 			       "Using asynchronous transfers\n",
1566 			       ahc_name(ahc),
1567 			       channel, target);
1568 #endif
1569 		} else {
1570 			/*
1571 			 * Otherwise, we ignore it.
1572 			 */
1573 #ifdef AHC_DEBUG
1574 			if(ahc_debug & AHC_SHOWMISC)
1575 				printf("%s:%c:%d: Message reject -- ignored\n",
1576 				       ahc_name(ahc), channel, target);
1577 #endif
1578 			break;
1579 		}
1580 		AHC_OUTB(ahc, TARG_SCRATCH + scratch_offset, targ_scratch);
1581 		AHC_OUTB(ahc, SCSIRATE, targ_scratch);
1582 		break;
1583 	}
1584 	case BAD_STATUS:
1585 	{
1586 		int	scb_index;
1587 		struct	scsipi_xfer *xs;
1588 
1589 		/* The sequencer will notify us when a command
1590 		 * has an error that would be of interest to
1591 		 * the kernel.  This allows us to leave the sequencer
1592 		 * running in the common case of command completes
1593 		 * without error.
1594 		 */
1595 
1596 		scb_index = AHC_INB(ahc, SCB_TAG);
1597 		scb = ahc->scbarray[scb_index];
1598 
1599 		/*
1600 		 * Set the default return value to 0 (don't
1601 		 * send sense).  The sense code will change
1602 		 * this if needed and this reduces code
1603 		 * duplication.
1604 		 */
1605 		AHC_OUTB(ahc, RETURN_1, 0);
1606 		if (!(scb && (scb->flags & SCB_ACTIVE))) {
1607 			printf("%s:%c:%d: ahc_intr - referenced scb "
1608 			       "not valid during seqint 0x%x scb(%d)\n",
1609 			       ahc_name(ahc),
1610 			       channel, target, intstat,
1611 			       scb_index);
1612 			goto clear;
1613 		}
1614 
1615 		xs = scb->xs;
1616 
1617 		scb->status = AHC_INB(ahc, SCB_TARGET_STATUS);
1618 
1619 #ifdef AHC_DEBUG
1620 		if((ahc_debug & AHC_SHOWSCBS)
1621 		   && xs->sc_link->AIC_SCSI_TARGET == DEBUGTARG)
1622 			ahc_print_scb(scb);
1623 #endif
1624 		xs->status = scb->status;
1625 		switch(scb->status){
1626 		case SCSI_OK:
1627 			printf("%s: Interrupted for staus of"
1628 			       " 0???\n", ahc_name(ahc));
1629 			break;
1630 		case SCSI_CHECK:
1631 #ifdef AHC_DEBUG
1632 			if(ahc_debug & AHC_SHOWSENSE)
1633 			{
1634 
1635 				scsi_print_addr(xs->sc_link);
1636 				printf("requests Check Status\n");
1637 			}
1638 #endif
1639 
1640 			if ((xs->error == XS_NOERROR)
1641 			    && !(scb->flags & SCB_SENSE)) {
1642 				struct ahc_dma_seg *sg = scb->ahc_dma;
1643 				struct scsipi_sense *sc = &(scb->sense_cmd);
1644 #ifdef AHC_DEBUG
1645 				if (ahc_debug & AHC_SHOWSENSE)
1646 				{
1647 					scsi_print_addr(xs->sc_link);
1648 					printf("Sending Sense\n");
1649 				}
1650 #endif
1651 #if defined(__FreeBSD__)
1652 				sc->op_code = REQUEST_SENSE;
1653 #elif defined(__NetBSD__)
1654 				sc->opcode = REQUEST_SENSE;
1655 #endif
1656 				sc->byte2 =  xs->sc_link->AIC_SCSI_LUN << 5;
1657 				sc->length = sizeof(struct scsipi_sense_data);
1658 				sc->control = 0;
1659 				sg->addr = KVTOPHYS(&xs->AIC_SCSI_SENSE);
1660 				sg->len = sizeof(struct scsipi_sense_data);
1661 
1662 				scb->control &= DISCENB;
1663 				scb->status = 0;
1664 				scb->SG_segment_count = 1;
1665 				scb->SG_list_pointer = KVTOPHYS(sg);
1666 				scb->data = sg->addr;
1667 				scb->datalen = sg->len;
1668 #ifdef AHC_BROKEN_CACHE
1669 				if (ahc_broken_cache)
1670 					INVALIDATE_CACHE();
1671 #endif
1672 				scb->cmdpointer = KVTOPHYS(sc);
1673 				scb->cmdlen = sizeof(*sc);
1674 
1675 				scb->flags |= SCB_SENSE;
1676 				ahc_send_scb(ahc, scb);
1677 				/*
1678 				 * Ensure that the target is "BUSY"
1679 				 * so we don't get overlapping
1680 				 * commands if we happen to be doing
1681 				 * tagged I/O.
1682 				 */
1683 				ahc_busy_target(ahc, target, channel);
1684 
1685 				/*
1686 				 * Make us the next command to run
1687 				 */
1688 				ahc_add_waiting_scb(ahc, scb);
1689 				AHC_OUTB(ahc, RETURN_1, SEND_SENSE);
1690 				break;
1691 			}
1692 			/*
1693 			 * Clear the SCB_SENSE Flag and have
1694 			 * the sequencer do a normal command
1695 			 * complete with either a "DRIVER_STUFFUP"
1696 			 * error or whatever other error condition
1697 			 * we already had.
1698 			 */
1699 			scb->flags &= ~SCB_SENSE;
1700 			if (xs->error == XS_NOERROR)
1701 				xs->error = XS_DRIVER_STUFFUP;
1702 			break;
1703 		case SCSI_BUSY:
1704 			xs->error = XS_BUSY;
1705 			scsi_print_addr(xs->sc_link);
1706 			printf("Target Busy\n");
1707 			break;
1708 		case SCSI_QUEUE_FULL:
1709 			/*
1710 			 * The upper level SCSI code will someday
1711 			 * handle this properly.
1712 			 */
1713 			scsi_print_addr(xs->sc_link);
1714 			printf("Queue Full\n");
1715 			scb->flags |= SCB_ASSIGNEDQ;
1716 			STAILQ_INSERT_TAIL(&ahc->assigned_scbs,scb, links);
1717 			AHC_OUTB(ahc, RETURN_1, SEND_SENSE);
1718 			break;
1719 		default:
1720 			scsi_print_addr(xs->sc_link);
1721 			printf("unexpected targ_status: %x\n", scb->status);
1722 			xs->error = XS_DRIVER_STUFFUP;
1723 			break;
1724 		}
1725 		break;
1726 	}
1727 	case RESIDUAL:
1728 	{
1729 		int scb_index;
1730 		struct scsipi_xfer *xs;
1731 
1732 		scb_index = AHC_INB(ahc, SCB_TAG);
1733 		scb = ahc->scbarray[scb_index];
1734 		xs = scb->xs;
1735 		/*
1736 		 * Don't clobber valid resid info with
1737 		 * a resid coming from a check sense
1738 		 * operation.
1739 		 */
1740 		if (!(scb->flags & SCB_SENSE)) {
1741 			int resid_sgs;
1742 
1743 			/*
1744 			 * Remainder of the SG where the transfer
1745 			 * stopped.
1746 			 */
1747 			xs->resid = (AHC_INB(ahc, SCB_RESID_DCNT2)<<16) |
1748 				    (AHC_INB(ahc, SCB_RESID_DCNT1)<<8)  |
1749 				    AHC_INB(ahc, SCB_RESID_DCNT0);
1750 
1751 			/*
1752 			 * Add up the contents of all residual
1753 			 * SG segments that are after the SG where
1754 			 * the transfer stopped.
1755 			 */
1756 			resid_sgs = AHC_INB(ahc, SCB_RESID_SGCNT) - 1;
1757 			while (resid_sgs > 0) {
1758 				int sg;
1759 
1760 				sg = scb->SG_segment_count - resid_sgs;
1761 				xs->resid += scb->ahc_dma[sg].len;
1762 				resid_sgs--;
1763 			}
1764 
1765 #if defined(__FreeBSD__)
1766 			xs->flags |= SCSI_RESID_VALID;
1767 #elif defined(__NetBSD__)
1768 			/* XXX - Update to do this right */
1769 #endif
1770 #ifdef AHC_DEBUG
1771 			if (ahc_debug & AHC_SHOWMISC) {
1772 				scsi_print_addr(xs->sc_link);
1773 				printf("Handled Residual of %d bytes\n"
1774 				       ,xs->resid);
1775 			}
1776 #endif
1777 		}
1778 		break;
1779 	}
1780 	case ABORT_TAG:
1781 	{
1782 		int   scb_index;
1783 		struct scsipi_xfer *xs;
1784 
1785 		scb_index = AHC_INB(ahc, SCB_TAG);
1786 		scb = ahc->scbarray[scb_index];
1787 		xs = scb->xs;
1788 		/*
1789 		 * We didn't recieve a valid tag back from
1790 		 * the target on a reconnect.
1791 		 */
1792 		scsi_print_addr(xs->sc_link);
1793 		printf("invalid tag received -- sending ABORT_TAG\n");
1794 		xs->error = XS_DRIVER_STUFFUP;
1795 		untimeout(ahc_timeout, (caddr_t)scb);
1796 		ahc_done(ahc, scb);
1797 		break;
1798 	}
1799 	case AWAITING_MSG:
1800 	{
1801 		int   scb_index;
1802 		scb_index = AHC_INB(ahc, SCB_TAG);
1803 		scb = ahc->scbarray[scb_index];
1804 		/*
1805 		 * This SCB had a zero length command, informing
1806 		 * the sequencer that we wanted to send a special
1807 		 * message to this target.  We only do this for
1808 		 * BUS_DEVICE_RESET messages currently.
1809 		 */
1810 		if (scb->flags & SCB_DEVICE_RESET) {
1811 			AHC_OUTB(ahc, MSG0,
1812 				 MSG_BUS_DEV_RESET);
1813 			AHC_OUTB(ahc, MSG_LEN, 1);
1814 			printf("Bus Device Reset Message Sent\n");
1815 		} else if (scb->flags & SCB_MSGOUT_WDTR) {
1816 			ahc_construct_wdtr(ahc, AHC_INB(ahc, MSG_LEN),
1817 					   BUS_16_BIT);
1818 		} else if (scb->flags & SCB_MSGOUT_SDTR) {
1819 			u_int8_t target_scratch;
1820 			u_int8_t ultraenable;
1821 			int sxfr;
1822 			int i;
1823 
1824 			/* Pull the user defined setting */
1825 			target_scratch = AHC_INB(ahc, TARG_SCRATCH
1826 						 + scratch_offset);
1827 
1828 			sxfr = target_scratch & SXFR;
1829 			if (scratch_offset < 8)
1830 				ultraenable = AHC_INB(ahc, ULTRA_ENB);
1831 			else
1832 				ultraenable = AHC_INB(ahc, ULTRA_ENB + 1);
1833 
1834 			if (ultraenable & targ_mask)
1835 				/* Want an ultra speed in the table */
1836 				sxfr |= 0x100;
1837 
1838 			for (i = 0; i < ahc_num_syncrates; i++)
1839 				if (sxfr == ahc_syncrates[i].sxfr)
1840 					break;
1841 
1842 			ahc_construct_sdtr(ahc, AHC_INB(ahc, MSG_LEN),
1843 					   ahc_syncrates[i].period,
1844 					   target_scratch & WIDEXFER ?
1845 					   MAX_OFFSET_16BIT : MAX_OFFSET_8BIT);
1846 		} else
1847 			panic("ahc_intr: AWAITING_MSG for an SCB that "
1848 			      "does not have a waiting message");
1849 		break;
1850 	}
1851 	case IMMEDDONE:
1852 	{
1853 		/*
1854 		 * Take care of device reset messages
1855 		 */
1856 		u_char scbindex = AHC_INB(ahc, SCB_TAG);
1857 		scb = ahc->scbarray[scbindex];
1858 		if (scb->flags & SCB_DEVICE_RESET) {
1859 			u_char targ_scratch;
1860 			int found;
1861 			/*
1862 			 * Go back to async/narrow transfers and
1863 			 * renegotiate.
1864 			 */
1865 			ahc_unbusy_target(ahc, target, channel);
1866 			ahc->needsdtr |= ahc->needsdtr_orig & targ_mask;
1867 			ahc->needwdtr |= ahc->needwdtr_orig & targ_mask;
1868 			ahc->sdtrpending &= ~targ_mask;
1869 			ahc->wdtrpending &= ~targ_mask;
1870 			targ_scratch = AHC_INB(ahc, TARG_SCRATCH
1871 					       + scratch_offset);
1872 			targ_scratch &= SXFR;
1873 			AHC_OUTB(ahc, TARG_SCRATCH + scratch_offset,
1874 				 targ_scratch);
1875 			found = ahc_reset_device(ahc, target,
1876 						 channel, SCB_LIST_NULL,
1877 						 XS_NOERROR);
1878 			scsi_print_addr(scb->xs->sc_link);
1879 			printf("Bus Device Reset delivered. "
1880 			       "%d SCBs aborted\n", found);
1881 			ahc->in_timeout = FALSE;
1882 			ahc_run_done_queue(ahc);
1883 		} else
1884 			panic("ahc_intr: Immediate complete for "
1885 			      "unknown operation.");
1886 		break;
1887 	}
1888 	case DATA_OVERRUN:
1889 	{
1890 		/*
1891 		 * When the sequencer detects an overrun, it
1892 		 * sets STCNT to 0x00ffffff and allows the
1893 		 * target to complete its transfer in
1894 		 * BITBUCKET mode.
1895 		 */
1896 		u_char scbindex = AHC_INB(ahc, SCB_TAG);
1897 		u_int32_t overrun;
1898 		scb = ahc->scbarray[scbindex];
1899 		overrun = AHC_INB(ahc, STCNT0)
1900 			| (AHC_INB(ahc, STCNT1) << 8)
1901 			| (AHC_INB(ahc, STCNT2) << 16);
1902 		overrun = 0x00ffffff - overrun;
1903 		scsi_print_addr(scb->xs->sc_link);
1904 		printf("data overrun of %d bytes detected."
1905 		       "  Forcing a retry.\n", overrun);
1906 		/*
1907 		 * Set this and it will take affect when the
1908 		 * target does a command complete.
1909 		 */
1910 		scb->xs->error = XS_DRIVER_STUFFUP;
1911 		break;
1912 	}
1913 #if NOT_YET
1914 	/* XXX Fill these in later */
1915 	case MESG_BUFFER_BUSY:
1916 		break;
1917 	case MSGIN_PHASEMIS:
1918 		break;
1919 #endif
1920 	default:
1921 		printf("ahc_intr: seqint, "
1922 		       "intstat == 0x%x, scsisigi = 0x%x\n",
1923 		       intstat, AHC_INB(ahc, SCSISIGI));
1924 		break;
1925 	}
1926 
1927 clear:
1928 	/*
1929 	 * Clear the upper byte that holds SEQINT status
1930 	 * codes and clear the SEQINT bit.
1931 	 */
1932 	AHC_OUTB(ahc, CLRINT, CLRSEQINT);
1933 
1934 	/*
1935 	 *  The sequencer is paused immediately on
1936 	 *  a SEQINT, so we should restart it when
1937 	 *  we're done.
1938 	 */
1939 	unpause_sequencer(ahc, /*unpause_always*/TRUE);
1940 }
1941 
1942 /*
1943  * We have a scb which has been processed by the
1944  * adaptor, now we look to see how the operation
1945  * went.
1946  */
1947 static void
1948 ahc_done(ahc, scb)
1949 	struct ahc_data *ahc;
1950 	struct scb *scb;
1951 {
1952 	struct scsipi_xfer *xs = scb->xs;
1953 
1954 	SC_DEBUG(xs->sc_link, SDEV_DB2, ("ahc_done\n"));
1955 	/*
1956 	 * Put the results of the operation
1957 	 * into the xfer and call whoever started it
1958 	 */
1959 #if defined(__NetBSD__)
1960 	if (xs->error != XS_NOERROR) {
1961 		/* Don't override the error value. */
1962 	} else if (scb->flags & SCB_ABORTED) {
1963 		xs->error = XS_DRIVER_STUFFUP;
1964 	} else
1965 #endif
1966 	if(scb->flags & SCB_SENSE)
1967 		xs->error = XS_SENSE;
1968 	if(scb->flags & SCB_SENTORDEREDTAG)
1969 		ahc->in_timeout = FALSE;
1970 #if defined(__FreeBSD__)
1971 	if ((xs->flags & SCSI_ERR_OK) && !(xs->error == XS_SENSE)) {
1972 		/* All went correctly  OR errors expected */
1973 		xs->error = XS_NOERROR;
1974 	}
1975 #elif defined(__NetBSD__)
1976 	/*
1977 	 * Since NetBSD doesn't have error ignoring operation mode
1978 	 * (SCSI_ERR_OK in FreeBSD), we don't have to care this case.
1979 	 */
1980 #endif
1981 	xs->flags |= ITSDONE;
1982 #ifdef AHC_TAGENABLE
1983 	if(xs->cmd->opcode == INQUIRY && xs->error == XS_NOERROR)
1984 	{
1985 		struct scsipi_inquiry_data *inq_data;
1986 		u_short mask = 0x01 << (xs->sc_link->AIC_SCSI_TARGET |
1987 				(scb->tcl & 0x08));
1988 		/*
1989 		 * Sneak a look at the results of the SCSI Inquiry
1990 		 * command and see if we can do Tagged queing.  This
1991 		 * should really be done by the higher level drivers.
1992 		 */
1993 		inq_data = (struct scsipi_inquiry_data *)xs->data;
1994 		if((inq_data->flags & SID_CmdQue) && !(ahc->tagenable & mask))
1995 		{
1996 		        printf("%s: target %d Tagged Queuing Device\n",
1997 				ahc_name(ahc), xs->sc_link->AIC_SCSI_TARGET);
1998 			ahc->tagenable |= mask;
1999 			if(ahc->maxhscbs >= 16 || (ahc->flags & AHC_PAGESCBS)) {
2000 				/* Default to 8 tags */
2001 				xs->sc_link->opennings += 6;
2002 			}
2003 			else
2004 			{
2005 				/*
2006 				 * Default to 4 tags on whimpy
2007 				 * cards that don't have much SCB
2008 				 * space and can't page.  This prevents
2009 				 * a single device from hogging all
2010 				 * slots.  We should really have a better
2011 				 * way of providing fairness.
2012 				 */
2013 				xs->sc_link->opennings += 2;
2014 			}
2015 		}
2016 	}
2017 #endif
2018 	ahc_free_scb(ahc, scb, xs->flags);
2019 	scsipi_done(xs);
2020 
2021 #if defined(__NetBSD__)			/* XXX */
2022 	/*
2023 	 * If there are entries in the software queue, try to
2024 	 * run the first one.  We should be more or less guaranteed
2025 	 * to succeed, since we just freed an SCB.
2026 	 *
2027 	 * NOTE: ahc_scsi_cmd() relies on our calling it with
2028 	 * the first entry in the queue.
2029 	 */
2030 	if (ahc->sc_xxxq.lh_first != NULL)
2031 		(void) ahc_scsi_cmd(ahc->sc_xxxq.lh_first);
2032 #endif /* __NetBSD__ */
2033 }
2034 
2035 /*
2036  * Start the board, ready for normal operation
2037  */
2038 int
2039 ahc_init(ahc)
2040 	struct  ahc_data *ahc;
2041 {
2042 	u_int8_t  scsi_conf, sblkctl, i;
2043 	u_int16_t ultraenable = 0;
2044 	int	  max_targ = 15;
2045 	/*
2046 	 * Assume we have a board at this stage and it has been reset.
2047 	 */
2048 
2049 	/* Handle the SCBPAGING option */
2050 #ifndef AHC_SCBPAGING_ENABLE
2051 	ahc->flags &= ~AHC_PAGESCBS;
2052 #endif
2053 
2054 	/* Determine channel configuration and who we are on the scsi bus. */
2055 	switch ( (sblkctl = AHC_INB(ahc, SBLKCTL) & 0x0a) ) {
2056 	    case 0:
2057 		ahc->our_id = (AHC_INB(ahc, SCSICONF) & HSCSIID);
2058 		ahc->flags &= ~AHC_CHANNEL_B_PRIMARY;
2059 		if(ahc->type == AHC_394)
2060 			printf("Channel %c, SCSI Id=%d, ",
2061 				ahc->flags & AHC_CHNLB ? 'B' : 'A',
2062 				ahc->our_id);
2063 		else
2064 			printf("Single Channel, SCSI Id=%d, ", ahc->our_id);
2065 		AHC_OUTB(ahc, FLAGS, SINGLE_BUS | (ahc->flags & AHC_PAGESCBS));
2066 		break;
2067 	    case 2:
2068 		ahc->our_id = (AHC_INB(ahc, SCSICONF + 1) & HWSCSIID);
2069 		ahc->flags &= ~AHC_CHANNEL_B_PRIMARY;
2070 		if(ahc->type == AHC_394)
2071 			printf("Wide Channel %c, SCSI Id=%d, ",
2072 				ahc->flags & AHC_CHNLB ? 'B' : 'A',
2073 				ahc->our_id);
2074 		else
2075 			printf("Wide Channel, SCSI Id=%d, ", ahc->our_id);
2076 		ahc->type |= AHC_WIDE;
2077 		AHC_OUTB(ahc, FLAGS, WIDE_BUS | (ahc->flags & AHC_PAGESCBS));
2078 		break;
2079 	    case 8:
2080 		ahc->our_id = (AHC_INB(ahc, SCSICONF) & HSCSIID);
2081 		ahc->our_id_b = (AHC_INB(ahc, SCSICONF + 1) & HSCSIID);
2082 		printf("Twin Channel, A SCSI Id=%d, B SCSI Id=%d, ",
2083 			ahc->our_id, ahc->our_id_b);
2084 		ahc->type |= AHC_TWIN;
2085 		AHC_OUTB(ahc, FLAGS, TWIN_BUS | (ahc->flags & AHC_PAGESCBS));
2086 		break;
2087 	    default:
2088 		printf(" Unsupported adapter type.  Ignoring\n");
2089 		return(-1);
2090 	}
2091 
2092 	/* Determine the number of SCBs */
2093 
2094 	{
2095 		AHC_OUTB(ahc, SCBPTR, 0);
2096 		AHC_OUTB(ahc, SCB_CONTROL, 0);
2097 		for(i = 1; i < AHC_SCB_MAX; i++) {
2098 			AHC_OUTB(ahc, SCBPTR, i);
2099 			AHC_OUTB(ahc, SCB_CONTROL, i);
2100 			if(AHC_INB(ahc, SCB_CONTROL) != i)
2101 				break;
2102 			AHC_OUTB(ahc, SCBPTR, 0);
2103 			if(AHC_INB(ahc, SCB_CONTROL) != 0)
2104 				break;
2105 			/* Clear the control byte. */
2106 			AHC_OUTB(ahc, SCBPTR, i);
2107 			AHC_OUTB(ahc, SCB_CONTROL, 0);
2108 
2109 			ahc->qcntmask |= i;     /* Update the count mask. */
2110 		}
2111 
2112 		/* Ensure we clear the 0 SCB's control byte. */
2113 		AHC_OUTB(ahc, SCBPTR, 0);
2114 		AHC_OUTB(ahc, SCB_CONTROL, 0);
2115 
2116 		ahc->qcntmask |= i;
2117 		ahc->maxhscbs = i;
2118 	}
2119 
2120 	if((ahc->maxhscbs < AHC_SCB_MAX) && (ahc->flags & AHC_PAGESCBS))
2121 		ahc->maxscbs = AHC_SCB_MAX;
2122 	else {
2123 		ahc->maxscbs = ahc->maxhscbs;
2124 		ahc->flags &= ~AHC_PAGESCBS;
2125 	}
2126 
2127 	printf("%d SCBs\n", ahc->maxhscbs);
2128 
2129 #ifdef AHC_DEBUG
2130 	if(ahc_debug & AHC_SHOWMISC) {
2131 		struct scb	test;
2132 		printf("%s: hardware scb %ld bytes; kernel scb %d bytes; "
2133 		       "ahc_dma %d bytes\n",
2134 			ahc_name(ahc),
2135 		        (u_long)&(test.next) - (u_long)(&test),
2136 			sizeof(test),
2137 			sizeof(struct ahc_dma_seg));
2138 	}
2139 #endif /* AHC_DEBUG */
2140 
2141 	/* Set the SCSI Id, SXFRCTL0, SXFRCTL1, and SIMODE1, for both channels*/
2142 	if(ahc->type & AHC_TWIN)
2143 	{
2144 		/*
2145 		 * The device is gated to channel B after a chip reset,
2146 		 * so set those values first
2147 		 */
2148 		AHC_OUTB(ahc, SCSIID, ahc->our_id_b);
2149 		scsi_conf = AHC_INB(ahc, SCSICONF + 1);
2150 		AHC_OUTB(ahc, SXFRCTL1, (scsi_conf & (ENSPCHK|STIMESEL))
2151 					| ENSTIMER|ACTNEGEN|STPWEN);
2152 		AHC_OUTB(ahc, SIMODE1, ENSELTIMO|ENSCSIRST|ENSCSIPERR);
2153 		if(ahc->type & AHC_ULTRA)
2154 			AHC_OUTB(ahc, SXFRCTL0, DFON|SPIOEN|ULTRAEN);
2155 		else
2156 			AHC_OUTB(ahc, SXFRCTL0, DFON|SPIOEN);
2157 
2158 		if(scsi_conf & RESET_SCSI) {
2159 			/* Reset the bus */
2160 #if !defined(__NetBSD__) || (defined(__NetBSD__) && defined(DEBUG))
2161 			if(bootverbose)
2162 				printf("%s: Resetting Channel B\n",
2163 				       ahc_name(ahc));
2164 #endif
2165 			AHC_OUTB(ahc, SCSISEQ, SCSIRSTO);
2166 			DELAY(1000);
2167 			AHC_OUTB(ahc, SCSISEQ, 0);
2168 
2169 			/* Ensure we don't get a RSTI interrupt from this */
2170 			AHC_OUTB(ahc, CLRSINT1, CLRSCSIRSTI);
2171 			AHC_OUTB(ahc, CLRINT, CLRSCSIINT);
2172 		}
2173 
2174 		/* Select Channel A */
2175 		AHC_OUTB(ahc, SBLKCTL, 0);
2176 	}
2177 	AHC_OUTB(ahc, SCSIID, ahc->our_id);
2178 	scsi_conf = AHC_INB(ahc, SCSICONF);
2179 	AHC_OUTB(ahc, SXFRCTL1, (scsi_conf & (ENSPCHK|STIMESEL))
2180 				| ENSTIMER|ACTNEGEN|STPWEN);
2181 	AHC_OUTB(ahc, SIMODE1, ENSELTIMO|ENSCSIRST|ENSCSIPERR);
2182 	if(ahc->type & AHC_ULTRA)
2183 		AHC_OUTB(ahc, SXFRCTL0, DFON|SPIOEN|ULTRAEN);
2184 	else
2185 		AHC_OUTB(ahc, SXFRCTL0, DFON|SPIOEN);
2186 
2187 	if(scsi_conf & RESET_SCSI) {
2188 		/* Reset the bus */
2189 #if !defined(__NetBSD__) || (defined(__NetBSD__) && defined(DEBUG))
2190 		if(bootverbose)
2191 			printf("%s: Resetting Channel A\n", ahc_name(ahc));
2192 #endif
2193 
2194 		AHC_OUTB(ahc, SCSISEQ, SCSIRSTO);
2195 		DELAY(1000);
2196 		AHC_OUTB(ahc, SCSISEQ, 0);
2197 
2198 		/* Ensure we don't get a RSTI interrupt from this */
2199 		AHC_OUTB(ahc, CLRSINT1, CLRSCSIRSTI);
2200 		AHC_OUTB(ahc, CLRINT, CLRSCSIINT);
2201 	}
2202 
2203 	/*
2204 	 * Look at the information that board initialization or
2205 	 * the board bios has left us.  In the lower four bits of each
2206 	 * target's scratch space any value other than 0 indicates
2207 	 * that we should initiate synchronous transfers.  If it's zero,
2208 	 * the user or the BIOS has decided to disable synchronous
2209 	 * negotiation to that target so we don't activate the needsdtr
2210 	 * flag.
2211 	 */
2212 	ahc->needsdtr_orig = 0;
2213 	ahc->needwdtr_orig = 0;
2214 
2215 	/* Grab the disconnection disable table and invert it for our needs */
2216 	if(ahc->flags & AHC_USEDEFAULTS) {
2217 		printf("%s: Host Adapter Bios disabled.  Using default SCSI "
2218 			"device parameters\n", ahc_name(ahc));
2219 		ahc->discenable = 0xff;
2220 	}
2221 	else
2222 		ahc->discenable = ~((AHC_INB(ahc, DISC_DSB + 1) << 8)
2223 				   | AHC_INB(ahc, DISC_DSB));
2224 
2225 	if(!(ahc->type & (AHC_WIDE|AHC_TWIN)))
2226 		max_targ = 7;
2227 
2228 	for(i = 0; i <= max_targ; i++){
2229 		u_char target_settings;
2230 		if (ahc->flags & AHC_USEDEFAULTS) {
2231 			target_settings = 0; /* 10MHz */
2232 			ahc->needsdtr_orig |= (0x01 << i);
2233 			ahc->needwdtr_orig |= (0x01 << i);
2234 		}
2235 		else {
2236 			/* Take the settings leftover in scratch RAM. */
2237 			target_settings = AHC_INB(ahc, TARG_SCRATCH + i);
2238 
2239 			if(target_settings & 0x0f){
2240 				ahc->needsdtr_orig |= (0x01 << i);
2241 				/*Default to asynchronous transfers(0 offset)*/
2242 				target_settings &= 0xf0;
2243 			}
2244 			if(target_settings & 0x80){
2245 				ahc->needwdtr_orig |= (0x01 << i);
2246 				/*
2247 				 * We'll set the Wide flag when we
2248 				 * are successful with Wide negotiation.
2249 				 * Turn it off for now so we aren't
2250 				 * confused.
2251 				 */
2252 				target_settings &= 0x7f;
2253 			}
2254 			if(ahc->type & AHC_ULTRA) {
2255 				/*
2256 				 * Enable Ultra for any target that
2257 				 * has a valid ultra syncrate setting.
2258 				 */
2259 				u_char rate = target_settings & 0x70;
2260 				if(rate == 0x00 || rate == 0x10 ||
2261 				   rate == 0x20 || rate == 0x40) {
2262 					if(rate == 0x40) {
2263 						/* Treat 10MHz specially */
2264 						target_settings &= ~0x70;
2265 					}
2266 					else
2267 						ultraenable |= (0x01 << i);
2268 				}
2269 			}
2270 		}
2271 		AHC_OUTB(ahc, TARG_SCRATCH+i,target_settings);
2272 	}
2273 	/*
2274 	 * If we are not a WIDE device, forget WDTR.  This
2275 	 * makes the driver work on some cards that don't
2276 	 * leave these fields cleared when the BIOS is not
2277 	 * installed.
2278 	 */
2279 	if(!(ahc->type & AHC_WIDE))
2280 		ahc->needwdtr_orig = 0;
2281 	ahc->needsdtr = ahc->needsdtr_orig;
2282 	ahc->needwdtr = ahc->needwdtr_orig;
2283 	ahc->sdtrpending = 0;
2284 	ahc->wdtrpending = 0;
2285 	ahc->tagenable = 0;
2286 	ahc->orderedtag = 0;
2287 
2288 	AHC_OUTB(ahc, ULTRA_ENB, ultraenable & 0xff);
2289 	AHC_OUTB(ahc, ULTRA_ENB + 1, (ultraenable >> 8) & 0xff);
2290 
2291 #ifdef AHC_DEBUG
2292 	/* How did we do? */
2293 	if(ahc_debug & AHC_SHOWMISC)
2294 		printf("NEEDSDTR == 0x%x\nNEEDWDTR == 0x%x\n"
2295 			"DISCENABLE == 0x%x\n", ahc->needsdtr,
2296 			ahc->needwdtr, ahc->discenable);
2297 #endif
2298 	/*
2299 	 * Set the number of available SCBs
2300 	 */
2301 	AHC_OUTB(ahc, SCBCOUNT, ahc->maxhscbs);
2302 
2303 	/*
2304 	 * 2's compliment of maximum tag value
2305 	 */
2306 	i = ahc->maxscbs;
2307 	AHC_OUTB(ahc, COMP_SCBCOUNT, -i & 0xff);
2308 
2309 	/*
2310 	 * QCount mask to deal with broken aic7850s that
2311 	 * sporadically get garbage in the upper bits of
2312 	 * their QCount registers.
2313 	 */
2314 	AHC_OUTB(ahc, QCNTMASK, ahc->qcntmask);
2315 
2316 	/* We don't have any busy targets right now */
2317 	AHC_OUTB(ahc, ACTIVE_A, 0);
2318 	AHC_OUTB(ahc, ACTIVE_B, 0);
2319 
2320 	/* We don't have any waiting selections */
2321 	AHC_OUTB(ahc, WAITING_SCBH, SCB_LIST_NULL);
2322 
2323 	/* Our disconnection list is empty too */
2324 	AHC_OUTB(ahc, DISCONNECTED_SCBH, SCB_LIST_NULL);
2325 
2326 	/* Message out buffer starts empty */
2327 	AHC_OUTB(ahc, MSG_LEN, 0x00);
2328 
2329 	/*
2330 	 * Load the Sequencer program and Enable the adapter
2331 	 * in "fast" mode.
2332          */
2333 #if !defined(__NetBSD__) || (defined(__NetBSD__) && defined(DEBUG))
2334 	if(bootverbose)
2335 		printf("%s: Downloading Sequencer Program...",
2336 		       ahc_name(ahc));
2337 #endif
2338 
2339 	ahc_loadseq(ahc);
2340 
2341 #if !defined(__NetBSD__) || (defined(__NetBSD__) && defined(DEBUG))
2342 	if(bootverbose)
2343 		printf("Done\n");
2344 #endif
2345 
2346 	AHC_OUTB(ahc, SEQCTL, FASTMODE);
2347 
2348 	unpause_sequencer(ahc, /*unpause_always*/TRUE);
2349 
2350 	/*
2351 	 * Note that we are going and return (to probe)
2352 	 */
2353 	ahc->flags |= AHC_INIT;
2354 	return (0);
2355 }
2356 
2357 static void
2358 ahcminphys(bp)
2359         struct buf *bp;
2360 {
2361 /*
2362  * Even though the card can transfer up to 16megs per command
2363  * we are limited by the number of segments in the dma segment
2364  * list that we can hold.  The worst case is that all pages are
2365  * discontinuous physically, hense the "page per segment" limit
2366  * enforced here.
2367  */
2368         if (bp->b_bcount > ((AHC_NSEG - 1) * PAGE_SIZE)) {
2369                 bp->b_bcount = ((AHC_NSEG - 1) * PAGE_SIZE);
2370         }
2371 #if defined(__NetBSD__)
2372 	minphys(bp);
2373 #endif
2374 }
2375 
2376 #if defined(__NetBSD__)			/* XXX */
2377 /*
2378  * Insert a scsipi_xfer into the software queue.  We overload xs->free_list
2379  * to to ensure we don't run into a queue resource shortage, and keep
2380  * a pointer to the last entry around to make insertion O(C).
2381  */
2382 static void
2383 ahc_xxx_enqueue(ahc, xs, infront)
2384 	struct ahc_data *ahc;
2385 	struct scsipi_xfer *xs;
2386 	int infront;
2387 {
2388 
2389 	if (infront || ahc->sc_xxxq.lh_first == NULL) {
2390 		if (ahc->sc_xxxq.lh_first == NULL)
2391 			ahc->sc_xxxqlast = xs;
2392 		LIST_INSERT_HEAD(&ahc->sc_xxxq, xs, free_list);
2393 		return;
2394 	}
2395 
2396 	LIST_INSERT_AFTER(ahc->sc_xxxqlast, xs, free_list);
2397 	ahc->sc_xxxqlast = xs;
2398 }
2399 
2400 /*
2401  * Pull a scsipi_xfer off the front of the software queue.  When we
2402  * pull the last one off, we need to clear the pointer to the last
2403  * entry.
2404  */
2405 static struct scsipi_xfer *
2406 ahc_xxx_dequeue(ahc)
2407 	struct ahc_data *ahc;
2408 {
2409 	struct scsipi_xfer *xs;
2410 
2411 	xs = ahc->sc_xxxq.lh_first;
2412 	LIST_REMOVE(xs, free_list);
2413 
2414 	if (ahc->sc_xxxq.lh_first == NULL)
2415 		ahc->sc_xxxqlast = NULL;
2416 
2417 	return (xs);
2418 }
2419 #endif
2420 
2421 /*
2422  * start a scsi operation given the command and
2423  * the data address, target, and lun all of which
2424  * are stored in the scsipi_xfer struct
2425  */
2426 static int32_t
2427 ahc_scsi_cmd(xs)
2428         struct scsipi_xfer *xs;
2429 {
2430 	struct	scb *scb;
2431 	struct	ahc_dma_seg *sg;
2432 	int	seg;		/* scatter gather seg being worked on */
2433 	unsigned long thiskv, nextkv;
2434 	physaddr thisphys, nextphys;
2435 	int	bytes_this_seg, bytes_this_page, datalen, flags;
2436 	struct	ahc_data *ahc;
2437 	u_short	mask;
2438 	int	s;
2439 #if defined(__NetBSD__)			/* XXX */
2440 	int	dontqueue = 0, fromqueue = 0;
2441 #endif
2442 
2443 	ahc = (struct ahc_data *)xs->sc_link->adapter_softc;
2444 	mask = (0x01 << (xs->sc_link->AIC_SCSI_TARGET
2445 #if defined(__FreeBSD__)
2446 				| ((u_long)xs->sc_link->fordriver & 0x08)));
2447 #elif defined(__NetBSD__)
2448 			| (IS_SCSIBUS_B(ahc, xs->sc_link) ? SELBUSB : 0) ));
2449 #endif
2450 
2451 	SC_DEBUG(xs->sc_link, SDEV_DB2, ("ahc_scsi_cmd\n"));
2452 
2453 #if defined(__NetBSD__)			/* XXX */
2454 	/* must protect the queue */
2455 	s = splbio();
2456 
2457 	/*
2458 	 * If we're running the queue from ahc_done(), we're called
2459 	 * with the first entry in the queue as our argument.
2460 	 * Pull it off; if we can't run the job, it will get placed
2461 	 * back at the front.
2462 	 */
2463 	if (xs == ahc->sc_xxxq.lh_first) {
2464 		xs = ahc_xxx_dequeue(ahc);
2465 		fromqueue = 1;
2466 		goto get_scb;
2467 	}
2468 
2469 	/* determine safety of software queueing */
2470 	dontqueue = xs->flags & SCSI_POLL;
2471 
2472 	/*
2473 	 * Handle situations where there's already entries in the
2474 	 * queue.
2475 	 */
2476 	if (ahc->sc_xxxq.lh_first != NULL) {
2477 		/*
2478 		 * If we can't queue, we have to abort, since
2479 		 * we have to preserve order.
2480 		 */
2481 		if (dontqueue) {
2482 			splx(s);
2483 			xs->error = XS_DRIVER_STUFFUP;
2484 			return (TRY_AGAIN_LATER);
2485 		}
2486 
2487 		/*
2488 		 * Swap with the first queue entry.
2489 		 */
2490 		ahc_xxx_enqueue(ahc, xs, 0);
2491 		xs = ahc_xxx_dequeue(ahc);
2492 		fromqueue = 1;
2493 	}
2494 
2495  get_scb:
2496 #endif /* __NetBSD__ */
2497 	/*
2498 	 * get an scb to use. If the transfer
2499 	 * is from a buf (possibly from interrupt time)
2500 	 * then we can't allow it to sleep
2501 	 */
2502 	flags = xs->flags;
2503 	if (flags & ITSDONE) {
2504 		printf("%s: Already done?", ahc_name(ahc));
2505 		xs->flags &= ~ITSDONE;
2506 	}
2507 	if (!(flags & INUSE)) {
2508 		printf("%s: Not in use?", ahc_name(ahc));
2509 		xs->flags |= INUSE;
2510 	}
2511 	if (!(scb = ahc_get_scb(ahc, flags))) {
2512 #if defined(__NetBSD__)			/* XXX */
2513 		/*
2514 		 * If we can't queue, we lose.
2515 		 */
2516 		if (dontqueue) {
2517 			splx(s);
2518 			xs->error = XS_DRIVER_STUFFUP;
2519 			return (TRY_AGAIN_LATER);
2520 		}
2521 
2522 		/*
2523 		 * If we were pulled off the queue, put ourselves
2524 		 * back in the front, otherwise tack ourselves onto
2525 		 * the end.
2526 		 */
2527 		ahc_xxx_enqueue(ahc, xs, fromqueue);
2528 
2529 		splx(s);
2530 		return (SUCCESSFULLY_QUEUED);
2531 #else
2532 		xs->error = XS_DRIVER_STUFFUP;
2533 		return (TRY_AGAIN_LATER);
2534 #endif /* __NetBSD__ */
2535 	}
2536 
2537 #if defined(__NetBSD__)
2538 	/* we're done playing with the queue */
2539 	splx(s);
2540 #endif
2541 
2542 	SC_DEBUG(xs->sc_link, SDEV_DB3, ("start scb(%p)\n", scb));
2543 	scb->xs = xs;
2544 	if (flags & SCSI_RESET) {
2545 		scb->flags |= SCB_DEVICE_RESET|SCB_IMMED;
2546 		scb->control |= MK_MESSAGE;
2547 	}
2548 	/*
2549 	 * Put all the arguments for the xfer in the scb
2550 	 */
2551 
2552 	if(ahc->tagenable & mask) {
2553 		scb->control |= TAG_ENB;
2554 		if(ahc->orderedtag & mask) {
2555 			printf("Ordered Tag sent\n");
2556 			scb->control |= 0x02;
2557 			ahc->orderedtag &= ~mask;
2558 		}
2559 	}
2560 	if(ahc->discenable & mask)
2561 		scb->control |= DISCENB;
2562 	if((ahc->needwdtr & mask) && !(ahc->wdtrpending & mask))
2563 	{
2564 		scb->control |= MK_MESSAGE;
2565 		scb->flags |= SCB_MSGOUT_WDTR;
2566 		ahc->wdtrpending |= mask;
2567 	}
2568 	else if((ahc->needsdtr & mask) && !(ahc->sdtrpending & mask))
2569 	{
2570 		scb->control |= MK_MESSAGE;
2571 		scb->flags |= SCB_MSGOUT_SDTR;
2572 		ahc->sdtrpending |= mask;
2573 	}
2574 	scb->tcl = ((xs->sc_link->AIC_SCSI_TARGET << 4) & 0xF0) |
2575 #if defined(__FreeBSD__)
2576 				  ((u_long)xs->sc_link->fordriver & 0x08) |
2577 #elif defined(__NetBSD__)
2578 				  (IS_SCSIBUS_B(ahc,xs->sc_link)? SELBUSB : 0)|
2579 #endif
2580 				  (xs->sc_link->AIC_SCSI_LUN & 0x07);
2581 	scb->cmdlen = xs->cmdlen;
2582 	scb->cmdpointer = KVTOPHYS(xs->cmd);
2583 	xs->resid = 0;
2584 	xs->status = 0;
2585 	if (xs->datalen) {      /* should use S/G only if not zero length */
2586 		scb->SG_list_pointer = KVTOPHYS(scb->ahc_dma);
2587 		sg = scb->ahc_dma;
2588 		seg = 0;
2589 		/*
2590 		 * Set up the scatter gather block
2591 		 */
2592 		SC_DEBUG(xs->sc_link, SDEV_DB4,
2593 			 ("%ld @%p:- ", (long)xs->datalen, xs->data));
2594 		datalen = xs->datalen;
2595 		thiskv = (unsigned long) xs->data;
2596 		thisphys = KVTOPHYS(thiskv);
2597 
2598 		while ((datalen) && (seg < AHC_NSEG)) {
2599 			bytes_this_seg = 0;
2600 
2601 			/* put in the base address */
2602 			sg->addr = thisphys;
2603 
2604 			SC_DEBUGN(xs->sc_link, SDEV_DB4, ("0x%lx", (u_long)thisphys));
2605 
2606 			/* do it at least once */
2607 			nextphys = thisphys;
2608 			while ((datalen) && (thisphys == nextphys)) {
2609 				/*
2610 				 * This page is contiguous (physically)
2611 				 * with the the last, just extend the
2612 				 * length
2613 				 */
2614 				/* how far to the end of the page */
2615 				nextphys = (thisphys & (~(PAGE_SIZE- 1)))
2616 					   + PAGE_SIZE;
2617 				bytes_this_page = nextphys - thisphys;
2618 				/**** or the data ****/
2619 				bytes_this_page = min(bytes_this_page, datalen);
2620 				bytes_this_seg += bytes_this_page;
2621 				datalen -= bytes_this_page;
2622 
2623 				/* get more ready for the next page */
2624 				nextkv = thiskv;
2625 				nextkv &= ~((unsigned long) PAGE_SIZE - 1);
2626 				nextkv += PAGE_SIZE;
2627 				if (datalen)
2628 					thisphys = KVTOPHYS(nextkv);
2629 				thiskv = nextkv;
2630 			}
2631 			/*
2632 			 * next page isn't contiguous, finish the seg
2633 			 */
2634 			SC_DEBUGN(xs->sc_link, SDEV_DB4,
2635 					("(0x%x)", bytes_this_seg));
2636 			sg->len = bytes_this_seg;
2637 			sg++;
2638 			seg++;
2639 		}
2640 		scb->SG_segment_count = seg;
2641 
2642 		/* Copy the first SG into the data pointer area */
2643 		scb->data = scb->ahc_dma->addr;
2644 		scb->datalen = scb->ahc_dma->len;
2645 		SC_DEBUGN(xs->sc_link, SDEV_DB4, ("\n"));
2646 		if (datalen) {
2647 			/* there's still data, must have run out of segs! */
2648 			printf("%s: ahc_scsi_cmd: more than %d DMA segs\n",
2649 				ahc_name(ahc), AHC_NSEG);
2650 			xs->error = XS_DRIVER_STUFFUP;
2651 			ahc_free_scb(ahc, scb, flags);
2652 			return (COMPLETE);
2653 		}
2654 #ifdef AHC_BROKEN_CACHE
2655 		if (ahc_broken_cache)
2656 			INVALIDATE_CACHE();
2657 #endif
2658 	}
2659 	else {
2660 		/*
2661 		 * No data xfer, use non S/G values
2662 	 	 */
2663 		scb->SG_segment_count = 0;
2664 		scb->SG_list_pointer = 0;
2665 		scb->data = 0;
2666 		scb->datalen = 0;
2667 	}
2668 
2669 #ifdef AHC_DEBUG
2670 	if((ahc_debug & AHC_SHOWSCBS) &&
2671 		(xs->sc_link->AIC_SCSI_TARGET == DEBUGTARG))
2672 		ahc_print_scb(scb);
2673 #endif
2674 	s = splbio();
2675 
2676 	if( scb->position != SCB_LIST_NULL )
2677 	{
2678 		/* We already have a valid slot */
2679 		u_char curscb;
2680 
2681 		pause_sequencer(ahc);
2682 		curscb = AHC_INB(ahc, SCBPTR);
2683 		AHC_OUTB(ahc, SCBPTR, scb->position);
2684 		ahc_send_scb(ahc, scb);
2685 		AHC_OUTB(ahc, SCBPTR, curscb);
2686 		AHC_OUTB(ahc, QINFIFO, scb->position);
2687 		unpause_sequencer(ahc, /*unpause_always*/FALSE);
2688 		scb->flags |= SCB_ACTIVE;
2689 		if (!(flags & SCSI_NOMASK)) {
2690 			timeout(ahc_timeout, (caddr_t)scb,
2691 				(xs->timeout * hz) / 1000);
2692 		}
2693 		SC_DEBUG(xs->sc_link, SDEV_DB3, ("cmd_sent\n"));
2694 	}
2695 	else {
2696 		scb->flags |= SCB_WAITINGQ;
2697 		STAILQ_INSERT_TAIL(&ahc->waiting_scbs, scb, links);
2698 		ahc_run_waiting_queues(ahc);
2699 	}
2700 	if (!(flags & SCSI_NOMASK)) {
2701 		splx(s);
2702 		return (SUCCESSFULLY_QUEUED);
2703 	}
2704 	/*
2705 	 * If we can't use interrupts, poll for completion
2706 	 */
2707 	SC_DEBUG(xs->sc_link, SDEV_DB3, ("cmd_poll\n"));
2708 	do {
2709 		if (ahc_poll(ahc, xs->timeout)) {
2710 			if (!(xs->flags & SCSI_SILENT))
2711 				printf("cmd fail\n");
2712 			ahc_timeout(scb);
2713 			break;
2714 		}
2715 	} while (!(xs->flags & ITSDONE));  /* a non command complete intr */
2716 	splx(s);
2717 	return (COMPLETE);
2718 }
2719 
2720 
2721 /*
2722  * A scb (and hence an scb entry on the board) is put onto the
2723  * free list.
2724  */
2725 static void
2726 ahc_free_scb(ahc, scb, flags)
2727         struct	ahc_data *ahc;
2728         int     flags;
2729         struct  scb *scb;
2730 {
2731 	struct scb *wscb;
2732 	unsigned int opri;
2733 
2734 	opri = splbio();
2735 
2736 	/* Clean up for the next user */
2737 	scb->flags = SCB_FREE;
2738 	scb->control = 0;
2739 	scb->status = 0;
2740 
2741 	if(scb->position == SCB_LIST_NULL) {
2742 		STAILQ_INSERT_HEAD(&ahc->page_scbs, scb, links);
2743 		if(!scb->links.stqe_next && !ahc->free_scbs.stqh_first)
2744 			/*
2745 			 * If there were no SCBs available, wake anybody waiting
2746 			 * for one to come free.
2747 			 */
2748 			wakeup((caddr_t)&ahc->free_scbs);
2749 	}
2750 	/*
2751 	 * If there are any SCBS on the waiting queue,
2752 	 * assign the slot of this "freed" SCB to the first
2753 	 * one.  We'll run the waiting queues after all command
2754 	 * completes for a particular interrupt are completed
2755 	 * or when we start another command.
2756 	 */
2757 	else if((wscb = ahc->waiting_scbs.stqh_first) != NULL) {
2758 		STAILQ_REMOVE_HEAD(&ahc->waiting_scbs, links);
2759 		wscb->position = scb->position;
2760 		STAILQ_INSERT_TAIL(&ahc->assigned_scbs, wscb, links);
2761 		wscb->flags ^= SCB_WAITINGQ|SCB_ASSIGNEDQ;
2762 
2763 		/*
2764 		 * The "freed" SCB will need to be assigned a slot
2765 		 * before being used, so put it in the page_scbs
2766 		 * queue.
2767 		 */
2768 		scb->position = SCB_LIST_NULL;
2769 		STAILQ_INSERT_HEAD(&ahc->page_scbs, scb, links);
2770 		if(!scb->links.stqe_next && !ahc->free_scbs.stqh_first)
2771 			/*
2772 			 * If there were no SCBs available, wake anybody waiting
2773 			 * for one to come free.
2774 			 */
2775 			wakeup((caddr_t)&ahc->free_scbs);
2776 	}
2777 	else {
2778 		STAILQ_INSERT_HEAD(&ahc->free_scbs, scb, links);
2779 		if(!scb->links.stqe_next && !ahc->page_scbs.stqh_first)
2780 			/*
2781 			 * If there were no SCBs available, wake anybody waiting
2782 			 * for one to come free.
2783 			 */
2784 			wakeup((caddr_t)&ahc->free_scbs);
2785 	}
2786 #ifdef AHC_DEBUG
2787 	ahc->activescbs--;
2788 #endif
2789 	splx(opri);
2790 }
2791 
2792 /*
2793  * Get a free scb, either one already assigned to a hardware slot
2794  * on the adapter or one that will require an SCB to be paged out before
2795  * use. If there are none, see if we can allocate a new SCB.  Otherwise
2796  * either return an error or sleep.
2797  */
2798 static struct scb *
2799 ahc_get_scb(ahc, flags)
2800         struct	ahc_data *ahc;
2801         int	flags;
2802 {
2803 	unsigned opri;
2804 	struct scb *scbp;
2805 
2806 	opri = splbio();
2807 	/*
2808 	 * If we can and have to, sleep waiting for one to come free
2809 	 * but only if we can't allocate a new one.
2810 	 */
2811 	while (1) {
2812 		if((scbp = ahc->free_scbs.stqh_first)) {
2813 			STAILQ_REMOVE_HEAD(&ahc->free_scbs, links);
2814 		}
2815 		else if((scbp = ahc->page_scbs.stqh_first)) {
2816 			STAILQ_REMOVE_HEAD(&ahc->page_scbs, links);
2817 		}
2818 		else if(ahc->numscbs < ahc->maxscbs) {
2819 			scbp = (struct scb *) malloc(sizeof(struct scb),
2820 				M_TEMP, M_NOWAIT);
2821 			if (scbp) {
2822 				bzero(scbp, sizeof(struct scb));
2823 				scbp->tag = ahc->numscbs;
2824 				if( ahc->numscbs < ahc->maxhscbs )
2825 					scbp->position = ahc->numscbs;
2826 				else
2827 					scbp->position = SCB_LIST_NULL;
2828 				ahc->numscbs++;
2829 				/*
2830 				 * Place in the scbarray
2831 				 * Never is removed.
2832 				 */
2833 				ahc->scbarray[scbp->tag] = scbp;
2834 			}
2835 			else {
2836 				printf("%s: Can't malloc SCB\n",
2837 				       ahc_name(ahc));
2838 			}
2839 		}
2840 		else {
2841 			if (!(flags & SCSI_NOSLEEP)) {
2842 				tsleep((caddr_t)&ahc->free_scbs, PRIBIO,
2843 					"ahcscb", 0);
2844 				continue;
2845 			}
2846 		}
2847 		break;
2848 	}
2849 
2850 #ifdef AHC_DEBUG
2851 	if (scbp) {
2852 		ahc->activescbs++;
2853 		if((ahc_debug & AHC_SHOWSCBCNT)
2854 		  && (ahc->activescbs == ahc->maxhscbs))
2855 			printf("%s: Max SCBs active\n", ahc_name(ahc));
2856 	}
2857 #endif
2858 
2859 	splx(opri);
2860 
2861 	return (scbp);
2862 }
2863 
2864 static void ahc_loadseq(ahc)
2865 	struct ahc_data *ahc;
2866 {
2867         static u_char seqprog[] = {
2868 #if defined(__FreeBSD__)
2869 #               include "aic7xxx_seq.h"
2870 #endif
2871 #if defined(__NetBSD__)
2872 #		include <dev/microcode/aic7xxx/aic7xxx_seq.h>
2873 #endif
2874 	};
2875 
2876 	AHC_OUTB(ahc, SEQCTL, PERRORDIS|SEQRESET|LOADRAM);
2877 
2878 	AHC_OUTSB(ahc, SEQRAM, seqprog, sizeof(seqprog));
2879 
2880 	do {
2881 		AHC_OUTB(ahc, SEQCTL, SEQRESET|FASTMODE);
2882 	} while((AHC_INB(ahc, SEQADDR0) != 0)
2883 		|| (AHC_INB(ahc, SEQADDR1) != 0));
2884 }
2885 
2886 /*
2887  * Function to poll for command completion when
2888  * interrupts are disabled (crash dumps)
2889  */
2890 static int
2891 ahc_poll(ahc, wait)
2892 	struct	ahc_data *ahc;
2893 	int	wait; /* in msec */
2894 {
2895 	while (--wait) {
2896 		DELAY(1000);
2897 		if (AHC_INB(ahc, INTSTAT) & INT_PEND)
2898 			break;
2899 	} if (wait == 0) {
2900 		printf("%s: board is not responding\n", ahc_name(ahc));
2901 		return (EIO);
2902 	}
2903 	ahc_intr((void *)ahc);
2904 	return (0);
2905 }
2906 
2907 static void
2908 ahc_timeout(arg)
2909 	void	*arg;
2910 {
2911 	struct	scb *scb = (struct scb *)arg;
2912 	struct	ahc_data *ahc;
2913 	int	s, found;
2914 	u_char	bus_state;
2915 	char	channel;
2916 
2917 	s = splbio();
2918 
2919 	if (!(scb->flags & SCB_ACTIVE)) {
2920 		/* Previous timeout took care of me already */
2921 		splx(s);
2922 		return;
2923 	}
2924 
2925 	ahc = (struct ahc_data *)scb->xs->sc_link->adapter_softc;
2926 
2927 	if (ahc->in_timeout) {
2928 		/*
2929 		 * Some other SCB has started a recovery operation
2930 		 * and is still working on cleaning things up.
2931 		 */
2932 		if (scb->flags & SCB_TIMEDOUT) {
2933 			/*
2934 			 * This SCB has been here before and is not the
2935 			 * recovery SCB. Cut our losses and panic.  Its
2936 			 * better to do this than trash a filesystem.
2937 			 */
2938 			panic("%s: Timed-out command times out "
2939 				"again\n", ahc_name(ahc));
2940 		}
2941 		else if (!(scb->flags & SCB_ABORTED))
2942 		{
2943 			/*
2944 			 * This is not the SCB that started this timeout
2945 			 * processing.  Give this scb another lifetime so
2946 			 * that it can continue once we deal with the
2947 			 * timeout.
2948 			 */
2949 			scb->flags |= SCB_TIMEDOUT;
2950 			timeout(ahc_timeout, (caddr_t)scb,
2951 				(scb->xs->timeout * hz) / 1000);
2952 			splx(s);
2953 			return;
2954 		}
2955 	}
2956 	ahc->in_timeout = TRUE;
2957 
2958 	/*
2959 	 * Ensure that the card doesn't do anything
2960 	 * behind our back.
2961 	 */
2962 	pause_sequencer(ahc);
2963 
2964 	scsi_print_addr(scb->xs->sc_link);
2965 	printf("timed out ");
2966 	/*
2967 	 * Take a snapshot of the bus state and print out
2968 	 * some information so we can track down driver bugs.
2969 	 */
2970 	bus_state = AHC_INB(ahc, LASTPHASE);
2971 
2972 	switch(bus_state & PHASE_MASK)
2973 	{
2974 		case P_DATAOUT:
2975 			printf("in dataout phase");
2976 			break;
2977 		case P_DATAIN:
2978 			printf("in datain phase");
2979 			break;
2980 		case P_COMMAND:
2981 			printf("in command phase");
2982 			break;
2983 		case P_MESGOUT:
2984 			printf("in message out phase");
2985 			break;
2986 		case P_STATUS:
2987 			printf("in status phase");
2988 			break;
2989 		case P_MESGIN:
2990 			printf("in message in phase");
2991 			break;
2992 		default:
2993 			printf("while idle, LASTPHASE == 0x%x",
2994 				bus_state);
2995 			/*
2996 			 * We aren't in a valid phase, so assume we're
2997 			 * idle.
2998 			 */
2999 			bus_state = 0;
3000 			break;
3001 	}
3002 
3003 	printf(", SCSISIGI == 0x%x\n", AHC_INB(ahc, SCSISIGI));
3004 
3005 	/* Decide our course of action */
3006 
3007 	if(scb->flags & SCB_ABORTED)
3008 	{
3009 		/*
3010 		 * Been down this road before.
3011 		 * Do a full bus reset.
3012 		 */
3013 		char channel = (scb->tcl & SELBUSB)
3014 			   ? 'B': 'A';
3015 		found = ahc_reset_channel(ahc, channel, scb->tag,
3016 					  XS_TIMEOUT, /*Initiate Reset*/TRUE);
3017 		printf("%s: Issued Channel %c Bus Reset #1. "
3018 		       "%d SCBs aborted\n", ahc_name(ahc), channel, found);
3019 		ahc->in_timeout = FALSE;
3020 	}
3021 	else if(scb->control & TAG_ENB) {
3022 		/*
3023 		 * We could be starving this command
3024 		 * try sending an ordered tag command
3025 		 * to the target we come from.
3026 		 */
3027 		scb->flags |= SCB_ABORTED|SCB_SENTORDEREDTAG;
3028 		ahc->orderedtag |= 0xFF;
3029 		timeout(ahc_timeout, (caddr_t)scb, (5 * hz));
3030 		unpause_sequencer(ahc, /*unpause_always*/FALSE);
3031 		printf("Ordered Tag queued\n");
3032 		goto done;
3033 	}
3034 	else {
3035 		/*
3036 		 * Send a Bus Device Reset Message:
3037 		 * The target that is holding up the bus may not
3038 		 * be the same as the one that triggered this timeout
3039 		 * (different commands have different timeout lengths).
3040 		 * It is also impossible to get a message to a target
3041 		 * if we are in a "frozen" data transfer phase.  Our
3042 		 * strategy here is to queue a bus device reset message
3043 		 * to the timed out target if it is disconnected.
3044 		 * Otherwise, if we have an active target we stuff the
3045 		 * message buffer with a bus device reset message and
3046 		 * assert ATN in the hopes that the target will let go
3047 		 * of the bus and finally disconnect.  If this fails,
3048 		 * we'll get another timeout 2 seconds later which will
3049 		 * cause a bus reset.
3050 		 *
3051 		 * XXX If the SCB is paged out, we simply reset the
3052 		 *     bus.  We should probably queue a new command
3053 		 *     instead.
3054 		 */
3055 
3056 		/* Test to see if scb is disconnected */
3057 		if( !(scb->flags & SCB_PAGED_OUT ) ){
3058 			u_char active_scb;
3059 			struct scb *active_scbp;
3060 
3061 			active_scb = AHC_INB(ahc, SCBPTR);
3062 			active_scbp = ahc->scbarray[AHC_INB(ahc, SCB_TAG)];
3063 			AHC_OUTB(ahc, SCBPTR, scb->position);
3064 
3065 			if(AHC_INB(ahc, SCB_CONTROL) & DISCONNECTED) {
3066 				if(ahc->flags & AHC_PAGESCBS) {
3067 					/*
3068 					 * Pull this SCB out of the
3069 					 * disconnected list.
3070 					 */
3071 					u_char prev = AHC_INB(ahc, SCB_PREV);
3072 					u_char next = AHC_INB(ahc, SCB_NEXT);
3073 					if(prev == SCB_LIST_NULL) {
3074 						/* At the head */
3075 						AHC_OUTB(ahc, DISCONNECTED_SCBH,
3076 						     next );
3077 					}
3078 					else {
3079 						AHC_OUTB(ahc, SCBPTR, prev);
3080 						AHC_OUTB(ahc, SCB_NEXT, next);
3081 						if(next != SCB_LIST_NULL) {
3082 							AHC_OUTB(ahc, SCBPTR,
3083 							     next);
3084 							AHC_OUTB(ahc, SCB_PREV,
3085 							     prev);
3086 						}
3087 						AHC_OUTB(ahc, SCBPTR,
3088 						     scb->position);
3089 					}
3090 				}
3091 				scb->flags |= SCB_DEVICE_RESET|SCB_ABORTED;
3092 				scb->control &= DISCENB;
3093 				scb->control |= MK_MESSAGE;
3094 				scb->cmdlen = 0;
3095 				scb->SG_segment_count = 0;
3096 				scb->SG_list_pointer = 0;
3097 				scb->data = 0;
3098 				scb->datalen = 0;
3099 				ahc_send_scb(ahc, scb);
3100 				ahc_add_waiting_scb(ahc, scb);
3101 				timeout(ahc_timeout, (caddr_t)scb, (2 * hz));
3102 				scsi_print_addr(scb->xs->sc_link);
3103 				printf("BUS DEVICE RESET message queued.\n");
3104 				AHC_OUTB(ahc, SCBPTR, active_scb);
3105 				unpause_sequencer(ahc, /*unpause_always*/FALSE);
3106 				goto done;
3107 			}
3108 			/* Is the active SCB really active? */
3109 			else if((active_scbp->flags & SCB_ACTIVE) && bus_state){
3110 				AHC_OUTB(ahc, MSG_LEN, 1);
3111 				AHC_OUTB(ahc, MSG0, MSG_BUS_DEV_RESET);
3112 				AHC_OUTB(ahc, SCSISIGO, bus_state|ATNO);
3113 				scsi_print_addr(active_scbp->xs->sc_link);
3114 				printf("asserted ATN - device reset in "
3115 				       "message buffer\n");
3116 				active_scbp->flags |=   SCB_DEVICE_RESET
3117 						      | SCB_ABORTED;
3118 				if(active_scbp != scb) {
3119 					untimeout(ahc_timeout,
3120 						  (caddr_t)active_scbp);
3121 					/* Give scb a new lease on life */
3122 					timeout(ahc_timeout, (caddr_t)scb,
3123 						(scb->xs->timeout * hz) / 1000);
3124 				}
3125 				timeout(ahc_timeout, (caddr_t)active_scbp,
3126 					(2 * hz));
3127 				AHC_OUTB(ahc, SCBPTR, active_scb);
3128 				unpause_sequencer(ahc, /*unpause_always*/FALSE);
3129 				goto done;
3130 			}
3131 		}
3132 		/*
3133 		 * No active target or a paged out SCB.
3134 		 * Try resetting the bus.
3135 		 */
3136 		channel = (scb->tcl & SELBUSB) ? 'B': 'A';
3137 		found = ahc_reset_channel(ahc, channel, scb->tag,
3138 					  XS_TIMEOUT,
3139 					  /*Initiate Reset*/TRUE);
3140 		printf("%s: Issued Channel %c Bus Reset #2. "
3141 			"%d SCBs aborted\n", ahc_name(ahc), channel,
3142 			found);
3143 		ahc->in_timeout = FALSE;
3144 	}
3145 done:
3146 	splx(s);
3147 }
3148 
3149 
3150 /*
3151  * The device at the given target/channel has been reset.  Abort
3152  * all active and queued scbs for that target/channel.
3153  */
3154 static int
3155 ahc_reset_device(ahc, target, channel, timedout_scb, xs_error)
3156 	struct ahc_data *ahc;
3157 	int target;
3158 	char channel;
3159 	u_char timedout_scb;
3160 	u_int32_t xs_error;
3161 {
3162         struct scb *scbp;
3163 	u_char active_scb;
3164 	int i = 0;
3165 	int found = 0;
3166 
3167 	/* restore this when we're done */
3168 	active_scb = AHC_INB(ahc, SCBPTR);
3169 
3170 	/*
3171 	 * Search the QINFIFO.
3172 	 */
3173 	{
3174 		u_char saved_queue[AHC_SCB_MAX];
3175 		u_char queued = AHC_INB(ahc, QINCNT) & ahc->qcntmask;
3176 
3177 		for (i = 0; i < (queued - found); i++) {
3178 			saved_queue[i] = AHC_INB(ahc, QINFIFO);
3179 			AHC_OUTB(ahc, SCBPTR, saved_queue[i]);
3180 			scbp = ahc->scbarray[AHC_INB(ahc, SCB_TAG)];
3181 			if (ahc_match_scb (scbp, target, channel)){
3182 				/*
3183 				 * We found an scb that needs to be aborted.
3184 				 */
3185 				scbp->flags = SCB_ABORTED|SCB_QUEUED_FOR_DONE;
3186 				scbp->xs->error |= xs_error;
3187 				if(scbp->position != timedout_scb)
3188 					untimeout(ahc_timeout, (caddr_t)scbp);
3189 				AHC_OUTB(ahc, SCB_CONTROL, 0);
3190 				i--;
3191 				found++;
3192 			}
3193 		}
3194 		/* Now put the saved scbs back. */
3195 		for (queued = 0; queued < i; queued++) {
3196 			AHC_OUTB(ahc, QINFIFO, saved_queue[queued]);
3197 		}
3198 	}
3199 
3200 	/*
3201 	 * Search waiting for selection list.
3202 	 */
3203 	{
3204 		u_char next, prev;
3205 
3206 		next = AHC_INB(ahc, WAITING_SCBH);  /* Start at head of list. */
3207 		prev = SCB_LIST_NULL;
3208 
3209 		while (next != SCB_LIST_NULL) {
3210 			AHC_OUTB(ahc, SCBPTR, next);
3211 			scbp = ahc->scbarray[AHC_INB(ahc, SCB_TAG)];
3212 			/*
3213 			 * Select the SCB.
3214 			 */
3215 			if (ahc_match_scb(scbp, target, channel)) {
3216 				next = ahc_abort_wscb(ahc, scbp, prev,
3217 						timedout_scb, xs_error);
3218 				found++;
3219 			}
3220 			else {
3221 				prev = next;
3222 				next = AHC_INB(ahc, SCB_NEXT);
3223 			}
3224 		}
3225 	}
3226 	/*
3227 	 * Go through the entire SCB array now and look for
3228 	 * commands for this target that are active.  These
3229 	 * are other (most likely tagged) commands that
3230 	 * were disconnected when the reset occured.
3231 	 */
3232 	for(i = 0; i < ahc->numscbs; i++) {
3233 		scbp = ahc->scbarray[i];
3234 		if((scbp->flags & SCB_ACTIVE)
3235 		  && ahc_match_scb(scbp, target, channel)) {
3236 			/* Ensure the target is "free" */
3237 			ahc_unbusy_target(ahc, target, channel);
3238 			if( !(scbp->flags & SCB_PAGED_OUT) )
3239 			{
3240 				AHC_OUTB(ahc, SCBPTR, scbp->position);
3241 				AHC_OUTB(ahc, SCB_CONTROL, 0);
3242 			}
3243 			scbp->flags = SCB_ABORTED|SCB_QUEUED_FOR_DONE;
3244 			scbp->xs->error |= xs_error;
3245 			if(scbp->tag != timedout_scb)
3246 				untimeout(ahc_timeout, (caddr_t)scbp);
3247 			found++;
3248 		}
3249 	}
3250 	AHC_OUTB(ahc, SCBPTR, active_scb);
3251 	return found;
3252 }
3253 
3254 /*
3255  * Manipulate the waiting for selection list and return the
3256  * scb that follows the one that we remove.
3257  */
3258 static u_char
3259 ahc_abort_wscb (ahc, scbp, prev, timedout_scb, xs_error)
3260 	struct ahc_data *ahc;
3261         struct scb *scbp;
3262 	u_char prev;
3263 	u_char timedout_scb;
3264 	u_int32_t xs_error;
3265 {
3266 	u_char curscbp, next;
3267 	int target = ((scbp->tcl >> 4) & 0x0f);
3268 	char channel = (scbp->tcl & SELBUSB) ? 'B' : 'A';
3269 	/*
3270 	 * Select the SCB we want to abort and
3271 	 * pull the next pointer out of it.
3272 	 */
3273 	curscbp = AHC_INB(ahc, SCBPTR);
3274 	AHC_OUTB(ahc, SCBPTR, scbp->position);
3275 	next = AHC_INB(ahc, SCB_NEXT);
3276 
3277 	/* Clear the necessary fields */
3278 	AHC_OUTB(ahc, SCB_CONTROL, 0);
3279 	AHC_OUTB(ahc, SCB_NEXT, SCB_LIST_NULL);
3280 	ahc_unbusy_target(ahc, target, channel);
3281 
3282 	/* update the waiting list */
3283 	if( prev == SCB_LIST_NULL )
3284 		/* First in the list */
3285 		AHC_OUTB(ahc, WAITING_SCBH, next);
3286 	else {
3287 		/*
3288 		 * Select the scb that pointed to us
3289 		 * and update its next pointer.
3290 		 */
3291 		AHC_OUTB(ahc, SCBPTR, prev);
3292 		AHC_OUTB(ahc, SCB_NEXT, next);
3293 	}
3294 	/*
3295 	 * Point us back at the original scb position
3296 	 * and inform the SCSI system that the command
3297 	 * has been aborted.
3298 	 */
3299 	AHC_OUTB(ahc, SCBPTR, curscbp);
3300 	scbp->flags = SCB_ABORTED|SCB_QUEUED_FOR_DONE;
3301 	scbp->xs->error |= xs_error;
3302 	if(scbp->tag != timedout_scb)
3303 		untimeout(ahc_timeout, (caddr_t)scbp);
3304 	return next;
3305 }
3306 
3307 static void
3308 ahc_busy_target(ahc, target, channel)
3309 	struct ahc_data *ahc;
3310 	u_char target;
3311 	char   channel;
3312 {
3313 	u_char active;
3314 	u_long active_port = ACTIVE_A;
3315 
3316 	if(target > 0x07 || channel == 'B') {
3317 		/*
3318 		 * targets on the Second channel or
3319 		 * above id 7 store info in byte two
3320 		 * of HA_ACTIVE
3321 		 */
3322 		active_port++;
3323 	}
3324 	active = AHC_INB(ahc, active_port);
3325 	active |= (0x01 << (target & 0x07));
3326 	AHC_OUTB(ahc, active_port, active);
3327 }
3328 
3329 static void
3330 ahc_unbusy_target(ahc, target, channel)
3331 	struct ahc_data *ahc;
3332 	u_char target;
3333 	char   channel;
3334 {
3335 	u_char active;
3336 	u_long active_port = ACTIVE_A;
3337 
3338 	if(target > 0x07 || channel == 'B') {
3339 		/*
3340 		 * targets on the Second channel or
3341 		 * above id 7 store info in byte two
3342 		 * of HA_ACTIVE
3343 		 */
3344 		active_port++;
3345 	}
3346 	active = AHC_INB(ahc, active_port);
3347 	active &= ~(0x01 << (target & 0x07));
3348 	AHC_OUTB(ahc, active_port, active);
3349 }
3350 
3351 static void
3352 ahc_reset_current_bus(ahc)
3353 	struct ahc_data *ahc;
3354 {
3355 	AHC_OUTB(ahc, SCSISEQ, SCSIRSTO);
3356 	DELAY(1000);
3357 	AHC_OUTB(ahc, SCSISEQ, 0);
3358 }
3359 
3360 static int
3361 ahc_reset_channel(ahc, channel, timedout_scb, xs_error, initiate_reset)
3362 	struct ahc_data *ahc;
3363 	char   channel;
3364 	u_char timedout_scb;
3365 	u_int32_t xs_error;
3366 	u_char initiate_reset;
3367 {
3368 	u_char sblkctl;
3369 	char cur_channel;
3370 	u_long offset, offset_max;
3371 	int found;
3372 
3373 	/*
3374 	 * Clean up all the state information for the
3375 	 * pending transactions on this bus.
3376 	 */
3377 	found = ahc_reset_device(ahc, ALL_TARGETS, channel,
3378 				 timedout_scb, xs_error);
3379 	if(channel == 'B'){
3380 		ahc->needsdtr |= (ahc->needsdtr_orig & 0xff00);
3381 		ahc->sdtrpending &= 0x00ff;
3382 		AHC_OUTB(ahc, ACTIVE_B, 0);
3383 		offset = TARG_SCRATCH + 8;
3384 		offset_max = TARG_SCRATCH + 16;
3385 	}
3386 	else if (ahc->type & AHC_WIDE){
3387 		ahc->needsdtr = ahc->needsdtr_orig;
3388 		ahc->needwdtr = ahc->needwdtr_orig;
3389 		ahc->sdtrpending = 0;
3390 		ahc->wdtrpending = 0;
3391 		AHC_OUTB(ahc, ACTIVE_A, 0);
3392 		AHC_OUTB(ahc, ACTIVE_B, 0);
3393 		offset = TARG_SCRATCH;
3394 		offset_max = TARG_SCRATCH + 16;
3395 	}
3396 	else{
3397 		ahc->needsdtr |= (ahc->needsdtr_orig & 0x00ff);
3398 		ahc->sdtrpending &= 0xff00;
3399 		AHC_OUTB(ahc, ACTIVE_A, 0);
3400 		offset = TARG_SCRATCH;
3401 		offset_max = TARG_SCRATCH + 8;
3402 	}
3403 	for(;offset < offset_max;offset++) {
3404 		/*
3405 		 * Revert to async/narrow transfers
3406 		 * until we renegotiate.
3407 		 */
3408 		u_char targ_scratch;
3409 
3410 		targ_scratch = AHC_INB(ahc, offset);
3411 		targ_scratch &= SXFR;
3412 		AHC_OUTB(ahc, offset, targ_scratch);
3413 	}
3414 
3415 	/*
3416 	 * Reset the bus if we are initiating this reset and
3417 	 * restart/unpause the sequencer
3418 	 */
3419 	/* Case 1: Command for another bus is active */
3420 	sblkctl = AHC_INB(ahc, SBLKCTL);
3421 	cur_channel = (sblkctl & SELBUSB) ? 'B' : 'A';
3422 	if(cur_channel != channel)
3423 	{
3424 		/*
3425 		 * Stealthily reset the other bus
3426 		 * without upsetting the current bus
3427 		 */
3428 		AHC_OUTB(ahc, SBLKCTL, sblkctl ^ SELBUSB);
3429 		if( initiate_reset )
3430 		{
3431 			ahc_reset_current_bus(ahc);
3432 		}
3433 		AHC_OUTB(ahc, CLRSINT1, CLRSCSIRSTI|CLRSELTIMEO);
3434 		AHC_OUTB(ahc, CLRINT, CLRSCSIINT);
3435 		AHC_OUTB(ahc, SBLKCTL, sblkctl);
3436 		unpause_sequencer(ahc, /*unpause_always*/TRUE);
3437 	}
3438 	/* Case 2: A command from this bus is active or we're idle */
3439 	else {
3440 		if( initiate_reset )
3441 		{
3442 			ahc_reset_current_bus(ahc);
3443 		}
3444 		AHC_OUTB(ahc, CLRSINT1, CLRSCSIRSTI|CLRSELTIMEO);
3445 		AHC_OUTB(ahc, CLRINT, CLRSCSIINT);
3446 		restart_sequencer(ahc);
3447 	}
3448 	ahc_run_done_queue(ahc);
3449 	return found;
3450 }
3451 
3452 void
3453 ahc_run_done_queue(ahc)
3454 	struct ahc_data *ahc;
3455 {
3456 	int i;
3457 	struct scb *scbp;
3458 
3459 	for(i = 0; i < ahc->numscbs; i++) {
3460 		scbp = ahc->scbarray[i];
3461 		if(scbp->flags & SCB_QUEUED_FOR_DONE)
3462 			ahc_done(ahc, scbp);
3463 	}
3464 }
3465 
3466 static int
3467 ahc_match_scb (scb, target, channel)
3468         struct scb *scb;
3469         int target;
3470 	char channel;
3471 {
3472 	int targ = (scb->tcl >> 4) & 0x0f;
3473 	char chan = (scb->tcl & SELBUSB) ? 'B' : 'A';
3474 
3475 	if (target == ALL_TARGETS)
3476 		return (chan == channel);
3477 	else
3478 		return ((chan == channel) && (targ == target));
3479 }
3480 
3481 
3482 static void
3483 ahc_construct_sdtr(ahc, start_byte, period, offset)
3484 	struct ahc_data *ahc;
3485 	int start_byte;
3486 	u_int8_t period;
3487 	u_int8_t offset;
3488 {
3489 	AHC_OUTB(ahc, MSG0 + start_byte, MSG_EXTENDED);
3490 	AHC_OUTB(ahc, MSG1 + start_byte, MSG_EXT_SDTR_LEN);
3491 	AHC_OUTB(ahc, MSG2 + start_byte, MSG_EXT_SDTR);
3492 	AHC_OUTB(ahc, MSG3 + start_byte, period);
3493 	AHC_OUTB(ahc, MSG4 + start_byte, offset);
3494 	AHC_OUTB(ahc, MSG_LEN, start_byte + 5);
3495 }
3496 
3497 static void
3498 ahc_construct_wdtr(ahc, start_byte, bus_width)
3499 	struct ahc_data *ahc;
3500 	int start_byte;
3501 	u_int8_t bus_width;
3502 {
3503 	AHC_OUTB(ahc, MSG0 + start_byte, MSG_EXTENDED);
3504 	AHC_OUTB(ahc, MSG1 + start_byte, MSG_EXT_WDTR_LEN);
3505 	AHC_OUTB(ahc, MSG2 + start_byte, MSG_EXT_WDTR);
3506 	AHC_OUTB(ahc, MSG3 + start_byte, bus_width);
3507 	AHC_OUTB(ahc, MSG_LEN, start_byte + 4);
3508 }
3509