xref: /freebsd/sys/dev/aic7xxx/aic7xxx.c (revision a8445737e740901f5f2c8d24c12ef7fc8b00134e)
1 /*
2  * Generic driver for the aic7xxx based adaptec SCSI controllers
3  * Product specific probe and attach routines can be found in:
4  * i386/eisa/ahc_eisa.c	27/284X and aic7770 motherboard controllers
5  * pci/ahc_pci.c	3985, 3980, 3940, 2940, aic7895, aic7890,
6  *			aic7880, aic7870, aic7860, and aic7850 controllers
7  *
8  * Copyright (c) 1994, 1995, 1996, 1997, 1998 Justin T. Gibbs.
9  * All rights reserved.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions, and the following disclaimer,
16  *    without modification, immediately at the beginning of the file.
17  * 2. The name of the author may not be used to endorse or promote products
18  *    derived from this software without specific prior written permission.
19  *
20  * Where this Software is combined with software released under the terms of
21  * the GNU Public License ("GPL") and the terms of the GPL would require the
22  * combined work to also be released under the terms of the GPL, the terms
23  * and conditions of this License will apply in addition to those of the
24  * GPL with the exception of any terms or conditions of this License that
25  * conflict with, or are expressly prohibited by, the GPL.
26  *
27  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
28  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
29  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
30  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
31  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
32  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
33  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
34  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
35  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
36  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
37  * SUCH DAMAGE.
38  *
39  *      $Id: aic7xxx.c,v 1.113 1997/04/05 21:41:13 gibbs Exp $
40  */
41 /*
42  * A few notes on features of the driver.
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 these transactions down on the host adapter is of
47  * little use.  Instead of leaving this idle SCB down on the card we copy
48  * it back up into kernel memory and reuse the SCB slot on the card to
49  * schedule another transaction.  This can be a real payoff when doing random
50  * I/O to tagged queueing devices since there are more transactions active at
51  * once for the device to sort for optimal seek reduction. The algorithm goes
52  * like this...
53  *
54  * The sequencer maintains two lists of its hardware SCBs.  The first is the
55  * singly linked free list which tracks all SCBs that are not currently in
56  * use.  The second is the doubly linked disconnected list which holds the
57  * SCBs of transactions that are in the disconnected state sorted most
58  * recently disconnected first.  When the kernel queues a transaction to
59  * the card, a hardware SCB to "house" this transaction is retrieved from
60  * either of these two lists.  If the SCB came from the disconnected list,
61  * a check is made to see if any data transfer or SCB linking (more on linking
62  * in a bit) information has been changed since it was copied from the host
63  * and if so, DMAs the SCB back up before it can be used.  Once a hardware
64  * SCB has been obtained, the SCB is DMAed from the host.  Before any work
65  * can begin on this SCB, the sequencer must ensure that either the SCB is
66  * for a tagged transaction or the target is not already working on another
67  * non-tagged transaction.  If a conflict arises in the non-tagged case, the
68  * sequencer finds the SCB for the active transactions and sets the SCB_LINKED
69  * field in that SCB to this next SCB to execute.  To facilitate finding
70  * active non-tagged SCBs, the last four bytes of up to the first four hardware
71  * SCBs serve as a storage area for the currently active SCB ID for each
72  * target.
73  *
74  * When a device reconnects, a search is made of the hardware SCBs to find
75  * the SCB for this transaction.  If the search fails, a hardware SCB is
76  * pulled from either the free or disconnected SCB list and the proper
77  * SCB is DMAed from the host.  If the MK_MESSAGE control bit is set
78  * in the control byte of the SCB while it was disconnected, the sequencer
79  * will assert ATN and attempt to issue a message to the host.
80  *
81  * When a command completes, a check for non-zero status and residuals is
82  * made.  If either of these conditions exists, the SCB is DMAed back up to
83  * the host so that it can interpret this information.  Additionally, in the
84  * case of bad status, the sequencer generates a special interrupt and pauses
85  * itself.  This allows the host to setup a request sense command if it
86  * chooses for this target synchronously with the error so that sense
87  * information isn't lost.
88  *
89  */
90 
91 #include <opt_aic7xxx.h>
92 
93 #include <pci.h>
94 #include <stddef.h>	/* For offsetof */
95 
96 #include <sys/param.h>
97 #include <sys/systm.h>
98 #include <sys/malloc.h>
99 #include <sys/buf.h>
100 #include <sys/proc.h>
101 
102 #include <cam/cam.h>
103 #include <cam/cam_ccb.h>
104 #include <cam/cam_sim.h>
105 #include <cam/cam_xpt_sim.h>
106 #include <cam/cam_debug.h>
107 
108 #include <cam/scsi/scsi_all.h>
109 #include <cam/scsi/scsi_message.h>
110 
111 #if NPCI > 0
112 #include <machine/bus_memio.h>
113 #endif
114 #include <machine/bus_pio.h>
115 #include <machine/bus.h>
116 #include <machine/clock.h>
117 
118 #include <vm/vm.h>
119 #include <vm/vm_param.h>
120 #include <vm/pmap.h>
121 
122 #include <dev/aic7xxx/aic7xxx.h>
123 #include <dev/aic7xxx/sequencer.h>
124 
125 #include <aic7xxx_reg.h>
126 #include <aic7xxx_seq.h>
127 
128 #include <sys/kernel.h>
129 
130 #ifndef AHC_TMODE_ENABLE
131 #define AHC_TMODE_ENABLE 0
132 #endif
133 
134 #define MAX(a,b) (((a) > (b)) ? (a) : (b))
135 #define MIN(a,b) (((a) < (b)) ? (a) : (b))
136 #define ALL_TARGETS (~0)
137 #define ALL_LUNS (~0)
138 #define ALL_CHANNELS '\0'
139 
140 #define	SIM_IS_SCSIBUS_B(ahc, sim)	\
141 	(sim == ahc->sim_b)
142 #define	SCB_IS_SCSIBUS_B(scb)	\
143 	(((scb)->hscb->tcl & SELBUSB) != 0)
144 #define	SCB_TARGET(scb)	\
145 	(((scb)->hscb->tcl & TID) >> 4)
146 #define	SCB_CHANNEL(scb) \
147 	(SCB_IS_SCSIBUS_B(scb) ? 'B' : 'A')
148 #define	SCB_LUN(scb)	\
149 	((scb)->hscb->tcl & LID)
150 #define SCB_TARGET_OFFSET(scb)		\
151 	(SCB_TARGET(scb) + (SCB_IS_SCSIBUS_B(scb) ? 8 : 0))
152 #define SCB_TARGET_MASK(scb)		\
153 	(0x01 << (SCB_TARGET_OFFSET(scb)))
154 
155 #define ccb_scb_ptr spriv_ptr0
156 #define ccb_ahc_ptr spriv_ptr1
157 
158 struct ahc_devinfo {
159 	int	  target_offset;
160 	u_int16_t target_mask;
161 	u_int8_t  target;
162 	char	  channel;
163 };
164 
165 typedef enum {
166 	SEARCH_COMPLETE,
167 	SEARCH_COUNT,
168 	SEARCH_REMOVE
169 } ahc_search_action;
170 
171 u_long ahc_unit = 0;
172 
173 #ifdef AHC_DEBUG
174 static int     ahc_debug = AHC_DEBUG;
175 #endif
176 
177 #if NPCI > 0
178 void ahc_pci_intr(struct ahc_softc *ahc);
179 #endif
180 
181 static void	ahc_dump_targcmd(struct target_cmd *cmd);
182 static void	ahc_shutdown(int howto, void *arg);
183 static void	ahcminphys(struct buf *bp);
184 static cam_status
185 		ahc_find_tmode_devs(struct ahc_softc *ahc,
186 				    struct cam_sim *sim, union ccb *ccb,
187 				    struct tmode_tstate **tstate,
188 				    struct tmode_lstate **lstate,
189 				    int notfound_failure);
190 static void	ahc_action(struct cam_sim *sim, union ccb *ccb);
191 static void	ahc_async(void *callback_arg, u_int32_t code,
192 			  struct cam_path *path, void *arg);
193 static void	ahc_execute_scb(void *arg, bus_dma_segment_t *dm_segs,
194 				int nsegments, int error);
195 static void	ahc_poll(struct cam_sim *sim);
196 static void	ahc_setup_data(struct ahc_softc *ahc,
197 			       struct ccb_scsiio *csio, struct scb *scb);
198 static void	ahc_freeze_devq(struct ahc_softc *ahc, struct cam_path *path);
199 static struct scb *
200                 ahc_get_scb(struct ahc_softc *ahc);
201 static void     ahc_free_scb(struct ahc_softc *ahc, struct scb *scb);
202 static struct scb *
203 		ahc_alloc_scb(struct ahc_softc *ahc);
204 static void	ahc_fetch_devinfo(struct ahc_softc *ahc,
205 				  struct ahc_devinfo *devinfo);
206 static void	ahc_compile_devinfo(struct ahc_devinfo *devinfo,
207 				    u_int target, char channel);
208 static u_int8_t	ahc_abort_wscb(struct ahc_softc *ahc, u_int8_t scbpos,
209 			       u_int8_t prev);
210 static void	ahc_done(struct ahc_softc *ahc, struct scb *scbp);
211 static void	ahc_handle_target_cmd(struct ahc_softc *ahc);
212 static void 	ahc_handle_seqint(struct ahc_softc *ahc, u_int8_t intstat);
213 static void	ahc_handle_scsiint(struct ahc_softc *ahc,
214 				   u_int8_t intstat);
215 static void	ahc_handle_reqinit(struct ahc_softc *ahc,
216 				   struct scb *scb);
217 static int	ahc_parse_msg(struct ahc_softc *ahc, struct scb *scb,
218 			      struct ahc_devinfo *devinfo);
219 static void	ahc_handle_devreset(struct ahc_softc *ahc, int target,
220 				    char channel, cam_status status,
221 				    ac_code acode, char *message,
222 				    int verbose_only);
223 static void	ahc_loadseq(struct ahc_softc *ahc);
224 static int	ahc_check_patch(struct ahc_softc *ahc,
225 				struct patch **start_patch,
226 				int start_instr, int *skip_addr);
227 static void	ahc_download_instr(struct ahc_softc *ahc,
228 				   int instrptr, u_int8_t *dconsts);
229 static int	ahc_match_scb(struct scb *scb, int target, char channel,
230 			      int lun, u_int8_t tag);
231 #ifdef AHC_DEBUG
232 static void	ahc_print_scb(struct scb *scb);
233 #endif
234 static u_int8_t ahc_find_scb(struct ahc_softc *ahc, struct scb *scb);
235 static int	ahc_search_qinfifo(struct ahc_softc *ahc, int target,
236 				   char channel, int lun, u_int8_t tag,
237 				   u_int32_t status, ahc_search_action action);
238 static int	ahc_reset_channel(struct ahc_softc *ahc, char channel,
239 				  int initiate_reset);
240 static int	ahc_abort_scbs(struct ahc_softc *ahc, int target,
241 			       char channel, int lun, u_int8_t tag,
242 			       u_int32_t status);
243 static u_int8_t	ahc_rem_scb_from_disc_list(struct ahc_softc *ahc,
244 					   u_int8_t prev, u_int8_t scbptr);
245 static void	ahc_add_curscb_to_free_list(struct ahc_softc *ahc);
246 static void	ahc_clear_intstat(struct ahc_softc *ahc);
247 static void	ahc_reset_current_bus(struct ahc_softc *ahc);
248 static struct ahc_syncrate *
249 		ahc_find_syncrate(struct ahc_softc *ahc, u_int *period,
250 				  u_int maxsync);
251 static u_int	ahc_find_period(struct ahc_softc *ahc, u_int scsirate,
252 				u_int maxsync);
253 static void	ahc_validate_offset(struct ahc_softc *ahc,
254 				    struct ahc_syncrate *syncrate,
255 				    u_int *offset, int wide);
256 static void	ahc_set_syncrate(struct ahc_softc *ahc,
257 				 struct ahc_devinfo *devinfo,
258 				 struct cam_path *path,
259 				 struct ahc_syncrate *syncrate,
260 				 u_int period, u_int offset, u_int type);
261 static void	ahc_set_width(struct ahc_softc *ahc,
262 			      struct ahc_devinfo *devinfo,
263 			      struct cam_path *path, u_int width, u_int type);
264 static void	ahc_construct_sdtr(struct ahc_softc *ahc,
265 				   u_int8_t period, u_int8_t offset);
266 
267 static void	ahc_construct_wdtr(struct ahc_softc *ahc,
268 				   u_int8_t bus_width);
269 
270 static void	ahc_calc_residual(struct scb *scb);
271 
272 static void	ahc_update_pending_syncrates(struct ahc_softc *ahc);
273 
274 static void	ahc_set_recoveryscb(struct ahc_softc *ahc, struct scb *scb);
275 
276 static timeout_t
277 		ahc_timeout;
278 static __inline void pause_sequencer(struct ahc_softc *ahc);
279 static __inline void unpause_sequencer(struct ahc_softc *ahc,
280 				       int unpause_always);
281 static __inline void restart_sequencer(struct ahc_softc *ahc);
282 static __inline u_int8_t ahc_index_busy_tcl(struct ahc_softc *ahc,
283 					    u_int8_t tcl, int unbusy);
284 
285 static __inline void	 ahc_busy_tcl(struct ahc_softc *ahc, struct scb *scb);
286 
287 static __inline void	   ahc_freeze_ccb(union ccb* ccb);
288 static __inline cam_status ahc_ccb_status(union ccb* ccb);
289 static __inline void	   ahc_set_ccb_status(union ccb* ccb,
290 					      cam_status status);
291 
292 static __inline u_int32_t
293 ahc_hscb_busaddr(struct ahc_softc *ahc, u_int index)
294 {
295 	return (ahc->hscb_busaddr + (sizeof(struct hardware_scb) * index));
296 }
297 
298 #define AHC_BUSRESET_DELAY	25	/* Reset delay in us */
299 
300 static __inline void
301 pause_sequencer(struct ahc_softc *ahc)
302 {
303 	ahc_outb(ahc, HCNTRL, ahc->pause);
304 
305 	/*
306 	 * Since the sequencer can disable pausing in a critical section, we
307 	 * must loop until it actually stops.
308 	 */
309 	while ((ahc_inb(ahc, HCNTRL) & PAUSE) == 0)
310 		;
311 }
312 
313 static __inline void
314 unpause_sequencer(struct ahc_softc *ahc, int unpause_always)
315 {
316 	if ((ahc->flags & AHC_HANDLING_REQINITS) == 0
317 	 && (unpause_always
318 	  || (ahc_inb(ahc, INTSTAT) & (SCSIINT | SEQINT | BRKADRINT)) == 0))
319 		ahc_outb(ahc, HCNTRL, ahc->unpause);
320 }
321 
322 /*
323  * Restart the sequencer program from address zero
324  */
325 static __inline void
326 restart_sequencer(struct ahc_softc *ahc)
327 {
328 	pause_sequencer(ahc);
329 	ahc_outb(ahc, SEQCTL, FASTMODE|SEQRESET);
330 	unpause_sequencer(ahc, /*unpause_always*/TRUE);
331 }
332 
333 static __inline u_int8_t
334 ahc_index_busy_tcl(struct ahc_softc *ahc, u_int8_t tcl, int unbusy)
335 {
336 	u_int8_t scbid;
337 
338 	scbid = ahc->untagged_scbs[tcl];
339 	if (unbusy)
340 		ahc->untagged_scbs[tcl] = SCB_LIST_NULL;
341 
342 	return (scbid);
343 }
344 
345 static __inline void
346 ahc_busy_tcl(struct ahc_softc *ahc, struct scb *scb)
347 {
348 	ahc->untagged_scbs[scb->hscb->tcl] = scb->hscb->tag;
349 }
350 
351 static __inline void
352 ahc_freeze_ccb(union ccb* ccb)
353 {
354 	if ((ccb->ccb_h.status & CAM_DEV_QFRZN) == 0) {
355 		ccb->ccb_h.status |= CAM_DEV_QFRZN;
356 		xpt_freeze_devq(ccb->ccb_h.path, /*count*/1);
357 	}
358 }
359 
360 static __inline cam_status
361 ahc_ccb_status(union ccb* ccb)
362 {
363 	return (ccb->ccb_h.status & CAM_STATUS_MASK);
364 }
365 
366 static __inline void
367 ahc_set_ccb_status(union ccb* ccb, cam_status status)
368 {
369 	ccb->ccb_h.status &= ~CAM_STATUS_MASK;
370 	ccb->ccb_h.status |= status;
371 }
372 
373 char *
374 ahc_name(struct ahc_softc *ahc)
375 {
376 	static char name[10];
377 
378 	sprintf(name, "ahc%d", ahc->unit);
379 	return (name);
380 }
381 
382 #ifdef  AHC_DEBUG
383 static void
384 ahc_print_scb(struct scb *scb)
385 {
386 	struct hardware_scb *hscb = scb->hscb;
387 
388 	printf("scb:%p control:0x%x tcl:0x%x cmdlen:%d cmdpointer:0x%lx\n",
389 		scb,
390 		hscb->control,
391 		hscb->tcl,
392 		hscb->cmdlen,
393 		hscb->cmdpointer );
394 	printf("        datlen:%d data:0x%lx segs:0x%x segp:0x%lx\n",
395 		hscb->datalen,
396 		hscb->data,
397 		hscb->SG_count,
398 		hscb->SG_pointer);
399 	printf("	sg_addr:%lx sg_len:%ld\n",
400 		scb->ahc_dma[0].addr,
401 		scb->ahc_dma[0].len);
402 	printf("	cdb:%x %x %x %x %x %x %x %x %x %x %x %x\n",
403 		hscb->cmdstore[0], hscb->cmdstore[1], hscb->cmdstore[2],
404 		hscb->cmdstore[3], hscb->cmdstore[4], hscb->cmdstore[5],
405 		hscb->cmdstore[6], hscb->cmdstore[7], hscb->cmdstore[8],
406 		hscb->cmdstore[9], hscb->cmdstore[10], hscb->cmdstore[11]);
407 }
408 #endif
409 
410 static struct {
411         u_int8_t errno;
412 	char *errmesg;
413 } hard_error[] = {
414 	{ ILLHADDR,	"Illegal Host Access" },
415 	{ ILLSADDR,	"Illegal Sequencer Address referrenced" },
416 	{ ILLOPCODE,	"Illegal Opcode in sequencer program" },
417 	{ SQPARERR,	"Sequencer Parity Error" },
418 	{ DPARERR,	"Data-path Parity Error" },
419 	{ MPARERR,	"Scratch or SCB Memory Parity Error" },
420 	{ PCIERRSTAT,	"PCI Error detected" },
421 	{ CIOPARERR,	"CIOBUS Parity Error" },
422 };
423 
424 
425 /*
426  * Valid SCSIRATE values.  (p. 3-17)
427  * Provides a mapping of tranfer periods in ns to the proper value to
428  * stick in the scsiscfr reg to use that transfer rate.
429  */
430 #define AHC_SYNCRATE_ULTRA2	0
431 #define AHC_SYNCRATE_ULTRA	2
432 #define AHC_SYNCRATE_FAST	5
433 static struct ahc_syncrate ahc_syncrates[] = {
434 	/* ultra2  fast/ultra  period	rate */
435 	{ 0x13,   0x000,	10,	"40.0"	},
436 	{ 0x14,   0x000,	11,	"33.0"	},
437 	{ 0x15,   0x100,	12,	"20.0"	},
438 	{ 0x16,   0x110,	15,	"16.0"	},
439 	{ 0x17,   0x120,	18,	"13.4"	},
440 	{ 0x18,   0x000,	25,	"10.0"	},
441 	{ 0x19,   0x010,	31,	"8.0"	},
442 	{ 0x1a,   0x020,	37,	"6.67"	},
443 	{ 0x1b,   0x030,	43,	"5.7"	},
444 	{ 0x10,   0x040,	50,	"5.0"	},
445 	{ 0x00,   0x050,	56,	"4.4"	},
446 	{ 0x00,   0x060,	62,	"4.0"	},
447 	{ 0x00,   0x070,	68,	"3.6"	},
448 	{ 0x00,   0x000,	0,	NULL	}
449 };
450 
451 /*
452  * Allocate a controller structure for a new device and initialize it.
453  */
454 struct ahc_softc *
455 ahc_alloc(int unit, u_int32_t iobase, vm_offset_t maddr, ahc_chip chip,
456 	  ahc_feature features, ahc_flag flags, struct scb_data *scb_data)
457 {
458 	/*
459 	 * find unit and check we have that many defined
460 	 */
461 	struct  ahc_softc *ahc;
462 	size_t	alloc_size;
463 
464 	/*
465 	 * Allocate a storage area for us
466 	 */
467 	if (scb_data == NULL)
468 		/*
469 		 * We are not sharing SCB space with another controller
470 		 * so allocate our own SCB data space.
471 		 */
472 		alloc_size = sizeof(struct full_ahc_softc);
473 	else
474 		alloc_size = sizeof(struct ahc_softc);
475 	ahc = malloc(alloc_size, M_DEVBUF, M_NOWAIT);
476 	if (!ahc) {
477 		printf("ahc%d: cannot malloc!\n", unit);
478 		return NULL;
479 	}
480 	bzero(ahc, alloc_size);
481 	if (scb_data == NULL) {
482 		struct full_ahc_softc* full_softc = (struct full_ahc_softc*)ahc;
483 		ahc->scb_data = &full_softc->scb_data_storage;
484 		STAILQ_INIT(&ahc->scb_data->free_scbs);
485 	} else
486 		ahc->scb_data = scb_data;
487 	LIST_INIT(&ahc->pending_ccbs);
488 	ahc->unit = unit;
489 
490 	/*
491 	 * XXX This should be done by the bus specific probe stubs with
492 	 *     the bus layer providing the bsh and tag.  Unfortunately,
493 	 *     we need to clean up how we configure things before this
494 	 *     can happen.
495 	 */
496 	if (maddr != NULL) {
497 		ahc->tag = I386_BUS_SPACE_MEM;
498 		ahc->bsh = (bus_space_handle_t)maddr;
499 	} else {
500 		ahc->tag = I386_BUS_SPACE_IO;
501 		ahc->bsh = (bus_space_handle_t)iobase;
502 	}
503 	ahc->chip = chip;
504 	ahc->features = features;
505 	ahc->flags = flags;
506 	ahc->unpause = (ahc_inb(ahc, HCNTRL) & IRQMS) | INTEN;
507 	ahc->pause = ahc->unpause | PAUSE;
508 
509 	return (ahc);
510 }
511 
512 void
513 ahc_free(ahc)
514 	struct ahc_softc *ahc;
515 {
516 	free(ahc, M_DEVBUF);
517 	return;
518 }
519 
520 int
521 ahc_reset(struct ahc_softc *ahc)
522 {
523         u_int8_t hcntrl;
524 	u_int8_t sblkctl;
525 	int	 wait;
526 
527 	ahc_outb(ahc, HCNTRL, CHIPRST | ahc->pause);
528 	/*
529 	 * Ensure that the reset has finished
530 	 */
531 	wait = 1000;
532 	while (--wait && !(ahc_inb(ahc, HCNTRL) & CHIPRSTACK))
533 		DELAY(1000);
534 	if (wait == 0) {
535 		printf("%s: WARNING - Failed chip reset!  "
536 		       "Trying to initialize anyway.\n", ahc_name(ahc));
537 	}
538 	ahc_outb(ahc, HCNTRL, ahc->pause);
539 
540 	/* Determine channel configuration */
541 	sblkctl = ahc_inb(ahc, SBLKCTL) & (SELBUSB|SELWIDE);
542 	/* No Twin Channel PCI cards */
543 	if ((ahc->chip & AHC_PCI) != 0)
544 		sblkctl &= ~SELBUSB;
545 	switch (sblkctl) {
546 	case 0:
547 		/* Single Narrow Channel */
548 		break;
549 	case 2:
550 		/* Wide Channel */
551 		ahc->features |= AHC_WIDE;
552 		break;
553 	case 8:
554 		/* Twin Channel */
555 		ahc->features |= AHC_TWIN;
556 		break;
557 	default:
558 		printf(" Unsupported adapter type.  Ignoring\n");
559 		return(-1);
560 	}
561 	return (0);
562 }
563 
564 /*
565  * Look up the valid period to SCSIRATE conversion in our table.
566  * Return the period and offset that should be sent to the target
567  * if this was the beginning of an SDTR.
568  */
569 static struct ahc_syncrate *
570 ahc_find_syncrate(struct ahc_softc *ahc, u_int *period, u_int maxsync)
571 {
572 	struct ahc_syncrate *syncrate;
573 
574 	syncrate = &ahc_syncrates[maxsync];
575 	while ((syncrate->rate != NULL)
576 	    && ((ahc->features & AHC_ULTRA2) == 0
577 	     || (syncrate->sxfr_ultra2 != 0))) {
578 
579 		if (*period <= syncrate->period) {
580 			/*
581 			 * When responding to a target that requests
582 			 * sync, the requested rate may fall between
583 			 * two rates that we can output, but still be
584 			 * a rate that we can receive.  Because of this,
585 			 * we want to respond to the target with
586 			 * the same rate that it sent to us even
587 			 * if the period we use to send data to it
588 			 * is lower.  Only lower the response period
589 			 * if we must.
590 			 */
591 			if (syncrate == &ahc_syncrates[maxsync]) {
592 				*period = syncrate->period;
593 			}
594 			break;
595 		}
596 		syncrate++;
597 	}
598 
599 	if ((*period == 0)
600 	 || (syncrate->rate == NULL)
601 	 || ((ahc->features & AHC_ULTRA2) != 0
602 	  && (syncrate->sxfr_ultra2 == 0))) {
603 		/* Use asynchronous transfers. */
604 		*period = 0;
605 		syncrate = NULL;
606 	}
607 	return (syncrate);
608 }
609 
610 static u_int
611 ahc_find_period(struct ahc_softc *ahc, u_int scsirate, u_int maxsync)
612 {
613 	struct ahc_syncrate *syncrate;
614 
615 	if ((ahc->features & AHC_ULTRA2) != 0) {
616 		scsirate &= SXFR_ULTRA2;
617 	} else  {
618 		scsirate &= SXFR;
619 	}
620 
621 	syncrate = &ahc_syncrates[maxsync];
622 	while (syncrate->rate != NULL) {
623 
624 		if ((ahc->features & AHC_ULTRA2) != 0) {
625 			if (syncrate->sxfr_ultra2 == 0)
626 				break;
627 			else if (scsirate == syncrate->sxfr_ultra2)
628 				return (syncrate->period);
629 		} else if (scsirate == (syncrate->sxfr & ~ULTRA_SXFR)) {
630 				return (syncrate->period);
631 		}
632 		syncrate++;
633 	}
634 	return (0); /* async */
635 }
636 
637 static void
638 ahc_validate_offset(struct ahc_softc *ahc, struct ahc_syncrate *syncrate,
639 		    u_int *offset, int wide)
640 {
641 	u_int maxoffset;
642 
643 	/* Limit offset to what we can do */
644 	if (syncrate == NULL) {
645 		maxoffset = 0;
646 	} else if ((ahc->features & AHC_ULTRA2) != 0) {
647 		maxoffset = MAX_OFFSET_ULTRA2;
648 	} else {
649 		if (wide)
650 			maxoffset = MAX_OFFSET_16BIT;
651 		else
652 			maxoffset = MAX_OFFSET_8BIT;
653 	}
654 	*offset = MIN(*offset, maxoffset);
655 }
656 
657 static void
658 ahc_set_syncrate(struct ahc_softc *ahc, struct ahc_devinfo *devinfo,
659 		 struct cam_path *path, struct ahc_syncrate *syncrate,
660 		 u_int period, u_int offset, u_int type)
661 {
662 	u_int old_period;
663 	u_int old_offset;
664 
665 	if (syncrate == NULL) {
666 		period = 0;
667 		offset = 0;
668 	}
669 
670 	old_period = ahc->transinfo[devinfo->target_offset].current.period;
671 	old_offset = ahc->transinfo[devinfo->target_offset].current.offset;
672 
673 	if ((type & AHC_TRANS_CUR) != 0
674 	 && (old_period != period || old_offset != offset)) {
675 		struct	ccb_trans_settings neg;
676 		u_int	scsirate;
677 
678 		scsirate = ahc->transinfo[devinfo->target_offset].scsirate;
679 		if ((ahc->features & AHC_ULTRA2) != 0) {
680 
681 			scsirate &= ~SXFR_ULTRA2;
682 
683 			if (syncrate != NULL) {
684 				scsirate |= syncrate->sxfr_ultra2;
685 			}
686 
687 			if ((type & AHC_TRANS_ACTIVE) == AHC_TRANS_ACTIVE) {
688 				ahc_outb(ahc, SCSIOFFSET, offset);
689 			}
690 			ahc_outb(ahc, TARG_OFFSET + devinfo->target_offset,
691 				 offset);
692 		} else {
693 
694 			scsirate &= ~(SXFR|SOFS);
695 			/*
696 			 * Ensure Ultra mode is set properly for
697 			 * this target.
698 			 */
699 			ahc->ultraenb &= ~devinfo->target_mask;
700 			if (syncrate != NULL) {
701 				if (syncrate->sxfr & ULTRA_SXFR) {
702 					ahc->ultraenb |= devinfo->target_mask;
703 				}
704 				scsirate |= syncrate->sxfr & SXFR;
705 				scsirate |= offset & SOFS;
706 			}
707 			if ((type & AHC_TRANS_ACTIVE) == AHC_TRANS_ACTIVE) {
708 				u_int8_t  sxfrctl0;
709 
710 				sxfrctl0 = ahc_inb(ahc, SXFRCTL0);
711 				sxfrctl0 &= ~FAST20;
712 				if (ahc->ultraenb & devinfo->target_mask)
713 					sxfrctl0 |= FAST20;
714 				ahc_outb(ahc, SXFRCTL0, sxfrctl0);
715 			}
716 		}
717 		if ((type & AHC_TRANS_ACTIVE) == AHC_TRANS_ACTIVE)
718 			ahc_outb(ahc, SCSIRATE, scsirate);
719 
720 		ahc->transinfo[devinfo->target_offset].scsirate = scsirate;
721 		ahc->transinfo[devinfo->target_offset].current.period = period;
722 		ahc->transinfo[devinfo->target_offset].current.offset = offset;
723 
724 		/* Update the syncrates in any pending scbs */
725 		ahc_update_pending_syncrates(ahc);
726 
727 		/*
728 		 * Tell the SCSI layer about the
729 		 * new transfer parameters.
730 		 */
731 		neg.sync_period = period;
732 		neg.sync_offset = offset;
733 		neg.valid = CCB_TRANS_SYNC_RATE_VALID
734 			  | CCB_TRANS_SYNC_OFFSET_VALID;
735 		xpt_setup_ccb(&neg.ccb_h, path, /*priority*/1);
736 		xpt_async(AC_TRANSFER_NEG, path, &neg);
737 		if (bootverbose) {
738 			if (neg.sync_offset != 0) {
739 				printf("%s: target %d synchronous at %sMHz, "
740 				       "offset = 0x%x\n", ahc_name(ahc),
741 				       devinfo->target, syncrate->rate, offset);
742 			} else {
743 				printf("%s: target %d using "
744 				       "asynchronous transfers\n",
745 				       ahc_name(ahc), devinfo->target);
746 			}
747 		}
748 	}
749 
750 	if ((type & AHC_TRANS_GOAL) != 0) {
751 		ahc->transinfo[devinfo->target_offset].goal.period = period;
752 		ahc->transinfo[devinfo->target_offset].goal.offset = offset;
753 	}
754 
755 	if ((type & AHC_TRANS_USER) != 0) {
756 		ahc->transinfo[devinfo->target_offset].user.period = period;
757 		ahc->transinfo[devinfo->target_offset].user.offset = offset;
758 	}
759 }
760 
761 static void
762 ahc_set_width(struct ahc_softc *ahc, struct ahc_devinfo *devinfo,
763 	      struct cam_path *path, u_int width, u_int type)
764 {
765 	u_int	 oldwidth;
766 
767 	oldwidth = ahc->transinfo[devinfo->target_offset].current.width;
768 
769 	if ((type & AHC_TRANS_CUR) != 0 && oldwidth != width) {
770 		struct	 ccb_trans_settings neg;
771 		u_int8_t scsirate;
772 
773 		scsirate =  ahc->transinfo[devinfo->target_offset].scsirate;
774 		scsirate &= ~WIDEXFER;
775 		if (width == MSG_EXT_WDTR_BUS_16_BIT)
776 			scsirate |= WIDEXFER;
777 
778 		ahc->transinfo[devinfo->target_offset].scsirate = scsirate;
779 
780 		if ((type & AHC_TRANS_ACTIVE) == AHC_TRANS_ACTIVE)
781 			ahc_outb(ahc, SCSIRATE, scsirate);
782 
783 		ahc->transinfo[devinfo->target_offset].current.width = width;
784 
785 		/* Tell the SCSI layer about the new transfer params */
786 		neg.bus_width = width;
787 		neg.valid = CCB_TRANS_BUS_WIDTH_VALID;
788 		xpt_setup_ccb(&neg.ccb_h, path, /*priority*/1);
789 		xpt_async(AC_TRANSFER_NEG, path, &neg);
790 		if (bootverbose) {
791 			printf("%s: target %d using %dbit transfers\n",
792 			       ahc_name(ahc), devinfo->target,
793 			       8 * (0x01 << neg.bus_width));
794 		}
795 	}
796 	if ((type & AHC_TRANS_GOAL) != 0) {
797 		ahc->transinfo[devinfo->target_offset].goal.width = width;
798 	}
799 	if ((type & AHC_TRANS_USER) != 0) {
800 		ahc->transinfo[devinfo->target_offset].user.width = width;
801 	}
802 }
803 
804 /*
805  * Attach all the sub-devices we can find
806  */
807 int
808 ahc_attach(struct ahc_softc *ahc)
809 {
810 	struct ccb_setasync csa;
811 	struct cam_devq *devq;
812 	int bus_id;
813 
814 	/*
815 	 * Create the device queue for our SIM.
816 	 */
817 	devq = cam_simq_alloc(ahc->scb_data->maxscbs);
818 	if (devq == NULL)
819 		return (0);
820 
821 	/*
822 	 * Construct our SIM entry
823 	 */
824 	ahc->sim = cam_sim_alloc(ahc_action, ahc_poll, "ahc", ahc, ahc->unit,
825 				 1, ahc->scb_data->maxscbs, devq);
826 	if (ahc->sim == NULL) {
827 		cam_simq_free(devq);
828 		return (0);
829 	}
830 	bus_id = (ahc->flags & AHC_CHANNEL_B_PRIMARY) ? 1 : 0;
831 
832 	if (xpt_bus_register(ahc->sim, bus_id) != CAM_SUCCESS) {
833 		cam_sim_free(ahc->sim, /*free_devq*/TRUE);
834 		return (0);
835 	}
836 
837 	if (xpt_create_path(&ahc->path, /*periph*/NULL,
838 			    cam_sim_path(ahc->sim), CAM_TARGET_WILDCARD,
839 			    CAM_LUN_WILDCARD) != CAM_REQ_CMP) {
840 		xpt_bus_deregister(cam_sim_path(ahc->sim));
841 		cam_sim_free(ahc->sim, /*free_devq*/TRUE);
842 		return (0);
843 	}
844 
845 	xpt_setup_ccb(&csa.ccb_h, ahc->path, /*priority*/5);
846 	csa.ccb_h.func_code = XPT_SASYNC_CB;
847 	csa.event_enable = AC_LOST_DEVICE;
848 	csa.callback = ahc_async;
849 	csa.callback_arg = ahc->sim;
850 	xpt_action((union ccb *)&csa);
851 
852 	if (ahc->features & AHC_TWIN) {
853 		ahc->sim_b = cam_sim_alloc(ahc_action, ahc_poll, "ahc",
854 					   ahc, ahc->unit, 1,
855 					   ahc->scb_data->maxscbs, devq);
856 
857 		if (ahc->sim_b == NULL) {
858 			printf("ahc_attach: Unable to attach second "
859 			       "bus due to resource shortage");
860 			/*
861 			 * Must return success or the first bus
862 			 * won't get attached either.
863 			 */
864 			return (1);
865 		}
866 
867 		bus_id = (ahc->flags & AHC_CHANNEL_B_PRIMARY) ? 0 : 1;
868 		if (xpt_bus_register(ahc->sim_b, bus_id) != CAM_SUCCESS) {
869 			printf("ahc_attach: Unable to attach second "
870 			       "bus due to resource shortage");
871 			/*
872 			 * We do not want to destroy the device queue
873 			 * because the first bus is using it.
874 			 */
875 			cam_sim_free(ahc->sim_b, /*free_devq*/FALSE);
876 			ahc->sim_b = NULL;
877 			return (1);
878 		}
879 
880 		if (xpt_create_path(&ahc->path_b, /*periph*/NULL,
881 				    cam_sim_path(ahc->sim_b),
882 				    CAM_TARGET_WILDCARD,
883 				    CAM_LUN_WILDCARD) != CAM_REQ_CMP) {
884 			xpt_bus_deregister(cam_sim_path(ahc->sim_b));
885 			cam_sim_free(ahc->sim_b, /*free_devq*/FALSE);
886 			ahc->sim_b = NULL;
887 			return (1);
888 		}
889 		xpt_setup_ccb(&csa.ccb_h, ahc->path_b, /*priority*/5);
890 		csa.ccb_h.func_code = XPT_SASYNC_CB;
891 		csa.event_enable = AC_LOST_DEVICE;
892 		csa.callback = ahc_async;
893 		csa.callback_arg = ahc->sim_b;
894 		xpt_action((union ccb *)&csa);
895 	}
896 	return (1);
897 }
898 
899 static void
900 ahc_fetch_devinfo(struct ahc_softc *ahc, struct ahc_devinfo *devinfo)
901 {
902 	u_int8_t saved_tcl;
903 
904 	saved_tcl = ahc_inb(ahc, SAVED_TCL);
905 	ahc_compile_devinfo(devinfo, (saved_tcl >> 4) & 0x0f,
906 			    (saved_tcl & SELBUSB) ? 'B': 'A');
907 }
908 
909 static void
910 ahc_compile_devinfo(struct ahc_devinfo *devinfo, u_int target, char channel)
911 {
912 	devinfo->target = target;
913 	devinfo->target_offset = target;
914 	devinfo->channel = channel;
915 	if (channel == 'B')
916 		devinfo->target_offset += 8;
917 	devinfo->target_mask = (0x01 << devinfo->target_offset);
918 }
919 
920 /*
921  * Catch an interrupt from the adapter
922  */
923 void
924 ahc_intr(void *arg)
925 {
926 	struct	 ahc_softc *ahc;
927 	u_int8_t intstat;
928 
929 	ahc = (struct ahc_softc *)arg;
930 
931 	intstat = ahc_inb(ahc, INTSTAT);
932 
933 	/*
934 	 * Any interrupts to process?
935 	 */
936 #if NPCI > 0
937 	if ((intstat & INT_PEND) == 0) {
938 		if ((ahc->chip & AHC_PCI) != 0
939 		 && (ahc->unsolicited_ints > 500)) {
940 			if ((ahc_inb(ahc, ERROR) & PCIERRSTAT) != 0)
941 				ahc_pci_intr(ahc);
942 			ahc->unsolicited_ints = 0;
943 		} else {
944 			ahc->unsolicited_ints++;
945 		}
946 		return;
947 	} else {
948 		ahc->unsolicited_ints = 0;
949 	}
950 #else
951 	if ((intstat & INT_PEND) == 0)
952 		return;
953 #endif
954 
955 	if (intstat & CMDCMPLT) {
956 		struct	 scb *scb;
957 		u_int8_t scb_index;
958 
959 		ahc_outb(ahc, CLRINT, CLRCMDINT);
960 		while (ahc->qoutfifo[ahc->qoutfifonext] != SCB_LIST_NULL) {
961 			scb_index = ahc->qoutfifo[ahc->qoutfifonext];
962 			ahc->qoutfifo[ahc->qoutfifonext++] = SCB_LIST_NULL;
963 
964 			if (scb_index == TARGET_CMD_CMPLT) {
965 				ahc_handle_target_cmd(ahc);
966 				continue;
967 			}
968 
969 			scb = ahc->scb_data->scbarray[scb_index];
970 			if (!scb || !(scb->flags & SCB_ACTIVE)) {
971 				printf("%s: WARNING no command for scb %d "
972 				       "(cmdcmplt)\nQOUTPOS = %d\n",
973 				       ahc_name(ahc), scb_index,
974 				       ahc->qoutfifonext - 1);
975 				continue;
976 			}
977 
978 			/*
979 			 * Save off the residual
980 			 * if there is one.
981 			 */
982 			if (scb->hscb->residual_SG_count != 0)
983 				ahc_calc_residual(scb);
984 			ahc_done(ahc, scb);
985 		}
986 	}
987 	if (intstat & BRKADRINT) {
988 		/*
989 		 * We upset the sequencer :-(
990 		 * Lookup the error message
991 		 */
992 		int i, error, num_errors;
993 
994 		error = ahc_inb(ahc, ERROR);
995 		num_errors =  sizeof(hard_error)/sizeof(hard_error[0]);
996 		for (i = 0; error != 1 && i < num_errors; i++)
997 			error >>= 1;
998 		panic("%s: brkadrint, %s at seqaddr = 0x%x\n",
999 		      ahc_name(ahc), hard_error[i].errmesg,
1000 		      ahc_inb(ahc, SEQADDR0) |
1001 		      (ahc_inb(ahc, SEQADDR1) << 8));
1002 
1003 		/* Tell everyone that this HBA is no longer availible */
1004 		ahc_abort_scbs(ahc, ALL_TARGETS, ALL_CHANNELS,
1005 			       ALL_LUNS, SCB_LIST_NULL, CAM_NO_HBA);
1006 	}
1007 	if (intstat & SEQINT)
1008 		ahc_handle_seqint(ahc, intstat);
1009 
1010 	if (intstat & SCSIINT)
1011 		ahc_handle_scsiint(ahc, intstat);
1012 }
1013 
1014 static void
1015 ahc_handle_target_cmd(struct ahc_softc *ahc)
1016 {
1017 	struct	  tmode_tstate *tstate;
1018 	struct	  tmode_lstate *lstate;
1019 	struct	  ccb_accept_tio *atio;
1020 	struct	  target_cmd *cmd;
1021 	u_int8_t *byte;
1022 	int	  initiator;
1023 	int	  target;
1024 	int	  lun;
1025 
1026 	cmd = &ahc->targetcmds[ahc->next_targetcmd];
1027 	ahc->next_targetcmd++;
1028 	if (ahc->next_targetcmd >= ahc->num_targetcmds)
1029 		ahc->next_targetcmd = 0;
1030 
1031 	initiator = cmd->icl >> 4;
1032 	target = cmd->targ_id;
1033 	lun    = (cmd->identify & MSG_IDENTIFY_LUNMASK);
1034 
1035 	xpt_print_path(ahc->path);
1036 	printf("Received Target Command (%d:%d:%d)\n",
1037 	       initiator, target, lun);
1038 	ahc_dump_targcmd(cmd);
1039 
1040 	byte = cmd->bytes;
1041 	tstate = ahc->enabled_targets[target];
1042 	lstate = NULL;
1043 	if (tstate != NULL && lun < 8)
1044 		lstate = tstate->enabled_luns[lun];
1045 
1046 	/*
1047 	 * XXX Need to have a default TMODE devce that attaches to luns
1048 	 *     that wouldn't otherwise be enabled and returns the proper
1049 	 *     inquiry information.  After all, we don't want to duplicate
1050 	 *     this code in each driver.  For now, simply drop it on the
1051 	 *     floor.
1052 	 */
1053 	if (lstate == NULL) {
1054 		printf("Incoming Command on disabled lun\n");
1055 		return;
1056 	}
1057 
1058 	atio = (struct ccb_accept_tio*)SLIST_FIRST(&lstate->accept_tios);
1059 	/* XXX Should reconnect and return BUSY status */
1060 	if (atio == NULL) {
1061 		printf("No ATIOs for incoming command\n");
1062 		return;
1063 	}
1064 
1065 	/*
1066 	 * Package it up and send it off to
1067 	 * whomever has this lun enabled.
1068 	 */
1069 	atio->init_id = initiator;
1070 	if (byte[0] != 0xFF) {
1071 		/* Tag was included */
1072 		atio->tag_action = *byte++;
1073 		atio->tag_id = *byte++;
1074 		atio->ccb_h.flags = CAM_TAG_ACTION_VALID;
1075 	} else {
1076 		byte++;
1077 		atio->ccb_h.flags = 0;
1078 	}
1079 
1080 	/* Okay.  Now determine the cdb size based on the command code */
1081 	switch (*byte >> CMD_GROUP_CODE_SHIFT) {
1082 	case 0:
1083 		atio->cdb_len = 6;
1084 		break;
1085 	case 1:
1086 	case 2:
1087 		atio->cdb_len = 10;
1088 		break;
1089 	case 4:
1090 		atio->cdb_len = 16;
1091 		break;
1092 	case 5:
1093 		atio->cdb_len = 12;
1094 		break;
1095 	case 3:
1096 	default:
1097 		/* Only copy the opcode. */
1098 		atio->cdb_len = 1;
1099 		printf("Reserved or VU command code type encountered\n");
1100 		break;
1101 	}
1102 	bcopy(byte, atio->cdb_io.cdb_bytes, atio->cdb_len);
1103 
1104 	SLIST_REMOVE_HEAD(&lstate->accept_tios, sim_links.sle);
1105 	atio->ccb_h.status |= CAM_CDB_RECVD;
1106 
1107 	if ((cmd->identify & MSG_IDENTIFY_DISCFLAG) == 0) {
1108 		/*
1109 		 * We weren't allowed to disconnect.
1110 		 * We're hanging on the bus until a
1111 		 * continue target I/O comes in response
1112 		 * to this accept tio.
1113 		 */
1114 		xpt_print_path(atio->ccb_h.path);
1115 		printf("Incoming Command did not disconnect %x\n", lstate);
1116 		ahc->pending_device = lstate;
1117 	}
1118 	xpt_done((union ccb*)atio);
1119 }
1120 
1121 static void
1122 ahc_handle_seqint(struct ahc_softc *ahc, u_int8_t intstat)
1123 {
1124 	struct scb *scb;
1125 	struct ahc_devinfo devinfo;
1126 
1127 	ahc_fetch_devinfo(ahc, &devinfo);
1128 
1129 	/*
1130 	 * Clear the upper byte that holds SEQINT status
1131 	 * codes and clear the SEQINT bit. We will unpause
1132 	 * the sequencer, if appropriate, after servicing
1133 	 * the request.
1134 	 */
1135 	ahc_outb(ahc, CLRINT, CLRSEQINT);
1136 	switch (intstat & SEQINT_MASK) {
1137 	case NO_MATCH:
1138 	{
1139 		/* Ensure we don't leave the selection hardware on */
1140 		ahc_outb(ahc, SCSISEQ,
1141 			 ahc_inb(ahc, SCSISEQ) & (ENSELI|ENRSELI|ENAUTOATNP));
1142 		printf("%s:%c:%d: no active SCB for reconnecting "
1143 		       "target - issuing BUS DEVICE RESET\n",
1144 		       ahc_name(ahc), devinfo.channel, devinfo.target);
1145 		printf("SAVED_TCL == 0x%x, ARG_1 == 0x%x, SEQ_FLAGS == 0x%x\n",
1146 		       ahc_inb(ahc, SAVED_TCL), ahc_inb(ahc, ARG_1),
1147 		       ahc_inb(ahc, SEQ_FLAGS));
1148 		break;
1149 	}
1150 	case SEND_REJECT:
1151 	{
1152 		u_int8_t rejbyte = ahc_inb(ahc, ACCUM);
1153 		printf("%s:%c:%d: Warning - unknown message received from "
1154 		       "target (0x%x).  Rejecting\n",
1155 		       ahc_name(ahc), devinfo.channel, devinfo.target, rejbyte);
1156 		break;
1157 	}
1158 	case NO_IDENT:
1159 	{
1160 		/*
1161 		 * The reconnecting target either did not send an identify
1162 		 * message, or did, but we didn't find and SCB to match and
1163 		 * before it could respond to our ATN/abort, it hit a dataphase.
1164 		 * The only safe thing to do is to blow it away with a bus
1165 		 * reset.
1166 		 */
1167 		int found;
1168 
1169 		printf("%s:%c:%d: Target did not send an IDENTIFY message. "
1170 		       "LASTPHASE = 0x%x, SAVED_TCL == 0x%x\n",
1171 		       ahc_name(ahc), devinfo.channel, devinfo.target,
1172 		       ahc_inb(ahc, LASTPHASE), ahc_inb(ahc, SAVED_TCL));
1173 		found = ahc_reset_channel(ahc, devinfo.channel,
1174 					  /*initiate reset*/TRUE);
1175 		printf("%s: Issued Channel %c Bus Reset. "
1176 		       "%d SCBs aborted\n", ahc_name(ahc), devinfo.channel,
1177 		       found);
1178 		break;
1179 	}
1180 	case BAD_PHASE:
1181 		if (ahc_inb(ahc, LASTPHASE) == P_BUSFREE) {
1182 			printf("%s:%c:%d: Missed busfree.\n", ahc_name(ahc),
1183 			       devinfo.channel, devinfo.target);
1184 			restart_sequencer(ahc);
1185 			return;
1186 		} else {
1187 			printf("%s:%c:%d: unknown scsi bus phase.  Attempting "
1188 			       "to continue\n", ahc_name(ahc), devinfo.channel,
1189 			       devinfo.target);
1190 		}
1191 		break;
1192 	case EXTENDED_MSG:
1193 	{
1194 		ahc->msg_type = MSG_TYPE_INITIATOR_MSGIN;
1195 		ahc->msg_len = 0;
1196 		ahc->msg_index = 0;
1197 
1198 		/*
1199 		 * To actually receive the message, simply turn on
1200 		 * REQINIT interrupts and let our interrupt handler
1201 		 * do the rest (REQINIT should already be true).
1202 		 */
1203 		ahc_outb(ahc, SIMODE1, ahc_inb(ahc, SIMODE1) | ENREQINIT);
1204 		ahc->flags |= AHC_HANDLING_REQINITS;
1205 		return;
1206 	}
1207 	case REJECT_MSG:
1208 	{
1209 		/*
1210 		 * What we care about here is if we had an
1211 		 * outstanding SDTR or WDTR message for this
1212 		 * target.  If we did, this is a signal that
1213 		 * the target is refusing negotiation.
1214 		 */
1215 
1216 		u_int8_t scb_index;
1217 		u_int8_t last_msg;
1218 
1219 		scb_index = ahc_inb(ahc, SCB_TAG);
1220 		scb = ahc->scb_data->scbarray[scb_index];
1221 
1222 		last_msg = ahc_inb(ahc, LAST_MSG);
1223 
1224 		if ((last_msg == MSG_IDENTIFYFLAG)
1225 		 && (scb->hscb->control & MSG_SIMPLE_Q_TAG) != 0) {
1226 			struct	ccb_trans_settings neg;
1227 
1228 			printf("%s:%c:%d: refuses tagged commands.  Performing "
1229 			       "non-tagged I/O\n", ahc_name(ahc),
1230 			       devinfo.channel, devinfo.target);
1231 
1232 			ahc->tagenable &= ~devinfo.target_mask;
1233 			neg.flags = 0;
1234 			neg.valid = CCB_TRANS_TQ_VALID;
1235 			xpt_setup_ccb(&neg.ccb_h, scb->ccb->ccb_h.path,
1236 				      /*priority*/1);
1237 			xpt_async(AC_TRANSFER_NEG, scb->ccb->ccb_h.path, &neg);
1238 			/*
1239 			 * Resend the identify for this CCB as the target
1240 			 * may believe that the selection is invalid otherwise.
1241 			 */
1242 			ahc_outb(ahc, SCB_CONTROL, ahc_inb(ahc, SCB_CONTROL)
1243 						  & ~MSG_SIMPLE_Q_TAG);
1244 		 	scb->hscb->control &= ~MSG_SIMPLE_Q_TAG;
1245 			scb->ccb->ccb_h.flags &= ~CAM_TAG_ACTION_VALID;
1246 			ahc_outb(ahc, MSG_OUT, MSG_IDENTIFYFLAG);
1247 			ahc_outb(ahc, SCSISIGO, ahc_inb(ahc, SCSISIGO) | ATNO);
1248 
1249 			/*
1250 			 * Requeue all tagged commands for this target
1251 			 * currently in our posession so they can be
1252 			 * converted to untagged commands.
1253 			 */
1254 			ahc_search_qinfifo(ahc, SCB_TARGET(scb),
1255 					   SCB_CHANNEL(scb),
1256 					   SCB_LUN(scb),
1257 					   /*tag*/SCB_LIST_NULL,
1258 					   CAM_REQUEUE_REQ,
1259 					   SEARCH_COMPLETE);
1260 		} else if ((last_msg == MSG_IDENTIFYFLAG
1261 			 || last_msg == HOST_MSG)
1262 		        && (scb->flags & SCB_MSGOUT_WDTR) != 0) {
1263 			struct ahc_target_tinfo *tinfo;
1264 
1265 			/* note 8bit xfers and clear flag */
1266 			printf("%s:%c:%d: refuses WIDE negotiation.  Using "
1267 			       "8bit transfers\n", ahc_name(ahc),
1268 			       devinfo.channel, devinfo.target);
1269 			scb->flags &= ~SCB_MSGOUT_BITS;
1270 			ahc->wdtrpending &= ~devinfo.target_mask;
1271 			ahc_set_width(ahc, &devinfo, scb->ccb->ccb_h.path,
1272 				      MSG_EXT_WDTR_BUS_8_BIT,
1273 				      AHC_TRANS_ACTIVE|AHC_TRANS_GOAL);
1274 			ahc_set_syncrate(ahc, &devinfo, scb->ccb->ccb_h.path,
1275 					 /*syncrate*/NULL, /*period*/0,
1276 					 /*offset*/0, AHC_TRANS_ACTIVE);
1277 			tinfo = &ahc->transinfo[devinfo.target_offset];
1278 			if (tinfo->goal.period) {
1279 				/* Start the sync negotiation */
1280 				ahc->sdtrpending |= devinfo.target_mask;
1281 				scb->flags |= SCB_MSGOUT_SDTR;
1282 				ahc_outb(ahc, MSG_OUT, HOST_MSG);
1283 				ahc_outb(ahc, SCSISIGO,
1284 					 ahc_inb(ahc, SCSISIGO) | ATNO);
1285 			}
1286 		} else if ((last_msg == MSG_IDENTIFYFLAG
1287 			 || last_msg == HOST_MSG)
1288 		        && (scb->flags & SCB_MSGOUT_SDTR) != 0) {
1289 
1290 			/* note asynch xfers and clear flag */
1291 			ahc_set_syncrate(ahc, &devinfo, scb->ccb->ccb_h.path,
1292 					 /*syncrate*/NULL, /*period*/0,
1293 					 /*offset*/0,
1294 					 AHC_TRANS_ACTIVE|AHC_TRANS_GOAL);
1295 			scb->flags &= ~SCB_MSGOUT_BITS;
1296  			ahc->sdtrpending &= ~devinfo.target_mask;
1297 			printf("%s:%c:%d: refuses synchronous negotiation. "
1298 			       "Using asynchronous transfers\n",
1299 			       ahc_name(ahc),
1300 			       devinfo.channel, devinfo.target);
1301 		} else {
1302 			/*
1303 			 * Otherwise, we ignore it.
1304 			 */
1305 #ifdef AHC_DEBUG
1306 			if (ahc_debug & AHC_SHOWMISC)
1307 				printf("%s:%c:%d: Message reject -- ignored\n",
1308 				       ahc_name(ahc), devinfo.channel,
1309 				       devinfo.target);
1310 #endif
1311 			break;
1312 		}
1313 		break;
1314 	}
1315 	case BAD_STATUS:
1316 	{
1317 		u_int8_t scb_index;
1318 		struct	 hardware_scb *hscb;
1319 		struct	 ccb_scsiio *csio;
1320 		/*
1321 		 * The sequencer will notify us when a command
1322 		 * has an error that would be of interest to
1323 		 * the kernel.  This allows us to leave the sequencer
1324 		 * running in the common case of command completes
1325 		 * without error.  The sequencer will already have
1326 		 * dma'd the SCB back up to us, so we can reference
1327 		 * the in kernel copy directly.
1328 		 */
1329 		scb_index = ahc_inb(ahc, SCB_TAG);
1330 		scb = ahc->scb_data->scbarray[scb_index];
1331 		hscb = scb->hscb;
1332 
1333 		/*
1334 		 * Set the default return value to 0 (don't
1335 		 * send sense).  The sense code will change
1336 		 * this if needed.
1337 		 */
1338 		ahc_outb(ahc, RETURN_1, 0);
1339 		if (!(scb && (scb->flags & SCB_ACTIVE))) {
1340 			printf("%s:%c:%d: ahc_intr - referenced scb "
1341 			       "not valid during seqint 0x%x scb(%d)\n",
1342 			       ahc_name(ahc), devinfo.channel,
1343 			       devinfo.target, intstat, scb_index);
1344 			goto unpause;
1345 		}
1346 
1347 		/* Don't want to clobber the original sense code */
1348 		if ((scb->flags & SCB_SENSE) != 0) {
1349 			/*
1350 			 * Clear the SCB_SENSE Flag and have
1351 			 * the sequencer do a normal command
1352 			 * complete.
1353 			 */
1354 			scb->flags &= ~SCB_SENSE;
1355 			ahc_set_ccb_status(scb->ccb, CAM_AUTOSENSE_FAIL);
1356 			break;
1357 		}
1358 		ahc_set_ccb_status(scb->ccb, CAM_SCSI_STATUS_ERROR);
1359 		csio = &scb->ccb->csio;
1360 		csio->scsi_status = hscb->status;
1361 		switch (hscb->status) {
1362 		case SCSI_STATUS_OK:
1363 			printf("%s: Interrupted for staus of 0???\n",
1364 			       ahc_name(ahc));
1365 			break;
1366 		case SCSI_STATUS_CMD_TERMINATED:
1367 		case SCSI_STATUS_CHECK_COND:
1368 #ifdef AHC_DEBUG
1369 			if (ahc_debug & AHC_SHOWSENSE) {
1370 				xpt_print_path(csio->ccb_h.path);
1371 				printf("SCB %d: requests Check Status\n",
1372 				       scb->hscb->tag);
1373 			}
1374 #endif
1375 
1376 			if ((csio->ccb_h.flags & CAM_DIS_AUTOSENSE) == 0) {
1377 				struct ahc_dma_seg *sg = scb->ahc_dma;
1378 				struct scsi_sense *sc =
1379 					(struct scsi_sense *)(&hscb->cmdstore);
1380 				struct ahc_target_tinfo *tinfo;
1381 
1382 				/*
1383 				 * Save off the residual if there is one.
1384 				 */
1385 				if (hscb->residual_SG_count != 0)
1386 					ahc_calc_residual(scb);
1387 
1388 #ifdef AHC_DEBUG
1389 				if (ahc_debug & AHC_SHOWSENSE) {
1390 					xpt_print_path(csio->ccb_h.path);
1391 					printf("Sending Sense\n");
1392 				}
1393 #endif
1394 				/*
1395 				 * bzero from the sense data before having
1396 				 * the drive fill it.  The SCSI spec mandates
1397 				 * that any untransfered data should be
1398 				 * assumed to be zero.
1399 				 */
1400 				bzero(&csio->sense_data,
1401 				      sizeof(csio->sense_data));
1402 				sc->opcode = REQUEST_SENSE;
1403 				sc->byte2 =  SCB_LUN(scb) << 5;
1404 				sc->unused[0] = 0;
1405 				sc->unused[1] = 0;
1406 				sc->length = csio->sense_len;
1407 				sc->control = 0;
1408 
1409 				sg->addr = vtophys(&csio->sense_data);
1410 				sg->len = csio->sense_len;
1411 
1412 				/*
1413 				 * Would be nice to preserve DISCENB here,
1414 				 * but due to the way we page SCBs, we can't.
1415 				 */
1416 				hscb->control = 0;
1417 				/*
1418 				 * This request sense could be because the
1419 				 * the device lost power or in some other
1420 				 * way has lost our transfer negotiations.
1421 				 * Renegotiate if appropriate.
1422 				 */
1423 				ahc_set_width(ahc, &devinfo,
1424 					      scb->ccb->ccb_h.path,
1425 					      MSG_EXT_WDTR_BUS_8_BIT,
1426 					      AHC_TRANS_CUR);
1427 				ahc_set_syncrate(ahc, &devinfo,
1428 						 scb->ccb->ccb_h.path,
1429 						 /*syncrate*/NULL, /*period*/0,
1430 						 /*offset*/0, AHC_TRANS_CUR);
1431 				scb->flags &= ~SCB_MSGOUT_BITS;
1432 				tinfo = &ahc->transinfo[devinfo.target_offset];
1433 				if (tinfo->goal.width) {
1434 					ahc->wdtrpending |= devinfo.target_mask;
1435 					hscb->control |= MK_MESSAGE;
1436 					scb->flags |= SCB_MSGOUT_WDTR;
1437 				} else if (tinfo->goal.period) {
1438 					ahc->sdtrpending |= devinfo.target_mask;
1439 					hscb->control |= MK_MESSAGE;
1440 					scb->flags |= SCB_MSGOUT_SDTR;
1441 				}
1442 				hscb->status = 0;
1443 				hscb->SG_count = 1;
1444 				hscb->SG_pointer = scb->ahc_dmaphys;
1445 				hscb->data = sg->addr;
1446 				hscb->datalen = sg->len;
1447 				hscb->cmdpointer = hscb->cmdstore_busaddr;
1448 				hscb->cmdlen = sizeof(*sc);
1449 				scb->sg_count = hscb->SG_count;
1450 				scb->flags |= SCB_SENSE;
1451 				/*
1452 				 * Ensure the target is busy since this
1453 				 * will be an untagged request.
1454 				 */
1455 				ahc_busy_tcl(ahc, scb);
1456 				ahc_outb(ahc, RETURN_1, SEND_SENSE);
1457 
1458 				/*
1459 				 * Ensure we have enough time to actually
1460 				 * retrieve the sense.
1461 				 */
1462 				untimeout(ahc_timeout, (caddr_t)scb,
1463 					  scb->ccb->ccb_h.timeout_ch);
1464 				scb->ccb->ccb_h.timeout_ch =
1465 				    timeout(ahc_timeout, (caddr_t)scb, 5 * hz);
1466 				/* Freeze the queue while the sense occurs. */
1467 				ahc_freeze_devq(ahc, scb->ccb->ccb_h.path);
1468 				ahc_freeze_ccb(scb->ccb);
1469 				break;
1470 			}
1471 			break;
1472 		case SCSI_STATUS_BUSY:
1473 		case SCSI_STATUS_QUEUE_FULL:
1474 			/*
1475 			 * Requeue any transactions that haven't been
1476 			 * sent yet.
1477 			 */
1478 			ahc_freeze_devq(ahc, scb->ccb->ccb_h.path);
1479 			ahc_freeze_ccb(scb->ccb);
1480 			break;
1481 		}
1482 		break;
1483 	}
1484 	case TARGET_SYNC_CMD:
1485 	{
1486 		/*
1487 		 * We've already processed the command.  If the command
1488 		 * is still pending, don't unpause the sequencer until
1489 		 * it returns.
1490 		 */
1491 		xpt_print_path(ahc->path);
1492 		printf("Saw a target sync cmd\n");
1493 		if (ahc->pending_device != NULL) {
1494 			printf("	Pending device too.\n");
1495 			return;
1496 		}
1497 		break;
1498 	}
1499 	case TARGET_MSG_HELP:
1500 	{
1501 		/*
1502 		 * XXX Handle BDR, Abort, Abort Tag, and transfer negotiations.
1503 		 */
1504 		restart_sequencer(ahc);
1505 		return;
1506 	}
1507 	case AWAITING_MSG:
1508 	{
1509 		int	scb_index;
1510 
1511 		scb_index = ahc_inb(ahc, SCB_TAG);
1512 		scb = ahc->scb_data->scbarray[scb_index];
1513 
1514 		/*
1515 		 * To facilitate adding multiple messages together,
1516 		 * each routine should increment the index and len
1517 		 * variables instead of setting them explicitly.
1518 		 */
1519 		ahc->msg_index = 0;
1520 		ahc->msg_len = 0;
1521 
1522 		/*
1523 		 * This SCB had MK_MESSAGE set in its control byte or
1524 		 * we have explicitly set HOST_MSG in MSG_OUT,
1525 		 * informing the sequencer that we want to send a
1526 		 * special message to this target.
1527 		 */
1528 		if ((scb->flags & SCB_DEVICE_RESET) == 0
1529 		 && ahc_inb(ahc, MSG_OUT) == MSG_IDENTIFYFLAG
1530 		 && (scb->hscb->control & TAG_ENB) != 0) {
1531 			ahc->msg_buf[ahc->msg_index++] =
1532 			    scb->ccb->csio.tag_action;
1533 			ahc->msg_buf[ahc->msg_index++] =
1534 			    scb->hscb->tag;
1535 			ahc->msg_len += 2;
1536 		}
1537 
1538 		if (scb->flags & SCB_DEVICE_RESET) {
1539 			ahc->msg_buf[ahc->msg_index++] = MSG_BUS_DEV_RESET;
1540 			ahc->msg_len++;
1541                         xpt_print_path(scb->ccb->ccb_h.path);
1542 			printf("Bus Device Reset Message Sent\n");
1543 		} else if (scb->flags & SCB_ABORT) {
1544 			if ((scb->hscb->control & TAG_ENB) != 0)
1545 				ahc->msg_buf[ahc->msg_index++] = MSG_ABORT_TAG;
1546 			else
1547 				ahc->msg_buf[ahc->msg_index++] = MSG_ABORT;
1548 			ahc->msg_len++;
1549 			xpt_print_path(scb->ccb->ccb_h.path);
1550 			printf("Abort Message Sent\n");
1551 		} else if (scb->flags & SCB_MSGOUT_WDTR) {
1552 			struct	 ahc_target_tinfo *tinfo;
1553 
1554 			tinfo = &ahc->transinfo[devinfo.target_offset];
1555 			ahc_construct_wdtr(ahc, tinfo->goal.width);
1556 		} else if (scb->flags & SCB_MSGOUT_SDTR) {
1557 			struct	ahc_target_tinfo *tinfo;
1558 			u_int	period;
1559 			u_int	maxsync;
1560 
1561 			/*
1562 			 * Now that the target is actually selected, we
1563 			 * can further refine our sync rate based on the
1564 			 * output transceiver mode.
1565 			 */
1566 			if ((ahc->features & AHC_ULTRA2) != 0) {
1567 				if ((ahc_inb(ahc, SBLKCTL) & ENAB40) != 0
1568 				 && (ahc_inb(ahc, SSTAT2) & EXP_ACTIVE) == 0) {
1569 					maxsync = AHC_SYNCRATE_ULTRA2;
1570 				} else {
1571 					maxsync = AHC_SYNCRATE_ULTRA;
1572 				}
1573 			} else if ((ahc->features & AHC_ULTRA) != 0) {
1574 				maxsync = AHC_SYNCRATE_ULTRA;
1575 			} else {
1576 				maxsync = AHC_SYNCRATE_FAST;
1577 			}
1578 			tinfo = &ahc->transinfo[devinfo.target_offset];
1579 			period = tinfo->goal.period;
1580 			ahc_find_syncrate(ahc, &period, maxsync);
1581 			ahc_construct_sdtr(ahc, period, tinfo->goal.offset);
1582 		} else {
1583 			printf("ahc_intr: AWAITING_MSG for an SCB that "
1584 			       "does not have a waiting message");
1585 			panic("SCB = %d, SCB Control = %x, MSG_OUT = %x "
1586 			      "SCB flags = %x", scb_index, scb->hscb->control,
1587 			      ahc_inb(ahc, MSG_OUT), scb->flags);
1588 		}
1589 
1590 		/*
1591 		 * Record the fact that we attempted to send a message.
1592 		 */
1593 		scb->flags |= SCB_MSGOUT_SENT;
1594 
1595 		/*
1596 		 * To actually send the message, simply turn on
1597 		 * REQINIT interrupts and let our interrupt handler
1598 		 * do the rest (REQINIT should already be true).
1599 		 */
1600 		ahc->msg_index = 0;
1601 		ahc->msg_type = MSG_TYPE_INITIATOR_MSGOUT;
1602 		ahc->flags |= AHC_HANDLING_REQINITS;
1603 		ahc_outb(ahc, SIMODE1, ahc_inb(ahc, SIMODE1) | ENREQINIT);
1604 
1605 		return;
1606 	}
1607 	case DATA_OVERRUN:
1608 	{
1609 		/*
1610 		 * When the sequencer detects an overrun, it
1611 		 * places the controller in "BITBUCKET" mode
1612 		 * and allows the target to complete its transfer.
1613 		 * Unfortunately, none of the counters get updated
1614 		 * when the controller is in this mode, so we have
1615 		 * no way of knowing how large the overrun was.
1616 		 */
1617 		u_int8_t scbindex = ahc_inb(ahc, SCB_TAG);
1618 		u_int8_t lastphase = ahc_inb(ahc, LASTPHASE);
1619 		int i;
1620 
1621 		scb = ahc->scb_data->scbarray[scbindex];
1622 		xpt_print_path(scb->ccb->ccb_h.path);
1623 		printf("data overrun detected in %s phase."
1624 		       "  Tag == 0x%x.\n",
1625 		       lastphase == P_DATAIN ? "Data-In" : "Data-Out",
1626 		       scb->hscb->tag);
1627 		xpt_print_path(scb->ccb->ccb_h.path);
1628 		printf("%s seen Data Phase.  Length = %d.  NumSGs = %d.\n",
1629 		       ahc_inb(ahc, SEQ_FLAGS) & DPHASE ? "Have" : "Haven't",
1630 		       scb->ccb->csio.dxfer_len, scb->sg_count);
1631 		for (i = 0; i < scb->sg_count - 1; i++) {
1632 			printf("sg[%d] - Addr 0x%x : Length %d\n",
1633 			       i,
1634 			       scb->ahc_dma[i].addr,
1635 			       scb->ahc_dma[i].len);
1636 		}
1637 		/*
1638 		 * Set this and it will take affect when the
1639 		 * target does a command complete.
1640 		 */
1641 		ahc_freeze_devq(ahc, scb->ccb->ccb_h.path);
1642 		ahc_set_ccb_status(scb->ccb, CAM_DATA_RUN_ERR);
1643 		ahc_freeze_ccb(scb->ccb);
1644 		break;
1645 	}
1646 	case TRACEPOINT:
1647 	{
1648 		printf("TRACEPOINT: RETURN_2 = %d\n", ahc_inb(ahc, RETURN_2));
1649 #if 0
1650 		printf("SSTAT1 == 0x%x\n", ahc_inb(ahc, SSTAT1));
1651 		printf("SSTAT0 == 0x%x\n", ahc_inb(ahc, SSTAT0));
1652 		printf(", SCSISIGI == 0x%x\n", ahc_inb(ahc, SCSISIGI));
1653 		printf("TRACEPOINT: CCHCNT = %d, SG_COUNT = %d\n",
1654 		       ahc_inb(ahc, CCHCNT), ahc_inb(ahc, SG_COUNT));
1655 		printf("TRACEPOINT: SCB_TAG = %d\n", ahc_inb(ahc, SCB_TAG));
1656 		printf("TRACEPOINT1: CCHADDR = %d, CCHCNT = %d, SCBPTR = %d\n",
1657 		       ahc_inb(ahc, CCHADDR)
1658 		    | (ahc_inb(ahc, CCHADDR+1) << 8)
1659 		    | (ahc_inb(ahc, CCHADDR+2) << 16)
1660 		    | (ahc_inb(ahc, CCHADDR+3) << 24),
1661 		       ahc_inb(ahc, CCHCNT)
1662 		    | (ahc_inb(ahc, CCHCNT+1) << 8)
1663 		    | (ahc_inb(ahc, CCHCNT+2) << 16),
1664 		       ahc_inb(ahc, SCBPTR));
1665 		printf("TRACEPOINT: WAITING_SCBH = %d\n", ahc_inb(ahc, WAITING_SCBH));
1666 		printf("TRACEPOINT: SCB_TAG = %d\n", ahc_inb(ahc, SCB_TAG));
1667 #endif
1668 		break;
1669 	}
1670 #if NOT_YET
1671 	/* XXX Fill these in later */
1672 	case MESG_BUFFER_BUSY:
1673 		break;
1674 	case MSGIN_PHASEMIS:
1675 		break;
1676 #endif
1677 	default:
1678 		printf("ahc_intr: seqint, "
1679 		       "intstat == 0x%x, scsisigi = 0x%x\n",
1680 		       intstat, ahc_inb(ahc, SCSISIGI));
1681 		break;
1682 	}
1683 
1684 unpause:
1685 	/*
1686 	 *  The sequencer is paused immediately on
1687 	 *  a SEQINT, so we should restart it when
1688 	 *  we're done.
1689 	 */
1690 	unpause_sequencer(ahc, /*unpause_always*/TRUE);
1691 }
1692 
1693 static void
1694 ahc_handle_scsiint(struct ahc_softc *ahc, u_int8_t intstat)
1695 {
1696 	u_int8_t scb_index;
1697 	u_int8_t status;
1698 	struct scb *scb;
1699 
1700 	scb_index = ahc_inb(ahc, SCB_TAG);
1701 	status = ahc_inb(ahc, SSTAT1);
1702 
1703 	if (scb_index < ahc->scb_data->numscbs) {
1704 		scb = ahc->scb_data->scbarray[scb_index];
1705 		if ((scb->flags & SCB_ACTIVE) == 0)
1706 			scb = NULL;
1707 	} else
1708 		scb = NULL;
1709 
1710 	if ((status & SCSIRSTI) != 0) {
1711 		char channel;
1712 		channel = 'A';
1713 		if ((ahc->features & AHC_TWIN) != 0
1714 		 && ((ahc_inb(ahc, SBLKCTL) & SELBUSB) != 0))
1715 			channel = 'B';
1716 		printf("%s: Someone reset channel %c\n",
1717 			ahc_name(ahc), channel);
1718 		ahc_reset_channel(ahc, channel, /* Initiate Reset */FALSE);
1719 	} else if ((status & BUSFREE) != 0 && (status & SELTO) == 0) {
1720 		/*
1721 		 * First look at what phase we were last in.
1722 		 * If its message out, chances are pretty good
1723 		 * that the busfree was in response to one of
1724 		 * our abort requests.
1725 		 */
1726 		u_int8_t lastphase = ahc_inb(ahc, LASTPHASE);
1727 		u_int8_t saved_tcl = ahc_inb(ahc, SAVED_TCL);
1728 		u_int8_t target = (saved_tcl >> 4) & 0x0f;
1729 		char channel = saved_tcl & SELBUSB ? 'B': 'A';
1730 		int printerror = 1;
1731 
1732 		ahc_outb(ahc, SCSISEQ,
1733 			 ahc_inb(ahc, SCSISEQ) & (ENSELI|ENRSELI|ENAUTOATNP));
1734 		if (lastphase == P_MESGOUT) {
1735 			u_int message;
1736 			u_int tag;
1737 
1738 			message = ahc_inb(ahc, SINDEX);
1739 
1740 			tag = SCB_LIST_NULL;
1741 			switch (message) {
1742 			case MSG_ABORT_TAG:
1743 				tag = scb->hscb->tag;
1744 				/* FALLTRHOUGH */
1745 			case MSG_ABORT:
1746 				xpt_print_path(scb->ccb->ccb_h.path);
1747 				printf("SCB %d - Abort %s Completed.\n",
1748 				       tag == SCB_LIST_NULL ? "" : "Tag",
1749 				       scb->hscb->tag);
1750 				if ((scb->flags & SCB_RECOVERY_SCB) != 0) {
1751 					ahc_set_ccb_status(scb->ccb,
1752 							   CAM_REQ_ABORTED);
1753 					ahc_done(ahc, scb);
1754 				}
1755 				printerror = 0;
1756 				break;
1757 			case MSG_BUS_DEV_RESET:
1758 				ahc_handle_devreset(ahc, target, channel,
1759 						    CAM_BDR_SENT, AC_SENT_BDR,
1760 						    "Bus Device Reset Sent",
1761 						    /*verbose_only*/FALSE);
1762 				printerror = 0;
1763 				break;
1764 			default:
1765 				break;
1766 			}
1767 		}
1768 		if (printerror != 0) {
1769 			if (scb != NULL) {
1770 				u_int8_t tag;
1771 
1772 				if ((scb->hscb->control & TAG_ENB) != 0)
1773 					tag = scb->hscb->tag;
1774 				else
1775 					tag = SCB_LIST_NULL;
1776 				ahc_abort_scbs(ahc, target, channel,
1777 					       SCB_LUN(scb), tag,
1778 					       CAM_UNEXP_BUSFREE);
1779 			} else {
1780 				ahc_abort_scbs(ahc, target, channel,
1781 					       ALL_LUNS, SCB_LIST_NULL,
1782 					       CAM_UNEXP_BUSFREE);
1783 				printf("%s: ", ahc_name(ahc));
1784 			}
1785 			printf("Unexpected busfree.  LASTPHASE == 0x%x\n"
1786 			       "SEQADDR == 0x%x\n",
1787 			       lastphase, ahc_inb(ahc, SEQADDR0)
1788 				| (ahc_inb(ahc, SEQADDR1) << 8));
1789 		}
1790 		ahc_outb(ahc, MSG_OUT, MSG_NOOP);
1791 		ahc_outb(ahc, SIMODE1,
1792 			 ahc_inb(ahc, SIMODE1) & ~(ENBUSFREE|ENREQINIT));
1793 		ahc->flags &= ~AHC_HANDLING_REQINITS;
1794 		ahc_outb(ahc, CLRSINT1, CLRBUSFREE);
1795 		ahc_outb(ahc, CLRINT, CLRSCSIINT);
1796 		restart_sequencer(ahc);
1797 	} else if ((status & SELTO) != 0) {
1798 		u_int8_t scbptr;
1799 		u_int8_t nextscb;
1800 
1801 		scbptr = ahc_inb(ahc, WAITING_SCBH);
1802 		ahc_outb(ahc, SCBPTR, scbptr);
1803 		scb_index = ahc_inb(ahc, SCB_TAG);
1804 
1805 		if (scb_index < ahc->scb_data->numscbs) {
1806 			scb = ahc->scb_data->scbarray[scb_index];
1807 			if ((scb->flags & SCB_ACTIVE) == 0)
1808 				scb = NULL;
1809 		} else
1810 			scb = NULL;
1811 
1812 		if (scb == NULL) {
1813 			printf("%s: ahc_intr - referenced scb not "
1814 			       "valid during SELTO scb(%d, %d)\n",
1815 			       ahc_name(ahc), scbptr, scb_index);
1816 		} else {
1817 			/*
1818 			 * Clear any pending messages for the timed out
1819 			 * target.
1820 			 */
1821 			ahc_outb(ahc, MSG_OUT, MSG_NOOP);
1822 			ahc_handle_devreset(ahc, SCB_TARGET(scb),
1823 					    SCB_CHANNEL(scb), CAM_SEL_TIMEOUT,
1824 					    /*ac_code*/0, "Selection Timeout",
1825 					    /*verbose_only*/TRUE);
1826 		}
1827 		/* Stop the selection */
1828 		ahc_outb(ahc, SCSISEQ, 0);
1829 
1830 		ahc_outb(ahc, SIMODE1,
1831 			 ahc_inb(ahc, SIMODE1) & ~ENREQINIT);
1832 		ahc->flags &= ~AHC_HANDLING_REQINITS;
1833 
1834 		ahc_outb(ahc, CLRSINT1, CLRSELTIMEO|CLRBUSFREE);
1835 
1836 		ahc_outb(ahc, CLRINT, CLRSCSIINT);
1837 
1838 		restart_sequencer(ahc);
1839 	} else if (scb == NULL) {
1840 		printf("%s: ahc_intr - referenced scb not "
1841 		       "valid during scsiint 0x%x scb(%d)\n"
1842 		       "SIMODE0 = 0x%x, SIMODE1 = 0x%x, SSTAT0 = 0x%x\n"
1843 		       "SEQADDR = 0x%x\n", ahc_name(ahc),
1844 			status, scb_index, ahc_inb(ahc, SIMODE0),
1845 			ahc_inb(ahc, SIMODE1), ahc_inb(ahc, SSTAT0),
1846 			ahc_inb(ahc, SEQADDR0) | (ahc_inb(ahc, SEQADDR1) << 8));
1847 		ahc_outb(ahc, CLRSINT1, status);
1848 		ahc_outb(ahc, CLRINT, CLRSCSIINT);
1849 		unpause_sequencer(ahc, /*unpause_always*/TRUE);
1850 		scb = NULL;
1851 	} else if ((status & SCSIPERR) != 0) {
1852 		/*
1853 		 * Determine the bus phase and
1854 		 * queue an appropriate message
1855 		 */
1856 		char	 *phase;
1857 		u_int8_t mesg_out = MSG_NOOP;
1858 		u_int8_t lastphase = ahc_inb(ahc, LASTPHASE);
1859 
1860 		xpt_print_path(scb->ccb->ccb_h.path);
1861 
1862 		switch (lastphase) {
1863 		case P_DATAOUT:
1864 			phase = "Data-Out";
1865 			break;
1866 		case P_DATAIN:
1867 			phase = "Data-In";
1868 			mesg_out = MSG_INITIATOR_DET_ERR;
1869 			break;
1870 		case P_COMMAND:
1871 			phase = "Command";
1872 			break;
1873 		case P_MESGOUT:
1874 			phase = "Message-Out";
1875 			break;
1876 		case P_STATUS:
1877 			phase = "Status";
1878 			mesg_out = MSG_INITIATOR_DET_ERR;
1879 			break;
1880 		case P_MESGIN:
1881 			phase = "Message-In";
1882 			mesg_out = MSG_PARITY_ERROR;
1883 			break;
1884 		default:
1885 			phase = "unknown";
1886 			break;
1887 		}
1888 		printf("parity error during %s phase.\n", phase);
1889 
1890 		printf("SEQADDR == 0x%x\n", ahc_inb(ahc, SEQADDR0)
1891 				 | (ahc_inb(ahc, SEQADDR1) << 8));
1892 
1893 		printf("SCSIRATE == 0x%x\n", ahc_inb(ahc, SCSIRATE));
1894 
1895 		/*
1896 		 * We've set the hardware to assert ATN if we
1897 		 * get a parity error on "in" phases, so all we
1898 		 * need to do is stuff the message buffer with
1899 		 * the appropriate message.  "In" phases have set
1900 		 * mesg_out to something other than MSG_NOP.
1901 		 */
1902 		if (mesg_out != MSG_NOOP) {
1903 			ahc_outb(ahc, MSG_OUT, mesg_out);
1904 		}
1905 		ahc_outb(ahc, CLRSINT1, CLRSCSIPERR);
1906 		ahc_outb(ahc, CLRINT, CLRSCSIINT);
1907 		unpause_sequencer(ahc, /*unpause_always*/TRUE);
1908 	} else if ((status & REQINIT) != 0
1909 		&& (ahc->flags & AHC_HANDLING_REQINITS) != 0) {
1910 		ahc_handle_reqinit(ahc, scb);
1911 	} else {
1912 		xpt_print_path(scb->ccb->ccb_h.path);
1913 		printf("Unknown SCSIINT. Status = 0x%x\n", status);
1914 		ahc_outb(ahc, CLRSINT1, status);
1915 		ahc_outb(ahc, CLRINT, CLRSCSIINT);
1916 		unpause_sequencer(ahc, /*unpause_always*/TRUE);
1917 	}
1918 }
1919 
1920 static void
1921 ahc_handle_reqinit(struct ahc_softc *ahc, struct scb *scb)
1922 {
1923 	struct	 ahc_devinfo devinfo;
1924 	u_int8_t simode1;
1925 
1926 	ahc_fetch_devinfo(ahc, &devinfo);
1927 
1928 	switch (ahc->msg_type) {
1929 	case MSG_TYPE_INITIATOR_MSGOUT:
1930 	{
1931 		int	lastbyte;
1932 		int	phasemis;
1933 		u_int8_t bus_phase;
1934 
1935 		if (ahc->msg_len == 0)
1936 			panic("REQINIT interrupt with no active message");
1937 
1938 		lastbyte = (ahc->msg_index == ahc->msg_len - 1);
1939 		bus_phase = ahc_inb(ahc, SCSISIGI) & PHASE_MASK;
1940 		phasemis = bus_phase != P_MESGOUT;
1941 
1942 		if (lastbyte || phasemis) {
1943 			/* Time to end our message session */
1944 			ahc->msg_len = 0;
1945 			ahc->msg_type = MSG_TYPE_NONE;
1946 			simode1 = ahc_inb(ahc, SIMODE1) & ~ENREQINIT;
1947 			ahc_outb(ahc, SIMODE1, simode1);
1948 			ahc_outb(ahc, CLRINT, CLRSCSIINT);
1949 			ahc->flags &= ~AHC_HANDLING_REQINITS;
1950 
1951 			if (phasemis == 0) {
1952 				ahc_outb(ahc, SINDEX,
1953 					 ahc->msg_buf[ahc->msg_index]);
1954 				ahc_outb(ahc, RETURN_1, 0);
1955 			} else {
1956 				ahc_outb(ahc, RETURN_1, MSGOUT_PHASEMIS);
1957 			}
1958 
1959 			unpause_sequencer(ahc, /* unpause_always */TRUE);
1960 		} else {
1961 			/*
1962 			 * Clear our interrupt status and present the byte
1963 			 * on the bus, but don't unpause the sequencer.
1964 			 */
1965 			ahc_outb(ahc, CLRSINT1, CLRREQINIT);
1966 			ahc_outb(ahc, CLRINT, CLRSCSIINT);
1967 			ahc_outb(ahc, SCSIDATL, ahc->msg_buf[ahc->msg_index++]);
1968 		}
1969 		break;
1970 	}
1971 	case MSG_TYPE_INITIATOR_MSGIN:
1972 	{
1973 		int	phasemis;
1974 		int	done;
1975 
1976 		phasemis = (ahc_inb(ahc, SCSISIGI) & PHASE_MASK) != P_MESGIN;
1977 
1978 		if (phasemis == 0) {
1979 
1980 			ahc->msg_len++;
1981 			/* Pull the byte in without acking it */
1982 			ahc->msg_buf[ahc->msg_index] = ahc_inb(ahc, SCSIBUSL);
1983 			done = ahc_parse_msg(ahc, scb, &devinfo);
1984 			/* Ack the byte */
1985 			ahc_outb(ahc, CLRSINT1, CLRREQINIT);
1986 			ahc_outb(ahc, CLRINT, CLRSCSIINT);
1987 			ahc_inb(ahc, SCSIDATL);
1988 			ahc->msg_index++;
1989 		}
1990 		if (phasemis || done) {
1991 			/* Time to end our message session */
1992 			ahc->msg_len = 0;
1993 			ahc->msg_type = MSG_TYPE_NONE;
1994 			simode1 = ahc_inb(ahc, SIMODE1) & ~ENREQINIT;
1995 			ahc->flags &= ~AHC_HANDLING_REQINITS;
1996 			ahc_outb(ahc, SIMODE1, simode1);
1997 			ahc_outb(ahc, CLRINT, CLRSCSIINT);
1998 			unpause_sequencer(ahc, /* unpause_always */TRUE);
1999 		}
2000 		break;
2001 	}
2002 	default:
2003 		panic("Unknown REQINIT message type");
2004 	}
2005 }
2006 
2007 static int
2008 ahc_parse_msg(struct ahc_softc *ahc, struct scb *scb,
2009 	      struct ahc_devinfo *devinfo)
2010 {
2011 	int	 reject;
2012 	int	 done;
2013 	u_int	 targ_scsirate;
2014 
2015 	done = FALSE;
2016 	reject = FALSE;
2017 	targ_scsirate = ahc->transinfo[devinfo->target_offset].scsirate;
2018 	/*
2019 	 * Parse as much of the message as is availible,
2020 	 * rejecting it if we don't support it.  When
2021 	 * the entire message is availible and has been
2022 	 * handled, return TRUE indicating that we have
2023 	 * parsed an entire message.
2024 	 */
2025 	if (ahc->msg_buf[0] != MSG_EXTENDED) {
2026 		reject = TRUE;
2027 	}
2028 
2029 	/*
2030 	 * Just accept the length byte outright and perform
2031 	 * more checking once we know the message type.
2032 	 */
2033 	if (!reject && (ahc->msg_len > 2)) {
2034 		switch (ahc->msg_buf[2]) {
2035 		case MSG_EXT_SDTR:
2036 		{
2037 			struct	 ahc_syncrate *syncrate;
2038 			u_int	 period;
2039 			u_int	 offset;
2040 			u_int	 saved_offset;
2041 			u_int	 maxsync;
2042 
2043 			if (ahc->msg_buf[1] != MSG_EXT_SDTR_LEN) {
2044 				reject = TRUE;
2045 				break;
2046 			}
2047 
2048 			/*
2049 			 * Wait until we have both args before validating
2050 			 * and acting on this message.
2051 			 */
2052 			if (ahc->msg_len < (MSG_EXT_SDTR_LEN + /*preamble*/2))
2053 				break;
2054 
2055 			period = ahc->msg_buf[3];
2056 			saved_offset = offset = ahc->msg_buf[4];
2057 			if ((ahc->features & AHC_ULTRA2) != 0) {
2058 				if ((ahc_inb(ahc, SBLKCTL) & ENAB40) != 0
2059 				 && (ahc_inb(ahc, SSTAT2) & EXP_ACTIVE) == 0) {
2060 					maxsync = AHC_SYNCRATE_ULTRA2;
2061 				} else {
2062 					maxsync = AHC_SYNCRATE_ULTRA;
2063 				}
2064 			} else if ((ahc->features & AHC_ULTRA) != 0) {
2065 				maxsync = AHC_SYNCRATE_ULTRA;
2066 			} else {
2067 				maxsync = AHC_SYNCRATE_FAST;
2068 			}
2069 			syncrate = ahc_find_syncrate(ahc, &period, maxsync);
2070 			ahc_validate_offset(ahc, syncrate, &offset,
2071 					    targ_scsirate & WIDEXFER);
2072 			ahc_set_syncrate(ahc, devinfo, scb->ccb->ccb_h.path,
2073 					 syncrate, period, offset,
2074 					 AHC_TRANS_ACTIVE|AHC_TRANS_GOAL);
2075 
2076 			/*
2077 			 * See if we initiated Sync Negotiation
2078 			 * and didn't have to fall down to async
2079 			 * transfers.
2080 			 */
2081 			if ((scb->flags & (SCB_MSGOUT_SDTR|SCB_MSGOUT_SENT))
2082 			 == (SCB_MSGOUT_SDTR|SCB_MSGOUT_SENT)) {
2083 				/* We started it */
2084 				if (saved_offset != offset) {
2085 					/* Went too low - force async */
2086 					reject = TRUE;
2087 				}
2088 				scb->flags &= ~SCB_MSGOUT_BITS;
2089 				ahc->sdtrpending &= ~devinfo->target_mask;
2090 			} else {
2091 				/*
2092 				 * Send our own SDTR in reply
2093 				 */
2094 				scb->flags &= ~SCB_MSGOUT_BITS;
2095 				scb->flags |= SCB_MSGOUT_SDTR;
2096 				ahc->sdtrpending |= devinfo->target_mask;
2097 				xpt_print_path(scb->ccb->ccb_h.path);
2098 				printf("Sending SDTR!!\n");
2099 				ahc_outb(ahc, MSG_OUT, HOST_MSG);
2100 				ahc_outb(ahc, SCSISIGO,
2101 					 ahc_inb(ahc, SCSISIGO) | ATNO);
2102 			}
2103 			done = TRUE;
2104 			break;
2105 		}
2106 		case MSG_EXT_WDTR:
2107 		{
2108 			struct	 ccb_trans_settings neg;
2109 			u_int8_t bus_width;
2110 
2111 			if (ahc->msg_buf[1] != MSG_EXT_WDTR_LEN) {
2112 				reject = TRUE;
2113 				break;
2114 			}
2115 
2116 			/*
2117 			 * Wait until we have our arg before validating
2118 			 * and acting on this message.
2119 			 */
2120 			if (ahc->msg_len < (MSG_EXT_WDTR_LEN + /*preamble*/2))
2121 				break;
2122 
2123 			bus_width = ahc->msg_buf[3];
2124 			if ((scb->flags & (SCB_MSGOUT_WDTR|SCB_MSGOUT_SENT))
2125 			 == (SCB_MSGOUT_WDTR|SCB_MSGOUT_SENT)) {
2126 				/*
2127 				 * Don't send a WDTR back to the
2128 				 * target, since we asked first.
2129 				 */
2130 				switch (bus_width){
2131 				default:
2132 					/*
2133 					 * How can we do anything greater
2134 					 * than 16bit transfers on a 16bit
2135 					 * bus?
2136 					 */
2137 					reject = TRUE;
2138 					printf("%s: target %d requested %dBit "
2139 					       "transfers.  Rejecting...\n",
2140 					       ahc_name(ahc), devinfo->target,
2141 					       8 * (0x01 << bus_width));
2142 					/* FALLTHROUGH */
2143 				case MSG_EXT_WDTR_BUS_8_BIT:
2144 					bus_width = MSG_EXT_WDTR_BUS_8_BIT;
2145 					break;
2146 				case MSG_EXT_WDTR_BUS_16_BIT:
2147 					break;
2148 				}
2149 				scb->flags &= ~SCB_MSGOUT_WDTR;
2150 				ahc->wdtrpending &= ~devinfo->target_mask;
2151 			} else {
2152 				/*
2153 				 * Send our own WDTR in reply
2154 				 */
2155 				printf("Sending WDTR!\n");
2156 				scb->flags &= ~SCB_MSGOUT_BITS;
2157 				scb->flags |= SCB_MSGOUT_WDTR;
2158 				switch (bus_width) {
2159 				default:
2160 					if (ahc->features & AHC_WIDE) {
2161 						/* Respond Wide */
2162 						bus_width =
2163 						    MSG_EXT_WDTR_BUS_16_BIT;
2164 						break;
2165 					}
2166 					/* FALLTHROUGH */
2167 				case MSG_EXT_WDTR_BUS_8_BIT:
2168 					bus_width = MSG_EXT_WDTR_BUS_8_BIT;
2169 					break;
2170 				}
2171 				ahc_outb(ahc, MSG_OUT, HOST_MSG);
2172 				ahc_outb(ahc, SCSISIGO,
2173 					 ahc_inb(ahc, SCSISIGO) | ATNO);
2174 				ahc->wdtrpending |= devinfo->target_mask;
2175 			}
2176 			ahc_set_width(ahc, devinfo, scb->ccb->ccb_h.path,
2177 				      bus_width,
2178 				      AHC_TRANS_ACTIVE|AHC_TRANS_GOAL);
2179 
2180 			/* After a wide message, we are async */
2181 			ahc_set_syncrate(ahc, devinfo, scb->ccb->ccb_h.path,
2182 					 /*syncrate*/NULL, /*period*/0,
2183 					 /*offset*/0, AHC_TRANS_ACTIVE);
2184 			if ((ahc->wdtrpending & devinfo->target_mask) == 0
2185 			 && (reject == 0)) {
2186 				struct ahc_target_tinfo *tinfo;
2187 
2188 				scb->flags &= ~SCB_MSGOUT_WDTR;
2189 				tinfo = &ahc->transinfo[devinfo->target_offset];
2190 				if (tinfo->goal.period) {
2191 					/* Start the sync negotiation */
2192 					ahc->sdtrpending |=
2193 					    devinfo->target_mask;
2194 					scb->flags |= SCB_MSGOUT_SDTR;
2195 					ahc_outb(ahc, MSG_OUT, HOST_MSG);
2196 					ahc_outb(ahc, SCSISIGO,
2197 						 ahc_inb(ahc, SCSISIGO) | ATNO);
2198 				}
2199 			}
2200 			done = TRUE;
2201 			break;
2202 		}
2203 		default:
2204 			/* Unknown extended message.  Reject it. */
2205 			reject = TRUE;
2206 			break;
2207 		}
2208 	}
2209 
2210 	if (reject) {
2211 		/*
2212 		 * Assert attention and setup to
2213 		 * reject the message.
2214 		 */
2215 		ahc_outb(ahc, MSG_OUT, MSG_MESSAGE_REJECT);
2216 		ahc_outb(ahc, SCSISIGO, ahc_inb(ahc, SCSISIGO) | ATNO);
2217 		done = TRUE;
2218 	}
2219 	return (done);
2220 }
2221 
2222 static void
2223 ahc_handle_devreset(struct ahc_softc *ahc, int target, char channel,
2224 		    cam_status status, ac_code acode, char *message,
2225 		    int verbose_only)
2226 {
2227 	struct ahc_devinfo devinfo;
2228 	struct cam_path *path;
2229 	path_id_t path_id;
2230 	u_int16_t targ_mask;
2231 	u_int8_t targ_scsirate;
2232 	int scratch_offset = target;
2233 	int found;
2234 	int error;
2235 
2236 	ahc_compile_devinfo(&devinfo, target, channel);
2237 
2238 	if (channel == 'B')
2239 		path_id = cam_sim_path(ahc->sim_b);
2240 	else
2241 		path_id = cam_sim_path(ahc->sim);
2242 
2243 	error = xpt_create_path(&path, /*periph*/NULL, path_id, target,
2244 				CAM_LUN_WILDCARD);
2245 	/*
2246 	 * Go back to async/narrow transfers and renegotiate.
2247 	 */
2248 	if (error == CAM_REQ_CMP) {
2249 		ahc_set_width(ahc, &devinfo, path, MSG_EXT_WDTR_BUS_8_BIT,
2250 			      AHC_TRANS_CUR);
2251 		ahc_set_syncrate(ahc, &devinfo, path, /*syncrate*/NULL,
2252 				 /*period*/0, /*offset*/0, AHC_TRANS_CUR);
2253 	}
2254 	found = ahc_abort_scbs(ahc, target, channel, ALL_LUNS,
2255 			       SCB_LIST_NULL, status);
2256 
2257 	if (error == CAM_REQ_CMP && acode != 0)
2258 		xpt_async(AC_SENT_BDR, path, NULL);
2259 
2260 	if (error == CAM_REQ_CMP)
2261 		xpt_free_path(path);
2262 
2263 	if (message != NULL
2264 	 && (verbose_only == 0 || bootverbose != 0))
2265 		printf("%s: %s on %c:%d. %d SCBs aborted\n", ahc_name(ahc),
2266 		       message, channel, target, found);
2267 }
2268 /*
2269  * We have an scb which has been processed by the
2270  * adaptor, now we look to see how the operation
2271  * went.
2272  */
2273 static void
2274 ahc_done(struct ahc_softc *ahc, struct scb *scb)
2275 {
2276 	union ccb *ccb;
2277 
2278 	CAM_DEBUG(scb->ccb->ccb_h.path, CAM_DEBUG_TRACE,
2279 		  ("ahc_done - scb %d\n", scb->hscb->tag));
2280 
2281 	ccb = scb->ccb;
2282 	LIST_REMOVE(&ccb->ccb_h, sim_links.le);
2283 
2284 	untimeout(ahc_timeout, (caddr_t)scb, ccb->ccb_h.timeout_ch);
2285 
2286 	if ((ccb->ccb_h.flags & CAM_DIR_MASK) != CAM_DIR_NONE) {
2287 		bus_dmasync_op_t op;
2288 
2289 		if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN)
2290 			op = BUS_DMASYNC_POSTREAD;
2291 		else
2292 			op = BUS_DMASYNC_POSTWRITE;
2293 		bus_dmamap_sync(ahc->dmat, scb->dmamap, op);
2294 		bus_dmamap_unload(ahc->dmat, scb->dmamap);
2295 	}
2296 
2297 	/*
2298 	 * Unbusy this target/channel/lun.
2299 	 * XXX if we are holding two commands per lun,
2300 	 *     send the next command.
2301 	 */
2302 	ahc_index_busy_tcl(ahc, scb->hscb->tcl, /*unbusy*/TRUE);
2303 
2304 	if (ccb->ccb_h.func_code == XPT_CONT_TARGET_IO) {
2305 		xpt_print_path(ccb->ccb_h.path);
2306 		printf("CONT_TARGET_IO complete\n");
2307 		ccb->ccb_h.status = CAM_REQ_CMP;
2308 		ahc_free_scb(ahc, scb);
2309 		xpt_done(ccb);
2310 		return;
2311 	}
2312 
2313 	/*
2314 	 * If the recovery SCB completes, we have to be
2315 	 * out of our timeout.
2316 	 */
2317 	if ((scb->flags & SCB_RECOVERY_SCB) != 0) {
2318 
2319 		struct	ccb_hdr *ccbh;
2320 
2321 		/*
2322 		 * We were able to complete the command successfully,
2323 		 * so reinstate the timeouts for all other pending
2324 		 * commands.
2325 		 */
2326 		ccbh = ahc->pending_ccbs.lh_first;
2327 		while (ccbh != NULL) {
2328 			struct scb *pending_scb;
2329 
2330 			pending_scb = (struct scb *)ccbh->ccb_scb_ptr;
2331 			ccbh->timeout_ch =
2332 			    timeout(ahc_timeout, pending_scb,
2333 				    (ccbh->timeout * hz)/1000);
2334 			ccbh = LIST_NEXT(ccbh, sim_links.le);
2335 		}
2336 
2337 		/*
2338 		 * Ensure that we didn't put a second instance of this
2339 		 * SCB into the QINFIFO.
2340 		 */
2341 		ahc_search_qinfifo(ahc, SCB_TARGET(scb), SCB_CHANNEL(scb),
2342 				   SCB_LUN(scb), scb->hscb->tag, /*status*/0,
2343 				   SEARCH_REMOVE);
2344 		if (ahc_ccb_status(ccb) == CAM_BDR_SENT)
2345 			ahc_set_ccb_status(ccb, CAM_CMD_TIMEOUT);
2346 		xpt_print_path(ccb->ccb_h.path);
2347 		printf("no longer in timeout, status = %x\n",
2348 		       ccb->ccb_h.status);
2349 	}
2350 
2351 	if ((scb->flags & (SCB_MSGOUT_WDTR|SCB_MSGOUT_SDTR)) != 0) {
2352 		/*
2353 		 * Turn off the pending flags for any DTR messages
2354 		 * regardless of whether they completed successfully
2355 		 * or not.  This ensures that we don't have lingering
2356 		 * state after we abort an SCB.
2357 		 */
2358 		u_int16_t mask;
2359 
2360 		mask = (0x01 <<	(SCB_TARGET(scb)
2361 				 | (SCB_IS_SCSIBUS_B(scb) ? SELBUSB : 0)));
2362 		if (scb->flags & SCB_MSGOUT_WDTR)
2363 			ahc->wdtrpending &= ~mask;
2364 		if (scb->flags & SCB_MSGOUT_SDTR)
2365 			ahc->sdtrpending &= ~mask;
2366 	}
2367 	/* Don't clobber any existing error state */
2368 	if (ahc_ccb_status(ccb) == CAM_REQ_INPROG) {
2369 		ccb->ccb_h.status |= CAM_REQ_CMP;
2370 	} else if ((scb->flags & SCB_SENSE) != 0) {
2371 		/* We performed autosense retrieval */
2372 		scb->ccb->ccb_h.status |= CAM_AUTOSNS_VALID;
2373 	}
2374 	ccb->ccb_h.status &= ~CAM_SIM_QUEUED;
2375 	ahc_free_scb(ahc, scb);
2376 	xpt_done(ccb);
2377 }
2378 
2379 /*
2380  * Determine the number of SCBs available on the controller
2381  */
2382 int
2383 ahc_probe_scbs(struct ahc_softc *ahc) {
2384 	int i;
2385 
2386 	for (i = 0; i < AHC_SCB_MAX; i++) {
2387 		ahc_outb(ahc, SCBPTR, i);
2388 		ahc_outb(ahc, SCB_CONTROL, i);
2389 		if (ahc_inb(ahc, SCB_CONTROL) != i)
2390 			break;
2391 		ahc_outb(ahc, SCBPTR, 0);
2392 		if (ahc_inb(ahc, SCB_CONTROL) != 0)
2393 			break;
2394 	}
2395 
2396 	return (i);
2397 }
2398 
2399 /*
2400  * Start the board, ready for normal operation
2401  */
2402 int
2403 ahc_init(struct ahc_softc *ahc)
2404 {
2405 	int       max_targ = 15;
2406 	int	  i;
2407 	int	  term;
2408 	u_int8_t  scsi_conf, sxfrctl1;
2409 
2410 #ifdef AHC_PRINT_SRAM
2411 	printf("Scratch Ram:");
2412 	for (i = 0x20; i < 0x5f; i++) {
2413 		if (((i % 8) == 0) && (i != 0)) {
2414 			printf ("\n              ");
2415 		}
2416 		printf (" 0x%x", ahc_inb(ahc, i));
2417 	}
2418 	if ((ahc->features & AHC_MORE_SRAM) != 0) {
2419 		for (i = 0x70; i < 0x7f; i++) {
2420 			if (((i % 8) == 0) && (i != 0)) {
2421 				printf ("\n              ");
2422 			}
2423 			printf (" 0x%x", ahc_inb(ahc, i));
2424 		}
2425 	}
2426 	printf ("\n");
2427 #endif
2428 
2429 	/*
2430 	 * Assume we have a board at this stage and it has been reset.
2431 	 */
2432 	if ((ahc->flags & AHC_USEDEFAULTS) != 0) {
2433 		ahc->our_id = ahc->our_id_b = 7;
2434 	}
2435 
2436 	/*
2437 	 * XXX Would be better to use a per device flag, but PCI and EISA
2438 	 *     devices don't have them yet.
2439 	 */
2440 	if ((AHC_TMODE_ENABLE & (0x01 << ahc->unit)) != 0)
2441 		ahc->flags |= AHC_TARGETMODE;
2442 
2443 	if ((ahc->features & AHC_TWIN) != 0) {
2444  		printf("Twin Channel, A SCSI Id=%d, B SCSI Id=%d, ",
2445 		       ahc->our_id, ahc->our_id_b);
2446 	} else {
2447 		if ((ahc->features & AHC_WIDE) != 0) {
2448 			printf("Wide ");
2449 		} else {
2450 			printf("Single ");
2451 		}
2452 		printf("Channel %c, SCSI Id=%d, ", ahc->channel, ahc->our_id);
2453 	}
2454 
2455 	ahc_outb(ahc, SEQ_FLAGS, 0);
2456 
2457 	/* Determine the number of SCBs and initialize them */
2458 
2459 	if (ahc->scb_data->maxhscbs == 0) {
2460 		ahc->scb_data->maxhscbs = ahc_probe_scbs(ahc);
2461 		/* SCB 0 heads the free list */
2462 		ahc_outb(ahc, FREE_SCBH, 0);
2463 		for (i = 0; i < ahc->scb_data->maxhscbs; i++) {
2464 			ahc_outb(ahc, SCBPTR, i);
2465 
2466 			/* Clear the control byte. */
2467 			ahc_outb(ahc, SCB_CONTROL, 0);
2468 
2469 			/* Set the next pointer */
2470 			ahc_outb(ahc, SCB_NEXT, i+1);
2471 
2472 			/* Make the tag number invalid */
2473 			ahc_outb(ahc, SCB_TAG, SCB_LIST_NULL);
2474 		}
2475 
2476 		/* Make that the last SCB terminates the free list */
2477 		ahc_outb(ahc, SCBPTR, i-1);
2478 		ahc_outb(ahc, SCB_NEXT, SCB_LIST_NULL);
2479 
2480 		/* Ensure we clear the 0 SCB's control byte. */
2481 		ahc_outb(ahc, SCBPTR, 0);
2482 		ahc_outb(ahc, SCB_CONTROL, 0);
2483 
2484 		ahc->scb_data->maxhscbs = i;
2485 	}
2486 
2487 	if (ahc->scb_data->maxhscbs == 0)
2488 		panic("%s: No SCB space found", ahc_name(ahc));
2489 
2490 	if (ahc->scb_data->maxhscbs < AHC_SCB_MAX) {
2491 		ahc->flags |= AHC_PAGESCBS;
2492 		ahc->scb_data->maxscbs = AHC_SCB_MAX;
2493 		if ((ahc->flags & AHC_TARGETMODE) != 0) {
2494 			/* Steal one slot for TMODE commands */
2495 			ahc->scb_data->maxscbs--;
2496 		}
2497 		printf("%d/%d SCBs\n", ahc->scb_data->maxhscbs,
2498 		       ahc->scb_data->maxscbs);
2499 	} else {
2500 		ahc->scb_data->maxscbs = ahc->scb_data->maxhscbs;
2501 		if ((ahc->flags & AHC_TARGETMODE) != 0) {
2502 			/* Steal one slot for TMODE commands */
2503 			ahc->scb_data->maxscbs--;
2504 		}
2505 		ahc->flags &= ~AHC_PAGESCBS;
2506 		printf("%d SCBs\n", ahc->scb_data->maxhscbs);
2507 	}
2508 
2509 #ifdef AHC_DEBUG
2510 	if (ahc_debug & AHC_SHOWMISC) {
2511 		printf("%s: hardware scb %d bytes; kernel scb %d bytes; "
2512 		       "ahc_dma %d bytes\n",
2513 			ahc_name(ahc),
2514 		        sizeof(struct hardware_scb),
2515 			sizeof(struct scb),
2516 			sizeof(struct ahc_dma_seg));
2517 	}
2518 #endif /* AHC_DEBUG */
2519 
2520 	/* Set the SCSI Id, SXFRCTL0, SXFRCTL1, and SIMODE1, for both channels*/
2521 	if (ahc->features & AHC_TWIN) {
2522 
2523 		/*
2524 		 * The device is gated to channel B after a chip reset,
2525 		 * so set those values first
2526 		 */
2527 		term = (ahc->flags & AHC_TERM_ENB_B) != 0 ? STPWEN : 0;
2528 		if ((ahc->features & AHC_ULTRA2) != 0)
2529 			ahc_outb(ahc, SCSIID_ULTRA2, ahc->our_id_b);
2530 		else
2531 			ahc_outb(ahc, SCSIID, ahc->our_id_b);
2532 		scsi_conf = ahc_inb(ahc, SCSICONF + 1);
2533 		sxfrctl1 = ahc_inb(ahc, SXFRCTL1);
2534 		ahc_outb(ahc, SXFRCTL1, (scsi_conf & (ENSPCHK|STIMESEL))
2535 					|term
2536 					|ENSTIMER|ACTNEGEN);
2537 		ahc_outb(ahc, SIMODE1, ENSELTIMO|ENSCSIRST|ENSCSIPERR);
2538 		ahc_outb(ahc, SXFRCTL0, DFON|SPIOEN);
2539 
2540 		if (scsi_conf & RESET_SCSI) {
2541 			/* Reset the bus */
2542 			if (bootverbose)
2543 				printf("%s: Resetting Channel B\n",
2544 				       ahc_name(ahc));
2545 			ahc_reset_current_bus(ahc);
2546 		}
2547 
2548 		/* Select Channel A */
2549 		ahc_outb(ahc, SBLKCTL, ahc_inb(ahc, SBLKCTL) & ~SELBUSB);
2550 	}
2551 	term = (ahc->flags & AHC_TERM_ENB_A) != 0 ? STPWEN : 0;
2552 	if ((ahc->features & AHC_ULTRA2) != 0)
2553 		ahc_outb(ahc, SCSIID_ULTRA2, ahc->our_id);
2554 	else
2555 		ahc_outb(ahc, SCSIID, ahc->our_id);
2556 	scsi_conf = ahc_inb(ahc, SCSICONF);
2557 	sxfrctl1 = ahc_inb(ahc, SXFRCTL1);
2558 	ahc_outb(ahc, SXFRCTL1, (scsi_conf & (ENSPCHK|STIMESEL))
2559 				|term
2560 				|ENSTIMER|ACTNEGEN);
2561 	ahc_outb(ahc, SIMODE1, ENSELTIMO|ENSCSIRST|ENSCSIPERR);
2562 	ahc_outb(ahc, SXFRCTL0, DFON|SPIOEN);
2563 
2564 	if ((ahc->features & AHC_ULTRA2) != 0) {
2565 		/* Wait for our transceiver status to settle */
2566 		i = 1000000;
2567 		while (--i && ((ahc_inb(ahc, SBLKCTL) & (ENAB40|ENAB20)) == 0))
2568 			DELAY(100);
2569 
2570 		if (i == 0)
2571 			panic("%s: Transceiver state never settled\n",
2572 			      ahc_name(ahc));
2573 	}
2574 
2575 	if (scsi_conf & RESET_SCSI) {
2576 		/* Reset the bus */
2577 		if (bootverbose)
2578 			printf("%s: Resetting Channel %c\n", ahc_name(ahc),
2579 			       ahc->channel);
2580 
2581 		ahc_reset_current_bus(ahc);
2582 	}
2583 
2584 	/*
2585 	 * Look at the information that board initialization or
2586 	 * the board bios has left us.  In the lower four bits of each
2587 	 * target's scratch space any value other than 0 indicates
2588 	 * that we should initiate synchronous transfers.  If it's zero,
2589 	 * the user or the BIOS has decided to disable synchronous
2590 	 * negotiation to that target so we don't activate the needsdtr
2591 	 * flag.
2592 	 */
2593 	ahc->ultraenb = 0;
2594 	ahc->tagenable = ALL_TARGETS;
2595 
2596 	/* Grab the disconnection disable table and invert it for our needs */
2597 	if (ahc->flags & AHC_USEDEFAULTS) {
2598 		printf("%s: Host Adapter Bios disabled.  Using default SCSI "
2599 			"device parameters\n", ahc_name(ahc));
2600 		ahc->flags |= AHC_EXTENDED_TRANS_A|AHC_EXTENDED_TRANS_B;
2601 		ahc->discenable = ALL_TARGETS;
2602 		if ((ahc->features & AHC_ULTRA) != 0)
2603 			ahc->ultraenb = 0xffff;
2604 	} else {
2605 		ahc->discenable = ~((ahc_inb(ahc, DISC_DSB + 1) << 8)
2606 				   | ahc_inb(ahc, DISC_DSB));
2607 		if ((ahc->features & (AHC_ULTRA|AHC_ULTRA2)) != 0)
2608 			ahc->ultraenb = (ahc_inb(ahc, ULTRA_ENB + 1) << 8)
2609 				      | ahc_inb(ahc, ULTRA_ENB);
2610 	}
2611 
2612 	if ((ahc->features & (AHC_WIDE|AHC_TWIN)) == 0)
2613 		max_targ = 7;
2614 
2615 	for (i = 0; i <= max_targ; i++) {
2616 		struct ahc_target_tinfo *transinfo;
2617 
2618 		transinfo = &ahc->transinfo[i];
2619 		/* Default to async narrow across the board */
2620 		bzero(transinfo, sizeof(*transinfo));
2621 		if (ahc->flags & AHC_USEDEFAULTS) {
2622 			if ((ahc->features & AHC_WIDE) != 0)
2623 				transinfo->user.width = MSG_EXT_WDTR_BUS_16_BIT;
2624 
2625 			/*
2626 			 * These will be truncated when we determine the
2627 			 * connection type we have with the target.
2628 			 */
2629 			transinfo->user.period = ahc_syncrates->period;
2630 			transinfo->user.offset = ~0;
2631 		} else {
2632 			u_int scsirate;
2633 			u_int16_t mask;
2634 
2635 			/* Take the settings leftover in scratch RAM. */
2636 			scsirate = ahc_inb(ahc, TARG_SCSIRATE + i);
2637 			mask = (0x01 << i);
2638 			if ((ahc->features & AHC_ULTRA2) != 0) {
2639 				u_int offset;
2640 
2641 				if ((scsirate & SOFS) == 0x0F) {
2642 					/*
2643 					 * Haven't negotiated yet,
2644 					 * so the format is different.
2645 					 */
2646 					scsirate = (scsirate & SXFR) >> 4
2647 						 | (ahc->ultraenb & mask)
2648 						  ? 0x18 : 0x10
2649 						 | (scsirate & WIDEXFER);
2650 					offset = MAX_OFFSET_ULTRA2;
2651 				} else
2652 					offset = ahc_inb(ahc, TARG_OFFSET + i);
2653 				ahc_find_period(ahc, scsirate,
2654 						AHC_SYNCRATE_ULTRA2);
2655 				if (offset == 0)
2656 					transinfo->user.period = 0;
2657 				else
2658 					transinfo->user.offset = ~0;
2659 			} else if ((scsirate & SOFS) != 0) {
2660 				transinfo->user.period =
2661 				    ahc_find_period(ahc, scsirate,
2662 						    (ahc->ultraenb & mask)
2663 						   ? AHC_SYNCRATE_ULTRA
2664 						   : AHC_SYNCRATE_FAST);
2665 				if ((scsirate & SOFS) != 0
2666 				 && transinfo->user.period != 0) {
2667 					transinfo->user.offset = ~0;
2668 				}
2669 			}
2670 			if ((scsirate & WIDEXFER) != 0
2671 			 && (ahc->features & AHC_WIDE) != 0) {
2672 				transinfo->user.width = MSG_EXT_WDTR_BUS_16_BIT;
2673 			}
2674 
2675 		}
2676 	}
2677 	ahc->sdtrpending = 0;
2678 	ahc->wdtrpending = 0;
2679 
2680 #ifdef AHC_DEBUG
2681 	if (ahc_debug & AHC_SHOWMISC)
2682 		printf("NEEDSDTR == 0x%x\nNEEDWDTR == 0x%x\n"
2683 		       "DISCENABLE == 0x%x\nULTRAENB == 0x%x\n",
2684 		       ahc->needsdtr_orig, ahc->needwdtr_orig,
2685 		       ahc->discenable, ahc->ultraenb);
2686 #endif
2687 	/*
2688 	 * Allocate enough "hardware scbs" to handle
2689 	 * the maximum number of concurrent transactions
2690 	 * we can have active.  We have to use contigmalloc
2691 	 * if this array crosses a page boundary since the
2692 	 * sequencer depends on this array being physically
2693 	 * contiguous.
2694 	 */
2695 	if (ahc->scb_data->hscbs == NULL) {
2696 		size_t array_size;
2697 
2698 		array_size = ahc->scb_data->maxscbs*sizeof(struct hardware_scb);
2699 		if (array_size > PAGE_SIZE) {
2700 			ahc->scb_data->hscbs = (struct hardware_scb *)
2701 					contigmalloc(array_size, M_DEVBUF,
2702 						     M_NOWAIT, 0ul, 0xffffffff,
2703 						     PAGE_SIZE, 0x10000);
2704 		} else {
2705 			ahc->scb_data->hscbs = (struct hardware_scb *)
2706 				     malloc(array_size, M_DEVBUF, M_NOWAIT);
2707 		}
2708 
2709 		if (ahc->scb_data->hscbs == NULL) {
2710 			printf("%s: unable to allocate hardware SCB array.  "
2711 			       "Failing attach\n", ahc_name(ahc));
2712 			return (-1);
2713 		}
2714 		/* At least the control byte of each hscb needs to be zeroed */
2715 		bzero(ahc->scb_data->hscbs, array_size);
2716 	}
2717 
2718 	if ((ahc->flags & AHC_TARGETMODE) != 0) {
2719 		size_t array_size;
2720 
2721 		ahc->num_targetcmds = 32;
2722 		array_size = ahc->num_targetcmds * sizeof(struct target_cmd);
2723 		ahc->targetcmds = malloc(array_size, M_DEVBUF, M_NOWAIT);
2724 
2725 		if (ahc->targetcmds == NULL) {
2726 			printf("%s: unable to allocate targetcmd array.  "
2727 			       "Failing attach\n", ahc_name(ahc));
2728 			return (-1);
2729 		}
2730 
2731 		bzero(ahc->targetcmds, array_size);
2732 		ahc_outb(ahc, TMODE_CMDADDR_NEXT, 0);
2733 	}
2734 
2735 	/*
2736 	 * Tell the sequencer where it can find the our arrays in memory.
2737 	 */
2738 	{
2739 		u_int32_t physaddr;
2740 
2741 		/* Tell the sequencer where it can find the hscb array. */
2742 		physaddr = vtophys(ahc->scb_data->hscbs);
2743 		ahc_outb(ahc, HSCB_ADDR, physaddr & 0xFF);
2744 		ahc_outb(ahc, HSCB_ADDR + 1, (physaddr >> 8) & 0xFF);
2745 		ahc_outb(ahc, HSCB_ADDR + 2, (physaddr >> 16) & 0xFF);
2746 		ahc_outb(ahc, HSCB_ADDR + 3, (physaddr >> 24) & 0xFF);
2747 		ahc->hscb_busaddr = physaddr;
2748 
2749 		physaddr = vtophys(ahc->qoutfifo);
2750 		ahc_outb(ahc, SCBID_ADDR, physaddr & 0xFF);
2751 		ahc_outb(ahc, SCBID_ADDR + 1, (physaddr >> 8) & 0xFF);
2752 		ahc_outb(ahc, SCBID_ADDR + 2, (physaddr >> 16) & 0xFF);
2753 		ahc_outb(ahc, SCBID_ADDR + 3, (physaddr >> 24) & 0xFF);
2754 
2755 		if ((ahc->flags & AHC_TARGETMODE) != 0) {
2756 			physaddr = vtophys(ahc->targetcmds);
2757 			ahc_outb(ahc, TMODE_CMDADDR, physaddr & 0xFF);
2758 			ahc_outb(ahc, TMODE_CMDADDR + 1,
2759 				 (physaddr >> 8) & 0xFF);
2760 			ahc_outb(ahc, TMODE_CMDADDR + 2,
2761 				 (physaddr >> 16) & 0xFF);
2762 			ahc_outb(ahc, TMODE_CMDADDR + 3,
2763 				 (physaddr >> 24) & 0xFF);
2764 
2765 			ahc_outb(ahc, CMDSIZE_TABLE, 5);
2766 			ahc_outb(ahc, CMDSIZE_TABLE + 1, 9);
2767 			ahc_outb(ahc, CMDSIZE_TABLE + 2, 9);
2768 			ahc_outb(ahc, CMDSIZE_TABLE + 3, 0);
2769 			ahc_outb(ahc, CMDSIZE_TABLE + 4, 15);
2770 			ahc_outb(ahc, CMDSIZE_TABLE + 5, 11);
2771 			ahc_outb(ahc, CMDSIZE_TABLE + 6, 0);
2772 			ahc_outb(ahc, CMDSIZE_TABLE + 7, 0);
2773 		}
2774 
2775 		/* There are no untagged SCBs active yet. */
2776 		for (i = 0; i < sizeof(ahc->untagged_scbs); i++) {
2777 			ahc->untagged_scbs[i] = SCB_LIST_NULL;
2778 		}
2779 		for (i = 0; i < sizeof(ahc->qoutfifo); i++) {
2780 			ahc->qoutfifo[i] = SCB_LIST_NULL;
2781 		}
2782 	}
2783 
2784 	/* Our Q FIFOs are empty. */
2785 	ahc_outb(ahc, KERNEL_QINPOS, 0);
2786 	ahc_outb(ahc, QINPOS, 0);
2787 	ahc_outb(ahc, QOUTPOS, 0);
2788 
2789 	/*
2790 	 * Use the built in queue management registers
2791 	 * if they are available.
2792 	 */
2793 	if ((ahc->features & AHC_QUEUE_REGS) != 0) {
2794 		ahc_outb(ahc, QOFF_CTLSTA, SCB_QSIZE_256);
2795 		ahc_outb(ahc, SDSCB_QOFF, 0);
2796 		ahc_outb(ahc, SNSCB_QOFF, 0);
2797 		ahc_outb(ahc, HNSCB_QOFF, 0);
2798 	}
2799 
2800 
2801 	/* We don't have any waiting selections */
2802 	ahc_outb(ahc, WAITING_SCBH, SCB_LIST_NULL);
2803 
2804 	/* Our disconnection list is empty too */
2805 	ahc_outb(ahc, DISCONNECTED_SCBH, SCB_LIST_NULL);
2806 
2807 	/* Message out buffer starts empty */
2808 	ahc_outb(ahc, MSG_OUT, MSG_NOOP);
2809 
2810 	/*
2811 	 * Load the Sequencer program and Enable the adapter
2812 	 * in "fast" mode.
2813          */
2814 	if (bootverbose)
2815 		printf("%s: Downloading Sequencer Program...",
2816 		       ahc_name(ahc));
2817 
2818 	ahc_loadseq(ahc);
2819 
2820 	/* We have to wait until after any system dumps... */
2821 	at_shutdown(ahc_shutdown, ahc, SHUTDOWN_FINAL);
2822 
2823 	return (0);
2824 }
2825 
2826 static void
2827 ahcminphys(struct buf *bp)
2828 {
2829 /*
2830  * Even though the card can transfer up to 16megs per command
2831  * we are limited by the number of segments in the dma segment
2832  * list that we can hold.  The worst case is that all pages are
2833  * discontinuous physically, hense the "page per segment" limit
2834  * enforced here.
2835  */
2836         if (bp->b_bcount > ((AHC_NSEG - 1) * PAGE_SIZE)) {
2837                 bp->b_bcount = ((AHC_NSEG - 1) * PAGE_SIZE);
2838         }
2839 }
2840 
2841 static cam_status
2842 ahc_find_tmode_devs(struct ahc_softc *ahc, struct cam_sim *sim, union ccb *ccb,
2843 		    struct tmode_tstate **tstate, struct tmode_lstate **lstate,
2844 		    int notfound_failure)
2845 {
2846 	int our_id;
2847 
2848 	/*
2849 	 * If we are not configured for target mode, someone
2850 	 * is really confused to be sending this to us.
2851 	 */
2852 	if ((ahc->flags & AHC_TARGETMODE) == 0)
2853 		return (CAM_REQ_INVALID);
2854 
2855 	/* Range check target and lun */
2856 	if (cam_sim_bus(sim) == 0)
2857 		our_id = ahc->our_id;
2858 	else
2859 		our_id = ahc->our_id_b;
2860 	if (ccb->ccb_h.target_id > ((ahc->features & AHC_WIDE) ? 15 : 7)
2861 	 || ((ahc->features & AHC_MULTI_TID) == 0
2862 	  && (ccb->ccb_h.target_id != our_id)))
2863 		return (CAM_TID_INVALID);
2864 
2865 	if (ccb->ccb_h.target_lun > 8)
2866 		return (CAM_LUN_INVALID);
2867 
2868 	*tstate = ahc->enabled_targets[ccb->ccb_h.target_id];
2869 	*lstate = NULL;
2870 	if (*tstate != NULL)
2871 		*lstate = (*tstate)->enabled_luns[ccb->ccb_h.target_lun];
2872 
2873 	if (notfound_failure != 0 && *lstate == NULL)
2874 		return (CAM_PATH_INVALID);
2875 
2876 	return (CAM_REQ_CMP);
2877 }
2878 
2879 static void
2880 ahc_action(struct cam_sim *sim, union ccb *ccb)
2881 {
2882 	struct	  ahc_softc *ahc;
2883 	struct	  tmode_lstate *lstate;
2884 	int	  target_id;
2885 	int	  s;
2886 
2887 	CAM_DEBUG(ccb->ccb_h.path, CAM_DEBUG_TRACE, ("ahc_action\n"));
2888 
2889 	ahc = (struct ahc_softc *)cam_sim_softc(sim);
2890 
2891 	target_id = ccb->ccb_h.target_id;
2892 
2893 	switch (ccb->ccb_h.func_code) {
2894 	/* Common cases first */
2895 	case XPT_ACCEPT_TARGET_IO:	/* Accept Host Target Mode CDB */
2896 	case XPT_CONT_TARGET_IO:/* Continue Host Target I/O Connection*/
2897 	{
2898 		struct	   tmode_tstate *tstate;
2899 		cam_status status;
2900 
2901 		status = ahc_find_tmode_devs(ahc, sim, ccb, &tstate,
2902 					     &lstate, TRUE);
2903 
2904 		if (status != CAM_REQ_CMP) {
2905 			ccb->ccb_h.status = status;
2906 			xpt_done(ccb);
2907 			break;
2908 		}
2909 		if (ccb->ccb_h.func_code == XPT_ACCEPT_TARGET_IO) {
2910 			SLIST_INSERT_HEAD(&lstate->accept_tios, &ccb->ccb_h,
2911 					  sim_links.sle);
2912 			ccb->ccb_h.status = CAM_REQ_INPROG;
2913 			break;
2914 		}
2915 
2916 		/*
2917 		 * The target_id represents the target we attempt to
2918 		 * select.  In target mode, this is the initiator of
2919 		 * the original command.
2920 		 */
2921 		target_id = ccb->csio.init_id;
2922 		xpt_print_path(ccb->ccb_h.path);
2923 		printf("Sending a continue TIO\n");
2924 		/* FALLTHROUGH */
2925 	}
2926 	case XPT_SCSI_IO:	/* Execute the requested I/O operation */
2927 	case XPT_RESET_DEV:	/* Bus Device Reset the specified SCSI device */
2928 	{
2929 		struct	   scb *scb;
2930 		struct	   hardware_scb *hscb;
2931 		struct	   ahc_target_tinfo *tinfo;
2932 		u_int16_t  mask;
2933 
2934 		/*
2935 		 * get an scb to use.
2936 		 */
2937 		if ((scb = ahc_get_scb(ahc)) == NULL) {
2938 			int s;
2939 
2940 			s = splcam();
2941 			ahc->flags |= AHC_RESOURCE_SHORTAGE;
2942 			splx(s);
2943 			xpt_freeze_simq(ahc->sim, /*count*/1);
2944 			ahc_set_ccb_status(ccb, CAM_REQUEUE_REQ);
2945 			xpt_done(ccb);
2946 			return;
2947 		}
2948 
2949 		hscb = scb->hscb;
2950 
2951 		CAM_DEBUG(ccb->ccb_h.path, CAM_DEBUG_SUBTRACE,
2952 			  ("start scb(%p)\n", scb));
2953 		scb->ccb = ccb;
2954 		/*
2955 		 * So we can find the SCB when an abort is requested
2956 		 */
2957 		ccb->ccb_h.ccb_scb_ptr = scb;
2958 		ccb->ccb_h.ccb_ahc_ptr = ahc;
2959 
2960 		/*
2961 		 * Put all the arguments for the xfer in the scb
2962 		 */
2963 		hscb->tcl = ((target_id << 4) & 0xF0)
2964 			| (SIM_IS_SCSIBUS_B(ahc, sim) ? SELBUSB : 0)
2965 			| (ccb->ccb_h.target_lun & 0x07);
2966 
2967 		mask = SCB_TARGET_MASK(scb);
2968 		tinfo = &ahc->transinfo[SCB_TARGET_OFFSET(scb)];
2969 
2970 		hscb->scsirate = tinfo->scsirate;
2971 		hscb->scsioffset = tinfo->current.offset;
2972 		if ((ahc->ultraenb & mask) != 0)
2973 			hscb->control |= ULTRAENB;
2974 
2975 		if ((ahc->discenable & mask) != 0
2976 		 && (ccb->ccb_h.flags & CAM_DIS_DISCONNECT) == 0)
2977 			hscb->control |= DISCENB;
2978 
2979 		if (ccb->ccb_h.func_code == XPT_RESET_DEV) {
2980 			hscb->cmdpointer = NULL;
2981 			scb->flags |= SCB_DEVICE_RESET;
2982 			hscb->control |= MK_MESSAGE;
2983 			ahc_execute_scb(scb, NULL, 0, 0);
2984 		} else {
2985 			if (ccb->ccb_h.func_code == XPT_SCSI_IO) {
2986 				if (tinfo->current.width != tinfo->goal.width) {
2987 					if ((ahc->wdtrpending & mask) == 0) {
2988 						ahc->wdtrpending |= mask;
2989 						hscb->control |= MK_MESSAGE;
2990 						scb->flags |= SCB_MSGOUT_WDTR;
2991 					}
2992 				} else if ((tinfo->current.period
2993 					 != tinfo->goal.period)
2994 					&& (ahc->sdtrpending & mask) == 0) {
2995 					ahc->sdtrpending |= mask;
2996 					hscb->control |= MK_MESSAGE;
2997 					scb->flags |= SCB_MSGOUT_SDTR;
2998 				}
2999 			} else {
3000 				if (ahc->pending_device == lstate) {
3001 					scb->flags |= SCB_TARGET_IMMEDIATE;
3002 					ahc->pending_device = NULL;
3003 				}
3004 				hscb->control |= TARGET_SCB;
3005 				hscb->cmdpointer = IDENTIFY_SEEN;
3006 				if ((ccb->ccb_h.flags & CAM_SEND_STATUS) != 0) {
3007 					hscb->cmdpointer |= SPHASE_PENDING;
3008 					hscb->status = ccb->csio.scsi_status;
3009 				}
3010 
3011 				/* Overloaded with tag ID */
3012 				hscb->cmdlen = ccb->csio.tag_id;
3013 				/*
3014 				 * Overloaded with our target ID to
3015 				 * use for reselection.
3016 				 */
3017 				hscb->next = ccb->ccb_h.target_id;
3018 			}
3019 			if (ccb->ccb_h.flags & CAM_TAG_ACTION_VALID)
3020 				hscb->control |= ccb->csio.tag_action;
3021 
3022 			ahc_setup_data(ahc, &ccb->csio, scb);
3023 		}
3024 		break;
3025 	}
3026 	case XPT_NOTIFY_ACK:
3027 	case XPT_IMMED_NOTIFY:
3028 	{
3029 		struct	   tmode_tstate *tstate;
3030 		struct	   tmode_lstate *lstate;
3031 		cam_status status;
3032 
3033 		status = ahc_find_tmode_devs(ahc, sim, ccb, &tstate,
3034 					     &lstate, TRUE);
3035 
3036 		if (status != CAM_REQ_CMP) {
3037 			ccb->ccb_h.status = status;
3038 			xpt_done(ccb);
3039 			break;
3040 		}
3041 		if (ccb->ccb_h.func_code == XPT_NOTIFY_ACK) {
3042 			/* Clear notification state */
3043 		}
3044 		SLIST_INSERT_HEAD(&lstate->immed_notifies, &ccb->ccb_h,
3045 				  sim_links.sle);
3046 		ccb->ccb_h.status = CAM_REQ_INPROG;
3047 		break;
3048 	}
3049 	case XPT_EN_LUN:		/* Enable LUN as a target */
3050 	{
3051 		struct	   tmode_tstate *tstate;
3052 		struct	   tmode_lstate *lstate;
3053 		struct	   ccb_en_lun *cel;
3054 		cam_status status;
3055 		int	   target;
3056 		int	   lun;
3057 
3058 		status = ahc_find_tmode_devs(ahc, sim, ccb, &tstate, &lstate,
3059 					     /* notfound_failure*/FALSE);
3060 
3061 		if (status != CAM_REQ_CMP) {
3062 			ccb->ccb_h.status = status;
3063 			xpt_done(ccb);
3064 			break;
3065 		}
3066 
3067 		cel = &ccb->cel;
3068 		target = ccb->ccb_h.target_id;
3069 		lun = ccb->ccb_h.target_lun;
3070 		if (cel->enable != 0) {
3071 			/* Are we already enabled?? */
3072 			if (lstate != NULL) {
3073 				ccb->ccb_h.status = CAM_LUN_ALRDY_ENA;
3074 				xpt_done(ccb);
3075 				break;
3076 			}
3077 
3078 			if (cel->grp6_len != 0
3079 			 || cel->grp7_len != 0) {
3080 				/*
3081 				 * Don't (yet?) support vendor
3082 				 * specific commands.
3083 				 */
3084 				ccb->ccb_h.status = CAM_REQ_INVALID;
3085 				xpt_done(ccb);
3086 				break;
3087 			}
3088 
3089 			/*
3090 			 * Seems to be okay.
3091 			 * Setup our data structures.
3092 			 */
3093 			if (tstate == NULL) {
3094 				tstate = malloc(sizeof(*tstate),
3095 						M_DEVBUF, M_NOWAIT);
3096 				if (tstate == NULL) {
3097 					ccb->ccb_h.status = CAM_RESRC_UNAVAIL;
3098 					xpt_done(ccb);
3099 					break;
3100 				}
3101 				bzero(tstate, sizeof(*tstate));
3102 				ahc->enabled_targets[target] = tstate;
3103 			}
3104 			lstate = malloc(sizeof(*lstate), M_DEVBUF, M_NOWAIT);
3105 			if (lstate == NULL) {
3106 				ccb->ccb_h.status = CAM_RESRC_UNAVAIL;
3107 				xpt_done(ccb);
3108 				break;
3109 			}
3110 			bzero(lstate, sizeof(*lstate));
3111 			SLIST_INIT(&lstate->accept_tios);
3112 			SLIST_INIT(&lstate->immed_notifies);
3113 			tstate->enabled_luns[lun] = lstate;
3114 			if ((ahc->features & AHC_MULTI_TID) != 0) {
3115 				u_int16_t targid_mask;
3116 
3117 				pause_sequencer(ahc);
3118 				targid_mask = ahc_inb(ahc, TARGID)
3119 					    | (ahc_inb(ahc, TARGID + 1) << 8);
3120 
3121 				targid_mask |= (0x01 << target);
3122 				ahc_outb(ahc, TARGID, targid_mask);
3123 				ahc_outb(ahc, TARGID+1, (targid_mask >> 8));
3124 				unpause_sequencer(ahc, /*always?*/FALSE);
3125 			}
3126 			ccb->ccb_h.status = CAM_REQ_CMP;
3127 			xpt_print_path(ccb->ccb_h.path);
3128 			printf("Lun now enabled for target mode\n");
3129 			xpt_done(ccb);
3130 			break;
3131 		} else {
3132 			/* XXX Fully Implement Disable */
3133 			if (lstate == NULL) {
3134 				ccb->ccb_h.status = CAM_LUN_INVALID;
3135 				xpt_done(ccb);
3136 				break;
3137 			}
3138 			ccb->ccb_h.status = CAM_REQ_CMP;
3139 			xpt_done(ccb);
3140 			break;
3141 		}
3142 		break;
3143 	}
3144 	case XPT_ABORT:			/* Abort the specified CCB */
3145 		/* XXX Implement */
3146 		ccb->ccb_h.status = CAM_REQ_INVALID;
3147 		xpt_done(ccb);
3148 		break;
3149 	case XPT_SET_TRAN_SETTINGS:
3150 	{
3151 		struct	  ahc_devinfo devinfo;
3152 		struct	  ccb_trans_settings *cts;
3153 		struct	  ahc_target_tinfo *tinfo;
3154 		u_int	  update_type;
3155 		int	  s;
3156 
3157 		cts = &ccb->cts;
3158 		ahc_compile_devinfo(&devinfo, cts->ccb_h.target_id,
3159 				    SIM_IS_SCSIBUS_B(ahc, sim) ? 'B' : 'A');
3160 		tinfo = &ahc->transinfo[devinfo.target_offset];
3161 		update_type = 0;
3162 		if ((cts->flags & CCB_TRANS_CURRENT_SETTINGS) != 0)
3163 			update_type |= AHC_TRANS_GOAL;
3164 		if ((cts->flags & CCB_TRANS_USER_SETTINGS) != 0)
3165 			update_type |= AHC_TRANS_USER;
3166 
3167 		s = splcam();
3168 
3169 		if ((cts->valid & CCB_TRANS_DISC_VALID) != 0) {
3170 			if ((cts->flags & CCB_TRANS_DISC_ENB) != 0)
3171 				ahc->discenable |= devinfo.target_mask;
3172 			else
3173 				ahc->discenable &= ~devinfo.target_mask;
3174 		}
3175 
3176 		if ((cts->valid & CCB_TRANS_TQ_VALID) != 0) {
3177 			if ((cts->flags & CCB_TRANS_TAG_ENB) != 0)
3178 				ahc->tagenable |= devinfo.target_mask;
3179 			else
3180 				ahc->tagenable &= ~devinfo.target_mask;
3181 		}
3182 
3183 		if ((cts->valid & CCB_TRANS_BUS_WIDTH_VALID) != 0) {
3184 			switch (cts->bus_width) {
3185 			case MSG_EXT_WDTR_BUS_16_BIT:
3186 				if ((ahc->features & AHC_WIDE) != 0)
3187 					break;
3188 				/* FALLTHROUGH to 8bit */
3189 			case MSG_EXT_WDTR_BUS_32_BIT:
3190 			case MSG_EXT_WDTR_BUS_8_BIT:
3191 			default:
3192 				cts->bus_width = MSG_EXT_WDTR_BUS_8_BIT;
3193 				break;
3194 			}
3195 			if ((update_type & AHC_TRANS_GOAL) != 0)
3196 				tinfo->goal.width = cts->bus_width;
3197 			if ((update_type & AHC_TRANS_USER) != 0)
3198 				tinfo->user.width = cts->bus_width;
3199 		}
3200 
3201 		if ((cts->valid &  CCB_TRANS_SYNC_RATE_VALID) != 0) {
3202 			struct ahc_syncrate *syncrate;
3203 			u_int maxsync;
3204 
3205 			if ((ahc->features & AHC_ULTRA2) != 0)
3206 				maxsync = AHC_SYNCRATE_ULTRA2;
3207 			else if ((ahc->features & AHC_ULTRA) != 0)
3208 				maxsync = AHC_SYNCRATE_ULTRA;
3209 			else
3210 				maxsync = AHC_SYNCRATE_FAST;
3211 
3212 			if ((cts->valid & CCB_TRANS_SYNC_OFFSET_VALID) != 0) {
3213 				if (cts->sync_offset != 0)
3214 					cts->sync_offset = ~0;
3215 			} else {
3216 				cts->sync_offset = 0;
3217 			}
3218 
3219 			syncrate = ahc_find_syncrate(ahc, &cts->sync_period,
3220 						     maxsync);
3221 			ahc_validate_offset(ahc, syncrate, &cts->sync_offset,
3222 					    tinfo->goal.width);
3223 
3224 			/* We use a period of 0 to represent async */
3225 			if (cts->sync_offset == 0)
3226 				cts->sync_period = 0;
3227 
3228 			if ((update_type & AHC_TRANS_GOAL) != 0) {
3229 				tinfo->goal.period = cts->sync_period;
3230 				tinfo->goal.offset = cts->sync_offset;
3231 			}
3232 			if ((update_type & AHC_TRANS_USER) != 0) {
3233 				tinfo->user.period = cts->sync_period;
3234 				tinfo->user.offset = cts->sync_offset;
3235 			}
3236 		}
3237 		splx(s);
3238 		ccb->ccb_h.status = CAM_REQ_CMP;
3239 		xpt_done(ccb);
3240 		break;
3241 	}
3242 	case XPT_GET_TRAN_SETTINGS:
3243 	/* Get default/user set transfer settings for the target */
3244 	{
3245 		struct	  ahc_devinfo devinfo;
3246 		struct	  ccb_trans_settings *cts;
3247 		struct	  ahc_target_tinfo *targ_info;
3248 		struct	  ahc_transinfo *tinfo;
3249 		int	  s;
3250 
3251 		cts = &ccb->cts;
3252 		ahc_compile_devinfo(&devinfo, cts->ccb_h.target_id,
3253 				    SIM_IS_SCSIBUS_B(ahc, sim) ? 'B' : 'A');
3254 		targ_info = &ahc->transinfo[devinfo.target_offset];
3255 
3256 		if ((cts->flags & CCB_TRANS_CURRENT_SETTINGS) != 0)
3257 			tinfo = &targ_info->current;
3258 		else
3259 			tinfo = &targ_info->user;
3260 
3261 		s = splcam();
3262 
3263 		cts->flags &= ~(CCB_TRANS_DISC_ENB|CCB_TRANS_TAG_ENB);
3264 		if ((ahc->discenable & devinfo.target_mask) != 0)
3265 			cts->flags |= CCB_TRANS_DISC_ENB;
3266 
3267 		if ((ahc->tagenable & devinfo.target_mask) != 0)
3268 			cts->flags |= CCB_TRANS_TAG_ENB;
3269 
3270 		cts->sync_period = tinfo->period;
3271 		cts->sync_offset = tinfo->offset;
3272 		cts->bus_width = tinfo->width;
3273 
3274 		splx(s);
3275 
3276 		cts->valid = CCB_TRANS_SYNC_RATE_VALID
3277 			   | CCB_TRANS_SYNC_OFFSET_VALID
3278 			   | CCB_TRANS_BUS_WIDTH_VALID
3279 			   | CCB_TRANS_DISC_VALID
3280 			   | CCB_TRANS_TQ_VALID;
3281 
3282 		ccb->ccb_h.status = CAM_REQ_CMP;
3283 		xpt_done(ccb);
3284 		break;
3285 	}
3286 	case XPT_CALC_GEOMETRY:
3287 	{
3288 		struct	  ccb_calc_geometry *ccg;
3289 		u_int32_t size_mb;
3290 		u_int32_t secs_per_cylinder;
3291 		int	  extended;
3292 
3293 		ccg = &ccb->ccg;
3294 		size_mb = ccg->volume_size
3295 			/ ((1024L * 1024L) / ccg->block_size);
3296 		extended = SIM_IS_SCSIBUS_B(ahc, sim)
3297 			? ahc->flags & AHC_EXTENDED_TRANS_B
3298 			: ahc->flags & AHC_EXTENDED_TRANS_A;
3299 
3300 		if (size_mb > 1024 && extended) {
3301 			ccg->heads = 255;
3302 			ccg->secs_per_track = 63;
3303 		} else {
3304 			ccg->heads = 64;
3305 			ccg->secs_per_track = 32;
3306 		}
3307 		secs_per_cylinder = ccg->heads * ccg->secs_per_track;
3308 		ccg->cylinders = ccg->volume_size / secs_per_cylinder;
3309 		ccb->ccb_h.status = CAM_REQ_CMP;
3310 		xpt_done(ccb);
3311 		break;
3312 	}
3313 	case XPT_RESET_BUS:		/* Reset the specified SCSI bus */
3314 	{
3315 		struct cam_path *path;
3316 		char channel;
3317 		int  found;
3318 
3319 		s = splcam();
3320 		if (SIM_IS_SCSIBUS_B(ahc, sim)) {
3321 			channel = 'B';
3322 			path = ahc->path_b;
3323 		} else {
3324 			channel = 'A';
3325 			path = ahc->path;
3326 		}
3327 		found = ahc_reset_channel(ahc, channel, /*initiate reset*/TRUE);
3328 		splx(s);
3329 		if (bootverbose) {
3330 			xpt_print_path(path);
3331 			printf("SCSI bus reset delivered. "
3332 			       "%d SCBs aborted.\n", found);
3333 		}
3334 		ccb->ccb_h.status = CAM_REQ_CMP;
3335 		xpt_done(ccb);
3336 		break;
3337 	}
3338 	case XPT_TERM_IO:		/* Terminate the I/O process */
3339 		/* XXX Implement */
3340 		ccb->ccb_h.status = CAM_REQ_INVALID;
3341 		xpt_done(ccb);
3342 		break;
3343 	case XPT_PATH_INQ:		/* Path routing inquiry */
3344 	{
3345 		struct ccb_pathinq *cpi = &ccb->cpi;
3346 
3347 		cpi->version_num = 1; /* XXX??? */
3348 		cpi->hba_inquiry = PI_SDTR_ABLE|PI_TAG_ABLE;
3349 		if ((ahc->features & AHC_WIDE) != 0)
3350 			cpi->hba_inquiry |= PI_WIDE_16;
3351 		if ((ahc->flags & AHC_TARGETMODE) != 0) {
3352 			cpi->target_sprt = PIT_PROCESSOR
3353 					 | PIT_DISCONNECT
3354 					 | PIT_TERM_IO;
3355 		} else {
3356 			cpi->target_sprt = 0;
3357 		}
3358 		cpi->hba_misc = 0;
3359 		cpi->hba_eng_cnt = 0;
3360 		cpi->max_target = (ahc->features & AHC_WIDE) ? 15 : 7;
3361 		cpi->max_lun = 7;
3362 		if (SIM_IS_SCSIBUS_B(ahc, sim))
3363 			cpi->initiator_id = ahc->our_id_b;
3364 		else
3365 			cpi->initiator_id = ahc->our_id;
3366 		cpi->bus_id = cam_sim_bus(sim);
3367 		strncpy(cpi->sim_vid, "FreeBSD", SIM_IDLEN);
3368 		strncpy(cpi->hba_vid, "Adaptec", HBA_IDLEN);
3369 		strncpy(cpi->dev_name, cam_sim_name(sim), DEV_IDLEN);
3370 		cpi->unit_number = cam_sim_unit(sim);
3371 		cpi->ccb_h.status = CAM_REQ_CMP;
3372 		xpt_done(ccb);
3373 		break;
3374 	}
3375 	default:
3376 		ccb->ccb_h.status = CAM_REQ_INVALID;
3377 		xpt_done(ccb);
3378 		break;
3379 	}
3380 }
3381 
3382 static void
3383 ahc_async(void *callback_arg, u_int32_t code, struct cam_path *path, void *arg)
3384 {
3385 	struct ahc_softc *ahc;
3386 	struct cam_sim *sim;
3387 
3388 	sim = (struct cam_sim *)callback_arg;
3389 	ahc = (struct ahc_softc *)cam_sim_softc(sim);
3390 	switch (code) {
3391 	case AC_LOST_DEVICE:
3392 	{
3393 		struct	ahc_devinfo devinfo;
3394 
3395 		ahc_compile_devinfo(&devinfo, xpt_path_target_id(path),
3396 				    SIM_IS_SCSIBUS_B(ahc, sim) ? 'B' : 'A');
3397 
3398 		/*
3399 		 * Revert to async/narrow transfers
3400 		 * for the next device.
3401 		 */
3402 		pause_sequencer(ahc);
3403 		ahc_set_width(ahc, &devinfo, path, MSG_EXT_WDTR_BUS_8_BIT,
3404 			      AHC_TRANS_GOAL|AHC_TRANS_CUR);
3405 		ahc_set_syncrate(ahc, &devinfo, path, /*syncrate*/NULL,
3406 				 /*period*/0, /*offset*/0,
3407 				 AHC_TRANS_GOAL|AHC_TRANS_CUR);
3408 		unpause_sequencer(ahc, /*unpause always*/FALSE);
3409 		break;
3410 	}
3411 	default:
3412 		break;
3413 	}
3414 }
3415 
3416 static void
3417 ahc_execute_scb(void *arg, bus_dma_segment_t *dm_segs, int nsegments,
3418 		int error)
3419 {
3420 	struct	 scb *scb;
3421 	union	 ccb *ccb;
3422 	struct	 ahc_softc *ahc;
3423 	int	 s;
3424 
3425 	scb = (struct scb *)arg;
3426 	ccb = scb->ccb;
3427 	ahc = (struct ahc_softc *)ccb->ccb_h.ccb_ahc_ptr;
3428 
3429 	if (nsegments != 0) {
3430 		struct	  ahc_dma_seg *sg;
3431 		bus_dma_segment_t *end_seg;
3432 		bus_dmasync_op_t op;
3433 
3434 		end_seg = dm_segs + nsegments;
3435 
3436 		/* Copy the first SG into the data pointer area */
3437 		scb->hscb->SG_pointer = scb->ahc_dmaphys;
3438 		scb->hscb->data = dm_segs->ds_addr;
3439 		scb->hscb->datalen = dm_segs->ds_len;
3440 		dm_segs++;
3441 
3442 		/* Copy the remaining segments into our SG list */
3443 		sg = scb->ahc_dma;
3444 		while (dm_segs < end_seg) {
3445 			sg->addr = dm_segs->ds_addr;
3446 			sg->len = dm_segs->ds_len;
3447 			sg++;
3448 			dm_segs++;
3449 		}
3450 
3451 		if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN)
3452 			op = BUS_DMASYNC_PREREAD;
3453 		else
3454 			op = BUS_DMASYNC_PREWRITE;
3455 
3456 		bus_dmamap_sync(ahc->dmat, scb->dmamap, op);
3457 	} else {
3458 		scb->hscb->SG_pointer = 0;
3459 		scb->hscb->data = 0;
3460 		scb->hscb->datalen = 0;
3461 	}
3462 
3463 	scb->sg_count = scb->hscb->SG_count = nsegments;
3464 
3465 	s = splcam();
3466 
3467 	/*
3468 	 * Last time we need to check if this SCB needs to
3469 	 * be aborted.
3470 	 */
3471 	if (ahc_ccb_status(ccb) != CAM_REQ_INPROG) {
3472 		if (nsegments != 0)
3473 			bus_dmamap_unload(ahc->dmat, scb->dmamap);
3474 		ahc_free_scb(ahc, scb);
3475 		xpt_done(ccb);
3476 		splx(s);
3477 		return;
3478 	}
3479 
3480 	/* Busy this tcl if we are untagged */
3481 	if ((scb->hscb->control & TAG_ENB) == 0)
3482 		ahc_busy_tcl(ahc, scb);
3483 
3484 	LIST_INSERT_HEAD(&ahc->pending_ccbs, &ccb->ccb_h,
3485 			 sim_links.le);
3486 
3487 	scb->flags |= SCB_ACTIVE;
3488 	ccb->ccb_h.status |= CAM_SIM_QUEUED;
3489 
3490 	ccb->ccb_h.timeout_ch =
3491 	    timeout(ahc_timeout, (caddr_t)scb,
3492 		    (ccb->ccb_h.timeout * hz) / 1000);
3493 
3494 	if ((scb->flags & SCB_TARGET_IMMEDIATE) != 0) {
3495 		xpt_print_path(ccb->ccb_h.path);
3496 		printf("Returning an immediate CTIO\n");
3497 		if ((ahc->flags & AHC_PAGESCBS) == 0)
3498 			ahc_outb(ahc, SCBPTR, scb->hscb->tag);
3499 		ahc_outb(ahc, SCB_TAG, scb->hscb->tag);
3500 		unpause_sequencer(ahc, /*unpause_always*/TRUE);
3501 	} else {
3502 
3503 		ahc->qinfifo[ahc->qinfifonext++] = scb->hscb->tag;
3504 
3505 		if ((ahc->features & AHC_QUEUE_REGS) != 0) {
3506 			ahc_outb(ahc, HNSCB_QOFF, ahc->qinfifonext);
3507 		} else {
3508 			pause_sequencer(ahc);
3509 			ahc_outb(ahc, KERNEL_QINPOS, ahc->qinfifonext);
3510 			unpause_sequencer(ahc, /*unpause_always*/FALSE);
3511 		}
3512 	}
3513 
3514 	splx(s);
3515 }
3516 
3517 static void
3518 ahc_poll(struct cam_sim *sim)
3519 {
3520 	ahc_intr(cam_sim_softc(sim));
3521 }
3522 
3523 static void
3524 ahc_setup_data(struct ahc_softc *ahc, struct ccb_scsiio *csio,
3525 	       struct scb *scb)
3526 {
3527 	struct hardware_scb *hscb;
3528 	struct ccb_hdr *ccb_h;
3529 
3530 	hscb = scb->hscb;
3531 	ccb_h = &csio->ccb_h;
3532 
3533 	if (ccb_h->func_code == XPT_SCSI_IO) {
3534 		hscb->cmdlen = csio->cdb_len;
3535 		if ((ccb_h->flags & CAM_CDB_POINTER) != 0) {
3536 			if ((ccb_h->flags & CAM_CDB_PHYS) == 0)
3537 				if (hscb->cmdlen <= 16) {
3538 					memcpy(hscb->cmdstore,
3539 					       csio->cdb_io.cdb_ptr,
3540 					       hscb->cmdlen);
3541 					hscb->cmdpointer =
3542 					    hscb->cmdstore_busaddr;
3543 				} else
3544 					hscb->cmdpointer =
3545 					    vtophys(csio->cdb_io.cdb_ptr);
3546 			else
3547 				hscb->cmdpointer =
3548 					(u_int32_t)csio->cdb_io.cdb_ptr;
3549 		} else {
3550 			/*
3551 			 * CCB CDB Data Storage area is only 16 bytes
3552 			 * so no additional testing is required
3553 			 */
3554 			memcpy(hscb->cmdstore, csio->cdb_io.cdb_bytes,
3555 			       hscb->cmdlen);
3556 			hscb->cmdpointer = hscb->cmdstore_busaddr;
3557 		}
3558 	}
3559 
3560 	/* Only use S/G if there is a transfer */
3561 	if ((ccb_h->flags & CAM_DIR_MASK) != CAM_DIR_NONE) {
3562 		if ((ccb_h->flags & CAM_SCATTER_VALID) == 0) {
3563 			/* We've been given a pointer to a single buffer */
3564 			if ((ccb_h->flags & CAM_DATA_PHYS) == 0) {
3565 				int s;
3566 				int error;
3567 
3568 				s = splsoftvm();
3569 				error = bus_dmamap_load(ahc->dmat,
3570 							scb->dmamap,
3571 							csio->data_ptr,
3572 							csio->dxfer_len,
3573 							ahc_execute_scb,
3574 							scb, /*flags*/0);
3575 				if (error == EINPROGRESS) {
3576 					/*
3577 					 * So as to maintain ordering,
3578 					 * freeze the controller queue
3579 					 * until our mapping is
3580 					 * returned.
3581 					 */
3582 					xpt_freeze_simq(ahc->sim,
3583 							/*count*/1);
3584 					scb->ccb->ccb_h.status |=
3585 					    CAM_RELEASE_SIMQ;
3586 				}
3587 				splx(s);
3588 			} else {
3589 				struct bus_dma_segment seg;
3590 
3591 				/* Pointer to physical buffer */
3592 				if (csio->dxfer_len > AHC_MAXTRANSFER_SIZE)
3593 					panic("ahc_setup_data - Transfer size "
3594 					      "larger than can device max");
3595 
3596 				seg.ds_addr = (bus_addr_t)csio->data_ptr;
3597 				seg.ds_len = csio->dxfer_len;
3598 				ahc_execute_scb(scb, &seg, 1, 0);
3599 			}
3600 		} else {
3601 			struct bus_dma_segment *segs;
3602 
3603 			if ((ccb_h->flags & CAM_DATA_PHYS) != 0)
3604 				panic("ahc_setup_data - Physical segment "
3605 				      "pointers unsupported");
3606 
3607 			if ((ccb_h->flags & CAM_SG_LIST_PHYS) == 0)
3608 				panic("ahc_setup_data - Virtual segment "
3609 				      "addresses unsupported");
3610 
3611 			/* Just use the segments provided */
3612 			segs = (struct bus_dma_segment *)csio->data_ptr;
3613 			ahc_execute_scb(scb, segs, csio->sglist_cnt, 0);
3614 		}
3615 		if (ccb_h->func_code == XPT_CONT_TARGET_IO) {
3616 			hscb->cmdpointer |= DPHASE_PENDING;
3617 			if ((ccb_h->flags & CAM_DIR_MASK) == CAM_DIR_IN)
3618 				hscb->cmdpointer |= (TARGET_DATA_IN << 8);
3619 		}
3620 	} else {
3621 		ahc_execute_scb(scb, NULL, 0, 0);
3622 	}
3623 }
3624 
3625 static void
3626 ahc_freeze_devq(struct ahc_softc *ahc, struct cam_path *path)
3627 {
3628 	int	target;
3629 	char	channel;
3630 	int	lun;
3631 
3632 	target = xpt_path_target_id(path);
3633 	lun = xpt_path_lun_id(path);
3634 	channel = xpt_path_sim(path)->bus_id == 0 ? 'A' : 'B';
3635 
3636 	ahc_search_qinfifo(ahc, target, channel, lun,
3637 			   /*tag*/SCB_LIST_NULL, CAM_REQUEUE_REQ,
3638 			   SEARCH_COMPLETE);
3639 }
3640 
3641 /*
3642  * An scb (and hence an scb entry on the board) is put onto the
3643  * free list.
3644  */
3645 static void
3646 ahc_free_scb(struct ahc_softc *ahc, struct scb *scb)
3647 {
3648 	struct hardware_scb *hscb;
3649 	int opri;
3650 
3651 	hscb = scb->hscb;
3652 
3653 	opri = splcam();
3654 
3655 	if ((ahc->flags & AHC_RESOURCE_SHORTAGE) != 0
3656 	 && (scb->ccb->ccb_h.status & CAM_RELEASE_SIMQ) == 0) {
3657 		scb->ccb->ccb_h.status |= CAM_RELEASE_SIMQ;
3658 		ahc->flags &= ~AHC_RESOURCE_SHORTAGE;
3659 	}
3660 
3661 	/* Clean up for the next user */
3662 	scb->flags = SCB_FREE;
3663 	hscb->control = 0;
3664 	hscb->status = 0;
3665 
3666 	STAILQ_INSERT_HEAD(&ahc->scb_data->free_scbs, scb, links);
3667 	splx(opri);
3668 }
3669 
3670 /*
3671  * Get a free scb, either one already assigned to a hardware slot
3672  * on the adapter or one that will require an SCB to be paged out before
3673  * use. If there are none, see if we can allocate a new SCB.  Otherwise
3674  * either return an error or sleep.
3675  */
3676 static struct scb *
3677 ahc_get_scb(struct ahc_softc *ahc)
3678 {
3679 	struct scb *scbp;
3680 	int opri;
3681 
3682 	opri = splcam();
3683 	if ((scbp = STAILQ_FIRST(&ahc->scb_data->free_scbs))) {
3684 		STAILQ_REMOVE_HEAD(&ahc->scb_data->free_scbs, links);
3685 	} else if (ahc->scb_data->numscbs < ahc->scb_data->maxscbs) {
3686 		scbp = ahc_alloc_scb(ahc);
3687 		if (scbp == NULL)
3688 			printf("%s: Can't malloc SCB\n", ahc_name(ahc));
3689 	}
3690 
3691 	splx(opri);
3692 
3693 	return (scbp);
3694 }
3695 
3696 
3697 static struct scb *
3698 ahc_alloc_scb(struct ahc_softc *ahc)
3699 {
3700 	static	struct ahc_dma_seg *next_sg_array = NULL;
3701 	static	int sg_arrays_free = 0;
3702 	struct	scb *newscb;
3703 	int	error;
3704 
3705 	newscb = (struct scb *) malloc(sizeof(struct scb), M_DEVBUF, M_NOWAIT);
3706 	if (newscb != NULL) {
3707 		bzero(newscb, sizeof(struct scb));
3708 		error = bus_dmamap_create(ahc->dmat, /*flags*/0,
3709 					  &newscb->dmamap);
3710 		if (error != 0)
3711 			printf("%s: Unable to allocate SCB dmamap - error %d\n",
3712 			       ahc_name(ahc), error);
3713 
3714 		if (error == 0 && next_sg_array == NULL) {
3715 			size_t	alloc_size = sizeof(struct ahc_dma_seg)
3716 					     * AHC_NSEG;
3717 			sg_arrays_free = PAGE_SIZE / alloc_size;
3718 			alloc_size *= sg_arrays_free;
3719 			if (alloc_size == 0)
3720 				panic("%s: SG list doesn't fit in a page",
3721 				      ahc_name(ahc));
3722 			next_sg_array = (struct ahc_dma_seg *)
3723 					malloc(alloc_size, M_DEVBUF, M_NOWAIT);
3724 		}
3725 		if (error == 0 && next_sg_array != NULL) {
3726 			struct hardware_scb *hscb;
3727 
3728 			newscb->ahc_dma = next_sg_array;
3729 			newscb->ahc_dmaphys = vtophys(next_sg_array);
3730 			sg_arrays_free--;
3731 			if (sg_arrays_free == 0)
3732 				next_sg_array = NULL;
3733 			else
3734 				next_sg_array = &next_sg_array[AHC_NSEG];
3735 			hscb = &ahc->scb_data->hscbs[ahc->scb_data->numscbs];
3736 			newscb->hscb = hscb;
3737 			hscb->control = 0;
3738 			hscb->status = 0;
3739 			hscb->tag = ahc->scb_data->numscbs;
3740 			hscb->residual_data_count[2] = 0;
3741 			hscb->residual_data_count[1] = 0;
3742 			hscb->residual_data_count[0] = 0;
3743 			hscb->residual_SG_count = 0;
3744 			hscb->cmdstore_busaddr =
3745 				ahc_hscb_busaddr(ahc, hscb->tag)
3746 			      + offsetof(struct hardware_scb, cmdstore);
3747 			/*
3748 			 * Place in the scbarray
3749 			 * Never is removed.
3750 			 */
3751 			ahc->scb_data->scbarray[hscb->tag] = newscb;
3752 			ahc->scb_data->numscbs++;
3753 		} else {
3754 			free(newscb, M_DEVBUF);
3755 			newscb = NULL;
3756 		}
3757 	}
3758 	return newscb;
3759 }
3760 
3761 static void
3762 ahc_loadseq(struct ahc_softc *ahc)
3763 {
3764 	struct patch *cur_patch;
3765 	int i;
3766 	int downloaded;
3767 	int skip_addr;
3768 	u_int8_t download_consts[4];
3769 
3770 	/* Setup downloadable constant table */
3771 	download_consts[TMODE_NUMCMDS] = ahc->num_targetcmds;
3772 
3773 	cur_patch = patches;
3774 	downloaded = 0;
3775 	skip_addr = 0;
3776 	ahc_outb(ahc, SEQCTL, PERRORDIS|FAILDIS|FASTMODE|LOADRAM);
3777 	ahc_outb(ahc, SEQADDR0, 0);
3778 	ahc_outb(ahc, SEQADDR1, 0);
3779 
3780 	for (i = 0; i < sizeof(seqprog)/4; i++) {
3781 		if (ahc_check_patch(ahc, &cur_patch, i, &skip_addr) == 0) {
3782 			/*
3783 			 * Don't download this instruction as it
3784 			 * is in a patch that was removed.
3785 			 */
3786                         continue;
3787 		}
3788 		ahc_download_instr(ahc, i, download_consts);
3789 		downloaded++;
3790 	}
3791 	ahc_outb(ahc, SEQCTL, PERRORDIS|FAILDIS|FASTMODE);
3792 	restart_sequencer(ahc);
3793 
3794 	if (bootverbose)
3795 		printf(" %d instructions downloaded\n", downloaded);
3796 }
3797 
3798 static int
3799 ahc_check_patch(struct ahc_softc *ahc, struct patch **start_patch,
3800 		int start_instr, int *skip_addr)
3801 {
3802 	struct	patch *cur_patch;
3803 	struct	patch *last_patch;
3804 	int	patch_index;
3805 	int	num_patches;
3806 
3807 	num_patches = sizeof(patches)/sizeof(struct patch);
3808 	last_patch = &patches[num_patches];
3809 	cur_patch = *start_patch;
3810 
3811 	while (cur_patch < last_patch && start_instr == cur_patch->begin) {
3812 
3813 		if (cur_patch->patch_func(ahc) == 0) {
3814 			int skip;
3815 
3816 			/* Start rejecting code */
3817 			*skip_addr = start_instr + cur_patch->skip_instr;
3818 			cur_patch += cur_patch->skip_patch;
3819 		} else {
3820 			/* Accepted this patch.  Advance to the next
3821 			 * one and wait for our intruction pointer to
3822 			 * hit this point.
3823 			 */
3824 			cur_patch++;
3825 		}
3826 	}
3827 
3828 	*start_patch = cur_patch;
3829 	if (start_instr < *skip_addr)
3830 		/* Still skipping */
3831 		return (0);
3832 
3833 	return (1);
3834 }
3835 
3836 static void
3837 ahc_download_instr(struct ahc_softc *ahc, int instrptr, u_int8_t *dconsts)
3838 {
3839 	union	 ins_formats instr;
3840 	struct	 ins_format1 *fmt1_ins;
3841 	struct	 ins_format3 *fmt3_ins;
3842 	int	 fmt3;
3843 	u_int8_t opcode;
3844 
3845 	/* Structure copy */
3846 	instr = *(union ins_formats*)&seqprog[instrptr * 4];
3847 
3848 	fmt1_ins = &instr.format1;
3849 	fmt3_ins = NULL;
3850 
3851 	/* Pull the opcode */
3852 	opcode = instr.format1.opcode;
3853 	switch (opcode) {
3854 	case AIC_OP_JMP:
3855 	case AIC_OP_JC:
3856 	case AIC_OP_JNC:
3857 	case AIC_OP_CALL:
3858 	case AIC_OP_JNE:
3859 	case AIC_OP_JNZ:
3860 	case AIC_OP_JE:
3861 	case AIC_OP_JZ:
3862 	{
3863 		struct patch *cur_patch;
3864 		int address_offset;
3865 		u_int address;
3866 		int skip_addr;
3867 		int i;
3868 
3869 		fmt3_ins = &instr.format3;
3870 		address_offset = 0;
3871 		address = fmt3_ins->address;
3872 		cur_patch = patches;
3873 		skip_addr = 0;
3874 
3875 		for (i = 0; i < address;) {
3876 
3877 			ahc_check_patch(ahc, &cur_patch, i, &skip_addr);
3878 
3879 			if (skip_addr > i) {
3880 				int end_addr;
3881 
3882 				end_addr = MIN(address, skip_addr);
3883 				address_offset += end_addr - i;
3884 				i = skip_addr;
3885 			} else {
3886 				i++;
3887 			}
3888 		}
3889 		address -= address_offset;
3890 		fmt3_ins->address = address;
3891 		/* FALLTHROUGH */
3892 	}
3893 	case AIC_OP_OR:
3894 	case AIC_OP_AND:
3895 	case AIC_OP_XOR:
3896 	case AIC_OP_ADD:
3897 	case AIC_OP_ADC:
3898 	case AIC_OP_BMOV:
3899 		if (fmt1_ins->parity != 0) {
3900 			fmt1_ins->immediate = dconsts[fmt1_ins->immediate];
3901 		}
3902 		fmt1_ins->parity = 0;
3903 		/* FALLTHROUGH */
3904 	case AIC_OP_ROL:
3905 		if ((ahc->features & AHC_ULTRA2) != 0) {
3906 			int i, count;
3907 
3908 			/* Calculate odd parity for the instruction */
3909 			for (i = 0, count = 0; i < 31; i++) {
3910 				u_int32_t mask;
3911 
3912 				mask = 0x01 << i;
3913 				if ((instr.integer & mask) != 0)
3914 					count++;
3915 			}
3916 			if ((count & 0x01) == 0)
3917 				instr.format1.parity = 1;
3918 		} else {
3919 			/* Compress the instruction for older sequencers */
3920 			if (fmt3_ins != NULL) {
3921 				instr.integer =
3922 					fmt3_ins->immediate
3923 				      | (fmt3_ins->source << 8)
3924 				      | (fmt3_ins->address << 16)
3925 				      |	(fmt3_ins->opcode << 25);
3926 			} else {
3927 				instr.integer =
3928 					fmt1_ins->immediate
3929 				      | (fmt1_ins->source << 8)
3930 				      | (fmt1_ins->destination << 16)
3931 				      |	(fmt1_ins->ret << 24)
3932 				      |	(fmt1_ins->opcode << 25);
3933 			}
3934 		}
3935 		ahc_outsb(ahc, SEQRAM, instr.bytes, 4);
3936 		break;
3937 	default:
3938 		panic("Unknown opcode encountered in seq program");
3939 		break;
3940 	}
3941 }
3942 
3943 static void
3944 ahc_set_recoveryscb(struct ahc_softc *ahc, struct scb *scb) {
3945 
3946 	if ((scb->flags & SCB_RECOVERY_SCB) == 0) {
3947 		struct ccb_hdr *ccbh;
3948 
3949 		scb->flags |= SCB_RECOVERY_SCB;
3950 
3951 		/*
3952 		 * Take all queued, but not sent SCBs out of the equation.
3953 		 * Also ensure that no new CCBs are queued to us while we
3954 		 * try to fix this problem.
3955 		 */
3956 		if ((scb->ccb->ccb_h.status & CAM_RELEASE_SIMQ) == 0) {
3957 			xpt_freeze_simq(ahc->sim, /*count*/1);
3958 			scb->ccb->ccb_h.status |= CAM_RELEASE_SIMQ;
3959 		}
3960 
3961 		/*
3962 		 * Go through all of our pending SCBs and remove
3963 		 * any scheduled timeouts for them.  We will reschedule
3964 		 * them after we've successfully fixed this problem.
3965 		 */
3966 		ccbh = ahc->pending_ccbs.lh_first;
3967 		while (ccbh != NULL) {
3968 			struct scb *pending_scb;
3969 
3970 			pending_scb = (struct scb *)ccbh->ccb_scb_ptr;
3971 			untimeout(ahc_timeout, pending_scb, ccbh->timeout_ch);
3972 			ccbh = ccbh->sim_links.le.le_next;
3973 		}
3974 	}
3975 }
3976 
3977 static void
3978 ahc_timeout(void *arg)
3979 {
3980 	struct	 scb *scb;
3981 	struct	 ahc_softc *ahc;
3982 	int	 s, found;
3983 	u_int8_t bus_state;
3984 	int	 target;
3985 	int	 lun;
3986 	char	 channel;
3987 
3988 	scb = (struct scb *)arg;
3989 	ahc = (struct ahc_softc *)scb->ccb->ccb_h.ccb_ahc_ptr;
3990 
3991 	s = splcam();
3992 
3993 	/*
3994 	 * Ensure that the card doesn't do anything
3995 	 * behind our back.  Also make sure that we
3996 	 * didn't "just" miss an interrupt that would
3997 	 * affect this timeout.
3998 	 */
3999 	do {
4000 		ahc_intr(ahc);
4001 		pause_sequencer(ahc);
4002 	} while (ahc_inb(ahc, INTSTAT) & INT_PEND);
4003 
4004 	if ((scb->flags & SCB_ACTIVE) == 0) {
4005 		/* Previous timeout took care of me already */
4006 		printf("Timedout SCB handled by another timeout\n");
4007 		unpause_sequencer(ahc, /*unpause_always*/TRUE);
4008 		splx(s);
4009 		return;
4010 	}
4011 
4012 	target = SCB_TARGET(scb);
4013 	channel = SCB_CHANNEL(scb);
4014 	lun = SCB_LUN(scb);
4015 
4016 	xpt_print_path(scb->ccb->ccb_h.path);
4017 	printf("SCB 0x%x - timed out ", scb->hscb->tag);
4018 	/*
4019 	 * Take a snapshot of the bus state and print out
4020 	 * some information so we can track down driver bugs.
4021 	 */
4022 	bus_state = ahc_inb(ahc, LASTPHASE);
4023 
4024 	switch(bus_state)
4025 	{
4026 	case P_DATAOUT:
4027 		printf("in dataout phase");
4028 		break;
4029 	case P_DATAIN:
4030 		printf("in datain phase");
4031 		break;
4032 	case P_COMMAND:
4033 		printf("in command phase");
4034 		break;
4035 	case P_MESGOUT:
4036 		printf("in message out phase");
4037 		break;
4038 	case P_STATUS:
4039 		printf("in status phase");
4040 		break;
4041 	case P_MESGIN:
4042 		printf("in message in phase");
4043 		break;
4044 	case P_BUSFREE:
4045 		printf("while idle, LASTPHASE == 0x%x",
4046 			bus_state);
4047 		break;
4048 	default:
4049 		/*
4050 		 * We aren't in a valid phase, so assume we're
4051 		 * idle.
4052 		 */
4053 		printf("invalid phase, LASTPHASE == 0x%x",
4054 			bus_state);
4055 		bus_state = P_BUSFREE;
4056 		break;
4057 	}
4058 
4059 	printf(", SCSISIGI == 0x%x\n", ahc_inb(ahc, SCSISIGI));
4060 
4061 	printf("SEQADDR == 0x%x\n", ahc_inb(ahc, SEQADDR0)
4062 				 | (ahc_inb(ahc, SEQADDR1) << 8));
4063 	printf("SSTAT1 == 0x%x\n", ahc_inb(ahc, SSTAT1));
4064 #if 0
4065 	printf("SCSIRATE == 0x%x\n", ahc_inb(ahc, SCSIRATE));
4066 	printf("CCSCBCTL == 0x%x\n", ahc_inb(ahc, CCSCBCTL));
4067 	printf("CCSCBCNT == 0x%x\n", ahc_inb(ahc, CCSCBCNT));
4068 	printf("DFCNTRL == 0x%x\n", ahc_inb(ahc, DFCNTRL));
4069 	printf("DFSTATUS == 0x%x\n", ahc_inb(ahc, DFSTATUS));
4070 	printf("CCHCNT == 0x%x\n", ahc_inb(ahc, CCHCNT));
4071 #endif
4072 	/* Decide our course of action */
4073 	if (scb->flags & SCB_DEVICE_RESET) {
4074 		/*
4075 		 * Been down this road before.
4076 		 * Do a full bus reset.
4077 		 */
4078 bus_reset:
4079 		ahc_set_ccb_status(scb->ccb, CAM_CMD_TIMEOUT);
4080 		found = ahc_reset_channel(ahc, channel, /*Initiate Reset*/TRUE);
4081 		printf("%s: Issued Channel %c Bus Reset. "
4082 		       "%d SCBs aborted\n", ahc_name(ahc), channel, found);
4083 	} else {
4084 		/*
4085 		 * Send a Bus Device Reset message:
4086 		 * The target that is holding up the bus may not
4087 		 * be the same as the one that triggered this timeout
4088 		 * (different commands have different timeout lengths).
4089 		 * Our strategy here is to queue a BDR message
4090 		 * to the timed out target if the bus is idle.
4091 		 * Otherwise, if we have an active target we stuff the
4092 		 * message buffer with a BDR message and assert ATN
4093 		 * in the hopes that the target will let go of the bus
4094 		 * and go to the mesgout phase.  If this fails, we'll
4095 		 * get another timeout 2 seconds later which will attempt
4096 		 * a bus reset.
4097 		 */
4098 		u_int8_t active_scb_index;
4099 
4100 		active_scb_index = ahc_inb(ahc, SCB_TAG);
4101 
4102 		if (bus_state != P_BUSFREE
4103 		  && (active_scb_index < ahc->scb_data->numscbs)) {
4104 			struct scb *active_scb;
4105 
4106 			/*
4107 			 * If the active SCB is not from our device,
4108 			 * assume that another device is hogging the bus
4109 			 * and wait for it's timeout to expire before
4110 			 * taking addition action.
4111 			 */
4112 			active_scb = ahc->scb_data->scbarray[active_scb_index];
4113 			if (active_scb->hscb->tcl != scb->hscb->tcl
4114 			 && (scb->flags & SCB_OTHERTCL_TIMEOUT) == 0) {
4115 				struct	ccb_hdr *ccbh;
4116 				u_int	newtimeout;
4117 
4118 				scb->flags |= SCB_OTHERTCL_TIMEOUT;
4119 				newtimeout = MAX(active_scb->ccb->ccb_h.timeout,
4120 						 scb->ccb->ccb_h.timeout);
4121 				ccbh = &scb->ccb->ccb_h;
4122 				scb->ccb->ccb_h.timeout_ch =
4123 				    timeout(ahc_timeout, scb,
4124 					    (newtimeout * hz) / 1000);
4125 				splx(s);
4126 				return;
4127 			}
4128 			ahc_set_recoveryscb(ahc, active_scb);
4129 			ahc_outb(ahc, MSG_OUT, MSG_BUS_DEV_RESET);
4130 			ahc_outb(ahc, SCSISIGO, bus_state|ATNO);
4131 			xpt_print_path(active_scb->ccb->ccb_h.path);
4132 			printf("BDR message in message buffer\n");
4133 			active_scb->flags |=  SCB_DEVICE_RESET;
4134 			active_scb->ccb->ccb_h.timeout_ch =
4135 			    timeout(ahc_timeout, (caddr_t)active_scb, 2 * hz);
4136 			unpause_sequencer(ahc, /*unpause_always*/TRUE);
4137 		} else {
4138 			int	 disconnected;
4139 
4140 			if (ahc_search_qinfifo(ahc, target, channel, lun,
4141 					       scb->hscb->tag, /*status*/0,
4142 					       SEARCH_COUNT) > 0) {
4143 				disconnected = FALSE;
4144 			} else {
4145 				disconnected = TRUE;
4146 			}
4147 
4148 			if (disconnected) {
4149 				u_int8_t hscb_index;
4150 
4151 				ahc_set_recoveryscb(ahc, scb);
4152 				/*
4153 				 * Simply set the MK_MESSAGE control bit.
4154 				 */
4155 				scb->hscb->control |= MK_MESSAGE;
4156 				scb->flags |= SCB_QUEUED_MSG
4157 					   |  SCB_DEVICE_RESET;
4158 				hscb_index = ahc_find_scb(ahc, scb);
4159 				if (hscb_index != SCB_LIST_NULL) {
4160 					u_int8_t scb_control;
4161 					u_int8_t saved_scbptr;
4162 
4163 					saved_scbptr = ahc_inb(ahc, SCBPTR);
4164 					ahc_outb(ahc, SCBPTR, hscb_index);
4165 					scb_control = ahc_inb(ahc, SCB_CONTROL);
4166 					ahc_outb(ahc, SCB_CONTROL,
4167 						 scb_control | MK_MESSAGE);
4168 					ahc_outb(ahc, SCBPTR, saved_scbptr);
4169 				}
4170 				/*
4171 				 * Actually re-queue this SCB in case we can
4172 				 * select the device before it reconnects.
4173 				 * Clear out any entries in the QINFIFO first
4174 				 * so we are the next SCB for this target
4175 				 * to run.
4176 				 */
4177 				ahc_search_qinfifo(ahc, SCB_TARGET(scb),
4178 						   channel, SCB_LUN(scb),
4179 						   SCB_LIST_NULL,
4180 						   CAM_REQUEUE_REQ,
4181 						   SEARCH_COMPLETE);
4182 				xpt_print_path(scb->ccb->ccb_h.path);
4183 				printf("Queuing a BDR SCB\n");
4184 				ahc->qinfifo[ahc->qinfifonext++] =
4185 				    scb->hscb->tag;
4186 				if ((ahc->features & AHC_QUEUE_REGS) != 0) {
4187 					ahc_outb(ahc, HNSCB_QOFF,
4188 						 ahc->qinfifonext);
4189 				} else {
4190 					ahc_outb(ahc, KERNEL_QINPOS,
4191 						 ahc->qinfifonext);
4192 				}
4193 				scb->ccb->ccb_h.timeout_ch =
4194 				    timeout(ahc_timeout, (caddr_t)scb, 2 * hz);
4195 				unpause_sequencer(ahc, /*unpause_always*/FALSE);
4196 			} else {
4197 				/* Go "immediatly" to the bus reset */
4198 				/* This shouldn't happen */
4199 				ahc_set_recoveryscb(ahc, scb);
4200 				xpt_print_path(scb->ccb->ccb_h.path);
4201 				printf("SCB %d: Immediate reset.  "
4202 					"Flags = 0x%x\n", scb->hscb->tag,
4203 					scb->flags);
4204 				goto bus_reset;
4205 			}
4206 		}
4207 	}
4208 	splx(s);
4209 }
4210 
4211 /*
4212  * Look through the SCB array of the card and attempt to find the
4213  * hardware SCB that corresponds to the passed in SCB.  Return
4214  * SCB_LIST_NULL if unsuccessful.  This routine assumes that the
4215  * card is already paused.
4216  */
4217 static u_int8_t
4218 ahc_find_scb(struct ahc_softc *ahc, struct scb *scb)
4219 {
4220 	u_int8_t saved_scbptr;
4221 	u_int8_t curindex;
4222 
4223 	saved_scbptr = ahc_inb(ahc, SCBPTR);
4224 	for (curindex = 0; curindex < ahc->scb_data->maxhscbs; curindex++) {
4225 		ahc_outb(ahc, SCBPTR, curindex);
4226 		if (ahc_inb(ahc, SCB_TAG) == scb->hscb->tag)
4227 			break;
4228 	}
4229 	ahc_outb(ahc, SCBPTR, saved_scbptr);
4230 	if (curindex >= ahc->scb_data->maxhscbs)
4231 		curindex = SCB_LIST_NULL;
4232 
4233 	return curindex;
4234 }
4235 
4236 static int
4237 ahc_search_qinfifo(struct ahc_softc *ahc, int target, char channel,
4238 		   int lun, u_int8_t tag, u_int32_t status,
4239 		   ahc_search_action action)
4240 {
4241 	struct	 scb *scbp;
4242 	u_int8_t qinpos;
4243 	u_int8_t qintail;
4244 	int	 found;
4245 
4246 	qinpos = ahc_inb(ahc, QINPOS);
4247 	qintail = ahc->qinfifonext;
4248 	found = 0;
4249 
4250 	/*
4251 	 * Start with an empty queue.  Entries that are not chosen
4252 	 * for removal will be re-added to the queue as we go.
4253 	 */
4254 	ahc->qinfifonext = qinpos;
4255 
4256 	while (qinpos != qintail) {
4257 		scbp = ahc->scb_data->scbarray[ahc->qinfifo[qinpos]];
4258 		if (ahc_match_scb(scbp, target, channel, lun, tag)) {
4259 			/*
4260 			 * We found an scb that needs to be removed.
4261 			 */
4262 			switch (action) {
4263 			case SEARCH_COMPLETE:
4264 				if (ahc_ccb_status(scbp->ccb) == CAM_REQ_INPROG)
4265 					ahc_set_ccb_status(scbp->ccb, status);
4266 				ahc_freeze_ccb(scbp->ccb);
4267 				ahc_done(ahc, scbp);
4268 				break;
4269 			case SEARCH_COUNT:
4270 				ahc->qinfifo[ahc->qinfifonext++] =
4271 				    scbp->hscb->tag;
4272 				break;
4273 			case SEARCH_REMOVE:
4274 				break;
4275 			}
4276 			found++;
4277 		} else {
4278 			ahc->qinfifo[ahc->qinfifonext++] = scbp->hscb->tag;
4279 		}
4280 		qinpos++;
4281 	}
4282 
4283 	if ((ahc->features & AHC_QUEUE_REGS) != 0) {
4284 		ahc_outb(ahc, HNSCB_QOFF, ahc->qinfifonext);
4285 	} else {
4286 		ahc_outb(ahc, KERNEL_QINPOS, ahc->qinfifonext);
4287 	}
4288 
4289 	return (found);
4290 }
4291 
4292 
4293 /*
4294  * Abort all SCBs that match the given description (target/channel/lun/tag),
4295  * setting their status to the passed in status if the status has not already
4296  * been modified from CAM_REQ_INPROG.  This routine assumes that the sequencer
4297  * is paused before it is called.
4298  */
4299 static int
4300 ahc_abort_scbs(struct ahc_softc *ahc, int target, char channel,
4301 	       int lun, u_int8_t tag, u_int32_t status)
4302 {
4303 	struct	 scb *scbp;
4304 	u_int8_t active_scb;
4305 	int	 i;
4306 	int	 found;
4307 
4308 	/* restore this when we're done */
4309 	active_scb = ahc_inb(ahc, SCBPTR);
4310 
4311 	found = ahc_search_qinfifo(ahc, target, channel, lun, tag,
4312 				   CAM_REQUEUE_REQ, SEARCH_COMPLETE);
4313 
4314 	/*
4315 	 * Search waiting for selection list.
4316 	 */
4317 	{
4318 		u_int8_t next, prev;
4319 
4320 		next = ahc_inb(ahc, WAITING_SCBH);  /* Start at head of list. */
4321 		prev = SCB_LIST_NULL;
4322 
4323 		while (next != SCB_LIST_NULL) {
4324 			u_int8_t scb_index;
4325 
4326 			ahc_outb(ahc, SCBPTR, next);
4327 			scb_index = ahc_inb(ahc, SCB_TAG);
4328 			if (scb_index >= ahc->scb_data->numscbs) {
4329 				panic("Waiting List inconsistency. "
4330 				      "SCB index == %d, yet numscbs == %d.",
4331 				      scb_index, ahc->scb_data->numscbs);
4332 			}
4333 			scbp = ahc->scb_data->scbarray[scb_index];
4334 			if (ahc_match_scb(scbp, target, channel, lun, tag)) {
4335 
4336 				next = ahc_abort_wscb(ahc, next, prev);
4337 			} else {
4338 
4339 				prev = next;
4340 				next = ahc_inb(ahc, SCB_NEXT);
4341 			}
4342 		}
4343 	}
4344 	/*
4345 	 * Go through the disconnected list and remove any entries we
4346 	 * have queued for completion, 0'ing their control byte too.
4347 	 */
4348 	{
4349 		u_int8_t next, prev;
4350 
4351 		next = ahc_inb(ahc, DISCONNECTED_SCBH);
4352 		prev = SCB_LIST_NULL;
4353 
4354 		while (next != SCB_LIST_NULL) {
4355 			u_int8_t scb_index;
4356 
4357 			ahc_outb(ahc, SCBPTR, next);
4358 			scb_index = ahc_inb(ahc, SCB_TAG);
4359 			if (scb_index >= ahc->scb_data->numscbs) {
4360 				panic("Disconnected List inconsistency. "
4361 				      "SCB index == %d, yet numscbs == %d.",
4362 				      scb_index, ahc->scb_data->numscbs);
4363 			}
4364 			scbp = ahc->scb_data->scbarray[scb_index];
4365 			if (ahc_match_scb(scbp, target, channel, lun, tag)) {
4366 				next = ahc_rem_scb_from_disc_list(ahc, prev,
4367 								  next);
4368 			} else {
4369 				prev = next;
4370 				next = ahc_inb(ahc, SCB_NEXT);
4371 			}
4372 		}
4373 	}
4374 	/*
4375 	 * Go through the hardware SCB array looking for commands that
4376 	 * were active but not on any list.
4377 	 */
4378 	for(i = 0; i < ahc->scb_data->maxhscbs; i++) {
4379 		u_int8_t scbid;
4380 
4381 		ahc_outb(ahc, SCBPTR, i);
4382 		scbid = ahc_inb(ahc, SCB_TAG);
4383 		if (scbid < ahc->scb_data->numscbs) {
4384 			scbp = ahc->scb_data->scbarray[scbid];
4385 			if (ahc_match_scb(scbp, target, channel, lun, tag)) {
4386 				ahc_add_curscb_to_free_list(ahc);
4387                         }
4388 		}
4389 	}
4390 	/*
4391 	 * Go through the pending CCB list and look for
4392 	 * commands for this target that are still active.
4393 	 * These are other tagged commands that were
4394 	 * disconnected when the reset occured.
4395 	 */
4396 	{
4397 		struct ccb_hdr *ccb_h;
4398 
4399 
4400 		ccb_h = ahc->pending_ccbs.lh_first;
4401 
4402 		while (ccb_h != NULL) {
4403 			scbp = (struct scb *)ccb_h->ccb_scb_ptr;
4404 			ccb_h = ccb_h->sim_links.le.le_next;
4405 			if (ahc_match_scb(scbp, target, channel, lun, tag)) {
4406 				if (ahc_ccb_status(scbp->ccb) == CAM_REQ_INPROG)
4407 					ahc_set_ccb_status(scbp->ccb, status);
4408 				ahc_freeze_ccb(scbp->ccb);
4409 				ahc_done(ahc, scbp);
4410 				found++;
4411 			}
4412 		}
4413 	}
4414 	ahc_outb(ahc, SCBPTR, active_scb);
4415 	return found;
4416 }
4417 
4418 static u_int8_t
4419 ahc_rem_scb_from_disc_list(struct ahc_softc *ahc, u_int8_t prev, u_int8_t scbptr)
4420 {
4421 	u_int8_t next;
4422 
4423 	ahc_outb(ahc, SCBPTR, scbptr);
4424 	next = ahc_inb(ahc, SCB_NEXT);
4425 
4426 	ahc_outb(ahc, SCB_CONTROL, 0);
4427 
4428 	ahc_add_curscb_to_free_list(ahc);
4429 
4430 	if (prev != SCB_LIST_NULL) {
4431 		ahc_outb(ahc, SCBPTR, prev);
4432 		ahc_outb(ahc, SCB_NEXT, next);
4433 	} else
4434 		ahc_outb(ahc, DISCONNECTED_SCBH, next);
4435 
4436 	return next;
4437 }
4438 
4439 static void
4440 ahc_add_curscb_to_free_list(struct ahc_softc *ahc)
4441 {
4442 	/* Invalidate the tag so that ahc_find_scb doesn't think it's active */
4443 	ahc_outb(ahc, SCB_TAG, SCB_LIST_NULL);
4444 
4445 	ahc_outb(ahc, SCB_NEXT, ahc_inb(ahc, FREE_SCBH));
4446 	ahc_outb(ahc, FREE_SCBH, ahc_inb(ahc, SCBPTR));
4447 }
4448 
4449 /*
4450  * Manipulate the waiting for selection list and return the
4451  * scb that follows the one that we remove.
4452  */
4453 static u_int8_t
4454 ahc_abort_wscb(struct ahc_softc *ahc, u_int8_t scbpos, u_int8_t prev)
4455 {
4456 	u_int8_t curscb, next;
4457 
4458 	/*
4459 	 * Select the SCB we want to abort and
4460 	 * pull the next pointer out of it.
4461 	 */
4462 	curscb = ahc_inb(ahc, SCBPTR);
4463 	ahc_outb(ahc, SCBPTR, scbpos);
4464 	next = ahc_inb(ahc, SCB_NEXT);
4465 
4466 	/* Clear the necessary fields */
4467 	ahc_outb(ahc, SCB_CONTROL, 0);
4468 
4469 	ahc_add_curscb_to_free_list(ahc);
4470 
4471 	/* update the waiting list */
4472 	if (prev == SCB_LIST_NULL) {
4473 		/* First in the list */
4474 		ahc_outb(ahc, WAITING_SCBH, next);
4475 
4476 		/*
4477 		 * Ensure we aren't attempting to perform
4478 		 * selection for this entry.
4479 		 */
4480 		ahc_outb(ahc, SCSISEQ, (ahc_inb(ahc, SCSISEQ) & ~ENSELO));
4481 	} else {
4482 		/*
4483 		 * Select the scb that pointed to us
4484 		 * and update its next pointer.
4485 		 */
4486 		ahc_outb(ahc, SCBPTR, prev);
4487 		ahc_outb(ahc, SCB_NEXT, next);
4488 	}
4489 
4490 	/*
4491 	 * Point us back at the original scb position.
4492 	 */
4493 	ahc_outb(ahc, SCBPTR, curscb);
4494 	return next;
4495 }
4496 
4497 static void
4498 ahc_clear_intstat(struct ahc_softc *ahc)
4499 {
4500 	/* Clear any interrupt conditions this may have caused */
4501 	ahc_outb(ahc, CLRSINT0, CLRSELDO|CLRSELDI|CLRSELINGO);
4502 	ahc_outb(ahc, CLRSINT1, CLRSELTIMEO|CLRATNO|CLRSCSIRSTI
4503 				|CLRBUSFREE|CLRSCSIPERR|CLRPHASECHG|
4504 				CLRREQINIT);
4505 	ahc_outb(ahc, CLRINT, CLRSCSIINT);
4506 }
4507 
4508 static void
4509 ahc_reset_current_bus(struct ahc_softc *ahc)
4510 {
4511 	u_int8_t scsiseq;
4512 
4513 	ahc_outb(ahc, SIMODE1, ahc_inb(ahc, SIMODE1) & ~ENSCSIRST);
4514 	scsiseq = ahc_inb(ahc, SCSISEQ);
4515 	ahc_outb(ahc, SCSISEQ, scsiseq | SCSIRSTO);
4516 	DELAY(AHC_BUSRESET_DELAY);
4517 	/* Turn off the bus reset */
4518 	ahc_outb(ahc, SCSISEQ, scsiseq & ~SCSIRSTO);
4519 
4520 	ahc_clear_intstat(ahc);
4521 
4522 	/* Re-enable reset interrupts */
4523 	ahc_outb(ahc, SIMODE1, ahc_inb(ahc, SIMODE1) | ENSCSIRST);
4524 }
4525 
4526 static int
4527 ahc_reset_channel(struct ahc_softc *ahc, char channel, int initiate_reset)
4528 {
4529 	u_int	  target, max_target;
4530 	int	  found;
4531 	u_int8_t  sblkctl;
4532 	char	  cur_channel;
4533 	struct	  cam_path *path;
4534 
4535 	pause_sequencer(ahc);
4536 	/*
4537 	 * Clean up all the state information for the
4538 	 * pending transactions on this bus.
4539 	 */
4540 	found = ahc_abort_scbs(ahc, ALL_TARGETS, channel, ALL_LUNS,
4541 			       SCB_LIST_NULL, CAM_SCSI_BUS_RESET);
4542 	path = channel == 'B' ? ahc->path_b : ahc->path;
4543 
4544 	/* Notify the XPT that a bus reset occurred */
4545 	xpt_async(AC_BUS_RESET, path, NULL);
4546 
4547 	/*
4548 	 * Revert to async/narrow transfers until we renegotiate.
4549 	 */
4550 	max_target = (ahc->features & AHC_WIDE) ? 15 : 7;
4551 	for (target = 0; target <= max_target; target++) {
4552 		struct ahc_devinfo devinfo;
4553 
4554 		ahc_compile_devinfo(&devinfo, target, channel);
4555 		ahc_set_width(ahc, &devinfo, path, MSG_EXT_WDTR_BUS_8_BIT,
4556 			      AHC_TRANS_CUR);
4557 		ahc_set_syncrate(ahc, &devinfo, path, /*syncrate*/NULL,
4558 				 /*period*/0, /*offset*/0, AHC_TRANS_CUR);
4559 	}
4560 
4561 	/*
4562 	 * Reset the bus if we are initiating this reset and
4563 	 * restart/unpause the sequencer
4564 	 */
4565 	sblkctl = ahc_inb(ahc, SBLKCTL);
4566 	cur_channel = 'A';
4567 	if ((ahc->features & AHC_TWIN) != 0
4568 	 && ((sblkctl & SELBUSB) != 0))
4569 	    cur_channel = 'B';
4570 	if (cur_channel != channel) {
4571 		/* Case 1: Command for another bus is active
4572 		 * Stealthily reset the other bus without
4573 		 * upsetting the current bus.
4574 		 */
4575 		ahc_outb(ahc, SBLKCTL, sblkctl ^ SELBUSB);
4576 		ahc_outb(ahc, SIMODE1,
4577 			 ahc_inb(ahc, SIMODE1) & ~(ENBUSFREE|ENREQINIT));
4578 		ahc_outb(ahc, SCSISEQ,
4579 			 ahc_inb(ahc, SCSISEQ) & (ENSELI|ENRSELI|ENAUTOATNP));
4580 		if (initiate_reset)
4581 			ahc_reset_current_bus(ahc);
4582 		ahc_clear_intstat(ahc);
4583 		ahc_outb(ahc, SBLKCTL, sblkctl);
4584 		unpause_sequencer(ahc, /*unpause_always*/FALSE);
4585 	} else {
4586 		/* Case 2: A command from this bus is active or we're idle */
4587 		ahc_outb(ahc, SIMODE1,
4588 			 ahc_inb(ahc, SIMODE1) & ~(ENBUSFREE|ENREQINIT));
4589 		ahc->flags &= ~AHC_HANDLING_REQINITS;
4590 		ahc->msg_type = MSG_TYPE_NONE;
4591 		ahc_outb(ahc, SCSISEQ,
4592 			 ahc_inb(ahc, SCSISEQ) & (ENSELI|ENRSELI|ENAUTOATNP));
4593 		if (initiate_reset)
4594 			ahc_reset_current_bus(ahc);
4595 		ahc_clear_intstat(ahc);
4596 		restart_sequencer(ahc);
4597 	}
4598 	return found;
4599 }
4600 
4601 static int
4602 ahc_match_scb (struct scb *scb, int target, char channel,
4603 	       int lun, u_int8_t tag)
4604 {
4605 	int targ = SCB_TARGET(scb);
4606 	char chan = SCB_CHANNEL(scb);
4607 	int slun = SCB_LUN(scb);
4608 	int match;
4609 
4610 	match = ((chan == channel) || (channel == ALL_CHANNELS));
4611 	if (match != 0)
4612 		match = ((targ == target) || (target == ALL_TARGETS));
4613 	if (match != 0)
4614 		match = ((lun == slun) || (lun == ALL_LUNS));
4615 	if (match != 0)
4616 		match = ((tag == scb->hscb->tag) || (tag == SCB_LIST_NULL));
4617 
4618 	return match;
4619 }
4620 
4621 static void
4622 ahc_construct_sdtr(struct ahc_softc *ahc, u_int8_t period, u_int8_t offset)
4623 {
4624 	ahc->msg_buf[ahc->msg_index++] = MSG_EXTENDED;
4625 	ahc->msg_buf[ahc->msg_index++] = MSG_EXT_SDTR_LEN;
4626 	ahc->msg_buf[ahc->msg_index++] = MSG_EXT_SDTR;
4627 	ahc->msg_buf[ahc->msg_index++] = period;
4628 	ahc->msg_buf[ahc->msg_index++] = offset;
4629 	ahc->msg_len += 5;
4630 }
4631 
4632 static void
4633 ahc_construct_wdtr(struct ahc_softc *ahc, u_int8_t bus_width)
4634 {
4635 	ahc->msg_buf[ahc->msg_index++] = MSG_EXTENDED;
4636 	ahc->msg_buf[ahc->msg_index++] = MSG_EXT_WDTR_LEN;
4637 	ahc->msg_buf[ahc->msg_index++] = MSG_EXT_WDTR;
4638 	ahc->msg_buf[ahc->msg_index++] = bus_width;
4639 	ahc->msg_len += 4;
4640 }
4641 
4642 static void
4643 ahc_calc_residual(struct scb *scb)
4644 {
4645 	struct	hardware_scb *hscb;
4646 
4647 	hscb = scb->hscb;
4648 
4649 	/*
4650 	 * If the disconnected flag is still set, this is bogus
4651 	 * residual information left over from a sequencer
4652 	 * pagin/pageout, so ignore this case.
4653 	 */
4654 	if ((scb->hscb->control & DISCONNECTED) == 0) {
4655 		u_int32_t resid;
4656 		int	  resid_sgs;
4657 		int	  sg;
4658 
4659 		/*
4660 		 * Remainder of the SG where the transfer
4661 		 * stopped.
4662 		 */
4663 		resid = (hscb->residual_data_count[2] << 16)
4664 		      |	(hscb->residual_data_count[1] <<8)
4665 		      |	(hscb->residual_data_count[0]);
4666 
4667 		/*
4668 		 * Add up the contents of all residual
4669 		 * SG segments that are after the SG where
4670 		 * the transfer stopped.
4671 		 */
4672 		resid_sgs = scb->hscb->residual_SG_count - 1/*current*/;
4673 		sg = scb->sg_count - resid_sgs - 1/*first SG*/;
4674 		while (resid_sgs > 0) {
4675 
4676 			resid += scb->ahc_dma[sg].len;
4677 			sg++;
4678 			resid_sgs--;
4679 		}
4680 		if ((scb->flags & SCB_SENSE) == 0) {
4681 
4682 			scb->ccb->csio.resid = resid;
4683 		} else {
4684 
4685 			scb->ccb->csio.sense_resid = resid;
4686 		}
4687 	}
4688 
4689 	/*
4690 	 * Clean out the residual information in this SCB for its
4691 	 * next consumer.
4692 	 */
4693 	hscb->residual_data_count[0] = 0;
4694 	hscb->residual_data_count[1] = 0;
4695 	hscb->residual_data_count[2] = 0;
4696 	hscb->residual_SG_count = 0;
4697 
4698 #ifdef AHC_DEBUG
4699 	if (ahc_debug & AHC_SHOWMISC) {
4700 		sc_print_addr(xs->sc_link);
4701 		printf("Handled Residual of %ld bytes\n" ,xs->resid);
4702 	}
4703 #endif
4704 }
4705 
4706 static void
4707 ahc_update_pending_syncrates(struct ahc_softc *ahc)
4708 {
4709 	/*
4710 	 * Traverse the pending SCB list and ensure that all of the
4711 	 * SCBs there have the proper settings.
4712 	 */
4713 	struct	ccb_hdr *ccbh;
4714 	int	pending_ccb_count;
4715 	int	i;
4716 	u_int	saved_scbptr;
4717 
4718 	/*
4719 	 * We were able to complete the command successfully,
4720 	 * so reinstate the timeouts for all other pending
4721 	 * commands.
4722 	 */
4723 	ccbh = LIST_FIRST(&ahc->pending_ccbs);
4724 	pending_ccb_count = 0;
4725 	while (ccbh != NULL) {
4726 		struct scb *pending_scb;
4727 		struct hardware_scb *pending_hscb;
4728 		struct ahc_target_tinfo *tinfo;
4729 		struct ahc_devinfo devinfo;
4730 
4731 		pending_scb = (struct scb *)ccbh->ccb_scb_ptr;
4732 		pending_hscb = pending_scb->hscb;
4733 		ahc_compile_devinfo(&devinfo, SCB_TARGET(pending_scb),
4734 				    SCB_CHANNEL(pending_scb));
4735 		tinfo = &ahc->transinfo[devinfo.target_offset];
4736 		pending_hscb->control &= ~ULTRAENB;
4737 		if ((ahc->ultraenb & devinfo.target_mask) != 0)
4738 			pending_hscb->control |= ULTRAENB;
4739 		pending_hscb->scsirate = tinfo->scsirate;
4740 		pending_hscb->scsioffset = tinfo->current.offset;
4741 		pending_ccb_count++;
4742 		ccbh = LIST_NEXT(ccbh, sim_links.le);
4743 	}
4744 
4745 	if (pending_ccb_count == 0)
4746 		return;
4747 
4748 	saved_scbptr = ahc_inb(ahc, SCBPTR);
4749 	/* Ensure that the hscbs down on the card match the new information */
4750 	for (i = 0; i < ahc->scb_data->maxhscbs; i++) {
4751 		u_int scb_tag;
4752 
4753 		ahc_outb(ahc, SCBPTR, i);
4754 		scb_tag = ahc_inb(ahc, SCB_TAG);
4755 		if (scb_tag != SCB_LIST_NULL) {
4756 			struct	scb *pending_scb;
4757 			struct	hardware_scb *pending_hscb;
4758 			struct	ahc_target_tinfo *tinfo;
4759 			struct	ahc_devinfo devinfo;
4760 			u_int	control;
4761 
4762 			pending_scb = ahc->scb_data->scbarray[scb_tag];
4763 			pending_hscb = pending_scb->hscb;
4764 			ahc_compile_devinfo(&devinfo, SCB_TARGET(pending_scb),
4765 					    SCB_CHANNEL(pending_scb));
4766 			tinfo = &ahc->transinfo[devinfo.target_offset];
4767 			control = ahc_inb(ahc, SCB_CONTROL);
4768 			control &= ~ULTRAENB;
4769 			if ((ahc->ultraenb & devinfo.target_mask) != 0)
4770 				control |= ULTRAENB;
4771 			ahc_outb(ahc, SCB_CONTROL, control);
4772 			ahc_outb(ahc, SCB_SCSIRATE, tinfo->scsirate);
4773 			ahc_outb(ahc, SCB_SCSIOFFSET, tinfo->current.offset);
4774 		}
4775 	}
4776 	ahc_outb(ahc, SCBPTR, saved_scbptr);
4777 }
4778 
4779 static void
4780 ahc_dump_targcmd(struct target_cmd *cmd)
4781 {
4782 	u_int8_t *byte;
4783 	u_int8_t *last_byte;
4784 	int	  initiator;
4785 	int	  target;
4786 	int	  lun;
4787 	int i;
4788 
4789 	byte = &cmd->icl;
4790 	/* Debugging info for received commands */
4791 	last_byte = &cmd[1].icl;
4792 
4793 	i = 0;
4794 	while (byte < last_byte) {
4795 		if (i == 0)
4796 			printf("\t");
4797 		printf("%#x", *byte++);
4798 		i++;
4799 		if (i == 8) {
4800 			printf("\n");
4801 			i = 0;
4802 		} else {
4803 			printf(", ");
4804 		}
4805 	}
4806 }
4807 
4808 static void
4809 ahc_shutdown(int howto, void *arg)
4810 {
4811 	struct	ahc_softc *ahc;
4812 	int	i;
4813 
4814 	ahc = (struct ahc_softc *)arg;
4815 
4816 	ahc_reset(ahc);
4817 	ahc_outb(ahc, SCSISEQ, 0);
4818 	ahc_outb(ahc, SXFRCTL0, 0);
4819 	ahc_outb(ahc, DSPCISTATUS, 0);
4820 
4821 	for (i = TARG_SCSIRATE; i < HA_274_BIOSCTRL; i++)
4822 		ahc_outb(ahc, i, 0);
4823 }
4824