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