xref: /netbsd-src/sys/arch/mvme68k/dev/sbic.c (revision 8b0f9554ff8762542c4defc4f70e1eb76fb508fa)
1 /*	$NetBSD: sbic.c,v 1.31 2007/10/17 19:55:47 garbled Exp $	*/
2 
3 /*
4  * Copyright (c) 1990 The Regents of the University of California.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to Berkeley by
8  * Van Jacobson of Lawrence Berkeley Laboratory.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  * 3. Neither the name of the University nor the names of its contributors
19  *    may be used to endorse or promote products derived from this software
20  *    without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32  * SUCH DAMAGE.
33  *
34  *  @(#)scsi.c  7.5 (Berkeley) 5/4/91
35  */
36 
37 /*
38  * Changes Copyright (c) 1996 Steve Woodford
39  * Original Copyright (c) 1994 Christian E. Hopps
40  *
41  * This code is derived from software contributed to Berkeley by
42  * Van Jacobson of Lawrence Berkeley Laboratory.
43  *
44  * Redistribution and use in source and binary forms, with or without
45  * modification, are permitted provided that the following conditions
46  * are met:
47  * 1. Redistributions of source code must retain the above copyright
48  *    notice, this list of conditions and the following disclaimer.
49  * 2. Redistributions in binary form must reproduce the above copyright
50  *    notice, this list of conditions and the following disclaimer in the
51  *    documentation and/or other materials provided with the distribution.
52  * 3. All advertising materials mentioning features or use of this software
53  *    must display the following acknowledgement:
54  *  This product includes software developed by the University of
55  *  California, Berkeley and its contributors.
56  * 4. Neither the name of the University nor the names of its contributors
57  *    may be used to endorse or promote products derived from this software
58  *    without specific prior written permission.
59  *
60  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
61  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
62  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
63  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
64  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
65  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
66  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
67  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
68  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
69  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
70  * SUCH DAMAGE.
71  *
72  *  @(#)scsi.c  7.5 (Berkeley) 5/4/91
73  */
74 
75 /*
76  * Steve Woodford (SCW), Apr, 1996
77  * MVME147S WD33C93 Scsi Bus Interface Controller driver,
78  *
79  * Basically a de-loused and tidied up version of the Amiga AMD 33C93 driver.
80  *
81  * The original driver used features which required at least a WD33C93A
82  * chip. The '147 has the original WD33C93 chip (no 'A' suffix).
83  *
84  * This version of the driver is pretty well generic, so should work with
85  * any flavour of WD33C93 chip.
86  */
87 
88 #include <sys/cdefs.h>
89 __KERNEL_RCSID(0, "$NetBSD: sbic.c,v 1.31 2007/10/17 19:55:47 garbled Exp $");
90 
91 #include "opt_ddb.h"
92 
93 #include <sys/param.h>
94 #include <sys/systm.h>
95 #include <sys/device.h>
96 #include <sys/kernel.h> /* For hz */
97 #include <sys/disklabel.h>
98 #include <sys/buf.h>
99 
100 #include <dev/scsipi/scsi_all.h>
101 #include <dev/scsipi/scsipi_all.h>
102 #include <dev/scsipi/scsiconf.h>
103 
104 #include <uvm/uvm_extern.h>
105 
106 #include <mvme68k/mvme68k/isr.h>
107 #include <mvme68k/dev/dmavar.h>
108 #include <mvme68k/dev/sbicreg.h>
109 #include <mvme68k/dev/sbicvar.h>
110 
111 
112 /*
113  * Since I can't find this in any other header files
114  */
115 #define SCSI_PHASE(reg) (reg&0x07)
116 
117 /*
118  * SCSI delays
119  * In u-seconds, primarily for state changes on the SPC.
120  */
121 #define SBIC_CMD_WAIT   50000   /* wait per step of 'immediate' cmds */
122 #define SBIC_DATA_WAIT  50000   /* wait per data in/out step */
123 #define SBIC_INIT_WAIT  50000   /* wait per step (both) during init */
124 
125 /*
126  * Convenience macro for waiting for a particular sbic event
127  */
128 #define SBIC_WAIT(regs, until, timeo) sbicwait(regs, until, timeo, __LINE__)
129 
130 int     sbicicmd            __P((struct sbic_softc *, void *, int, void *, int));
131 int     sbicgo              __P((struct sbic_softc *, struct scsipi_xfer *));
132 int     sbicdmaok           __P((struct sbic_softc *, struct scsipi_xfer *));
133 int     sbicwait            __P((sbic_regmap_p, u_char, int , int));
134 int     sbiccheckdmap       __P((void *, u_long, u_long));
135 u_char  sbicselectbus       __P((struct sbic_softc *));
136 int     sbicxfout           __P((sbic_regmap_p, int, void *));
137 int     sbicxfin            __P((sbic_regmap_p, int, void *));
138 int     sbicfromscsiperiod  __P((struct sbic_softc *, int));
139 int     sbictoscsiperiod    __P((struct sbic_softc *, int));
140 int     sbicpoll            __P((struct sbic_softc *));
141 int     sbicnextstate       __P((struct sbic_softc *, u_char, u_char));
142 int     sbicmsgin           __P((struct sbic_softc *));
143 int     sbicabort           __P((struct sbic_softc *, const char *));
144 void    sbicxfdone          __P((struct sbic_softc *));
145 void    sbicerror           __P((struct sbic_softc *,u_char));
146 void    sbicreset           __P((struct sbic_softc *));
147 void    sbic_scsidone       __P((struct sbic_acb *, int));
148 void    sbic_sched          __P((struct sbic_softc *));
149 void    sbic_save_ptrs      __P((struct sbic_softc *));
150 void    sbic_load_ptrs      __P((struct sbic_softc *));
151 
152 /*
153  * Synch xfer parameters, and timing conversions
154  */
155 int     sbic_min_period = SBIC_SYN_MIN_PERIOD;  /* in cycles = f(ICLK,FSn) */
156 int     sbic_max_offset = SBIC_SYN_MAX_OFFSET;  /* pure number */
157 int     sbic_cmd_wait   = SBIC_CMD_WAIT;
158 int     sbic_data_wait  = SBIC_DATA_WAIT;
159 int     sbic_init_wait  = SBIC_INIT_WAIT;
160 
161 /*
162  * was broken before.. now if you want this you get it for all drives
163  * on sbic controllers.
164  */
165 u_char  sbic_inhibit_sync[8];
166 int     sbic_enable_reselect     = 1;   /* Allow Disconnect / Reselect */
167 int     sbic_no_dma              = 0;   /* Use PIO transfers instead of DMA */
168 int     sbic_parallel_operations = 1;   /* Allow command queues */
169 
170 /*
171  * Some useful stuff for debugging purposes
172  */
173 #ifdef DEBUG
174 int     sbicdma_ops     = 0;    /* total DMA operations */
175 int     sbicdma_hits    = 0;    /* number of DMA chains that were contiguous */
176 int     sbicdma_misses  = 0;    /* number of DMA chains that were not contiguous */
177 int     sbicdma_saves   = 0;
178 
179 #define QPRINTF(a) if (sbic_debug > 1) printf a
180 
181 int     sbic_debug      = 0;    /* Debug all chip related things */
182 int     sync_debug      = 0;    /* Debug all Synchronous Scsi related things */
183 int     reselect_debug  = 0;    /* Debug all reselection related things */
184 int     data_pointer_debug = 0; /* Debug Data Pointer related things */
185 
186 void    sbictimeout __P((struct sbic_softc *dev));
187 
188 #else
189 #define QPRINTF(a)  /* */
190 #endif
191 
192 
193 /*
194  * default minphys routine for sbic based controllers
195  */
196 void
197 sbic_minphys(bp)
198     struct buf *bp;
199 {
200     /*
201      * No max transfer at this level.
202      */
203     minphys(bp);
204 }
205 
206 
207 /*
208  * Save DMA pointers.  Take into account partial transfer. Shut down DMA.
209  */
210 void
211 sbic_save_ptrs(dev)
212     struct sbic_softc   *dev;
213 {
214     sbic_regmap_p       regs;
215     struct sbic_acb*    acb;
216     int                 count,
217                         asr,
218                         s;
219 
220     /*
221      * Only need to save pointers if DMA was active...
222      */
223     if ( dev->sc_cur == NULL || (dev->sc_flags & SBICF_INDMA) == 0 )
224         return;
225 
226     regs = dev->sc_sbicp;
227 
228     s = splbio();
229 
230     /*
231      * Wait until WD chip is idle
232      */
233     do {
234         GET_SBIC_asr(regs, asr);
235         if( asr & SBIC_ASR_DBR ) {
236             printf("sbic_save_ptrs: asr %02x canceled!\n", asr);
237             splx(s);
238             return;
239         }
240     } while( asr & (SBIC_ASR_BSY|SBIC_ASR_CIP) );
241 
242 
243     /*
244      * Save important state.
245      * must be done before dmastop
246      */
247     acb            = dev->sc_nexus;
248     acb->sc_dmacmd = dev->sc_dmacmd;
249 
250     /*
251      * Fetch the residual count
252      */
253     SBIC_TC_GET(regs, count);
254 
255     /*
256      * Shut down DMA
257      */
258     dev->sc_dmastop(dev);
259 
260     /*
261      * No longer in DMA
262      */
263     dev->sc_flags &= ~SBICF_INDMA;
264 
265     /*
266      * Ensure the WD chip is back in polled I/O mode, with nothing to
267      * transfer.
268      */
269     SBIC_TC_PUT(regs, 0);
270     SET_SBIC_control(regs, SBIC_CTL_EDI | SBIC_CTL_IDI);
271 
272     /*
273      * Update current count...
274      */
275     acb->sc_tcnt = count;
276 
277     /*
278      * Work out how many bytes were actually transferred
279      */
280     count        = dev->sc_tcnt - count;
281     dev->sc_tcnt = acb->sc_tcnt;
282 
283     /*
284      * Fixup partial xfers
285      */
286     acb->sc_kv.dc_addr  += count;
287     acb->sc_kv.dc_count -= count;
288     acb->sc_pa.dc_addr  += count;
289     acb->sc_pa.dc_count -= count >> 1;
290 
291 #ifdef DEBUG
292     if ( data_pointer_debug )
293         printf("save at (%p,%x):%x\n",
294                dev->sc_cur->dc_addr, dev->sc_cur->dc_count,count);
295     sbicdma_saves++;
296 #endif
297 
298     splx(s);
299 }
300 
301 
302 /*
303  * DOES NOT RESTART DMA!!!
304  */
305 void
306 sbic_load_ptrs(dev)
307     struct sbic_softc   *dev;
308 {
309     struct sbic_acb *acb = dev->sc_nexus;
310     int             s;
311 
312     if ( acb->sc_kv.dc_count == 0 ) {
313         /*
314          * No data to xfer
315          */
316         return;
317     }
318 
319     s = splbio();
320 
321     /*
322      * Reset the Scatter-Gather chain
323      */
324     dev->sc_last = dev->sc_cur = &acb->sc_pa;
325 
326     /*
327      * Restore the Transfer Count and DMA specific data
328      */
329     dev->sc_tcnt   = acb->sc_tcnt;
330     dev->sc_dmacmd = acb->sc_dmacmd;
331 
332 #ifdef DEBUG
333     sbicdma_ops++;
334 #endif
335 
336     /*
337      * Need to fixup new segment?
338      */
339     if ( dev->sc_tcnt == 0 ) {
340         /*
341          * sc_tcnt == 0 implies end of segment
342          */
343         char    *vaddr, *paddr;
344         int     count;
345 
346         /*
347          * do kvm to pa mappings
348          */
349         vaddr = acb->sc_kv.dc_addr;
350         paddr = acb->sc_pa.dc_addr = (char *) kvtop((void *)vaddr);
351 
352         for (count = (PAGE_SIZE - ((int)vaddr & PGOFSET));
353              count < acb->sc_kv.dc_count &&
354              (char*)kvtop((void *)(vaddr + count + 4)) == paddr + count + 4;
355              count += PAGE_SIZE)
356             ;   /* Do nothing */
357 
358         /*
359          * If it's all contiguous...
360          */
361         if ( count > acb->sc_kv.dc_count ) {
362             count = acb->sc_kv.dc_count;
363 #ifdef  DEBUG
364             sbicdma_hits++;
365 #endif
366         }
367 #ifdef  DEBUG
368         else
369             sbicdma_misses++;
370 #endif
371 
372         acb->sc_tcnt        = count;
373         acb->sc_pa.dc_count = count >> 1;
374 
375 #ifdef DEBUG
376         if ( data_pointer_debug )
377             printf("DMA recalc:kv(%p,%x)pa(%p,%lx)\n", acb->sc_kv.dc_addr,
378                                                       acb->sc_kv.dc_count,
379                                                       acb->sc_pa.dc_addr,
380                                                       acb->sc_tcnt);
381 #endif
382 
383     }
384 
385     splx(s);
386 }
387 
388 /*
389  * used by specific sbic controller
390  *
391  * it appears that the higher level code does nothing with LUN's
392  * so I will too.  I could plug it in, however so could they
393  * in scsi_scsipi_cmd().
394  */
395 void
396 sbic_scsi_request(chan, req, arg)
397 	struct scsipi_channel *chan;
398 	scsipi_adapter_req_t req;
399 	void *arg;
400 {
401     struct scsipi_xfer *xs;
402     struct scsipi_periph *periph;
403     struct sbic_softc   *dev = (void *)chan->chan_adapter->adapt_dev;
404     struct sbic_acb     *acb;
405     int                 flags, s;
406 
407     switch (req) {
408     case ADAPTER_REQ_RUN_XFER:
409 	xs = arg;
410 	periph = xs->xs_periph;
411         flags = xs->xs_control;
412 
413         if ( flags & XS_CTL_DATA_UIO )
414             panic("sbic: scsi data uio requested");
415 
416         if ( dev->sc_nexus && (flags & XS_CTL_POLL) )
417             panic("sbic_scsicmd: busy");
418 
419         s = splbio();
420 
421         if ( (acb = dev->free_list.tqh_first) != NULL )
422             TAILQ_REMOVE(&dev->free_list, acb, chain);
423 
424         splx(s);
425 
426         if ( acb == NULL ) {
427 #ifdef DEBUG
428             printf("sbic_scsicmd: unable to queue request for target %d\n",
429                 periph->periph_target);
430 #ifdef DDB
431             Debugger();
432 #endif
433 #endif
434             xs->error = XS_RESOURCE_SHORTAGE;
435 	    scsipi_done(xs);
436             return;
437         }
438 
439         if ( flags & XS_CTL_DATA_IN )
440             acb->flags = ACB_ACTIVE | ACB_DATAIN;
441         else
442             acb->flags = ACB_ACTIVE;
443 
444         acb->xs             = xs;
445         acb->clen           = xs->cmdlen;
446         acb->sc_kv.dc_addr  = xs->data;
447         acb->sc_kv.dc_count = xs->datalen;
448         acb->pa_addr        = xs->data ? (char *)kvtop((void *)xs->data) : 0;
449         memcpy(&acb->cmd, xs->cmd, xs->cmdlen);
450 
451         if ( flags & XS_CTL_POLL ) {
452             /*
453              * This has major side effects -- it locks up the machine
454              */
455             int stat;
456 
457             s = splbio();
458 
459             dev->sc_flags |= SBICF_ICMD;
460 
461             do {
462                 /*
463                  * If we already had a nexus, while away the time until idle...
464                  * This is likely only to happen if a reselection occurs between
465                  * here and our earlier check for ICMD && sc_nexus (which would
466                  * have resulted in a panic() had it been true).
467                  */
468                 while ( dev->sc_nexus )
469                     sbicpoll(dev);
470 
471                 /*
472                  * Fix up the new nexus
473                  */
474                 dev->sc_nexus   = acb;
475                 dev->sc_xs      = xs;
476                 dev->target     = periph->periph_target;
477                 dev->lun        = periph->periph_lun;
478 
479                 stat = sbicicmd(dev, &acb->cmd, acb->clen,
480                                 acb->sc_kv.dc_addr, acb->sc_kv.dc_count);
481 
482             } while ( dev->sc_nexus != acb );
483 
484             sbic_scsidone(acb, stat);
485 
486             splx(s);
487 
488             return;
489         }
490 
491         s = splbio();
492         TAILQ_INSERT_TAIL(&dev->ready_list, acb, chain);
493 
494         /*
495          * If nothing is active, try to start it now.
496          */
497         if ( dev->sc_nexus == NULL )
498             sbic_sched(dev);
499 
500         splx(s);
501 
502         return;
503 
504     case ADAPTER_REQ_GROW_RESOURCES:
505 	/* XXX Not supported. */
506 	return;
507 
508     case ADAPTER_REQ_SET_XFER_MODE:
509 	/* XXX Not supported. */
510 	return;
511     }
512 
513 }
514 
515 /*
516  * attempt to start the next available command
517  */
518 void
519 sbic_sched(dev)
520     struct sbic_softc *dev;
521 {
522     struct scsipi_xfer    *xs;
523     struct scsipi_periph  *periph = NULL;    /* Gag the compiler */
524     struct sbic_acb     *acb;
525     int                 flags,
526                         stat;
527 
528     /*
529      * XXXSCW
530      * I'll keep this test here, even though I can't see any obvious way
531      * in which sbic_sched() could be called with sc_nexus non NULL
532      */
533     if ( dev->sc_nexus )
534         return;         /* a command is current active */
535 
536     /*
537      * Loop through the ready list looking for work to do...
538      */
539     for (acb = dev->ready_list.tqh_first; acb; acb = acb->chain.tqe_next) {
540         int     i, j;
541 
542         periph = acb->xs->xs_periph;
543         i   = periph->periph_target;
544         j   = 1 << periph->periph_lun;
545 
546         /*
547          * We've found a potential command, but is the target/lun busy?
548          */
549         if ( (dev->sc_tinfo[i].lubusy & j) == 0 ) {
550             /*
551              * Nope, it's not busy, so we can use it.
552              */
553             dev->sc_tinfo[i].lubusy |= j;
554             TAILQ_REMOVE(&dev->ready_list, acb, chain);
555             dev->sc_nexus = acb;
556             acb->sc_pa.dc_addr = acb->pa_addr;  /* XXXX check */
557             break;
558         }
559     }
560 
561     if ( acb == NULL ) {
562         QPRINTF(("sbicsched: no work\n"));
563         return;         /* did not find an available command */
564     }
565 
566 #ifdef DEBUG
567     if ( data_pointer_debug > 1 )
568         printf("sbic_sched(%d,%d)\n", periph->periph_target,
569 			periph->periph_lun);
570 #endif
571 
572     dev->sc_xs = xs = acb->xs;
573     flags      = xs->xs_control;
574 
575     if ( flags & XS_CTL_RESET )
576         sbicreset(dev);
577 
578     dev->sc_stat[0] = -1;
579     dev->target     = periph->periph_target;
580     dev->lun        = periph->periph_lun;
581 
582     if ( flags & XS_CTL_POLL || (!sbic_parallel_operations &&
583                               (sbicdmaok(dev, xs) == 0)) )
584         stat = sbicicmd(dev, &acb->cmd, acb->clen,
585                         acb->sc_kv.dc_addr, acb->sc_kv.dc_count);
586     else
587     if ( sbicgo(dev, xs) == 0 && xs->error != XS_SELTIMEOUT )
588         return;
589     else
590         stat = dev->sc_stat[0];
591 
592     sbic_scsidone(acb, stat);
593 }
594 
595 void
596 sbic_scsidone(acb, stat)
597     struct sbic_acb *acb;
598     int             stat;
599 {
600     struct scsipi_xfer    *xs  = acb->xs;
601     struct scsipi_periph  *periph = xs->xs_periph;
602     struct sbic_softc   *dev = (void *)periph->periph_channel->chan_adapter->adapt_dev;
603     int                 dosched = 0;
604 
605 #ifdef DIAGNOSTIC
606     if ( acb == NULL || xs == NULL ) {
607         printf("sbic_scsidone -- (%d,%d) no scsipi_xfer\n", dev->target, dev->lun);
608 #ifdef DDB
609         Debugger();
610 #endif
611         return;
612     }
613 #endif
614 
615 
616 #ifdef DEBUG
617     if ( data_pointer_debug > 1 )
618         printf("scsidone: (%d,%d)->(%d,%d)%02x\n", periph->periph_target,
619 			periph->periph_lun,
620                                                    dev->target, dev->lun, stat);
621 
622     if ( xs->xs_periph->periph_target == dev->sc_channel.chan_id)
623         panic("target == hostid");
624 #endif
625 
626     xs->status = stat;
627     xs->resid = 0;      /* XXXX */
628     if ( xs->error == XS_NOERROR) {
629         if ( stat == SCSI_CHECK || stat == SCSI_BUSY)
630             xs->error = XS_BUSY;
631     }
632 
633 
634     /*
635      * Remove the ACB from whatever queue it's on.  We have to do a bit of
636      * a hack to figure out which queue it's on.  Note that it is *not*
637      * necessary to cdr down the ready queue, but we must cdr down the
638      * nexus queue and see if it's there, so we can mark the unit as no
639      * longer busy.  This code is sickening, but it works.
640      */
641     if ( acb == dev->sc_nexus ) {
642 
643         dev->sc_nexus = NULL;
644         dev->sc_xs    = NULL;
645 
646         dev->sc_tinfo[periph->periph_target].lubusy &=
647 			~(1 << periph->periph_lun);
648 
649         if ( dev->ready_list.tqh_first )
650             dosched = 1;    /* start next command */
651 
652     } else
653     if ( dev->ready_list.tqh_last == &acb->chain.tqe_next ) {
654 
655         TAILQ_REMOVE(&dev->ready_list, acb, chain);
656 
657     } else {
658 
659         struct sbic_acb *a;
660 
661         for (a = dev->nexus_list.tqh_first; a; a = a->chain.tqe_next) {
662             if ( a == acb ) {
663                 TAILQ_REMOVE(&dev->nexus_list, acb, chain);
664                 dev->sc_tinfo[periph->periph_target].lubusy &=
665 					~(1 << periph->periph_lun);
666                 break;
667             }
668         }
669 
670         if ( a )
671             ;
672         else if ( acb->chain.tqe_next ) {
673             TAILQ_REMOVE(&dev->ready_list, acb, chain);
674         } else {
675             printf("%s: can't find matching acb\n", dev->sc_dev.dv_xname);
676 #ifdef DDB
677             Debugger();
678 #endif
679         }
680     }
681 
682     /*
683      * Put it on the free list.
684      */
685     acb->flags = ACB_FREE;
686     TAILQ_INSERT_HEAD(&dev->free_list, acb, chain);
687 
688     dev->sc_tinfo[periph->periph_target].cmds++;
689 
690     scsipi_done(xs);
691 
692     if ( dosched )
693         sbic_sched(dev);
694 }
695 
696 int
697 sbicdmaok(dev, xs)
698     struct sbic_softc   *dev;
699     struct scsipi_xfer    *xs;
700 {
701     if ( sbic_no_dma || xs->datalen == 0 ||
702     	 xs->datalen & 0x03 || (int)xs->data & 0x03)
703         return(0);
704 
705     /*
706      * controller supports DMA to any addresses?
707      */
708     if ( (dev->sc_flags & SBICF_BADDMA) == 0 )
709         return(1);
710 
711     /*
712      * this address is ok for DMA?
713      */
714     if ( sbiccheckdmap(xs->data, xs->datalen, dev->sc_dmamask) == 0 )
715         return(1);
716 
717     return(0);
718 }
719 
720 int
721 sbicwait(regs, until, timeo, line)
722     sbic_regmap_p   regs;
723     u_char          until;
724     int             timeo;
725     int             line;
726 {
727     u_char  val;
728 
729     if ( timeo == 0 )
730         timeo = 1000000;    /* some large value.. */
731 
732     GET_SBIC_asr(regs, val);
733 
734     while ( (val & until) == 0 ) {
735 
736         if ( timeo-- == 0 ) {
737             int csr;
738             GET_SBIC_csr(regs, csr);
739             printf("sbicwait TIMEO @%d with asr=x%x csr=x%x\n", line, val, csr);
740 #if defined(DDB) && defined(DEBUG)
741             Debugger();
742 #endif
743             return(val); /* Maybe I should abort */
744             break;
745         }
746 
747         DELAY(1);
748         GET_SBIC_asr(regs, val);
749     }
750 
751     return(val);
752 }
753 
754 int
755 sbicabort(dev, where)
756     struct sbic_softc   *dev;
757     const char          *where;
758 {
759     sbic_regmap_p   regs = dev->sc_sbicp;
760     u_char          csr,
761                     asr;
762 
763     GET_SBIC_asr(regs, asr);
764     GET_SBIC_csr(regs, csr);
765 
766     printf ("%s: abort %s: csr = 0x%02x, asr = 0x%02x\n",
767             dev->sc_dev.dv_xname, where, csr, asr);
768 
769     /*
770      * Clean up chip itself
771      */
772     if ( dev->sc_flags & SBICF_SELECTED ) {
773 
774         while ( asr & SBIC_ASR_DBR ) {
775             /*
776              * sbic is jammed w/data. need to clear it
777              * But we don't know what direction it needs to go
778              */
779             GET_SBIC_data(regs, asr);
780             printf("%s: abort %s: clearing data buffer 0x%02x\n",
781                    dev->sc_dev.dv_xname, where, asr);
782             GET_SBIC_asr(regs, asr);
783             if ( asr & SBIC_ASR_DBR ) /* Not the read direction, then */
784                 SET_SBIC_data(regs, asr);
785             GET_SBIC_asr(regs, asr);
786         }
787 
788         WAIT_CIP(regs);
789 
790         printf("%s: sbicabort - sending ABORT command\n", dev->sc_dev.dv_xname);
791         SET_SBIC_cmd(regs, SBIC_CMD_ABORT);
792         WAIT_CIP(regs);
793 
794         GET_SBIC_asr(regs, asr);
795 
796         if ( asr & (SBIC_ASR_BSY|SBIC_ASR_LCI) ) {
797             /*
798              * ok, get more drastic..
799              */
800             printf("%s: sbicabort - asr %x, trying to reset\n",
801                     dev->sc_dev.dv_xname, asr);
802             sbicreset(dev);
803             dev->sc_flags &= ~SBICF_SELECTED;
804             return SBIC_STATE_ERROR;
805         }
806 
807         printf("%s: sbicabort - sending DISC command\n", dev->sc_dev.dv_xname);
808         SET_SBIC_cmd(regs, SBIC_CMD_DISC);
809 
810         do {
811             SBIC_WAIT (regs, SBIC_ASR_INT, 0);
812             GET_SBIC_asr(regs, asr);
813             GET_SBIC_csr (regs, csr);
814             QPRINTF(("csr: 0x%02x, asr: 0x%02x\n", csr, asr));
815         } while ( (csr != SBIC_CSR_DISC) && (csr != SBIC_CSR_DISC_1) &&
816                   (csr != SBIC_CSR_CMD_INVALID) );
817 
818         /*
819          * lets just hope it worked..
820          */
821         dev->sc_flags &= ~SBICF_SELECTED;
822     }
823 
824     return SBIC_STATE_ERROR;
825 }
826 
827 
828 /*
829  * Initialize driver-private structures
830  */
831 void
832 sbicinit(dev)
833     struct sbic_softc *dev;
834 {
835     u_int   i;
836 
837     if ( (dev->sc_flags & SBICF_ALIVE) == 0 ) {
838 
839         struct sbic_acb *acb;
840 
841         TAILQ_INIT(&dev->ready_list);
842         TAILQ_INIT(&dev->nexus_list);
843         TAILQ_INIT(&dev->free_list);
844 	callout_init(&dev->sc_timo_ch, 0);
845 
846         dev->sc_nexus = NULL;
847         dev->sc_xs    = NULL;
848 
849         acb = dev->sc_acb;
850         memset(acb, 0, sizeof(dev->sc_acb));
851 
852         for (i = 0; i < sizeof(dev->sc_acb) / sizeof(*acb); i++) {
853             TAILQ_INSERT_TAIL(&dev->free_list, acb, chain);
854             acb++;
855         }
856 
857         memset(dev->sc_tinfo, 0, sizeof(dev->sc_tinfo));
858 
859 #ifdef DEBUG
860         /*
861          * make sure timeout is really not needed
862          */
863 	callout_reset(&dev->sc_timo_ch, 30 * hz, (void *)sbictimeout, dev);
864 #endif
865 
866     } else
867         panic("sbic: reinitializing driver!");
868 
869     dev->sc_flags |=  SBICF_ALIVE;
870     dev->sc_flags &= ~SBICF_SELECTED;
871 
872     /*
873      * initialize inhibit array
874 	 * Never enable Sync, since it just doesn't work on mvme147 :(
875      */
876     for (i = 0; i < 8; ++i)
877         sbic_inhibit_sync[i] = 1;
878 
879     sbicreset(dev);
880 }
881 
882 void
883 sbicreset(dev)
884     struct sbic_softc *dev;
885 {
886     sbic_regmap_p   regs = dev->sc_sbicp;
887     u_int           my_id,
888                     s;
889     u_char          csr;
890 
891     s = splbio();
892 
893     my_id = dev->sc_channel.chan_id & SBIC_ID_MASK;
894 
895     if (dev->sc_clkfreq < 110)
896         my_id |= SBIC_ID_FS_8_10;
897     else if (dev->sc_clkfreq < 160)
898         my_id |= SBIC_ID_FS_12_15;
899     else if (dev->sc_clkfreq < 210)
900         my_id |= SBIC_ID_FS_16_20;
901 
902     SET_SBIC_myid(regs, my_id);
903 
904     /*
905      * Reset the chip
906      */
907     SET_SBIC_cmd(regs, SBIC_CMD_RESET);
908     DELAY(25);
909 
910     SBIC_WAIT(regs, SBIC_ASR_INT, 0);
911     GET_SBIC_csr(regs, csr);       /* clears interrupt also */
912 
913     /*
914      * Set up various chip parameters
915      */
916     SET_SBIC_control(regs, SBIC_CTL_EDI | SBIC_CTL_IDI);
917 
918     /*
919      * don't allow Selection (SBIC_RID_ES)
920      * until we can handle target mode!!
921      */
922     SET_SBIC_rselid(regs, SBIC_RID_ER);
923 
924     /*
925      * Asynchronous for now
926      */
927     SET_SBIC_syn(regs, 0);
928 
929     /*
930      * Anything else was zeroed by reset
931      */
932     splx(s);
933 
934     dev->sc_flags &= ~SBICF_SELECTED;
935 }
936 
937 void
938 sbicerror(dev, csr)
939     struct sbic_softc   *dev;
940     u_char              csr;
941 {
942     struct scsipi_xfer    *xs  = dev->sc_xs;
943 
944 #ifdef DIAGNOSTIC
945     if ( xs == NULL )
946         panic("sbicerror: dev->sc_xs == NULL");
947 #endif
948 
949     if ( xs->xs_control & XS_CTL_SILENT )
950         return;
951 
952     printf("%s: csr == 0x%02x\n", dev->sc_dev.dv_xname, csr);
953 }
954 
955 /*
956  * select the bus, return when selected or error.
957  *
958  * Returns the current CSR following selection and optionally MSG out phase.
959  * i.e. the returned CSR *should* indicate CMD phase...
960  * If the return value is 0, some error happened.
961  */
962 u_char
963 sbicselectbus(dev)
964     struct sbic_softc   *dev;
965 {
966     sbic_regmap_p   regs   = dev->sc_sbicp;
967     u_char          target = dev->target,
968                     lun    = dev->lun,
969                     asr,
970                     csr,
971                     id;
972 
973     /*
974      * if we're already selected, return (XXXX panic maybe?)
975      */
976     if ( dev->sc_flags & SBICF_SELECTED )
977         return(0);
978 
979     QPRINTF(("sbicselectbus %d: ", target));
980 
981     /*
982      * issue select
983      */
984     SET_SBIC_selid(regs, target);
985     SET_SBIC_timeo(regs, SBIC_TIMEOUT(250, dev->sc_clkfreq));
986 
987     GET_SBIC_asr(regs, asr);
988 
989     if ( asr & (SBIC_ASR_INT|SBIC_ASR_BSY) ) {
990         /*
991          * This means we got ourselves reselected upon
992          */
993         QPRINTF(("WD busy (reselect?)\n"));
994         return 0;
995     }
996 
997     SET_SBIC_cmd(regs, SBIC_CMD_SEL_ATN);
998 
999     /*
1000      * wait for select (merged from separate function may need
1001      * cleanup)
1002      */
1003     WAIT_CIP(regs);
1004 
1005     do {
1006 
1007         asr = SBIC_WAIT(regs, SBIC_ASR_INT | SBIC_ASR_LCI, 0);
1008 
1009         if ( asr & SBIC_ASR_LCI ) {
1010             QPRINTF(("late LCI: asr %02x\n", asr));
1011             return 0;
1012         }
1013 
1014         /*
1015          * Clear interrupt
1016          */
1017         GET_SBIC_csr (regs, csr);
1018 
1019         QPRINTF(("%02x ", csr));
1020 
1021         /*
1022          * Reselected from under our feet?
1023          */
1024         if ( csr == SBIC_CSR_RSLT_NI || csr == SBIC_CSR_RSLT_IFY ) {
1025             QPRINTF(("got reselected, asr %02x\n", asr));
1026             /*
1027              * We need to handle this now so we don't lock up later
1028              */
1029             sbicnextstate(dev, csr, asr);
1030 
1031             return 0;
1032         }
1033 
1034         /*
1035          * Whoops!
1036          */
1037         if ( csr == SBIC_CSR_SLT || csr == SBIC_CSR_SLT_ATN ) {
1038             panic("sbicselectbus: target issued select!");
1039             return 0;
1040         }
1041 
1042     } while (csr != (SBIC_CSR_MIS_2 | MESG_OUT_PHASE) &&
1043              csr != (SBIC_CSR_MIS_2 | CMD_PHASE) &&
1044              csr != SBIC_CSR_SEL_TIMEO);
1045 
1046     /*
1047      * Anyone at home?
1048      */
1049     if ( csr == SBIC_CSR_SEL_TIMEO ) {
1050         dev->sc_xs->error = XS_SELTIMEOUT;
1051         QPRINTF(("Selection Timeout\n"));
1052         return 0;
1053     }
1054 
1055     QPRINTF(("Selection Complete\n"));
1056 
1057     /*
1058      * Assume we're now selected
1059      */
1060     GET_SBIC_selid(regs, id);
1061     dev->target    = id;
1062     dev->lun       = lun;
1063     dev->sc_flags |= SBICF_SELECTED;
1064 
1065     /*
1066      * Enable (or not) reselection
1067      * XXXSCW This is probably not necessary since we don't use use the
1068      * Select-and-Xfer-with-ATN command to initiate a selection...
1069      */
1070     if ( !sbic_enable_reselect && dev->nexus_list.tqh_first == NULL)
1071         SET_SBIC_rselid (regs, 0);
1072     else
1073         SET_SBIC_rselid (regs, SBIC_RID_ER);
1074 
1075     /*
1076      * We only really need to do anything when the target goes to MSG out
1077      * If the device ignored ATN, it's probably old and brain-dead,
1078      * but we'll try to support it anyhow.
1079      * If it doesn't support message out, it definately doesn't
1080      * support synchronous transfers, so no point in even asking...
1081      */
1082     if ( csr == (SBIC_CSR_MIS_2 | MESG_OUT_PHASE) ) {
1083         /*
1084          * Send identify message (SCSI-2 requires an identify msg)
1085          */
1086         if ( sbic_inhibit_sync[id] && dev->sc_sync[id].state == SYNC_START ) {
1087             /*
1088              * Handle drives that don't want to be asked
1089              * whether to go sync at all.
1090              */
1091             dev->sc_sync[id].offset = 0;
1092             dev->sc_sync[id].period = sbic_min_period;
1093             dev->sc_sync[id].state  = SYNC_DONE;
1094         }
1095 
1096         /*
1097          * Do we need to negotiate Synchronous Xfers for this target?
1098          */
1099         if ( dev->sc_sync[id].state != SYNC_START ) {
1100             /*
1101              * Nope, we've already negotiated.
1102              * Now see if we should allow the target to disconnect/reselect...
1103              */
1104             if ( dev->sc_xs->xs_control & XS_CTL_POLL || dev->sc_flags & SBICF_ICMD ||
1105                                                   !sbic_enable_reselect )
1106                 SEND_BYTE (regs, MSG_IDENTIFY | lun);
1107             else
1108                 SEND_BYTE (regs, MSG_IDENTIFY_DR | lun);
1109 
1110         } else {
1111             /*
1112              * try to initiate a sync transfer.
1113              * So compose the sync message we're going
1114              * to send to the target
1115              */
1116 #ifdef DEBUG
1117             if ( sync_debug )
1118                 printf("\nSending sync request to target %d ... ", id);
1119 #endif
1120             /*
1121              * setup scsi message sync message request
1122              */
1123             dev->sc_msg[0] = MSG_IDENTIFY | lun;
1124             dev->sc_msg[1] = MSG_EXT_MESSAGE;
1125             dev->sc_msg[2] = 3;
1126             dev->sc_msg[3] = MSG_SYNC_REQ;
1127             dev->sc_msg[4] = sbictoscsiperiod(dev, sbic_min_period);
1128             dev->sc_msg[5] = sbic_max_offset;
1129 
1130             sbicxfout(regs, 6, dev->sc_msg);
1131 
1132             dev->sc_sync[id].state = SYNC_SENT;
1133 #ifdef DEBUG
1134             if ( sync_debug )
1135                 printf ("sent\n");
1136 #endif
1137         }
1138 
1139         /*
1140          * There's one interrupt still to come: the change to CMD phase...
1141          */
1142         SBIC_WAIT(regs, SBIC_ASR_INT , 0);
1143         GET_SBIC_csr(regs, csr);
1144     }
1145 
1146     /*
1147      * set sync or async
1148      */
1149     if ( dev->sc_sync[target].state == SYNC_DONE ) {
1150 #ifdef  DEBUG
1151         if ( sync_debug )
1152             printf("select(%d): sync reg = 0x%02x\n", target,
1153                             SBIC_SYN(dev->sc_sync[target].offset,
1154                                      dev->sc_sync[target].period));
1155 #endif
1156         SET_SBIC_syn(regs, SBIC_SYN(dev->sc_sync[target].offset,
1157                                     dev->sc_sync[target].period));
1158     } else {
1159 #ifdef  DEBUG
1160         if ( sync_debug )
1161             printf("select(%d): sync reg = 0x%02x\n", target,
1162                             SBIC_SYN(0,sbic_min_period));
1163 #endif
1164         SET_SBIC_syn(regs, SBIC_SYN(0, sbic_min_period));
1165     }
1166 
1167     return csr;
1168 }
1169 
1170 /*
1171  * Information Transfer *to* a Scsi Target.
1172  *
1173  * Note: Don't expect there to be an interrupt immediately after all
1174  * the data is transferred out. The WD spec sheet says that the Transfer-
1175  * Info command for non-MSG_IN phases only completes when the target
1176  * next asserts 'REQ'. That is, when the SCSI bus changes to a new state.
1177  *
1178  * This can have a nasty effect on commands which take a relatively long
1179  * time to complete, for example a START/STOP unit command may remain in
1180  * CMD phase until the disk has spun up. Only then will the target change
1181  * to STATUS phase. This is really only a problem for immediate commands
1182  * since we don't allow disconnection for them (yet).
1183  */
1184 int
1185 sbicxfout(regs, len, bp)
1186     sbic_regmap_p   regs;
1187     int             len;
1188     void            *bp;
1189 {
1190     int     wait = sbic_data_wait;
1191     u_char  asr,
1192             *buf = bp;
1193 
1194     QPRINTF(("sbicxfout {%d} %02x %02x %02x %02x %02x "
1195         "%02x %02x %02x %02x %02x\n", len, buf[0], buf[1], buf[2],
1196         buf[3], buf[4], buf[5], buf[6], buf[7], buf[8], buf[9]));
1197 
1198     /*
1199      * sigh.. WD-PROTO strikes again.. sending the command in one go
1200      * causes the chip to lock up if talking to certain (misbehaving?)
1201      * targets. Anyway, this procedure should work for all targets, but
1202      * it's slightly slower due to the overhead
1203      */
1204     WAIT_CIP (regs);
1205 
1206     SBIC_TC_PUT (regs, 0);
1207     SET_SBIC_control(regs, SBIC_CTL_EDI | SBIC_CTL_IDI);
1208     SBIC_TC_PUT (regs, (unsigned)len);
1209     SET_SBIC_cmd (regs, SBIC_CMD_XFER_INFO);
1210 
1211     /*
1212      * Loop for each byte transferred
1213      */
1214     do {
1215 
1216         GET_SBIC_asr (regs, asr);
1217 
1218         if ( asr & SBIC_ASR_DBR ) {
1219             if ( len ) {
1220                 SET_SBIC_data (regs, *buf);
1221                 buf++;
1222                 len--;
1223             } else {
1224                 SET_SBIC_data (regs, 0);
1225             }
1226             wait = sbic_data_wait;
1227         }
1228 
1229     } while ( len && (asr & SBIC_ASR_INT) == 0 && wait-- > 0 );
1230 
1231 #ifdef  DEBUG
1232     QPRINTF(("sbicxfout done: %d bytes remaining (wait:%d)\n", len, wait));
1233 #endif
1234 
1235     /*
1236      * Normally, an interrupt will be pending when this routing returns.
1237      */
1238     return(len);
1239 }
1240 
1241 /*
1242  * Information Transfer *from* a Scsi Target
1243  * returns # bytes left to read
1244  */
1245 int
1246 sbicxfin(regs, len, bp)
1247     sbic_regmap_p   regs;
1248     int             len;
1249     void            *bp;
1250 {
1251     int     wait = sbic_data_wait;
1252     u_char  *buf = bp;
1253     u_char  asr;
1254 #ifdef  DEBUG
1255     u_char  *obp = bp;
1256 #endif
1257 
1258     WAIT_CIP (regs);
1259 
1260     SET_SBIC_control(regs, SBIC_CTL_EDI | SBIC_CTL_IDI);
1261     SBIC_TC_PUT (regs, (unsigned)len);
1262     SET_SBIC_cmd (regs, SBIC_CMD_XFER_INFO);
1263 
1264     /*
1265      * Loop for each byte transferred
1266      */
1267     do {
1268 
1269         GET_SBIC_asr (regs, asr);
1270 
1271         if ( asr & SBIC_ASR_DBR ) {
1272             if ( len ) {
1273                 GET_SBIC_data (regs, *buf);
1274                 buf++;
1275                 len--;
1276             } else {
1277                 u_char foo;
1278                 GET_SBIC_data (regs, foo);
1279             }
1280             wait = sbic_data_wait;
1281         }
1282 
1283     } while ( (asr & SBIC_ASR_INT) == 0 && wait-- > 0 );
1284 
1285     QPRINTF(("sbicxfin {%d} %02x %02x %02x %02x %02x %02x "
1286         "%02x %02x %02x %02x\n", len, obp[0], obp[1], obp[2],
1287         obp[3], obp[4], obp[5], obp[6], obp[7], obp[8], obp[9]));
1288 
1289     SBIC_TC_PUT (regs, 0);
1290 
1291     /*
1292      * this leaves with one csr to be read
1293      */
1294     return len;
1295 }
1296 
1297 /*
1298  * SCSI 'immediate' command:  issue a command to some SCSI device
1299  * and get back an 'immediate' response (i.e., do programmed xfer
1300  * to get the response data).  'cbuf' is a buffer containing a scsi
1301  * command of length clen bytes.  'buf' is a buffer of length 'len'
1302  * bytes for data.  The transfer direction is determined by the device
1303  * (i.e., by the scsi bus data xfer phase).  If 'len' is zero, the
1304  * command must supply no data.
1305  *
1306  * Note that although this routine looks like it can handle disconnect/
1307  * reselect, the fact is that it can't. There is still some work to be
1308  * done to clean this lot up.
1309  */
1310 int
1311 sbicicmd(dev, cbuf, clen, buf, len)
1312     struct sbic_softc   *dev;
1313     void                *cbuf,
1314                         *buf;
1315     int                 clen,
1316                         len;
1317 {
1318     sbic_regmap_p   regs = dev->sc_sbicp;
1319     struct sbic_acb *acb = dev->sc_nexus;
1320     u_char          csr,
1321                     asr;
1322     int             still_busy = SBIC_STATE_RUNNING;
1323 
1324     /*
1325      * Make sure pointers are OK
1326      */
1327     dev->sc_last = dev->sc_cur = &acb->sc_pa;
1328     dev->sc_tcnt = acb->sc_tcnt = 0;
1329 
1330     acb->sc_dmacmd      = 0;
1331     acb->sc_pa.dc_count = 0; /* No DMA */
1332     acb->sc_kv.dc_addr  = buf;
1333     acb->sc_kv.dc_count = len;
1334 
1335 #ifdef  DEBUG
1336     if ( data_pointer_debug > 1 )
1337         printf("sbicicmd(%d,%d):%d\n", dev->target, dev->lun, acb->sc_kv.dc_count);
1338 #endif
1339 
1340     /*
1341      * set the sbic into non-DMA mode
1342      */
1343     SET_SBIC_control(regs, SBIC_CTL_EDI | SBIC_CTL_IDI);
1344 
1345     dev->sc_stat[0] = 0xff;
1346     dev->sc_msg[0]  = 0xff;
1347 
1348     /*
1349      * We're stealing the SCSI bus
1350      */
1351     dev->sc_flags |= SBICF_ICMD;
1352 
1353     do {
1354         GET_SBIC_asr (regs, asr);
1355 
1356         /*
1357          * select the SCSI bus (it's an error if bus isn't free)
1358          */
1359         if ( (dev->sc_flags & SBICF_SELECTED) == 0 &&
1360              still_busy != SBIC_STATE_DISCONNECT ) {
1361             if ( (csr = sbicselectbus(dev)) == 0 ) {
1362                 dev->sc_flags &= ~SBICF_ICMD;
1363                 return(-1);
1364             }
1365         } else
1366         if ( (asr & (SBIC_ASR_BSY | SBIC_ASR_INT)) == SBIC_ASR_INT )
1367             GET_SBIC_csr(regs, csr);
1368         else
1369             csr = 0;
1370 
1371         if ( csr ) {
1372 
1373             QPRINTF((">ASR:0x%02x CSR:0x%02x< ", asr, csr));
1374 
1375             switch ( csr ) {
1376 
1377               case SBIC_CSR_S_XFERRED:
1378               case SBIC_CSR_DISC:
1379               case SBIC_CSR_DISC_1:
1380                 {
1381                     u_char  phase;
1382 
1383                     dev->sc_flags &= ~SBICF_SELECTED;
1384                     GET_SBIC_cmd_phase (regs, phase);
1385 
1386                     if ( phase == 0x60 ) {
1387                         GET_SBIC_tlun (regs, dev->sc_stat[0]);
1388                         still_busy = SBIC_STATE_DONE; /* done */
1389                     } else {
1390 #ifdef DEBUG
1391                         if ( reselect_debug > 1 )
1392                             printf("sbicicmd: handling disconnect\n");
1393 #endif
1394                         still_busy = SBIC_STATE_DISCONNECT;
1395                     }
1396                 }
1397                 break;
1398 
1399               case SBIC_CSR_XFERRED | CMD_PHASE:
1400               case SBIC_CSR_MIS     | CMD_PHASE:
1401               case SBIC_CSR_MIS_1   | CMD_PHASE:
1402               case SBIC_CSR_MIS_2   | CMD_PHASE:
1403                 {
1404                     if ( sbicxfout(regs, clen, cbuf) )
1405                         still_busy = sbicabort(dev, "icmd sending cmd");
1406                 }
1407                 break;
1408 
1409               case SBIC_CSR_XFERRED | STATUS_PHASE:
1410               case SBIC_CSR_MIS     | STATUS_PHASE:
1411               case SBIC_CSR_MIS_1   | STATUS_PHASE:
1412               case SBIC_CSR_MIS_2   | STATUS_PHASE:
1413                 {
1414                     /*
1415                      * The sbic does the status/cmd-complete reading ok,
1416                      * so do this with its hi-level commands.
1417                      */
1418 #ifdef DEBUG
1419                     if ( sbic_debug )
1420                         printf("SBICICMD status phase (bsy=%d)\n", still_busy);
1421 #endif
1422                     SET_SBIC_cmd_phase(regs, 0x46);
1423                     SET_SBIC_cmd(regs, SBIC_CMD_SEL_ATN_XFER);
1424                 }
1425                 break;
1426 
1427               default:
1428                 {
1429                     still_busy = sbicnextstate(dev, csr, asr);
1430                 }
1431                 break;
1432             }
1433 
1434             /*
1435              * make sure the last command was taken,
1436              * ie. we're not hunting after an ignored command..
1437              */
1438             GET_SBIC_asr(regs, asr);
1439 
1440             /*
1441              * tapes may take a loooong time..
1442              */
1443             while (asr & SBIC_ASR_BSY ) {
1444 
1445                 if ( asr & SBIC_ASR_DBR ) {
1446                     int     i;
1447 
1448                     printf("sbicicmd: Waiting while sbic is jammed, CSR:%02x,ASR:%02x\n", csr,asr);
1449 #ifdef DDB
1450                     Debugger();
1451 #endif
1452                     /*
1453                      * SBIC is jammed
1454                      * DUNNO which direction
1455                      * Try old direction
1456                      */
1457                     GET_SBIC_data(regs, i);
1458                     GET_SBIC_asr(regs, asr);
1459 
1460                     if ( asr & SBIC_ASR_DBR ) /* Wants us to write */
1461                         SET_SBIC_data(regs, i);
1462                 }
1463 
1464                 GET_SBIC_asr(regs, asr);
1465             }
1466         }
1467 
1468         /*
1469          * wait for last command to complete
1470          */
1471         if ( asr & SBIC_ASR_LCI ) {
1472             printf("sbicicmd: last command ignored\n");
1473         }
1474         else
1475         if ( still_busy >= SBIC_STATE_RUNNING ) /* Bsy */
1476             SBIC_WAIT (regs, SBIC_ASR_INT, sbic_cmd_wait);
1477 
1478         /*
1479          * do it again
1480          */
1481     } while ( still_busy >= SBIC_STATE_RUNNING && dev->sc_stat[0] == 0xff );
1482 
1483     /*
1484      * Sometimes we need to do an extra read of the CSR
1485      */
1486     GET_SBIC_csr(regs, csr);
1487 
1488 #ifdef DEBUG
1489     if ( data_pointer_debug > 1 )
1490         printf("sbicicmd done(%d,%d):%d =%d=\n", dev->target, dev->lun,
1491                                                  acb->sc_kv.dc_count,
1492                                                  dev->sc_stat[0]);
1493 #endif
1494 
1495     dev->sc_flags &= ~SBICF_ICMD;
1496 
1497     return(dev->sc_stat[0]);
1498 }
1499 
1500 /*
1501  * Finish SCSI xfer command:  After the completion interrupt from
1502  * a read/write operation, sequence through the final phases in
1503  * programmed i/o.  This routine is a lot like sbicicmd except we
1504  * skip (and don't allow) the select, cmd out and data in/out phases.
1505  */
1506 void
1507 sbicxfdone(dev)
1508     struct sbic_softc   *dev;
1509 {
1510     sbic_regmap_p   regs = dev->sc_sbicp;
1511     u_char          phase,
1512                     csr;
1513     int             s;
1514 
1515     QPRINTF(("{"));
1516     s = splbio();
1517 
1518     /*
1519      * have the sbic complete on its own
1520      */
1521     SBIC_TC_PUT(regs, 0);
1522     SET_SBIC_cmd_phase(regs, 0x46);
1523     SET_SBIC_cmd(regs, SBIC_CMD_SEL_ATN_XFER);
1524 
1525     do {
1526 
1527         SBIC_WAIT (regs, SBIC_ASR_INT, 0);
1528         GET_SBIC_csr (regs, csr);
1529         QPRINTF(("%02x:", csr));
1530 
1531     } while ( (csr != SBIC_CSR_DISC) && (csr != SBIC_CSR_DISC_1) &&
1532               (csr != SBIC_CSR_S_XFERRED));
1533 
1534     dev->sc_flags &= ~SBICF_SELECTED;
1535 
1536     GET_SBIC_cmd_phase (regs, phase);
1537     QPRINTF(("}%02x", phase));
1538 
1539     if ( phase == 0x60 )
1540         GET_SBIC_tlun(regs, dev->sc_stat[0]);
1541     else
1542         sbicerror(dev, csr);
1543 
1544     QPRINTF(("=STS:%02x=\n", dev->sc_stat[0]));
1545 
1546     splx(s);
1547 }
1548 
1549 /*
1550  * No DMA chains
1551  */
1552 int
1553 sbicgo(dev, xs)
1554     struct sbic_softc   *dev;
1555     struct scsipi_xfer    *xs;
1556 {
1557     struct sbic_acb *acb = dev->sc_nexus;
1558     sbic_regmap_p   regs = dev->sc_sbicp;
1559     int             i,
1560                     dmaflags,
1561                     count,
1562                     usedma;
1563     u_char          csr,
1564                     asr,
1565                     *addr;
1566 
1567     dev->target = xs->xs_periph->periph_target;
1568     dev->lun    = xs->xs_periph->periph_lun;
1569 
1570     usedma = sbicdmaok(dev, xs);
1571 
1572 #ifdef DEBUG
1573     if ( data_pointer_debug > 1 )
1574         printf("sbicgo(%d,%d): usedma=%d\n", dev->target, dev->lun, usedma);
1575 #endif
1576 
1577     /*
1578      * select the SCSI bus (it's an error if bus isn't free)
1579      */
1580     if ( (csr = sbicselectbus(dev)) == 0 )
1581         return(0); /* Not done: needs to be rescheduled */
1582 
1583     dev->sc_stat[0] = 0xff;
1584 
1585     /*
1586      * Calculate DMA chains now
1587      */
1588     if ( acb->flags & ACB_DATAIN )
1589         dmaflags = DMAGO_READ;
1590     else
1591         dmaflags = 0;
1592 
1593     addr  = acb->sc_kv.dc_addr;
1594     count = acb->sc_kv.dc_count;
1595 
1596     if ( count && ((char *)kvtop((void *)addr) != acb->sc_pa.dc_addr) ) {
1597         printf("sbic: DMA buffer mapping changed %p->%x\n",
1598                 acb->sc_pa.dc_addr, kvtop((void *)addr));
1599 #ifdef DDB
1600         Debugger();
1601 #endif
1602     }
1603 
1604 #ifdef DEBUG
1605     ++sbicdma_ops;          /* count total DMA operations */
1606 #endif
1607 
1608     /*
1609      * Allocate the DMA chain
1610      * Mark end of segment...
1611      */
1612     acb->sc_tcnt        = dev->sc_tcnt = 0;
1613     acb->sc_pa.dc_count = 0;
1614 
1615     sbic_load_ptrs(dev);
1616 
1617     /*
1618      * Enable interrupts but don't do any DMA
1619      * enintr() also enables interrupts for the sbic
1620      */
1621     dev->sc_enintr(dev);
1622 
1623     if ( usedma ) {
1624         dev->sc_tcnt = dev->sc_dmago(dev, acb->sc_pa.dc_addr,
1625                                           acb->sc_pa.dc_count, dmaflags);
1626 #ifdef DEBUG
1627         dev->sc_dmatimo = dev->sc_tcnt ? 1 : 0;
1628 #endif
1629     } else
1630         dev->sc_dmacmd = 0; /* Don't use DMA */
1631 
1632     acb->sc_dmacmd = dev->sc_dmacmd;
1633 
1634 #ifdef DEBUG
1635     if ( data_pointer_debug > 1 ) {
1636         printf("sbicgo dmago:%d(%p:%lx) dmacmd=0x%02x\n", dev->target,
1637                                            dev->sc_cur->dc_addr,
1638                                            dev->sc_tcnt,
1639                                            dev->sc_dmacmd);
1640     }
1641 #endif
1642 
1643     /*
1644      * Lets cycle a while then let the interrupt handler take over.
1645      */
1646     GET_SBIC_asr(regs, asr);
1647 
1648     do {
1649 
1650         QPRINTF(("go "));
1651 
1652         /*
1653          * Handle the new phase
1654          */
1655         i = sbicnextstate(dev, csr, asr);
1656 #if 0
1657         WAIT_CIP(regs);
1658 #endif
1659         if ( i == SBIC_STATE_RUNNING ) {
1660             GET_SBIC_asr(regs, asr);
1661 
1662             if ( asr & SBIC_ASR_LCI )
1663                 printf("sbicgo: LCI asr:%02x csr:%02x\n", asr, csr);
1664 
1665             if ( asr & SBIC_ASR_INT )
1666                 GET_SBIC_csr(regs, csr);
1667         }
1668 
1669     } while ( i == SBIC_STATE_RUNNING && asr & (SBIC_ASR_INT|SBIC_ASR_LCI) );
1670 
1671     if ( i == SBIC_STATE_DONE ) {
1672         if ( dev->sc_stat[0] == 0xff )
1673 #if 0
1674             printf("sbicgo: done & stat = 0xff\n");
1675 #else
1676             ;
1677 #endif
1678         else
1679             return 1;   /* Did we really finish that fast? */
1680     }
1681 
1682     return 0;
1683 }
1684 
1685 
1686 int
1687 sbicintr(dev)
1688     struct sbic_softc   *dev;
1689 {
1690     sbic_regmap_p       regs = dev->sc_sbicp;
1691     u_char              asr,
1692                         csr;
1693     int                 i;
1694 
1695     /*
1696      * pending interrupt?
1697      */
1698     GET_SBIC_asr (regs, asr);
1699     if ( (asr & SBIC_ASR_INT) == 0 )
1700         return(0);
1701 
1702     GET_SBIC_csr(regs, csr);
1703 
1704     do {
1705 
1706         QPRINTF(("intr[0x%x]", csr));
1707 
1708         i = sbicnextstate(dev, csr, asr);
1709 #if 0
1710         WAIT_CIP(regs);
1711 #endif
1712         if ( i == SBIC_STATE_RUNNING ) {
1713             GET_SBIC_asr(regs, asr);
1714 
1715             if ( asr & SBIC_ASR_LCI )
1716                 printf("sbicgo: LCI asr:%02x csr:%02x\n", asr, csr);
1717 
1718             if ( asr & SBIC_ASR_INT )
1719                 GET_SBIC_csr(regs, csr);
1720         }
1721 
1722     } while ( i == SBIC_STATE_RUNNING && asr & (SBIC_ASR_INT|SBIC_ASR_LCI) );
1723 
1724     QPRINTF(("intr done. state=%d, asr=0x%02x\n", i, asr));
1725 
1726     return(1);
1727 }
1728 
1729 /*
1730  * Run commands and wait for disconnect.
1731  * This is only ever called when a command is in progress, when we
1732  * want to busy wait for it to finish.
1733  */
1734 int
1735 sbicpoll(dev)
1736     struct sbic_softc   *dev;
1737 {
1738     sbic_regmap_p       regs = dev->sc_sbicp;
1739     u_char              asr,
1740                         csr = SBIC_CSR_RESET;	/* XXX: Quell un-init warning */
1741     int                 i;
1742 
1743     /*
1744      * Wait for the next interrupt
1745      */
1746     SBIC_WAIT(regs, SBIC_ASR_INT, sbic_cmd_wait);
1747 
1748     do {
1749         GET_SBIC_asr (regs, asr);
1750 
1751         if ( asr & SBIC_ASR_INT )
1752             GET_SBIC_csr(regs, csr);
1753 
1754         QPRINTF(("poll[0x%x]", csr));
1755 
1756         /*
1757          * Handle it
1758          */
1759         i = sbicnextstate(dev, csr, asr);
1760 
1761         WAIT_CIP(regs);
1762         GET_SBIC_asr(regs, asr);
1763 
1764         /*
1765          * tapes may take a loooong time..
1766          */
1767         while ( asr & SBIC_ASR_BSY ) {
1768             u_char z = 0;
1769 
1770             if ( asr & SBIC_ASR_DBR ) {
1771                 printf("sbipoll: Waiting while sbic is jammed, CSR:%02x,ASR:%02x\n", csr,asr);
1772 #ifdef DDB
1773                 Debugger();
1774 #endif
1775                 /*
1776                  * SBIC is jammed
1777                  * DUNNO which direction
1778                  * Try old direction
1779                  */
1780                 GET_SBIC_data(regs, z);
1781                 GET_SBIC_asr(regs, asr);
1782 
1783                 if ( asr & SBIC_ASR_DBR ) /* Wants us to write */
1784                     SET_SBIC_data(regs, z);
1785             }
1786 
1787             GET_SBIC_asr(regs, asr);
1788         }
1789 
1790         if ( asr & SBIC_ASR_LCI )
1791             printf("sbicpoll: LCI asr:%02x csr:%02x\n", asr,csr);
1792         else
1793         if ( i == SBIC_STATE_RUNNING ) /* BSY */
1794             SBIC_WAIT(regs, SBIC_ASR_INT, sbic_cmd_wait);
1795 
1796     } while ( i == SBIC_STATE_RUNNING );
1797 
1798     return(1);
1799 }
1800 
1801 /*
1802  * Handle a single msgin
1803  */
1804 int
1805 sbicmsgin(dev)
1806     struct sbic_softc   *dev;
1807 {
1808     sbic_regmap_p       regs = dev->sc_sbicp;
1809     int                 recvlen = 1;
1810     u_char              asr,
1811                         csr,
1812                         *tmpaddr,
1813                         *msgaddr;
1814 
1815     tmpaddr = msgaddr = dev->sc_msg;
1816 
1817     tmpaddr[0] = 0xff;
1818     tmpaddr[1] = 0xff;
1819 
1820     GET_SBIC_asr(regs, asr);
1821 
1822 #ifdef DEBUG
1823     if ( reselect_debug > 1 )
1824         printf("sbicmsgin asr=%02x\n", asr);
1825 #endif
1826 
1827     GET_SBIC_selid (regs, csr);
1828     SET_SBIC_selid (regs, csr | SBIC_SID_FROM_SCSI);
1829 
1830     SBIC_TC_PUT(regs, 0);
1831     SET_SBIC_control(regs, SBIC_CTL_EDI | SBIC_CTL_IDI);
1832 
1833     do {
1834         while( recvlen-- ) {
1835 
1836             /*
1837              * Fetch the next byte of the message
1838              */
1839             RECV_BYTE(regs, *tmpaddr);
1840 
1841             /*
1842              * get the command completion interrupt, or we
1843              * can't send a new command (LCI)
1844              */
1845             SBIC_WAIT(regs, SBIC_ASR_INT, 0);
1846             GET_SBIC_csr(regs, csr);
1847 
1848 #ifdef DEBUG
1849             if ( reselect_debug > 1 )
1850                 printf("sbicmsgin: got %02x csr %02x\n", *tmpaddr, csr);
1851 #endif
1852 
1853             tmpaddr++;
1854 
1855             if ( recvlen ) {
1856                 /*
1857                  * Clear ACK, and wait for the interrupt for the next byte
1858                  */
1859                 SET_SBIC_cmd(regs, SBIC_CMD_CLR_ACK);
1860                 SBIC_WAIT(regs, SBIC_ASR_INT, 0);
1861                 GET_SBIC_csr(regs, csr);
1862             }
1863         }
1864 
1865         if ( msgaddr[0] == 0xff ) {
1866             printf("sbicmsgin: sbic swallowed our message\n");
1867             break;
1868         }
1869 
1870 #ifdef DEBUG
1871         if ( sync_debug ) {
1872             GET_SBIC_asr(regs, asr);
1873             printf("msgin done csr 0x%x asr 0x%x msg 0x%x\n", csr, asr, msgaddr[0]);
1874         }
1875 #endif
1876         /*
1877          * test whether this is a reply to our sync
1878          * request
1879          */
1880         if ( MSG_ISIDENTIFY(msgaddr[0]) ) {
1881 
1882             /*
1883              * Got IFFY msg -- ack it
1884              */
1885             QPRINTF(("IFFY"));
1886 
1887         } else
1888         if ( msgaddr[0] == MSG_REJECT &&
1889              dev->sc_sync[dev->target].state == SYNC_SENT) {
1890 
1891             /*
1892              * Target probably rejected our Sync negotiation.
1893              */
1894             QPRINTF(("REJECT of SYN"));
1895 
1896 #ifdef DEBUG
1897             if ( sync_debug )
1898                 printf("target %d rejected sync, going async\n", dev->target);
1899 #endif
1900 
1901             dev->sc_sync[dev->target].period = sbic_min_period;
1902             dev->sc_sync[dev->target].offset = 0;
1903             dev->sc_sync[dev->target].state  = SYNC_DONE;
1904             SET_SBIC_syn(regs, SBIC_SYN(dev->sc_sync[dev->target].offset,
1905                                         dev->sc_sync[dev->target].period));
1906 
1907         } else
1908         if ( msgaddr[0] == MSG_REJECT ) {
1909 
1910             /*
1911              * we'll never REJECt a REJECT message..
1912              */
1913             QPRINTF(("REJECT"));
1914 
1915         } else
1916         if ( msgaddr[0] == MSG_SAVE_DATA_PTR ) {
1917 
1918             /*
1919              * don't reject this either.
1920              */
1921             QPRINTF(("MSG_SAVE_DATA_PTR"));
1922 
1923         } else
1924         if ( msgaddr[0] == MSG_RESTORE_PTR ) {
1925 
1926             /*
1927              * don't reject this either.
1928              */
1929             QPRINTF(("MSG_RESTORE_PTR"));
1930 
1931         } else
1932         if ( msgaddr[0] == MSG_DISCONNECT ) {
1933 
1934             /*
1935              * Target is disconnecting...
1936              */
1937             QPRINTF(("DISCONNECT"));
1938 
1939 #ifdef DEBUG
1940             if ( reselect_debug > 1 && msgaddr[0] == MSG_DISCONNECT )
1941                 printf("sbicmsgin: got disconnect msg %s\n",
1942                        (dev->sc_flags & SBICF_ICMD) ? "rejecting" : "");
1943 #endif
1944 
1945             if ( dev->sc_flags & SBICF_ICMD ) {
1946                 /*
1947                  * We're in immediate mode. Prevent disconnects.
1948                  * prepare to reject the message, NACK
1949                  */
1950                 SET_SBIC_cmd(regs, SBIC_CMD_SET_ATN);
1951                 WAIT_CIP(regs);
1952             }
1953 
1954         } else
1955         if ( msgaddr[0] == MSG_CMD_COMPLETE ) {
1956 
1957             /*
1958              * !! KLUDGE ALERT !! quite a few drives don't seem to
1959              * really like the current way of sending the
1960              * sync-handshake together with the ident-message, and
1961              * they react by sending command-complete and
1962              * disconnecting right after returning the valid sync
1963              * handshake. So, all I can do is reselect the drive,
1964              * and hope it won't disconnect again. I don't think
1965              * this is valid behavior, but I can't help fixing a
1966              * problem that apparently exists.
1967              *
1968              * Note: we should not get here on `normal' command
1969              * completion, as that condition is handled by the
1970              * high-level sel&xfer resume command used to walk
1971              * thru status/cc-phase.
1972              */
1973             QPRINTF(("CMD_COMPLETE"));
1974 
1975 #ifdef DEBUG
1976             if ( sync_debug )
1977                 printf ("GOT MSG %d! target %d acting weird.."
1978                         " waiting for disconnect...\n", msgaddr[0], dev->target);
1979 #endif
1980 
1981             /*
1982              * Check to see if sbic is handling this
1983              */
1984             GET_SBIC_asr(regs, asr);
1985 
1986             /*
1987              * XXXSCW: I'm not convinced of this, we haven't negated ACK yet...
1988              */
1989             if ( asr & SBIC_ASR_BSY )
1990                 return SBIC_STATE_RUNNING;
1991 
1992             /*
1993              * Let's try this: Assume it works and set status to 00
1994              */
1995             dev->sc_stat[0] = 0;
1996 
1997         } else
1998         if ( msgaddr[0] == MSG_EXT_MESSAGE && tmpaddr == &(msgaddr[1]) ) {
1999 
2000             /*
2001              * Target is sending us an extended message. We'll assume it's
2002              * the response to our Sync. negotiation.
2003              */
2004             QPRINTF(("ExtMSG\n"));
2005 
2006             /*
2007              * Read in whole extended message. First, negate ACK to accept
2008              * the MSG_EXT_MESSAGE byte...
2009              */
2010             SET_SBIC_cmd(regs, SBIC_CMD_CLR_ACK);
2011 
2012             /*
2013              * Wait for the interrupt for the next byte (length)
2014              */
2015             SBIC_WAIT(regs, SBIC_ASR_INT, 0);
2016             GET_SBIC_csr(regs, csr);
2017 
2018 #ifdef  DEBUG
2019             QPRINTF(("CLR ACK csr %02x\n", csr));
2020 #endif
2021 
2022             /*
2023              * Read the length byte
2024              */
2025             RECV_BYTE(regs, *tmpaddr);
2026 
2027             /*
2028              * Wait for command completion IRQ
2029              */
2030             SBIC_WAIT(regs, SBIC_ASR_INT, 0);
2031             GET_SBIC_csr(regs, csr);
2032 
2033             /*
2034              * Reload the loop counter
2035              */
2036             recvlen = *tmpaddr++;
2037 
2038             QPRINTF(("Recving ext msg, csr %02x len %02x\n", csr, recvlen));
2039 
2040         } else
2041         if ( msgaddr[0] == MSG_EXT_MESSAGE && msgaddr[1] == 3 &&
2042              msgaddr[2] == MSG_SYNC_REQ ) {
2043 
2044             /*
2045              * We've received the complete Extended Message Sync. Request...
2046              */
2047             QPRINTF(("SYN"));
2048 
2049             /*
2050              * Compute the required Transfer Period for the WD chip...
2051              */
2052             dev->sc_sync[dev->target].period = sbicfromscsiperiod(dev, msgaddr[3]);
2053             dev->sc_sync[dev->target].offset = msgaddr[4];
2054             dev->sc_sync[dev->target].state  = SYNC_DONE;
2055 
2056             /*
2057              * Put the WD chip in synchronous mode
2058              */
2059             SET_SBIC_syn(regs, SBIC_SYN(dev->sc_sync[dev->target].offset,
2060                                         dev->sc_sync[dev->target].period));
2061 #ifdef  DEBUG
2062             if ( sync_debug )
2063                 printf("msgin(%d): sync reg = 0x%02x\n", dev->target,
2064                                 SBIC_SYN(dev->sc_sync[dev->target].offset,
2065                                          dev->sc_sync[dev->target].period));
2066 #endif
2067 
2068             printf("%s: target %d now synchronous, period=%dns, offset=%d.\n",
2069                    dev->sc_dev.dv_xname, dev->target,
2070                    msgaddr[3] * 4, msgaddr[4]);
2071 
2072         } else {
2073 
2074             /*
2075              * We don't support whatever this message is...
2076              */
2077 #ifdef DEBUG
2078             if ( sbic_debug || sync_debug )
2079                 printf ("sbicmsgin: Rejecting message 0x%02x\n", msgaddr[0]);
2080 #endif
2081 
2082             /*
2083              * prepare to reject the message, NACK
2084              */
2085             SET_SBIC_cmd(regs, SBIC_CMD_SET_ATN);
2086             WAIT_CIP(regs);
2087         }
2088 
2089         /*
2090          * Negate ACK to complete the transfer
2091          */
2092         SET_SBIC_cmd(regs, SBIC_CMD_CLR_ACK);
2093 
2094         /*
2095          * Wait for the interrupt for the next byte, or phase change.
2096          * Only read the CSR if we have more data to transfer.
2097          * XXXSCW: We should really verify that we're still in MSG IN phase
2098          * before blindly going back around this loop, but that would mean
2099          * we read the CSR... <sigh>
2100          */
2101         SBIC_WAIT(regs, SBIC_ASR_INT, 0);
2102         if ( recvlen > 0 )
2103             GET_SBIC_csr(regs, csr);
2104 
2105     } while ( recvlen > 0 );
2106 
2107     /*
2108      * Should still have one CSR to read
2109      */
2110     return SBIC_STATE_RUNNING;
2111 }
2112 
2113 
2114 /*
2115  * sbicnextstate()
2116  * return:
2117  *      SBIC_STATE_DONE        == done
2118  *      SBIC_STATE_RUNNING     == working
2119  *      SBIC_STATE_DISCONNECT  == disconnected
2120  *      SBIC_STATE_ERROR       == error
2121  */
2122 int
2123 sbicnextstate(dev, csr, asr)
2124     struct sbic_softc   *dev;
2125     u_char              csr,
2126                         asr;
2127 {
2128     sbic_regmap_p       regs = dev->sc_sbicp;
2129     struct sbic_acb     *acb = dev->sc_nexus;
2130 
2131     QPRINTF(("next[%02x,%02x]: ",asr,csr));
2132 
2133     switch (csr) {
2134 
2135       case SBIC_CSR_XFERRED | CMD_PHASE:
2136       case SBIC_CSR_MIS     | CMD_PHASE:
2137       case SBIC_CSR_MIS_1   | CMD_PHASE:
2138       case SBIC_CSR_MIS_2   | CMD_PHASE:
2139         {
2140             if ( sbicxfout(regs, acb->clen, &acb->cmd) )
2141                 goto abort;
2142         }
2143         break;
2144 
2145       case SBIC_CSR_XFERRED | STATUS_PHASE:
2146       case SBIC_CSR_MIS     | STATUS_PHASE:
2147       case SBIC_CSR_MIS_1   | STATUS_PHASE:
2148       case SBIC_CSR_MIS_2   | STATUS_PHASE:
2149         {
2150             SET_SBIC_control(regs, SBIC_CTL_EDI | SBIC_CTL_IDI);
2151 
2152             /*
2153              * this should be the normal i/o completion case.
2154              * get the status & cmd complete msg then let the
2155              * device driver look at what happened.
2156              */
2157             sbicxfdone(dev);
2158 
2159 #ifdef DEBUG
2160             dev->sc_dmatimo = 0;
2161             if ( data_pointer_debug > 1 )
2162                 printf("next dmastop: %d(%p:%lx)\n", dev->target,
2163                                                     dev->sc_cur->dc_addr,
2164                                                     dev->sc_tcnt);
2165 #endif
2166             /*
2167              * Stop the DMA chip
2168              */
2169             dev->sc_dmastop(dev);
2170 
2171             dev->sc_flags &= ~(SBICF_INDMA | SBICF_DCFLUSH);
2172 
2173             /*
2174              * Indicate to the upper layers that the command is done
2175              */
2176             sbic_scsidone(acb, dev->sc_stat[0]);
2177 
2178             return SBIC_STATE_DONE;
2179         }
2180 
2181       case SBIC_CSR_XFERRED | DATA_OUT_PHASE:
2182       case SBIC_CSR_XFERRED | DATA_IN_PHASE:
2183       case SBIC_CSR_MIS     | DATA_OUT_PHASE:
2184       case SBIC_CSR_MIS     | DATA_IN_PHASE:
2185       case SBIC_CSR_MIS_1   | DATA_OUT_PHASE:
2186       case SBIC_CSR_MIS_1   | DATA_IN_PHASE:
2187       case SBIC_CSR_MIS_2   | DATA_OUT_PHASE:
2188       case SBIC_CSR_MIS_2   | DATA_IN_PHASE:
2189         {
2190             /*
2191              * Verify that we expected to transfer data...
2192              */
2193             if ( acb->sc_kv.dc_count <= 0 ) {
2194                 printf("next: DATA phase with xfer count == %d, asr:0x%02x csr:0x%02x\n",
2195                         acb->sc_kv.dc_count, asr, csr);
2196                 goto abort;
2197             }
2198 
2199             /*
2200              * Should we transfer using PIO or DMA ?
2201              */
2202             if ( dev->sc_xs->xs_control & XS_CTL_POLL || dev->sc_flags & SBICF_ICMD ||
2203                  acb->sc_dmacmd == 0 ) {
2204 
2205                 /*
2206                  * Do PIO transfer
2207                  */
2208                 int     i;
2209 
2210 #ifdef DEBUG
2211                 if ( data_pointer_debug > 1 )
2212                     printf("next PIO: %d(%p:%x)\n", dev->target,
2213                                                     acb->sc_kv.dc_addr,
2214                                                     acb->sc_kv.dc_count);
2215 #endif
2216 
2217                 if ( SBIC_PHASE(csr) == DATA_IN_PHASE )
2218                     /*
2219                      * data in
2220                      */
2221                     i = sbicxfin(regs, acb->sc_kv.dc_count,
2222                                        acb->sc_kv.dc_addr);
2223                 else
2224                     /*
2225                      * data out
2226                      */
2227                     i = sbicxfout(regs, acb->sc_kv.dc_count,
2228                                         acb->sc_kv.dc_addr);
2229 
2230                 acb->sc_kv.dc_addr += (acb->sc_kv.dc_count - i);
2231                 acb->sc_kv.dc_count = i;
2232 
2233                 /*
2234                  * Update current count...
2235                  */
2236                 acb->sc_tcnt = dev->sc_tcnt = i;
2237 
2238                 dev->sc_flags &= ~SBICF_INDMA;
2239 
2240             } else {
2241 
2242                 /*
2243                  * Do DMA transfer
2244                  * set next DMA addr and dec count
2245                  */
2246                 sbic_save_ptrs(dev);
2247                 sbic_load_ptrs(dev);
2248 
2249                 SET_SBIC_control(regs, SBIC_CTL_EDI | SBIC_CTL_IDI |
2250                                        SBIC_MACHINE_DMA_MODE);
2251 
2252 #ifdef DEBUG
2253                 dev->sc_dmatimo = 1;
2254                 if ( data_pointer_debug > 1 )
2255                     printf("next DMA: %d(%p:%lx)\n", dev->target,
2256                                                     dev->sc_cur->dc_addr,
2257                                                     dev->sc_tcnt);
2258 #endif
2259                 /*
2260                  * Start the DMA chip going
2261                  */
2262                 dev->sc_tcnt = dev->sc_dmanext(dev);
2263 
2264                 /*
2265                  * Tell the WD chip how much to transfer this time around
2266                  */
2267                 SBIC_TC_PUT(regs, (unsigned)dev->sc_tcnt);
2268 
2269                 /*
2270                  * Start the transfer
2271                  */
2272                 SET_SBIC_cmd(regs, SBIC_CMD_XFER_INFO);
2273 
2274                 /*
2275                  * Indicate that we're in DMA mode
2276                  */
2277                 dev->sc_flags |= SBICF_INDMA;
2278             }
2279         }
2280         break;
2281 
2282       case SBIC_CSR_XFERRED | MESG_IN_PHASE:
2283       case SBIC_CSR_MIS     | MESG_IN_PHASE:
2284       case SBIC_CSR_MIS_1   | MESG_IN_PHASE:
2285       case SBIC_CSR_MIS_2   | MESG_IN_PHASE:
2286         {
2287             sbic_save_ptrs(dev);
2288 
2289             /*
2290              * Handle a single message in...
2291              */
2292             return sbicmsgin(dev);
2293         }
2294 
2295       case SBIC_CSR_MSGIN_W_ACK:
2296         {
2297             /*
2298              * We should never see this since it's handled in 'sbicmsgin()'
2299              * but just for the sake of paranoia...
2300              */
2301             SET_SBIC_cmd(regs, SBIC_CMD_CLR_ACK); /* Dunno what I'm ACKing */
2302             printf("Acking unknown msgin CSR:%02x",csr);
2303         }
2304         break;
2305 
2306       case SBIC_CSR_XFERRED | MESG_OUT_PHASE:
2307       case SBIC_CSR_MIS     | MESG_OUT_PHASE:
2308       case SBIC_CSR_MIS_1   | MESG_OUT_PHASE:
2309       case SBIC_CSR_MIS_2   | MESG_OUT_PHASE:
2310         {
2311             /*
2312              * We only ever handle a message out phase here for sending a
2313              * REJECT message.
2314              */
2315             sbic_save_ptrs(dev);
2316 
2317 #ifdef DEBUG
2318             if (sync_debug)
2319                 printf ("sending REJECT msg to last msg.\n");
2320 #endif
2321 
2322             SEND_BYTE(regs, MSG_REJECT);
2323             WAIT_CIP(regs);
2324         }
2325         break;
2326 
2327       case SBIC_CSR_DISC:
2328       case SBIC_CSR_DISC_1:
2329         {
2330             /*
2331              * Try to schedule another target
2332              */
2333             sbic_save_ptrs(dev);
2334 
2335             dev->sc_flags &= ~SBICF_SELECTED;
2336 
2337 #ifdef DEBUG
2338             if ( reselect_debug > 1 )
2339                 printf("sbicnext target %d disconnected\n", dev->target);
2340 #endif
2341 
2342             TAILQ_INSERT_HEAD(&dev->nexus_list, acb, chain);
2343 
2344             ++dev->sc_tinfo[dev->target].dconns;
2345 
2346             dev->sc_nexus = NULL;
2347             dev->sc_xs    = NULL;
2348 
2349             if ( acb->xs->xs_control & XS_CTL_POLL || dev->sc_flags & SBICF_ICMD ||
2350                                                !sbic_parallel_operations )
2351                 return SBIC_STATE_DISCONNECT;
2352 
2353             QPRINTF(("sbicnext: calling sbic_sched\n"));
2354 
2355             sbic_sched(dev);
2356 
2357             QPRINTF(("sbicnext: sbic_sched returned\n"));
2358 
2359             return SBIC_STATE_DISCONNECT;
2360         }
2361 
2362       case SBIC_CSR_RSLT_NI:
2363       case SBIC_CSR_RSLT_IFY:
2364         {
2365             /*
2366              * A reselection.
2367              * Note that since we don't enable Advanced Features (assuming
2368              * the WD chip is at least the 'A' revision), we're only ever
2369              * likely to see the 'SBIC_CSR_RSLT_NI' status. But for the
2370              * hell of it, we'll handle it anyway, for all the extra code
2371              * it needs...
2372              */
2373             u_char  newtarget,
2374                     newlun;
2375 
2376             GET_SBIC_rselid(regs, newtarget);
2377 
2378             /*
2379              * check SBIC_RID_SIV?
2380              */
2381             newtarget &= SBIC_RID_MASK;
2382 
2383             if ( csr == SBIC_CSR_RSLT_IFY ) {
2384 
2385                 /*
2386                  * Read Identify msg to avoid lockup
2387                  */
2388                 GET_SBIC_data(regs, newlun);
2389                 WAIT_CIP(regs);
2390                 newlun &= SBIC_TLUN_MASK;
2391 
2392             } else {
2393 
2394                 /*
2395                  * Need to read Identify message the hard way, assuming
2396                  * the target even sends us one...
2397                  */
2398                 for (newlun = 255; newlun; --newlun) {
2399                     GET_SBIC_asr(regs, asr);
2400                     if (asr & SBIC_ASR_INT)
2401                         break;
2402                     delay(10);
2403                 }
2404 
2405                 /*
2406                  * If we didn't get an interrupt, somethink's up
2407                  */
2408                 if ( (asr & SBIC_ASR_INT) == 0 ) {
2409                     printf("%s: Reselect without identify? asr %x\n",
2410                             dev->sc_dev.dv_xname, asr);
2411                     newlun = 0; /* XXXX */
2412                 } else {
2413                     /*
2414                      * We got an interrupt, verify that it's a change to
2415                      * message in phase, and if so read the message.
2416                      */
2417                     GET_SBIC_csr(regs,csr);
2418 
2419                     if ( csr == (SBIC_CSR_MIS   | MESG_IN_PHASE) ||
2420                          csr == (SBIC_CSR_MIS_1 | MESG_IN_PHASE) ||
2421                          csr == (SBIC_CSR_MIS_2 | MESG_IN_PHASE) ) {
2422                         /*
2423                          * Yup, gone to message in. Fetch the target LUN
2424                          */
2425                         sbicmsgin(dev);
2426                         newlun = dev->sc_msg[0] & 0x07;
2427 
2428                     } else {
2429                         /*
2430                          * Whoops! Target didn't go to message in phase!!
2431                          */
2432                         printf("RSLT_NI - not MESG_IN_PHASE %x\n", csr);
2433                         newlun = 0; /* XXXSCW */
2434                     }
2435                 }
2436             }
2437 
2438             /*
2439              * Ok, we have the identity of the reselecting target.
2440              */
2441 #ifdef DEBUG
2442             if ( reselect_debug > 1 ||
2443                 (reselect_debug && csr == SBIC_CSR_RSLT_NI) ) {
2444                 printf("sbicnext: reselect %s from targ %d lun %d\n",
2445                         csr == SBIC_CSR_RSLT_NI ? "NI" : "IFY", newtarget, newlun);
2446             }
2447 #endif
2448 
2449             if ( dev->sc_nexus ) {
2450                 /*
2451                  * Whoops! We've been reselected with an command in progress!
2452                  * The best we can do is to put the current command back on the
2453                  * ready list and hope for the best.
2454                  */
2455 #ifdef DEBUG
2456                 if ( reselect_debug > 1 ) {
2457                     printf("%s: reselect %s with active command\n",
2458                         dev->sc_dev.dv_xname,
2459                         csr == SBIC_CSR_RSLT_NI ? "NI" : "IFY");
2460                 }
2461 #endif
2462 
2463                 TAILQ_INSERT_HEAD(&dev->ready_list, dev->sc_nexus, chain);
2464 
2465                 dev->sc_tinfo[dev->target].lubusy &= ~(1 << dev->lun);
2466 
2467                 dev->sc_nexus = NULL;
2468                 dev->sc_xs    = NULL;
2469             }
2470 
2471             /*
2472              * Reload sync values for this target
2473              */
2474             if ( dev->sc_sync[newtarget].state == SYNC_DONE )
2475                 SET_SBIC_syn(regs, SBIC_SYN (dev->sc_sync[newtarget].offset,
2476                                              dev->sc_sync[newtarget].period));
2477             else
2478                 SET_SBIC_syn(regs, SBIC_SYN (0, sbic_min_period));
2479 
2480             /*
2481              * Loop through the nexus list until we find the saved entry
2482              * for the reselecting target...
2483              */
2484             for (acb = dev->nexus_list.tqh_first; acb;
2485                                                   acb = acb->chain.tqe_next) {
2486 
2487                 if ( acb->xs->xs_periph->periph_target == newtarget &&
2488                      acb->xs->xs_periph->periph_lun    == newlun) {
2489                     /*
2490                      * We've found the saved entry. Dequeue it, and
2491                      * make it current again.
2492                      */
2493                     TAILQ_REMOVE(&dev->nexus_list, acb, chain);
2494 
2495                     dev->sc_nexus  = acb;
2496                     dev->sc_xs     = acb->xs;
2497                     dev->sc_flags |= SBICF_SELECTED;
2498                     dev->target    = newtarget;
2499                     dev->lun       = newlun;
2500                     break;
2501                 }
2502             }
2503 
2504             if ( acb == NULL ) {
2505                 printf("%s: reselect %s targ %d not in nexus_list %p\n",
2506                         dev->sc_dev.dv_xname,
2507                         csr == SBIC_CSR_RSLT_NI ? "NI" : "IFY", newtarget,
2508                         &dev->nexus_list.tqh_first);
2509                 panic("bad reselect in sbic");
2510             }
2511 
2512             if ( csr == SBIC_CSR_RSLT_IFY )
2513                 SET_SBIC_cmd(regs, SBIC_CMD_CLR_ACK);
2514         }
2515         break;
2516 
2517       default:
2518         abort:
2519         {
2520             /*
2521              * Something unexpected happened -- deal with it.
2522              */
2523             printf("next: aborting asr 0x%02x csr 0x%02x\n", asr, csr);
2524 
2525 #ifdef DDB
2526             Debugger();
2527 #endif
2528 
2529 #ifdef DEBUG
2530             dev->sc_dmatimo = 0;
2531             if ( data_pointer_debug > 1 )
2532                 printf("next dmastop: %d(%p:%lx)\n", dev->target,
2533                                                     dev->sc_cur->dc_addr,
2534                                                     dev->sc_tcnt);
2535 #endif
2536 
2537             dev->sc_dmastop(dev);
2538             SET_SBIC_control(regs, SBIC_CTL_EDI | SBIC_CTL_IDI);
2539             if ( dev->sc_xs ) sbicerror(dev, csr);
2540             sbicabort(dev, "next");
2541 
2542             if ( dev->sc_flags & SBICF_INDMA ) {
2543                 dev->sc_flags &= ~(SBICF_INDMA | SBICF_DCFLUSH);
2544 
2545 #ifdef DEBUG
2546                 dev->sc_dmatimo = 0;
2547                 if ( data_pointer_debug > 1 )
2548                     printf("next dmastop: %d(%p:%lx)\n", dev->target,
2549                                                         dev->sc_cur->dc_addr,
2550                                                         dev->sc_tcnt);
2551 #endif
2552                 sbic_scsidone(acb, -1);
2553             }
2554 
2555             return SBIC_STATE_ERROR;
2556         }
2557     }
2558 
2559     return(SBIC_STATE_RUNNING);
2560 }
2561 
2562 
2563 /*
2564  * Check if DMA can not be used with specified buffer
2565  */
2566 int
2567 sbiccheckdmap(bp, len, mask)
2568     void    *bp;
2569     u_long  len,
2570             mask;
2571 {
2572     u_char  *buffer;
2573     u_long  phy_buf;
2574     u_long  phy_len;
2575 
2576     buffer = bp;
2577 
2578     if ( len == 0 )
2579         return(1);
2580 
2581     while ( len ) {
2582 
2583         phy_buf = kvtop((void *)buffer);
2584         phy_len = PAGE_SIZE - ((int) buffer & PGOFSET);
2585 
2586         if ( len < phy_len )
2587             phy_len = len;
2588 
2589         if ( phy_buf & mask )
2590             return(1);
2591 
2592         buffer += phy_len;
2593         len    -= phy_len;
2594     }
2595 
2596     return(0);
2597 }
2598 
2599 int
2600 sbictoscsiperiod(dev, a)
2601     struct sbic_softc   *dev;
2602     int                 a;
2603 {
2604     unsigned int fs;
2605 
2606     /*
2607      * cycle = DIV / (2 * CLK)
2608      * DIV = FS + 2
2609      * best we can do is 200ns at 20 MHz, 2 cycles
2610      */
2611 
2612     GET_SBIC_myid(dev->sc_sbicp, fs);
2613 
2614     fs = (fs >> 6) + 2;         /* DIV */
2615 
2616     fs = (fs * 10000) / (dev->sc_clkfreq << 1); /* Cycle, in ns */
2617 
2618     if ( a < 2 )
2619         a = 8;                  /* map to Cycles */
2620 
2621     return ( (fs * a) >> 2 );   /* in 4 ns units */
2622 }
2623 
2624 int
2625 sbicfromscsiperiod(dev, p)
2626     struct sbic_softc   *dev;
2627     int                 p;
2628 {
2629     unsigned    fs,
2630                 ret;
2631 
2632     /*
2633      * Just the inverse of the above
2634      */
2635     GET_SBIC_myid(dev->sc_sbicp, fs);
2636 
2637     fs = (fs >> 6) + 2;     /* DIV */
2638 
2639     fs = (fs * 10000) / (dev->sc_clkfreq << 1); /* Cycle, in ns */
2640 
2641     ret = p << 2;           /* in ns units */
2642     ret = ret / fs;         /* in Cycles */
2643 
2644     if ( ret < sbic_min_period )
2645         return(sbic_min_period);
2646 
2647     /*
2648      * verify rounding
2649      */
2650     if ( sbictoscsiperiod(dev, ret) < p )
2651         ret++;
2652 
2653     return( (ret >= 8) ? 0 : ret );
2654 }
2655 
2656 #ifdef DEBUG
2657 void
2658 sbictimeout(dev)
2659     struct sbic_softc   *dev;
2660 {
2661     int     s,
2662             asr;
2663 
2664     s = splbio();
2665 
2666     if ( dev->sc_dmatimo ) {
2667 
2668         if ( dev->sc_dmatimo > 1 ) {
2669 
2670             printf("%s: DMA timeout #%d\n", dev->sc_dev.dv_xname,
2671                                             dev->sc_dmatimo - 1);
2672 
2673             GET_SBIC_asr(dev->sc_sbicp, asr);
2674 
2675             if ( asr & SBIC_ASR_INT ) {
2676                 /*
2677                  * We need to service a missed IRQ
2678                  */
2679                 sbicintr(dev);
2680             } else {
2681                 (void) sbicabort(dev, "timeout");
2682                 splx(s);
2683                 return;
2684             }
2685         }
2686 
2687         dev->sc_dmatimo++;
2688     }
2689 
2690     splx(s);
2691 
2692     callout_reset(&dev->sc_timo_ch, 30 * hz, (void *)sbictimeout, dev);
2693 }
2694 #endif
2695