xref: /netbsd-src/sys/arch/atari/dev/ncr5380.c (revision ce0bb6e8d2e560ecacbe865a848624f94498063b)
1 /*	$NetBSD: ncr5380.c,v 1.1.1.1 1995/03/26 07:12:10 leo Exp $	*/
2 
3 /*
4  * Copyright (c) 1995 Leo Weppelman.
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  * 3. All advertising materials mentioning features or use of this software
16  *    must display the following acknowledgement:
17  *      This product includes software developed by Leo Weppelman.
18  * 4. The name of the author may not be used to endorse or promote products
19  *    derived from this software without specific prior written permission
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
22  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
23  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
24  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
25  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
26  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
30  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32 
33 #include <sys/param.h>
34 #include <sys/systm.h>
35 #include <sys/kernel.h>
36 #include <sys/device.h>
37 #include <sys/buf.h>
38 #include <scsi/scsi_all.h>
39 #include <scsi/scsi_message.h>
40 #include <scsi/scsiconf.h>
41 #include <machine/iomap.h>
42 #include <machine/mfp.h>
43 #include <atari/dev/ncr5380reg.h>
44 
45 /*
46  * This is crap, but because the interrupts now run at MFP spl-level (6),
47  * splbio() is not enough at some places. The code should be checked to
48  * find out where splhigh() is needed and where splbio() should be used.
49  * Now that I use this interrupt sceme, the spl values are fake!
50  */
51 #undef splbio()
52 #define splbio()	splhigh()
53 
54 /*
55  * SCSI completion status codes, should move to sys/scsi/????
56  */
57 #define SCSMASK		0x1e	/* status code mask			*/
58 #define SCSGOOD		0x00	/* good status				*/
59 #define SCSCHKC		0x02	/* check condition			*/
60 #define SCSBUSY		0x08	/* busy status				*/
61 #define SCSCMET		0x04	/* condition met / good			*/
62 
63 /********************************************************************/
64 
65 #define	NREQ		18	/* Size of issue queue			*/
66 #define	AUTO_SENSE	1	/* Automatically issue a request-sense 	*/
67 
68 #undef	DBG_SEL			/* Show the selection process		*/
69 #undef	DBG_REQ			/* Show enqueued/ready requests		*/
70 #undef	DBG_NOWRITE		/* Do not allow writes to the targets	*/
71 #undef	DBG_PIO			/* Show the polled-I/O process		*/
72 #undef	DBG_INF			/* Show information transfer process	*/
73 #undef	DBG_NOSTATIC		/* No static functions, all in DDB trace*/
74 #define	DBG_PID			/* Keep track of driver			*/
75 #define	REAL_DMA		/* Use DMA if sensible			*/
76 #define	REAL_DMA_POLL	0	/* 1: Poll for end of DMA-transfer	*/
77 #undef	NO_TTRAM_DMA		/* Do not use DMA to TT-ram. This	*/
78 				/*    fails on older atari's		*/
79 
80 #ifdef DBG_NOSTATIC
81 #	define	static
82 #endif
83 #ifdef DBG_SEL
84 #	define	DBG_SELPRINT(a,b)	printf(a,b)
85 #else
86 #	define DBG_SELPRINT(a,b)
87 #endif
88 #ifdef DBG_PIO
89 #	define DBG_PIOPRINT(a,b,c) 	printf(a,b,c)
90 #else
91 #	define DBG_PIOPRINT(a,b,c)
92 #endif
93 #ifdef DBG_INF
94 #	define DBG_INFPRINT(a,b,c)	a(b,c)
95 #else
96 #	define DBG_INFPRINT(a,b,c)
97 #endif
98 #ifdef DBG_PID
99 	static	char	*last_hit = NULL;
100 #	define	PID(a)	last_hit = a
101 #else
102 #	define	PID(a)
103 #endif
104 
105 /*
106  * Return values of check_intr()
107  */
108 #define	INTR_SPURIOUS	0
109 #define	INTR_RESEL	2
110 #define	INTR_DMA	3
111 
112 /*
113  * Set bit for target when parity checking must be disabled.
114  * My (LWP) Maxtor 7245S  seems to generate parity errors on about 50%
115  * of all transfers while the data is correct!?
116  */
117 u_char	ncr5380_no_parchk = 0;
118 
119 /*
120  * This is the default sense-command we send.
121  */
122 static	u_char	sense_cmd[] = {
123 		REQUEST_SENSE, 0, 0, 0, sizeof(struct scsi_sense), 0
124 };
125 
126 /*
127  * True if the main co-routine is running
128  */
129 static volatile int	main_running = 0;
130 
131 /*
132  * True if callback to softint scheduled.
133  */
134 static volatile int	callback_scheduled = 0;
135 
136 /*
137  * Mask of targets selected
138  */
139 u_char	busy;
140 
141 struct	ncr_softc {
142 	struct	device		sc_dev;
143 	struct	scsi_link	sc_link;
144 };
145 
146 static void	ncr5380_minphys(struct buf *bp);
147 static int	ncr5380_scsi_cmd(struct scsi_xfer *xs);
148 static int	ncr5380_show_scsi_cmd(struct scsi_xfer *xs);
149 
150 struct scsi_adapter ncr5380_switch = {
151 	ncr5380_scsi_cmd,		/* scsi_cmd()			*/
152 	ncr5380_minphys,		/* scsi_minphys()		*/
153 	0,				/* open_target_lu()		*/
154 	0				/* close_target_lu()		*/
155 };
156 
157 struct scsi_device ncr5380_dev = {
158 	NULL,		/* use default error handler		*/
159 	NULL,		/* do not have a start functio		*/
160 	NULL,		/* have no async handler		*/
161 	NULL		/* Use default done routine		*/
162 };
163 
164 /*
165  * Max. number of dma-chains per request
166  */
167 #define	MAXDMAIO	(MAXPHYS/NBPG + 1)
168 
169 /*
170  * Some requests are not contiguous in physical memory. We need to break them
171  * up into contiguous parts for DMA.
172  */
173 struct dma_chain {
174 	u_int	dm_count;
175 	u_long	dm_addr;
176 };
177 
178 /*
179  * Define our issue, free and disconnect queue's.
180  */
181 typedef struct	req_q {
182     struct req_q	*next;	    /* next in free, issue or discon queue  */
183     struct req_q	*link;	    /* next linked command to execute       */
184     struct scsi_xfer	*xs;	    /* request from high-level driver       */
185     u_char		dr_flag;    /* driver state			    */
186     u_char		phase;	    /* current SCSI phase		    */
187     u_char		msgout;	    /* message to send when requested       */
188     u_char		targ_id;    /* target for command		    */
189     u_char		status;	    /* returned status byte		    */
190     u_char		message;    /* returned message byte		    */
191     struct dma_chain	dm_chain[MAXDMAIO];
192     struct dma_chain	*dm_cur;    /* current dma-request		    */
193     struct dma_chain	*dm_last;   /* last dma-request			    */
194     long		xdata_len;  /* length of transfer		    */
195     u_char		*xdata_ptr; /* physical address of transfer	    */
196     struct scsi_generic	xcmd;	    /* command to execute		    */
197 } SC_REQ;
198 
199 /*
200  * Values for dr_flag:
201  */
202 #define	DRIVER_IN_DMA	1	/* Non-polled DMA activated		*/
203 #define	DRIVER_AUTOSEN	2	/* Doing automatic sense		*/
204 #define	DRIVER_NOINT	4	/* We are booting: no interrupts	*/
205 #define	DRIVER_DMAOK	8	/* DMA can be used on this request	*/
206 
207 
208 static SC_REQ	req_queue[NREQ];
209 static SC_REQ	*free_head = NULL;	/* Free request structures	*/
210 static SC_REQ	*issue_q   = NULL;	/* Commands waiting to be issued*/
211 static SC_REQ	*discon_q  = NULL;	/* Commands disconnected	*/
212 static SC_REQ	*connected = NULL;	/* Command currently connected	*/
213 
214 /*
215  * Function decls:
216  */
217 static int  transfer_pio __P((u_char *, u_char *, u_long *));
218 static int  wait_req_true __P((void));
219 static int  wait_req_false __P((void));
220 static int  scsi_select __P((SC_REQ *, int));
221 static int  handle_message __P((SC_REQ *, u_int));
222 static int  information_transfer __P((void));
223 static void  reselect __P((void));
224 static int  dma_ready __P((int, int));
225 static void transfer_dma __P((SC_REQ *, u_int, int));
226 static int  check_autosense __P((SC_REQ *, int));
227 static int  reach_msg_out __P((u_long));
228 static void timer __P((void));
229 static int  check_intr __P((void));
230 static void scsi_reset __P((void));
231 static void scsi_main __P((void));
232 static int  scsi_dmaok __P((SC_REQ *));
233 static void run_main __P((void));
234 
235 static void show_request __P((SC_REQ *, char *));
236 static void show_phase __P((SC_REQ *, int));
237 static void show_signals __P((void));
238 
239 /*
240  * Inline functions:
241  */
242 extern __inline__ void scsi_ienable()
243 {
244 	MFP2->mf_ierb |= IB_SCDM;
245 	MFP2->mf_iera |= IA_SCSI;
246 	MFP2->mf_imra |= IA_SCSI;
247 }
248 
249 extern __inline__ scsi_idisable()
250 {
251 	int	sps = splbio();
252 	MFP2->mf_ierb &= ~IB_SCDM;
253 	MFP2->mf_iera &= ~IA_SCSI;
254 	splx(sps);
255 }
256 
257 /*
258  * Determine the size of a SCSI command.
259  */
260 extern __inline__ int command_size(opcode)
261 u_char	opcode;
262 {
263 	switch((opcode >> 4) & 0xf) {
264 		case 0:
265 		case 1:
266 			return(6);
267 		case 2:
268 		case 3:
269 			return(10);
270 	}
271 	return(12);
272 }
273 
274 
275 /*
276  * Wait for request-line to become active. When it doesn't return 0.
277  * Otherwise return != 0.
278  * The timeouts in the 'wait_req_*' functions are arbitrary and rather
279  * large. In 99% of the invocations nearly no timeout is needed but in
280  * some cases (especially when using my tapedrive, a Tandberg 3600) the
281  * device is busy internally and the first SCSI-phase will be delayed.
282  */
283 extern __inline__ int wait_req_true(void)
284 {
285 	int	timeout = 25000;
286 
287 	while(!(SCSI_5380->scsi_idstat & SC_S_REQ) && --timeout)
288 		delay(1);
289 	return(SCSI_5380->scsi_idstat & SC_S_REQ);
290 }
291 
292 /*
293  * Wait for request-line to become inactive. When it doesn't return 0.
294  * Otherwise return != 0.
295  */
296 extern __inline__ int wait_req_false(void)
297 {
298 	int	timeout = 25000;
299 
300 	while((SCSI_5380->scsi_idstat & SC_S_REQ) && --timeout)
301 		delay(1);
302 	return(!(SCSI_5380->scsi_idstat & SC_S_REQ));
303 }
304 
305 extern __inline__ void finish_req(SC_REQ *reqp)
306 {
307 	int			sps;
308 	struct scsi_xfer	*xs = reqp->xs;
309 
310 	/*
311 	 * Return request to free-q
312 	 */
313 	sps = splbio();
314 	reqp->next = free_head;
315 	free_head  = reqp;
316 	splx(sps);
317 
318 	xs->flags |= ITSDONE;
319 	scsi_done(xs);
320 }
321 
322 /*
323  * Auto config stuff....
324  */
325 int	ncr_print __P((void *auxp, char *));
326 void	ncr_attach __P((struct device *, struct device *, void *));
327 int	ncr_match __P((struct device *, struct cfdata *, void *));
328 
329 struct cfdriver ncrscsicd = {
330 	NULL, "ncrscsi", (cfmatch_t)ncr_match, ncr_attach,
331 	DV_DULL, sizeof(struct ncr_softc), NULL, 0 };
332 
333 int
334 ncr_match(pdp, cdp, auxp)
335 struct device	*pdp;
336 struct cfdata	*cdp;
337 void		*auxp;
338 {
339 	if(strcmp(auxp, ncrscsicd.cd_name))
340 		return(0);
341 	if(cdp->cf_unit != 0)	/* Only one unit	*/
342 		return(0);
343 	return(1);
344 }
345 
346 void
347 ncr_attach(pdp, dp, auxp)
348 struct device	*pdp, *dp;
349 void		*auxp;
350 {
351 	struct ncr_softc	*sc;
352 	int					i;
353 
354 	sc = (struct ncr_softc *)dp;
355 
356 	sc->sc_link.adapter_softc   = sc;
357 	sc->sc_link.adapter_target  = 7;
358 	sc->sc_link.adapter         = &ncr5380_switch;
359 	sc->sc_link.device          = &ncr5380_dev;
360 	sc->sc_link.openings        = NREQ - 1;
361 
362 	/*
363 	 * Enable SCSI-related interrupts
364 	 */
365 	MFP2->mf_aer |= 0x80; /* SCSI IRQ goes HIGH!!!!! */
366 
367 	MFP2->mf_ierb |= IB_SCDM;	/* SCSI-dma interrupts	*/
368 	MFP2->mf_iprb &= ~IB_SCDM;
369 	MFP2->mf_imrb |= IB_SCDM;
370 
371 	MFP2->mf_iera |= IA_SCSI;	/* SCSI-5380 interrupts	*/
372 	MFP2->mf_ipra &= ~IA_SCSI;
373 	MFP2->mf_imra |= IA_SCSI;
374 
375 	/*
376 	 * Initialize request queue freelist.
377 	 */
378 	for(i = 0; i < NREQ; i++) {
379 		req_queue[i].next = free_head;
380 		free_head = &req_queue[i];
381 	}
382 
383 	/*
384 	 * Initialize the host adapter
385 	 */
386 	scsi_idisable();
387 	SCSI_5380->scsi_icom   = 0;
388 	SCSI_5380->scsi_mode   = IMODE_BASE;
389 	SCSI_5380->scsi_tcom   = 0;
390 	SCSI_5380->scsi_idstat = 0;
391 
392 	printf("\n");
393 
394 
395 	/*
396 	 * attach all scsi units on us
397 	 */
398 	config_found(dp, &sc->sc_link, ncr_print);
399 }
400 
401 /*
402  * print diag if name is NULL else just extra
403  */
404 int
405 ncr_print(auxp, name)
406 void	*auxp;
407 char	*name;
408 {
409 	if(name == NULL)
410 		return(UNCONF);
411 	return(QUIET);
412 }
413 /*
414  * End of auto config stuff....
415  */
416 
417 /*
418  * Carry out a request from the high level driver.
419  */
420 static int
421 ncr5380_scsi_cmd(struct scsi_xfer *xs)
422 {
423 	int	sps;
424 	SC_REQ	*reqp;
425 	int	flags = xs->flags;
426 
427 	/*
428 	 * Sanity check on flags...
429 	 */
430 	if(flags & ITSDONE) {
431 		printf("ncr5380_scsi_cmd: command already done.....\n");
432 		xs->flags &= ~ITSDONE;
433 	}
434 	if(!(flags & INUSE)) {
435 		printf("ncr5380_scsi_cmd: command not in use.....\n");
436 		xs->flags |= ~INUSE;
437 	}
438 
439 	/*
440 	 * LWP: No lun support yet XXX
441 	 */
442 	if(xs->sc_link->lun != 0) {
443 		xs->error = XS_DRIVER_STUFFUP; /* XXX */
444 		return(COMPLETE);
445 	}
446 
447 	/*
448 	 * We do not queue RESET commands
449 	 */
450 	if(flags & SCSI_RESET) {
451 		scsi_reset();
452 		return(COMPLETE);
453 	}
454 
455 	/*
456 	 * Get a request block
457 	 */
458 	sps = splbio();
459 	if((reqp = free_head) == 0) {
460 		splx(sps);
461 		return(TRY_AGAIN_LATER);
462 	}
463 	free_head  = reqp->next;
464 	reqp->next = NULL;
465 	splx(sps);
466 
467 	/*
468 	 * Initialize our private fields
469 	 */
470 	reqp->dr_flag   = (xs->flags & SCSI_POLL) ? DRIVER_NOINT : 0;
471 	reqp->phase     = NR_PHASE;
472 	reqp->msgout    = MSG_NOOP;
473 	reqp->status    = SCSGOOD;
474 	reqp->link      = NULL;
475 	reqp->xs        = xs;
476 	reqp->targ_id   = xs->sc_link->target;
477 	reqp->xdata_ptr = (u_char*)xs->data;
478 	reqp->xdata_len = xs->datalen;
479 	memcpy(&reqp->xcmd, xs->cmd, sizeof(struct scsi_generic));
480 
481 	/*
482 	 * Check if DMA can be used on this request
483 	 */
484 	if(!(xs->flags & SCSI_POLL) && scsi_dmaok(reqp))
485 		reqp->dr_flag |= DRIVER_DMAOK;
486 
487 	/*
488 	 * Insert the command into the issue queue. Note that 'REQUEST SENSE'
489 	 * commands are inserted at the head of the queue since any command
490 	 * will clear the existing contingent allegience condition and the sense
491 	 * data is only valid while the condition exists.
492 	 * When possible, link the command to a previous command to the same
493 	 * target. This is not very sensible when AUTO_SENSE is not defined!
494 	 * Interrupts are disabled while we are fiddling with the issue-queue.
495 	 */
496 	sps = splbio();
497 	if((issue_q == NULL) || (reqp->xcmd.opcode == REQUEST_SENSE)) {
498 		reqp->next = issue_q;
499 		issue_q    = reqp;
500 	}
501 	else {
502 		SC_REQ	*tmp, *link;
503 
504 		tmp  = issue_q;
505 		link = NULL;
506 		do {
507 		    if(!link && (tmp->targ_id == reqp->targ_id) && !tmp->link)
508 				link = tmp;
509 		} while(tmp->next && (tmp = tmp->next));
510 		tmp->next = reqp;
511 #ifdef AUTO_SENSE
512 		if(link) {
513 			link->link = reqp;
514 			link->xcmd.bytes[link->xs->cmdlen-1] |= 1;
515 		}
516 #endif
517 	}
518 	splx(sps);
519 
520 #ifdef DBG_REQ
521 	show_request(reqp,(reqp->xcmd.opcode == REQUEST_SENSE) ? "HEAD":"TAIL");
522 #endif
523 
524 	run_main();
525 
526 	if(xs->flags & SCSI_POLL)
527 		return(COMPLETE);	/* We're booting */
528 	return(SUCCESSFULLY_QUEUED);
529 }
530 
531 #define MIN_PHYS	65536	/*BARF!!!!*/
532 static void
533 ncr5380_minphys(struct buf *bp)
534 {
535     if(bp->b_bcount > MIN_PHYS) {
536 	printf("Uh-oh...  ncr5380_minphys setting bp->b_bcount=%x.\n",MIN_PHYS);
537 	bp->b_bcount = MIN_PHYS;
538     }
539 }
540 #undef MIN_PHYS
541 
542 static int
543 ncr5380_show_scsi_cmd(struct scsi_xfer *xs)
544 {
545 	u_char	*b = (u_char *) xs->cmd;
546 	int	i  = 0;
547 
548 	if(!(xs->flags & SCSI_RESET)) {
549 		printf("ncr5380(%d:%d:%d,0x%x)-", xs->sc_link->scsibus,
550 		    xs->sc_link->target, xs->sc_link->lun, xs->sc_link->flags);
551 		while(i < xs->cmdlen) {
552 			if(i)
553 				printf(",");
554 			printf("%x",b[i++]);
555 		}
556 		printf("-\n");
557 	}
558 	else {
559 		printf("ncr5380(%d:%d:%d)-RESET-\n",
560 		    xs->sc_link->scsibus,xs->sc_link->target, xs->sc_link->lun);
561 	}
562 }
563 
564 /*
565  * The body of the driver.
566  */
567 static void
568 scsi_main()
569 {
570 	SC_REQ	*req, *prev;
571 	int	itype;
572 	int	sps;
573 
574 	/*
575 	 * While running in the driver SCSI-interrupts are disabled.
576 	 */
577 	scsi_idisable();
578 
579 	PID(")");
580 	for(;;) {
581 	    sps = splbio();
582 	    if(!connected) {
583 
584 		/*
585 		 * Search through the issue-queue for a command
586 		 * destined for a target that isn't busy.
587 		 */
588 		prev = NULL;
589 		for(req=issue_q; req != NULL; prev = req, req = req->next) {
590 			if(!(busy & (1 << req->targ_id))) {
591 				/*
592 				 * Found one, remove it from the issue queue
593 				 */
594 				if(prev == NULL)
595 					issue_q = req->next;
596 				else prev->next = req->next;
597 				req->next = NULL;
598 				break;
599 			}
600 		}
601 
602 		/*
603 		 * When a request has just ended, we get here before an other
604 		 * device detects that the bus is free and that it can
605 		 * reconnect. The problem is that when this happens, we always
606 		 * baffle the device because our (initiator) id is higher. This
607 		 * can cause a sort of starvation on slow devices. So we check
608 		 * for a pending reselection here.
609 		 * Note that 'connected' will be non-null if the reselection
610 		 * succeeds.
611 		 */
612 		if((SCSI_5380->scsi_idstat&(SC_S_SEL|SC_S_IO))
613 						== (SC_S_SEL|SC_S_IO)){
614 			if(req != NULL) {
615 				req->next = issue_q;
616 				issue_q = req;
617 			}
618 			splx(sps);
619 
620 			reselect();
621 			SC_CLINT;
622 			goto connected;
623 		}
624 
625 		/*
626 		 * The host is not connected and there is no request
627 		 * pending, exit.
628 		 */
629 		if(req == NULL) {
630 			PID("{");
631 			goto main_exit;
632 		}
633 
634 		/*
635 		 * Re-enable interrupts before handling the request.
636 		 */
637 		splx(sps);
638 
639 #ifdef DBG_REQ
640 		show_request(req, "TARGET");
641 #endif
642 		/*
643 		 * We found a request. Try to connect to the target. If the
644 		 * initiator fails arbitration, the command is put back in the
645 		 * issue queue.
646 		 */
647 		if(scsi_select(req, 0)) {
648 			sps = splbio();
649 			req->next = issue_q;
650 			issue_q = req;
651 			splx(sps);
652 #ifdef DBG_REQ
653 			printf("Select failed on target %d\n", req->targ_id);
654 #endif
655 		}
656 	    }
657 	    else splx(sps);
658 connected:
659 	    if(connected) {
660 		/*
661 		 * If the host is currently connected but a 'real-dma' transfer
662 		 * is in progress, the 'end-of-dma' interrupt restarts main.
663 		 * So quit.
664 		 */
665 		sps = splbio();
666 		if(connected && (connected->dr_flag & DRIVER_IN_DMA)) {
667 			PID("[");
668 			goto main_exit;
669 		}
670 		splx(sps);
671 
672 		/*
673 		 * Let the target guide us through the bus-phases
674 		 */
675 		while(information_transfer() == -1)
676 			;
677 	    }
678 	}
679 	/* NEVER TO REACH HERE */
680 	panic("TTSCSI: not designed to come here");
681 
682 main_exit:
683 	/*
684 	 * We enter here with interrupts disabled. We are about to exit main
685 	 * so interrupts should be re-enabled. Because interrupts are edge
686 	 * triggered, we could already have missed the interrupt. Therefore
687 	 * we check the IRQ-line here and re-enter when we really missed a
688 	 * valid interrupt.
689 	 */
690 	PID("S");
691 	scsi_ienable();
692 	SCSI_5380->scsi_idstat = SC_HOST_ID;
693 	if(SCSI_5380->scsi_dmstat & SC_IRQ_SET) {
694 		if((itype = check_intr()) != INTR_SPURIOUS) {
695 			scsi_idisable();
696 			splx(sps);
697 
698 			if(itype == INTR_RESEL)
699 				reselect();
700 			else dma_ready(0, 0);
701 			SC_CLINT;
702 			goto connected;
703 		}
704 	}
705 	main_running = 0;
706 	splx(sps);
707 	PID("R");
708 }
709 
710 /*
711  * The SCSI-DMA interrupt.
712  * This interrupt can only be triggered when running in non-polled DMA
713  * mode. When DMA is not active, it will be silently ignored, it is usually
714  * to late because the EOP interrupt of the controller happens just a tiny
715  * bit earlier. It might become usefull when scatter/gather is implemented,
716  * because in that case only part of the DATAIN/DATAOUT transfer is taken
717  * out of a single buffer.
718  */
719 scsi_dma(sr)
720 int	sr;	/* sr at time of interrupt */
721 {
722 	SC_REQ	*reqp;
723 	int	dma_done;
724 
725 	PID("9");
726 	if((reqp = connected) && (reqp->dr_flag & DRIVER_IN_DMA)) {
727 		scsi_idisable();
728 		if(!(dma_done = dma_ready(0, 0))) {
729 			scsi_ienable();
730 			transfer_dma(reqp, reqp->phase, 0);
731 			return;
732 		}
733 		PID("!");
734 		if(!BASEPRI(sr)) {
735 			if(!callback_scheduled++)
736 				add_sicallback(run_main, 0, 0);
737 		}
738 		else {
739 			spl1();
740 			run_main();
741 		}
742 	}
743 	/* PID("#"); */
744 }
745 
746 /*
747  * The SCSI-controller interrupt. This interrupt occurs on reselections and
748  * at the end of non-polled DMA-interrupts.
749  */
750 scsi_ctrl(sr)
751 int	sr;	/* sr at time of interrupt */
752 {
753 	int	itype;
754 	int	dma_done;
755 
756 	/* PID("$"); */
757 	while(SCSI_5380->scsi_dmstat & SC_IRQ_SET) {
758 		scsi_idisable();
759 		/* PID("&"); */
760 		if((itype = check_intr()) != INTR_SPURIOUS) {
761 			/* PID("o"); */
762 			if(itype == INTR_RESEL)
763 				reselect();
764 			else {
765 			    if(!(dma_done = dma_ready(0, 0))) {
766 				scsi_ienable();
767 				transfer_dma(connected, connected->phase, 0);
768 				return;
769 			    }
770 			}
771 			SC_CLINT;
772 		}
773 		/* PID("*"); */
774 		if(!BASEPRI(sr)) {
775 			if(!callback_scheduled++)
776 				add_sicallback(run_main, 0, 0);
777 		}
778 		else {
779 			spl1();
780 			run_main();
781 		}
782 		return;
783 	}
784 	PID("(");
785 }
786 
787 /*
788  * Initiate a connection path between the host and the target. The function
789  * first goes into arbitration for the SCSI-bus. When this succeeds, the target
790  * is selected and an 'IDENTIFY' message is send.
791  * Returns -1 when the arbitration failed. Otherwise 0 is returned. When
792  * the target does not respond (to either selection or 'MESSAGE OUT') the
793  * 'done' function is executed.
794  * The result code given by the driver can be influenced by setting 'code'
795  * to a non-zero value. This is the case when 'select' is called by abort.
796  */
797 static int
798 scsi_select(reqp, code)
799 SC_REQ	*reqp;
800 {
801 	u_long	timeout;
802 	u_char	tmp[1];
803 	u_char	phase;
804 	u_long	cnt;
805 	int	sps;
806 
807 	DBG_SELPRINT ("Starting arbitration\n", 0);
808 	PID("T");
809 
810 	sps = splbio();
811 
812 	/*
813 	 * Prevent a race condition here. If a reslection interrupt occurred
814 	 * between the decision to pick a new request and the call to select,
815 	 * we abort the selection.
816 	 * Interrupts are lowered when the 5380 is setup to arbitrate for the
817 	 * bus.
818 	 */
819 	if(connected || (SCSI_5380->scsi_idstat & SC_S_BSY)) {
820 		splx(sps);
821 		PID("Y");
822 		return(-1);
823 	}
824 
825 	/*
826 	 * Set phase bits to 0, otherwise the 5380 won't drive the bus during
827 	 * selection.
828 	 */
829 	SCSI_5380->scsi_tcom = 0;
830 	SCSI_5380->scsi_icom = 0;
831 
832 	/*
833 	 * Arbitrate for the bus.
834 	 */
835 	SCSI_5380->scsi_data = SC_HOST_ID;
836 	SCSI_5380->scsi_mode = SC_ARBIT;
837 
838 	splx(sps);
839 
840 	cnt = 10000;
841 	while(!(SCSI_5380->scsi_icom & SC_AIP) && --cnt)
842 		delay(1);
843 
844 	if(!(SCSI_5380->scsi_icom & SC_AIP)) {
845 		SCSI_5380->scsi_mode = IMODE_BASE;
846 		delay(1);
847 		PID("U");
848 
849 		if(SCSI_5380->scsi_idstat & SC_S_BSY) {
850 			/*
851 			 * Damn, we have a connected target that we don't know
852 			 * of. Some targets seem to respond to a selection
853 			 * AFTER the selection-timeout. Try to get the target
854 			 * into the Message-out phase so we can send an ABORT
855 			 * message. We try to avoid resetting the SCSI-bus!
856 			 */
857 			if(!reach_msg_out(sizeof(struct scsi_generic))) {
858 				u_long	len   = 1;
859 				u_char	phase = PH_MSGOUT;
860 				u_char	msg   = MSG_ABORT;
861 
862 				transfer_pio(&phase, &msg, &len);
863 			}
864 			else if(SCSI_5380->scsi_idstat & SC_S_BSY)
865 					scsi_reset();
866 		}
867 		PID("I");
868 		return(-1);
869 	}
870 
871 	/* The arbitration delay is 2.2 usecs */
872 	delay(3);
873 
874 	/*
875 	 * Check the result of the arbitration. If we failed, return -1.
876 	 */
877 	if(SCSI_5380->scsi_icom & SC_LA) {
878 		/*
879 		 * The spec requires that we should read the data register to
880 		 * check for higher id's and check the SC_LA again.
881 		 */
882 		tmp[0] = SCSI_5380->scsi_data;
883 		if(SCSI_5380->scsi_icom & SC_LA) {
884 			SCSI_5380->scsi_mode = IMODE_BASE;
885 			SCSI_5380->scsi_icom = 0;
886 			DBG_SELPRINT ("Arbitration lost,deassert SC_ARBIT\n",0);
887 			PID("O");
888 			return(-1);
889 		}
890 	}
891 	SCSI_5380->scsi_icom = SC_A_SEL | SC_A_BSY;
892 	if(SCSI_5380->scsi_icom & SC_LA) {
893 		SCSI_5380->scsi_mode = IMODE_BASE;
894 		SCSI_5380->scsi_icom = 0;
895 		DBG_SELPRINT ("Arbitration lost, deassert SC_A_SEL\n", 0);
896 		PID("P");
897 		return(-1);
898 	}
899 	/* Bus settle delay + Bus clear delay = 1.2 usecs */
900 	delay(2);
901 	DBG_SELPRINT ("Arbitration complete\n", 0);
902 
903 	/*
904 	 * Now that we won the arbitration, start the selection.
905 	 */
906 	SCSI_5380->scsi_data = SC_HOST_ID | (1 << reqp->targ_id);
907 
908 	/*
909 	 * Raise ATN while SEL is true before BSY goes false from arbitration,
910 	 * since this is the only way to guarantee that we'll get a MESSAGE OUT
911 	 * phase immediately after the selection.
912 	 */
913 	SCSI_5380->scsi_icom = SC_A_BSY | SC_A_SEL | SC_A_ATN | SC_ADTB;
914 	SCSI_5380->scsi_mode = IMODE_BASE;
915 
916 	/*
917 	 * Turn off reselection interrupts
918 	 */
919 	SCSI_5380->scsi_idstat = 0;
920 
921 	/*
922 	 * Reset BSY. The delay following it, surpresses a glitch in the
923 	 * 5380 which causes us to see our own BSY signal instead of that of
924 	 * the target.
925 	 */
926 	SCSI_5380->scsi_icom  = SC_A_SEL | SC_A_ATN | SC_ADTB;
927 	delay(1);
928 
929 	/*
930 	 * Wait for the target to react, the specs call for a timeout of
931 	 * 250 ms.
932 	 */
933 	cnt = 250000 /* 250 */;
934 	while(!(SCSI_5380->scsi_idstat & SC_S_BSY) && --cnt)
935 		delay(1);
936 
937 	if(!(SCSI_5380->scsi_idstat & SC_S_BSY)) {
938 		/*
939 		 * There is no reaction from the target, start the selection
940 		 * timeout procedure. We release the databus but keep SEL
941 		 * asserted. After that we wait a 'selection abort time' (200
942 		 * usecs) and 2 deskew delays (90 ns) and check BSY again.
943 		 * When BSY is asserted, we assume the selection succeeded,
944 		 * otherwise we release the bus.
945 		 */
946 		SCSI_5380->scsi_icom  = SC_A_SEL | SC_A_ATN;
947 		delay(201);
948 		if(!(SCSI_5380->scsi_idstat & SC_S_BSY)) {
949 			SCSI_5380->scsi_icom = 0;
950 			reqp->xs->error      = code ? code : XS_SELTIMEOUT;
951 			DBG_SELPRINT ("Target %d not responding to sel\n",
952 								reqp->targ_id);
953 			finish_req(reqp);
954 			PID("A");
955 			return(0);
956 		}
957 	}
958 	SCSI_5380->scsi_icom = SC_A_ATN;
959 
960 	DBG_SELPRINT ("Target %d responding to select.\n", reqp->targ_id);
961 
962 	/*
963 	 * The SCSI-interrupts are disabled while a request is being handled.
964 	 */
965 	scsi_idisable();
966 
967 	/*
968 	 * Since we followed the SCSI-spec and raised ATN while SEL was true
969 	 * but before BSY was false during the selection, a 'MESSAGE OUT'
970 	 * phase should follow. Here we send an 'IDENTIFY' message.
971 	 * Allow disconnect only when interrups are allowed.
972 	 */
973 	tmp[0] = MSG_IDENTIFY(0, (reqp->dr_flag & DRIVER_NOINT) ? 0 : 1);
974 	cnt    = 1;
975 	phase  = PH_MSGOUT;
976 	if(transfer_pio(&phase, tmp, &cnt) || cnt) {
977 		DBG_SELPRINT ("Target %d: failed to send identify\n",
978 							reqp->targ_id);
979 		/*
980 		 * Try to disconnect from the target. We cannot leave it just
981 		 * hanging here.
982 		 */
983 		if(!reach_msg_out(sizeof(struct scsi_generic))) {
984 			u_long	len   = 1;
985 			u_char	phase = PH_MSGOUT;
986 			u_char	msg   = MSG_ABORT;
987 
988 			transfer_pio(&phase, &msg, &len);
989 		}
990 		else scsi_reset();
991 
992 		SCSI_5380->scsi_icom = 0;
993 		reqp->xs->error = code ? code : XS_DRIVER_STUFFUP;
994 		finish_req(reqp);
995 		PID("S");
996 		return(0);
997 	}
998 	reqp->phase = PH_MSGOUT;
999 
1000 #ifdef notyet /* LWP: Do we need timeouts in the driver? */
1001 	/*
1002 	 * Command is connected, start timer ticking.
1003 	 */
1004 	ccb_p->xtimeout = ccb_p->timeout + Lbolt;
1005 #endif
1006 
1007 	connected  = reqp;
1008 	busy      |= 1 << reqp->targ_id;
1009 	PID("D");
1010 	return(0);
1011 }
1012 
1013 /*
1014  * Return codes:
1015  *	-1: quit main, trigger on interrupt
1016  *   0: keep on running main.
1017  */
1018 static int
1019 information_transfer()
1020 {
1021 	SC_REQ	*reqp = connected;
1022 	u_char	tmp, phase;
1023 	u_long	len;
1024 
1025 	PID("F");
1026 	/*
1027 	 * Clear pending interrupts from 5380-chip.
1028 	 */
1029 	SC_CLINT;
1030 
1031 	/*
1032 	 * We only have a valid SCSI-phase when REQ is asserted. Something
1033 	 * is deadly wrong when BSY has dropped.
1034 	 */
1035 	tmp = SCSI_5380->scsi_idstat;
1036 
1037 	if(!(tmp & SC_S_BSY)) {
1038 		busy           &= ~(1 << reqp->targ_id);
1039 		connected       = NULL;
1040 		reqp->xs->error = XS_BUSY;
1041 		finish_req(reqp);
1042 		PID("G");
1043 		return(0);
1044 	}
1045 
1046 	if(tmp & SC_S_REQ) {
1047 		phase = (tmp >> 2) & 7;
1048 		if(phase != reqp->phase) {
1049 			reqp->phase = phase;
1050 			DBG_INFPRINT(show_phase, reqp, phase);
1051 		}
1052 	}
1053 	else return(-1);
1054 
1055 	switch(phase) {
1056 	    case PH_DATAOUT:
1057 
1058 #ifdef DBG_NOWRITE
1059 		printf("NOWRITE set -- write attempt aborted.");
1060 		reqp->msgout = MSG_ABORT;
1061 		SCSI_5380->scsi_icom = SC_A_ATN;
1062 		return(-1);
1063 #endif /* DBG_NOWRITE */
1064 
1065 	   case PH_DATAIN:
1066 #ifdef REAL_DMA
1067 		if(reqp->dr_flag & DRIVER_DMAOK) {
1068 			int poll = REAL_DMA_POLL|(reqp->dr_flag & DRIVER_NOINT);
1069 			transfer_dma(reqp, phase, poll);
1070 			if(!poll)
1071 				return(0);
1072 		}
1073 		else
1074 #endif
1075 		{
1076 			PID("H");
1077 			len = reqp->xdata_len;
1078 			transfer_pio(&phase, reqp->xdata_ptr, &len);
1079 			reqp->xdata_ptr += reqp->xdata_len - len;
1080 			reqp->xdata_len  = len;
1081 		}
1082 		return(-1);
1083 	   case PH_MSGIN:
1084 		/*
1085 		 * We only expect single byte messages here.
1086 		 */
1087 		len = 1;
1088 		transfer_pio(&phase, &tmp, &len);
1089 		reqp->message = tmp;
1090 		return(handle_message(reqp, tmp));
1091 	   case PH_MSGOUT:
1092 		len = 1;
1093 		transfer_pio(&phase, &reqp->msgout, &len);
1094 		if(reqp->msgout == MSG_ABORT) {
1095 			busy     &= ~(1 << reqp->targ_id);
1096 			connected = NULL;
1097 			reqp->xs->error = XS_DRIVER_STUFFUP;
1098 			finish_req(reqp);
1099 			PID("J");
1100 			return(0);
1101 		}
1102 		reqp->msgout = MSG_NOOP;
1103 		return(-1);
1104 	   case PH_CMD :
1105 		len = command_size(reqp->xcmd.opcode);
1106 		transfer_pio(&phase, (u_char *)&reqp->xcmd, &len);
1107 		PID("K");
1108 		return(-1);
1109 	   case PH_STATUS:
1110 		len = 1;
1111 		transfer_pio(&phase, &tmp, &len);
1112 		reqp->status = tmp;
1113 		PID("L");
1114 		return(-1);
1115 	   default :
1116 		printf("SCSI: unknown phase on target %d\n", reqp->targ_id);
1117 	}
1118 	PID(":");
1119 	return(-1);
1120 }
1121 
1122 /*
1123  * Handle the message 'msg' send to us by the target.
1124  * Return values:
1125  *	 0 : The current command has completed.
1126  *	-1 : Get on to the next phase.
1127  */
1128 static int
1129 handle_message(reqp, msg)
1130 SC_REQ	*reqp;
1131 u_int	msg;
1132 {
1133 	int	sps;
1134 
1135 	PID(";");
1136 	switch(msg) {
1137 		/*
1138 		 * Linking lets us reduce the time required to get
1139 		 * the next command to the device, skipping the arbitration
1140 		 * and selection time. In the current implementation,
1141 		 * we merely have to start the next command pointed
1142 		 * to by 'next_link'.
1143 		 */
1144 		case MSG_LINK_CMD_COMPLETE:
1145 		case MSG_LINK_CMD_COMPLETEF:
1146 			if(reqp->link == NULL) {
1147 				printf("SCSI: no link for linked command"
1148 					"on target %d\n", reqp->targ_id);
1149 				reqp->msgout = MSG_ABORT;
1150 				SCSI_5380->scsi_icom = SC_A_ATN;
1151 				PID("@");
1152 				return(-1);
1153 			}
1154 			reqp->xs->error = 0;
1155 
1156 #ifdef AUTO_SENSE
1157 			if(check_autosense(reqp, 0) == -1)
1158 				return(-1);
1159 #endif /* AUTO_SENSE */
1160 
1161 #ifdef DBG_REQ
1162 			show_request(reqp->link, "LINK");
1163 #endif
1164 			connected = reqp->link;
1165 			finish_req(reqp);
1166 			PID("'");
1167 			return(-1);
1168 		case MSG_ABORT:
1169 		case MSG_CMDCOMPLETE:
1170 #ifdef DBG_REQ
1171 			show_request(reqp, "DONE");
1172 #endif
1173 			connected = NULL;
1174 			busy     &= ~(1 << reqp->targ_id);
1175 			if(!(reqp->dr_flag & DRIVER_AUTOSEN))
1176 				reqp->xs->resid = reqp->xdata_len;
1177 				reqp->xs->error = 0;
1178 
1179 #ifdef AUTO_SENSE
1180 			if(check_autosense(reqp, 0) == -1) {
1181 				PID("Z");
1182 				return(0);
1183 			}
1184 #endif /* AUTO_SENSE */
1185 
1186 			finish_req(reqp);
1187 			PID("X");
1188 			return(0);
1189 		case MSG_MESSAGE_REJECT:
1190 			PID("C");
1191 			return(-1);
1192 		case MSG_DISCONNECT:
1193 #ifdef DBG_REQ
1194 			show_request(reqp, "DISCON");
1195 #endif
1196 			sps = splbio();
1197 			connected  = NULL;
1198 			reqp->next = discon_q;
1199 			discon_q   = reqp;
1200 			splx(sps);
1201 			PID("V");
1202 			return(0);
1203 		case MSG_SAVEDATAPOINTER:
1204 		case MSG_RESTOREPOINTERS:
1205 			/*
1206 			 * We save pointers implicitely at disconnect.
1207 			 * So we can ignore these messages.
1208 			 */
1209 			PID("B");
1210 			return(-1);
1211 		default:
1212 			printf("SCSI: unkown message %x on target %d\n", msg,
1213 								reqp->targ_id);
1214 			return(-1);
1215 	}
1216 	PID("N");
1217 	return(-1);
1218 }
1219 
1220 /*
1221  * Handle reselection. If a valid reconnection occurs, connected
1222  * points at the reconnected command. The command is removed from the
1223  * disconnected queue.
1224  */
1225 static void
1226 reselect()
1227 {
1228 	u_char	phase;
1229 	u_long	len;
1230 	u_char	msg;
1231 	u_char	target_mask;
1232 	int	abort = 0;
1233 	SC_REQ	*tmp, *prev;
1234 
1235 	PID("M");
1236 	target_mask = SCSI_5380->scsi_data & ~SC_HOST_ID;
1237 
1238 	/*
1239 	 * At this point, we have detected that our SCSI-id is on the bus,
1240 	 * SEL is true and BSY was false for at least one bus settle
1241 	 * delay (400 ns.).
1242 	 * We must assert BSY ourselves, until the target drops the SEL signal.
1243 	 */
1244 	SCSI_5380->scsi_icom = SC_A_BSY;
1245 	while(SCSI_5380->scsi_idstat & SC_S_SEL)
1246 		;
1247 
1248 	SCSI_5380->scsi_icom = 0;
1249 
1250 	/*
1251 	 * Get the expected identify message.
1252 	 */
1253 	phase = PH_MSGIN;
1254 	len   = 1;
1255 	transfer_pio(&phase, &msg, &len);
1256 	if(len || !MSG_ISIDENTIFY(msg)) {
1257 		printf("SCSI: expecting IDENTIFY, got 0x%x\n", msg);
1258 		abort = 1;
1259 	}
1260 	else {
1261 	    /*
1262 	     * Find the command reconnecting
1263 	     */
1264 	    for(tmp = discon_q, prev = NULL; tmp; prev = tmp, tmp = tmp->next){
1265 		if(target_mask == (1 << tmp->targ_id)) {
1266 			if(prev)
1267 				prev->next = tmp->next;
1268 			else discon_q = tmp->next;
1269 			tmp->next = NULL;
1270 			break;
1271 		}
1272 	    }
1273 	    if(tmp == NULL) {
1274 	      printf("SCSI: no disconnected job for targetmask %x\n",
1275 								target_mask);
1276 	      abort = 1;
1277 	    }
1278 	}
1279 	if(abort) {
1280 		msg   = MSG_ABORT;
1281 		len   = 1;
1282 		phase = PH_MSGOUT;
1283 
1284 		SCSI_5380->scsi_icom = SC_A_ATN;
1285 		transfer_pio(&phase, &msg, &len);
1286 	}
1287 	else {
1288 		connected = tmp;
1289 #ifdef DBG_REQ
1290 		show_request(tmp, "RECON");
1291 #endif
1292 	}
1293 	PID("<");
1294 }
1295 
1296 /*
1297  * Transfer data in a given phase using polled I/O.
1298  * Returns -1 when a different phase is entered without transferring the
1299  * maximum number of bytes, 0 if all bytes or exit is in the same
1300  * phase.
1301  */
1302 static int
1303 transfer_pio(phase, data, len)
1304 u_char	*phase;
1305 u_char	*data;
1306 u_long	*len;
1307 {
1308 	u_int	cnt = *len;
1309 	u_char	ph  = *phase;
1310 	u_char	tmp;
1311 
1312 	DBG_PIOPRINT ("SCSI: transfer_pio start: phase: %d, len: %d\n", ph,cnt);
1313 	PID(",");
1314 	SCSI_5380->scsi_tcom = ph;
1315 	do {
1316 	    if(!wait_req_true()) {
1317 		DBG_PIOPRINT ("SCSI: transfer_pio: missing REQ\n", 0, 0);
1318 		break;
1319 	    }
1320 	    if(((SCSI_5380->scsi_idstat >> 2) & 7) != ph) {
1321 		DBG_PIOPRINT ("SCSI: transfer_pio: phase mismatch\n", 0, 0);
1322 		break;
1323 	    }
1324 	    if(PH_IN(ph)) {
1325 		*data++ = SCSI_5380->scsi_data;
1326 		SCSI_5380->scsi_icom = SC_A_ACK;
1327 	    }
1328 	    else {
1329 		SCSI_5380->scsi_data = *data++;
1330 
1331 		/*
1332 		 * The SCSI-standard suggests that in the 'MESSAGE OUT' phase,
1333 		 * the initiator should drop ATN on the last byte of the
1334 		 * message phase after REQ has been asserted for the handshake
1335 		 * but before the initiator raises ACK.
1336 		 */
1337 		if(!( (ph == PH_MSGOUT) && (cnt > 1) )) {
1338 			SCSI_5380->scsi_icom = SC_ADTB;
1339 			SCSI_5380->scsi_icom = SC_ADTB | SC_A_ACK;
1340 		}
1341 		else {
1342 			SCSI_5380->scsi_icom = SC_ADTB | SC_A_ATN;
1343 			SCSI_5380->scsi_icom = SC_ADTB | SC_A_ATN | SC_A_ACK;
1344 		}
1345 	    }
1346 	    if(!wait_req_false()) {
1347 		DBG_PIOPRINT ("SCSI: transfer_pio - REQ not dropping\n", 0, 0);
1348 		break;
1349 	    }
1350 
1351 	    if(!( (ph == PH_MSGOUT) && (cnt > 1) ))
1352 		SCSI_5380->scsi_icom = 0;
1353 	    else SCSI_5380->scsi_icom = SC_A_ATN;
1354 	} while(--cnt);
1355 
1356 	if((tmp = SCSI_5380->scsi_idstat) & SC_S_REQ)
1357 		*phase = (tmp >> 2) & 7;
1358 	else *phase = NR_PHASE;
1359 	*len = cnt;
1360 	DBG_PIOPRINT ("SCSI: transfer_pio done: phase: %d, len: %d\n",
1361 								*phase, cnt);
1362 	PID(">");
1363 	if(!cnt || (*phase == ph))
1364 		return(0);
1365 	return(-1);
1366 }
1367 
1368 /*
1369  * Start a DMA-transfer on the device using the current pointers.
1370  * If 'poll' is true, the function waits until DMA-has completed.
1371  */
1372 static void
1373 transfer_dma(reqp, phase, poll)
1374 SC_REQ	*reqp;
1375 u_int	phase;
1376 int	poll;
1377 {
1378 	int	dmastat;
1379 	u_char	mbase = 0;
1380 	int	sps;
1381 
1382 again:
1383 	PID("?");
1384 	/*
1385 	 * We should be in phase, otherwise we are not allowed to
1386 	 * drive the bus.
1387 	 */
1388 	SCSI_5380->scsi_tcom = phase;
1389 
1390 	/*
1391 	 * Defer interrupts until DMA is fully running.
1392 	 */
1393 	sps = splbio();
1394 
1395 	/*
1396 	 * Clear pending interrupts and parity errors.
1397 	 */
1398 	SCSI_DMA->s_dma_ctrl = 0;
1399 	SC_CLINT;
1400 
1401 	if(!poll) {
1402 		/*
1403 		 * Enable SCSI interrupts and set IN_DMA flag, set 'mbase'
1404 		 * to the interrupts we want enabled.
1405 		 */
1406 		scsi_ienable();
1407 		reqp->dr_flag |= DRIVER_IN_DMA;
1408 		mbase = SC_E_EOPI | SC_MON_BSY;
1409 	}
1410 
1411 	if(PH_IN(phase)) {
1412 		SCSI_DMA->s_dma_ctrl = SD_IN;
1413 		set_scsi_dma(&(SCSI_DMA->s_dma_ptr), reqp->dm_cur->dm_addr);
1414 		set_scsi_dma(&(SCSI_DMA->s_dma_cnt), reqp->dm_cur->dm_count);
1415 		SCSI_5380->scsi_icom  = 0;
1416 		SCSI_5380->scsi_mode  = IMODE_BASE | mbase | SC_M_DMA;
1417 		SCSI_DMA->s_dma_ctrl  = SD_ENABLE;
1418 		SCSI_5380->scsi_ircv  = 0;
1419 	}
1420 	else {
1421 		SCSI_DMA->s_dma_ctrl = SD_OUT;
1422 		set_scsi_dma(&(SCSI_DMA->s_dma_ptr), reqp->dm_cur->dm_addr);
1423 		set_scsi_dma(&(SCSI_DMA->s_dma_cnt), reqp->dm_cur->dm_count);
1424 		SCSI_5380->scsi_mode   = IMODE_BASE | mbase | SC_M_DMA;
1425 		SCSI_5380->scsi_icom   = SC_ADTB;
1426 		SCSI_5380->scsi_dmstat = 0;
1427 		SCSI_DMA->s_dma_ctrl   = SD_ENABLE|SD_OUT;
1428 	}
1429 	splx(sps);
1430 
1431 	if(poll) {
1432 		/*
1433 		 * We wait here until the DMA has finished. This can be
1434 		 * achieved by checking the following conditions:
1435 		 *   - 5380:
1436 		 *	- End of DMA flag is set
1437 		 *	- We lost BSY (error!!)
1438 		 *	- A phase mismatch has occured (partial transfer)
1439 		 *   - DMA-controller:
1440 		 *	- A bus error occurred (Kernel error!!)
1441 		 *	- All bytes are transferred
1442 		 * We one of the terminating conditions was met, we call
1443 		 * 'dma_ready' to check errors and perform the bookkeeping.
1444 		 */
1445 		u_char	dmstat, dmastat;
1446 		int	dma_done;
1447 
1448 		PID("/");
1449 		for(;;) {
1450 			dmstat  = SCSI_5380->scsi_dmstat;
1451 			dmastat = SCSI_DMA->s_dma_ctrl;
1452 			if(dmstat & (SC_END_DMA|SC_BSY_ERR|SC_IRQ_SET))
1453 				break;
1454 			if(!(dmstat & SC_PHS_MTCH))
1455 				break;
1456 			if(dmastat & (SD_BUSERR|SD_ZERO))
1457 				break;
1458 		}
1459 		PID("q");
1460 		if(dmastat & (SD_BUSERR|SD_ZERO))
1461 			dma_done = dma_ready(1, dmastat);
1462 		else dma_done = dma_ready(0, 0);
1463 		if(!dma_done)
1464 			goto again;
1465 
1466 	}
1467 	PID("w");
1468 }
1469 
1470 /*
1471  * Check results of a DMA data-transfer.
1472  */
1473 static int
1474 dma_ready(has_dmastat, dmastat)
1475 int	has_dmastat, dmastat;
1476 {
1477 	int	dmstat, phase;
1478 	long	tmp, bytes_left, bytes_done;
1479 	int	i;
1480 	SC_REQ	*reqp = connected;
1481 
1482 	/*
1483 	 * Get values of the status registers of the 5380 & DMA-controller.
1484 	 */
1485 	dmstat  = SCSI_5380->scsi_dmstat;
1486 	if(!has_dmastat)
1487 		dmastat = SCSI_DMA->s_dma_ctrl;
1488 
1489 	/*
1490 	 * Check if the call is sensible and not caused by any spurious
1491 	 * interrupt.
1492 	 */
1493 	if(    !(dmastat & (SD_BUSERR|SD_ZERO))
1494 		&& !(dmstat & (SC_END_DMA|SC_BSY_ERR))
1495 		&&  (dmstat & SC_PHS_MTCH) ) {
1496 		printf("dma_ready: spurious call (dma:%x,dm:%x,last_hit: %s)\n",
1497 						dmastat, dmstat, last_hit);
1498 		return(0);
1499 	}
1500 
1501 	/*
1502 	 * If end of a DMA transfer, check it's results.
1503 	 */
1504 	get_scsi_dma(SCSI_DMA->s_dma_cnt, bytes_left);
1505 
1506 	if(dmastat & SD_BUSERR) {
1507 		/*
1508 		 * The DMA-controller seems to access 8 bytes beyond
1509 		 * it's limits on output. Therefore check also the byte
1510 		 * count. If it's zero, ignore the bus error.
1511 		 */
1512 		if(bytes_left != 0) {
1513 			get_scsi_dma(SCSI_DMA->s_dma_ptr, tmp);
1514 			printf("SCSI-DMA buserror - accessing 0x%x\n", tmp);
1515 			panic("SCSI");
1516 		}
1517 	}
1518 
1519 	if(bytes_left != 0) {
1520 		/*
1521 		 * The byte-count is not zero. This is not always an error,on
1522 		 * tape drives this usually means EOF. We check that the
1523 		 * residu is a multiple of 512-bytes, when we know the device
1524 		 * type it should be included in the check.
1525 		 * A severe complication is that if a device wants to
1526 		 * disconnect in the middle of a DMA-transfer, the 5380 has
1527 		 * already prefetched the next byte from the DMA-controller
1528 		 * before the phase mismatch occurs. I don't know how this
1529 		 * fact can be uniquely identified. For the moment, we round
1530 		 * up the residual if it is odd.
1531 		 */
1532 		if(PH_OUT(reqp->phase) && (bytes_left & 1))
1533 				bytes_left++;
1534 
1535 	}
1536 	else {
1537 	    if(PH_IN(reqp->phase)) {
1538 		/*
1539 		 * Check for bytes not transfered. This should never occur
1540 		 * because the buffer-pool is aligned on a 4-byte boundary.
1541 		 */
1542 		u_char	*p, *q;
1543 
1544 		if(bytes_left > 3) {
1545 			scsi_show();
1546 			printf("SCSI: %d bytes not transferred\n", bytes_left);
1547 			panic("SCSI");
1548 		}
1549 		p = (u_char*)(bytes_left & ~3);
1550 		q = (u_char*)&(SCSI_DMA->s_dma_res);
1551 		switch(bytes_left & 3) {
1552 			case 3: *p++ = *q++;
1553 			case 2: *p++ = *q++;
1554 			case 1: *p++ = *q++;
1555 				printf("SCSI: dma residue count != 0, ");
1556 				printf("Check buffer alignment\n");
1557 		}
1558 	    }
1559 	}
1560 
1561 	/*
1562 	 * Update various transfer-pointers/lengths
1563 	 */
1564 	bytes_done = reqp->dm_cur->dm_count - bytes_left;
1565 
1566 	reqp->xdata_ptr  = &reqp->xdata_ptr[bytes_done];	/* XXX */
1567 	reqp->xdata_len -= bytes_done;				/* XXX */
1568 	if((reqp->dm_cur->dm_count -= bytes_done) == 0)
1569 		reqp->dm_cur++;
1570 	else reqp->dm_cur->dm_addr += bytes_done;
1571 
1572 	if(PH_IN(reqp->phase) && (dmstat & SC_PAR_ERR)) {
1573 		if(!(ncr5380_no_parchk & (1 << reqp->targ_id)))
1574 			/* XXX: Should be parity error ???? */
1575 			reqp->xs->error = XS_DRIVER_STUFFUP;
1576 	}
1577 
1578 	/*
1579 	 * DMA mode should always be reset even when we will continue with the
1580 	 * next chain.
1581 	 */
1582 	SCSI_5380->scsi_mode &= ~SC_M_DMA;
1583 
1584 	if((dmstat & SC_BSY_ERR) || !(dmstat & SC_PHS_MTCH)
1585 				 || (reqp->dm_cur > reqp->dm_last)) {
1586 		/*
1587 		 * Tell interrupt functions DMA mode has ended.
1588 		 */
1589 		reqp->dr_flag &= ~DRIVER_IN_DMA;
1590 
1591 		/*
1592 		 * Turn off DMA-mode and clear icom
1593 		 */
1594 		SCSI_5380->scsi_mode &=
1595 				~(SC_M_DMA|SC_E_EOPI|SC_MON_BSY|SC_E_PARI);
1596 		SCSI_5380->scsi_icom  = 0;
1597 
1598 		/*
1599 		 * Clear all (pending) interrupts.
1600 		 */
1601 		SCSI_DMA->s_dma_ctrl  = 0;
1602 		SC_CLINT;
1603 
1604 		if(dmstat & SC_BSY_ERR) {
1605 			if(!reqp->xs->error)
1606 				reqp->xs->error = XS_BUSY;
1607 			finish_req(reqp);
1608 			PID("r");
1609 			return(1);
1610 		}
1611 
1612 		if(reqp->xs->error != 0) {
1613 printf("dma-ready: code = %d\n", reqp->xs->error); /* LWP */
1614 			reqp->msgout = MSG_ABORT;
1615 			SCSI_5380->scsi_icom = SC_A_ATN;
1616 		}
1617 		PID("t");
1618 		return(1);
1619 	}
1620 	return(0);
1621 }
1622 
1623 static int
1624 check_autosense(reqp, linked)
1625 SC_REQ	*reqp;
1626 int	linked;
1627 {
1628 	int	sps;
1629 
1630 	/*
1631 	 * If we not executing an auto-sense and the status code
1632 	 * is request-sense, we automatically issue a request
1633 	 * sense command.
1634 	 */
1635 	PID("y");
1636 	if(!(reqp->dr_flag & DRIVER_AUTOSEN)) {
1637 		if(reqp->status == SCSCHKC) {
1638 			memcpy(&reqp->xcmd, sense_cmd, sizeof(sense_cmd));
1639 			reqp->xdata_ptr = (u_char *)&reqp->xs->sense;
1640 			reqp->xdata_len = sizeof(reqp->xs->sense);
1641 			reqp->dr_flag  |= DRIVER_AUTOSEN;
1642 			reqp->dr_flag  &= ~DRIVER_DMAOK;
1643 			if(!linked) {
1644 				sps = splbio();
1645 				reqp->next = issue_q;
1646 				issue_q    = reqp;
1647 				splx(sps);
1648 			}
1649 			else reqp->xcmd.bytes[4] |= 1;
1650 
1651 #ifdef DBG_REQ
1652 			show_request(reqp, "AUTO-SENSE");
1653 #endif
1654 			PID("u");
1655 			return(-1);
1656 		}
1657 	}
1658 	else {
1659 		/*
1660 		 * An auto-sense has finished
1661 		 */
1662 		if((reqp->status & SCSMASK) != SCSGOOD)
1663 			reqp->xs->error = XS_DRIVER_STUFFUP; /* SC_E_AUTOSEN; */
1664 		else reqp->xs->error = XS_SENSE;
1665 		reqp->status = SCSCHKC;
1666 	}
1667 	PID("i");
1668 	return(0);
1669 }
1670 
1671 static int
1672 reach_msg_out(len)
1673 u_long	len;
1674 {
1675 	u_char	phase;
1676 	u_char	data;
1677 
1678 	printf("SCSI: Trying to reach Message-out phase\n");
1679 	if((phase = SCSI_5380->scsi_idstat) & SC_S_REQ)
1680 		phase = (phase >> 2) & 7;
1681 	else return(-1);
1682 	printf("SCSI: Trying to reach Message-out phase, now: %d\n", phase);
1683 	if(phase == PH_MSGOUT)
1684 		return(0);
1685 
1686 	SCSI_5380->scsi_tcom = phase;
1687 
1688 	do {
1689 		if(!wait_req_true()) {
1690 			break;
1691 		}
1692 		if(((SCSI_5380->scsi_idstat >> 2) & 7) != phase) {
1693 			break;
1694 		}
1695 		if(PH_IN(phase)) {
1696 			data = SCSI_5380->scsi_data;
1697 			SCSI_5380->scsi_icom = SC_A_ACK | SC_A_ATN;
1698 		}
1699 		else {
1700 			SCSI_5380->scsi_data = 0;
1701 			SCSI_5380->scsi_icom = SC_ADTB | SC_A_ATN | SC_A_ACK;
1702 		}
1703 		if(!wait_req_false()) {
1704 			break;
1705 		}
1706 		SCSI_5380->scsi_icom = SC_A_ATN;
1707 	} while(--len);
1708 
1709 	if((phase = SCSI_5380->scsi_idstat) & SC_S_REQ) {
1710 		phase = (phase >> 2) & 7;
1711 		if(phase == PH_MSGOUT) {
1712 			printf("SCSI: Message-out phase reached.\n");
1713 			return(0);
1714 		}
1715 	}
1716 	return(-1);
1717 }
1718 
1719 static void
1720 scsi_reset()
1721 {
1722 	SC_REQ	*tmp, *next;
1723 	int		sps;
1724 
1725 	printf("SCSI: resetting SCSI-bus\n");
1726 
1727 	PID("7");
1728 	sps = splbio();
1729 	SCSI_5380->scsi_icom = SC_A_RST;
1730 	delay(1);
1731 	SCSI_5380->scsi_icom = 0;
1732 
1733 	/*
1734 	 * None of the jobs in the discon_q will ever be reconnected,
1735 	 * notify this to the higher level code.
1736 	 */
1737 	for(tmp = discon_q; tmp ;) {
1738 		next = tmp->next;
1739 		tmp->next = NULL;
1740 		tmp->xs->error = XS_TIMEOUT;
1741 		busy &= ~(1 << tmp->targ_id);
1742 		finish_req(tmp);
1743 		tmp = next;
1744 	}
1745 	discon_q = NULL;
1746 
1747 	/*
1748 	 * The current job will never finish either.
1749 	 * The problem is that we can't finish the job because an instance
1750 	 * of main is running on it. Our best guess is that the job is currently
1751 	 * doing REAL-DMA. In that case 'dma_ready()' should correctly finish
1752 	 * the job because it detects BSY-loss.
1753 	 */
1754 	if(tmp = connected) {
1755 		if(tmp->dr_flag & DRIVER_IN_DMA) {
1756 			tmp->xs->error = XS_DRIVER_STUFFUP;
1757 			dma_ready(0, 0);
1758 		}
1759 	}
1760 	splx(sps);
1761 	PID("8");
1762 }
1763 
1764 /*
1765  * Check validity of the IRQ set by the 5380. If the interrupt is valid,
1766  * the appropriate action is carried out (reselection or DMA ready) and
1767  * INTR_RESEL or INTR_DMA is returned. Otherwise a console notice is written
1768  * and INTR_SPURIOUS is returned.
1769  */
1770 static int
1771 check_intr()
1772 {
1773 	SC_REQ	*reqp;
1774 
1775 	if((SCSI_5380->scsi_idstat & (SC_S_SEL|SC_S_IO))==(SC_S_SEL|SC_S_IO))
1776 		return(INTR_RESEL);
1777 	else {
1778 		if((reqp = connected) && (reqp->dr_flag & DRIVER_IN_DMA)){
1779 			reqp->dr_flag &= ~DRIVER_IN_DMA;
1780 			return(INTR_DMA);
1781 		}
1782 	}
1783 	SC_CLINT;
1784 	printf("-->");
1785 	scsi_show();
1786 	printf("SCSI: spurious interrupt.\n");
1787 	return(INTR_SPURIOUS);
1788 }
1789 
1790 /*
1791  * Check if DMA can be used for this request. This function also builds
1792  * the dma-chain.
1793  */
1794 static int
1795 scsi_dmaok(reqp)
1796 SC_REQ	*reqp;
1797 {
1798 	u_long			phy_buf;
1799 	u_long			phy_len;
1800 	void			*req_addr;
1801 	u_long			req_len;
1802 	struct dma_chain	*dm;
1803 
1804 	/*
1805 	 * Initialize locals and requests' DMA-chain.
1806 	 */
1807 	req_len  = reqp->xdata_len;
1808 	req_addr = (void*)reqp->xdata_ptr;
1809 	dm       = reqp->dm_cur = reqp->dm_last = reqp->dm_chain;
1810 
1811 	dm->dm_count = dm->dm_addr = 0;
1812 
1813 	/*
1814 	 * Do not accept zero length DMA.
1815 	 */
1816 	if(req_len == 0)
1817 		return(0);
1818 
1819 	/*
1820 	 * LWP: I think that this restriction is not strictly nessecary.
1821 	 */
1822 	if((req_len & 0x1) || ((u_int)req_addr & 0x3))
1823 		return(0);
1824 
1825 	/*
1826 	 * Build the DMA-chain.
1827 	 */
1828 	dm->dm_addr = phy_buf = kvtop(req_addr);
1829 	while(req_len) {
1830 		if(req_len < (phy_len = NBPG - ((u_long)req_addr & PGOFSET)))
1831 			phy_len = req_len;
1832 
1833 		req_addr     += phy_len;
1834 		req_len      -= phy_len;
1835 		dm->dm_count += phy_len;
1836 
1837 #ifdef NO_TTRAM_DMA
1838 		/*
1839 		 * LWP: DMA transfers to TT-ram causes data to be garbeled
1840 		 * without notice on some revisons of the TT-mainboard.
1841 		 * When program's generate misterious Segmentations faults,
1842 		 * try turning on NO_TTRAM_DMA.
1843 		 */
1844 		if(dm->dm_addr > 0x1000000) /* XXX: should be a define??? */
1845 			return(0);
1846 #endif
1847 
1848 		if(req_len) {
1849 			u_long	tmp = kvtop(req_addr);
1850 
1851 			if((phy_buf + phy_len) != tmp) {
1852 			    if(++dm >= &reqp->dm_chain[MAXDMAIO]) {
1853 				printf("ncr5380_dmaok: DMA chain too long!\n");
1854 				return(0);
1855 			    }
1856 			    dm->dm_count = 0;
1857 			    dm->dm_addr  = tmp;
1858 			}
1859 			phy_buf = tmp;
1860 		}
1861 	}
1862 	reqp->dm_last = dm;
1863 	return(1);
1864 }
1865 
1866 static void
1867 run_main(void)
1868 {
1869 	int	sps = splbio();
1870 
1871 	callback_scheduled = 0;
1872 	if(!main_running) {
1873 		main_running = 1;
1874 		splx(sps);
1875 		scsi_main();
1876 	}
1877 	else splx(sps);
1878 }
1879 
1880 /****************************************************************************
1881  *		Start Debugging Functions				    *
1882  ****************************************************************************/
1883 static void
1884 show_data_sense(xs)
1885 struct scsi_xfer	*xs;
1886 {
1887 	u_char	*b;
1888 	int	i;
1889 	int	sz;
1890 
1891 	b = (u_char *) xs->cmd;
1892 	printf("cmd[%d,%d]: ", xs->cmdlen, sz = command_size(*b));
1893 	for(i = 0; i < sz; i++)
1894 		printf("%x ", b[i]);
1895 	printf("\nsense: ");
1896 	b = (u_char *)&xs->sense;
1897 	for(i = 0; i < sizeof(xs->sense); i++)
1898 		printf("%x ", b[i]);
1899 	printf("\n");
1900 }
1901 
1902 static void
1903 show_request(reqp, qtxt)
1904 SC_REQ	*reqp;
1905 char	*qtxt;
1906 {
1907 	printf("REQ-%s: %d %x[%d] cmd[0]=%x S=%x M=%x R=%x %s\n", qtxt,
1908 			reqp->targ_id, reqp->xdata_ptr, reqp->xdata_len,
1909 			reqp->xcmd.opcode, reqp->status, reqp->message,
1910 			reqp->xs->error, reqp->link ? "L" : "");
1911 	if(reqp->status == SCSCHKC)
1912 		show_data_sense(reqp->xs);
1913 }
1914 
1915 scsi_show()
1916 {
1917 	SC_REQ	*tmp;
1918 	int	sps = splhigh();
1919 
1920 #ifndef DBG_PID
1921 	#define	last_hit	""
1922 #endif
1923 
1924 	for(tmp = issue_q; tmp; tmp = tmp->next)
1925 		show_request(tmp, "ISSUED");
1926 	for(tmp = discon_q; tmp; tmp = tmp->next)
1927 		show_request(tmp, "DISCONNECTED");
1928 	if(connected)
1929 		show_request(connected, "CONNECTED");
1930 	/* show_signals(); */
1931 	if(connected)
1932 		printf("phase = %d, ", connected->phase);
1933 	printf("busy:%x, last_hit:%s, spl:%04x\n", busy, last_hit, sps);
1934 
1935 	splx(sps);
1936 }
1937