xref: /netbsd-src/sys/dev/ic/sunscpal.c (revision 404fbe5fb94ca1e054339640cabb2801ce52dd30)
1 /*	$NetBSD: sunscpal.c,v 1.24 2008/12/16 22:35:31 christos Exp $	*/
2 
3 /*
4  * Copyright (c) 2001 Matthew Fredette
5  * Copyright (c) 1995 David Jones, Gordon W. Ross
6  * Copyright (c) 1994 Jarle Greipsland
7  * All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer.
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in the
16  *    documentation and/or other materials provided with the distribution.
17  * 3. The name of the authors may not be used to endorse or promote products
18  *    derived from this software without specific prior written permission.
19  * 4. All advertising materials mentioning features or use of this software
20  *    must display the following acknowledgement:
21  *      This product includes software developed by
22  *      David Jones and Gordon Ross
23  *
24  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
25  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
26  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
27  * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
28  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
29  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
30  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
31  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
33  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34  */
35 
36 /*
37  * This is a machine-independent driver for the Sun "sc"
38  * SCSI Bus Controller (SBC).
39  *
40  * This code should work with any memory-mapped card,
41  * and can be shared by multiple adapters that address
42  * the card with different register offset spacings.
43  * (This can happen on the atari, for example.)
44  *
45  * Credits, history:
46  *
47  * Matthew Fredette completely copied revision 1.38 of
48  * ncr5380sbc.c, and then heavily modified it to match
49  * the Sun sc PAL.  The remaining credits are for
50  * ncr5380sbc.c:
51  *
52  * David Jones is the author of most of the code that now
53  * appears in this file, and was the architect of the
54  * current overall structure (MI/MD code separation, etc.)
55  *
56  * Gordon Ross integrated the message phase code, added lots of
57  * comments about what happens when and why (re. SCSI spec.),
58  * debugged some reentrance problems, and added several new
59  * "hooks" needed for the Sun3 "si" adapters.
60  *
61  * The message in/out code was taken nearly verbatim from
62  * the aic6360 driver by Jarle Greipsland.
63  *
64  * Several other NCR5380 drivers were used for reference
65  * while developing this driver, including work by:
66  *   The Alice Group (mac68k port) namely:
67  *       Allen K. Briggs, Chris P. Caputo, Michael L. Finch,
68  *       Bradley A. Grantham, and Lawrence A. Kesteloot
69  *   Michael L. Hitch (amiga drivers: sci.c)
70  *   Leo Weppelman (atari driver: ncr5380.c)
71  * There are others too.  Thanks, everyone.
72  *
73  * Transliteration to bus_space() performed 9/17/98 by
74  * John Ruschmeyer (jruschme@exit109.com) for i386 'nca' driver.
75  * Thank you all.
76  */
77 
78 #include <sys/cdefs.h>
79 __KERNEL_RCSID(0, "$NetBSD: sunscpal.c,v 1.24 2008/12/16 22:35:31 christos Exp $");
80 
81 #include "opt_ddb.h"
82 
83 #include <sys/param.h>
84 #include <sys/systm.h>
85 #include <sys/kernel.h>
86 #include <sys/errno.h>
87 #include <sys/malloc.h>
88 #include <sys/device.h>
89 #include <sys/buf.h>
90 #include <sys/proc.h>
91 #include <sys/user.h>
92 
93 #include <dev/scsipi/scsi_all.h>
94 #include <dev/scsipi/scsipi_all.h>
95 #include <dev/scsipi/scsipi_debug.h>
96 #include <dev/scsipi/scsi_message.h>
97 #include <dev/scsipi/scsiconf.h>
98 
99 #ifdef DDB
100 #include <ddb/db_output.h>
101 #endif
102 
103 #include <dev/ic/sunscpalreg.h>
104 #include <dev/ic/sunscpalvar.h>
105 
106 static void	sunscpal_reset_scsibus(struct sunscpal_softc *);
107 static void	sunscpal_sched(struct sunscpal_softc *);
108 static void	sunscpal_done(struct sunscpal_softc *);
109 
110 static int	sunscpal_select(struct sunscpal_softc *, struct sunscpal_req *);
111 static void	sunscpal_reselect(struct sunscpal_softc *);
112 
113 static int	sunscpal_msg_in(struct sunscpal_softc *);
114 static int	sunscpal_msg_out(struct sunscpal_softc *);
115 static int	sunscpal_data_xfer(struct sunscpal_softc *, int);
116 static int	sunscpal_command(struct sunscpal_softc *);
117 static int	sunscpal_status(struct sunscpal_softc *);
118 static void	sunscpal_machine(struct sunscpal_softc *);
119 
120 void	sunscpal_abort(struct sunscpal_softc *);
121 void	sunscpal_cmd_timeout(void *);
122 /*
123  * Action flags returned by the info_transfer functions:
124  * (These determine what happens next.)
125  */
126 #define ACT_CONTINUE	0x00	/* No flags: expect another phase */
127 #define ACT_DISCONNECT	0x01	/* Target is disconnecting */
128 #define ACT_CMD_DONE	0x02	/* Need to call scsipi_done() */
129 #define ACT_RESET_BUS	0x04	/* Need bus reset (cmd timeout) */
130 #define ACT_WAIT_DMA	0x10	/* Wait for DMA to complete */
131 
132 /*****************************************************************
133  * Debugging stuff
134  *****************************************************************/
135 
136 #ifndef DDB
137 /* This is used only in recoverable places. */
138 #ifndef Debugger
139 #define Debugger() printf("Debug: sunscpal.c:%d\n", __LINE__)
140 #endif
141 #endif
142 
143 #ifdef	SUNSCPAL_DEBUG
144 
145 #define	SUNSCPAL_DBG_BREAK	1
146 #define	SUNSCPAL_DBG_CMDS	2
147 #define	SUNSCPAL_DBG_DMA	4
148 int sunscpal_debug = 0;
149 #define	SUNSCPAL_BREAK() \
150 	do { if (sunscpal_debug & SUNSCPAL_DBG_BREAK) Debugger(); } while (0)
151 static void sunscpal_show_scsi_cmd(struct scsipi_xfer *);
152 #ifdef DDB
153 void	sunscpal_clear_trace(void);
154 void	sunscpal_show_trace(void);
155 void	sunscpal_show_req(struct sunscpal_req *);
156 void	sunscpal_show_state(void);
157 #endif	/* DDB */
158 #else	/* SUNSCPAL_DEBUG */
159 
160 #define	SUNSCPAL_BREAK() 		/* nada */
161 #define sunscpal_show_scsi_cmd(xs) /* nada */
162 
163 #endif	/* SUNSCPAL_DEBUG */
164 
165 static const char *
166 phase_names[8] = {
167 	"DATA_OUT",
168 	"DATA_IN",
169 	"COMMAND",
170 	"STATUS",
171 	"UNSPEC1",
172 	"UNSPEC2",
173 	"MSG_OUT",
174 	"MSG_IN",
175 };
176 
177 #ifdef SUNSCPAL_USE_BUS_DMA
178 static void sunscpal_dma_alloc(struct sunscpal_softc *);
179 static void sunscpal_dma_free(struct sunscpal_softc *);
180 static void sunscpal_dma_setup(struct sunscpal_softc *);
181 #else
182 #define sunscpal_dma_alloc(sc) (*sc->sc_dma_alloc)(sc)
183 #define sunscpal_dma_free(sc) (*sc->sc_dma_free)(sc)
184 #define sunscpal_dma_setup(sc) (*sc->sc_dma_setup)(sc)
185 #endif
186 static void sunscpal_minphys(struct buf *);
187 
188 /*****************************************************************
189  * Actual chip control
190  *****************************************************************/
191 
192 /*
193  * XXX: These timeouts might need to be tuned...
194  */
195 
196 /* This one is used when waiting for a phase change. (X100uS.) */
197 int sunscpal_wait_phase_timo = 1000 * 10 * 300;	/* 5 min. */
198 
199 /* These are used in the following inline functions. */
200 int sunscpal_wait_req_timo = 1000 * 50;	/* X2 = 100 mS. */
201 int sunscpal_wait_nrq_timo = 1000 * 25;	/* X2 =  50 mS. */
202 
203 static inline int sunscpal_wait_req(struct sunscpal_softc *);
204 static inline int sunscpal_wait_not_req(struct sunscpal_softc *);
205 static inline void sunscpal_sched_msgout(struct sunscpal_softc *, int);
206 
207 /* Return zero on success. */
208 static inline int sunscpal_wait_req(struct sunscpal_softc *sc)
209 {
210 	int timo = sunscpal_wait_req_timo;
211 
212 	for (;;) {
213 		if (SUNSCPAL_READ_2(sc, sunscpal_icr) & SUNSCPAL_ICR_REQUEST) {
214 			timo = 0;	/* return 0 */
215 			break;
216 		}
217 		if (--timo < 0)
218 			break;	/* return -1 */
219 		delay(2);
220 	}
221 	return timo;
222 }
223 
224 /* Return zero on success. */
225 static inline int sunscpal_wait_not_req(struct sunscpal_softc *sc)
226 {
227 	int timo = sunscpal_wait_nrq_timo;
228 
229 	for (;;) {
230 		if ((SUNSCPAL_READ_2(sc, sunscpal_icr) &
231 		    SUNSCPAL_ICR_REQUEST) == 0) {
232 			timo = 0;	/* return 0 */
233 			break;
234 		}
235 		if (--timo < 0)
236 			break;	/* return -1 */
237 		delay(2);
238 	}
239 	return timo;
240 }
241 
242 /*
243  * These functions control DMA functions in the chipset independent of
244  * the host DMA implementation.
245  */
246 static void sunscpal_dma_start(struct sunscpal_softc *);
247 static void sunscpal_dma_poll(struct sunscpal_softc *);
248 static void sunscpal_dma_stop(struct sunscpal_softc *);
249 
250 static void
251 sunscpal_dma_start(struct sunscpal_softc *sc)
252 {
253 	struct sunscpal_req *sr = sc->sc_current;
254 	int xlen;
255 	uint16_t icr;
256 
257 	xlen = sc->sc_reqlen;
258 
259 	/* Let'er rip! */
260 	icr = SUNSCPAL_READ_2(sc, sunscpal_icr);
261 	icr |= SUNSCPAL_ICR_DMA_ENABLE |
262 	    ((xlen & 1) ? 0 : SUNSCPAL_ICR_WORD_MODE) |
263 	    ((sr->sr_flags & SR_IMMED) ? 0 : SUNSCPAL_ICR_INTERRUPT_ENABLE);
264 	SUNSCPAL_WRITE_2(sc, sunscpal_icr, icr);
265 
266 	sc->sc_state |= SUNSCPAL_DOINGDMA;
267 
268 #ifdef	SUNSCPAL_DEBUG
269 	if (sunscpal_debug & SUNSCPAL_DBG_DMA) {
270 		printf("%s: started, flags=0x%x\n",
271 		    __func__, sc->sc_state);
272 	}
273 #endif
274 }
275 
276 #define	ICR_MASK (SUNSCPAL_ICR_PARITY_ERROR | SUNSCPAL_ICR_BUS_ERROR | SUNSCPAL_ICR_INTERRUPT_REQUEST)
277 #define	POLL_TIMO	50000	/* X100 = 5 sec. */
278 
279 /*
280  * Poll (spin-wait) for DMA completion.
281  * Called right after xx_dma_start(), and
282  * xx_dma_stop() will be called next.
283  */
284 static void
285 sunscpal_dma_poll(struct sunscpal_softc *sc)
286 {
287 	struct sunscpal_req *sr = sc->sc_current;
288 	int tmo;
289 
290 	/* Make sure DMA started successfully. */
291 	if (sc->sc_state & SUNSCPAL_ABORTING)
292 		return;
293 
294 	/* Wait for any "DMA complete" or error bits. */
295 	tmo = POLL_TIMO;
296 	for (;;) {
297 		if (SUNSCPAL_READ_2(sc, sunscpal_icr) & ICR_MASK)
298 			break;
299 		if (--tmo <= 0) {
300 			printf("sc: DMA timeout (while polling)\n");
301 			/* Indicate timeout as MI code would. */
302 			sr->sr_flags |= SR_OVERDUE;
303 			break;
304 		}
305 		delay(100);
306 	}
307 	SUNSCPAL_TRACE("sunscpal_dma_poll: waited %d\n", POLL_TIMO - tmo);
308 
309 #ifdef	SUNSCPAL_DEBUG
310 	if (sunscpal_debug & SUNSCPAL_DBG_DMA) {
311 		char buffer[64];
312 		snprintb(buffer, sizeof(buffer),
313 		    SUNSCPAL_READ_2(sc, sunscpal_icr), SUNSCPAL_ICR_BITS);
314 		printf("%s: done, icr=%s\n", __func__, buffer);
315 	}
316 #endif
317 }
318 
319 static void
320 sunscpal_dma_stop(struct sunscpal_softc *sc)
321 {
322 	struct sunscpal_req *sr = sc->sc_current;
323 	struct scsipi_xfer *xs = sr->sr_xs;
324 	int resid, ntrans;
325 	uint16_t icr;
326 
327 	if ((sc->sc_state & SUNSCPAL_DOINGDMA) == 0) {
328 #ifdef	DEBUG
329 		printf("%s: DMA not running\n", __func__);
330 #endif
331 		return;
332 	}
333 	sc->sc_state &= ~SUNSCPAL_DOINGDMA;
334 
335 	/* First, halt the DMA engine. */
336 	icr = SUNSCPAL_READ_2(sc, sunscpal_icr);
337 	icr &= ~(SUNSCPAL_ICR_DMA_ENABLE | SUNSCPAL_ICR_WORD_MODE |
338 	    SUNSCPAL_ICR_INTERRUPT_ENABLE);
339 	SUNSCPAL_WRITE_2(sc, sunscpal_icr, icr);
340 
341 #ifdef	SUNSCPAL_USE_BUS_DMA
342 	/*
343 	 * XXX - this function is supposed to be independent of
344 	 * the host's DMA implementation.
345 	 */
346  {
347 	 sunscpal_dma_handle_t dh = sr->sr_dma_hand;
348 
349 	 /* sync the DMA map: */
350 	 bus_dmamap_sync(sc->sunscpal_dmat, dh->dh_dmamap, 0, dh->dh_maplen,
351 	     ((xs->xs_control & XS_CTL_DATA_OUT) == 0 ?
352 	    BUS_DMASYNC_POSTREAD : BUS_DMASYNC_POSTWRITE));
353  }
354 #endif /* SUNSCPAL_USE_BUS_DMA */
355 
356 
357 	if (icr & (SUNSCPAL_ICR_BUS_ERROR)) {
358 		char buffer[64];
359 		snprintb(buffer, sizeof(buffer), SUNSCPAL_ICR_BITS, icr);
360 		printf("sc: DMA error, icr=%s, reset\n", buffer);
361 		sr->sr_xs->error = XS_DRIVER_STUFFUP;
362 		sc->sc_state |= SUNSCPAL_ABORTING;
363 		goto out;
364 	}
365 
366 	/* Note that timeout may have set the error flag. */
367 	if (sc->sc_state & SUNSCPAL_ABORTING)
368 		goto out;
369 
370 	/* XXX: Wait for DMA to actually finish? */
371 
372 	/*
373 	 * Now try to figure out how much actually transferred
374 	 */
375 
376 	resid = SUNSCPAL_DMA_COUNT_FLIP(SUNSCPAL_READ_2(sc,
377 	    sunscpal_dma_count));
378 	ntrans = sc->sc_reqlen - resid;
379 
380 #ifdef	SUNSCPAL_DEBUG
381 	if (sunscpal_debug & SUNSCPAL_DBG_DMA) {
382 		printf("%s: resid=0x%x ntrans=0x%x\n",
383 		    __func__, resid, ntrans);
384 	}
385 #endif
386 
387 	if (ntrans < sc->sc_min_dma_len) {
388 		printf("sc: DMA count: 0x%x\n", resid);
389 		sc->sc_state |= SUNSCPAL_ABORTING;
390 		goto out;
391 	}
392 	if (ntrans > sc->sc_datalen)
393 		panic("%s: excess transfer", __func__);
394 
395 	/* Adjust data pointer */
396 	sc->sc_dataptr += ntrans;
397 	sc->sc_datalen -= ntrans;
398 
399 	/*
400 	 * After a read, we may need to clean-up
401 	 * "Left-over bytes" (yuck!)
402 	 */
403 	if (((xs->xs_control & XS_CTL_DATA_OUT) == 0) &&
404 	    ((icr & SUNSCPAL_ICR_ODD_LENGTH) != 0)) {
405 #ifdef DEBUG
406 		printf("sc: Got Left-over bytes!\n");
407 #endif
408 		*(sc->sc_dataptr++) = SUNSCPAL_READ_1(sc, sunscpal_data);
409 		sc->sc_datalen--;
410 	}
411 
412  out:
413 	SUNSCPAL_WRITE_2(sc, sunscpal_dma_count, SUNSCPAL_DMA_COUNT_FLIP(0));
414 
415 }
416 
417 /* Ask the target for a MSG_OUT phase. */
418 static inline void
419 sunscpal_sched_msgout(struct sunscpal_softc *sc, int msg_code)
420 {
421 	/*
422 	 * This controller does not allow you to assert ATN, which
423 	 * will eventually leave us with no option other than to reset
424 	 * the bus.  We keep this function as a placeholder, though,
425 	 * and this printf will eventually go away or get #ifdef'ed:
426 	 */
427 	printf("%s: trying to schedule 0x%0x\n", __func__, msg_code);
428 	sc->sc_msgpriq |= msg_code;
429 }
430 
431 int
432 sunscpal_pio_out(struct sunscpal_softc *sc, int phase, int count, uint8_t *data)
433 {
434 	int resid;
435 
436 	resid = count;
437 	while (resid > 0) {
438 		if (!SUNSCPAL_BUSY(sc)) {
439 			SUNSCPAL_TRACE("pio_out: lost BSY, resid=%d\n", resid);
440 			break;
441 		}
442 		if (sunscpal_wait_req(sc)) {
443 			SUNSCPAL_TRACE("pio_out: no REQ, resid=%d\n", resid);
444 			break;
445 		}
446 		if (SUNSCPAL_BUS_PHASE(SUNSCPAL_READ_2(sc, sunscpal_icr)) !=
447 		    phase)
448 			break;
449 
450 		/* Put the data on the bus. */
451 		if (data) {
452 			SUNSCPAL_BYTE_WRITE(sc, phase, *data++);
453 		} else {
454 			SUNSCPAL_BYTE_WRITE(sc, phase, 0);
455 		}
456 
457 		--resid;
458 	}
459 
460 	return count - resid;
461 }
462 
463 
464 int
465 sunscpal_pio_in(struct sunscpal_softc *sc, int phase, int count, uint8_t *data)
466 {
467 	int resid;
468 
469 	resid = count;
470 	while (resid > 0) {
471 		if (!SUNSCPAL_BUSY(sc)) {
472 			SUNSCPAL_TRACE("pio_in: lost BSY, resid=%d\n", resid);
473 			break;
474 		}
475 		if (sunscpal_wait_req(sc)) {
476 			SUNSCPAL_TRACE("pio_in: no REQ, resid=%d\n", resid);
477 			break;
478 		}
479 		/* A phase change is not valid until AFTER REQ rises! */
480 		if (SUNSCPAL_BUS_PHASE(SUNSCPAL_READ_2(sc, sunscpal_icr)) !=
481 		    phase)
482 			break;
483 
484 		/* Read the data bus. */
485 		if (data)
486 			*data++ = SUNSCPAL_BYTE_READ(sc, phase);
487 		else
488 			(void)SUNSCPAL_BYTE_READ(sc, phase);
489 
490 		--resid;
491 	}
492 
493 	return count - resid;
494 }
495 
496 
497 void
498 sunscpal_init(struct sunscpal_softc *sc)
499 {
500 	int i, j;
501 
502 #ifdef	SUNSCPAL_DEBUG
503 	sunscpal_debug_sc = sc;
504 #endif
505 
506 	for (i = 0; i < SUNSCPAL_OPENINGS; i++)
507 		sc->sc_ring[i].sr_xs = NULL;
508 	for (i = 0; i < 8; i++)
509 		for (j = 0; j < 8; j++)
510 			sc->sc_matrix[i][j] = NULL;
511 
512 	sc->sc_prevphase = SUNSCPAL_PHASE_INVALID;
513 	sc->sc_state = SUNSCPAL_IDLE;
514 
515 	SUNSCPAL_WRITE_2(sc, sunscpal_icr, 0);
516 	SUNSCPAL_WRITE_2(sc, sunscpal_dma_addr_h, 0);
517 	SUNSCPAL_WRITE_2(sc, sunscpal_dma_addr_l, 0);
518 	SUNSCPAL_WRITE_2(sc, sunscpal_dma_count, SUNSCPAL_DMA_COUNT_FLIP(0));
519 
520 	SUNSCPAL_CLR_INTR(sc);
521 
522 	/* Another hack (Er.. hook!) for anything that needs it: */
523 	if (sc->sc_intr_on) {
524 		SUNSCPAL_TRACE("init: intr ON\n", 0);
525 		sc->sc_intr_on(sc);
526 	}
527 }
528 
529 
530 static void
531 sunscpal_reset_scsibus(struct sunscpal_softc *sc)
532 {
533 
534 	SUNSCPAL_TRACE("reset_scsibus, cur=0x%x\n", (long)sc->sc_current);
535 
536 	SUNSCPAL_WRITE_2(sc, sunscpal_icr, SUNSCPAL_ICR_RESET);
537 	delay(500);
538 	SUNSCPAL_WRITE_2(sc, sunscpal_icr, 0);
539 
540 	SUNSCPAL_CLR_INTR(sc);
541 	/* XXX - Need long delay here! */
542 	delay(100000);
543 
544 	/* XXX - Need to cancel disconnected requests. */
545 }
546 
547 
548 /*
549  * Interrupt handler for the SCSI Bus Controller (SBC)
550  * This may also called for a DMA timeout (at splbio).
551  */
552 int
553 sunscpal_intr(void *arg)
554 {
555 	struct sunscpal_softc *sc = arg;
556 	int claimed = 0;
557 
558 	/*
559 	 * Do not touch SBC regs here unless sc_current == NULL
560 	 * or it will complain about "register conflict" errors.
561 	 * Instead, just let sunscpal_machine() deal with it.
562 	 */
563 	SUNSCPAL_TRACE("intr: top, state=%d\n", sc->sc_state);
564 
565 	if (sc->sc_state == SUNSCPAL_IDLE) {
566 		/*
567 		 * Might be reselect.  sunscpal_reselect() will check,
568 		 * and set up the connection if so.  This will verify
569 		 * that sc_current == NULL at the beginning...
570 		 */
571 
572 		/* Another hack (Er.. hook!) for anything that needs it: */
573 		if (sc->sc_intr_off) {
574 			SUNSCPAL_TRACE("intr: for reselect, intr off\n", 0);
575 		    sc->sc_intr_off(sc);
576 		}
577 
578 		sunscpal_reselect(sc);
579 	}
580 
581 	/*
582 	 * The remaining documented interrupt causes are a DMA complete
583 	 * condition.
584 	 *
585 	 * The procedure is to let sunscpal_machine() figure out what
586 	 * to do next.
587 	 */
588 	if (sc->sc_state & SUNSCPAL_WORKING) {
589 		SUNSCPAL_TRACE("intr: call machine, cur=0x%x\n",
590 		    (long)sc->sc_current);
591 		/* This will usually free-up the nexus. */
592 		sunscpal_machine(sc);
593 		SUNSCPAL_TRACE("intr: machine done, cur=0x%x\n",
594 		    (long)sc->sc_current);
595 		claimed = 1;
596 	}
597 
598 	/* Maybe we can run some commands now... */
599 	if (sc->sc_state == SUNSCPAL_IDLE) {
600 		SUNSCPAL_TRACE("intr: call sched, cur=0x%x\n",
601 		    (long)sc->sc_current);
602 		sunscpal_sched(sc);
603 		SUNSCPAL_TRACE("intr: sched done, cur=0x%x\n",
604 		    (long)sc->sc_current);
605 	}
606 
607 	return claimed;
608 }
609 
610 
611 /*
612  * Abort the current command (i.e. due to timeout)
613  */
614 void
615 sunscpal_abort(struct sunscpal_softc *sc)
616 {
617 
618 	/*
619 	 * Finish it now.  If DMA is in progress, we
620 	 * can not call sunscpal_sched_msgout() because
621 	 * that hits the SBC (avoid DMA conflict).
622 	 */
623 
624 	/* Another hack (Er.. hook!) for anything that needs it: */
625 	if (sc->sc_intr_off) {
626 		SUNSCPAL_TRACE("abort: intr off\n", 0);
627 		sc->sc_intr_off(sc);
628 	}
629 
630 	sc->sc_state |= SUNSCPAL_ABORTING;
631 	if ((sc->sc_state & SUNSCPAL_DOINGDMA) == 0) {
632 		sunscpal_sched_msgout(sc, SEND_ABORT);
633 	}
634 	SUNSCPAL_TRACE("abort: call machine, cur=0x%x\n",
635 	    (long)sc->sc_current);
636 	sunscpal_machine(sc);
637 	SUNSCPAL_TRACE("abort: machine done, cur=0x%x\n",
638 	    (long)sc->sc_current);
639 
640 	/* Another hack (Er.. hook!) for anything that needs it: */
641 	if (sc->sc_intr_on) {
642 		SUNSCPAL_TRACE("abort: intr ON\n", 0);
643 		sc->sc_intr_on(sc);
644 	}
645 }
646 
647 /*
648  * Timeout handler, scheduled for each SCSI command.
649  */
650 void
651 sunscpal_cmd_timeout(void *arg)
652 {
653 	struct sunscpal_req *sr = arg;
654 	struct scsipi_xfer *xs;
655 	struct scsipi_periph *periph;
656 	struct sunscpal_softc *sc;
657 	int s;
658 
659 	s = splbio();
660 
661 	/* Get all our variables... */
662 	xs = sr->sr_xs;
663 	if (xs == NULL) {
664 		printf("%s: no scsipi_xfer\n", __func__);
665 		goto out;
666 	}
667 	periph = xs->xs_periph;
668 	sc = device_private(periph->periph_channel->chan_adapter->adapt_dev);
669 
670 	printf("%s: cmd timeout, targ=%d, lun=%d\n",
671 	    device_xname(sc->sc_dev),
672 	    sr->sr_target, sr->sr_lun);
673 
674 	/*
675 	 * Mark the overdue job as failed, and arrange for
676 	 * sunscpal_machine to terminate it.  If the victim
677 	 * is the current job, call sunscpal_machine() now.
678 	 * Otherwise arrange for sunscpal_sched() to do it.
679 	 */
680 	sr->sr_flags |= SR_OVERDUE;
681 	if (sc->sc_current == sr) {
682 		SUNSCPAL_TRACE("cmd_tmo: call abort, sr=0x%x\n", (long)sr);
683 		sunscpal_abort(sc);
684 	} else {
685 		/*
686 		 * The driver may be idle, or busy with another job.
687 		 * Arrange for sunscpal_sched() to do the deed.
688 		 */
689 		SUNSCPAL_TRACE("cmd_tmo: clear matrix, t/l=0x%02x\n",
690 		    (sr->sr_target << 4) | sr->sr_lun);
691 		sc->sc_matrix[sr->sr_target][sr->sr_lun] = NULL;
692 	}
693 
694 	/*
695 	 * We may have aborted the current job, or may have
696 	 * already been idle. In either case, we should now
697 	 * be idle, so try to start another job.
698 	 */
699 	if (sc->sc_state == SUNSCPAL_IDLE) {
700 		SUNSCPAL_TRACE("cmd_tmo: call sched, cur=0x%x\n",
701 		    (long)sc->sc_current);
702 		sunscpal_sched(sc);
703 		SUNSCPAL_TRACE("cmd_tmo: sched done, cur=0x%x\n",
704 		    (long)sc->sc_current);
705 	}
706 
707  out:
708 	splx(s);
709 }
710 
711 
712 /*****************************************************************
713  * Interface to higher level
714  *****************************************************************/
715 
716 
717 /*
718  * Enter a new SCSI command into the "issue" queue, and
719  * if there is work to do, start it going.
720  *
721  * WARNING:  This can be called recursively!
722  * (see comment in sunscpal_done)
723  */
724 void
725 sunscpal_scsipi_request(struct scsipi_channel *chan, scsipi_adapter_req_t req,
726     void *arg)
727 {
728 	struct scsipi_xfer *xs;
729 	struct scsipi_periph *periph;
730 	struct sunscpal_softc *sc;
731 	struct sunscpal_req *sr;
732 	int s, i, flags;
733 
734 	sc = device_private(chan->chan_adapter->adapt_dev);
735 
736 	switch (req) {
737 	case ADAPTER_REQ_RUN_XFER:
738 		xs = arg;
739 		periph = xs->xs_periph;
740 		flags = xs->xs_control;
741 
742 		if (flags & XS_CTL_DATA_UIO)
743 			panic("sunscpal: scsi data uio requested");
744 
745 		s = splbio();
746 
747 		if (flags & XS_CTL_POLL) {
748 			/* Terminate any current command. */
749 			sr = sc->sc_current;
750 			if (sr != NULL) {
751 				printf("%s: polled request aborting %d/%d\n",
752 				    device_xname(sc->sc_dev), sr->sr_target,
753 				    sr->sr_lun);
754 				sunscpal_abort(sc);
755 			}
756 			if (sc->sc_state != SUNSCPAL_IDLE) {
757 				panic("%s: polled request, abort failed",
758 				    __func__);
759 			}
760 		}
761 
762 		/*
763 		 * Find lowest empty slot in ring buffer.
764 		 * XXX: What about "fairness" and cmd order?
765 		 */
766 		for (i = 0; i < SUNSCPAL_OPENINGS; i++)
767 			if (sc->sc_ring[i].sr_xs == NULL)
768 				goto new;
769 
770 		xs->error = XS_RESOURCE_SHORTAGE;
771 		SUNSCPAL_TRACE("scsipi_cmd: no openings, rv=%d\n", rv);
772 		goto out;
773 
774  new:
775 		/* Create queue entry */
776 		sr = &sc->sc_ring[i];
777 		sr->sr_xs = xs;
778 		sr->sr_target = xs->xs_periph->periph_target;
779 		sr->sr_lun = xs->xs_periph->periph_lun;
780 		sr->sr_dma_hand = NULL;
781 		sr->sr_dataptr = xs->data;
782 		sr->sr_datalen = xs->datalen;
783 		sr->sr_flags = (flags & XS_CTL_POLL) ? SR_IMMED : 0;
784 		sr->sr_status = -1;	/* no value */
785 		sc->sc_ncmds++;
786 
787 		SUNSCPAL_TRACE("scsipi_cmd: new sr=0x%x\n", (long)sr);
788 
789 		if (flags & XS_CTL_POLL) {
790 			/* Force this new command to be next. */
791 			sc->sc_rr = i;
792 		}
793 
794 		/*
795 		 * If we were idle, run some commands...
796 		 */
797 		if (sc->sc_state == SUNSCPAL_IDLE) {
798 			SUNSCPAL_TRACE("scsipi_cmd: call sched, cur=0x%x\n",
799 			    (long)sc->sc_current);
800 			sunscpal_sched(sc);
801 			SUNSCPAL_TRACE("scsipi_cmd: sched done, cur=0x%x\n",
802 			    (long)sc->sc_current);
803 		}
804 
805 		if (flags & XS_CTL_POLL) {
806 			/* Make sure sunscpal_sched() finished it. */
807 			if ((xs->xs_status & XS_STS_DONE) == 0)
808 				panic("%s: poll didn't finish", __func__);
809 		}
810 
811  out:
812 		splx(s);
813 		return;
814 
815 	case ADAPTER_REQ_GROW_RESOURCES:
816 		/* XXX Not supported. */
817 		return;
818 
819 	case ADAPTER_REQ_SET_XFER_MODE:
820 	    {
821 		/*
822 		 * We don't support Sync, Wide, or Tagged Queueing.
823 		 * Just callback now, to report this.
824 		 */
825 		struct scsipi_xfer_mode *xm = arg;
826 
827 		xm->xm_mode = 0;
828 		xm->xm_period = 0;
829 		xm->xm_offset = 0;
830 		scsipi_async_event(chan, ASYNC_EVENT_XFER_MODE, xm);
831 		return;
832 	    }
833 	}
834 }
835 
836 
837 /*
838  * POST PROCESSING OF SCSI_CMD (usually current)
839  * Called by sunscpal_sched(), sunscpal_machine()
840  */
841 static void
842 sunscpal_done(struct sunscpal_softc *sc)
843 {
844 	struct	sunscpal_req *sr;
845 	struct	scsipi_xfer *xs;
846 
847 #ifdef	DIAGNOSTIC
848 	if (sc->sc_state == SUNSCPAL_IDLE)
849 		panic("%s: state=idle", __func__);
850 	if (sc->sc_current == NULL)
851 		panic("%s: current=0", __func__);
852 #endif
853 
854 	sr = sc->sc_current;
855 	xs = sr->sr_xs;
856 
857 	SUNSCPAL_TRACE("done: top, cur=0x%x\n", (long)sc->sc_current);
858 
859 	/*
860 	 * Clean up DMA resources for this command.
861 	 */
862 	if (sr->sr_dma_hand) {
863 		SUNSCPAL_TRACE("done: dma_free, dh=0x%x\n",
864 		    (long)sr->sr_dma_hand);
865 		sunscpal_dma_free(sc);
866 	}
867 #ifdef	DIAGNOSTIC
868 	if (sr->sr_dma_hand)
869 		panic("%s: DMA free did not", __func__);
870 #endif
871 
872 	if (sc->sc_state & SUNSCPAL_ABORTING) {
873 		SUNSCPAL_TRACE("done: aborting, error=%d\n", xs->error);
874 		if (xs->error == XS_NOERROR)
875 			xs->error = XS_TIMEOUT;
876 	}
877 
878 	SUNSCPAL_TRACE("done: check error=%d\n", (long)xs->error);
879 
880 	/* If error is already set, ignore sr_status value. */
881 	if (xs->error != XS_NOERROR)
882 		goto finish;
883 
884 	SUNSCPAL_TRACE("done: check status=%d\n", sr->sr_status);
885 
886 	xs->status = sr->sr_status;
887 	switch (sr->sr_status) {
888 	case SCSI_OK:	/* 0 */
889 		break;
890 
891 	case SCSI_CHECK:
892 	case SCSI_BUSY:
893 		xs->error = XS_BUSY;
894 		break;
895 
896 	case -1:
897 		/* This is our "impossible" initial value. */
898 		/* fallthrough */
899 	default:
900 		printf("%s: target %d, bad status=%d\n",
901 		    device_xname(sc->sc_dev), sr->sr_target, sr->sr_status);
902 		xs->error = XS_DRIVER_STUFFUP;
903 		break;
904 	}
905 
906  finish:
907 
908 	SUNSCPAL_TRACE("done: finish, error=%d\n", xs->error);
909 
910 	/*
911 	 * Dequeue the finished command, but don't clear sc_state until
912 	 * after the call to scsipi_done(), because that may call back to
913 	 * sunscpal_scsi_cmd() - unwanted recursion!
914 	 *
915 	 * Keeping sc->sc_state != idle terminates the recursion.
916 	 */
917 #ifdef	DIAGNOSTIC
918 	if ((sc->sc_state & SUNSCPAL_WORKING) == 0)
919 		panic("%s: bad state", __func__);
920 #endif
921 
922 	/* Clear our pointers to the request. */
923 	sc->sc_current = NULL;
924 	sc->sc_matrix[sr->sr_target][sr->sr_lun] = NULL;
925 	callout_stop(&sr->sr_xs->xs_callout);
926 
927 	/* Make the request free. */
928 	sr->sr_xs = NULL;
929 	sc->sc_ncmds--;
930 
931 	/* Tell common SCSI code it is done. */
932 	scsipi_done(xs);
933 
934 	sc->sc_state = SUNSCPAL_IDLE;
935 	/* Now sunscpal_sched() may be called again. */
936 }
937 
938 
939 /*
940  * Schedule a SCSI operation.  This routine should return
941  * only after it achieves one of the following conditions:
942  *  	Busy (sc->sc_state != SUNSCPAL_IDLE)
943  *  	No more work can be started.
944  */
945 static void
946 sunscpal_sched(struct sunscpal_softc *sc)
947 {
948 	struct sunscpal_req	*sr;
949 	struct scsipi_xfer *xs;
950 	int	target = 0, lun = 0;
951 	int	error, i;
952 
953 	/* Another hack (Er.. hook!) for anything that needs it: */
954 	if (sc->sc_intr_off) {
955 		SUNSCPAL_TRACE("sched: top, intr off\n", 0);
956 		sc->sc_intr_off(sc);
957 	}
958 
959  next_job:
960 	/*
961 	 * Grab the next job from queue.  Must be idle.
962 	 */
963 #ifdef	DIAGNOSTIC
964 	if (sc->sc_state != SUNSCPAL_IDLE)
965 		panic("%s: not idle", __func__);
966 	if (sc->sc_current)
967 		panic("%s: current set", __func__);
968 #endif
969 
970 	/*
971 	 * Always start the search where we last looked.
972 	 */
973 	i = sc->sc_rr;
974 	sr = NULL;
975 	do {
976 		if (sc->sc_ring[i].sr_xs) {
977 			target = sc->sc_ring[i].sr_target;
978 			lun = sc->sc_ring[i].sr_lun;
979 			if (sc->sc_matrix[target][lun] == NULL) {
980 				/*
981 				 * Do not mark the  target/LUN busy yet,
982 				 * because reselect may cause some other
983 				 * job to become the current one, so we
984 				 * might not actually start this job.
985 				 * Instead, set sc_matrix later on.
986 				 */
987 				sc->sc_rr = i;
988 				sr = &sc->sc_ring[i];
989 				break;
990 			}
991 		}
992 		i++;
993 		if (i == SUNSCPAL_OPENINGS)
994 			i = 0;
995 	} while (i != sc->sc_rr);
996 
997 	if (sr == NULL) {
998 		SUNSCPAL_TRACE("sched: no work, cur=0x%x\n",
999 		    (long)sc->sc_current);
1000 
1001 		/* Another hack (Er.. hook!) for anything that needs it: */
1002 		if (sc->sc_intr_on) {
1003 			SUNSCPAL_TRACE("sched: ret, intr ON\n", 0);
1004 			sc->sc_intr_on(sc);
1005 		}
1006 
1007 		return;		/* No more work to do. */
1008 	}
1009 
1010 	SUNSCPAL_TRACE("sched: select for t/l=0x%02x\n",
1011 	    (sr->sr_target << 4) | sr->sr_lun);
1012 
1013 	sc->sc_state = SUNSCPAL_WORKING;
1014 	error = sunscpal_select(sc, sr);
1015 	if (sc->sc_current) {
1016 		/* Lost the race!  reselected out from under us! */
1017 		/* Work with the reselected job. */
1018 		if (sr->sr_flags & SR_IMMED) {
1019 			printf("%s: reselected while polling (abort)\n",
1020 			    device_xname(sc->sc_dev));
1021 			/* Abort the reselected job. */
1022 			sc->sc_state |= SUNSCPAL_ABORTING;
1023 			sc->sc_msgpriq |= SEND_ABORT;
1024 		}
1025 		sr = sc->sc_current;
1026 		xs = sr->sr_xs;
1027 		SUNSCPAL_TRACE("sched: reselect, new sr=0x%x\n", (long)sr);
1028 		goto have_nexus;
1029 	}
1030 
1031 	/* Normal selection result.  Target/LUN is now busy. */
1032 	sc->sc_matrix[target][lun] = sr;
1033 	sc->sc_current = sr;	/* connected */
1034 	xs = sr->sr_xs;
1035 
1036 	/*
1037 	 * Initialize pointers, etc. for this job
1038 	 */
1039 	sc->sc_dataptr  = sr->sr_dataptr;
1040 	sc->sc_datalen  = sr->sr_datalen;
1041 	sc->sc_prevphase = SUNSCPAL_PHASE_INVALID;
1042 	sc->sc_msgpriq = SEND_IDENTIFY;
1043 	sc->sc_msgoutq = 0;
1044 	sc->sc_msgout  = 0;
1045 
1046 	SUNSCPAL_TRACE("sched: select rv=%d\n", error);
1047 
1048 	switch (error) {
1049 	case XS_NOERROR:
1050 		break;
1051 
1052 	case XS_BUSY:
1053 		/* XXX - Reset and try again. */
1054 		printf("%s: select found SCSI bus busy, resetting...\n",
1055 		    device_xname(sc->sc_dev));
1056 		sunscpal_reset_scsibus(sc);
1057 		/* fallthrough */
1058 	case XS_SELTIMEOUT:
1059 	default:
1060 		xs->error = error;	/* from select */
1061 		SUNSCPAL_TRACE("sched: call done, sr=0x%x\n", (long)sr);
1062 		sunscpal_done(sc);
1063 
1064 		/* Paranoia: clear everything. */
1065 		sc->sc_dataptr = NULL;
1066 		sc->sc_datalen = 0;
1067 		sc->sc_prevphase = SUNSCPAL_PHASE_INVALID;
1068 		sc->sc_msgpriq = 0;
1069 		sc->sc_msgoutq = 0;
1070 		sc->sc_msgout  = 0;
1071 
1072 		goto next_job;
1073 	}
1074 
1075 	/*
1076 	 * Selection was successful.  Normally, this means
1077 	 * we are starting a new command.  However, this
1078 	 * might be the termination of an overdue job.
1079 	 */
1080 	if (sr->sr_flags & SR_OVERDUE) {
1081 		SUNSCPAL_TRACE("sched: overdue, sr=0x%x\n", (long)sr);
1082 		sc->sc_state |= SUNSCPAL_ABORTING;
1083 		sc->sc_msgpriq |= SEND_ABORT;
1084 		goto have_nexus;
1085 	}
1086 
1087 	/*
1088 	 * OK, we are starting a new command.
1089 	 * Initialize and allocate resources for the new command.
1090 	 * Device reset is special (only uses MSG_OUT phase).
1091 	 * Normal commands start in MSG_OUT phase where we will
1092 	 * send and IDENDIFY message, and then expect CMD phase.
1093 	 */
1094 #ifdef	SUNSCPAL_DEBUG
1095 	if (sunscpal_debug & SUNSCPAL_DBG_CMDS) {
1096 		printf("%s: begin, target=%d, LUN=%d\n", __func__,
1097 		    xs->xs_periph->periph_target, xs->xs_periph->periph_lun);
1098 		sunscpal_show_scsi_cmd(xs);
1099 	}
1100 #endif
1101 	if (xs->xs_control & XS_CTL_RESET) {
1102 		SUNSCPAL_TRACE("sched: cmd=reset, sr=0x%x\n", (long)sr);
1103 		/* Not an error, so do not set SUNSCPAL_ABORTING */
1104 		sc->sc_msgpriq |= SEND_DEV_RESET;
1105 		goto have_nexus;
1106 	}
1107 
1108 #ifdef	DIAGNOSTIC
1109 	if ((xs->xs_control & (XS_CTL_DATA_IN | XS_CTL_DATA_OUT)) == 0) {
1110 		if (sc->sc_dataptr) {
1111 			printf("%s: ptr but no data in/out flags?\n",
1112 			    device_xname(sc->sc_dev));
1113 			SUNSCPAL_BREAK();
1114 			sc->sc_dataptr = NULL;
1115 		}
1116 	}
1117 #endif
1118 
1119 	/* Allocate DMA space (maybe) */
1120 	if (sc->sc_dataptr && (sc->sc_flags & SUNSCPAL_DISABLE_DMA) == 0 &&
1121 		(sc->sc_datalen >= sc->sc_min_dma_len))
1122 	{
1123 		SUNSCPAL_TRACE("sched: dma_alloc, len=%d\n", sc->sc_datalen);
1124 		sunscpal_dma_alloc(sc);
1125 	}
1126 
1127 	/*
1128 	 * Initialization hook called just after select,
1129 	 * at the beginning of COMMAND phase.
1130 	 * (but AFTER the DMA allocation is done)
1131 	 *
1132 	 * We need to set up the DMA engine BEFORE the target puts
1133 	 * the SCSI bus into any DATA phase.
1134 	 */
1135 	if (sr->sr_dma_hand) {
1136 		SUNSCPAL_TRACE("sched: dma_setup, dh=0x%x\n",
1137 		    (long) sr->sr_dma_hand);
1138 	    sunscpal_dma_setup(sc);
1139 	}
1140 
1141 	/*
1142 	 * Schedule a timeout for the job we are starting.
1143 	 */
1144 	if ((sr->sr_flags & SR_IMMED) == 0) {
1145 		i = mstohz(xs->timeout);
1146 		SUNSCPAL_TRACE("sched: set timeout=%d\n", i);
1147 		callout_reset(&sr->sr_xs->xs_callout, i,
1148 		    sunscpal_cmd_timeout, sr);
1149 	}
1150 
1151  have_nexus:
1152 
1153 	SUNSCPAL_TRACE("sched: call machine, cur=0x%x\n",
1154 	    (long)sc->sc_current);
1155 	sunscpal_machine(sc);
1156 	SUNSCPAL_TRACE("sched: machine done, cur=0x%x\n",
1157 	    (long)sc->sc_current);
1158 
1159 	/*
1160 	 * What state did sunscpal_machine() leave us in?
1161 	 * Hopefully it sometimes completes a job...
1162 	 */
1163 	if (sc->sc_state == SUNSCPAL_IDLE)
1164 		goto next_job;
1165 
1166 	return; 	/* Have work in progress. */
1167 }
1168 
1169 
1170 /*
1171  *  Reselect handler: checks for reselection, and if we are being
1172  *	reselected, it sets up sc->sc_current.
1173  *
1174  *  We are reselected when:
1175  *	SEL is TRUE
1176  *	IO  is TRUE
1177  *	BSY is FALSE
1178  */
1179 void
1180 sunscpal_reselect(struct sunscpal_softc *sc)
1181 {
1182 
1183 	/*
1184 	 * This controller does not implement disconnect/reselect, so
1185 	 * we really don't have anything to do here.  We keep this
1186 	 * function as a placeholder, though.
1187 	 */
1188 }
1189 
1190 /*
1191  *  Select target: xs is the transfer that we are selecting for.
1192  *  sc->sc_current should be NULL.
1193  *
1194  *  Returns:
1195  *	sc->sc_current != NULL  ==> we were reselected (race!)
1196  *	XS_NOERROR		==> selection worked
1197  *	XS_BUSY 		==> lost arbitration
1198  *	XS_SELTIMEOUT   	==> no response to selection
1199  */
1200 static int
1201 sunscpal_select(struct sunscpal_softc *sc, struct sunscpal_req *sr)
1202 {
1203 	int timo, target_mask;
1204 	u_short	mode;
1205 
1206 	/* Check for reselect */
1207 	sunscpal_reselect(sc);
1208 	if (sc->sc_current) {
1209 		SUNSCPAL_TRACE("select: reselect, cur=0x%x\n",
1210 		    (long)sc->sc_current);
1211 		return XS_BUSY;	/* reselected */
1212 	}
1213 
1214 	/*
1215 	 * Select the target.
1216 	 */
1217 	target_mask = (1 << sr->sr_target);
1218 	SUNSCPAL_WRITE_1(sc, sunscpal_data, target_mask);
1219 	SUNSCPAL_WRITE_2(sc, sunscpal_icr, SUNSCPAL_ICR_SELECT);
1220 
1221 	/*
1222 	 * Wait for the target to assert BSY.
1223 	 * SCSI spec. says wait for 250 mS.
1224 	 */
1225 	for (timo = 25000;;) {
1226 		if (SUNSCPAL_READ_2(sc, sunscpal_icr) & SUNSCPAL_ICR_BUSY)
1227 			goto success;
1228 		if (--timo <= 0)
1229 			break;
1230 		delay(10);
1231 	}
1232 
1233 	SUNSCPAL_WRITE_1(sc, sunscpal_data, 0);
1234 	SUNSCPAL_WRITE_2(sc, sunscpal_icr, 0);
1235 
1236 	SUNSCPAL_TRACE("select: device down, rc=%d\n", XS_SELTIMEOUT);
1237 	return XS_SELTIMEOUT;
1238 
1239  success:
1240 
1241 	/*
1242 	 * The target is now driving BSY, so we can stop
1243 	 * driving SEL and the data bus.  We do set up
1244 	 * whether or not this target needs parity.
1245 	 */
1246 	mode = 0;
1247 	if ((sc->sc_parity_disable & target_mask) == 0)
1248 		mode |= SUNSCPAL_ICR_PARITY_ENABLE;
1249 	SUNSCPAL_WRITE_2(sc, sunscpal_icr, mode);
1250 
1251 	return XS_NOERROR;
1252 }
1253 
1254 /*****************************************************************
1255  * Functions to handle each info. transfer phase:
1256  *****************************************************************/
1257 
1258 /*
1259  * The message system:
1260  *
1261  * This is a revamped message system that now should easier accommodate
1262  * new messages, if necessary.
1263  *
1264  * Currently we accept these messages:
1265  * IDENTIFY (when reselecting)
1266  * COMMAND COMPLETE # (expect bus free after messages marked #)
1267  * NOOP
1268  * MESSAGE REJECT
1269  * SYNCHRONOUS DATA TRANSFER REQUEST
1270  * SAVE DATA POINTER
1271  * RESTORE POINTERS
1272  * DISCONNECT #
1273  *
1274  * We may send these messages in prioritized order:
1275  * BUS DEVICE RESET #		if XS_CTL_RESET & xs->xs_control (or in
1276  *				weird sits.)
1277  * MESSAGE PARITY ERROR		par. err. during MSGI
1278  * MESSAGE REJECT		If we get a message we don't know how to handle
1279  * ABORT #			send on errors
1280  * INITIATOR DETECTED ERROR	also on errors (SCSI2) (during info xfer)
1281  * IDENTIFY			At the start of each transfer
1282  * SYNCHRONOUS DATA TRANSFER REQUEST	if appropriate
1283  * NOOP				if nothing else fits the bill ...
1284  */
1285 
1286 /*
1287  * Precondition:
1288  * The SCSI bus is already in the MSGI phase and there is a message byte
1289  * on the bus, along with an asserted REQ signal.
1290  *
1291  * Our return value determines whether our caller, sunscpal_machine()
1292  * will expect to see another REQ (and possibly phase change).
1293  */
1294 static int
1295 sunscpal_msg_in(struct sunscpal_softc *sc)
1296 {
1297 	struct sunscpal_req *sr = sc->sc_current;
1298 	struct scsipi_xfer *xs = sr->sr_xs;
1299 	int n, phase;
1300 	int act_flags;
1301 
1302 	act_flags = ACT_CONTINUE;
1303 
1304 	if (sc->sc_prevphase == SUNSCPAL_PHASE_MSG_IN) {
1305 		/* This is a continuation of the previous message. */
1306 		n = sc->sc_imp - sc->sc_imess;
1307 		SUNSCPAL_TRACE("msg_in: continuation, n=%d\n", n);
1308 		goto nextbyte;
1309 	}
1310 
1311 	/* This is a new MESSAGE IN phase.  Clean up our state. */
1312 	sc->sc_state &= ~SUNSCPAL_DROP_MSGIN;
1313 
1314  nextmsg:
1315 	n = 0;
1316 	sc->sc_imp = &sc->sc_imess[n];
1317 
1318  nextbyte:
1319 	/*
1320 	 * Read a whole message, but don't ack the last byte.  If we reject the
1321 	 * message, we have to assert ATN during the message transfer phase
1322 	 * itself.
1323 	 */
1324 	for (;;) {
1325 		/*
1326 		 * Read a message byte.
1327 		 * First, check BSY, REQ, phase...
1328 		 */
1329 		if (!SUNSCPAL_BUSY(sc)) {
1330 			SUNSCPAL_TRACE("msg_in: lost BSY, n=%d\n", n);
1331 			/* XXX - Assume the command completed? */
1332 			act_flags |= (ACT_DISCONNECT | ACT_CMD_DONE);
1333 			return act_flags;
1334 		}
1335 		if (sunscpal_wait_req(sc)) {
1336 			SUNSCPAL_TRACE("msg_in: BSY but no REQ, n=%d\n", n);
1337 			/* Just let sunscpal_machine() handle it... */
1338 			return act_flags;
1339 		}
1340 		phase = SUNSCPAL_BUS_PHASE(SUNSCPAL_READ_2(sc, sunscpal_icr));
1341 		if (phase != SUNSCPAL_PHASE_MSG_IN) {
1342 			/*
1343 			 * Target left MESSAGE IN, probably because it
1344 			 * a) noticed our ATN signal, or
1345 			 * b) ran out of messages.
1346 			 */
1347 			return act_flags;
1348 		}
1349 		/* Still in MESSAGE IN phase, and REQ is asserted. */
1350 		if ((SUNSCPAL_READ_2(sc, sunscpal_icr) &
1351 		    SUNSCPAL_ICR_PARITY_ERROR) != 0) {
1352 			sunscpal_sched_msgout(sc, SEND_PARITY_ERROR);
1353 			sc->sc_state |= SUNSCPAL_DROP_MSGIN;
1354 		}
1355 
1356 		/* Gather incoming message bytes if needed. */
1357 		if ((sc->sc_state & SUNSCPAL_DROP_MSGIN) == 0) {
1358 			if (n >= SUNSCPAL_MAX_MSG_LEN) {
1359 				sunscpal_sched_msgout(sc, SEND_REJECT);
1360 				sc->sc_state |= SUNSCPAL_DROP_MSGIN;
1361 			} else {
1362 				*sc->sc_imp++ =
1363 				    SUNSCPAL_READ_1(sc, sunscpal_cmd_stat);
1364 				n++;
1365 				/*
1366 				 * This testing is suboptimal, but most
1367 				 * messages will be of the one byte variety, so
1368 				 * it should not affect performance
1369 				 * significantly.
1370 				 */
1371 				if (n == 1 && MSG_IS1BYTE(sc->sc_imess[0]))
1372 					goto have_msg;
1373 				if (n == 2 && MSG_IS2BYTE(sc->sc_imess[0]))
1374 					goto have_msg;
1375 				if (n >= 3 && MSG_ISEXTENDED(sc->sc_imess[0]) &&
1376 					n == sc->sc_imess[1] + 2)
1377 					goto have_msg;
1378 			}
1379 		}
1380 
1381 		/*
1382 		 * If we reach this spot we're either:
1383 		 * a) in the middle of a multi-byte message, or
1384 		 * b) dropping bytes.
1385 		 */
1386 
1387 		if (act_flags != ACT_CONTINUE)
1388 			return act_flags;
1389 
1390 		/* back to nextbyte */
1391 	}
1392 
1393  have_msg:
1394 	/* We now have a complete message.  Parse it. */
1395 
1396 	switch (sc->sc_imess[0]) {
1397 	case MSG_CMDCOMPLETE:
1398 		SUNSCPAL_TRACE("msg_in: CMDCOMPLETE\n", 0);
1399 		/* Target is about to disconnect. */
1400 		act_flags |= (ACT_DISCONNECT | ACT_CMD_DONE);
1401 		break;
1402 
1403 	case MSG_PARITY_ERROR:
1404 		SUNSCPAL_TRACE("msg_in: PARITY_ERROR\n", 0);
1405 		/* Resend the last message. */
1406 		sunscpal_sched_msgout(sc, sc->sc_msgout);
1407 		break;
1408 
1409 	case MSG_MESSAGE_REJECT:
1410 		/* The target rejects the last message we sent. */
1411 		SUNSCPAL_TRACE("msg_in: got reject for 0x%x\n", sc->sc_msgout);
1412 		switch (sc->sc_msgout) {
1413 		case SEND_IDENTIFY:
1414 			/* Really old target controller? */
1415 			/* XXX ... */
1416 			break;
1417 		case SEND_INIT_DET_ERR:
1418 			goto abort;
1419 		}
1420 		break;
1421 
1422 	case MSG_NOOP:
1423 		SUNSCPAL_TRACE("msg_in: NOOP\n", 0);
1424 		break;
1425 
1426 	case MSG_DISCONNECT:
1427 		SUNSCPAL_TRACE("msg_in: DISCONNECT\n", 0);
1428 		/* Target is about to disconnect. */
1429 		act_flags |= ACT_DISCONNECT;
1430 		if ((xs->xs_periph->periph_quirks & PQUIRK_AUTOSAVE) == 0)
1431 			break;
1432 		/*FALLTHROUGH*/
1433 
1434 	case MSG_SAVEDATAPOINTER:
1435 		SUNSCPAL_TRACE("msg_in: SAVE_PTRS\n", 0);
1436 		sr->sr_dataptr = sc->sc_dataptr;
1437 		sr->sr_datalen = sc->sc_datalen;
1438 		break;
1439 
1440 	case MSG_RESTOREPOINTERS:
1441 		SUNSCPAL_TRACE("msg_in: RESTORE_PTRS\n", 0);
1442 		sc->sc_dataptr = sr->sr_dataptr;
1443 		sc->sc_datalen = sr->sr_datalen;
1444 		break;
1445 
1446 	case MSG_EXTENDED:
1447 		switch (sc->sc_imess[2]) {
1448 		case MSG_EXT_SDTR:
1449 		case MSG_EXT_WDTR:
1450 			/* This controller can not do synchronous mode. */
1451 			goto reject;
1452 		default:
1453 			printf("%s: unrecognized MESSAGE EXTENDED; "
1454 			    "sending REJECT\n",
1455 			    device_xname(sc->sc_dev));
1456 			SUNSCPAL_BREAK();
1457 			goto reject;
1458 		}
1459 		break;
1460 
1461 	default:
1462 		SUNSCPAL_TRACE("msg_in: eh? imsg=0x%x\n", sc->sc_imess[0]);
1463 		printf("%s: unrecognized MESSAGE; sending REJECT\n",
1464 		    device_xname(sc->sc_dev));
1465 		SUNSCPAL_BREAK();
1466 		/* FALLTHROUGH */
1467 	reject:
1468 		sunscpal_sched_msgout(sc, SEND_REJECT);
1469 		break;
1470 
1471 	abort:
1472 		sc->sc_state |= SUNSCPAL_ABORTING;
1473 		sunscpal_sched_msgout(sc, SEND_ABORT);
1474 		break;
1475 	}
1476 
1477 	/* Go get the next message, if any. */
1478 	if (act_flags == ACT_CONTINUE)
1479 		goto nextmsg;
1480 
1481 	return act_flags;
1482 }
1483 
1484 
1485 /*
1486  * The message out (and in) stuff is a bit complicated:
1487  * If the target requests another message (sequence) without
1488  * having changed phase in between it really asks for a
1489  * retransmit, probably due to parity error(s).
1490  * The following messages can be sent:
1491  * IDENTIFY	   @ These 4 stem from SCSI command activity
1492  * SDTR		   @
1493  * WDTR		   @
1494  * DEV_RESET	   @
1495  * REJECT if MSGI doesn't make sense
1496  * PARITY_ERROR if parity error while in MSGI
1497  * INIT_DET_ERR if parity error while not in MSGI
1498  * ABORT if INIT_DET_ERR rejected
1499  * NOOP if asked for a message and there's nothing to send
1500  *
1501  * Note that we call this one with (sc_current == NULL)
1502  * when sending ABORT for unwanted reselections.
1503  */
1504 static int
1505 sunscpal_msg_out(struct sunscpal_softc *sc)
1506 {
1507 	/*
1508 	 * This controller does not allow you to assert ATN, which
1509 	 * means we will never get the opportunity to send messages to
1510 	 * the target (the bus will never enter this MSG_OUT phase).
1511 	 * This will eventually leave us with no option other than to
1512 	 * reset the bus.  We keep this function as a placeholder,
1513 	 * though, and this printf will eventually go away or get
1514 	 * #ifdef'ed:
1515 	 */
1516 	printf("%s: bus is in MSG_OUT phase?\n", __func__);
1517 	return ACT_CONTINUE | ACT_RESET_BUS;
1518 }
1519 
1520 /*
1521  * Handle command phase.
1522  */
1523 static int
1524 sunscpal_command(struct sunscpal_softc *sc)
1525 {
1526 	struct sunscpal_req *sr = sc->sc_current;
1527 	struct scsipi_xfer *xs = sr->sr_xs;
1528 	int len;
1529 
1530 	/* Assume command can be sent in one go. */
1531 	/* XXX: Do this using DMA, and get a phase change intr? */
1532 	len = sunscpal_pio_out(sc, SUNSCPAL_PHASE_COMMAND, xs->cmdlen,
1533 	    (uint8_t *)xs->cmd);
1534 
1535 	if (len != xs->cmdlen) {
1536 #ifdef	SUNSCPAL_DEBUG
1537 		printf("%s: short transfer: wanted %d got %d.\n",
1538 		    __func__, xs->cmdlen, len);
1539 		sunscpal_show_scsi_cmd(xs);
1540 		SUNSCPAL_BREAK();
1541 #endif
1542 		if (len < 6) {
1543 			xs->error = XS_DRIVER_STUFFUP;
1544 			sc->sc_state |= SUNSCPAL_ABORTING;
1545 			sunscpal_sched_msgout(sc, SEND_ABORT);
1546 		}
1547 
1548 	}
1549 
1550 	return ACT_CONTINUE;
1551 }
1552 
1553 
1554 /*
1555  * Handle either data_in or data_out
1556  */
1557 static int
1558 sunscpal_data_xfer(struct sunscpal_softc *sc, int phase)
1559 {
1560 	struct sunscpal_req *sr = sc->sc_current;
1561 	struct scsipi_xfer *xs = sr->sr_xs;
1562 	int expected_phase;
1563 	int len;
1564 
1565 	/*
1566 	 * When aborting a command, disallow any data phase.
1567 	 */
1568 	if (sc->sc_state & SUNSCPAL_ABORTING) {
1569 		printf("%s: aborting, bus phase=%s (reset)\n",
1570 		    device_xname(sc->sc_dev), phase_names[(phase >> 8) & 7]);
1571 		return ACT_RESET_BUS;	/* XXX */
1572 	}
1573 
1574 	/* Validate expected phase (data_in or data_out) */
1575 	expected_phase = (xs->xs_control & XS_CTL_DATA_OUT) ?
1576 	    SUNSCPAL_PHASE_DATA_OUT : SUNSCPAL_PHASE_DATA_IN;
1577 	if (phase != expected_phase) {
1578 		printf("%s: data phase error\n", device_xname(sc->sc_dev));
1579 		goto abort;
1580 	}
1581 
1582 	/* Make sure we have some data to move. */
1583 	if (sc->sc_datalen <= 0) {
1584 		/* Device needs padding. */
1585 		if (phase == SUNSCPAL_PHASE_DATA_IN)
1586 			sunscpal_pio_in(sc, phase, 4096, NULL);
1587 		else
1588 			sunscpal_pio_out(sc, phase, 4096, NULL);
1589 		/* Make sure that caused a phase change. */
1590 		if (SUNSCPAL_BUS_PHASE(SUNSCPAL_READ_2(sc, sunscpal_icr)) ==
1591 		    phase) {
1592 			/* More than 4k is just too much! */
1593 			printf("%s: too much data padding\n",
1594 			    device_xname(sc->sc_dev));
1595 			goto abort;
1596 		}
1597 		return ACT_CONTINUE;
1598 	}
1599 
1600 	/*
1601 	 * Attempt DMA only if dma_alloc gave us a DMA handle AND
1602 	 * there is enough left to transfer so DMA is worth while.
1603 	 */
1604 	if (sr->sr_dma_hand && (sc->sc_datalen >= sc->sc_min_dma_len)) {
1605 		/*
1606 		 * OK, really start DMA.  Note, the MD start function
1607 		 * is responsible for setting the TCMD register, etc.
1608 		 * (Acknowledge the phase change there, not here.)
1609 		 */
1610 		SUNSCPAL_TRACE("data_xfer: dma_start, dh=0x%x\n",
1611 		    (long)sr->sr_dma_hand);
1612 		sunscpal_dma_start(sc);
1613 		return ACT_WAIT_DMA;
1614 	}
1615 
1616 	/*
1617 	 * Doing PIO for data transfer.  (Possibly "Pseudo DMA")
1618 	 * XXX:  Do PDMA functions need to set tcmd later?
1619 	 */
1620 	SUNSCPAL_TRACE("data_xfer: doing PIO, len=%d\n", sc->sc_datalen);
1621 	if (phase == SUNSCPAL_PHASE_DATA_OUT) {
1622 		len = sunscpal_pio_out(sc, phase,
1623 		    sc->sc_datalen, sc->sc_dataptr);
1624 	} else {
1625 		len = sunscpal_pio_in(sc, phase,
1626 		    sc->sc_datalen, sc->sc_dataptr);
1627 	}
1628 	sc->sc_dataptr += len;
1629 	sc->sc_datalen -= len;
1630 
1631 	SUNSCPAL_TRACE("data_xfer: did PIO, resid=%d\n", sc->sc_datalen);
1632 	return ACT_CONTINUE;
1633 
1634  abort:
1635 	sc->sc_state |= SUNSCPAL_ABORTING;
1636 	sunscpal_sched_msgout(sc, SEND_ABORT);
1637 	return ACT_CONTINUE;
1638 }
1639 
1640 
1641 static int
1642 sunscpal_status(struct sunscpal_softc *sc)
1643 {
1644 	int len;
1645 	uint8_t status;
1646 	struct sunscpal_req *sr = sc->sc_current;
1647 
1648 	len = sunscpal_pio_in(sc, SUNSCPAL_PHASE_STATUS, 1, &status);
1649 	if (len) {
1650 		sr->sr_status = status;
1651 	} else {
1652 		printf("%s: none?\n", __func__);
1653 	}
1654 
1655 	return ACT_CONTINUE;
1656 }
1657 
1658 
1659 /*
1660  * This is the big state machine that follows SCSI phase changes.
1661  * This is somewhat like a co-routine.  It will do a SCSI command,
1662  * and exit if the command is complete, or if it must wait, i.e.
1663  * for DMA to complete or for reselect to resume the job.
1664  *
1665  * The bus must be selected, and we need to know which command is
1666  * being undertaken.
1667  */
1668 static void
1669 sunscpal_machine(struct sunscpal_softc *sc)
1670 {
1671 	struct sunscpal_req *sr;
1672 	struct scsipi_xfer *xs;
1673 	int act_flags, phase, timo;
1674 
1675 #ifdef	DIAGNOSTIC
1676 	if (sc->sc_state == SUNSCPAL_IDLE)
1677 		panic("%s: state=idle", __func__);
1678 	if (sc->sc_current == NULL)
1679 		panic("%s: no current cmd", __func__);
1680 #endif
1681 
1682 	sr = sc->sc_current;
1683 	xs = sr->sr_xs;
1684 	act_flags = ACT_CONTINUE;
1685 
1686 	/*
1687 	 * This will be called by sunscpal_intr() when DMA is
1688 	 * complete.  Must stop DMA before touching the PAL or
1689 	 * there will be "register conflict" errors.
1690 	 */
1691 	if ((sc->sc_state & SUNSCPAL_DOINGDMA) != 0) {
1692 		/* Pick-up where where we left off... */
1693 		goto dma_done;
1694 	}
1695 
1696  next_phase:
1697 
1698 	if (!SUNSCPAL_BUSY(sc)) {
1699 		/* Unexpected disconnect */
1700 		printf("%s: unexpected disconnect.\n", __func__);
1701 		xs->error = XS_DRIVER_STUFFUP;
1702 		act_flags |= (ACT_DISCONNECT | ACT_CMD_DONE);
1703 		goto do_actions;
1704 	}
1705 
1706 	/*
1707 	 * Wait for REQ before reading the phase.
1708 	 * Need to wait longer than usual here, because
1709 	 * some devices are just plain slow...
1710 	 */
1711 	timo = sunscpal_wait_phase_timo;
1712 	for (;;) {
1713 		if (SUNSCPAL_READ_2(sc, sunscpal_icr) & SUNSCPAL_ICR_REQUEST)
1714 			break;
1715 		if (--timo <= 0) {
1716 			if (sc->sc_state & SUNSCPAL_ABORTING) {
1717 				printf("%s: no REQ while aborting, reset\n",
1718 				    device_xname(sc->sc_dev));
1719 				act_flags |= ACT_RESET_BUS;
1720 				goto do_actions;
1721 			}
1722 			printf("%s: no REQ for next phase, abort\n",
1723 			    device_xname(sc->sc_dev));
1724 			sc->sc_state |= SUNSCPAL_ABORTING;
1725 			sunscpal_sched_msgout(sc, SEND_ABORT);
1726 			goto next_phase;
1727 		}
1728 		delay(100);
1729 	}
1730 
1731 	phase = SUNSCPAL_BUS_PHASE(SUNSCPAL_READ_2(sc, sunscpal_icr));
1732 	SUNSCPAL_TRACE("machine: phase=%s\n",
1733 	    (long)phase_names[(phase >> 8) & 7]);
1734 
1735 	/*
1736 	 * We assume that the device knows what it's doing,
1737 	 * so any phase is good.
1738 	 */
1739 
1740 	switch (phase) {
1741 
1742 	case SUNSCPAL_PHASE_DATA_OUT:
1743 	case SUNSCPAL_PHASE_DATA_IN:
1744 		act_flags = sunscpal_data_xfer(sc, phase);
1745 		break;
1746 
1747 	case SUNSCPAL_PHASE_COMMAND:
1748 		act_flags = sunscpal_command(sc);
1749 		break;
1750 
1751 	case SUNSCPAL_PHASE_STATUS:
1752 		act_flags = sunscpal_status(sc);
1753 		break;
1754 
1755 	case SUNSCPAL_PHASE_MSG_OUT:
1756 		act_flags = sunscpal_msg_out(sc);
1757 		break;
1758 
1759 	case SUNSCPAL_PHASE_MSG_IN:
1760 		act_flags = sunscpal_msg_in(sc);
1761 		break;
1762 
1763 	default:
1764 		printf("%s: Unexpected phase 0x%x\n", __func__, phase);
1765 		sc->sc_state |= SUNSCPAL_ABORTING;
1766 		sunscpal_sched_msgout(sc, SEND_ABORT);
1767 		goto next_phase;
1768 
1769 	} /* switch */
1770 	sc->sc_prevphase = phase;
1771 
1772  do_actions:
1773 
1774 	if (act_flags & ACT_WAIT_DMA) {
1775 		act_flags &= ~ACT_WAIT_DMA;
1776 		/* Wait for DMA to complete (polling, or interrupt). */
1777 		if ((sr->sr_flags & SR_IMMED) == 0) {
1778 			SUNSCPAL_TRACE("machine: wait for DMA intr.\n", 0);
1779 			return; 	/* will resume at dma_done */
1780 		}
1781 		/* Busy-wait for it to finish. */
1782 		SUNSCPAL_TRACE("machine: dma_poll, dh=0x%x\n",
1783 		    (long)sr->sr_dma_hand);
1784 		sunscpal_dma_poll(sc);
1785  dma_done:
1786 		/* Return here after interrupt. */
1787 		if (sr->sr_flags & SR_OVERDUE)
1788 			sc->sc_state |= SUNSCPAL_ABORTING;
1789 		SUNSCPAL_TRACE("machine: dma_stop, dh=0x%x\n",
1790 		    (long)sr->sr_dma_hand);
1791 		sunscpal_dma_stop(sc);
1792 		SUNSCPAL_CLR_INTR(sc);	/* XXX */
1793 		/*
1794 		 * While DMA is running we can not touch the SBC,
1795 		 * so various places just set SUNSCPAL_ABORTING and
1796 		 * expect us the "kick it" when DMA is done.
1797 		 */
1798 		if (sc->sc_state & SUNSCPAL_ABORTING) {
1799 			sunscpal_sched_msgout(sc, SEND_ABORT);
1800 		}
1801 	}
1802 
1803 	/*
1804 	 * Check for parity error.
1805 	 * XXX - better place to check?
1806 	 */
1807 	if (SUNSCPAL_READ_2(sc, sunscpal_icr) & SUNSCPAL_ICR_PARITY_ERROR) {
1808 		printf("%s: parity error!\n", device_xname(sc->sc_dev));
1809 		/* XXX: sc->sc_state |= SUNSCPAL_ABORTING; */
1810 		sunscpal_sched_msgout(sc, SEND_PARITY_ERROR);
1811 	}
1812 
1813 	if (act_flags == ACT_CONTINUE)
1814 		goto next_phase;
1815 	/* All other actions "break" from the loop. */
1816 
1817 	SUNSCPAL_TRACE("machine: act_flags=0x%x\n", act_flags);
1818 
1819 	if (act_flags & ACT_RESET_BUS) {
1820 		act_flags |= ACT_CMD_DONE;
1821 		/*
1822 		 * Reset the SCSI bus, usually due to a timeout.
1823 		 * The error code XS_TIMEOUT allows retries.
1824 		 */
1825 		sc->sc_state |= SUNSCPAL_ABORTING;
1826 		printf("%s: reset SCSI bus for TID=%d LUN=%d\n",
1827 		    device_xname(sc->sc_dev), sr->sr_target, sr->sr_lun);
1828 		sunscpal_reset_scsibus(sc);
1829 	}
1830 
1831 	if (act_flags & ACT_CMD_DONE) {
1832 		act_flags |= ACT_DISCONNECT;
1833 		/* Need to call scsipi_done() */
1834 		/* XXX: from the aic6360 driver, but why? */
1835 		if (sc->sc_datalen < 0) {
1836 			printf("%s: %d extra bytes from %d:%d\n",
1837 			    device_xname(sc->sc_dev), -sc->sc_datalen,
1838 			    sr->sr_target, sr->sr_lun);
1839 			sc->sc_datalen = 0;
1840 		}
1841 		xs->resid = sc->sc_datalen;
1842 		/* Note: this will clear sc_current */
1843 		SUNSCPAL_TRACE("machine: call done, cur=0x%x\n", (long)sr);
1844 		sunscpal_done(sc);
1845 	}
1846 
1847 	if (act_flags & ACT_DISCONNECT) {
1848 		/*
1849 		 * The device has dropped BSY (or will soon).
1850 		 * We have to wait here for BSY to drop, otherwise
1851 		 * the next command may decide we need a bus reset.
1852 		 */
1853 		timo = sunscpal_wait_req_timo;	/* XXX */
1854 		for (;;) {
1855 			if (!SUNSCPAL_BUSY(sc))
1856 				goto busfree;
1857 			if (--timo <= 0)
1858 				break;
1859 			delay(2);
1860 		}
1861 		/* Device is sitting on the bus! */
1862 		printf("%s: Target %d LUN %d stuck busy, resetting...\n",
1863 		    device_xname(sc->sc_dev), sr->sr_target, sr->sr_lun);
1864 		sunscpal_reset_scsibus(sc);
1865  busfree:
1866 		SUNSCPAL_TRACE("machine: discon, waited %d\n",
1867 			sunscpal_wait_req_timo - timo);
1868 
1869 		SUNSCPAL_WRITE_2(sc, sunscpal_icr, 0);
1870 
1871 		if ((act_flags & ACT_CMD_DONE) == 0) {
1872 			SUNSCPAL_TRACE("machine: discon, cur=0x%x\n", (long)sr);
1873 		}
1874 
1875 		/*
1876 		 * We may be here due to a disconnect message,
1877 		 * in which case we did NOT call sunscpal_done,
1878 		 * and we need to clear sc_current.
1879 		 */
1880 		sc->sc_state = SUNSCPAL_IDLE;
1881 		sc->sc_current = NULL;
1882 
1883 		/* Paranoia: clear everything. */
1884 		sc->sc_dataptr = NULL;
1885 		sc->sc_datalen = 0;
1886 		sc->sc_prevphase = SUNSCPAL_PHASE_INVALID;
1887 		sc->sc_msgpriq = 0;
1888 		sc->sc_msgoutq = 0;
1889 		sc->sc_msgout  = 0;
1890 
1891 		/* Our caller will re-enable interrupts. */
1892 	}
1893 }
1894 
1895 
1896 #ifdef	SUNSCPAL_DEBUG
1897 
1898 static void
1899 sunscpal_show_scsi_cmd(struct scsipi_xfer *xs)
1900 {
1901 	uint8_t *b = (uint8_t *)xs->cmd;
1902 	int i = 0;
1903 
1904 	scsipi_printaddr(xs->xs_periph);
1905 	if ((xs->xs_control & XS_CTL_RESET) == 0) {
1906 		printf("-");
1907 		while (i < xs->cmdlen) {
1908 			if (i != 0)
1909 				printf(",");
1910 			printf("%x", b[i++]);
1911 		}
1912 		printf("-\n");
1913 	} else {
1914 		printf("-RESET-\n");
1915 	}
1916 }
1917 
1918 
1919 int sunscpal_traceidx = 0;
1920 
1921 #define	TRACE_MAX	1024
1922 struct trace_ent {
1923 	char *msg;
1924 	long  val;
1925 } sunscpal_tracebuf[TRACE_MAX];
1926 
1927 void
1928 sunscpal_trace(char *msg, long val)
1929 {
1930 	struct trace_ent *tr;
1931 	int s;
1932 
1933 	s = splbio();
1934 
1935 	tr = &sunscpal_tracebuf[sunscpal_traceidx];
1936 
1937 	sunscpal_traceidx++;
1938 	if (sunscpal_traceidx >= TRACE_MAX)
1939 		sunscpal_traceidx = 0;
1940 
1941 	tr->msg = msg;
1942 	tr->val = val;
1943 
1944 	splx(s);
1945 }
1946 
1947 #ifdef	DDB
1948 void
1949 sunscpal_clear_trace(void)
1950 {
1951 
1952 	sunscpal_traceidx = 0;
1953 	memset((void *)sunscpal_tracebuf, 0, sizeof(sunscpal_tracebuf));
1954 }
1955 
1956 void
1957 sunscpal_show_trace(void)
1958 {
1959 	struct trace_ent *tr;
1960 	int idx;
1961 
1962 	idx = sunscpal_traceidx;
1963 	do {
1964 		tr = &sunscpal_tracebuf[idx];
1965 		idx++;
1966 		if (idx >= TRACE_MAX)
1967 			idx = 0;
1968 		if (tr->msg)
1969 			db_printf(tr->msg, tr->val);
1970 	} while (idx != sunscpal_traceidx);
1971 }
1972 
1973 void
1974 sunscpal_show_req(struct sunscpal_req *sr)
1975 {
1976 	struct scsipi_xfer *xs = sr->sr_xs;
1977 
1978 	db_printf("TID=%d ",	sr->sr_target);
1979 	db_printf("LUN=%d ",	sr->sr_lun);
1980 	db_printf("dh=%p ",	sr->sr_dma_hand);
1981 	db_printf("dptr=%p ",	sr->sr_dataptr);
1982 	db_printf("dlen=0x%x ",	sr->sr_datalen);
1983 	db_printf("flags=%d ",	sr->sr_flags);
1984 	db_printf("stat=%d ",	sr->sr_status);
1985 
1986 	if (xs == NULL) {
1987 		db_printf("(xs=NULL)\n");
1988 		return;
1989 	}
1990 	db_printf("\n");
1991 #ifdef	SCSIDEBUG
1992 	show_scsipi_xs(xs);
1993 #else
1994 	db_printf("xs=%p\n", xs);
1995 #endif
1996 }
1997 
1998 void
1999 sunscpal_show_state(void)
2000 {
2001 	struct sunscpal_softc *sc;
2002 	struct sunscpal_req *sr;
2003 	int i, j, k;
2004 
2005 	sc = sunscpal_debug_sc;
2006 
2007 	if (sc == NULL) {
2008 		db_printf("sunscpal_debug_sc == NULL\n");
2009 		return;
2010 	}
2011 
2012 	db_printf("sc_ncmds=%d\n",  	sc->sc_ncmds);
2013 	k = -1;	/* which is current? */
2014 	for (i = 0; i < SUNSCPAL_OPENINGS; i++) {
2015 		sr = &sc->sc_ring[i];
2016 		if (sr->sr_xs) {
2017 			if (sr == sc->sc_current)
2018 				k = i;
2019 			db_printf("req %d: (sr=%p)", i, sr);
2020 			sunscpal_show_req(sr);
2021 		}
2022 	}
2023 	db_printf("sc_rr=%d, current=%d\n", sc->sc_rr, k);
2024 
2025 	db_printf("Active request matrix:\n");
2026 	for(i = 0; i < 8; i++) {		/* targets */
2027 		for (j = 0; j < 8; j++) {	/* LUN */
2028 			sr = sc->sc_matrix[i][j];
2029 			if (sr) {
2030 				db_printf("TID=%d LUN=%d sr=%p\n", i, j, sr);
2031 			}
2032 		}
2033 	}
2034 
2035 	db_printf("sc_state=0x%x\n",	sc->sc_state);
2036 	db_printf("sc_current=%p\n",	sc->sc_current);
2037 	db_printf("sc_dataptr=%p\n",	sc->sc_dataptr);
2038 	db_printf("sc_datalen=0x%x\n",	sc->sc_datalen);
2039 
2040 	db_printf("sc_prevphase=%d\n",	sc->sc_prevphase);
2041 	db_printf("sc_msgpriq=0x%x\n",	sc->sc_msgpriq);
2042 }
2043 #endif	/* DDB */
2044 #endif	/* SUNSCPAL_DEBUG */
2045 
2046 void
2047 sunscpal_attach(struct sunscpal_softc *sc, int options)
2048 {
2049 
2050 	/*
2051 	 * Handle our options.
2052 	 */
2053 	aprint_normal(": options=0x%x\n", options);
2054 	sc->sc_parity_disable = (options & SUNSCPAL_OPT_NO_PARITY_CHK);
2055 	if (options & SUNSCPAL_OPT_DISABLE_DMA)
2056 		sc->sc_flags |= SUNSCPAL_DISABLE_DMA;
2057 
2058 	/*
2059 	 * Fill in the adapter.
2060 	 */
2061 	memset(&sc->sc_adapter, 0, sizeof(sc->sc_adapter));
2062 	sc->sc_adapter.adapt_dev = sc->sc_dev;
2063 	sc->sc_adapter.adapt_nchannels = 1;
2064 	sc->sc_adapter.adapt_openings = SUNSCPAL_OPENINGS;
2065 	sc->sc_adapter.adapt_max_periph = 1;
2066 	sc->sc_adapter.adapt_request = sunscpal_scsipi_request;
2067 	sc->sc_adapter.adapt_minphys = sunscpal_minphys;
2068 	if (options & SUNSCPAL_OPT_FORCE_POLLING)
2069 		sc->sc_adapter.adapt_flags |= SCSIPI_ADAPT_POLL_ONLY;
2070 
2071 	sc->sc_channel.chan_adapter = &sc->sc_adapter;
2072 	sc->sc_channel.chan_bustype = &scsi_bustype;
2073 	sc->sc_channel.chan_channel = 0;
2074 	sc->sc_channel.chan_ntargets = 8;
2075 	sc->sc_channel.chan_nluns = 8;
2076 	sc->sc_channel.chan_id = 7;
2077 
2078 	/*
2079 	 * Add reference to adapter so that we drop the reference after
2080 	 * config_found() to make sure the adatper is disabled.
2081 	 */
2082 	if (scsipi_adapter_addref(&sc->sc_adapter) != 0) {
2083 		aprint_error_dev(sc->sc_dev, "unable to enable controller\n");
2084 		return;
2085 	}
2086 
2087 	sunscpal_init(sc);	/* Init chip and driver */
2088 	sunscpal_reset_scsibus(sc);
2089 
2090 	/*
2091 	 * Ask the adapter what subunits are present
2092 	 */
2093 	(void)config_found(sc->sc_dev, &sc->sc_channel, scsiprint);
2094 	scsipi_adapter_delref(&sc->sc_adapter);
2095 }
2096 
2097 int
2098 sunscpal_detach(struct sunscpal_softc *sc, int flags)
2099 {
2100 
2101 	return EOPNOTSUPP;
2102 }
2103 
2104 static void
2105 sunscpal_minphys(struct buf *bp)
2106 {
2107 
2108 	if (bp->b_bcount > SUNSCPAL_MAX_DMA_LEN) {
2109 #ifdef	SUNSCPAL_DEBUG
2110 		if (sunscpal_debug & SUNSCPAL_DBG_DMA) {
2111 			printf("%s: len = 0x%lx.\n", __func__, bp->b_bcount);
2112 			Debugger();
2113 		}
2114 #endif
2115 		bp->b_bcount = SUNSCPAL_MAX_DMA_LEN;
2116 	}
2117 	return minphys(bp);
2118 }
2119 
2120 #ifdef SUNSCPAL_USE_BUS_DMA
2121 
2122 /*
2123  * Allocate a DMA handle and put it in sr->sr_dma_hand.  Prepare
2124  * for DMA transfer.
2125  */
2126 static void
2127 sunscpal_dma_alloc(struct sunscpal_softc *sc)
2128 {
2129 	struct sunscpal_req *sr = sc->sc_current;
2130 	sunscpal_dma_handle_t dh;
2131 	int i, xlen;
2132 	u_long addr;
2133 
2134 #ifdef	DIAGNOSTIC
2135 	if (sr->sr_dma_hand != NULL)
2136 		panic("%s: already have DMA handle", __func__);
2137 #endif
2138 
2139 	addr = (u_long)sc->sc_dataptr;
2140 	xlen = sc->sc_datalen;
2141 
2142 	/* If the DMA start addr is misaligned then do PIO */
2143 	if ((addr & 1) || (xlen & 1)) {
2144 		printf("%s: misaligned.\n", __func__);
2145 		return;
2146 	}
2147 
2148 	/* Make sure our caller checked sc_min_dma_len. */
2149 	if (xlen < sc->sc_min_dma_len)
2150 		panic("%s: xlen=0x%x", __func__, xlen);
2151 
2152 	/*
2153 	 * Never attempt single transfers of more than 63k, because
2154 	 * our count register is only 16 bits.
2155 	 * This should never happen since already bounded by minphys().
2156 	 * XXX - Should just segment these...
2157 	 */
2158 	if (xlen > SUNSCPAL_MAX_DMA_LEN) {
2159 		printf("%s: excessive xlen=0x%x\n", __func__, xlen);
2160 		Debugger();
2161 		sc->sc_datalen = xlen = SUNSCPAL_MAX_DMA_LEN;
2162 	}
2163 
2164 	/* Find free DMA handle.  Guaranteed to find one since we have
2165 	   as many DMA handles as the driver has processes. */
2166 	for (i = 0; i < SUNSCPAL_OPENINGS; i++) {
2167 		if ((sc->sc_dma_handles[i].dh_flags & SUNSCDH_BUSY) == 0)
2168 			goto found;
2169 	}
2170 	panic("%s: no free DMA handles.", device_xname(sc->sc_dev));
2171  found:
2172 
2173 	dh = &sc->sc_dma_handles[i];
2174 	dh->dh_flags = SUNSCDH_BUSY;
2175 	dh->dh_mapaddr = (uint8_t *)addr;
2176 	dh->dh_maplen  = xlen;
2177 	dh->dh_dvma = 0;
2178 
2179 	/* Load the DMA map. */
2180 	if (bus_dmamap_load(sc->sunscpal_dmat, dh->dh_dmamap,
2181 	    dh->dh_mapaddr, dh->dh_maplen, NULL, BUS_DMA_NOWAIT) != 0) {
2182 		/* Can't load map */
2183 		printf("%s: can't DMA %p/0x%x\n", __func__,
2184 		    dh->dh_mapaddr, dh->dh_maplen);
2185 		dh->dh_flags = 0;
2186 		return;
2187 	}
2188 
2189 	/* success */
2190 	sr->sr_dma_hand = dh;
2191 }
2192 
2193 static void
2194 sunscpal_dma_free(struct sunscpal_softc *sc)
2195 {
2196 	struct sunscpal_req *sr = sc->sc_current;
2197 	sunscpal_dma_handle_t dh = sr->sr_dma_hand;
2198 
2199 #ifdef	DIAGNOSTIC
2200 	if (dh == NULL)
2201 		panic("%s: no DMA handle", __func__);
2202 #endif
2203 
2204 	if (sc->sc_state & SUNSCPAL_DOINGDMA)
2205 		panic("%s: free while in progress", __func__);
2206 
2207 	if (dh->dh_flags & SUNSCDH_BUSY) {
2208 		/* XXX - Should separate allocation and mapping. */
2209 		/* Give back the DVMA space. */
2210 		bus_dmamap_unload(sc->sunscpal_dmat, dh->dh_dmamap);
2211 		dh->dh_flags = 0;
2212 	}
2213 	sr->sr_dma_hand = NULL;
2214 }
2215 
2216 /*
2217  * This function is called during the SELECT phase that
2218  * precedes a COMMAND phase, in case we need to setup the
2219  * DMA engine before the bus enters a DATA phase.
2220  *
2221  * On the sc version, setup the start address and the count.
2222  */
2223 static void
2224 sunscpal_dma_setup(struct sunscpal_softc *sc)
2225 {
2226 	struct sunscpal_req *sr = sc->sc_current;
2227 	struct scsipi_xfer *xs = sr->sr_xs;
2228 	sunscpal_dma_handle_t dh = sr->sr_dma_hand;
2229 	long data_pa;
2230 	int xlen;
2231 
2232 	/*
2233 	 * Get the DVMA mapping for this segment.
2234 	 * XXX - Should separate allocation and mapin.
2235 	 */
2236 	data_pa = dh->dh_dvma;
2237 	data_pa += (sc->sc_dataptr - dh->dh_mapaddr);
2238 	if (data_pa & 1)
2239 		panic("%s: bad pa=0x%lx", __func__, data_pa);
2240 	xlen = sc->sc_datalen;
2241 	if (xlen & 1)
2242 		panic("%s: bad xlen=0x%x", __func__, xlen);
2243 	sc->sc_reqlen = xlen; 	/* XXX: or less? */
2244 
2245 #ifdef	SUNSCPAL_DEBUG
2246 	if (sunscpal_debug & SUNSCPAL_DBG_DMA) {
2247 		printf("%s: dh=%p, pa=0x%lx, xlen=0x%x\n",
2248 		    __func__, dh, data_pa, xlen);
2249 	}
2250 #endif
2251 
2252 	/* sync the DMA map: */
2253 	bus_dmamap_sync(sc->sunscpal_dmat, dh->dh_dmamap, 0, dh->dh_maplen,
2254 	    ((xs->xs_control & XS_CTL_DATA_OUT) == 0 ?
2255 	    BUS_DMASYNC_PREREAD : BUS_DMASYNC_PREWRITE));
2256 
2257 	/* Load the start address and the count. */
2258 	SUNSCPAL_WRITE_2(sc, sunscpal_dma_addr_h, (data_pa >> 16) & 0xFFFF);
2259 	SUNSCPAL_WRITE_2(sc, sunscpal_dma_addr_l, (data_pa >> 0) & 0xFFFF);
2260 	SUNSCPAL_WRITE_2(sc, sunscpal_dma_count, SUNSCPAL_DMA_COUNT_FLIP(xlen));
2261 }
2262 
2263 #endif /* SUNSCPAL_USE_BUS_DMA */
2264