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