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