Home | History | Annotate | Line # | Download | only in podulebus
sfas.c revision 1.6.2.1
      1  1.6.2.1  gehenna /*	$NetBSD: sfas.c,v 1.6.2.1 2002/08/30 00:18:45 gehenna Exp $	*/
      2      1.1  reinoud 
      3      1.1  reinoud /*
      4      1.1  reinoud  * Copyright (c) 1995 Scott Stevens
      5      1.1  reinoud  * Copyright (c) 1995 Daniel Widenfalk
      6      1.1  reinoud  * Copyright (c) 1994 Christian E. Hopps
      7      1.1  reinoud  * Copyright (c) 1990 The Regents of the University of California.
      8      1.1  reinoud  * All rights reserved.
      9      1.1  reinoud  *
     10      1.1  reinoud  * This code is derived from software contributed to Berkeley by
     11      1.1  reinoud  * Van Jacobson of Lawrence Berkeley Laboratory.
     12      1.1  reinoud  *
     13      1.1  reinoud  * Redistribution and use in source and binary forms, with or without
     14      1.1  reinoud  * modification, are permitted provided that the following conditions
     15      1.1  reinoud  * are met:
     16      1.1  reinoud  * 1. Redistributions of source code must retain the above copyright
     17      1.1  reinoud  *    notice, this list of conditions and the following disclaimer.
     18      1.1  reinoud  * 2. Redistributions in binary form must reproduce the above copyright
     19      1.1  reinoud  *    notice, this list of conditions and the following disclaimer in the
     20      1.1  reinoud  *    documentation and/or other materials provided with the distribution.
     21      1.1  reinoud  * 3. All advertising materials mentioning features or use of this software
     22      1.1  reinoud  *    must display the following acknowledgement:
     23      1.1  reinoud  *	This product includes software developed by the University of
     24      1.1  reinoud  *	California, Berkeley and its contributors.
     25      1.1  reinoud  * 4. Neither the name of the University nor the names of its contributors
     26      1.1  reinoud  *    may be used to endorse or promote products derived from this software
     27      1.1  reinoud  *    without specific prior written permission.
     28      1.1  reinoud  *
     29      1.1  reinoud  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     30      1.1  reinoud  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     31      1.1  reinoud  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     32      1.1  reinoud  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     33      1.1  reinoud  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     34      1.1  reinoud  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     35      1.1  reinoud  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     36      1.1  reinoud  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     37      1.1  reinoud  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     38      1.1  reinoud  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     39      1.1  reinoud  * SUCH DAMAGE.
     40      1.1  reinoud  *
     41      1.1  reinoud  *	@(#)scsi.c	7.5 (Berkeley) 5/4/91
     42      1.1  reinoud  */
     43      1.1  reinoud 
     44      1.1  reinoud /*
     45      1.1  reinoud  * Emulex FAS216 scsi adaptor driver
     46      1.1  reinoud  */
     47      1.1  reinoud 
     48      1.1  reinoud /*
     49      1.1  reinoud  * Modified for NetBSD/arm32 by Scott Stevens
     50      1.1  reinoud  */
     51      1.1  reinoud 
     52      1.1  reinoud #include <sys/param.h>
     53      1.1  reinoud #include <sys/systm.h>
     54      1.1  reinoud #include <sys/device.h>
     55      1.1  reinoud #include <sys/buf.h>
     56      1.1  reinoud #include <sys/proc.h>
     57      1.1  reinoud 
     58      1.1  reinoud #include <dev/scsipi/scsi_all.h>
     59      1.1  reinoud #include <dev/scsipi/scsipi_all.h>
     60      1.1  reinoud #include <dev/scsipi/scsiconf.h>
     61      1.1  reinoud 
     62      1.1  reinoud #include <uvm/uvm_extern.h>
     63      1.1  reinoud 
     64      1.1  reinoud #include <machine/pmap.h>
     65      1.1  reinoud #include <machine/cpu.h>
     66      1.1  reinoud #include <machine/io.h>
     67      1.3  thorpej #include <machine/intr.h>
     68      1.2  thorpej #include <arm/arm32/katelib.h>
     69      1.1  reinoud #include <acorn32/podulebus/podulebus.h>
     70      1.1  reinoud #include <acorn32/podulebus/sfasreg.h>
     71      1.1  reinoud #include <acorn32/podulebus/sfasvar.h>
     72      1.1  reinoud 
     73      1.1  reinoud void sfasinitialize __P((struct sfas_softc *));
     74      1.1  reinoud void sfas_minphys   __P((struct buf *bp));
     75      1.1  reinoud void sfas_scsi_request __P((struct scsipi_channel *,
     76      1.1  reinoud 					scsipi_adapter_req_t, void *));
     77      1.1  reinoud void sfas_donextcmd __P((struct sfas_softc *dev, struct sfas_pending *pendp));
     78      1.1  reinoud void sfas_scsidone  __P((struct sfas_softc *dev, struct scsipi_xfer *xs,
     79      1.1  reinoud 			 int stat));
     80      1.1  reinoud void sfasintr	    __P((struct sfas_softc *dev));
     81      1.1  reinoud void sfasiwait	    __P((struct sfas_softc *dev));
     82      1.1  reinoud void sfas_ixfer	    __P((struct sfas_softc *dev, int polling));
     83      1.1  reinoud void sfasreset	    __P((struct sfas_softc *dev, int how));
     84      1.1  reinoud int  sfasselect	    __P((struct sfas_softc *dev, struct sfas_pending *pendp,
     85      1.1  reinoud 			 unsigned char *cbuf, int clen,
     86      1.1  reinoud 			 unsigned char *buf, int len, int mode));
     87      1.1  reinoud void sfasicmd	    __P((struct sfas_softc *dev, struct sfas_pending *pendp));
     88      1.1  reinoud void sfasgo         __P((struct sfas_softc *dev, struct sfas_pending *pendp));
     89      1.1  reinoud 
     90      1.1  reinoud /*
     91      1.1  reinoud  * Initialize these to make 'em patchable. Defaults to enable sync and discon.
     92      1.1  reinoud  */
     93      1.1  reinoud u_char	sfas_inhibit_sync[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
     94      1.1  reinoud u_char	sfas_inhibit_disc[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
     95      1.1  reinoud 
     96      1.1  reinoud #define DEBUG
     97      1.1  reinoud #ifdef DEBUG
     98      1.1  reinoud #define QPRINTF(a) if (sfas_debug > 1) printf a
     99      1.1  reinoud int	sfas_debug = 2;
    100      1.1  reinoud #else
    101      1.1  reinoud #define QPRINTF
    102      1.1  reinoud #endif
    103      1.1  reinoud 
    104      1.1  reinoud /*
    105      1.1  reinoud  * default minphys routine for sfas based controllers
    106      1.1  reinoud  */
    107      1.1  reinoud void
    108      1.1  reinoud sfas_minphys(bp)
    109      1.1  reinoud 	struct buf *bp;
    110      1.1  reinoud {
    111      1.1  reinoud 
    112      1.1  reinoud 	/*
    113      1.1  reinoud 	 * No max transfer at this level.
    114      1.1  reinoud 	 */
    115      1.1  reinoud 	minphys(bp);
    116      1.1  reinoud }
    117      1.1  reinoud 
    118      1.1  reinoud /*
    119      1.1  reinoud  * Initialize the nexus structs.
    120      1.1  reinoud  */
    121      1.1  reinoud void
    122      1.1  reinoud sfas_init_nexus(dev, nexus)
    123      1.1  reinoud 	struct sfas_softc *dev;
    124      1.1  reinoud 	struct nexus	  *nexus;
    125      1.1  reinoud {
    126      1.1  reinoud 	bzero(nexus, sizeof(struct nexus));
    127      1.1  reinoud 
    128      1.1  reinoud 	nexus->state	= SFAS_NS_IDLE;
    129      1.1  reinoud 	nexus->period	= 200;
    130      1.1  reinoud 	nexus->offset	= 0;
    131      1.1  reinoud 	nexus->syncper	= 5;
    132      1.1  reinoud 	nexus->syncoff	= 0;
    133      1.1  reinoud 	nexus->config3	= dev->sc_config3 & ~SFAS_CFG3_FASTSCSI;
    134      1.1  reinoud }
    135      1.1  reinoud 
    136      1.1  reinoud void
    137      1.1  reinoud sfasinitialize(dev)
    138      1.1  reinoud 	struct sfas_softc *dev;
    139      1.1  reinoud {
    140      1.1  reinoud 	u_int		*pte;
    141      1.1  reinoud 	int		 i;
    142      1.1  reinoud 
    143      1.1  reinoud 	dev->sc_led_status = 0;
    144      1.1  reinoud 
    145      1.1  reinoud 	TAILQ_INIT(&dev->sc_xs_pending);
    146      1.1  reinoud 	TAILQ_INIT(&dev->sc_xs_free);
    147      1.1  reinoud 
    148      1.1  reinoud /*
    149      1.1  reinoud  * Initialize the sfas_pending structs and link them into the free list. We
    150      1.1  reinoud  * have to set vm_link_data.pages to 0 or the vm FIX won't work.
    151      1.1  reinoud  */
    152      1.1  reinoud 	for(i=0; i<MAXPENDING; i++) {
    153      1.1  reinoud 		TAILQ_INSERT_TAIL(&dev->sc_xs_free, &dev->sc_xs_store[i],
    154      1.1  reinoud 				  link);
    155      1.1  reinoud 	}
    156      1.1  reinoud 
    157      1.1  reinoud /*
    158      1.1  reinoud  * Calculate the correct clock conversion factor 2 <= factor <= 8, i.e. set
    159      1.1  reinoud  * the factor to clock_freq / 5 (int).
    160      1.1  reinoud  */
    161      1.1  reinoud 	if (dev->sc_clock_freq <= 10)
    162      1.1  reinoud 		dev->sc_clock_conv_fact = 2;
    163      1.1  reinoud 	if (dev->sc_clock_freq <= 40)
    164      1.1  reinoud 		dev->sc_clock_conv_fact = 2+((dev->sc_clock_freq-10)/5);
    165      1.1  reinoud 	else
    166      1.1  reinoud 		panic("sfasinitialize: Clock frequence too high");
    167      1.1  reinoud 
    168      1.1  reinoud /* Setup and save the basic configuration registers */
    169      1.1  reinoud 	dev->sc_config1 = (dev->sc_host_id & SFAS_CFG1_BUS_ID_MASK);
    170      1.1  reinoud 	dev->sc_config2 = SFAS_CFG2_FEATURES_ENABLE;
    171      1.1  reinoud 	dev->sc_config3 = (dev->sc_clock_freq > 25 ? SFAS_CFG3_FASTCLK : 0);
    172      1.1  reinoud 
    173      1.1  reinoud /* Precalculate timeout value and clock period. */
    174      1.1  reinoud /* Ekkk ... floating point in the kernel !!!! */
    175      1.1  reinoud /*	dev->sc_timeout_val  = 1+dev->sc_timeout*dev->sc_clock_freq/
    176      1.1  reinoud 				 (7.682*dev->sc_clock_conv_fact);*/
    177      1.1  reinoud 	dev->sc_timeout_val  = 1+dev->sc_timeout*dev->sc_clock_freq/
    178      1.1  reinoud 				 ((7682*dev->sc_clock_conv_fact)/1000);
    179      1.1  reinoud 	dev->sc_clock_period = 1000/dev->sc_clock_freq;
    180      1.1  reinoud 
    181      1.1  reinoud 	sfasreset(dev, 1 | 2);	/* Reset Chip and Bus */
    182      1.1  reinoud 
    183      1.1  reinoud 	dev->sc_units_disconnected = 0;
    184      1.1  reinoud 	dev->sc_msg_in_len = 0;
    185      1.1  reinoud 	dev->sc_msg_out_len = 0;
    186      1.1  reinoud 
    187      1.1  reinoud 	dev->sc_flags = 0;
    188      1.1  reinoud 
    189      1.1  reinoud 	for(i=0; i<8; i++)
    190      1.1  reinoud 		sfas_init_nexus(dev, &dev->sc_nexus[i]);
    191      1.1  reinoud 
    192      1.1  reinoud 	if (dev->sc_ixfer == NULL)
    193      1.1  reinoud 		dev->sc_ixfer = sfas_ixfer;
    194      1.1  reinoud 
    195      1.1  reinoud /*
    196      1.1  reinoud  * Setup bump buffer.
    197      1.1  reinoud  */
    198      1.1  reinoud 	dev->sc_bump_va = (u_char *)uvm_km_zalloc(kernel_map, dev->sc_bump_sz);
    199      1.1  reinoud 	(void) pmap_extract(pmap_kernel(), (vaddr_t)dev->sc_bump_va,
    200      1.1  reinoud 	    (paddr_t *)&dev->sc_bump_pa);
    201      1.1  reinoud 
    202      1.1  reinoud /*
    203      1.1  reinoud  * Setup pages to noncachable, that way we don't have to flush the cache
    204      1.1  reinoud  * every time we need "bumped" transfer.
    205      1.1  reinoud  */
    206      1.5  thorpej 	pte = vtopte((vaddr_t) dev->sc_bump_va);
    207      1.6  thorpej 	*pte &= ~(L2_C | L2_B);
    208  1.6.2.1  gehenna 	PTE_SYNC(pte);
    209      1.1  reinoud 	cpu_tlb_flushD();
    210      1.4  thorpej 	cpu_dcache_wbinv_range((vm_offset_t)dev->sc_bump_va, NBPG);
    211      1.1  reinoud 
    212      1.1  reinoud 	printf(" dmabuf V0x%08x P0x%08x", (u_int)dev->sc_bump_va, (u_int)dev->sc_bump_pa);
    213      1.1  reinoud }
    214      1.1  reinoud 
    215      1.1  reinoud 
    216      1.1  reinoud /*
    217      1.1  reinoud  * used by specific sfas controller
    218      1.1  reinoud  */
    219      1.1  reinoud void
    220      1.1  reinoud sfas_scsi_request(struct scsipi_channel *chan, scsipi_adapter_req_t req,
    221      1.1  reinoud 								void *arg)
    222      1.1  reinoud {
    223      1.1  reinoud 	struct scsipi_xfer *xs;
    224      1.1  reinoud 	struct sfas_softc	*dev = (void *)chan->chan_adapter->adapt_dev;
    225      1.1  reinoud 	struct scsipi_periph	*periph;
    226      1.1  reinoud 	struct sfas_pending	*pendp;
    227      1.1  reinoud 	int			 flags, s, target;
    228      1.1  reinoud 
    229      1.1  reinoud 	switch (req) {
    230      1.1  reinoud 	case ADAPTER_REQ_RUN_XFER:
    231      1.1  reinoud 		xs = arg;
    232      1.1  reinoud 		periph = xs->xs_periph;
    233      1.1  reinoud 		flags = xs->xs_control;
    234      1.1  reinoud 		target = periph->periph_target;
    235      1.1  reinoud 
    236      1.1  reinoud 		if (flags & XS_CTL_DATA_UIO)
    237      1.1  reinoud 			panic("sfas: scsi data uio requested");
    238      1.1  reinoud 
    239      1.1  reinoud 		if ((flags & XS_CTL_POLL) && (dev->sc_flags & SFAS_ACTIVE))
    240      1.1  reinoud 			panic("sfas_scsicmd: busy");
    241      1.1  reinoud 
    242      1.1  reinoud /* Get hold of a sfas_pending block. */
    243      1.1  reinoud 		s = splbio();
    244      1.1  reinoud 		pendp = dev->sc_xs_free.tqh_first;
    245      1.1  reinoud 		if (pendp == NULL) {
    246      1.1  reinoud 			xs->error = XS_RESOURCE_SHORTAGE;
    247      1.1  reinoud 			scsipi_done(xs);
    248      1.1  reinoud 			splx(s);
    249      1.1  reinoud 			return;
    250      1.1  reinoud 		}
    251      1.1  reinoud 		TAILQ_REMOVE(&dev->sc_xs_free, pendp, link);
    252      1.1  reinoud 		pendp->xs = xs;
    253      1.1  reinoud 		splx(s);
    254      1.1  reinoud 
    255      1.1  reinoud 
    256      1.1  reinoud /* If the chip if busy OR the unit is busy, we have to wait for out turn. */
    257      1.1  reinoud 		if ((dev->sc_flags & SFAS_ACTIVE) ||
    258      1.1  reinoud 		    (dev->sc_nexus[target].flags & SFAS_NF_UNIT_BUSY)) {
    259      1.1  reinoud 			s = splbio();
    260      1.1  reinoud 			TAILQ_INSERT_TAIL(&dev->sc_xs_pending, pendp, link);
    261      1.1  reinoud 			splx(s);
    262      1.1  reinoud 		} else
    263      1.1  reinoud 			sfas_donextcmd(dev, pendp);
    264      1.1  reinoud 
    265      1.1  reinoud 		return;
    266      1.1  reinoud 
    267      1.1  reinoud 	case ADAPTER_REQ_GROW_RESOURCES:
    268      1.1  reinoud 	case ADAPTER_REQ_SET_XFER_MODE:
    269      1.1  reinoud 		/* XXX Not supported. */
    270      1.1  reinoud 		return;
    271      1.1  reinoud 	}
    272      1.1  reinoud }
    273      1.1  reinoud 
    274      1.1  reinoud /*
    275      1.1  reinoud  * Actually select the unit, whereby the whole scsi-process is started.
    276      1.1  reinoud  */
    277      1.1  reinoud void
    278      1.1  reinoud sfas_donextcmd(dev, pendp)
    279      1.1  reinoud 	struct sfas_softc	*dev;
    280      1.1  reinoud 	struct sfas_pending	*pendp;
    281      1.1  reinoud {
    282      1.1  reinoud 	int	s;
    283      1.1  reinoud 
    284      1.1  reinoud /*
    285      1.1  reinoud  * Special case for scsi unit reset. I think this is waterproof. We first
    286      1.1  reinoud  * select the unit during splbio. We then cycle through the generated
    287      1.1  reinoud  * interrupts until the interrupt routine signals that the unit has
    288      1.1  reinoud  * acknowledged the reset. After that we have to wait a reset to select
    289      1.1  reinoud  * delay before anything else can happend.
    290      1.1  reinoud  */
    291      1.1  reinoud 	if (pendp->xs->xs_control & XS_CTL_RESET) {
    292      1.1  reinoud 		struct nexus	*nexus;
    293      1.1  reinoud 
    294      1.1  reinoud 		s = splbio();
    295      1.1  reinoud 		while(!sfasselect(dev, pendp, 0, 0, 0, 0, SFAS_SELECT_K)) {
    296      1.1  reinoud 			splx(s);
    297      1.1  reinoud 			delay(10);
    298      1.1  reinoud 			s = splbio();
    299      1.1  reinoud 		}
    300      1.1  reinoud 
    301      1.1  reinoud 		nexus = dev->sc_cur_nexus;
    302      1.1  reinoud 		while(nexus->flags & SFAS_NF_UNIT_BUSY) {
    303      1.1  reinoud 			sfasiwait(dev);
    304      1.1  reinoud 			sfasintr(dev);
    305      1.1  reinoud 		}
    306      1.1  reinoud 
    307      1.1  reinoud 		nexus->flags |= SFAS_NF_UNIT_BUSY;
    308      1.1  reinoud 		splx(s);
    309      1.1  reinoud 
    310      1.1  reinoud 		sfasreset(dev, 0);
    311      1.1  reinoud 
    312      1.1  reinoud 		s = splbio();
    313      1.1  reinoud 		nexus->flags &= ~SFAS_NF_UNIT_BUSY;
    314      1.1  reinoud 		splx(s);
    315      1.1  reinoud 	}
    316      1.1  reinoud 
    317      1.1  reinoud /*
    318      1.1  reinoud  * If we are polling, go to splbio and perform the command, else we poke
    319      1.1  reinoud  * the scsi-bus via sfasgo to get the interrupt machine going.
    320      1.1  reinoud  */
    321      1.1  reinoud 	if (pendp->xs->xs_control & XS_CTL_POLL) {
    322      1.1  reinoud 		s = splbio();
    323      1.1  reinoud 		sfasicmd(dev, pendp);
    324      1.1  reinoud 		TAILQ_INSERT_TAIL(&dev->sc_xs_free, pendp, link);
    325      1.1  reinoud 		splx(s);
    326      1.1  reinoud 	} else {
    327      1.1  reinoud 		sfasgo(dev, pendp);
    328      1.1  reinoud 	}
    329      1.1  reinoud }
    330      1.1  reinoud 
    331      1.1  reinoud void
    332      1.1  reinoud sfas_scsidone(dev, xs, stat)
    333      1.1  reinoud 	struct sfas_softc *dev;
    334      1.1  reinoud 	struct scsipi_xfer *xs;
    335      1.1  reinoud 	int		 stat;
    336      1.1  reinoud {
    337      1.1  reinoud 	struct sfas_pending	*pendp;
    338      1.1  reinoud 	int			 s;
    339      1.1  reinoud 
    340      1.1  reinoud 	xs->status = stat;
    341      1.1  reinoud 
    342      1.1  reinoud 	if (stat == 0)
    343      1.1  reinoud 		xs->resid = 0;
    344      1.1  reinoud 	else {
    345      1.1  reinoud 		switch(stat) {
    346      1.1  reinoud 		case SCSI_CHECK:
    347      1.1  reinoud 		case SCSI_BUSY:
    348      1.1  reinoud 			xs->error = XS_BUSY;
    349      1.1  reinoud 			break;
    350      1.1  reinoud 		case -1:
    351      1.1  reinoud 			xs->error = XS_DRIVER_STUFFUP;
    352      1.1  reinoud 			QPRINTF(("sfas_scsicmd() bad %x\n", stat));
    353      1.1  reinoud 			break;
    354      1.1  reinoud 		default:
    355      1.1  reinoud 			xs->error = XS_TIMEOUT;
    356      1.1  reinoud 			break;
    357      1.1  reinoud 		}
    358      1.1  reinoud 	}
    359      1.1  reinoud 
    360      1.1  reinoud /* Steal the next command from the queue so that one unit can't hog the bus. */
    361      1.1  reinoud 	s = splbio();
    362      1.1  reinoud 	pendp = dev->sc_xs_pending.tqh_first;
    363      1.1  reinoud 	while(pendp) {
    364      1.1  reinoud 		if (!(dev->sc_nexus[pendp->xs->xs_periph->periph_target].flags &
    365      1.1  reinoud 		      SFAS_NF_UNIT_BUSY))
    366      1.1  reinoud 			break;
    367      1.1  reinoud 		pendp = pendp->link.tqe_next;
    368      1.1  reinoud 	}
    369      1.1  reinoud 
    370      1.1  reinoud 	if (pendp != NULL) {
    371      1.1  reinoud 		TAILQ_REMOVE(&dev->sc_xs_pending, pendp, link);
    372      1.1  reinoud 	}
    373      1.1  reinoud 
    374      1.1  reinoud 	splx(s);
    375      1.1  reinoud 	scsipi_done(xs);
    376      1.1  reinoud 
    377      1.1  reinoud 	if (pendp)
    378      1.1  reinoud 		sfas_donextcmd(dev, pendp);
    379      1.1  reinoud }
    380      1.1  reinoud 
    381      1.1  reinoud /*
    382      1.1  reinoud  * There are two kinds of reset:
    383      1.1  reinoud  *  1) CHIP-bus reset. This also implies a SCSI-bus reset.
    384      1.1  reinoud  *  2) SCSI-bus reset.
    385      1.1  reinoud  * After the appropriate resets have been performed we wait a reset to select
    386      1.1  reinoud  * delay time.
    387      1.1  reinoud  */
    388      1.1  reinoud void
    389      1.1  reinoud sfasreset(dev, how)
    390      1.1  reinoud 	struct sfas_softc *dev;
    391      1.1  reinoud 	int		 how;
    392      1.1  reinoud {
    393      1.1  reinoud 	sfas_regmap_p	rp;
    394      1.1  reinoud 	int		i, s;
    395      1.1  reinoud 
    396      1.1  reinoud 	rp = dev->sc_fas;
    397      1.1  reinoud 
    398      1.1  reinoud 	if (how & 1) {
    399      1.1  reinoud 		for(i=0; i<8; i++)
    400      1.1  reinoud 			sfas_init_nexus(dev, &dev->sc_nexus[i]);
    401      1.1  reinoud 
    402      1.1  reinoud 		*rp->sfas_command = SFAS_CMD_RESET_CHIP;
    403      1.1  reinoud 		delay(1);
    404      1.1  reinoud 		*rp->sfas_command = SFAS_CMD_NOP;
    405      1.1  reinoud 
    406      1.1  reinoud 		*rp->sfas_config1 = dev->sc_config1;
    407      1.1  reinoud 		*rp->sfas_config2 = dev->sc_config2;
    408      1.1  reinoud 		*rp->sfas_config3 = dev->sc_config3;
    409      1.1  reinoud 		*rp->sfas_timeout = dev->sc_timeout_val;
    410      1.1  reinoud 		*rp->sfas_clkconv = dev->sc_clock_conv_fact &
    411      1.1  reinoud 					SFAS_CLOCK_CONVERSION_MASK;
    412      1.1  reinoud 	}
    413      1.1  reinoud 
    414      1.1  reinoud 	if (how & 2) {
    415      1.1  reinoud 		for(i=0; i<8; i++)
    416      1.1  reinoud 			sfas_init_nexus(dev, &dev->sc_nexus[i]);
    417      1.1  reinoud 
    418      1.1  reinoud 		s = splbio();
    419      1.1  reinoud 
    420      1.1  reinoud 		*rp->sfas_command = SFAS_CMD_RESET_SCSI_BUS;
    421      1.1  reinoud 		delay(100);
    422      1.1  reinoud 
    423      1.1  reinoud /* Skip interrupt generated by RESET_SCSI_BUS */
    424      1.1  reinoud 		while(*rp->sfas_status & SFAS_STAT_INTERRUPT_PENDING) {
    425      1.1  reinoud 			dev->sc_status = *rp->sfas_status;
    426      1.1  reinoud 			dev->sc_interrupt = *rp->sfas_interrupt;
    427      1.1  reinoud 
    428      1.1  reinoud 			delay(100);
    429      1.1  reinoud 		}
    430      1.1  reinoud 
    431      1.1  reinoud 		dev->sc_status = *rp->sfas_status;
    432      1.1  reinoud 		dev->sc_interrupt = *rp->sfas_interrupt;
    433      1.1  reinoud 
    434      1.1  reinoud 		splx(s);
    435      1.1  reinoud 	}
    436      1.1  reinoud 
    437      1.1  reinoud 	if (dev->sc_config_flags & SFAS_SLOW_START)
    438      1.1  reinoud 		delay(4*250000); /* RESET to SELECT DELAY*4 for slow devices */
    439      1.1  reinoud 	else
    440      1.1  reinoud 		delay(250000);	 /* RESET to SELECT DELAY */
    441      1.1  reinoud }
    442      1.1  reinoud 
    443      1.1  reinoud /*
    444      1.1  reinoud  * Save active data pointers to the nexus block currently active.
    445      1.1  reinoud  */
    446      1.1  reinoud void
    447      1.1  reinoud sfas_save_pointers(dev)
    448      1.1  reinoud 	struct sfas_softc *dev;
    449      1.1  reinoud {
    450      1.1  reinoud 	struct nexus	*nx;
    451      1.1  reinoud 
    452      1.1  reinoud 	nx = dev->sc_cur_nexus;
    453      1.1  reinoud 	if (nx) {
    454      1.1  reinoud 		nx->cur_link	= dev->sc_cur_link;
    455      1.1  reinoud 		nx->max_link	= dev->sc_max_link;
    456      1.1  reinoud 		nx->buf		= dev->sc_buf;
    457      1.1  reinoud 		nx->len		= dev->sc_len;
    458      1.1  reinoud 		nx->dma_len	= dev->sc_dma_len;
    459      1.1  reinoud 		nx->dma_buf	= dev->sc_dma_buf;
    460      1.1  reinoud 		nx->dma_blk_flg	= dev->sc_dma_blk_flg;
    461      1.1  reinoud 		nx->dma_blk_len	= dev->sc_dma_blk_len;
    462      1.1  reinoud 		nx->dma_blk_ptr	= dev->sc_dma_blk_ptr;
    463      1.1  reinoud 	}
    464      1.1  reinoud }
    465      1.1  reinoud 
    466      1.1  reinoud /*
    467      1.1  reinoud  * Restore data pointers from the currently active nexus block.
    468      1.1  reinoud  */
    469      1.1  reinoud void
    470      1.1  reinoud sfas_restore_pointers(dev)
    471      1.1  reinoud 	struct sfas_softc *dev;
    472      1.1  reinoud {
    473      1.1  reinoud 	struct nexus	*nx;
    474      1.1  reinoud 
    475      1.1  reinoud 	nx = dev->sc_cur_nexus;
    476      1.1  reinoud 	if (nx) {
    477      1.1  reinoud 		dev->sc_cur_link    = nx->cur_link;
    478      1.1  reinoud 		dev->sc_max_link    = nx->max_link;
    479      1.1  reinoud 		dev->sc_buf	    = nx->buf;
    480      1.1  reinoud 		dev->sc_len	    = nx->len;
    481      1.1  reinoud 		dev->sc_dma_len	    = nx->dma_len;
    482      1.1  reinoud 		dev->sc_dma_buf	    = nx->dma_buf;
    483      1.1  reinoud 		dev->sc_dma_blk_flg = nx->dma_blk_flg;
    484      1.1  reinoud 		dev->sc_dma_blk_len = nx->dma_blk_len;
    485      1.1  reinoud 		dev->sc_dma_blk_ptr = nx->dma_blk_ptr;
    486      1.1  reinoud 		dev->sc_chain	    = nx->dma;
    487      1.1  reinoud 		dev->sc_unit	    = (nx->lun_unit & 0x0F);
    488      1.1  reinoud 		dev->sc_lun	    = (nx->lun_unit & 0xF0) >> 4;
    489      1.1  reinoud 	}
    490      1.1  reinoud }
    491      1.1  reinoud 
    492      1.1  reinoud /*
    493      1.1  reinoud  * sfasiwait is used during interrupt and polled IO to wait for an event from
    494      1.1  reinoud  * the FAS chip. This function MUST NOT BE CALLED without interrupt disabled.
    495      1.1  reinoud  */
    496      1.1  reinoud void
    497      1.1  reinoud sfasiwait(dev)
    498      1.1  reinoud 	struct sfas_softc *dev;
    499      1.1  reinoud {
    500      1.1  reinoud 	sfas_regmap_p	rp;
    501      1.1  reinoud 
    502      1.1  reinoud /*
    503      1.1  reinoud  * If SFAS_DONT_WAIT is set, we have already grabbed the interrupt info
    504      1.1  reinoud  * elsewhere. So we don't have to wait for it.
    505      1.1  reinoud  */
    506      1.1  reinoud 	if (dev->sc_flags & SFAS_DONT_WAIT) {
    507      1.1  reinoud 		dev->sc_flags &= ~SFAS_DONT_WAIT;
    508      1.1  reinoud 		return;
    509      1.1  reinoud 	}
    510      1.1  reinoud 
    511      1.1  reinoud 	rp = dev->sc_fas;
    512      1.1  reinoud 
    513      1.1  reinoud /* Wait for FAS chip to signal an interrupt. */
    514      1.1  reinoud 	while(!(*rp->sfas_status & SFAS_STAT_INTERRUPT_PENDING))
    515      1.1  reinoud 		delay(1);
    516      1.1  reinoud 
    517      1.1  reinoud /* Grab interrupt info from chip. */
    518      1.1  reinoud 	dev->sc_status = *rp->sfas_status;
    519      1.1  reinoud 	dev->sc_interrupt = *rp->sfas_interrupt;
    520      1.1  reinoud 	if (dev->sc_interrupt & SFAS_INT_RESELECTED) {
    521      1.1  reinoud 		dev->sc_resel[0] = *rp->sfas_fifo;
    522      1.1  reinoud 		dev->sc_resel[1] = *rp->sfas_fifo;
    523      1.1  reinoud 	}
    524      1.1  reinoud }
    525      1.1  reinoud 
    526      1.1  reinoud /*
    527      1.1  reinoud  * Transfer info to/from device. sfas_ixfer uses polled IO+sfasiwait so the
    528      1.1  reinoud  * rules that apply to sfasiwait also applies here.
    529      1.1  reinoud  */
    530      1.1  reinoud void
    531      1.1  reinoud sfas_ixfer(dev, polling)
    532      1.1  reinoud 	struct sfas_softc *dev;
    533      1.1  reinoud 	int polling;
    534      1.1  reinoud {
    535      1.1  reinoud 	sfas_regmap_p	 rp;
    536      1.1  reinoud 	u_char		*buf;
    537      1.1  reinoud 	int		 len, mode, phase;
    538      1.1  reinoud 
    539      1.1  reinoud 	rp = dev->sc_fas;
    540      1.1  reinoud 	buf = dev->sc_buf;
    541      1.1  reinoud 	len = dev->sc_len;
    542      1.1  reinoud 
    543      1.1  reinoud /*
    544      1.1  reinoud  * Decode the scsi phase to determine whether we are reading or writing.
    545      1.1  reinoud  * mode == 1 => READ, mode == 0 => WRITE
    546      1.1  reinoud  */
    547      1.1  reinoud 	phase = dev->sc_status & SFAS_STAT_PHASE_MASK;
    548      1.1  reinoud 	mode = (phase == SFAS_PHASE_DATA_IN);
    549      1.1  reinoud 
    550      1.1  reinoud 	while(len && ((dev->sc_status & SFAS_STAT_PHASE_MASK) == phase))
    551      1.1  reinoud 		if (mode) {
    552      1.1  reinoud 			*rp->sfas_command = SFAS_CMD_TRANSFER_INFO;
    553      1.1  reinoud 
    554      1.1  reinoud 			sfasiwait(dev);
    555      1.1  reinoud 
    556      1.1  reinoud 			*buf++ = *rp->sfas_fifo;
    557      1.1  reinoud 			len--;
    558      1.1  reinoud 		} else {
    559      1.1  reinoud 			len--;
    560      1.1  reinoud 			*rp->sfas_fifo = *buf++;
    561      1.1  reinoud 			*rp->sfas_command = SFAS_CMD_TRANSFER_INFO;
    562      1.1  reinoud 
    563      1.1  reinoud 			sfasiwait(dev);
    564      1.1  reinoud 		}
    565      1.1  reinoud 
    566      1.1  reinoud /* Update buffer pointers to reflect the sent/received data. */
    567      1.1  reinoud 	dev->sc_buf = buf;
    568      1.1  reinoud 	dev->sc_len = len;
    569      1.1  reinoud 
    570      1.1  reinoud /*
    571      1.1  reinoud  * Since the last sfasiwait will be a phase-change, we can't wait for it
    572      1.1  reinoud  * again later, so we have to signal that.
    573      1.1  reinoud  * Since this may be called from an interrupt initiated routine then we
    574      1.1  reinoud  * must call sfasintr again to avoid losing an interrupt. Phew!
    575      1.1  reinoud  */
    576      1.1  reinoud 	if(polling)
    577      1.1  reinoud 		dev->sc_flags |= SFAS_DONT_WAIT;
    578      1.1  reinoud 	else
    579      1.1  reinoud 		sfasintr(dev);
    580      1.1  reinoud }
    581      1.1  reinoud 
    582      1.1  reinoud /*
    583      1.1  reinoud  * Build a Synchronous Data Transfer Request message
    584      1.1  reinoud  */
    585      1.1  reinoud void
    586      1.1  reinoud sfas_build_sdtrm(dev, period, offset)
    587      1.1  reinoud 	struct sfas_softc *dev;
    588      1.1  reinoud 	int		  period;
    589      1.1  reinoud 	int		  offset;
    590      1.1  reinoud {
    591      1.1  reinoud 	dev->sc_msg_out[0] = 0x01;
    592      1.1  reinoud 	dev->sc_msg_out[1] = 0x03;
    593      1.1  reinoud 	dev->sc_msg_out[2] = 0x01;
    594      1.1  reinoud 	dev->sc_msg_out[3] = period/4;
    595      1.1  reinoud 	dev->sc_msg_out[4] = offset;
    596      1.1  reinoud 	dev->sc_msg_out_len= 5;
    597      1.1  reinoud }
    598      1.1  reinoud 
    599      1.1  reinoud /*
    600      1.1  reinoud  * Arbitate the scsi bus and select the unit
    601      1.1  reinoud  */
    602      1.1  reinoud int
    603      1.1  reinoud sfas_select_unit(dev, target)
    604      1.1  reinoud 	struct sfas_softc *dev;
    605      1.1  reinoud 	short		  target;
    606      1.1  reinoud {
    607      1.1  reinoud 	sfas_regmap_p	 rp;
    608      1.1  reinoud 	struct nexus	*nexus;
    609      1.1  reinoud 	int		 s, retcode, i;
    610      1.1  reinoud 	u_char		 cmd;
    611      1.1  reinoud 
    612      1.1  reinoud 	s = splbio();	/* Do this at splbio so that we won't be disturbed. */
    613      1.1  reinoud 
    614      1.1  reinoud 	retcode = 0;
    615      1.1  reinoud 
    616      1.1  reinoud 	nexus = &dev->sc_nexus[target];
    617      1.1  reinoud 
    618      1.1  reinoud /*
    619      1.1  reinoud  * Check if the chip is busy. If not the we mark it as so and hope that nobody
    620      1.1  reinoud  * reselects us until we have grabbed the bus.
    621      1.1  reinoud  */
    622      1.1  reinoud 	if (!(dev->sc_flags & SFAS_ACTIVE) && !dev->sc_sel_nexus) {
    623      1.1  reinoud 		dev->sc_flags |= SFAS_ACTIVE;
    624      1.1  reinoud 
    625      1.1  reinoud 		rp = dev->sc_fas;
    626      1.1  reinoud 
    627      1.1  reinoud 		*rp->sfas_syncper = nexus->syncper;
    628      1.1  reinoud 		*rp->sfas_syncoff = nexus->syncoff;
    629      1.1  reinoud 		*rp->sfas_config3 = nexus->config3;
    630      1.1  reinoud 
    631      1.1  reinoud 		*rp->sfas_config1 = dev->sc_config1;
    632      1.1  reinoud 		*rp->sfas_timeout = dev->sc_timeout_val;
    633      1.1  reinoud 		*rp->sfas_dest_id = target;
    634      1.1  reinoud 
    635      1.1  reinoud /* If nobody has stolen the bus, we can send a select command to the chip. */
    636      1.1  reinoud 		if (!(*rp->sfas_status & SFAS_STAT_INTERRUPT_PENDING)) {
    637      1.1  reinoud 			*rp->sfas_fifo = nexus->ID;
    638      1.1  reinoud 			if ((nexus->flags & (SFAS_NF_DO_SDTR | SFAS_NF_RESET))
    639      1.1  reinoud 			    || (dev->sc_msg_out_len != 0))
    640      1.1  reinoud 				cmd = SFAS_CMD_SEL_ATN_STOP;
    641      1.1  reinoud 			else {
    642      1.1  reinoud 				for(i=0; i<nexus->clen; i++)
    643      1.1  reinoud 					*rp->sfas_fifo = nexus->cbuf[i];
    644      1.1  reinoud 
    645      1.1  reinoud 				cmd = SFAS_CMD_SEL_ATN;
    646      1.1  reinoud 			}
    647      1.1  reinoud 
    648      1.1  reinoud 			dev->sc_sel_nexus = nexus;
    649      1.1  reinoud 
    650      1.1  reinoud 			*rp->sfas_command = cmd;
    651      1.1  reinoud 			retcode = 1;
    652      1.1  reinoud 			nexus->flags &= ~SFAS_NF_RETRY_SELECT;
    653      1.1  reinoud 		} else
    654      1.1  reinoud 			nexus->flags |= SFAS_NF_RETRY_SELECT;
    655      1.1  reinoud 	} else
    656      1.1  reinoud 		nexus->flags |= SFAS_NF_RETRY_SELECT;
    657      1.1  reinoud 
    658      1.1  reinoud 	splx(s);
    659      1.1  reinoud 	return(retcode);
    660      1.1  reinoud }
    661      1.1  reinoud 
    662      1.1  reinoud /*
    663      1.1  reinoud  * Grab the nexus if available else return 0.
    664      1.1  reinoud  */
    665      1.1  reinoud struct nexus *
    666      1.1  reinoud sfas_arbitate_target(dev, target)
    667      1.1  reinoud 	struct sfas_softc *dev;
    668      1.1  reinoud 	int		  target;
    669      1.1  reinoud {
    670      1.1  reinoud 	struct nexus	*nexus;
    671      1.1  reinoud 	int		 s;
    672      1.1  reinoud 
    673      1.1  reinoud /*
    674      1.1  reinoud  * This is realy simple. Raise interrupt level to splbio. Grab the nexus and
    675      1.1  reinoud  * leave.
    676      1.1  reinoud  */
    677      1.1  reinoud 	nexus = &dev->sc_nexus[target];
    678      1.1  reinoud 
    679      1.1  reinoud 	s = splbio();
    680      1.1  reinoud 
    681      1.1  reinoud 	if (nexus->flags & SFAS_NF_UNIT_BUSY)
    682      1.1  reinoud 		nexus = 0;
    683      1.1  reinoud 	else
    684      1.1  reinoud 		nexus->flags |= SFAS_NF_UNIT_BUSY;
    685      1.1  reinoud 
    686      1.1  reinoud 	splx(s);
    687      1.1  reinoud 	return(nexus);
    688      1.1  reinoud }
    689      1.1  reinoud 
    690      1.1  reinoud /*
    691      1.1  reinoud  * Setup a nexus for use. Initializes command, buffer pointers and dma chain.
    692      1.1  reinoud  */
    693      1.1  reinoud void
    694      1.1  reinoud sfas_setup_nexus(dev, nexus, pendp, cbuf, clen, buf, len, mode)
    695      1.1  reinoud 	struct sfas_softc	*dev;
    696      1.1  reinoud 	struct nexus		*nexus;
    697      1.1  reinoud 	struct sfas_pending	*pendp;
    698      1.1  reinoud 	unsigned char		*cbuf;
    699      1.1  reinoud 	int			 clen;
    700      1.1  reinoud 	unsigned char		*buf;
    701      1.1  reinoud 	int			 len;
    702      1.1  reinoud 	int			 mode;
    703      1.1  reinoud {
    704      1.1  reinoud 	char	sync, target, lun;
    705      1.1  reinoud 
    706      1.1  reinoud 	target = pendp->xs->xs_periph->periph_target;
    707      1.1  reinoud 	lun    = pendp->xs->xs_periph->periph_lun;
    708      1.1  reinoud 
    709      1.1  reinoud /*
    710      1.1  reinoud  * Adopt mode to reflect the config flags.
    711      1.1  reinoud  * If we can't use DMA we can't use synch transfer. Also check the
    712      1.1  reinoud  * sfas_inhibit_xxx[target] flags.
    713      1.1  reinoud  */
    714      1.1  reinoud 	if ((dev->sc_config_flags & (SFAS_NO_SYNCH | SFAS_NO_DMA)) ||
    715      1.1  reinoud 	    sfas_inhibit_sync[(int)target])
    716      1.1  reinoud 		mode &= ~SFAS_SELECT_S;
    717      1.1  reinoud 
    718      1.1  reinoud 	if ((dev->sc_config_flags & SFAS_NO_RESELECT) ||
    719      1.1  reinoud 	    sfas_inhibit_disc[(int)target])
    720      1.1  reinoud 		mode &= ~SFAS_SELECT_R;
    721      1.1  reinoud 
    722      1.1  reinoud 	nexus->xs		= pendp->xs;
    723      1.1  reinoud 
    724      1.1  reinoud /* Setup the nexus struct. */
    725      1.1  reinoud 	nexus->ID	   = ((mode & SFAS_SELECT_R) ? 0xC0 : 0x80) | lun;
    726      1.1  reinoud 	nexus->clen	   = clen;
    727      1.1  reinoud 	bcopy(cbuf, nexus->cbuf, nexus->clen);
    728      1.1  reinoud 	nexus->cbuf[1] |= lun << 5;		/* Fix the lun bits */
    729      1.1  reinoud 	nexus->cur_link	   = 0;
    730      1.1  reinoud 	nexus->dma_len	   = 0;
    731      1.1  reinoud 	nexus->dma_buf	   = 0;
    732      1.1  reinoud 	nexus->dma_blk_len = 0;
    733      1.1  reinoud 	nexus->dma_blk_ptr = 0;
    734      1.1  reinoud 	nexus->len	   = len;
    735      1.1  reinoud 	nexus->buf	   = buf;
    736      1.1  reinoud 	nexus->lun_unit	   = (lun << 4) | target;
    737      1.1  reinoud 	nexus->state	   = SFAS_NS_SELECTED;
    738      1.1  reinoud 
    739      1.1  reinoud /* We must keep these flags. All else must be zero. */
    740      1.1  reinoud 	nexus->flags	  &= SFAS_NF_UNIT_BUSY
    741      1.1  reinoud 			   | SFAS_NF_SYNC_TESTED | SFAS_NF_SELECT_ME;
    742      1.1  reinoud 
    743      1.1  reinoud 	if (mode & SFAS_SELECT_I)
    744      1.1  reinoud 		nexus->flags |= SFAS_NF_IMMEDIATE;
    745      1.1  reinoud 	if (mode & SFAS_SELECT_K)
    746      1.1  reinoud 		nexus->flags |= SFAS_NF_RESET;
    747      1.1  reinoud 
    748      1.1  reinoud 	sync  = ((mode & SFAS_SELECT_S) ? 1 : 0);
    749      1.1  reinoud 
    750      1.1  reinoud /* We can't use sync during polled IO. */
    751      1.1  reinoud 	if (sync && (mode & SFAS_SELECT_I))
    752      1.1  reinoud 		sync = 0;
    753      1.1  reinoud 
    754      1.1  reinoud 	if (!sync &&
    755      1.1  reinoud 	    ((nexus->flags & SFAS_NF_SYNC_TESTED) && (nexus->offset != 0))) {
    756      1.1  reinoud 		/*
    757      1.1  reinoud 		 * If the scsi unit is set to synch transfer and we don't want
    758      1.1  reinoud 		 * that, we have to renegotiate.
    759      1.1  reinoud 		 */
    760      1.1  reinoud 
    761      1.1  reinoud 		nexus->flags |= SFAS_NF_DO_SDTR;
    762      1.1  reinoud 		nexus->period = 200;
    763      1.1  reinoud 		nexus->offset = 0;
    764      1.1  reinoud 	} else if (sync && !(nexus->flags & SFAS_NF_SYNC_TESTED)) {
    765      1.1  reinoud 		/*
    766      1.1  reinoud 		 * If the scsi unit is not set to synch transfer and we want
    767      1.1  reinoud 		 * that, we have to negotiate. This should realy base the
    768      1.1  reinoud 		 * period on the clock frequence rather than just check if
    769      1.1  reinoud 		 * >25Mhz
    770      1.1  reinoud 		 */
    771      1.1  reinoud 
    772      1.1  reinoud 		nexus->flags |= SFAS_NF_DO_SDTR;
    773      1.1  reinoud 		nexus->period = ((dev->sc_clock_freq>25) ? 100 : 200);
    774      1.1  reinoud 		nexus->offset = 8;
    775      1.1  reinoud 
    776      1.1  reinoud 		/* If the user has a long cable, we want to limit the period */
    777      1.1  reinoud 		if ((nexus->period == 100) &&
    778      1.1  reinoud 		    (dev->sc_config_flags & SFAS_SLOW_CABLE))
    779      1.1  reinoud 			nexus->period = 200;
    780      1.1  reinoud 	}
    781      1.1  reinoud 
    782      1.1  reinoud /*
    783      1.1  reinoud  * Fake a dma-block for polled IO. This way we can use the same code to handle
    784      1.1  reinoud  * reselection. Much nicer this way.
    785      1.1  reinoud  */
    786      1.1  reinoud 	if ((mode & SFAS_SELECT_I) || (dev->sc_config_flags & SFAS_NO_DMA)) {
    787      1.1  reinoud 		nexus->dma[0].ptr = (vm_offset_t)buf;
    788      1.1  reinoud 		nexus->dma[0].len = len;
    789      1.1  reinoud 		nexus->dma[0].flg = SFAS_CHAIN_PRG;
    790      1.1  reinoud 		nexus->max_link   = 1;
    791      1.1  reinoud 	} else {
    792      1.1  reinoud 		nexus->max_link = dev->sc_build_dma_chain(dev, nexus->dma,
    793      1.1  reinoud 							  buf, len);
    794      1.1  reinoud 	}
    795      1.1  reinoud 
    796      1.1  reinoud /* Flush the caches. */
    797      1.1  reinoud 
    798      1.1  reinoud 	if (len && !(mode & SFAS_SELECT_I))
    799      1.4  thorpej 		cpu_dcache_wbinv_range((vm_offset_t)buf, len);
    800      1.1  reinoud }
    801      1.1  reinoud 
    802      1.1  reinoud int
    803      1.1  reinoud sfasselect(dev, pendp, cbuf, clen, buf, len, mode)
    804      1.1  reinoud 	struct sfas_softc	*dev;
    805      1.1  reinoud 	struct sfas_pending	*pendp;
    806      1.1  reinoud 	unsigned char		*cbuf;
    807      1.1  reinoud 	int			 clen;
    808      1.1  reinoud 	unsigned char		*buf;
    809      1.1  reinoud 	int			 len;
    810      1.1  reinoud 	int			 mode;
    811      1.1  reinoud {
    812      1.1  reinoud 	struct nexus	*nexus;
    813      1.1  reinoud 
    814      1.1  reinoud /* Get the nexus struct. */
    815      1.1  reinoud 	nexus = sfas_arbitate_target(dev, pendp->xs->xs_periph->periph_target);
    816      1.1  reinoud 	if (nexus == NULL)
    817      1.1  reinoud 		return(0);
    818      1.1  reinoud 
    819      1.1  reinoud /* Setup the nexus struct. */
    820      1.1  reinoud 	sfas_setup_nexus(dev, nexus, pendp, cbuf, clen, buf, len, mode);
    821      1.1  reinoud 
    822      1.1  reinoud /* Post it to the interrupt machine. */
    823      1.1  reinoud 	sfas_select_unit(dev, pendp->xs->xs_periph->periph_target);
    824      1.1  reinoud 
    825      1.1  reinoud 	return(1);
    826      1.1  reinoud }
    827      1.1  reinoud 
    828      1.1  reinoud void
    829      1.1  reinoud sfasgo(dev, pendp)
    830      1.1  reinoud 	struct sfas_softc   *dev;
    831      1.1  reinoud 	struct sfas_pending *pendp;
    832      1.1  reinoud {
    833      1.1  reinoud 	int	 s;
    834      1.1  reinoud 	char	*buf;
    835      1.1  reinoud 
    836      1.1  reinoud 	buf    = pendp->xs->data;
    837      1.1  reinoud 
    838      1.1  reinoud 	if (sfasselect(dev, pendp, (char *)pendp->xs->cmd, pendp->xs->cmdlen,
    839      1.1  reinoud 		      buf, pendp->xs->datalen, SFAS_SELECT_RS)) {
    840      1.1  reinoud 		/*
    841      1.1  reinoud 		 * We got the command going so the sfas_pending struct is now
    842      1.1  reinoud 		 * free to reuse.
    843      1.1  reinoud 		 */
    844      1.1  reinoud 
    845      1.1  reinoud 		s = splbio();
    846      1.1  reinoud 		TAILQ_INSERT_TAIL(&dev->sc_xs_free, pendp, link);
    847      1.1  reinoud 		splx(s);
    848      1.1  reinoud 	} else {
    849      1.1  reinoud 		/*
    850      1.1  reinoud 		 * We couldn't make the command fly so we have to wait. The
    851      1.1  reinoud 		 * struct MUST be inserted at the head to keep the order of
    852      1.1  reinoud 		 * the commands.
    853      1.1  reinoud 		 */
    854      1.1  reinoud 
    855      1.1  reinoud 		s = splbio();
    856      1.1  reinoud 		TAILQ_INSERT_HEAD(&dev->sc_xs_pending, pendp, link);
    857      1.1  reinoud 		splx(s);
    858      1.1  reinoud 	}
    859      1.1  reinoud 
    860      1.1  reinoud 	return;
    861      1.1  reinoud }
    862      1.1  reinoud 
    863      1.1  reinoud /*
    864      1.1  reinoud  * Part one of the interrupt machine. Error checks and reselection test.
    865      1.1  reinoud  * We don't know if we have an active nexus here!
    866      1.1  reinoud  */
    867      1.1  reinoud int
    868      1.1  reinoud sfas_pretests(dev, rp)
    869      1.1  reinoud 	struct sfas_softc *dev;
    870      1.1  reinoud 	sfas_regmap_p	  rp;
    871      1.1  reinoud {
    872      1.1  reinoud 	struct nexus	*nexus;
    873      1.1  reinoud 	int		 i, s;
    874      1.1  reinoud 
    875      1.1  reinoud 	if (dev->sc_interrupt & SFAS_INT_SCSI_RESET_DETECTED) {
    876      1.1  reinoud 		/*
    877      1.1  reinoud 		 * Cleanup and notify user. Lets hope that this is all we
    878      1.1  reinoud 		 * have to do
    879      1.1  reinoud 		 */
    880      1.1  reinoud 
    881      1.1  reinoud 		for(i=0; i<8; i++) {
    882      1.1  reinoud 			if (dev->sc_nexus[i].xs)
    883      1.1  reinoud 				sfas_scsidone(dev, dev->sc_nexus[i].xs, -2);
    884      1.1  reinoud 
    885      1.1  reinoud 			sfas_init_nexus(dev, &dev->sc_nexus[i]);
    886      1.1  reinoud 		}
    887      1.1  reinoud 		printf("sfasintr: SCSI-RESET detected!");
    888      1.1  reinoud 		return(-1);
    889      1.1  reinoud 	}
    890      1.1  reinoud 
    891      1.1  reinoud 	if (dev->sc_interrupt & SFAS_INT_ILLEGAL_COMMAND) {
    892      1.1  reinoud 		/* Something went terrible wrong! Dump some data and panic! */
    893      1.1  reinoud 
    894      1.1  reinoud 		printf("FIFO:");
    895      1.1  reinoud 		while(*rp->sfas_fifo_flags & SFAS_FIFO_COUNT_MASK)
    896      1.1  reinoud 			printf(" %x", *rp->sfas_fifo);
    897      1.1  reinoud 		printf("\n");
    898      1.1  reinoud 
    899      1.1  reinoud 		printf("CMD: %x\n", *rp->sfas_command);
    900      1.1  reinoud 		panic("sfasintr: ILLEGAL COMMAND!");
    901      1.1  reinoud 	}
    902      1.1  reinoud 
    903      1.1  reinoud 	if (dev->sc_interrupt & SFAS_INT_RESELECTED) {
    904      1.1  reinoud 		/* We were reselected. Set the chip as busy */
    905      1.1  reinoud 
    906      1.1  reinoud 		s = splbio();
    907      1.1  reinoud 		dev->sc_flags |= SFAS_ACTIVE;
    908      1.1  reinoud 		if (dev->sc_sel_nexus) {
    909      1.1  reinoud 			dev->sc_sel_nexus->flags |= SFAS_NF_SELECT_ME;
    910      1.1  reinoud 			dev->sc_sel_nexus = 0;
    911      1.1  reinoud 		}
    912      1.1  reinoud 		splx(s);
    913      1.1  reinoud 
    914      1.1  reinoud 		if (dev->sc_units_disconnected) {
    915      1.1  reinoud 			/* Find out who reselected us. */
    916      1.1  reinoud 
    917      1.1  reinoud 			dev->sc_resel[0] &= ~(1<<dev->sc_host_id);
    918      1.1  reinoud 
    919      1.1  reinoud 			for(i=0; i<8; i++)
    920      1.1  reinoud 				if (dev->sc_resel[0] & (1<<i))
    921      1.1  reinoud 					break;
    922      1.1  reinoud 
    923      1.1  reinoud 			if (i == 8)
    924      1.1  reinoud 				panic("Illegal reselection!");
    925      1.1  reinoud 
    926      1.1  reinoud 			if (dev->sc_nexus[i].state == SFAS_NS_DISCONNECTED) {
    927      1.1  reinoud 				/*
    928      1.1  reinoud 				 * This unit had disconnected, so we reconnect
    929      1.1  reinoud 				 * it.
    930      1.1  reinoud 				 */
    931      1.1  reinoud 
    932      1.1  reinoud 				dev->sc_cur_nexus = &dev->sc_nexus[i];
    933      1.1  reinoud 				nexus = dev->sc_cur_nexus;
    934      1.1  reinoud 
    935      1.1  reinoud 				*rp->sfas_syncper = nexus->syncper;
    936      1.1  reinoud 				*rp->sfas_syncoff = nexus->syncoff;
    937      1.1  reinoud 				*rp->sfas_config3 = nexus->config3;
    938      1.1  reinoud 
    939      1.1  reinoud 				*rp->sfas_dest_id = i & 7;
    940      1.1  reinoud 
    941      1.1  reinoud 				dev->sc_units_disconnected--;
    942      1.1  reinoud 				dev->sc_msg_in_len= 0;
    943      1.1  reinoud 
    944      1.1  reinoud 				/* Restore active pointers. */
    945      1.1  reinoud 				sfas_restore_pointers(dev);
    946      1.1  reinoud 
    947      1.1  reinoud 				nexus->state = SFAS_NS_RESELECTED;
    948      1.1  reinoud 
    949      1.1  reinoud 				*rp->sfas_command = SFAS_CMD_MESSAGE_ACCEPTED;
    950      1.1  reinoud 
    951      1.1  reinoud 				return(1);
    952      1.1  reinoud 			}
    953      1.1  reinoud 		}
    954      1.1  reinoud 
    955      1.1  reinoud 		/* Somehow we got an illegal reselection. Dump and panic. */
    956      1.1  reinoud 		printf("sfasintr: resel[0] %x resel[1] %x disconnected %d\n",
    957      1.1  reinoud 		       dev->sc_resel[0], dev->sc_resel[1],
    958      1.1  reinoud 		       dev->sc_units_disconnected);
    959      1.1  reinoud 		panic("sfasintr: Unexpected reselection!");
    960      1.1  reinoud 	}
    961      1.1  reinoud 
    962      1.1  reinoud 	return(0);
    963      1.1  reinoud }
    964      1.1  reinoud 
    965      1.1  reinoud /*
    966      1.1  reinoud  * Part two of the interrupt machine. Handle disconnection and post command
    967      1.1  reinoud  * processing. We know that we have an active nexus here.
    968      1.1  reinoud  */
    969      1.1  reinoud int
    970      1.1  reinoud sfas_midaction(dev, rp, nexus)
    971      1.1  reinoud 	struct sfas_softc *dev;
    972      1.1  reinoud 	sfas_regmap_p	  rp;
    973      1.1  reinoud 	struct nexus	 *nexus;
    974      1.1  reinoud {
    975      1.1  reinoud 	int	i, left, len, s;
    976      1.1  reinoud 	u_char	status, msg;
    977      1.1  reinoud 
    978      1.1  reinoud 	if (dev->sc_interrupt & SFAS_INT_DISCONNECT) {
    979      1.1  reinoud 		s = splbio();
    980      1.1  reinoud 		dev->sc_cur_nexus = 0;
    981      1.1  reinoud 
    982      1.1  reinoud 		/* Mark chip as busy and clean up the chip FIFO. */
    983      1.1  reinoud 		dev->sc_flags &= ~SFAS_ACTIVE;
    984      1.1  reinoud 		*rp->sfas_command = SFAS_CMD_FLUSH_FIFO;
    985      1.1  reinoud 
    986      1.1  reinoud 		/* Let the nexus state reflect what we have to do. */
    987      1.1  reinoud 		switch(nexus->state) {
    988      1.1  reinoud 		case SFAS_NS_SELECTED:
    989      1.1  reinoud 			dev->sc_sel_nexus = 0;
    990      1.1  reinoud 			nexus->flags &= ~SFAS_NF_SELECT_ME;
    991      1.1  reinoud 
    992      1.1  reinoud 			/*
    993      1.1  reinoud 			 * We were trying to select the unit. Probably no unit
    994      1.1  reinoud 			 * at this ID.
    995      1.1  reinoud 			 */
    996      1.1  reinoud 			nexus->xs->resid = dev->sc_len;
    997      1.1  reinoud 
    998      1.1  reinoud 			nexus->status = -2;
    999      1.1  reinoud 			nexus->flags &= ~SFAS_NF_UNIT_BUSY;
   1000      1.1  reinoud 			nexus->state = SFAS_NS_FINISHED;
   1001      1.1  reinoud 			break;
   1002      1.1  reinoud 
   1003      1.1  reinoud 		case SFAS_NS_DONE:
   1004      1.1  reinoud 			/* All done. */
   1005      1.1  reinoud 			nexus->xs->resid = dev->sc_len;
   1006      1.1  reinoud 
   1007      1.1  reinoud 			nexus->flags &= ~SFAS_NF_UNIT_BUSY;
   1008      1.1  reinoud 			nexus->state  = SFAS_NS_FINISHED;
   1009      1.1  reinoud 			dev->sc_led(dev, 0);
   1010      1.1  reinoud 			break;
   1011      1.1  reinoud 
   1012      1.1  reinoud 		case SFAS_NS_DISCONNECTING:
   1013      1.1  reinoud 			/*
   1014      1.1  reinoud 			 * We have received a DISCONNECT message, so we are
   1015      1.1  reinoud 			 * doing a normal disconnection.
   1016      1.1  reinoud 			 */
   1017      1.1  reinoud 			nexus->state = SFAS_NS_DISCONNECTED;
   1018      1.1  reinoud 
   1019      1.1  reinoud 			dev->sc_units_disconnected++;
   1020      1.1  reinoud 			break;
   1021      1.1  reinoud 
   1022      1.1  reinoud 		case SFAS_NS_RESET:
   1023      1.1  reinoud 			/*
   1024      1.1  reinoud 			 * We were reseting this SCSI-unit. Clean up the
   1025      1.1  reinoud 			 * nexus struct.
   1026      1.1  reinoud 			 */
   1027      1.1  reinoud 			dev->sc_led(dev, 0);
   1028      1.1  reinoud 			sfas_init_nexus(dev, nexus);
   1029      1.1  reinoud 			break;
   1030      1.1  reinoud 
   1031      1.1  reinoud 		default:
   1032      1.1  reinoud 			/*
   1033      1.1  reinoud 			 * Unexpected disconnection! Cleanup and exit. This
   1034      1.1  reinoud 			 * shouldn't cause any problems.
   1035      1.1  reinoud 			 */
   1036      1.1  reinoud 			printf("sfasintr: Unexpected disconnection\n");
   1037      1.1  reinoud 			printf("sfasintr: u %x s %d p %d f %x c %x\n",
   1038      1.1  reinoud 			       nexus->lun_unit, nexus->state,
   1039      1.1  reinoud 			       dev->sc_status & SFAS_STAT_PHASE_MASK,
   1040      1.1  reinoud 			       nexus->flags, nexus->cbuf[0]);
   1041      1.1  reinoud 
   1042      1.1  reinoud 			nexus->xs->resid = dev->sc_len;
   1043      1.1  reinoud 
   1044      1.1  reinoud 			nexus->flags &= ~SFAS_NF_UNIT_BUSY;
   1045      1.1  reinoud 			nexus->state = SFAS_NS_FINISHED;
   1046      1.1  reinoud 			nexus->status = -3;
   1047      1.1  reinoud 
   1048      1.1  reinoud 			dev->sc_led(dev, 0);
   1049      1.1  reinoud 			break;
   1050      1.1  reinoud 		}
   1051      1.1  reinoud 
   1052      1.1  reinoud 		/*
   1053      1.1  reinoud 		 * If we have disconnected units, we MUST enable reselection
   1054      1.1  reinoud 		 * within 250ms.
   1055      1.1  reinoud 		 */
   1056      1.1  reinoud 		if (dev->sc_units_disconnected &&
   1057      1.1  reinoud 		    !(dev->sc_flags & SFAS_ACTIVE))
   1058      1.1  reinoud 			*rp->sfas_command = SFAS_CMD_ENABLE_RESEL;
   1059      1.1  reinoud 
   1060      1.1  reinoud 		splx(s);
   1061      1.1  reinoud 
   1062      1.1  reinoud 		/* Select the first pre-initialized nexus we find. */
   1063      1.1  reinoud 		for(i=0; i<8; i++)
   1064      1.1  reinoud 			if (dev->sc_nexus[i].flags & (SFAS_NF_SELECT_ME | SFAS_NF_RETRY_SELECT))
   1065      1.1  reinoud 				if (sfas_select_unit(dev, i) == 2)
   1066      1.1  reinoud 					break;
   1067      1.1  reinoud 
   1068      1.1  reinoud 		/* We are done with this nexus! */
   1069      1.1  reinoud 		if (nexus->state == SFAS_NS_FINISHED)
   1070      1.1  reinoud 			sfas_scsidone(dev, nexus->xs, nexus->status);
   1071      1.1  reinoud 
   1072      1.1  reinoud 		return(1);
   1073      1.1  reinoud 	}
   1074      1.1  reinoud 
   1075      1.1  reinoud 	switch(nexus->state) {
   1076      1.1  reinoud 	case SFAS_NS_SELECTED:
   1077      1.1  reinoud 		dev->sc_cur_nexus = nexus;
   1078      1.1  reinoud 		dev->sc_sel_nexus = 0;
   1079      1.1  reinoud 
   1080      1.1  reinoud 		nexus->flags &= ~SFAS_NF_SELECT_ME;
   1081      1.1  reinoud 
   1082      1.1  reinoud 		/*
   1083      1.1  reinoud 		 * We have selected a unit. Setup chip, restore pointers and
   1084      1.1  reinoud 		 * light the led.
   1085      1.1  reinoud 		 */
   1086      1.1  reinoud 		*rp->sfas_syncper = nexus->syncper;
   1087      1.1  reinoud 		*rp->sfas_syncoff = nexus->syncoff;
   1088      1.1  reinoud 		*rp->sfas_config3 = nexus->config3;
   1089      1.1  reinoud 
   1090      1.1  reinoud 		sfas_restore_pointers(dev);
   1091      1.1  reinoud 
   1092      1.1  reinoud 		nexus->status	= 0xFF;
   1093      1.1  reinoud 		dev->sc_msg_in[0] = 0xFF;
   1094      1.1  reinoud 		dev->sc_msg_in_len= 0;
   1095      1.1  reinoud 
   1096      1.1  reinoud 		dev->sc_led(dev, 1);
   1097      1.1  reinoud 
   1098      1.1  reinoud 		break;
   1099      1.1  reinoud 
   1100      1.1  reinoud 	case SFAS_NS_DATA_IN:
   1101      1.1  reinoud 	case SFAS_NS_DATA_OUT:
   1102      1.1  reinoud 		/* We have transfered data. */
   1103      1.1  reinoud 		if (dev->sc_dma_len)
   1104      1.1  reinoud 			if (dev->sc_cur_link < dev->sc_max_link) {
   1105      1.1  reinoud 				/*
   1106      1.1  reinoud 				 * Clean up dma and at the same time get how
   1107      1.1  reinoud 				 * many bytes that were NOT transfered.
   1108      1.1  reinoud 				 */
   1109      1.1  reinoud 			  left = dev->sc_setup_dma(dev, 0, 0, SFAS_DMA_CLEAR);
   1110      1.1  reinoud 			  len  = dev->sc_dma_len;
   1111      1.1  reinoud 
   1112      1.1  reinoud 			  if (nexus->state == SFAS_NS_DATA_IN) {
   1113      1.1  reinoud 			    /*
   1114      1.1  reinoud 			     * If we were bumping we may have had an odd length
   1115      1.1  reinoud 			     * which means that there may be bytes left in the
   1116      1.1  reinoud 			     * fifo. We also need to move the data from the
   1117      1.1  reinoud 			     * bump buffer to the actual memory.
   1118      1.1  reinoud 			     */
   1119      1.1  reinoud 			    if (dev->sc_dma_buf == dev->sc_bump_pa)
   1120      1.1  reinoud 			    {
   1121      1.1  reinoud 			      while((*rp->sfas_fifo_flags&SFAS_FIFO_COUNT_MASK)
   1122      1.1  reinoud 				    && left)
   1123      1.1  reinoud 				dev->sc_bump_va[len-(left--)] = *rp->sfas_fifo;
   1124      1.1  reinoud 
   1125      1.1  reinoud 			      bcopy(dev->sc_bump_va, dev->sc_buf, len-left);
   1126      1.1  reinoud 			    }
   1127      1.1  reinoud 			  } else {
   1128      1.1  reinoud 			    /* Count any unsent bytes and flush them. */
   1129      1.1  reinoud 			    left+= *rp->sfas_fifo_flags & SFAS_FIFO_COUNT_MASK;
   1130      1.1  reinoud 			    *rp->sfas_command = SFAS_CMD_FLUSH_FIFO;
   1131      1.1  reinoud 			  }
   1132      1.1  reinoud 
   1133      1.1  reinoud 			  /*
   1134      1.1  reinoud 			   * Update pointers/length to reflect the transfered
   1135      1.1  reinoud 			   * data.
   1136      1.1  reinoud 			   */
   1137      1.1  reinoud 			  dev->sc_len -= len-left;
   1138      1.1  reinoud 			  dev->sc_buf += len-left;
   1139      1.1  reinoud 
   1140      1.1  reinoud 			  dev->sc_dma_buf += len-left;
   1141      1.1  reinoud 			  dev->sc_dma_len  = left;
   1142      1.1  reinoud 
   1143      1.1  reinoud 			  dev->sc_dma_blk_ptr += len-left;
   1144      1.1  reinoud 			  dev->sc_dma_blk_len -= len-left;
   1145      1.1  reinoud 
   1146      1.1  reinoud 			  /*
   1147      1.1  reinoud 			   * If it was the end of a dma block, we select the
   1148      1.1  reinoud 			   * next to begin with.
   1149      1.1  reinoud 			   */
   1150      1.1  reinoud 			  if (!dev->sc_dma_blk_len)
   1151      1.1  reinoud 			    dev->sc_cur_link++;
   1152      1.1  reinoud 			}
   1153      1.1  reinoud 		break;
   1154      1.1  reinoud 
   1155      1.1  reinoud 	case SFAS_NS_STATUS:
   1156      1.1  reinoud 		/*
   1157      1.1  reinoud 		 * If we were not sensing, grab the status byte. If we were
   1158      1.1  reinoud 		 * sensing and we got a bad status, let the user know.
   1159      1.1  reinoud 		 */
   1160      1.1  reinoud 
   1161      1.1  reinoud 		status = *rp->sfas_fifo;
   1162      1.1  reinoud 		msg = *rp->sfas_fifo;
   1163      1.1  reinoud 
   1164      1.1  reinoud 		nexus->status = status;
   1165      1.1  reinoud 		if (status != 0)
   1166      1.1  reinoud 			nexus->status = -1;
   1167      1.1  reinoud 
   1168      1.1  reinoud 		/*
   1169      1.1  reinoud 		 * Preload the command complete message. Handeled in
   1170      1.1  reinoud 		 * sfas_postaction.
   1171      1.1  reinoud 		 */
   1172      1.1  reinoud 		dev->sc_msg_in[0] = msg;
   1173      1.1  reinoud 		dev->sc_msg_in_len = 1;
   1174      1.1  reinoud 		nexus->flags |= SFAS_NF_HAS_MSG;
   1175      1.1  reinoud 		break;
   1176      1.1  reinoud 
   1177      1.1  reinoud 	default:
   1178      1.1  reinoud 		break;
   1179      1.1  reinoud 	}
   1180      1.1  reinoud 
   1181      1.1  reinoud 	return(0);
   1182      1.1  reinoud }
   1183      1.1  reinoud 
   1184      1.1  reinoud /*
   1185      1.1  reinoud  * Part three of the interrupt machine. Handle phase changes (and repeated
   1186      1.1  reinoud  * phase passes). We know that we have an active nexus here.
   1187      1.1  reinoud  */
   1188      1.1  reinoud int
   1189      1.1  reinoud sfas_postaction(dev, rp, nexus)
   1190      1.1  reinoud 	struct sfas_softc *dev;
   1191      1.1  reinoud 	sfas_regmap_p	  rp;
   1192      1.1  reinoud 	struct nexus	 *nexus;
   1193      1.1  reinoud {
   1194      1.1  reinoud 	int	i, len;
   1195      1.1  reinoud 	u_char	cmd;
   1196      1.1  reinoud 	short	offset, period;
   1197      1.1  reinoud 
   1198      1.1  reinoud 	cmd = 0;
   1199      1.1  reinoud 
   1200      1.1  reinoud 	switch(dev->sc_status & SFAS_STAT_PHASE_MASK) {
   1201      1.1  reinoud 	case SFAS_PHASE_DATA_OUT:
   1202      1.1  reinoud 	case SFAS_PHASE_DATA_IN:
   1203      1.1  reinoud 		if ((dev->sc_status & SFAS_STAT_PHASE_MASK) ==
   1204      1.1  reinoud 		    SFAS_PHASE_DATA_OUT)
   1205      1.1  reinoud 			nexus->state = SFAS_NS_DATA_OUT;
   1206      1.1  reinoud 		else
   1207      1.1  reinoud 			nexus->state = SFAS_NS_DATA_IN;
   1208      1.1  reinoud 
   1209      1.1  reinoud 		/* Make DMA ready to accept new data. Load active pointers
   1210      1.1  reinoud 		 * from the DMA block. */
   1211      1.1  reinoud 		dev->sc_setup_dma(dev, 0, 0, SFAS_DMA_CLEAR);
   1212      1.1  reinoud 		if (dev->sc_cur_link < dev->sc_max_link) {
   1213      1.1  reinoud 		  if (!dev->sc_dma_blk_len) {
   1214      1.1  reinoud 		    dev->sc_dma_blk_ptr = dev->sc_chain[dev->sc_cur_link].ptr;
   1215      1.1  reinoud 		    dev->sc_dma_blk_len = dev->sc_chain[dev->sc_cur_link].len;
   1216      1.1  reinoud 		    dev->sc_dma_blk_flg = dev->sc_chain[dev->sc_cur_link].flg;
   1217      1.1  reinoud 		  }
   1218      1.1  reinoud 
   1219      1.1  reinoud 		  /* We should use polled IO here. */
   1220      1.1  reinoud 		  if (dev->sc_dma_blk_flg == SFAS_CHAIN_PRG) {
   1221      1.1  reinoud 			dev->sc_ixfer(dev, nexus->xs->xs_control & XS_CTL_POLL);
   1222      1.1  reinoud 			dev->sc_cur_link++;
   1223      1.1  reinoud 			dev->sc_dma_len = 0;
   1224      1.1  reinoud 			break;
   1225      1.1  reinoud 		  }
   1226      1.1  reinoud 		  else if (dev->sc_dma_blk_flg == SFAS_CHAIN_BUMP)
   1227      1.1  reinoud 			len = dev->sc_dma_blk_len;
   1228      1.1  reinoud 		  else
   1229      1.1  reinoud 			len = dev->sc_need_bump(dev, dev->sc_dma_blk_ptr,
   1230      1.1  reinoud 						dev->sc_dma_blk_len);
   1231      1.1  reinoud 
   1232      1.1  reinoud 		  /*
   1233      1.1  reinoud 		   * If len != 0 we must bump the data, else we just DMA it
   1234      1.1  reinoud 		   * straight into memory.
   1235      1.1  reinoud 		   */
   1236      1.1  reinoud 		  if (len) {
   1237      1.1  reinoud 			dev->sc_dma_buf = dev->sc_bump_pa;
   1238      1.1  reinoud 			dev->sc_dma_len = len;
   1239      1.1  reinoud 
   1240      1.1  reinoud 			if (nexus->state == SFAS_NS_DATA_OUT)
   1241      1.1  reinoud 			  bcopy(dev->sc_buf, dev->sc_bump_va, dev->sc_dma_len);
   1242      1.1  reinoud 		  } else {
   1243      1.1  reinoud 			dev->sc_dma_buf = dev->sc_dma_blk_ptr;
   1244      1.1  reinoud 			dev->sc_dma_len = dev->sc_dma_blk_len;
   1245      1.1  reinoud 		  }
   1246      1.1  reinoud 
   1247      1.1  reinoud 		  /* Load DMA with adress and length of transfer. */
   1248      1.1  reinoud 		  dev->sc_setup_dma(dev, dev->sc_dma_buf, dev->sc_dma_len,
   1249      1.1  reinoud 				    ((nexus->state == SFAS_NS_DATA_OUT) ?
   1250      1.1  reinoud 				     SFAS_DMA_WRITE : SFAS_DMA_READ));
   1251      1.1  reinoud 
   1252      1.1  reinoud /*		  printf("Using DMA !!!!\n");*/
   1253      1.1  reinoud 		  cmd = SFAS_CMD_TRANSFER_INFO | SFAS_CMD_DMA;
   1254      1.1  reinoud 		} else {
   1255      1.1  reinoud 			/*
   1256      1.1  reinoud 			 * Hmmm, the unit wants more info than we have or has
   1257      1.1  reinoud 			 * more than we want. Let the chip handle that.
   1258      1.1  reinoud 			 */
   1259      1.1  reinoud 
   1260      1.1  reinoud 			*rp->sfas_tc_low = 0; /* was 256 but this does not make sense */
   1261      1.1  reinoud 			*rp->sfas_tc_mid = 1;
   1262      1.1  reinoud 			*rp->sfas_tc_high = 0;
   1263      1.1  reinoud 			cmd = SFAS_CMD_TRANSFER_PAD;
   1264      1.1  reinoud 		}
   1265      1.1  reinoud 		break;
   1266      1.1  reinoud 
   1267      1.1  reinoud 	case SFAS_PHASE_COMMAND:
   1268      1.1  reinoud 		/* The scsi unit wants the command, send it. */
   1269      1.1  reinoud 		nexus->state = SFAS_NS_SVC;
   1270      1.1  reinoud 
   1271      1.1  reinoud 		*rp->sfas_command = SFAS_CMD_FLUSH_FIFO;
   1272      1.1  reinoud 		for(i=0; i<5; i++);
   1273      1.1  reinoud 
   1274      1.1  reinoud 		for(i=0; i<nexus->clen; i++)
   1275      1.1  reinoud 			*rp->sfas_fifo = nexus->cbuf[i];
   1276      1.1  reinoud 		cmd = SFAS_CMD_TRANSFER_INFO;
   1277      1.1  reinoud 		break;
   1278      1.1  reinoud 
   1279      1.1  reinoud 	case SFAS_PHASE_STATUS:
   1280      1.1  reinoud 		/*
   1281      1.1  reinoud 		 * We've got status phase. Request status and command
   1282      1.1  reinoud 		 * complete message.
   1283      1.1  reinoud 		 */
   1284      1.1  reinoud 		nexus->state = SFAS_NS_STATUS;
   1285      1.1  reinoud 		cmd = SFAS_CMD_COMMAND_COMPLETE;
   1286      1.1  reinoud 		break;
   1287      1.1  reinoud 
   1288      1.1  reinoud 	case SFAS_PHASE_MESSAGE_OUT:
   1289      1.1  reinoud 		/*
   1290      1.1  reinoud 		 * Either the scsi unit wants us to send a message or we have
   1291      1.1  reinoud 		 * asked for it by seting the ATN bit.
   1292      1.1  reinoud 		 */
   1293      1.1  reinoud 		nexus->state = SFAS_NS_MSG_OUT;
   1294      1.1  reinoud 
   1295      1.1  reinoud 		*rp->sfas_command = SFAS_CMD_FLUSH_FIFO;
   1296      1.1  reinoud 
   1297      1.1  reinoud 		if (nexus->flags & SFAS_NF_DO_SDTR) {
   1298      1.1  reinoud 			/* Send a Synchronous Data Transfer Request. */
   1299      1.1  reinoud 
   1300      1.1  reinoud 			sfas_build_sdtrm(dev, nexus->period, nexus->offset);
   1301      1.1  reinoud 			nexus->flags |= SFAS_NF_SDTR_SENT;
   1302      1.1  reinoud 			nexus->flags &= ~SFAS_NF_DO_SDTR;
   1303      1.1  reinoud 		} else if (nexus->flags & SFAS_NF_RESET) {
   1304      1.1  reinoud 			/* Send a reset scsi unit message. */
   1305      1.1  reinoud 
   1306      1.1  reinoud 			dev->sc_msg_out[0] = 0x0C;
   1307      1.1  reinoud 			dev->sc_msg_out_len = 1;
   1308      1.1  reinoud 			nexus->state = SFAS_NS_RESET;
   1309      1.1  reinoud 			nexus->flags &= ~SFAS_NF_RESET;
   1310      1.1  reinoud 		} else if (dev->sc_msg_out_len == 0) {
   1311      1.1  reinoud 			/* Don't know what to send so we send a NOP message. */
   1312      1.1  reinoud 
   1313      1.1  reinoud 			dev->sc_msg_out[0] = 0x08;
   1314      1.1  reinoud 			dev->sc_msg_out_len = 1;
   1315      1.1  reinoud 		}
   1316      1.1  reinoud 
   1317      1.1  reinoud 		cmd = SFAS_CMD_TRANSFER_INFO;
   1318      1.1  reinoud 
   1319      1.1  reinoud 		for(i=0; i<dev->sc_msg_out_len; i++)
   1320      1.1  reinoud 			*rp->sfas_fifo = dev->sc_msg_out[i];
   1321      1.1  reinoud 		dev->sc_msg_out_len = 0;
   1322      1.1  reinoud 
   1323      1.1  reinoud 		break;
   1324      1.1  reinoud 
   1325      1.1  reinoud 	case SFAS_PHASE_MESSAGE_IN:
   1326      1.1  reinoud 		/* Receive a message from the scsi unit. */
   1327      1.1  reinoud 		nexus->state = SFAS_NS_MSG_IN;
   1328      1.1  reinoud 
   1329      1.1  reinoud 		while(!(nexus->flags & SFAS_NF_HAS_MSG)) {
   1330      1.1  reinoud 			*rp->sfas_command = SFAS_CMD_TRANSFER_INFO;
   1331      1.1  reinoud 			sfasiwait(dev);
   1332      1.1  reinoud 
   1333      1.1  reinoud 			dev->sc_msg_in[dev->sc_msg_in_len++] = *rp->sfas_fifo;
   1334      1.1  reinoud 
   1335      1.1  reinoud 			/* Check if we got all the bytes in the message. */
   1336      1.1  reinoud 			if (dev->sc_msg_in[0] >= 0x80)       ;
   1337      1.1  reinoud 			else if (dev->sc_msg_in[0] >= 0x30)  ;
   1338      1.1  reinoud 			else if (((dev->sc_msg_in[0] >= 0x20) &&
   1339      1.1  reinoud 				  (dev->sc_msg_in_len == 2)) ||
   1340      1.1  reinoud 				 ((dev->sc_msg_in[0] != 0x01) &&
   1341      1.1  reinoud 				  (dev->sc_msg_in_len == 1))) {
   1342      1.1  reinoud 				nexus->flags |= SFAS_NF_HAS_MSG;
   1343      1.1  reinoud 				break;
   1344      1.1  reinoud 			} else {
   1345      1.1  reinoud 			  if (dev->sc_msg_in_len >= 2)
   1346      1.1  reinoud 			    if ((dev->sc_msg_in[1]+2) == dev->sc_msg_in_len) {
   1347      1.1  reinoud 				nexus->flags |= SFAS_NF_HAS_MSG;
   1348      1.1  reinoud 				break;
   1349      1.1  reinoud 			    }
   1350      1.1  reinoud 			}
   1351      1.1  reinoud 
   1352      1.1  reinoud 			*rp->sfas_command = SFAS_CMD_MESSAGE_ACCEPTED;
   1353      1.1  reinoud 			sfasiwait(dev);
   1354      1.1  reinoud 
   1355      1.1  reinoud 			if ((dev->sc_status & SFAS_STAT_PHASE_MASK) !=
   1356      1.1  reinoud 			    SFAS_PHASE_MESSAGE_IN)
   1357      1.1  reinoud 				break;
   1358      1.1  reinoud 		}
   1359      1.1  reinoud 
   1360      1.1  reinoud 		cmd = SFAS_CMD_MESSAGE_ACCEPTED;
   1361      1.1  reinoud 		if (nexus->flags & SFAS_NF_HAS_MSG) {
   1362      1.1  reinoud 			/* We have a message. Decode it. */
   1363      1.1  reinoud 
   1364      1.1  reinoud 			switch(dev->sc_msg_in[0]) {
   1365      1.1  reinoud 			case 0x00:	/* COMMAND COMPLETE */
   1366      1.1  reinoud 				nexus->state = SFAS_NS_DONE;
   1367      1.1  reinoud 				break;
   1368      1.1  reinoud 			case 0x04:	/* DISCONNECT */
   1369      1.1  reinoud 				nexus->state = SFAS_NS_DISCONNECTING;
   1370      1.1  reinoud 				break;
   1371      1.1  reinoud 			case 0x02:	/* SAVE DATA POINTER */
   1372      1.1  reinoud 				sfas_save_pointers(dev);
   1373      1.1  reinoud 				break;
   1374      1.1  reinoud 			case 0x03:	/* RESTORE DATA POINTERS */
   1375      1.1  reinoud 				sfas_restore_pointers(dev);
   1376      1.1  reinoud 				break;
   1377      1.1  reinoud 			case 0x07:	/* MESSAGE REJECT */
   1378      1.1  reinoud 				/*
   1379      1.1  reinoud 				 * If we had sent a SDTR and we got a message
   1380      1.1  reinoud 				 * reject, the scsi docs say that we must go
   1381      1.1  reinoud 				 * to async transfer.
   1382      1.1  reinoud 				 */
   1383      1.1  reinoud 				if (nexus->flags & SFAS_NF_SDTR_SENT) {
   1384      1.1  reinoud 					nexus->flags &= ~SFAS_NF_SDTR_SENT;
   1385      1.1  reinoud 
   1386      1.1  reinoud 					nexus->config3 &= ~SFAS_CFG3_FASTSCSI;
   1387      1.1  reinoud 					nexus->syncper = 5;
   1388      1.1  reinoud 					nexus->syncoff = 0;
   1389      1.1  reinoud 
   1390      1.1  reinoud 					*rp->sfas_syncper = nexus->syncper;
   1391      1.1  reinoud 					*rp->sfas_syncoff = nexus->syncoff;
   1392      1.1  reinoud 					*rp->sfas_config3 = nexus->config3;
   1393      1.1  reinoud 				} else
   1394      1.1  reinoud 				/*
   1395      1.1  reinoud 				 * Something was rejected but we don't know
   1396      1.1  reinoud 				 * what! PANIC!
   1397      1.1  reinoud 				 */
   1398      1.1  reinoud 				  panic("sfasintr: Unknown message rejected!");
   1399      1.1  reinoud 				break;
   1400      1.1  reinoud 			case 0x08:	/* MO OPERATION */
   1401      1.1  reinoud 				break;
   1402      1.1  reinoud 			case 0x01:	/* EXTENDED MESSAGE */
   1403      1.1  reinoud 				switch(dev->sc_msg_in[2]) {
   1404      1.1  reinoud 				case 0x01:/* SYNC. DATA TRANSFER REQUEST */
   1405      1.1  reinoud 					/* Decode the SDTR message. */
   1406      1.1  reinoud 					period = 4*dev->sc_msg_in[3];
   1407      1.1  reinoud 					offset = dev->sc_msg_in[4];
   1408      1.1  reinoud 
   1409      1.1  reinoud 					/*
   1410      1.1  reinoud 					 * Make sure that the specs are within
   1411      1.1  reinoud 					 * chip limits. Note that if we
   1412      1.1  reinoud 					 * initiated the negotiation the specs
   1413      1.1  reinoud 					 * WILL be withing chip limits. If it
   1414      1.1  reinoud 					 * was the scsi unit that initiated
   1415      1.1  reinoud 					 * the negotiation, the specs may be
   1416      1.1  reinoud 					 * to high.
   1417      1.1  reinoud 					 */
   1418      1.1  reinoud 					if (offset > 16)
   1419      1.1  reinoud 						offset = 16;
   1420      1.1  reinoud 					if ((period < 200) &&
   1421      1.1  reinoud 					    (dev->sc_clock_freq <= 25))
   1422      1.1  reinoud 						period = 200;
   1423      1.1  reinoud 
   1424      1.1  reinoud 					if (offset == 0)
   1425      1.1  reinoud 					       period = 5*dev->sc_clock_period;
   1426      1.1  reinoud 
   1427      1.1  reinoud 					nexus->syncper = period/
   1428      1.1  reinoud 							  dev->sc_clock_period;
   1429      1.1  reinoud 					nexus->syncoff = offset;
   1430      1.1  reinoud 
   1431      1.1  reinoud 					if (period < 200)
   1432      1.1  reinoud 					  nexus->config3 |= SFAS_CFG3_FASTSCSI;
   1433      1.1  reinoud 					else
   1434      1.1  reinoud 					  nexus->config3 &=~SFAS_CFG3_FASTSCSI;
   1435      1.1  reinoud 
   1436      1.1  reinoud 					nexus->flags |= SFAS_NF_SYNC_TESTED;
   1437      1.1  reinoud 
   1438      1.1  reinoud 					*rp->sfas_syncper = nexus->syncper;
   1439      1.1  reinoud 					*rp->sfas_syncoff = nexus->syncoff;
   1440      1.1  reinoud 					*rp->sfas_config3 = nexus->config3;
   1441      1.1  reinoud 
   1442      1.1  reinoud 					/*
   1443      1.1  reinoud 					 * Hmmm, it seems that the scsi unit
   1444      1.1  reinoud 					 * initiated sync negotiation, so lets
   1445      1.1  reinoud 					 * reply acording to scsi-2 standard.
   1446      1.1  reinoud 					 */
   1447      1.1  reinoud 					if (!(nexus->flags& SFAS_NF_SDTR_SENT))
   1448      1.1  reinoud 					{
   1449      1.1  reinoud 					  if ((dev->sc_config_flags &
   1450      1.1  reinoud 					       SFAS_NO_SYNCH) ||
   1451      1.1  reinoud 					      (dev->sc_config_flags &
   1452      1.1  reinoud 					       SFAS_NO_DMA) ||
   1453      1.1  reinoud 					      sfas_inhibit_sync[
   1454      1.1  reinoud 							nexus->lun_unit & 7]) {
   1455      1.1  reinoud 					          period = 200;
   1456      1.1  reinoud 					          offset = 0;
   1457      1.1  reinoud 					  }
   1458      1.1  reinoud 
   1459      1.1  reinoud 					  nexus->offset = offset;
   1460      1.1  reinoud 					  nexus->period = period;
   1461      1.1  reinoud 					  nexus->flags |= SFAS_NF_DO_SDTR;
   1462      1.1  reinoud 					  *rp->sfas_command = SFAS_CMD_SET_ATN;
   1463      1.1  reinoud 					}
   1464      1.1  reinoud 
   1465      1.1  reinoud 					nexus->flags &= ~SFAS_NF_SDTR_SENT;
   1466      1.1  reinoud 					break;
   1467      1.1  reinoud 
   1468      1.1  reinoud 				case 0x00: /* MODIFY DATA POINTERS */
   1469      1.1  reinoud 				case 0x02: /* EXTENDED IDENTIFY (SCSI-1) */
   1470      1.1  reinoud 				case 0x03: /* WIDE DATA TRANSFER REQUEST */
   1471      1.1  reinoud 			        default:
   1472      1.1  reinoud 					/* Reject any unhandeled messages. */
   1473      1.1  reinoud 
   1474      1.1  reinoud 					dev->sc_msg_out[0] = 0x07;
   1475      1.1  reinoud 					dev->sc_msg_out_len = 1;
   1476      1.1  reinoud 					*rp->sfas_command = SFAS_CMD_SET_ATN;
   1477      1.1  reinoud 					cmd = SFAS_CMD_MESSAGE_ACCEPTED;
   1478      1.1  reinoud 					break;
   1479      1.1  reinoud 				}
   1480      1.1  reinoud 				break;
   1481      1.1  reinoud 
   1482      1.1  reinoud 			default:
   1483      1.1  reinoud 				/* Reject any unhandeled messages. */
   1484      1.1  reinoud 
   1485      1.1  reinoud 				dev->sc_msg_out[0] = 0x07;
   1486      1.1  reinoud 				dev->sc_msg_out_len = 1;
   1487      1.1  reinoud 				*rp->sfas_command = SFAS_CMD_SET_ATN;
   1488      1.1  reinoud 				cmd = SFAS_CMD_MESSAGE_ACCEPTED;
   1489      1.1  reinoud 				break;
   1490      1.1  reinoud 			}
   1491      1.1  reinoud 			nexus->flags &= ~SFAS_NF_HAS_MSG;
   1492      1.1  reinoud 			dev->sc_msg_in_len = 0;
   1493      1.1  reinoud 		}
   1494      1.1  reinoud 		break;
   1495      1.1  reinoud 	default:
   1496      1.1  reinoud 		printf("SFASINTR: UNKNOWN PHASE! phase: %d\n",
   1497      1.1  reinoud 		       dev->sc_status & SFAS_STAT_PHASE_MASK);
   1498      1.1  reinoud 		dev->sc_led(dev, 0);
   1499      1.1  reinoud 		sfas_scsidone(dev, nexus->xs, -4);
   1500      1.1  reinoud 
   1501      1.1  reinoud 		return(-1);
   1502      1.1  reinoud 	}
   1503      1.1  reinoud 
   1504      1.1  reinoud 	if (cmd)
   1505      1.1  reinoud 		*rp->sfas_command = cmd;
   1506      1.1  reinoud 
   1507      1.1  reinoud 	return(0);
   1508      1.1  reinoud }
   1509      1.1  reinoud 
   1510      1.1  reinoud /*
   1511      1.1  reinoud  * Stub for interrupt machine.
   1512      1.1  reinoud  */
   1513      1.1  reinoud void
   1514      1.1  reinoud sfasintr(dev)
   1515      1.1  reinoud 	struct sfas_softc *dev;
   1516      1.1  reinoud {
   1517      1.1  reinoud 	sfas_regmap_p	 rp;
   1518      1.1  reinoud 	struct nexus	*nexus;
   1519      1.1  reinoud 
   1520      1.1  reinoud 	rp = dev->sc_fas;
   1521      1.1  reinoud 
   1522      1.1  reinoud 	if (!sfas_pretests(dev, rp)) {
   1523      1.1  reinoud 
   1524      1.1  reinoud 		nexus = dev->sc_cur_nexus;
   1525      1.1  reinoud 		if (nexus == NULL)
   1526      1.1  reinoud 			nexus = dev->sc_sel_nexus;
   1527      1.1  reinoud 
   1528      1.1  reinoud 		if (nexus)
   1529      1.1  reinoud 			if (!sfas_midaction(dev, rp, nexus))
   1530      1.1  reinoud 				sfas_postaction(dev, rp, nexus);
   1531      1.1  reinoud 	}
   1532      1.1  reinoud }
   1533      1.1  reinoud 
   1534      1.1  reinoud /*
   1535      1.1  reinoud  * sfasicmd is used to perform IO when we can't use interrupts. sfasicmd
   1536      1.1  reinoud  * emulates the normal environment by waiting for the chip and calling
   1537      1.1  reinoud  * sfasintr.
   1538      1.1  reinoud  */
   1539      1.1  reinoud void
   1540      1.1  reinoud sfasicmd(dev, pendp)
   1541      1.1  reinoud 	struct sfas_softc   *dev;
   1542      1.1  reinoud 	struct sfas_pending *pendp;
   1543      1.1  reinoud {
   1544      1.1  reinoud 	sfas_regmap_p	 rp;
   1545      1.1  reinoud 	struct nexus	*nexus;
   1546      1.1  reinoud 
   1547      1.1  reinoud 	nexus = &dev->sc_nexus[pendp->xs->xs_periph->periph_target];
   1548      1.1  reinoud 	rp = dev->sc_fas;
   1549      1.1  reinoud 
   1550      1.1  reinoud 	if (!sfasselect(dev, pendp, (char *)pendp->xs->cmd, pendp->xs->cmdlen,
   1551      1.1  reinoud 			(char *)pendp->xs->data, pendp->xs->datalen,
   1552      1.1  reinoud 			SFAS_SELECT_I))
   1553      1.1  reinoud 		panic("sfasicmd: Couldn't select unit");
   1554      1.1  reinoud 
   1555      1.1  reinoud 	while(nexus->state != SFAS_NS_FINISHED) {
   1556      1.1  reinoud 		sfasiwait(dev);
   1557      1.1  reinoud 		sfasintr(dev);
   1558      1.1  reinoud 	}
   1559      1.1  reinoud 
   1560      1.1  reinoud 	nexus->flags &= ~SFAS_NF_SYNC_TESTED;
   1561      1.1  reinoud }
   1562      1.1  reinoud 
   1563      1.1  reinoud 
   1564      1.1  reinoud #ifdef SFAS_DEBUG
   1565      1.1  reinoud 
   1566      1.1  reinoud void
   1567      1.1  reinoud dump_nexus(nexus)
   1568      1.1  reinoud 	struct nexus *nexus;
   1569      1.1  reinoud {
   1570      1.1  reinoud 	int loop;
   1571      1.1  reinoud 
   1572      1.1  reinoud 	printf("nexus=%08x\n", (u_int)nexus);
   1573      1.1  reinoud 	printf("scsi_fer=%08x\n", (u_int)nexus->xs);
   1574      1.1  reinoud 	printf("ID=%02x\n", nexus->ID);
   1575      1.1  reinoud 	printf("clen=%02x\n", nexus->clen);
   1576      1.1  reinoud 	printf("cbuf=");
   1577      1.1  reinoud 	for (loop = 0; loop< 14; ++loop)
   1578      1.1  reinoud 		printf(" %02x\n", nexus->cbuf[loop]);
   1579      1.1  reinoud 	printf("\n");
   1580      1.1  reinoud 	printf("dma:\n");
   1581      1.1  reinoud 	for (loop = 0; loop < MAXCHAIN; ++loop)
   1582      1.1  reinoud 		printf("dma_chain: %08x %04x %04x\n", nexus->dma[loop].ptr,
   1583      1.1  reinoud 		    nexus->dma[loop].len, nexus->dma[loop].flg);
   1584      1.1  reinoud 	printf("\n");
   1585      1.1  reinoud 
   1586      1.1  reinoud 	printf("max_link=%d\n", nexus->max_link);
   1587      1.1  reinoud 	printf("cur_link=%d\n", nexus->cur_link);
   1588      1.1  reinoud 
   1589      1.1  reinoud 	printf("buf=%08x\n", (u_int)nexus->buf);
   1590      1.1  reinoud 	printf("len=%08x\n", nexus->len);
   1591      1.1  reinoud 	printf("dma_buf=%08x\n", (u_int)nexus->dma_buf);
   1592      1.1  reinoud 	printf("dma_len=%08x\n", nexus->dma_len);
   1593      1.1  reinoud 	printf("dma_blk_ptr=%08x\n", (u_int)nexus->dma_blk_ptr);
   1594      1.1  reinoud 	printf("dma_blk_len=%08x\n", nexus->dma_blk_len);
   1595      1.1  reinoud 	printf("dma_blk_flag=%08x\n", nexus->dma_blk_flg);
   1596      1.1  reinoud 	printf("state=%02x\n", nexus->state);
   1597      1.1  reinoud 	printf("flags=%04x\n", nexus->flags);
   1598      1.1  reinoud 	printf("period=%d\n", nexus->period);
   1599      1.1  reinoud 	printf("offset=%d\n", nexus->offset);
   1600      1.1  reinoud 	printf("syncper=%d\n", nexus->syncper);
   1601      1.1  reinoud 	printf("syncoff=%d\n", nexus->syncoff);
   1602      1.1  reinoud 	printf("config3=%02x\n", nexus->config3);
   1603      1.1  reinoud 	printf("lun_unit=%d\n", nexus->lun_unit);
   1604      1.1  reinoud 	printf("status=%02x\n", nexus->status);
   1605      1.1  reinoud 	printf("\n");
   1606      1.1  reinoud }
   1607      1.1  reinoud 
   1608      1.1  reinoud void
   1609      1.1  reinoud dump_nexii(sc)
   1610      1.1  reinoud 	struct sfas_softc *sc;
   1611      1.1  reinoud {
   1612      1.1  reinoud 	int loop;
   1613      1.1  reinoud 
   1614      1.1  reinoud 	for (loop = 0; loop < 8; ++loop) {
   1615      1.1  reinoud 		dump_nexus(&sc->sc_nexus[loop]);
   1616      1.1  reinoud 	}
   1617      1.1  reinoud }
   1618      1.1  reinoud 
   1619      1.1  reinoud void
   1620      1.1  reinoud dump_sfassoftc(sc)
   1621      1.1  reinoud 	struct sfas_softc *sc;
   1622      1.1  reinoud {
   1623      1.1  reinoud 	printf("sfassoftc @ 0x%08x\n", (u_int)sc);
   1624      1.1  reinoud 	printf("clock_freq = %d\n", sc->sc_clock_freq);
   1625      1.1  reinoud 	printf("timeout = %d\n", sc->sc_timeout);
   1626      1.1  reinoud 	printf("host_id = %d\n", sc->sc_host_id);
   1627      1.1  reinoud 	printf("config_flags = 0x%08x\n", sc->sc_config_flags);
   1628      1.1  reinoud 	printf("led_status = %d\n", sc->sc_led_status);
   1629      1.1  reinoud 
   1630      1.1  reinoud 	dump_nexii(sc);
   1631      1.1  reinoud 	printf("cur_nexus = 0x%08x\n", (u_int)sc->sc_cur_nexus);
   1632      1.1  reinoud 	printf("sel_nexus = 0x%08x\n", (u_int)sc->sc_sel_nexus);
   1633      1.1  reinoud 	printf("\n");
   1634      1.1  reinoud }
   1635      1.1  reinoud 
   1636      1.1  reinoud #endif	/* SFAS_DEBUG */
   1637