1 /* $NetBSD: aic7xxx.c,v 1.26 1997/10/09 02:17:36 jtk Exp $ */ 2 3 /* 4 * Generic driver for the aic7xxx based adaptec SCSI controllers 5 * Product specific probe and attach routines can be found in: 6 * i386/eisa/aic7770.c 27/284X and aic7770 motherboard controllers 7 * pci/aic7870.c 3940, 2940, aic7880, aic7870 and aic7850 controllers 8 * 9 * Copyright (c) 1994, 1995, 1996 Justin T. Gibbs. 10 * All rights reserved. 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 immediately at the beginning of the file, without modification, 17 * this list of conditions, and the following disclaimer. 18 * 2. Redistributions in binary form must reproduce the above copyright 19 * notice, this list of conditions and the following disclaimer in the 20 * documentation and/or other materials provided with the distribution. 21 * 3. The name of the author may not be used to endorse or promote products 22 * derived from this software without specific prior written permission. 23 * 24 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 25 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 27 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR 28 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34 * SUCH DAMAGE. 35 * 36 * from Id: aic7xxx.c,v 1.75 1996/06/23 20:02:37 gibbs Exp 37 */ 38 /* 39 * TODO: 40 * Implement Target Mode 41 * 42 * A few notes on how SCB paging works... 43 * 44 * SCB paging takes advantage of the fact that devices stay disconnected 45 * from the bus a relatively long time and that while they're disconnected, 46 * having the SCBs for that device down on the host adapter is of little use. 47 * Instead we copy the SCB back up into kernel memory and reuse the SCB slot 48 * on the card to schedule another transaction. This can be a real payoff 49 * when doing random I/O to tagged queueing devices since there are more 50 * transactions active at once for the device to sort for optimal seek 51 * reduction. The algorithm goes like this... 52 * 53 * At the sequencer level: 54 * 1) Disconnected SCBs are threaded onto a doubly linked list, headed by 55 * DISCONNECTED_SCBH using the SCB_NEXT and SCB_PREV fields. The most 56 * recently disconnected device is always at the head. 57 * 58 * 2) The SCB has an added field SCB_TAG that corresponds to the kernel 59 * SCB number (ie 0-254). 60 * 61 * 3) When a command is queued, the hardware index of the SCB it was downloaded 62 * into is placed into the QINFIFO for easy indexing by the sequencer. 63 * 64 * 4) The tag field is used as the tag for tagged-queueing, for determining 65 * the related kernel SCB, and is the value put into the QOUTFIFO 66 * so the kernel doesn't have to upload the SCB to determine the kernel SCB 67 * that completed on command completes. 68 * 69 * 5) When a reconnect occurs, the sequencer must scan the SCB array (even 70 * in the tag case) looking for the appropriate SCB and if it can't find 71 * it, it interrupts the kernel so it can page the SCB in. 72 * 73 * 6) If the sequencer is successful in finding the SCB, it removes it from 74 * the doubly linked list of disconnected SCBS. 75 * 76 * At the kernel level: 77 * 1) There are four queues that a kernel SCB may reside on: 78 * free_scbs - SCBs that are not in use and have a hardware slot assigned 79 * to them. 80 * page_scbs - SCBs that are not in use and need to have a hardware slot 81 * assigned to them (i.e. they will most likely cause a page 82 * out event). 83 * waiting_scbs - SCBs that are active, don't have an assigned hardware 84 * slot assigned to them and are waiting for either a 85 * disconnection or a command complete to free up a slot. 86 * assigned_scbs - SCBs that were in the waiting_scbs queue, but were 87 * assigned a slot by ahc_free_scb. 88 * 89 * 2) When a new request comes in, an SCB is allocated from the free_scbs or 90 * page_scbs queue with preference to SCBs on the free_scbs queue. 91 * 92 * 3) If there are no free slots (we retrieved the SCB off of the page_scbs 93 * queue), the SCB is inserted onto the tail of the waiting_scbs list and 94 * we attempt to run this queue down. 95 * 96 * 4) ahc_run_waiting_queues() looks at both the assigned_scbs and waiting_scbs 97 * queues. In the case of the assigned_scbs, the commands are immediately 98 * downloaded and started. For waiting_scbs, we page in all that we can 99 * ensuring we don't create a resource deadlock (see comments in 100 * ahc_run_waiting_queues()). 101 * 102 * 5) After we handle a bunch of command completes, we also try running the 103 * queues since many SCBs may have disconnected since the last command 104 * was started and we have at least one free slot on the card. 105 * 106 * 6) ahc_free_scb looks at the waiting_scbs queue for a transaction 107 * requiring a slot and moves it to the assigned_scbs queue if it 108 * finds one. Otherwise it puts the current SCB onto the free_scbs 109 * queue for later use. 110 * 111 * 7) The driver handles page-in requests from the sequencer in response to 112 * the NO_MATCH sequencer interrupt. For tagged commands, the appropriate 113 * SCB is easily found since the tag is a direct index into our kernel SCB 114 * array. For non-tagged commands, we keep a separate array of 16 pointers 115 * that point to the single possible SCB that was paged out for that target. 116 */ 117 118 #include <sys/param.h> 119 #include <sys/systm.h> 120 #if defined(__NetBSD__) 121 #include <sys/device.h> 122 #include <machine/bus.h> 123 #include <machine/intr.h> 124 #endif /* defined(__NetBSD__) */ 125 126 #include <sys/malloc.h> 127 #include <sys/buf.h> 128 #include <sys/proc.h> 129 130 #include <dev/scsipi/scsi_all.h> 131 #include <dev/scsipi/scsipi_all.h> 132 #include <dev/scsipi/scsi_message.h> 133 #if defined(__NetBSD__) 134 #include <dev/scsipi/scsipi_debug.h> 135 #endif 136 #include <dev/scsipi/scsiconf.h> 137 138 #if defined(__FreeBSD__) 139 #include <machine/clock.h> 140 #endif 141 142 #include <vm/vm.h> 143 #include <vm/vm_param.h> 144 #include <vm/pmap.h> 145 146 #if defined(__FreeBSD__) 147 #include <i386/scsi/aic7xxx.h> 148 149 #include <dev/aic7xxx/aic7xxx_reg.h> 150 #endif /* defined(__FreeBSD__) */ 151 152 #if defined(__NetBSD__) 153 #include <dev/ic/aic7xxxreg.h> 154 #include <dev/ic/aic7xxxvar.h> 155 156 #define bootverbose 1 157 158 #define AIC_SCSI_TARGET scsipi_scsi.target 159 #define AIC_SCSI_LUN scsipi_scsi.lun 160 #define AIC_SCSI_SENSE sense.scsi_sense 161 162 #define DEBUGTARG DEBUGTARGET 163 #if DEBUGTARG < 0 /* Negative numbers for disabling cause warnings */ 164 #undef DEBUGTARG 165 #define DEBUGTARG 17 166 #endif 167 #ifdef alpha /* XXX */ 168 /* XXX XXX NEED REAL DMA MAPPING SUPPORT XXX XXX */ 169 extern vm_offset_t alpha_XXX_dmamap(vm_offset_t); 170 #undef vtophys 171 #define vtophys(va) alpha_XXX_dmamap((vm_offset_t) va) 172 #endif /* alpha */ 173 #endif /* defined(__NetBSD__) */ 174 175 #include <sys/kernel.h> 176 #define KVTOPHYS(x) vtophys(x) 177 178 #define MIN(a,b) ((a < b) ? a : b) 179 #define ALL_TARGETS -1 180 181 #if defined(__FreeBSD__) 182 u_long ahc_unit = 0; 183 #define AIC_SCSI_TARGET target 184 #define AIC_SCSI_LUN lun 185 #define AIC_SCSI_SENSE scsi_sence 186 #endif 187 188 #ifdef AHC_DEBUG 189 static int ahc_debug = AHC_DEBUG; 190 #endif 191 192 #ifdef AHC_BROKEN_CACHE 193 int ahc_broken_cache = 1; 194 195 /* 196 * "wbinvd" cause writing back whole cache (both CPU internal & external) 197 * to memory, so that the instruction takes a lot of time. 198 * This makes machine slow. 199 */ 200 #define INVALIDATE_CACHE() __asm __volatile("wbinvd") 201 #endif 202 203 /**** bit definitions for SCSIDEF ****/ 204 #define HSCSIID 0x07 /* our SCSI ID */ 205 #define HWSCSIID 0x0f /* our SCSI ID if Wide Bus */ 206 207 static void ahcminphys __P((struct buf *bp)); 208 static int32_t ahc_scsi_cmd __P((struct scsipi_xfer *xs)); 209 static inline void pause_sequencer __P((struct ahc_data *ahc)); 210 static inline void unpause_sequencer __P((struct ahc_data *ahc, 211 int unpause_always)); 212 static inline void restart_sequencer __P((struct ahc_data *ahc)); 213 214 static struct scsipi_adapter ahc_switch = 215 { 216 ahc_scsi_cmd, 217 ahcminphys, 218 0, 219 0, 220 #if defined(__FreeBSD__) 221 0, 222 "ahc", 223 { 0, 0 } 224 #endif 225 }; 226 227 /* the below structure is so we have a default dev struct for our link struct */ 228 static struct scsipi_device ahc_dev = 229 { 230 NULL, /* Use default error handler */ 231 NULL, /* have a queue, served by this */ 232 NULL, /* have no async handler */ 233 NULL, /* Use default 'done' routine */ 234 #if defined(__FreeBSD__) 235 "ahc", 236 0, 237 { 0, 0 } 238 #endif 239 }; 240 241 static inline void 242 pause_sequencer(ahc) 243 struct ahc_data *ahc; 244 { 245 AHC_OUTB(ahc, HCNTRL, ahc->pause); 246 247 /* 248 * Since the sequencer can disable pausing in a critical section, we 249 * must loop until it actually stops. 250 */ 251 while ((AHC_INB(ahc, HCNTRL) & PAUSE) == 0) 252 ; 253 } 254 255 static inline void 256 unpause_sequencer(ahc, unpause_always) 257 struct ahc_data *ahc; 258 int unpause_always; 259 { 260 if (unpause_always 261 ||(AHC_INB(ahc, INTSTAT) & (SCSIINT | SEQINT | BRKADRINT)) == 0) 262 AHC_OUTB(ahc, HCNTRL, ahc->unpause); 263 } 264 265 /* 266 * Restart the sequencer program from address zero 267 */ 268 static inline void 269 restart_sequencer(ahc) 270 struct ahc_data *ahc; 271 { 272 do { 273 AHC_OUTB(ahc, SEQCTL, SEQRESET|FASTMODE); 274 } while((AHC_INB(ahc, SEQADDR0) != 0) 275 || (AHC_INB(ahc, SEQADDR1) != 0)); 276 277 unpause_sequencer(ahc, /*unpause_always*/TRUE); 278 } 279 280 #if defined(__NetBSD__) 281 /* 282 * Is device which is pointed by sc_link connected on second scsi bus ? 283 */ 284 #define IS_SCSIBUS_B(ahc, sc_link) \ 285 ((sc_link)->scsipi_scsi.scsibus == (ahc)->sc_link_b.scsipi_scsi.scsibus) 286 287 /* 288 * convert FreeBSD's SCSI symbols to NetBSD's 289 */ 290 #define SCSI_NOMASK SCSI_POLL 291 #define opennings openings 292 #endif 293 294 static u_char ahc_abort_wscb __P((struct ahc_data *ahc, struct scb *scbp, 295 u_char prev, 296 u_char timedout_scb, u_int32_t xs_error)); 297 static void ahc_add_waiting_scb __P((struct ahc_data *ahc, 298 struct scb *scb)); 299 static void ahc_done __P((struct ahc_data *ahc, struct scb *scbp)); 300 static void ahc_free_scb __P((struct ahc_data *ahc, struct scb *scb, 301 int flags)); 302 static inline void ahc_send_scb __P((struct ahc_data *ahc, struct scb *scb)); 303 static inline void ahc_fetch_scb __P((struct ahc_data *ahc, struct scb *scb)); 304 static inline void ahc_page_scb __P((struct ahc_data *ahc, struct scb *out_scb, 305 struct scb *in_scb)); 306 static inline void ahc_run_waiting_queues __P((struct ahc_data *ahc)); 307 static void ahc_handle_seqint __P((struct ahc_data *ahc, u_int8_t intstat)); 308 static struct scb * 309 ahc_get_scb __P((struct ahc_data *ahc, int flags)); 310 static void ahc_loadseq __P((struct ahc_data *ahc)); 311 static int ahc_match_scb __P((struct scb *scb, int target, char channel)); 312 static int ahc_poll __P((struct ahc_data *ahc, int wait)); 313 #ifdef AHC_DEBUG 314 static void ahc_print_scb __P((struct scb *scb)); 315 #endif 316 static int ahc_reset_channel __P((struct ahc_data *ahc, char channel, 317 u_char timedout_scb, u_int32_t xs_error, 318 u_char initiate_reset)); 319 static int ahc_reset_device __P((struct ahc_data *ahc, int target, 320 char channel, u_char timedout_scb, 321 u_int32_t xs_error)); 322 static void ahc_reset_current_bus __P((struct ahc_data *ahc)); 323 static void ahc_run_done_queue __P((struct ahc_data *ahc)); 324 static void ahc_scsirate __P((struct ahc_data* ahc, u_int8_t *scsirate, 325 u_int8_t *period, u_int8_t *offset, 326 char channel, int target)); 327 #if defined(__FreeBSD__) 328 static timeout_t 329 ahc_timeout; 330 #elif defined(__NetBSD__) 331 static void ahc_timeout __P((void *)); 332 #endif 333 static void ahc_busy_target __P((struct ahc_data *ahc, 334 int target, char channel)); 335 static void ahc_unbusy_target __P((struct ahc_data *ahc, 336 int target, char channel)); 337 static void ahc_construct_sdtr __P((struct ahc_data *ahc, int start_byte, 338 u_int8_t period, u_int8_t offset)); 339 static void ahc_construct_wdtr __P((struct ahc_data *ahc, int start_byte, 340 u_int8_t bus_width)); 341 342 #if defined(__NetBSD__) /* XXX */ 343 static void ahc_xxx_enqueue __P((struct ahc_data *ahc, 344 struct scsipi_xfer *xs, int infront)); 345 static struct scsipi_xfer *ahc_xxx_dequeue __P((struct ahc_data *ahc)); 346 #endif 347 348 #if defined(__FreeBSD__) 349 350 char *ahc_name(ahc) 351 struct ahc_data *ahc; 352 { 353 static char name[10]; 354 355 sprintf(name, "ahc%d", ahc->unit); 356 return (name); 357 } 358 359 #elif defined(__NetBSD__) 360 struct cfdriver ahc_cd = { 361 NULL, "ahc", DV_DULL 362 }; 363 #endif 364 365 #ifdef AHC_DEBUG 366 static void 367 ahc_print_scb(scb) 368 struct scb *scb; 369 { 370 printf("scb:%p control:0x%x tcl:0x%x cmdlen:%d cmdpointer:0x%lx\n" 371 ,scb 372 ,scb->control 373 ,scb->tcl 374 ,scb->cmdlen 375 ,(unsigned long) scb->cmdpointer ); 376 printf(" datlen:%d data:0x%lx segs:0x%x segp:0x%lx\n" 377 ,scb->datalen 378 ,(unsigned long) scb->data 379 ,scb->SG_segment_count 380 ,(unsigned long) scb->SG_list_pointer); 381 printf(" sg_addr:%lx sg_len:%ld\n" 382 ,(unsigned long) scb->ahc_dma[0].addr 383 ,(long) scb->ahc_dma[0].len); 384 } 385 386 #endif 387 388 static struct { 389 u_char errno; 390 char *errmesg; 391 } hard_error[] = { 392 { ILLHADDR, "Illegal Host Access" }, 393 { ILLSADDR, "Illegal Sequencer Address referenced" }, 394 { ILLOPCODE, "Illegal Opcode in sequencer program" }, 395 { PARERR, "Sequencer Ram Parity Error" } 396 }; 397 398 399 /* 400 * Valid SCSIRATE values. (p. 3-17) 401 * Provides a mapping of tranfer periods in ns to the proper value to 402 * stick in the scsiscfr reg to use that transfer rate. 403 */ 404 static struct { 405 short sxfr; 406 /* Rates in Ultra mode have bit 8 of sxfr set */ 407 #define ULTRA_SXFR 0x100 408 int period; /* in ns/4 */ 409 char *rate; 410 } ahc_syncrates[] = { 411 { 0x100, 12, "20.0" }, 412 { 0x110, 15, "16.0" }, 413 { 0x120, 18, "13.4" }, 414 { 0x000, 25, "10.0" }, 415 { 0x010, 31, "8.0" }, 416 { 0x020, 37, "6.67" }, 417 { 0x030, 43, "5.7" }, 418 { 0x040, 50, "5.0" }, 419 { 0x050, 56, "4.4" }, 420 { 0x060, 62, "4.0" }, 421 { 0x070, 68, "3.6" } 422 }; 423 424 static int ahc_num_syncrates = 425 sizeof(ahc_syncrates) / sizeof(ahc_syncrates[0]); 426 427 /* 428 * Allocate a controller structure for a new device and initialize it. 429 * ahc_reset should be called before now since we assume that the card 430 * is paused. 431 */ 432 #if defined(__FreeBSD__) 433 struct ahc_data * 434 ahc_alloc(unit, iobase, type, flags) 435 int unit; 436 u_long iobase; 437 #elif defined(__NetBSD__) 438 void 439 ahc_construct(ahc, st, sh, type, flags) 440 struct ahc_data *ahc; 441 bus_space_tag_t st; 442 bus_space_handle_t sh; 443 #endif 444 ahc_type type; 445 ahc_flag flags; 446 { 447 448 /* 449 * find unit and check we have that many defined 450 */ 451 452 #if defined(__FreeBSD__) 453 struct ahc_data *ahc; 454 455 /* 456 * Allocate a storage area for us 457 */ 458 459 ahc = malloc(sizeof(struct ahc_data), M_TEMP, M_NOWAIT); 460 if (!ahc) { 461 printf("ahc%d: cannot malloc!\n", unit); 462 return NULL; 463 } 464 bzero(ahc, sizeof(struct ahc_data)); 465 #endif 466 STAILQ_INIT(&ahc->free_scbs); 467 STAILQ_INIT(&ahc->page_scbs); 468 STAILQ_INIT(&ahc->waiting_scbs); 469 STAILQ_INIT(&ahc->assigned_scbs); 470 #if defined(__FreeBSD__) 471 ahc->unit = unit; 472 #endif 473 #if defined(__FreeBSD__) 474 ahc->baseport = iobase; 475 #elif defined(__NetBSD__) 476 ahc->sc_st = st; 477 ahc->sc_sh = sh; 478 #endif 479 ahc->type = type; 480 ahc->flags = flags; 481 ahc->unpause = (AHC_INB(ahc, HCNTRL) & IRQMS) | INTEN; 482 ahc->pause = ahc->unpause | PAUSE; 483 484 #if defined(__FreeBSD__) 485 return (ahc); 486 #endif 487 } 488 489 void 490 ahc_free(ahc) 491 struct ahc_data *ahc; 492 { 493 #if defined(__FreeBSD__) 494 free(ahc, M_DEVBUF); 495 return; 496 #endif 497 } 498 499 void 500 #if defined(__FreeBSD__) 501 ahc_reset(iobase) 502 u_long iobase; 503 #elif defined(__NetBSD__) 504 ahc_reset(devname, st, sh) 505 char *devname; 506 bus_space_tag_t st; 507 bus_space_handle_t sh; 508 #endif 509 { 510 u_char hcntrl; 511 int wait; 512 513 /* Retain the IRQ type accross the chip reset */ 514 #if defined(__FreeBSD__) 515 hcntrl = (inb(HCNTRL + iobase) & IRQMS) | INTEN; 516 517 outb(HCNTRL + iobase, CHIPRST | PAUSE); 518 #elif defined(__NetBSD__) 519 hcntrl = (bus_space_read_1(st, sh, HCNTRL) & IRQMS) | INTEN; 520 521 bus_space_write_1(st, sh, HCNTRL, CHIPRST | PAUSE); 522 #endif 523 /* 524 * Ensure that the reset has finished 525 */ 526 wait = 1000; 527 #if defined(__FreeBSD__) 528 while (--wait && !(inb(HCNTRL + iobase) & CHIPRSTACK)) 529 #elif defined(__NetBSD__) 530 while (--wait && !(bus_space_read_1(st, sh, HCNTRL) & CHIPRSTACK)) 531 #endif 532 DELAY(1000); 533 if(wait == 0) { 534 #if defined(__FreeBSD__) 535 printf("ahc at 0x%lx: WARNING - Failed chip reset! " 536 "Trying to initialize anyway.\n", iobase); 537 #elif defined(__NetBSD__) 538 printf("%s: WARNING - Failed chip reset! " 539 "Trying to initialize anyway.\n", devname); 540 #endif 541 } 542 #if defined(__FreeBSD__) 543 outb(HCNTRL + iobase, hcntrl | PAUSE); 544 #elif defined(__NetBSD__) 545 bus_space_write_1(st, sh, HCNTRL, hcntrl | PAUSE); 546 #endif 547 } 548 549 /* 550 * Look up the valid period to SCSIRATE conversion in our table. 551 */ 552 static void 553 ahc_scsirate(ahc, scsirate, period, offset, channel, target ) 554 struct ahc_data *ahc; 555 u_int8_t *scsirate; 556 u_int8_t *period; 557 u_int8_t *offset; 558 char channel; 559 int target; 560 { 561 int i; 562 u_int32_t ultra_enb_addr; 563 u_int8_t sxfrctl0; 564 u_int8_t ultra_enb; 565 566 i = ahc_num_syncrates; /* Default to async */ 567 568 if (*period >= ahc_syncrates[0].period && *offset != 0) { 569 for (i = 0; i < ahc_num_syncrates; i++) { 570 571 if (*period <= ahc_syncrates[i].period) { 572 /* 573 * Watch out for Ultra speeds when ultra is not 574 * enabled and vice-versa. 575 */ 576 if(!(ahc->type & AHC_ULTRA) 577 && (ahc_syncrates[i].sxfr & ULTRA_SXFR)) { 578 /* 579 * This should only happen if the 580 * drive is the first to negotiate 581 * and chooses a high rate. We'll 582 * just move down the table util 583 * we hit a non ultra speed. 584 */ 585 continue; 586 } 587 *scsirate = (ahc_syncrates[i].sxfr & 0xF0) 588 | (*offset & 0x0f); 589 *period = ahc_syncrates[i].period; 590 591 if(bootverbose) { 592 printf("%s: target %d synchronous at %sMHz," 593 " offset = 0x%x\n", 594 ahc_name(ahc), target, 595 ahc_syncrates[i].rate, *offset ); 596 } 597 break; 598 } 599 } 600 } 601 if (i >= ahc_num_syncrates) { 602 /* Use asynchronous transfers. */ 603 *scsirate = 0; 604 *period = 0; 605 *offset = 0; 606 if (bootverbose) 607 printf("%s: target %d using asynchronous transfers\n", 608 ahc_name(ahc), target ); 609 } 610 /* 611 * Ensure Ultra mode is set properly for 612 * this target. 613 */ 614 ultra_enb_addr = ULTRA_ENB; 615 if(channel == 'B' || target > 7) 616 ultra_enb_addr++; 617 ultra_enb = AHC_INB(ahc, ultra_enb_addr); 618 sxfrctl0 = AHC_INB(ahc, SXFRCTL0); 619 if (*scsirate != 0 && ahc_syncrates[i].sxfr & ULTRA_SXFR) { 620 ultra_enb |= 0x01 << (target & 0x07); 621 sxfrctl0 |= ULTRAEN; 622 } 623 else { 624 ultra_enb &= ~(0x01 << (target & 0x07)); 625 sxfrctl0 &= ~ULTRAEN; 626 } 627 AHC_OUTB(ahc, ultra_enb_addr, ultra_enb); 628 AHC_OUTB(ahc, SXFRCTL0, sxfrctl0); 629 } 630 631 /* 632 * Attach all the sub-devices we can find 633 */ 634 int 635 ahc_attach(ahc) 636 struct ahc_data *ahc; 637 { 638 #if defined(__FreeBSD__) 639 struct scsibus_data *scbus; 640 #endif 641 642 #if defined(__NetBSD__) /* XXX */ 643 /* 644 * Initialize the software queue. 645 */ 646 LIST_INIT(&ahc->sc_xxxq); 647 #endif 648 649 #ifdef AHC_BROKEN_CACHE 650 if (cpu_class == CPUCLASS_386) /* doesn't have "wbinvd" instruction */ 651 ahc_broken_cache = 0; 652 #endif 653 /* 654 * fill in the prototype scsi_links. 655 */ 656 #if defined(__FreeBSD__) 657 ahc->sc_link.adapter_unit = ahc->unit; 658 ahc->sc_link.adapter_targ = ahc->our_id; 659 ahc->sc_link.fordriver = 0; 660 #elif defined(__NetBSD__) 661 ahc->sc_link.type = BUS_SCSI; 662 ahc->sc_link.scsipi_scsi.adapter_target = ahc->our_id; 663 ahc->sc_link.scsipi_scsi.channel = 0; 664 /* 665 * Set up max_target. 666 */ 667 ahc->sc_link.scsipi_scsi.max_target = (ahc->type & AHC_WIDE) ? 15 : 7; 668 #endif 669 ahc->sc_link.adapter_softc = ahc; 670 ahc->sc_link.adapter = &ahc_switch; 671 ahc->sc_link.opennings = 2; 672 ahc->sc_link.device = &ahc_dev; 673 #ifndef __NetBSD__ 674 ahc->sc_link.flags = DEBUGLEVEL; 675 #endif 676 677 if(ahc->type & AHC_TWIN) { 678 /* Configure the second scsi bus */ 679 ahc->sc_link_b = ahc->sc_link; 680 #if defined(__FreeBSD__) 681 ahc->sc_link_b.adapter_targ = ahc->our_id_b; 682 ahc->sc_link_b.adapter_bus = 1; 683 ahc->sc_link_b.fordriver = (void *)SELBUSB; 684 #elif defined(__NetBSD__) 685 ahc->sc_link_b.scsipi_scsi.adapter_target = ahc->our_id_b; 686 ahc->sc_link_b.scsipi_scsi.channel = 1; 687 #endif 688 } 689 690 691 #if defined(__FreeBSD__) 692 /* 693 * Prepare the scsibus_data area for the upperlevel 694 * scsi code. 695 */ 696 scbus = scsi_alloc_bus(); 697 if(!scbus) 698 return 0; 699 scbus->adapter_link = (ahc->flags & AHC_CHANNEL_B_PRIMARY) ? 700 &ahc->sc_link_b : &ahc->sc_link; 701 if(ahc->type & AHC_WIDE) 702 scbus->maxtarg = 15; 703 704 /* 705 * ask the adapter what subunits are present 706 */ 707 if(bootverbose) 708 printf("ahc%d: Probing channel %c\n", ahc->unit, 709 (ahc->flags & AHC_CHANNEL_B_PRIMARY) ? 'B' : 'A'); 710 scsi_attachdevs(scbus); 711 scbus = NULL; /* Upper-level SCSI code owns this now */ 712 713 if(ahc->type & AHC_TWIN) { 714 scbus = scsi_alloc_bus(); 715 if(!scbus) 716 return 0; 717 scbus->adapter_link = (ahc->flags & AHC_CHANNEL_B_PRIMARY) ? 718 &ahc->sc_link : &ahc->sc_link_b; 719 if(ahc->type & AHC_WIDE) 720 scbus->maxtarg = 15; 721 if(bootverbose) 722 printf("ahc%d: Probing Channel %c\n", ahc->unit, 723 (ahc->flags & AHC_CHANNEL_B_PRIMARY) ? 'A': 'B'); 724 scsi_attachdevs(scbus); 725 scbus = NULL; /* Upper-level SCSI code owns this now */ 726 } 727 #elif defined(__NetBSD__) 728 /* 729 * ask the adapter what subunits are present 730 */ 731 if ((ahc->flags & AHC_CHANNEL_B_PRIMARY) == 0) { 732 /* make IS_SCSIBUS_B() == false, while probing channel A */ 733 ahc->sc_link_b.scsipi_scsi.scsibus = 0xff; 734 735 config_found((void *)ahc, &ahc->sc_link, scsiprint); 736 if (ahc->type & AHC_TWIN) 737 config_found((void *)ahc, &ahc->sc_link_b, scsiprint); 738 } else { 739 /* 740 * if implementation of IS_SCSIBUS_B() is changed to use 741 * ahc->sc_link.scsibus, then "ahc->sc_link.scsibus = 0xff;" 742 * is needed, here. 743 */ 744 745 /* assert(ahc->type & AHC_TWIN); */ 746 config_found((void *)ahc, &ahc->sc_link_b, scsiprint); 747 config_found((void *)ahc, &ahc->sc_link, scsiprint); 748 } 749 #endif 750 return 1; 751 } 752 753 /* 754 * Send an SCB down to the card via PIO. 755 * We assume that the proper SCB is already selected in SCBPTR. 756 */ 757 static inline void 758 ahc_send_scb(ahc, scb) 759 struct ahc_data *ahc; 760 struct scb *scb; 761 { 762 AHC_OUTB(ahc, SCBCNT, SCBAUTO); 763 if( ahc->type == AHC_284 ) 764 /* Can only do 8bit PIO */ 765 AHC_OUTSB(ahc, SCBARRAY, scb, SCB_PIO_TRANSFER_SIZE); 766 else 767 AHC_OUTSL(ahc, SCBARRAY, scb, 768 (SCB_PIO_TRANSFER_SIZE + 3) / 4); 769 AHC_OUTB(ahc, SCBCNT, 0); 770 } 771 772 /* 773 * Retrieve an SCB from the card via PIO. 774 * We assume that the proper SCB is already selected in SCBPTR. 775 */ 776 static inline void 777 ahc_fetch_scb(ahc, scb) 778 struct ahc_data *ahc; 779 struct scb *scb; 780 { 781 AHC_OUTB(ahc, SCBCNT, 0x80); /* SCBAUTO */ 782 783 /* Can only do 8bit PIO for reads */ 784 AHC_INSB(ahc, SCBARRAY, scb, SCB_PIO_TRANSFER_SIZE); 785 786 AHC_OUTB(ahc, SCBCNT, 0); 787 } 788 789 /* 790 * Swap in_scbp for out_scbp down in the cards SCB array. 791 * We assume that the SCB for out_scbp is already selected in SCBPTR. 792 */ 793 static inline void 794 ahc_page_scb(ahc, out_scbp, in_scbp) 795 struct ahc_data *ahc; 796 struct scb *out_scbp; 797 struct scb *in_scbp; 798 { 799 /* Page-out */ 800 ahc_fetch_scb(ahc, out_scbp); 801 out_scbp->flags |= SCB_PAGED_OUT; 802 if(!(out_scbp->control & TAG_ENB)) 803 { 804 /* Stick in non-tagged array */ 805 int index = (out_scbp->tcl >> 4) 806 | (out_scbp->tcl & SELBUSB); 807 ahc->pagedout_ntscbs[index] = out_scbp; 808 } 809 810 /* Page-in */ 811 in_scbp->position = out_scbp->position; 812 out_scbp->position = SCB_LIST_NULL; 813 ahc_send_scb(ahc, in_scbp); 814 in_scbp->flags &= ~SCB_PAGED_OUT; 815 } 816 817 static inline void 818 ahc_run_waiting_queues(ahc) 819 struct ahc_data *ahc; 820 { 821 struct scb* scb; 822 u_char cur_scb; 823 824 if(!(ahc->assigned_scbs.stqh_first || ahc->waiting_scbs.stqh_first)) 825 return; 826 827 pause_sequencer(ahc); 828 cur_scb = AHC_INB(ahc, SCBPTR); 829 830 /* 831 * First handle SCBs that are waiting but have been 832 * assigned a slot. 833 */ 834 while((scb = ahc->assigned_scbs.stqh_first) != NULL) { 835 STAILQ_REMOVE_HEAD(&ahc->assigned_scbs, links); 836 AHC_OUTB(ahc, SCBPTR, scb->position); 837 ahc_send_scb(ahc, scb); 838 839 /* Mark this as an active command */ 840 scb->flags ^= SCB_ASSIGNEDQ|SCB_ACTIVE; 841 842 AHC_OUTB(ahc, QINFIFO, scb->position); 843 if (!(scb->xs->flags & SCSI_NOMASK)) { 844 timeout(ahc_timeout, (caddr_t)scb, 845 (scb->xs->timeout * hz) / 1000); 846 } 847 SC_DEBUG(scb->xs->sc_link, SDEV_DB3, ("cmd_sent\n")); 848 } 849 /* Now deal with SCBs that require paging */ 850 if((scb = ahc->waiting_scbs.stqh_first) != NULL) { 851 u_char disc_scb = AHC_INB(ahc, DISCONNECTED_SCBH); 852 u_char active = AHC_INB(ahc, FLAGS) & (SELECTED|IDENTIFY_SEEN); 853 int count = 0; 854 855 do { 856 u_char next_scb; 857 858 /* Attempt to page this SCB in */ 859 if(disc_scb == SCB_LIST_NULL) 860 break; 861 862 /* 863 * Check the next SCB on in the list. 864 */ 865 AHC_OUTB(ahc, SCBPTR, disc_scb); 866 next_scb = AHC_INB(ahc, SCB_NEXT); 867 868 /* 869 * We have to be careful about when we allow 870 * an SCB to be paged out. There must always 871 * be at least one slot available for a 872 * reconnecting target in case it references 873 * an SCB that has been paged out. Our 874 * heuristic is that either the disconnected 875 * list has at least two entries in it or 876 * there is one entry and the sequencer is 877 * actively working on an SCB which implies that 878 * it will either complete or disconnect before 879 * another reconnection can occur. 880 */ 881 if((next_scb != SCB_LIST_NULL) || active) 882 { 883 u_char out_scbi; 884 struct scb* out_scbp; 885 886 STAILQ_REMOVE_HEAD(&ahc->waiting_scbs, links); 887 888 /* 889 * Find the in-core SCB for the one 890 * we're paging out. 891 */ 892 out_scbi = AHC_INB(ahc, SCB_TAG); 893 out_scbp = ahc->scbarray[out_scbi]; 894 895 /* Do the page out */ 896 ahc_page_scb(ahc, out_scbp, scb); 897 898 /* Mark this as an active command */ 899 scb->flags ^= SCB_WAITINGQ|SCB_ACTIVE; 900 901 /* Queue the command */ 902 AHC_OUTB(ahc, QINFIFO, scb->position); 903 if (!(scb->xs->flags & SCSI_NOMASK)) { 904 timeout(ahc_timeout, (caddr_t)scb, 905 (scb->xs->timeout * hz) / 1000); 906 } 907 SC_DEBUG(scb->xs->sc_link, SDEV_DB3, 908 ("cmd_paged-in\n")); 909 count++; 910 911 /* Advance to the next disconnected SCB */ 912 disc_scb = next_scb; 913 } 914 else 915 break; 916 } while((scb = ahc->waiting_scbs.stqh_first) != NULL); 917 918 if(count) { 919 /* 920 * Update the head of the disconnected list. 921 */ 922 AHC_OUTB(ahc, DISCONNECTED_SCBH, disc_scb); 923 if(disc_scb != SCB_LIST_NULL) { 924 AHC_OUTB(ahc, SCBPTR, disc_scb); 925 AHC_OUTB(ahc, SCB_PREV, SCB_LIST_NULL); 926 } 927 } 928 } 929 /* Restore old position */ 930 AHC_OUTB(ahc, SCBPTR, cur_scb); 931 unpause_sequencer(ahc, /*unpause_always*/FALSE); 932 } 933 934 /* 935 * Add this SCB to the head of the "waiting for selection" list. 936 */ 937 static 938 void ahc_add_waiting_scb(ahc, scb) 939 struct ahc_data *ahc; 940 struct scb *scb; 941 { 942 u_char next; 943 u_char curscb; 944 945 curscb = AHC_INB(ahc, SCBPTR); 946 next = AHC_INB(ahc, WAITING_SCBH); 947 948 AHC_OUTB(ahc, SCBPTR, scb->position); 949 AHC_OUTB(ahc, SCB_NEXT, next); 950 AHC_OUTB(ahc, WAITING_SCBH, scb->position); 951 952 AHC_OUTB(ahc, SCBPTR, curscb); 953 } 954 955 /* 956 * Catch an interrupt from the adapter 957 */ 958 #if defined(__FreeBSD__) 959 void 960 #elif defined (__NetBSD__) 961 int 962 #endif 963 ahc_intr(arg) 964 void *arg; 965 { 966 int intstat; 967 u_char status; 968 struct scb *scb; 969 struct scsipi_xfer *xs; 970 struct ahc_data *ahc = (struct ahc_data *)arg; 971 972 intstat = AHC_INB(ahc, INTSTAT); 973 /* 974 * Is this interrupt for me? or for 975 * someone who is sharing my interrupt? 976 */ 977 if (!(intstat & INT_PEND)) 978 #if defined(__FreeBSD__) 979 return; 980 #elif defined(__NetBSD__) 981 return 0; 982 #endif 983 984 if (intstat & BRKADRINT) { 985 /* We upset the sequencer :-( */ 986 987 /* Lookup the error message */ 988 int i, error = AHC_INB(ahc, ERROR); 989 int num_errors = sizeof(hard_error)/sizeof(hard_error[0]); 990 for(i = 0; error != 1 && i < num_errors; i++) 991 error >>= 1; 992 panic("%s: brkadrint, %s at seqaddr = 0x%x\n", 993 ahc_name(ahc), hard_error[i].errmesg, 994 (AHC_INB(ahc, SEQADDR1) << 8) | 995 AHC_INB(ahc, SEQADDR0)); 996 } 997 if (intstat & SEQINT) 998 ahc_handle_seqint(ahc, intstat); 999 1000 if (intstat & SCSIINT) { 1001 1002 int scb_index = AHC_INB(ahc, SCB_TAG); 1003 status = AHC_INB(ahc, SSTAT1); 1004 scb = ahc->scbarray[scb_index]; 1005 1006 if (status & SCSIRSTI) { 1007 char channel; 1008 channel = AHC_INB(ahc, SBLKCTL); 1009 channel = channel & SELBUSB ? 'B' : 'A'; 1010 printf("%s: Someone reset channel %c\n", 1011 ahc_name(ahc), channel); 1012 ahc_reset_channel(ahc, 1013 channel, 1014 SCB_LIST_NULL, 1015 XS_BUSY, 1016 /* Initiate Reset */FALSE); 1017 scb = NULL; 1018 } 1019 else if (!(scb && (scb->flags & SCB_ACTIVE))){ 1020 printf("%s: ahc_intr - referenced scb not " 1021 "valid during scsiint 0x%x scb(%d)\n", 1022 ahc_name(ahc), status, scb_index); 1023 AHC_OUTB(ahc, CLRSINT1, status); 1024 unpause_sequencer(ahc, /*unpause_always*/TRUE); 1025 AHC_OUTB(ahc, CLRINT, CLRSCSIINT); 1026 scb = NULL; 1027 } 1028 else if (status & SCSIPERR) { 1029 /* 1030 * Determine the bus phase and 1031 * queue an appropriate message 1032 */ 1033 char *phase; 1034 u_char mesg_out = MSG_NOOP; 1035 u_char lastphase = AHC_INB(ahc, LASTPHASE); 1036 1037 xs = scb->xs; 1038 scsi_print_addr(xs->sc_link); 1039 1040 switch(lastphase) { 1041 case P_DATAOUT: 1042 phase = "Data-Out"; 1043 break; 1044 case P_DATAIN: 1045 phase = "Data-In"; 1046 mesg_out = MSG_INITIATOR_DET_ERR; 1047 break; 1048 case P_COMMAND: 1049 phase = "Command"; 1050 break; 1051 case P_MESGOUT: 1052 phase = "Message-Out"; 1053 break; 1054 case P_STATUS: 1055 phase = "Status"; 1056 mesg_out = MSG_INITIATOR_DET_ERR; 1057 break; 1058 case P_MESGIN: 1059 phase = "Message-In"; 1060 mesg_out = MSG_PARITY_ERROR; 1061 break; 1062 default: 1063 phase = "unknown"; 1064 break; 1065 } 1066 printf("parity error during %s phase.\n", phase); 1067 1068 /* 1069 * We've set the hardware to assert ATN if we 1070 * get a parity error on "in" phases, so all we 1071 * need to do is stuff the message buffer with 1072 * the appropriate message. "In" phases have set 1073 * mesg_out to something other than MSG_NOP. 1074 */ 1075 if(mesg_out != MSG_NOOP) { 1076 AHC_OUTB(ahc, MSG0, mesg_out); 1077 AHC_OUTB(ahc, MSG_LEN, 1); 1078 } 1079 else 1080 /* 1081 * Should we allow the target to make 1082 * this decision for us? 1083 */ 1084 xs->error = XS_DRIVER_STUFFUP; 1085 } 1086 else if (status & SELTO) { 1087 u_char waiting; 1088 u_char flags; 1089 1090 xs = scb->xs; 1091 xs->error = XS_SELTIMEOUT; 1092 /* 1093 * Clear any pending messages for the timed out 1094 * target, and mark the target as free 1095 */ 1096 flags = AHC_INB(ahc, FLAGS); 1097 AHC_OUTB(ahc, MSG_LEN, 0); 1098 ahc_unbusy_target(ahc, xs->sc_link->AIC_SCSI_TARGET, 1099 #if defined(__FreeBSD__) 1100 ((long)xs->sc_link->fordriver & SELBUSB) 1101 #elif defined(__NetBSD__) 1102 IS_SCSIBUS_B(ahc, xs->sc_link) 1103 #endif 1104 ? 'B' : 'A'); 1105 /* Stop the selection */ 1106 AHC_OUTB(ahc, SCSISEQ, 0); 1107 1108 AHC_OUTB(ahc, SCB_CONTROL, 0); 1109 1110 AHC_OUTB(ahc, CLRSINT1, CLRSELTIMEO); 1111 1112 AHC_OUTB(ahc, CLRINT, CLRSCSIINT); 1113 1114 /* Shift the waiting for selection queue forward */ 1115 waiting = AHC_INB(ahc, WAITING_SCBH); 1116 AHC_OUTB(ahc, SCBPTR, waiting); 1117 waiting = AHC_INB(ahc, SCB_NEXT); 1118 AHC_OUTB(ahc, WAITING_SCBH, waiting); 1119 1120 restart_sequencer(ahc); 1121 } 1122 else if (!(status & BUSFREE)) { 1123 scsi_print_addr(scb->xs->sc_link); 1124 printf("Unknown SCSIINT. Status = 0x%x\n", status); 1125 AHC_OUTB(ahc, CLRSINT1, status); 1126 unpause_sequencer(ahc, /*unpause_always*/TRUE); 1127 AHC_OUTB(ahc, CLRINT, CLRSCSIINT); 1128 scb = NULL; 1129 } 1130 if(scb != NULL) { 1131 /* We want to process the command */ 1132 untimeout(ahc_timeout, (caddr_t)scb); 1133 ahc_done(ahc, scb); 1134 } 1135 } 1136 if (intstat & CMDCMPLT) { 1137 int scb_index; 1138 1139 do { 1140 scb_index = AHC_INB(ahc, QOUTFIFO); 1141 scb = ahc->scbarray[scb_index]; 1142 if (!scb || !(scb->flags & SCB_ACTIVE)) { 1143 printf("%s: WARNING " 1144 "no command for scb %d (cmdcmplt)\n" 1145 "QOUTCNT == %d\n", 1146 ahc_name(ahc), scb_index, 1147 AHC_INB(ahc, QOUTCNT)); 1148 AHC_OUTB(ahc, CLRINT, CLRCMDINT); 1149 continue; 1150 } 1151 AHC_OUTB(ahc, CLRINT, CLRCMDINT); 1152 untimeout(ahc_timeout, (caddr_t)scb); 1153 ahc_done(ahc, scb); 1154 1155 } while (AHC_INB(ahc, QOUTCNT) & ahc->qcntmask); 1156 1157 ahc_run_waiting_queues(ahc); 1158 } 1159 #if defined(__NetBSD__) 1160 return 1; 1161 #endif 1162 } 1163 1164 static void 1165 ahc_handle_seqint(ahc, intstat) 1166 struct ahc_data *ahc; 1167 u_int8_t intstat; 1168 { 1169 struct scb *scb; 1170 u_short targ_mask; 1171 u_char target = (AHC_INB(ahc, SCSIID) >> 4) & 0x0f; 1172 u_char scratch_offset = target; 1173 char channel = AHC_INB(ahc, SBLKCTL) & SELBUSB ? 'B': 'A'; 1174 1175 if (channel == 'B') 1176 scratch_offset += 8; 1177 targ_mask = (0x01 << scratch_offset); 1178 1179 switch (intstat & SEQINT_MASK) { 1180 case NO_MATCH: 1181 if (ahc->flags & AHC_PAGESCBS) { 1182 /* SCB Page-in request */ 1183 u_char tag; 1184 u_char next; 1185 u_char disc_scb; 1186 struct scb *outscb; 1187 u_char arg_1 = AHC_INB(ahc, ARG_1); 1188 1189 /* 1190 * We should succeed, so set this now. 1191 * If we don't, and one of the methods 1192 * we use to aquire an SCB calls ahc_done, 1193 * we may wind up in our start routine 1194 * and unpause the adapter without giving 1195 * it the correct return value, which will 1196 * cause a hang. 1197 */ 1198 AHC_OUTB(ahc, RETURN_1, SCB_PAGEDIN); 1199 1200 if (arg_1 == SCB_LIST_NULL) { 1201 /* Non-tagged command */ 1202 int index; 1203 1204 index = target|(channel == 'B' ? SELBUSB : 0); 1205 scb = ahc->pagedout_ntscbs[index]; 1206 } else 1207 scb = ahc->scbarray[arg_1]; 1208 1209 if (!(scb->flags & SCB_PAGED_OUT)) 1210 panic("%s: Request to page in a non paged out " 1211 "SCB.", ahc_name(ahc)); 1212 /* 1213 * Now to pick the SCB to page out. 1214 * Either take a free SCB, an assigned SCB, 1215 * an SCB that just completed, the first 1216 * one on the disconnected SCB list, or 1217 * as a last resort a queued SCB. 1218 */ 1219 if (ahc->free_scbs.stqh_first) { 1220 outscb = ahc->free_scbs.stqh_first; 1221 STAILQ_REMOVE_HEAD(&ahc->free_scbs, links); 1222 scb->position = outscb->position; 1223 outscb->position = SCB_LIST_NULL; 1224 STAILQ_INSERT_HEAD(&ahc->page_scbs, outscb, 1225 links); 1226 AHC_OUTB(ahc, SCBPTR, scb->position); 1227 ahc_send_scb(ahc, scb); 1228 scb->flags &= ~SCB_PAGED_OUT; 1229 goto pagein_done; 1230 } 1231 if (intstat & CMDCMPLT) { 1232 int scb_index; 1233 1234 AHC_OUTB(ahc, CLRINT, CLRCMDINT); 1235 scb_index = AHC_INB(ahc, QOUTFIFO); 1236 if (!(AHC_INB(ahc, QOUTCNT) & ahc->qcntmask)) 1237 intstat &= ~CMDCMPLT; 1238 1239 outscb = ahc->scbarray[scb_index]; 1240 if (!outscb || !(outscb->flags & SCB_ACTIVE)) { 1241 printf("%s: WARNING no command for " 1242 "scb %d (cmdcmplt)\n", 1243 ahc_name(ahc), 1244 scb_index); 1245 /* 1246 * Fall through in hopes of finding 1247 * another SCB 1248 */ 1249 } else { 1250 scb->position = outscb->position; 1251 outscb->position = SCB_LIST_NULL; 1252 AHC_OUTB(ahc, SCBPTR, scb->position); 1253 ahc_send_scb(ahc, scb); 1254 scb->flags &= ~SCB_PAGED_OUT; 1255 untimeout(ahc_timeout, 1256 (caddr_t)outscb); 1257 ahc_done(ahc, outscb); 1258 goto pagein_done; 1259 } 1260 } 1261 disc_scb = AHC_INB(ahc, DISCONNECTED_SCBH); 1262 if (disc_scb != SCB_LIST_NULL) { 1263 AHC_OUTB(ahc, SCBPTR, disc_scb); 1264 tag = AHC_INB(ahc, SCB_TAG); 1265 outscb = ahc->scbarray[tag]; 1266 next = AHC_INB(ahc, SCB_NEXT); 1267 if (next != SCB_LIST_NULL) { 1268 AHC_OUTB(ahc, SCBPTR, next); 1269 AHC_OUTB(ahc, SCB_PREV, 1270 SCB_LIST_NULL); 1271 AHC_OUTB(ahc, SCBPTR, disc_scb); 1272 } 1273 AHC_OUTB(ahc, DISCONNECTED_SCBH, next); 1274 ahc_page_scb(ahc, outscb, scb); 1275 } else if (AHC_INB(ahc, QINCNT) & ahc->qcntmask) { 1276 /* 1277 * Pull one of our queued commands 1278 * as a last resort 1279 */ 1280 disc_scb = AHC_INB(ahc, QINFIFO); 1281 AHC_OUTB(ahc, SCBPTR, disc_scb); 1282 tag = AHC_INB(ahc, SCB_TAG); 1283 outscb = ahc->scbarray[tag]; 1284 if ((outscb->control & 0x23) != TAG_ENB) { 1285 /* 1286 * This is not a simple tagged command 1287 * so its position in the queue 1288 * matters. Take the command at the 1289 * end of the queue instead. 1290 */ 1291 int i; 1292 u_char saved_queue[AHC_SCB_MAX]; 1293 u_char queued = AHC_INB(ahc, QINCNT) 1294 & ahc->qcntmask; 1295 1296 /* 1297 * Count the command we removed 1298 * already 1299 */ 1300 saved_queue[0] = disc_scb; 1301 queued++; 1302 1303 /* Empty the input queue */ 1304 for (i = 1; i < queued; i++) 1305 saved_queue[i] = AHC_INB(ahc, QINFIFO); 1306 1307 /* 1308 * Put everyone back but the 1309 * last entry 1310 */ 1311 queued--; 1312 for (i = 0; i < queued; i++) 1313 AHC_OUTB(ahc, QINFIFO, 1314 saved_queue[i]); 1315 1316 AHC_OUTB(ahc, SCBPTR, 1317 saved_queue[queued]); 1318 tag = AHC_INB(ahc, SCB_TAG); 1319 outscb = ahc->scbarray[tag]; 1320 } 1321 untimeout(ahc_timeout, (caddr_t)outscb); 1322 scb->position = outscb->position; 1323 outscb->position = SCB_LIST_NULL; 1324 STAILQ_INSERT_HEAD(&ahc->waiting_scbs, 1325 outscb, links); 1326 outscb->flags |= SCB_WAITINGQ; 1327 ahc_send_scb(ahc, scb); 1328 scb->flags &= ~SCB_PAGED_OUT; 1329 } 1330 else { 1331 panic("Page-in request with no candidates"); 1332 AHC_OUTB(ahc, RETURN_1, 0); 1333 } 1334 pagein_done: 1335 } else { 1336 printf("%s:%c:%d: no active SCB for reconnecting " 1337 "target - issuing ABORT\n", 1338 ahc_name(ahc), channel, target); 1339 printf("SAVED_TCL == 0x%x\n", 1340 AHC_INB(ahc, SAVED_TCL)); 1341 ahc_unbusy_target(ahc, target, channel); 1342 AHC_OUTB(ahc, SCB_CONTROL, 0); 1343 AHC_OUTB(ahc, CLRSINT1, CLRSELTIMEO); 1344 AHC_OUTB(ahc, RETURN_1, 0); 1345 } 1346 break; 1347 case SEND_REJECT: 1348 { 1349 u_char rejbyte = AHC_INB(ahc, REJBYTE); 1350 printf("%s:%c:%d: Warning - unknown message received from " 1351 "target (0x%x). Rejecting\n", 1352 ahc_name(ahc), channel, target, rejbyte); 1353 break; 1354 } 1355 case NO_IDENT: 1356 panic("%s:%c:%d: Target did not send an IDENTIFY message. " 1357 "SAVED_TCL == 0x%x\n", 1358 ahc_name(ahc), channel, target, 1359 AHC_INB(ahc, SAVED_TCL)); 1360 break; 1361 case BAD_PHASE: 1362 printf("%s:%c:%d: unknown scsi bus phase. Attempting to " 1363 "continue\n", ahc_name(ahc), channel, target); 1364 break; 1365 case EXTENDED_MSG: 1366 { 1367 u_int8_t message_length; 1368 u_int8_t message_code; 1369 1370 message_length = AHC_INB(ahc, MSGIN_EXT_LEN); 1371 message_code = AHC_INB(ahc, MSGIN_EXT_OPCODE); 1372 switch(message_code) { 1373 case MSG_EXT_SDTR: 1374 { 1375 u_int8_t period; 1376 u_int8_t offset; 1377 u_int8_t saved_offset; 1378 u_int8_t targ_scratch; 1379 u_int8_t maxoffset; 1380 u_int8_t rate; 1381 1382 if (message_length != MSG_EXT_SDTR_LEN) { 1383 AHC_OUTB(ahc, RETURN_1, SEND_REJ); 1384 ahc->sdtrpending &= ~targ_mask; 1385 break; 1386 } 1387 period = AHC_INB(ahc, MSGIN_EXT_BYTE0); 1388 saved_offset = AHC_INB(ahc, MSGIN_EXT_BYTE1); 1389 targ_scratch = AHC_INB(ahc, TARG_SCRATCH 1390 + scratch_offset); 1391 if (targ_scratch & WIDEXFER) 1392 maxoffset = MAX_OFFSET_16BIT; 1393 else 1394 maxoffset = MAX_OFFSET_8BIT; 1395 offset = MIN(saved_offset, maxoffset); 1396 ahc_scsirate(ahc, &rate, &period, &offset, 1397 channel, target); 1398 /* Preserve the WideXfer flag */ 1399 targ_scratch = rate | (targ_scratch & WIDEXFER); 1400 1401 /* 1402 * Update both the target scratch area and the 1403 * current SCSIRATE. 1404 */ 1405 AHC_OUTB(ahc, TARG_SCRATCH + scratch_offset, 1406 targ_scratch); 1407 AHC_OUTB(ahc, SCSIRATE, targ_scratch); 1408 1409 /* 1410 * See if we initiated Sync Negotiation 1411 * and didn't have to fall down to async 1412 * transfers. 1413 */ 1414 if ((ahc->sdtrpending & targ_mask) != 0 1415 && (saved_offset == offset)) { 1416 /* 1417 * Don't send an SDTR back to 1418 * the target 1419 */ 1420 AHC_OUTB(ahc, RETURN_1, 0); 1421 ahc->needsdtr &= ~targ_mask; 1422 ahc->sdtrpending &= ~targ_mask; 1423 } else { 1424 /* 1425 * Send our own SDTR in reply 1426 */ 1427 #ifdef AHC_DEBUG 1428 if(ahc_debug & AHC_SHOWMISC) 1429 printf("Sending SDTR!!\n"); 1430 #endif 1431 ahc_construct_sdtr(ahc, /*start_byte*/0, 1432 period, offset); 1433 AHC_OUTB(ahc, RETURN_1, SEND_MSG); 1434 1435 /* 1436 * If we aren't starting a re-negotiation 1437 * because we had to go async in response 1438 * to a "too low" response from the target 1439 * clear the needsdtr flag for this target. 1440 */ 1441 if ((ahc->sdtrpending & targ_mask) == 0) 1442 ahc->needsdtr &= ~targ_mask; 1443 else 1444 ahc->sdtrpending |= targ_mask; 1445 } 1446 break; 1447 } 1448 case MSG_EXT_WDTR: 1449 { 1450 u_int8_t scratch, bus_width; 1451 1452 if (message_length != MSG_EXT_WDTR_LEN) { 1453 AHC_OUTB(ahc, RETURN_1, SEND_REJ); 1454 ahc->wdtrpending &= ~targ_mask; 1455 break; 1456 } 1457 1458 bus_width = AHC_INB(ahc, MSGIN_EXT_BYTE0); 1459 scratch = AHC_INB(ahc, TARG_SCRATCH 1460 + scratch_offset); 1461 1462 if (ahc->wdtrpending & targ_mask) { 1463 /* 1464 * Don't send a WDTR back to the 1465 * target, since we asked first. 1466 */ 1467 AHC_OUTB(ahc, RETURN_1, 0); 1468 switch(bus_width){ 1469 case BUS_8_BIT: 1470 scratch &= 0x7f; 1471 break; 1472 case BUS_16_BIT: 1473 if(bootverbose) 1474 printf("%s: target %d using " 1475 "16Bit transfers\n", 1476 ahc_name(ahc), target); 1477 scratch |= WIDEXFER; 1478 break; 1479 case BUS_32_BIT: 1480 /* 1481 * How can we do 32bit transfers 1482 * on a 16bit bus? 1483 */ 1484 AHC_OUTB(ahc, RETURN_1, SEND_REJ); 1485 printf("%s: target %d requested 32Bit " 1486 "transfers. Rejecting...\n", 1487 ahc_name(ahc), target); 1488 break; 1489 default: 1490 break; 1491 } 1492 } else { 1493 /* 1494 * Send our own WDTR in reply 1495 */ 1496 switch(bus_width) { 1497 case BUS_8_BIT: 1498 scratch &= 0x7f; 1499 break; 1500 case BUS_32_BIT: 1501 case BUS_16_BIT: 1502 if(ahc->type & AHC_WIDE) { 1503 /* Negotiate 16_BITS */ 1504 bus_width = BUS_16_BIT; 1505 if(bootverbose) 1506 printf("%s: target %d " 1507 "using 16Bit " 1508 "transfers\n", 1509 ahc_name(ahc), 1510 target); 1511 scratch |= WIDEXFER; 1512 } else 1513 bus_width = BUS_8_BIT; 1514 break; 1515 default: 1516 break; 1517 } 1518 ahc_construct_wdtr(ahc, /*start_byte*/0, 1519 bus_width); 1520 AHC_OUTB(ahc, RETURN_1, SEND_MSG); 1521 } 1522 1523 ahc->needwdtr &= ~targ_mask; 1524 ahc->wdtrpending &= ~targ_mask; 1525 AHC_OUTB(ahc, TARG_SCRATCH + scratch_offset, scratch); 1526 AHC_OUTB(ahc, SCSIRATE, scratch); 1527 break; 1528 } 1529 default: 1530 /* Unknown extended message. Reject it. */ 1531 AHC_OUTB(ahc, RETURN_1, SEND_REJ); 1532 } 1533 } 1534 case REJECT_MSG: 1535 { 1536 /* 1537 * What we care about here is if we had an 1538 * outstanding SDTR or WDTR message for this 1539 * target. If we did, this is a signal that 1540 * the target is refusing negotiation. 1541 */ 1542 1543 u_char targ_scratch; 1544 1545 targ_scratch = AHC_INB(ahc, TARG_SCRATCH 1546 + scratch_offset); 1547 1548 if (ahc->wdtrpending & targ_mask){ 1549 /* note 8bit xfers and clear flag */ 1550 targ_scratch &= 0x7f; 1551 ahc->needwdtr &= ~targ_mask; 1552 ahc->wdtrpending &= ~targ_mask; 1553 #if !defined(__NetBSD__) || defined(DEBUG) 1554 printf("%s:%c:%d: refuses WIDE negotiation. Using " 1555 "8bit transfers\n", ahc_name(ahc), 1556 channel, target); 1557 #endif 1558 } else if(ahc->sdtrpending & targ_mask){ 1559 /* note asynch xfers and clear flag */ 1560 targ_scratch &= 0xf0; 1561 ahc->needsdtr &= ~targ_mask; 1562 ahc->sdtrpending &= ~targ_mask; 1563 #if !defined(__NetBSD__) || defined(DEBUG) 1564 printf("%s:%c:%d: refuses synchronous negotiation. " 1565 "Using asynchronous transfers\n", 1566 ahc_name(ahc), 1567 channel, target); 1568 #endif 1569 } else { 1570 /* 1571 * Otherwise, we ignore it. 1572 */ 1573 #ifdef AHC_DEBUG 1574 if(ahc_debug & AHC_SHOWMISC) 1575 printf("%s:%c:%d: Message reject -- ignored\n", 1576 ahc_name(ahc), channel, target); 1577 #endif 1578 break; 1579 } 1580 AHC_OUTB(ahc, TARG_SCRATCH + scratch_offset, targ_scratch); 1581 AHC_OUTB(ahc, SCSIRATE, targ_scratch); 1582 break; 1583 } 1584 case BAD_STATUS: 1585 { 1586 int scb_index; 1587 struct scsipi_xfer *xs; 1588 1589 /* The sequencer will notify us when a command 1590 * has an error that would be of interest to 1591 * the kernel. This allows us to leave the sequencer 1592 * running in the common case of command completes 1593 * without error. 1594 */ 1595 1596 scb_index = AHC_INB(ahc, SCB_TAG); 1597 scb = ahc->scbarray[scb_index]; 1598 1599 /* 1600 * Set the default return value to 0 (don't 1601 * send sense). The sense code will change 1602 * this if needed and this reduces code 1603 * duplication. 1604 */ 1605 AHC_OUTB(ahc, RETURN_1, 0); 1606 if (!(scb && (scb->flags & SCB_ACTIVE))) { 1607 printf("%s:%c:%d: ahc_intr - referenced scb " 1608 "not valid during seqint 0x%x scb(%d)\n", 1609 ahc_name(ahc), 1610 channel, target, intstat, 1611 scb_index); 1612 goto clear; 1613 } 1614 1615 xs = scb->xs; 1616 1617 scb->status = AHC_INB(ahc, SCB_TARGET_STATUS); 1618 1619 #ifdef AHC_DEBUG 1620 if((ahc_debug & AHC_SHOWSCBS) 1621 && xs->sc_link->AIC_SCSI_TARGET == DEBUGTARG) 1622 ahc_print_scb(scb); 1623 #endif 1624 xs->status = scb->status; 1625 switch(scb->status){ 1626 case SCSI_OK: 1627 printf("%s: Interrupted for staus of" 1628 " 0???\n", ahc_name(ahc)); 1629 break; 1630 case SCSI_CHECK: 1631 #ifdef AHC_DEBUG 1632 if(ahc_debug & AHC_SHOWSENSE) 1633 { 1634 1635 scsi_print_addr(xs->sc_link); 1636 printf("requests Check Status\n"); 1637 } 1638 #endif 1639 1640 if ((xs->error == XS_NOERROR) 1641 && !(scb->flags & SCB_SENSE)) { 1642 struct ahc_dma_seg *sg = scb->ahc_dma; 1643 struct scsipi_sense *sc = &(scb->sense_cmd); 1644 #ifdef AHC_DEBUG 1645 if (ahc_debug & AHC_SHOWSENSE) 1646 { 1647 scsi_print_addr(xs->sc_link); 1648 printf("Sending Sense\n"); 1649 } 1650 #endif 1651 #if defined(__FreeBSD__) 1652 sc->op_code = REQUEST_SENSE; 1653 #elif defined(__NetBSD__) 1654 sc->opcode = REQUEST_SENSE; 1655 #endif 1656 sc->byte2 = xs->sc_link->AIC_SCSI_LUN << 5; 1657 sc->length = sizeof(struct scsipi_sense_data); 1658 sc->control = 0; 1659 sg->addr = KVTOPHYS(&xs->AIC_SCSI_SENSE); 1660 sg->len = sizeof(struct scsipi_sense_data); 1661 1662 scb->control &= DISCENB; 1663 scb->status = 0; 1664 scb->SG_segment_count = 1; 1665 scb->SG_list_pointer = KVTOPHYS(sg); 1666 scb->data = sg->addr; 1667 scb->datalen = sg->len; 1668 #ifdef AHC_BROKEN_CACHE 1669 if (ahc_broken_cache) 1670 INVALIDATE_CACHE(); 1671 #endif 1672 scb->cmdpointer = KVTOPHYS(sc); 1673 scb->cmdlen = sizeof(*sc); 1674 1675 scb->flags |= SCB_SENSE; 1676 ahc_send_scb(ahc, scb); 1677 /* 1678 * Ensure that the target is "BUSY" 1679 * so we don't get overlapping 1680 * commands if we happen to be doing 1681 * tagged I/O. 1682 */ 1683 ahc_busy_target(ahc, target, channel); 1684 1685 /* 1686 * Make us the next command to run 1687 */ 1688 ahc_add_waiting_scb(ahc, scb); 1689 AHC_OUTB(ahc, RETURN_1, SEND_SENSE); 1690 break; 1691 } 1692 /* 1693 * Clear the SCB_SENSE Flag and have 1694 * the sequencer do a normal command 1695 * complete with either a "DRIVER_STUFFUP" 1696 * error or whatever other error condition 1697 * we already had. 1698 */ 1699 scb->flags &= ~SCB_SENSE; 1700 if (xs->error == XS_NOERROR) 1701 xs->error = XS_DRIVER_STUFFUP; 1702 break; 1703 case SCSI_BUSY: 1704 xs->error = XS_BUSY; 1705 scsi_print_addr(xs->sc_link); 1706 printf("Target Busy\n"); 1707 break; 1708 case SCSI_QUEUE_FULL: 1709 /* 1710 * The upper level SCSI code will someday 1711 * handle this properly. 1712 */ 1713 scsi_print_addr(xs->sc_link); 1714 printf("Queue Full\n"); 1715 scb->flags |= SCB_ASSIGNEDQ; 1716 STAILQ_INSERT_TAIL(&ahc->assigned_scbs,scb, links); 1717 AHC_OUTB(ahc, RETURN_1, SEND_SENSE); 1718 break; 1719 default: 1720 scsi_print_addr(xs->sc_link); 1721 printf("unexpected targ_status: %x\n", scb->status); 1722 xs->error = XS_DRIVER_STUFFUP; 1723 break; 1724 } 1725 break; 1726 } 1727 case RESIDUAL: 1728 { 1729 int scb_index; 1730 struct scsipi_xfer *xs; 1731 1732 scb_index = AHC_INB(ahc, SCB_TAG); 1733 scb = ahc->scbarray[scb_index]; 1734 xs = scb->xs; 1735 /* 1736 * Don't clobber valid resid info with 1737 * a resid coming from a check sense 1738 * operation. 1739 */ 1740 if (!(scb->flags & SCB_SENSE)) { 1741 int resid_sgs; 1742 1743 /* 1744 * Remainder of the SG where the transfer 1745 * stopped. 1746 */ 1747 xs->resid = (AHC_INB(ahc, SCB_RESID_DCNT2)<<16) | 1748 (AHC_INB(ahc, SCB_RESID_DCNT1)<<8) | 1749 AHC_INB(ahc, SCB_RESID_DCNT0); 1750 1751 /* 1752 * Add up the contents of all residual 1753 * SG segments that are after the SG where 1754 * the transfer stopped. 1755 */ 1756 resid_sgs = AHC_INB(ahc, SCB_RESID_SGCNT) - 1; 1757 while (resid_sgs > 0) { 1758 int sg; 1759 1760 sg = scb->SG_segment_count - resid_sgs; 1761 xs->resid += scb->ahc_dma[sg].len; 1762 resid_sgs--; 1763 } 1764 1765 #if defined(__FreeBSD__) 1766 xs->flags |= SCSI_RESID_VALID; 1767 #elif defined(__NetBSD__) 1768 /* XXX - Update to do this right */ 1769 #endif 1770 #ifdef AHC_DEBUG 1771 if (ahc_debug & AHC_SHOWMISC) { 1772 scsi_print_addr(xs->sc_link); 1773 printf("Handled Residual of %d bytes\n" 1774 ,xs->resid); 1775 } 1776 #endif 1777 } 1778 break; 1779 } 1780 case ABORT_TAG: 1781 { 1782 int scb_index; 1783 struct scsipi_xfer *xs; 1784 1785 scb_index = AHC_INB(ahc, SCB_TAG); 1786 scb = ahc->scbarray[scb_index]; 1787 xs = scb->xs; 1788 /* 1789 * We didn't recieve a valid tag back from 1790 * the target on a reconnect. 1791 */ 1792 scsi_print_addr(xs->sc_link); 1793 printf("invalid tag received -- sending ABORT_TAG\n"); 1794 xs->error = XS_DRIVER_STUFFUP; 1795 untimeout(ahc_timeout, (caddr_t)scb); 1796 ahc_done(ahc, scb); 1797 break; 1798 } 1799 case AWAITING_MSG: 1800 { 1801 int scb_index; 1802 scb_index = AHC_INB(ahc, SCB_TAG); 1803 scb = ahc->scbarray[scb_index]; 1804 /* 1805 * This SCB had a zero length command, informing 1806 * the sequencer that we wanted to send a special 1807 * message to this target. We only do this for 1808 * BUS_DEVICE_RESET messages currently. 1809 */ 1810 if (scb->flags & SCB_DEVICE_RESET) { 1811 AHC_OUTB(ahc, MSG0, 1812 MSG_BUS_DEV_RESET); 1813 AHC_OUTB(ahc, MSG_LEN, 1); 1814 printf("Bus Device Reset Message Sent\n"); 1815 } else if (scb->flags & SCB_MSGOUT_WDTR) { 1816 ahc_construct_wdtr(ahc, AHC_INB(ahc, MSG_LEN), 1817 BUS_16_BIT); 1818 } else if (scb->flags & SCB_MSGOUT_SDTR) { 1819 u_int8_t target_scratch; 1820 u_int8_t ultraenable; 1821 int sxfr; 1822 int i; 1823 1824 /* Pull the user defined setting */ 1825 target_scratch = AHC_INB(ahc, TARG_SCRATCH 1826 + scratch_offset); 1827 1828 sxfr = target_scratch & SXFR; 1829 if (scratch_offset < 8) 1830 ultraenable = AHC_INB(ahc, ULTRA_ENB); 1831 else 1832 ultraenable = AHC_INB(ahc, ULTRA_ENB + 1); 1833 1834 if (ultraenable & targ_mask) 1835 /* Want an ultra speed in the table */ 1836 sxfr |= 0x100; 1837 1838 for (i = 0; i < ahc_num_syncrates; i++) 1839 if (sxfr == ahc_syncrates[i].sxfr) 1840 break; 1841 1842 ahc_construct_sdtr(ahc, AHC_INB(ahc, MSG_LEN), 1843 ahc_syncrates[i].period, 1844 target_scratch & WIDEXFER ? 1845 MAX_OFFSET_16BIT : MAX_OFFSET_8BIT); 1846 } else 1847 panic("ahc_intr: AWAITING_MSG for an SCB that " 1848 "does not have a waiting message"); 1849 break; 1850 } 1851 case IMMEDDONE: 1852 { 1853 /* 1854 * Take care of device reset messages 1855 */ 1856 u_char scbindex = AHC_INB(ahc, SCB_TAG); 1857 scb = ahc->scbarray[scbindex]; 1858 if (scb->flags & SCB_DEVICE_RESET) { 1859 u_char targ_scratch; 1860 int found; 1861 /* 1862 * Go back to async/narrow transfers and 1863 * renegotiate. 1864 */ 1865 ahc_unbusy_target(ahc, target, channel); 1866 ahc->needsdtr |= ahc->needsdtr_orig & targ_mask; 1867 ahc->needwdtr |= ahc->needwdtr_orig & targ_mask; 1868 ahc->sdtrpending &= ~targ_mask; 1869 ahc->wdtrpending &= ~targ_mask; 1870 targ_scratch = AHC_INB(ahc, TARG_SCRATCH 1871 + scratch_offset); 1872 targ_scratch &= SXFR; 1873 AHC_OUTB(ahc, TARG_SCRATCH + scratch_offset, 1874 targ_scratch); 1875 found = ahc_reset_device(ahc, target, 1876 channel, SCB_LIST_NULL, 1877 XS_NOERROR); 1878 scsi_print_addr(scb->xs->sc_link); 1879 printf("Bus Device Reset delivered. " 1880 "%d SCBs aborted\n", found); 1881 ahc->in_timeout = FALSE; 1882 ahc_run_done_queue(ahc); 1883 } else 1884 panic("ahc_intr: Immediate complete for " 1885 "unknown operation."); 1886 break; 1887 } 1888 case DATA_OVERRUN: 1889 { 1890 /* 1891 * When the sequencer detects an overrun, it 1892 * sets STCNT to 0x00ffffff and allows the 1893 * target to complete its transfer in 1894 * BITBUCKET mode. 1895 */ 1896 u_char scbindex = AHC_INB(ahc, SCB_TAG); 1897 u_int32_t overrun; 1898 scb = ahc->scbarray[scbindex]; 1899 overrun = AHC_INB(ahc, STCNT0) 1900 | (AHC_INB(ahc, STCNT1) << 8) 1901 | (AHC_INB(ahc, STCNT2) << 16); 1902 overrun = 0x00ffffff - overrun; 1903 scsi_print_addr(scb->xs->sc_link); 1904 printf("data overrun of %d bytes detected." 1905 " Forcing a retry.\n", overrun); 1906 /* 1907 * Set this and it will take affect when the 1908 * target does a command complete. 1909 */ 1910 scb->xs->error = XS_DRIVER_STUFFUP; 1911 break; 1912 } 1913 #if NOT_YET 1914 /* XXX Fill these in later */ 1915 case MESG_BUFFER_BUSY: 1916 break; 1917 case MSGIN_PHASEMIS: 1918 break; 1919 #endif 1920 default: 1921 printf("ahc_intr: seqint, " 1922 "intstat == 0x%x, scsisigi = 0x%x\n", 1923 intstat, AHC_INB(ahc, SCSISIGI)); 1924 break; 1925 } 1926 1927 clear: 1928 /* 1929 * Clear the upper byte that holds SEQINT status 1930 * codes and clear the SEQINT bit. 1931 */ 1932 AHC_OUTB(ahc, CLRINT, CLRSEQINT); 1933 1934 /* 1935 * The sequencer is paused immediately on 1936 * a SEQINT, so we should restart it when 1937 * we're done. 1938 */ 1939 unpause_sequencer(ahc, /*unpause_always*/TRUE); 1940 } 1941 1942 /* 1943 * We have a scb which has been processed by the 1944 * adaptor, now we look to see how the operation 1945 * went. 1946 */ 1947 static void 1948 ahc_done(ahc, scb) 1949 struct ahc_data *ahc; 1950 struct scb *scb; 1951 { 1952 struct scsipi_xfer *xs = scb->xs; 1953 1954 SC_DEBUG(xs->sc_link, SDEV_DB2, ("ahc_done\n")); 1955 /* 1956 * Put the results of the operation 1957 * into the xfer and call whoever started it 1958 */ 1959 #if defined(__NetBSD__) 1960 if (xs->error != XS_NOERROR) { 1961 /* Don't override the error value. */ 1962 } else if (scb->flags & SCB_ABORTED) { 1963 xs->error = XS_DRIVER_STUFFUP; 1964 } else 1965 #endif 1966 if(scb->flags & SCB_SENSE) 1967 xs->error = XS_SENSE; 1968 if(scb->flags & SCB_SENTORDEREDTAG) 1969 ahc->in_timeout = FALSE; 1970 #if defined(__FreeBSD__) 1971 if ((xs->flags & SCSI_ERR_OK) && !(xs->error == XS_SENSE)) { 1972 /* All went correctly OR errors expected */ 1973 xs->error = XS_NOERROR; 1974 } 1975 #elif defined(__NetBSD__) 1976 /* 1977 * Since NetBSD doesn't have error ignoring operation mode 1978 * (SCSI_ERR_OK in FreeBSD), we don't have to care this case. 1979 */ 1980 #endif 1981 xs->flags |= ITSDONE; 1982 #ifdef AHC_TAGENABLE 1983 if(xs->cmd->opcode == INQUIRY && xs->error == XS_NOERROR) 1984 { 1985 struct scsipi_inquiry_data *inq_data; 1986 u_short mask = 0x01 << (xs->sc_link->AIC_SCSI_TARGET | 1987 (scb->tcl & 0x08)); 1988 /* 1989 * Sneak a look at the results of the SCSI Inquiry 1990 * command and see if we can do Tagged queing. This 1991 * should really be done by the higher level drivers. 1992 */ 1993 inq_data = (struct scsipi_inquiry_data *)xs->data; 1994 if((inq_data->flags & SID_CmdQue) && !(ahc->tagenable & mask)) 1995 { 1996 printf("%s: target %d Tagged Queuing Device\n", 1997 ahc_name(ahc), xs->sc_link->AIC_SCSI_TARGET); 1998 ahc->tagenable |= mask; 1999 if(ahc->maxhscbs >= 16 || (ahc->flags & AHC_PAGESCBS)) { 2000 /* Default to 8 tags */ 2001 xs->sc_link->opennings += 6; 2002 } 2003 else 2004 { 2005 /* 2006 * Default to 4 tags on whimpy 2007 * cards that don't have much SCB 2008 * space and can't page. This prevents 2009 * a single device from hogging all 2010 * slots. We should really have a better 2011 * way of providing fairness. 2012 */ 2013 xs->sc_link->opennings += 2; 2014 } 2015 } 2016 } 2017 #endif 2018 ahc_free_scb(ahc, scb, xs->flags); 2019 scsipi_done(xs); 2020 2021 #if defined(__NetBSD__) /* XXX */ 2022 /* 2023 * If there are entries in the software queue, try to 2024 * run the first one. We should be more or less guaranteed 2025 * to succeed, since we just freed an SCB. 2026 * 2027 * NOTE: ahc_scsi_cmd() relies on our calling it with 2028 * the first entry in the queue. 2029 */ 2030 if (ahc->sc_xxxq.lh_first != NULL) 2031 (void) ahc_scsi_cmd(ahc->sc_xxxq.lh_first); 2032 #endif /* __NetBSD__ */ 2033 } 2034 2035 /* 2036 * Start the board, ready for normal operation 2037 */ 2038 int 2039 ahc_init(ahc) 2040 struct ahc_data *ahc; 2041 { 2042 u_int8_t scsi_conf, sblkctl, i; 2043 u_int16_t ultraenable = 0; 2044 int max_targ = 15; 2045 /* 2046 * Assume we have a board at this stage and it has been reset. 2047 */ 2048 2049 /* Handle the SCBPAGING option */ 2050 #ifndef AHC_SCBPAGING_ENABLE 2051 ahc->flags &= ~AHC_PAGESCBS; 2052 #endif 2053 2054 /* Determine channel configuration and who we are on the scsi bus. */ 2055 switch ( (sblkctl = AHC_INB(ahc, SBLKCTL) & 0x0a) ) { 2056 case 0: 2057 ahc->our_id = (AHC_INB(ahc, SCSICONF) & HSCSIID); 2058 ahc->flags &= ~AHC_CHANNEL_B_PRIMARY; 2059 if(ahc->type == AHC_394) 2060 printf("Channel %c, SCSI Id=%d, ", 2061 ahc->flags & AHC_CHNLB ? 'B' : 'A', 2062 ahc->our_id); 2063 else 2064 printf("Single Channel, SCSI Id=%d, ", ahc->our_id); 2065 AHC_OUTB(ahc, FLAGS, SINGLE_BUS | (ahc->flags & AHC_PAGESCBS)); 2066 break; 2067 case 2: 2068 ahc->our_id = (AHC_INB(ahc, SCSICONF + 1) & HWSCSIID); 2069 ahc->flags &= ~AHC_CHANNEL_B_PRIMARY; 2070 if(ahc->type == AHC_394) 2071 printf("Wide Channel %c, SCSI Id=%d, ", 2072 ahc->flags & AHC_CHNLB ? 'B' : 'A', 2073 ahc->our_id); 2074 else 2075 printf("Wide Channel, SCSI Id=%d, ", ahc->our_id); 2076 ahc->type |= AHC_WIDE; 2077 AHC_OUTB(ahc, FLAGS, WIDE_BUS | (ahc->flags & AHC_PAGESCBS)); 2078 break; 2079 case 8: 2080 ahc->our_id = (AHC_INB(ahc, SCSICONF) & HSCSIID); 2081 ahc->our_id_b = (AHC_INB(ahc, SCSICONF + 1) & HSCSIID); 2082 printf("Twin Channel, A SCSI Id=%d, B SCSI Id=%d, ", 2083 ahc->our_id, ahc->our_id_b); 2084 ahc->type |= AHC_TWIN; 2085 AHC_OUTB(ahc, FLAGS, TWIN_BUS | (ahc->flags & AHC_PAGESCBS)); 2086 break; 2087 default: 2088 printf(" Unsupported adapter type. Ignoring\n"); 2089 return(-1); 2090 } 2091 2092 /* Determine the number of SCBs */ 2093 2094 { 2095 AHC_OUTB(ahc, SCBPTR, 0); 2096 AHC_OUTB(ahc, SCB_CONTROL, 0); 2097 for(i = 1; i < AHC_SCB_MAX; i++) { 2098 AHC_OUTB(ahc, SCBPTR, i); 2099 AHC_OUTB(ahc, SCB_CONTROL, i); 2100 if(AHC_INB(ahc, SCB_CONTROL) != i) 2101 break; 2102 AHC_OUTB(ahc, SCBPTR, 0); 2103 if(AHC_INB(ahc, SCB_CONTROL) != 0) 2104 break; 2105 /* Clear the control byte. */ 2106 AHC_OUTB(ahc, SCBPTR, i); 2107 AHC_OUTB(ahc, SCB_CONTROL, 0); 2108 2109 ahc->qcntmask |= i; /* Update the count mask. */ 2110 } 2111 2112 /* Ensure we clear the 0 SCB's control byte. */ 2113 AHC_OUTB(ahc, SCBPTR, 0); 2114 AHC_OUTB(ahc, SCB_CONTROL, 0); 2115 2116 ahc->qcntmask |= i; 2117 ahc->maxhscbs = i; 2118 } 2119 2120 if((ahc->maxhscbs < AHC_SCB_MAX) && (ahc->flags & AHC_PAGESCBS)) 2121 ahc->maxscbs = AHC_SCB_MAX; 2122 else { 2123 ahc->maxscbs = ahc->maxhscbs; 2124 ahc->flags &= ~AHC_PAGESCBS; 2125 } 2126 2127 printf("%d SCBs\n", ahc->maxhscbs); 2128 2129 #ifdef AHC_DEBUG 2130 if(ahc_debug & AHC_SHOWMISC) { 2131 struct scb test; 2132 printf("%s: hardware scb %ld bytes; kernel scb %d bytes; " 2133 "ahc_dma %d bytes\n", 2134 ahc_name(ahc), 2135 (u_long)&(test.next) - (u_long)(&test), 2136 sizeof(test), 2137 sizeof(struct ahc_dma_seg)); 2138 } 2139 #endif /* AHC_DEBUG */ 2140 2141 /* Set the SCSI Id, SXFRCTL0, SXFRCTL1, and SIMODE1, for both channels*/ 2142 if(ahc->type & AHC_TWIN) 2143 { 2144 /* 2145 * The device is gated to channel B after a chip reset, 2146 * so set those values first 2147 */ 2148 AHC_OUTB(ahc, SCSIID, ahc->our_id_b); 2149 scsi_conf = AHC_INB(ahc, SCSICONF + 1); 2150 AHC_OUTB(ahc, SXFRCTL1, (scsi_conf & (ENSPCHK|STIMESEL)) 2151 | ENSTIMER|ACTNEGEN|STPWEN); 2152 AHC_OUTB(ahc, SIMODE1, ENSELTIMO|ENSCSIRST|ENSCSIPERR); 2153 if(ahc->type & AHC_ULTRA) 2154 AHC_OUTB(ahc, SXFRCTL0, DFON|SPIOEN|ULTRAEN); 2155 else 2156 AHC_OUTB(ahc, SXFRCTL0, DFON|SPIOEN); 2157 2158 if(scsi_conf & RESET_SCSI) { 2159 /* Reset the bus */ 2160 #if !defined(__NetBSD__) || (defined(__NetBSD__) && defined(DEBUG)) 2161 if(bootverbose) 2162 printf("%s: Resetting Channel B\n", 2163 ahc_name(ahc)); 2164 #endif 2165 AHC_OUTB(ahc, SCSISEQ, SCSIRSTO); 2166 DELAY(1000); 2167 AHC_OUTB(ahc, SCSISEQ, 0); 2168 2169 /* Ensure we don't get a RSTI interrupt from this */ 2170 AHC_OUTB(ahc, CLRSINT1, CLRSCSIRSTI); 2171 AHC_OUTB(ahc, CLRINT, CLRSCSIINT); 2172 } 2173 2174 /* Select Channel A */ 2175 AHC_OUTB(ahc, SBLKCTL, 0); 2176 } 2177 AHC_OUTB(ahc, SCSIID, ahc->our_id); 2178 scsi_conf = AHC_INB(ahc, SCSICONF); 2179 AHC_OUTB(ahc, SXFRCTL1, (scsi_conf & (ENSPCHK|STIMESEL)) 2180 | ENSTIMER|ACTNEGEN|STPWEN); 2181 AHC_OUTB(ahc, SIMODE1, ENSELTIMO|ENSCSIRST|ENSCSIPERR); 2182 if(ahc->type & AHC_ULTRA) 2183 AHC_OUTB(ahc, SXFRCTL0, DFON|SPIOEN|ULTRAEN); 2184 else 2185 AHC_OUTB(ahc, SXFRCTL0, DFON|SPIOEN); 2186 2187 if(scsi_conf & RESET_SCSI) { 2188 /* Reset the bus */ 2189 #if !defined(__NetBSD__) || (defined(__NetBSD__) && defined(DEBUG)) 2190 if(bootverbose) 2191 printf("%s: Resetting Channel A\n", ahc_name(ahc)); 2192 #endif 2193 2194 AHC_OUTB(ahc, SCSISEQ, SCSIRSTO); 2195 DELAY(1000); 2196 AHC_OUTB(ahc, SCSISEQ, 0); 2197 2198 /* Ensure we don't get a RSTI interrupt from this */ 2199 AHC_OUTB(ahc, CLRSINT1, CLRSCSIRSTI); 2200 AHC_OUTB(ahc, CLRINT, CLRSCSIINT); 2201 } 2202 2203 /* 2204 * Look at the information that board initialization or 2205 * the board bios has left us. In the lower four bits of each 2206 * target's scratch space any value other than 0 indicates 2207 * that we should initiate synchronous transfers. If it's zero, 2208 * the user or the BIOS has decided to disable synchronous 2209 * negotiation to that target so we don't activate the needsdtr 2210 * flag. 2211 */ 2212 ahc->needsdtr_orig = 0; 2213 ahc->needwdtr_orig = 0; 2214 2215 /* Grab the disconnection disable table and invert it for our needs */ 2216 if(ahc->flags & AHC_USEDEFAULTS) { 2217 printf("%s: Host Adapter Bios disabled. Using default SCSI " 2218 "device parameters\n", ahc_name(ahc)); 2219 ahc->discenable = 0xff; 2220 } 2221 else 2222 ahc->discenable = ~((AHC_INB(ahc, DISC_DSB + 1) << 8) 2223 | AHC_INB(ahc, DISC_DSB)); 2224 2225 if(!(ahc->type & (AHC_WIDE|AHC_TWIN))) 2226 max_targ = 7; 2227 2228 for(i = 0; i <= max_targ; i++){ 2229 u_char target_settings; 2230 if (ahc->flags & AHC_USEDEFAULTS) { 2231 target_settings = 0; /* 10MHz */ 2232 ahc->needsdtr_orig |= (0x01 << i); 2233 ahc->needwdtr_orig |= (0x01 << i); 2234 } 2235 else { 2236 /* Take the settings leftover in scratch RAM. */ 2237 target_settings = AHC_INB(ahc, TARG_SCRATCH + i); 2238 2239 if(target_settings & 0x0f){ 2240 ahc->needsdtr_orig |= (0x01 << i); 2241 /*Default to asynchronous transfers(0 offset)*/ 2242 target_settings &= 0xf0; 2243 } 2244 if(target_settings & 0x80){ 2245 ahc->needwdtr_orig |= (0x01 << i); 2246 /* 2247 * We'll set the Wide flag when we 2248 * are successful with Wide negotiation. 2249 * Turn it off for now so we aren't 2250 * confused. 2251 */ 2252 target_settings &= 0x7f; 2253 } 2254 if(ahc->type & AHC_ULTRA) { 2255 /* 2256 * Enable Ultra for any target that 2257 * has a valid ultra syncrate setting. 2258 */ 2259 u_char rate = target_settings & 0x70; 2260 if(rate == 0x00 || rate == 0x10 || 2261 rate == 0x20 || rate == 0x40) { 2262 if(rate == 0x40) { 2263 /* Treat 10MHz specially */ 2264 target_settings &= ~0x70; 2265 } 2266 else 2267 ultraenable |= (0x01 << i); 2268 } 2269 } 2270 } 2271 AHC_OUTB(ahc, TARG_SCRATCH+i,target_settings); 2272 } 2273 /* 2274 * If we are not a WIDE device, forget WDTR. This 2275 * makes the driver work on some cards that don't 2276 * leave these fields cleared when the BIOS is not 2277 * installed. 2278 */ 2279 if(!(ahc->type & AHC_WIDE)) 2280 ahc->needwdtr_orig = 0; 2281 ahc->needsdtr = ahc->needsdtr_orig; 2282 ahc->needwdtr = ahc->needwdtr_orig; 2283 ahc->sdtrpending = 0; 2284 ahc->wdtrpending = 0; 2285 ahc->tagenable = 0; 2286 ahc->orderedtag = 0; 2287 2288 AHC_OUTB(ahc, ULTRA_ENB, ultraenable & 0xff); 2289 AHC_OUTB(ahc, ULTRA_ENB + 1, (ultraenable >> 8) & 0xff); 2290 2291 #ifdef AHC_DEBUG 2292 /* How did we do? */ 2293 if(ahc_debug & AHC_SHOWMISC) 2294 printf("NEEDSDTR == 0x%x\nNEEDWDTR == 0x%x\n" 2295 "DISCENABLE == 0x%x\n", ahc->needsdtr, 2296 ahc->needwdtr, ahc->discenable); 2297 #endif 2298 /* 2299 * Set the number of available SCBs 2300 */ 2301 AHC_OUTB(ahc, SCBCOUNT, ahc->maxhscbs); 2302 2303 /* 2304 * 2's compliment of maximum tag value 2305 */ 2306 i = ahc->maxscbs; 2307 AHC_OUTB(ahc, COMP_SCBCOUNT, -i & 0xff); 2308 2309 /* 2310 * QCount mask to deal with broken aic7850s that 2311 * sporadically get garbage in the upper bits of 2312 * their QCount registers. 2313 */ 2314 AHC_OUTB(ahc, QCNTMASK, ahc->qcntmask); 2315 2316 /* We don't have any busy targets right now */ 2317 AHC_OUTB(ahc, ACTIVE_A, 0); 2318 AHC_OUTB(ahc, ACTIVE_B, 0); 2319 2320 /* We don't have any waiting selections */ 2321 AHC_OUTB(ahc, WAITING_SCBH, SCB_LIST_NULL); 2322 2323 /* Our disconnection list is empty too */ 2324 AHC_OUTB(ahc, DISCONNECTED_SCBH, SCB_LIST_NULL); 2325 2326 /* Message out buffer starts empty */ 2327 AHC_OUTB(ahc, MSG_LEN, 0x00); 2328 2329 /* 2330 * Load the Sequencer program and Enable the adapter 2331 * in "fast" mode. 2332 */ 2333 #if !defined(__NetBSD__) || (defined(__NetBSD__) && defined(DEBUG)) 2334 if(bootverbose) 2335 printf("%s: Downloading Sequencer Program...", 2336 ahc_name(ahc)); 2337 #endif 2338 2339 ahc_loadseq(ahc); 2340 2341 #if !defined(__NetBSD__) || (defined(__NetBSD__) && defined(DEBUG)) 2342 if(bootverbose) 2343 printf("Done\n"); 2344 #endif 2345 2346 AHC_OUTB(ahc, SEQCTL, FASTMODE); 2347 2348 unpause_sequencer(ahc, /*unpause_always*/TRUE); 2349 2350 /* 2351 * Note that we are going and return (to probe) 2352 */ 2353 ahc->flags |= AHC_INIT; 2354 return (0); 2355 } 2356 2357 static void 2358 ahcminphys(bp) 2359 struct buf *bp; 2360 { 2361 /* 2362 * Even though the card can transfer up to 16megs per command 2363 * we are limited by the number of segments in the dma segment 2364 * list that we can hold. The worst case is that all pages are 2365 * discontinuous physically, hense the "page per segment" limit 2366 * enforced here. 2367 */ 2368 if (bp->b_bcount > ((AHC_NSEG - 1) * PAGE_SIZE)) { 2369 bp->b_bcount = ((AHC_NSEG - 1) * PAGE_SIZE); 2370 } 2371 #if defined(__NetBSD__) 2372 minphys(bp); 2373 #endif 2374 } 2375 2376 #if defined(__NetBSD__) /* XXX */ 2377 /* 2378 * Insert a scsipi_xfer into the software queue. We overload xs->free_list 2379 * to to ensure we don't run into a queue resource shortage, and keep 2380 * a pointer to the last entry around to make insertion O(C). 2381 */ 2382 static void 2383 ahc_xxx_enqueue(ahc, xs, infront) 2384 struct ahc_data *ahc; 2385 struct scsipi_xfer *xs; 2386 int infront; 2387 { 2388 2389 if (infront || ahc->sc_xxxq.lh_first == NULL) { 2390 if (ahc->sc_xxxq.lh_first == NULL) 2391 ahc->sc_xxxqlast = xs; 2392 LIST_INSERT_HEAD(&ahc->sc_xxxq, xs, free_list); 2393 return; 2394 } 2395 2396 LIST_INSERT_AFTER(ahc->sc_xxxqlast, xs, free_list); 2397 ahc->sc_xxxqlast = xs; 2398 } 2399 2400 /* 2401 * Pull a scsipi_xfer off the front of the software queue. When we 2402 * pull the last one off, we need to clear the pointer to the last 2403 * entry. 2404 */ 2405 static struct scsipi_xfer * 2406 ahc_xxx_dequeue(ahc) 2407 struct ahc_data *ahc; 2408 { 2409 struct scsipi_xfer *xs; 2410 2411 xs = ahc->sc_xxxq.lh_first; 2412 LIST_REMOVE(xs, free_list); 2413 2414 if (ahc->sc_xxxq.lh_first == NULL) 2415 ahc->sc_xxxqlast = NULL; 2416 2417 return (xs); 2418 } 2419 #endif 2420 2421 /* 2422 * start a scsi operation given the command and 2423 * the data address, target, and lun all of which 2424 * are stored in the scsipi_xfer struct 2425 */ 2426 static int32_t 2427 ahc_scsi_cmd(xs) 2428 struct scsipi_xfer *xs; 2429 { 2430 struct scb *scb; 2431 struct ahc_dma_seg *sg; 2432 int seg; /* scatter gather seg being worked on */ 2433 unsigned long thiskv, nextkv; 2434 physaddr thisphys, nextphys; 2435 int bytes_this_seg, bytes_this_page, datalen, flags; 2436 struct ahc_data *ahc; 2437 u_short mask; 2438 int s; 2439 #if defined(__NetBSD__) /* XXX */ 2440 int dontqueue = 0, fromqueue = 0; 2441 #endif 2442 2443 ahc = (struct ahc_data *)xs->sc_link->adapter_softc; 2444 mask = (0x01 << (xs->sc_link->AIC_SCSI_TARGET 2445 #if defined(__FreeBSD__) 2446 | ((u_long)xs->sc_link->fordriver & 0x08))); 2447 #elif defined(__NetBSD__) 2448 | (IS_SCSIBUS_B(ahc, xs->sc_link) ? SELBUSB : 0) )); 2449 #endif 2450 2451 SC_DEBUG(xs->sc_link, SDEV_DB2, ("ahc_scsi_cmd\n")); 2452 2453 #if defined(__NetBSD__) /* XXX */ 2454 /* must protect the queue */ 2455 s = splbio(); 2456 2457 /* 2458 * If we're running the queue from ahc_done(), we're called 2459 * with the first entry in the queue as our argument. 2460 * Pull it off; if we can't run the job, it will get placed 2461 * back at the front. 2462 */ 2463 if (xs == ahc->sc_xxxq.lh_first) { 2464 xs = ahc_xxx_dequeue(ahc); 2465 fromqueue = 1; 2466 goto get_scb; 2467 } 2468 2469 /* determine safety of software queueing */ 2470 dontqueue = xs->flags & SCSI_POLL; 2471 2472 /* 2473 * Handle situations where there's already entries in the 2474 * queue. 2475 */ 2476 if (ahc->sc_xxxq.lh_first != NULL) { 2477 /* 2478 * If we can't queue, we have to abort, since 2479 * we have to preserve order. 2480 */ 2481 if (dontqueue) { 2482 splx(s); 2483 xs->error = XS_DRIVER_STUFFUP; 2484 return (TRY_AGAIN_LATER); 2485 } 2486 2487 /* 2488 * Swap with the first queue entry. 2489 */ 2490 ahc_xxx_enqueue(ahc, xs, 0); 2491 xs = ahc_xxx_dequeue(ahc); 2492 fromqueue = 1; 2493 } 2494 2495 get_scb: 2496 #endif /* __NetBSD__ */ 2497 /* 2498 * get an scb to use. If the transfer 2499 * is from a buf (possibly from interrupt time) 2500 * then we can't allow it to sleep 2501 */ 2502 flags = xs->flags; 2503 if (flags & ITSDONE) { 2504 printf("%s: Already done?", ahc_name(ahc)); 2505 xs->flags &= ~ITSDONE; 2506 } 2507 if (!(flags & INUSE)) { 2508 printf("%s: Not in use?", ahc_name(ahc)); 2509 xs->flags |= INUSE; 2510 } 2511 if (!(scb = ahc_get_scb(ahc, flags))) { 2512 #if defined(__NetBSD__) /* XXX */ 2513 /* 2514 * If we can't queue, we lose. 2515 */ 2516 if (dontqueue) { 2517 splx(s); 2518 xs->error = XS_DRIVER_STUFFUP; 2519 return (TRY_AGAIN_LATER); 2520 } 2521 2522 /* 2523 * If we were pulled off the queue, put ourselves 2524 * back in the front, otherwise tack ourselves onto 2525 * the end. 2526 */ 2527 ahc_xxx_enqueue(ahc, xs, fromqueue); 2528 2529 splx(s); 2530 return (SUCCESSFULLY_QUEUED); 2531 #else 2532 xs->error = XS_DRIVER_STUFFUP; 2533 return (TRY_AGAIN_LATER); 2534 #endif /* __NetBSD__ */ 2535 } 2536 2537 #if defined(__NetBSD__) 2538 /* we're done playing with the queue */ 2539 splx(s); 2540 #endif 2541 2542 SC_DEBUG(xs->sc_link, SDEV_DB3, ("start scb(%p)\n", scb)); 2543 scb->xs = xs; 2544 if (flags & SCSI_RESET) { 2545 scb->flags |= SCB_DEVICE_RESET|SCB_IMMED; 2546 scb->control |= MK_MESSAGE; 2547 } 2548 /* 2549 * Put all the arguments for the xfer in the scb 2550 */ 2551 2552 if(ahc->tagenable & mask) { 2553 scb->control |= TAG_ENB; 2554 if(ahc->orderedtag & mask) { 2555 printf("Ordered Tag sent\n"); 2556 scb->control |= 0x02; 2557 ahc->orderedtag &= ~mask; 2558 } 2559 } 2560 if(ahc->discenable & mask) 2561 scb->control |= DISCENB; 2562 if((ahc->needwdtr & mask) && !(ahc->wdtrpending & mask)) 2563 { 2564 scb->control |= MK_MESSAGE; 2565 scb->flags |= SCB_MSGOUT_WDTR; 2566 ahc->wdtrpending |= mask; 2567 } 2568 else if((ahc->needsdtr & mask) && !(ahc->sdtrpending & mask)) 2569 { 2570 scb->control |= MK_MESSAGE; 2571 scb->flags |= SCB_MSGOUT_SDTR; 2572 ahc->sdtrpending |= mask; 2573 } 2574 scb->tcl = ((xs->sc_link->AIC_SCSI_TARGET << 4) & 0xF0) | 2575 #if defined(__FreeBSD__) 2576 ((u_long)xs->sc_link->fordriver & 0x08) | 2577 #elif defined(__NetBSD__) 2578 (IS_SCSIBUS_B(ahc,xs->sc_link)? SELBUSB : 0)| 2579 #endif 2580 (xs->sc_link->AIC_SCSI_LUN & 0x07); 2581 scb->cmdlen = xs->cmdlen; 2582 scb->cmdpointer = KVTOPHYS(xs->cmd); 2583 xs->resid = 0; 2584 xs->status = 0; 2585 if (xs->datalen) { /* should use S/G only if not zero length */ 2586 scb->SG_list_pointer = KVTOPHYS(scb->ahc_dma); 2587 sg = scb->ahc_dma; 2588 seg = 0; 2589 /* 2590 * Set up the scatter gather block 2591 */ 2592 SC_DEBUG(xs->sc_link, SDEV_DB4, 2593 ("%ld @%p:- ", (long)xs->datalen, xs->data)); 2594 datalen = xs->datalen; 2595 thiskv = (unsigned long) xs->data; 2596 thisphys = KVTOPHYS(thiskv); 2597 2598 while ((datalen) && (seg < AHC_NSEG)) { 2599 bytes_this_seg = 0; 2600 2601 /* put in the base address */ 2602 sg->addr = thisphys; 2603 2604 SC_DEBUGN(xs->sc_link, SDEV_DB4, ("0x%lx", (u_long)thisphys)); 2605 2606 /* do it at least once */ 2607 nextphys = thisphys; 2608 while ((datalen) && (thisphys == nextphys)) { 2609 /* 2610 * This page is contiguous (physically) 2611 * with the the last, just extend the 2612 * length 2613 */ 2614 /* how far to the end of the page */ 2615 nextphys = (thisphys & (~(PAGE_SIZE- 1))) 2616 + PAGE_SIZE; 2617 bytes_this_page = nextphys - thisphys; 2618 /**** or the data ****/ 2619 bytes_this_page = min(bytes_this_page, datalen); 2620 bytes_this_seg += bytes_this_page; 2621 datalen -= bytes_this_page; 2622 2623 /* get more ready for the next page */ 2624 nextkv = thiskv; 2625 nextkv &= ~((unsigned long) PAGE_SIZE - 1); 2626 nextkv += PAGE_SIZE; 2627 if (datalen) 2628 thisphys = KVTOPHYS(nextkv); 2629 thiskv = nextkv; 2630 } 2631 /* 2632 * next page isn't contiguous, finish the seg 2633 */ 2634 SC_DEBUGN(xs->sc_link, SDEV_DB4, 2635 ("(0x%x)", bytes_this_seg)); 2636 sg->len = bytes_this_seg; 2637 sg++; 2638 seg++; 2639 } 2640 scb->SG_segment_count = seg; 2641 2642 /* Copy the first SG into the data pointer area */ 2643 scb->data = scb->ahc_dma->addr; 2644 scb->datalen = scb->ahc_dma->len; 2645 SC_DEBUGN(xs->sc_link, SDEV_DB4, ("\n")); 2646 if (datalen) { 2647 /* there's still data, must have run out of segs! */ 2648 printf("%s: ahc_scsi_cmd: more than %d DMA segs\n", 2649 ahc_name(ahc), AHC_NSEG); 2650 xs->error = XS_DRIVER_STUFFUP; 2651 ahc_free_scb(ahc, scb, flags); 2652 return (COMPLETE); 2653 } 2654 #ifdef AHC_BROKEN_CACHE 2655 if (ahc_broken_cache) 2656 INVALIDATE_CACHE(); 2657 #endif 2658 } 2659 else { 2660 /* 2661 * No data xfer, use non S/G values 2662 */ 2663 scb->SG_segment_count = 0; 2664 scb->SG_list_pointer = 0; 2665 scb->data = 0; 2666 scb->datalen = 0; 2667 } 2668 2669 #ifdef AHC_DEBUG 2670 if((ahc_debug & AHC_SHOWSCBS) && 2671 (xs->sc_link->AIC_SCSI_TARGET == DEBUGTARG)) 2672 ahc_print_scb(scb); 2673 #endif 2674 s = splbio(); 2675 2676 if( scb->position != SCB_LIST_NULL ) 2677 { 2678 /* We already have a valid slot */ 2679 u_char curscb; 2680 2681 pause_sequencer(ahc); 2682 curscb = AHC_INB(ahc, SCBPTR); 2683 AHC_OUTB(ahc, SCBPTR, scb->position); 2684 ahc_send_scb(ahc, scb); 2685 AHC_OUTB(ahc, SCBPTR, curscb); 2686 AHC_OUTB(ahc, QINFIFO, scb->position); 2687 unpause_sequencer(ahc, /*unpause_always*/FALSE); 2688 scb->flags |= SCB_ACTIVE; 2689 if (!(flags & SCSI_NOMASK)) { 2690 timeout(ahc_timeout, (caddr_t)scb, 2691 (xs->timeout * hz) / 1000); 2692 } 2693 SC_DEBUG(xs->sc_link, SDEV_DB3, ("cmd_sent\n")); 2694 } 2695 else { 2696 scb->flags |= SCB_WAITINGQ; 2697 STAILQ_INSERT_TAIL(&ahc->waiting_scbs, scb, links); 2698 ahc_run_waiting_queues(ahc); 2699 } 2700 if (!(flags & SCSI_NOMASK)) { 2701 splx(s); 2702 return (SUCCESSFULLY_QUEUED); 2703 } 2704 /* 2705 * If we can't use interrupts, poll for completion 2706 */ 2707 SC_DEBUG(xs->sc_link, SDEV_DB3, ("cmd_poll\n")); 2708 do { 2709 if (ahc_poll(ahc, xs->timeout)) { 2710 if (!(xs->flags & SCSI_SILENT)) 2711 printf("cmd fail\n"); 2712 ahc_timeout(scb); 2713 break; 2714 } 2715 } while (!(xs->flags & ITSDONE)); /* a non command complete intr */ 2716 splx(s); 2717 return (COMPLETE); 2718 } 2719 2720 2721 /* 2722 * A scb (and hence an scb entry on the board) is put onto the 2723 * free list. 2724 */ 2725 static void 2726 ahc_free_scb(ahc, scb, flags) 2727 struct ahc_data *ahc; 2728 int flags; 2729 struct scb *scb; 2730 { 2731 struct scb *wscb; 2732 unsigned int opri; 2733 2734 opri = splbio(); 2735 2736 /* Clean up for the next user */ 2737 scb->flags = SCB_FREE; 2738 scb->control = 0; 2739 scb->status = 0; 2740 2741 if(scb->position == SCB_LIST_NULL) { 2742 STAILQ_INSERT_HEAD(&ahc->page_scbs, scb, links); 2743 if(!scb->links.stqe_next && !ahc->free_scbs.stqh_first) 2744 /* 2745 * If there were no SCBs available, wake anybody waiting 2746 * for one to come free. 2747 */ 2748 wakeup((caddr_t)&ahc->free_scbs); 2749 } 2750 /* 2751 * If there are any SCBS on the waiting queue, 2752 * assign the slot of this "freed" SCB to the first 2753 * one. We'll run the waiting queues after all command 2754 * completes for a particular interrupt are completed 2755 * or when we start another command. 2756 */ 2757 else if((wscb = ahc->waiting_scbs.stqh_first) != NULL) { 2758 STAILQ_REMOVE_HEAD(&ahc->waiting_scbs, links); 2759 wscb->position = scb->position; 2760 STAILQ_INSERT_TAIL(&ahc->assigned_scbs, wscb, links); 2761 wscb->flags ^= SCB_WAITINGQ|SCB_ASSIGNEDQ; 2762 2763 /* 2764 * The "freed" SCB will need to be assigned a slot 2765 * before being used, so put it in the page_scbs 2766 * queue. 2767 */ 2768 scb->position = SCB_LIST_NULL; 2769 STAILQ_INSERT_HEAD(&ahc->page_scbs, scb, links); 2770 if(!scb->links.stqe_next && !ahc->free_scbs.stqh_first) 2771 /* 2772 * If there were no SCBs available, wake anybody waiting 2773 * for one to come free. 2774 */ 2775 wakeup((caddr_t)&ahc->free_scbs); 2776 } 2777 else { 2778 STAILQ_INSERT_HEAD(&ahc->free_scbs, scb, links); 2779 if(!scb->links.stqe_next && !ahc->page_scbs.stqh_first) 2780 /* 2781 * If there were no SCBs available, wake anybody waiting 2782 * for one to come free. 2783 */ 2784 wakeup((caddr_t)&ahc->free_scbs); 2785 } 2786 #ifdef AHC_DEBUG 2787 ahc->activescbs--; 2788 #endif 2789 splx(opri); 2790 } 2791 2792 /* 2793 * Get a free scb, either one already assigned to a hardware slot 2794 * on the adapter or one that will require an SCB to be paged out before 2795 * use. If there are none, see if we can allocate a new SCB. Otherwise 2796 * either return an error or sleep. 2797 */ 2798 static struct scb * 2799 ahc_get_scb(ahc, flags) 2800 struct ahc_data *ahc; 2801 int flags; 2802 { 2803 unsigned opri; 2804 struct scb *scbp; 2805 2806 opri = splbio(); 2807 /* 2808 * If we can and have to, sleep waiting for one to come free 2809 * but only if we can't allocate a new one. 2810 */ 2811 while (1) { 2812 if((scbp = ahc->free_scbs.stqh_first)) { 2813 STAILQ_REMOVE_HEAD(&ahc->free_scbs, links); 2814 } 2815 else if((scbp = ahc->page_scbs.stqh_first)) { 2816 STAILQ_REMOVE_HEAD(&ahc->page_scbs, links); 2817 } 2818 else if(ahc->numscbs < ahc->maxscbs) { 2819 scbp = (struct scb *) malloc(sizeof(struct scb), 2820 M_TEMP, M_NOWAIT); 2821 if (scbp) { 2822 bzero(scbp, sizeof(struct scb)); 2823 scbp->tag = ahc->numscbs; 2824 if( ahc->numscbs < ahc->maxhscbs ) 2825 scbp->position = ahc->numscbs; 2826 else 2827 scbp->position = SCB_LIST_NULL; 2828 ahc->numscbs++; 2829 /* 2830 * Place in the scbarray 2831 * Never is removed. 2832 */ 2833 ahc->scbarray[scbp->tag] = scbp; 2834 } 2835 else { 2836 printf("%s: Can't malloc SCB\n", 2837 ahc_name(ahc)); 2838 } 2839 } 2840 else { 2841 if (!(flags & SCSI_NOSLEEP)) { 2842 tsleep((caddr_t)&ahc->free_scbs, PRIBIO, 2843 "ahcscb", 0); 2844 continue; 2845 } 2846 } 2847 break; 2848 } 2849 2850 #ifdef AHC_DEBUG 2851 if (scbp) { 2852 ahc->activescbs++; 2853 if((ahc_debug & AHC_SHOWSCBCNT) 2854 && (ahc->activescbs == ahc->maxhscbs)) 2855 printf("%s: Max SCBs active\n", ahc_name(ahc)); 2856 } 2857 #endif 2858 2859 splx(opri); 2860 2861 return (scbp); 2862 } 2863 2864 static void ahc_loadseq(ahc) 2865 struct ahc_data *ahc; 2866 { 2867 static u_char seqprog[] = { 2868 #if defined(__FreeBSD__) 2869 # include "aic7xxx_seq.h" 2870 #endif 2871 #if defined(__NetBSD__) 2872 # include <dev/microcode/aic7xxx/aic7xxx_seq.h> 2873 #endif 2874 }; 2875 2876 AHC_OUTB(ahc, SEQCTL, PERRORDIS|SEQRESET|LOADRAM); 2877 2878 AHC_OUTSB(ahc, SEQRAM, seqprog, sizeof(seqprog)); 2879 2880 do { 2881 AHC_OUTB(ahc, SEQCTL, SEQRESET|FASTMODE); 2882 } while((AHC_INB(ahc, SEQADDR0) != 0) 2883 || (AHC_INB(ahc, SEQADDR1) != 0)); 2884 } 2885 2886 /* 2887 * Function to poll for command completion when 2888 * interrupts are disabled (crash dumps) 2889 */ 2890 static int 2891 ahc_poll(ahc, wait) 2892 struct ahc_data *ahc; 2893 int wait; /* in msec */ 2894 { 2895 while (--wait) { 2896 DELAY(1000); 2897 if (AHC_INB(ahc, INTSTAT) & INT_PEND) 2898 break; 2899 } if (wait == 0) { 2900 printf("%s: board is not responding\n", ahc_name(ahc)); 2901 return (EIO); 2902 } 2903 ahc_intr((void *)ahc); 2904 return (0); 2905 } 2906 2907 static void 2908 ahc_timeout(arg) 2909 void *arg; 2910 { 2911 struct scb *scb = (struct scb *)arg; 2912 struct ahc_data *ahc; 2913 int s, found; 2914 u_char bus_state; 2915 char channel; 2916 2917 s = splbio(); 2918 2919 if (!(scb->flags & SCB_ACTIVE)) { 2920 /* Previous timeout took care of me already */ 2921 splx(s); 2922 return; 2923 } 2924 2925 ahc = (struct ahc_data *)scb->xs->sc_link->adapter_softc; 2926 2927 if (ahc->in_timeout) { 2928 /* 2929 * Some other SCB has started a recovery operation 2930 * and is still working on cleaning things up. 2931 */ 2932 if (scb->flags & SCB_TIMEDOUT) { 2933 /* 2934 * This SCB has been here before and is not the 2935 * recovery SCB. Cut our losses and panic. Its 2936 * better to do this than trash a filesystem. 2937 */ 2938 panic("%s: Timed-out command times out " 2939 "again\n", ahc_name(ahc)); 2940 } 2941 else if (!(scb->flags & SCB_ABORTED)) 2942 { 2943 /* 2944 * This is not the SCB that started this timeout 2945 * processing. Give this scb another lifetime so 2946 * that it can continue once we deal with the 2947 * timeout. 2948 */ 2949 scb->flags |= SCB_TIMEDOUT; 2950 timeout(ahc_timeout, (caddr_t)scb, 2951 (scb->xs->timeout * hz) / 1000); 2952 splx(s); 2953 return; 2954 } 2955 } 2956 ahc->in_timeout = TRUE; 2957 2958 /* 2959 * Ensure that the card doesn't do anything 2960 * behind our back. 2961 */ 2962 pause_sequencer(ahc); 2963 2964 scsi_print_addr(scb->xs->sc_link); 2965 printf("timed out "); 2966 /* 2967 * Take a snapshot of the bus state and print out 2968 * some information so we can track down driver bugs. 2969 */ 2970 bus_state = AHC_INB(ahc, LASTPHASE); 2971 2972 switch(bus_state & PHASE_MASK) 2973 { 2974 case P_DATAOUT: 2975 printf("in dataout phase"); 2976 break; 2977 case P_DATAIN: 2978 printf("in datain phase"); 2979 break; 2980 case P_COMMAND: 2981 printf("in command phase"); 2982 break; 2983 case P_MESGOUT: 2984 printf("in message out phase"); 2985 break; 2986 case P_STATUS: 2987 printf("in status phase"); 2988 break; 2989 case P_MESGIN: 2990 printf("in message in phase"); 2991 break; 2992 default: 2993 printf("while idle, LASTPHASE == 0x%x", 2994 bus_state); 2995 /* 2996 * We aren't in a valid phase, so assume we're 2997 * idle. 2998 */ 2999 bus_state = 0; 3000 break; 3001 } 3002 3003 printf(", SCSISIGI == 0x%x\n", AHC_INB(ahc, SCSISIGI)); 3004 3005 /* Decide our course of action */ 3006 3007 if(scb->flags & SCB_ABORTED) 3008 { 3009 /* 3010 * Been down this road before. 3011 * Do a full bus reset. 3012 */ 3013 char channel = (scb->tcl & SELBUSB) 3014 ? 'B': 'A'; 3015 found = ahc_reset_channel(ahc, channel, scb->tag, 3016 XS_TIMEOUT, /*Initiate Reset*/TRUE); 3017 printf("%s: Issued Channel %c Bus Reset #1. " 3018 "%d SCBs aborted\n", ahc_name(ahc), channel, found); 3019 ahc->in_timeout = FALSE; 3020 } 3021 else if(scb->control & TAG_ENB) { 3022 /* 3023 * We could be starving this command 3024 * try sending an ordered tag command 3025 * to the target we come from. 3026 */ 3027 scb->flags |= SCB_ABORTED|SCB_SENTORDEREDTAG; 3028 ahc->orderedtag |= 0xFF; 3029 timeout(ahc_timeout, (caddr_t)scb, (5 * hz)); 3030 unpause_sequencer(ahc, /*unpause_always*/FALSE); 3031 printf("Ordered Tag queued\n"); 3032 goto done; 3033 } 3034 else { 3035 /* 3036 * Send a Bus Device Reset Message: 3037 * The target that is holding up the bus may not 3038 * be the same as the one that triggered this timeout 3039 * (different commands have different timeout lengths). 3040 * It is also impossible to get a message to a target 3041 * if we are in a "frozen" data transfer phase. Our 3042 * strategy here is to queue a bus device reset message 3043 * to the timed out target if it is disconnected. 3044 * Otherwise, if we have an active target we stuff the 3045 * message buffer with a bus device reset message and 3046 * assert ATN in the hopes that the target will let go 3047 * of the bus and finally disconnect. If this fails, 3048 * we'll get another timeout 2 seconds later which will 3049 * cause a bus reset. 3050 * 3051 * XXX If the SCB is paged out, we simply reset the 3052 * bus. We should probably queue a new command 3053 * instead. 3054 */ 3055 3056 /* Test to see if scb is disconnected */ 3057 if( !(scb->flags & SCB_PAGED_OUT ) ){ 3058 u_char active_scb; 3059 struct scb *active_scbp; 3060 3061 active_scb = AHC_INB(ahc, SCBPTR); 3062 active_scbp = ahc->scbarray[AHC_INB(ahc, SCB_TAG)]; 3063 AHC_OUTB(ahc, SCBPTR, scb->position); 3064 3065 if(AHC_INB(ahc, SCB_CONTROL) & DISCONNECTED) { 3066 if(ahc->flags & AHC_PAGESCBS) { 3067 /* 3068 * Pull this SCB out of the 3069 * disconnected list. 3070 */ 3071 u_char prev = AHC_INB(ahc, SCB_PREV); 3072 u_char next = AHC_INB(ahc, SCB_NEXT); 3073 if(prev == SCB_LIST_NULL) { 3074 /* At the head */ 3075 AHC_OUTB(ahc, DISCONNECTED_SCBH, 3076 next ); 3077 } 3078 else { 3079 AHC_OUTB(ahc, SCBPTR, prev); 3080 AHC_OUTB(ahc, SCB_NEXT, next); 3081 if(next != SCB_LIST_NULL) { 3082 AHC_OUTB(ahc, SCBPTR, 3083 next); 3084 AHC_OUTB(ahc, SCB_PREV, 3085 prev); 3086 } 3087 AHC_OUTB(ahc, SCBPTR, 3088 scb->position); 3089 } 3090 } 3091 scb->flags |= SCB_DEVICE_RESET|SCB_ABORTED; 3092 scb->control &= DISCENB; 3093 scb->control |= MK_MESSAGE; 3094 scb->cmdlen = 0; 3095 scb->SG_segment_count = 0; 3096 scb->SG_list_pointer = 0; 3097 scb->data = 0; 3098 scb->datalen = 0; 3099 ahc_send_scb(ahc, scb); 3100 ahc_add_waiting_scb(ahc, scb); 3101 timeout(ahc_timeout, (caddr_t)scb, (2 * hz)); 3102 scsi_print_addr(scb->xs->sc_link); 3103 printf("BUS DEVICE RESET message queued.\n"); 3104 AHC_OUTB(ahc, SCBPTR, active_scb); 3105 unpause_sequencer(ahc, /*unpause_always*/FALSE); 3106 goto done; 3107 } 3108 /* Is the active SCB really active? */ 3109 else if((active_scbp->flags & SCB_ACTIVE) && bus_state){ 3110 AHC_OUTB(ahc, MSG_LEN, 1); 3111 AHC_OUTB(ahc, MSG0, MSG_BUS_DEV_RESET); 3112 AHC_OUTB(ahc, SCSISIGO, bus_state|ATNO); 3113 scsi_print_addr(active_scbp->xs->sc_link); 3114 printf("asserted ATN - device reset in " 3115 "message buffer\n"); 3116 active_scbp->flags |= SCB_DEVICE_RESET 3117 | SCB_ABORTED; 3118 if(active_scbp != scb) { 3119 untimeout(ahc_timeout, 3120 (caddr_t)active_scbp); 3121 /* Give scb a new lease on life */ 3122 timeout(ahc_timeout, (caddr_t)scb, 3123 (scb->xs->timeout * hz) / 1000); 3124 } 3125 timeout(ahc_timeout, (caddr_t)active_scbp, 3126 (2 * hz)); 3127 AHC_OUTB(ahc, SCBPTR, active_scb); 3128 unpause_sequencer(ahc, /*unpause_always*/FALSE); 3129 goto done; 3130 } 3131 } 3132 /* 3133 * No active target or a paged out SCB. 3134 * Try resetting the bus. 3135 */ 3136 channel = (scb->tcl & SELBUSB) ? 'B': 'A'; 3137 found = ahc_reset_channel(ahc, channel, scb->tag, 3138 XS_TIMEOUT, 3139 /*Initiate Reset*/TRUE); 3140 printf("%s: Issued Channel %c Bus Reset #2. " 3141 "%d SCBs aborted\n", ahc_name(ahc), channel, 3142 found); 3143 ahc->in_timeout = FALSE; 3144 } 3145 done: 3146 splx(s); 3147 } 3148 3149 3150 /* 3151 * The device at the given target/channel has been reset. Abort 3152 * all active and queued scbs for that target/channel. 3153 */ 3154 static int 3155 ahc_reset_device(ahc, target, channel, timedout_scb, xs_error) 3156 struct ahc_data *ahc; 3157 int target; 3158 char channel; 3159 u_char timedout_scb; 3160 u_int32_t xs_error; 3161 { 3162 struct scb *scbp; 3163 u_char active_scb; 3164 int i = 0; 3165 int found = 0; 3166 3167 /* restore this when we're done */ 3168 active_scb = AHC_INB(ahc, SCBPTR); 3169 3170 /* 3171 * Search the QINFIFO. 3172 */ 3173 { 3174 u_char saved_queue[AHC_SCB_MAX]; 3175 u_char queued = AHC_INB(ahc, QINCNT) & ahc->qcntmask; 3176 3177 for (i = 0; i < (queued - found); i++) { 3178 saved_queue[i] = AHC_INB(ahc, QINFIFO); 3179 AHC_OUTB(ahc, SCBPTR, saved_queue[i]); 3180 scbp = ahc->scbarray[AHC_INB(ahc, SCB_TAG)]; 3181 if (ahc_match_scb (scbp, target, channel)){ 3182 /* 3183 * We found an scb that needs to be aborted. 3184 */ 3185 scbp->flags = SCB_ABORTED|SCB_QUEUED_FOR_DONE; 3186 scbp->xs->error |= xs_error; 3187 if(scbp->position != timedout_scb) 3188 untimeout(ahc_timeout, (caddr_t)scbp); 3189 AHC_OUTB(ahc, SCB_CONTROL, 0); 3190 i--; 3191 found++; 3192 } 3193 } 3194 /* Now put the saved scbs back. */ 3195 for (queued = 0; queued < i; queued++) { 3196 AHC_OUTB(ahc, QINFIFO, saved_queue[queued]); 3197 } 3198 } 3199 3200 /* 3201 * Search waiting for selection list. 3202 */ 3203 { 3204 u_char next, prev; 3205 3206 next = AHC_INB(ahc, WAITING_SCBH); /* Start at head of list. */ 3207 prev = SCB_LIST_NULL; 3208 3209 while (next != SCB_LIST_NULL) { 3210 AHC_OUTB(ahc, SCBPTR, next); 3211 scbp = ahc->scbarray[AHC_INB(ahc, SCB_TAG)]; 3212 /* 3213 * Select the SCB. 3214 */ 3215 if (ahc_match_scb(scbp, target, channel)) { 3216 next = ahc_abort_wscb(ahc, scbp, prev, 3217 timedout_scb, xs_error); 3218 found++; 3219 } 3220 else { 3221 prev = next; 3222 next = AHC_INB(ahc, SCB_NEXT); 3223 } 3224 } 3225 } 3226 /* 3227 * Go through the entire SCB array now and look for 3228 * commands for this target that are active. These 3229 * are other (most likely tagged) commands that 3230 * were disconnected when the reset occured. 3231 */ 3232 for(i = 0; i < ahc->numscbs; i++) { 3233 scbp = ahc->scbarray[i]; 3234 if((scbp->flags & SCB_ACTIVE) 3235 && ahc_match_scb(scbp, target, channel)) { 3236 /* Ensure the target is "free" */ 3237 ahc_unbusy_target(ahc, target, channel); 3238 if( !(scbp->flags & SCB_PAGED_OUT) ) 3239 { 3240 AHC_OUTB(ahc, SCBPTR, scbp->position); 3241 AHC_OUTB(ahc, SCB_CONTROL, 0); 3242 } 3243 scbp->flags = SCB_ABORTED|SCB_QUEUED_FOR_DONE; 3244 scbp->xs->error |= xs_error; 3245 if(scbp->tag != timedout_scb) 3246 untimeout(ahc_timeout, (caddr_t)scbp); 3247 found++; 3248 } 3249 } 3250 AHC_OUTB(ahc, SCBPTR, active_scb); 3251 return found; 3252 } 3253 3254 /* 3255 * Manipulate the waiting for selection list and return the 3256 * scb that follows the one that we remove. 3257 */ 3258 static u_char 3259 ahc_abort_wscb (ahc, scbp, prev, timedout_scb, xs_error) 3260 struct ahc_data *ahc; 3261 struct scb *scbp; 3262 u_char prev; 3263 u_char timedout_scb; 3264 u_int32_t xs_error; 3265 { 3266 u_char curscbp, next; 3267 int target = ((scbp->tcl >> 4) & 0x0f); 3268 char channel = (scbp->tcl & SELBUSB) ? 'B' : 'A'; 3269 /* 3270 * Select the SCB we want to abort and 3271 * pull the next pointer out of it. 3272 */ 3273 curscbp = AHC_INB(ahc, SCBPTR); 3274 AHC_OUTB(ahc, SCBPTR, scbp->position); 3275 next = AHC_INB(ahc, SCB_NEXT); 3276 3277 /* Clear the necessary fields */ 3278 AHC_OUTB(ahc, SCB_CONTROL, 0); 3279 AHC_OUTB(ahc, SCB_NEXT, SCB_LIST_NULL); 3280 ahc_unbusy_target(ahc, target, channel); 3281 3282 /* update the waiting list */ 3283 if( prev == SCB_LIST_NULL ) 3284 /* First in the list */ 3285 AHC_OUTB(ahc, WAITING_SCBH, next); 3286 else { 3287 /* 3288 * Select the scb that pointed to us 3289 * and update its next pointer. 3290 */ 3291 AHC_OUTB(ahc, SCBPTR, prev); 3292 AHC_OUTB(ahc, SCB_NEXT, next); 3293 } 3294 /* 3295 * Point us back at the original scb position 3296 * and inform the SCSI system that the command 3297 * has been aborted. 3298 */ 3299 AHC_OUTB(ahc, SCBPTR, curscbp); 3300 scbp->flags = SCB_ABORTED|SCB_QUEUED_FOR_DONE; 3301 scbp->xs->error |= xs_error; 3302 if(scbp->tag != timedout_scb) 3303 untimeout(ahc_timeout, (caddr_t)scbp); 3304 return next; 3305 } 3306 3307 static void 3308 ahc_busy_target(ahc, target, channel) 3309 struct ahc_data *ahc; 3310 u_char target; 3311 char channel; 3312 { 3313 u_char active; 3314 u_long active_port = ACTIVE_A; 3315 3316 if(target > 0x07 || channel == 'B') { 3317 /* 3318 * targets on the Second channel or 3319 * above id 7 store info in byte two 3320 * of HA_ACTIVE 3321 */ 3322 active_port++; 3323 } 3324 active = AHC_INB(ahc, active_port); 3325 active |= (0x01 << (target & 0x07)); 3326 AHC_OUTB(ahc, active_port, active); 3327 } 3328 3329 static void 3330 ahc_unbusy_target(ahc, target, channel) 3331 struct ahc_data *ahc; 3332 u_char target; 3333 char channel; 3334 { 3335 u_char active; 3336 u_long active_port = ACTIVE_A; 3337 3338 if(target > 0x07 || channel == 'B') { 3339 /* 3340 * targets on the Second channel or 3341 * above id 7 store info in byte two 3342 * of HA_ACTIVE 3343 */ 3344 active_port++; 3345 } 3346 active = AHC_INB(ahc, active_port); 3347 active &= ~(0x01 << (target & 0x07)); 3348 AHC_OUTB(ahc, active_port, active); 3349 } 3350 3351 static void 3352 ahc_reset_current_bus(ahc) 3353 struct ahc_data *ahc; 3354 { 3355 AHC_OUTB(ahc, SCSISEQ, SCSIRSTO); 3356 DELAY(1000); 3357 AHC_OUTB(ahc, SCSISEQ, 0); 3358 } 3359 3360 static int 3361 ahc_reset_channel(ahc, channel, timedout_scb, xs_error, initiate_reset) 3362 struct ahc_data *ahc; 3363 char channel; 3364 u_char timedout_scb; 3365 u_int32_t xs_error; 3366 u_char initiate_reset; 3367 { 3368 u_char sblkctl; 3369 char cur_channel; 3370 u_long offset, offset_max; 3371 int found; 3372 3373 /* 3374 * Clean up all the state information for the 3375 * pending transactions on this bus. 3376 */ 3377 found = ahc_reset_device(ahc, ALL_TARGETS, channel, 3378 timedout_scb, xs_error); 3379 if(channel == 'B'){ 3380 ahc->needsdtr |= (ahc->needsdtr_orig & 0xff00); 3381 ahc->sdtrpending &= 0x00ff; 3382 AHC_OUTB(ahc, ACTIVE_B, 0); 3383 offset = TARG_SCRATCH + 8; 3384 offset_max = TARG_SCRATCH + 16; 3385 } 3386 else if (ahc->type & AHC_WIDE){ 3387 ahc->needsdtr = ahc->needsdtr_orig; 3388 ahc->needwdtr = ahc->needwdtr_orig; 3389 ahc->sdtrpending = 0; 3390 ahc->wdtrpending = 0; 3391 AHC_OUTB(ahc, ACTIVE_A, 0); 3392 AHC_OUTB(ahc, ACTIVE_B, 0); 3393 offset = TARG_SCRATCH; 3394 offset_max = TARG_SCRATCH + 16; 3395 } 3396 else{ 3397 ahc->needsdtr |= (ahc->needsdtr_orig & 0x00ff); 3398 ahc->sdtrpending &= 0xff00; 3399 AHC_OUTB(ahc, ACTIVE_A, 0); 3400 offset = TARG_SCRATCH; 3401 offset_max = TARG_SCRATCH + 8; 3402 } 3403 for(;offset < offset_max;offset++) { 3404 /* 3405 * Revert to async/narrow transfers 3406 * until we renegotiate. 3407 */ 3408 u_char targ_scratch; 3409 3410 targ_scratch = AHC_INB(ahc, offset); 3411 targ_scratch &= SXFR; 3412 AHC_OUTB(ahc, offset, targ_scratch); 3413 } 3414 3415 /* 3416 * Reset the bus if we are initiating this reset and 3417 * restart/unpause the sequencer 3418 */ 3419 /* Case 1: Command for another bus is active */ 3420 sblkctl = AHC_INB(ahc, SBLKCTL); 3421 cur_channel = (sblkctl & SELBUSB) ? 'B' : 'A'; 3422 if(cur_channel != channel) 3423 { 3424 /* 3425 * Stealthily reset the other bus 3426 * without upsetting the current bus 3427 */ 3428 AHC_OUTB(ahc, SBLKCTL, sblkctl ^ SELBUSB); 3429 if( initiate_reset ) 3430 { 3431 ahc_reset_current_bus(ahc); 3432 } 3433 AHC_OUTB(ahc, CLRSINT1, CLRSCSIRSTI|CLRSELTIMEO); 3434 AHC_OUTB(ahc, CLRINT, CLRSCSIINT); 3435 AHC_OUTB(ahc, SBLKCTL, sblkctl); 3436 unpause_sequencer(ahc, /*unpause_always*/TRUE); 3437 } 3438 /* Case 2: A command from this bus is active or we're idle */ 3439 else { 3440 if( initiate_reset ) 3441 { 3442 ahc_reset_current_bus(ahc); 3443 } 3444 AHC_OUTB(ahc, CLRSINT1, CLRSCSIRSTI|CLRSELTIMEO); 3445 AHC_OUTB(ahc, CLRINT, CLRSCSIINT); 3446 restart_sequencer(ahc); 3447 } 3448 ahc_run_done_queue(ahc); 3449 return found; 3450 } 3451 3452 void 3453 ahc_run_done_queue(ahc) 3454 struct ahc_data *ahc; 3455 { 3456 int i; 3457 struct scb *scbp; 3458 3459 for(i = 0; i < ahc->numscbs; i++) { 3460 scbp = ahc->scbarray[i]; 3461 if(scbp->flags & SCB_QUEUED_FOR_DONE) 3462 ahc_done(ahc, scbp); 3463 } 3464 } 3465 3466 static int 3467 ahc_match_scb (scb, target, channel) 3468 struct scb *scb; 3469 int target; 3470 char channel; 3471 { 3472 int targ = (scb->tcl >> 4) & 0x0f; 3473 char chan = (scb->tcl & SELBUSB) ? 'B' : 'A'; 3474 3475 if (target == ALL_TARGETS) 3476 return (chan == channel); 3477 else 3478 return ((chan == channel) && (targ == target)); 3479 } 3480 3481 3482 static void 3483 ahc_construct_sdtr(ahc, start_byte, period, offset) 3484 struct ahc_data *ahc; 3485 int start_byte; 3486 u_int8_t period; 3487 u_int8_t offset; 3488 { 3489 AHC_OUTB(ahc, MSG0 + start_byte, MSG_EXTENDED); 3490 AHC_OUTB(ahc, MSG1 + start_byte, MSG_EXT_SDTR_LEN); 3491 AHC_OUTB(ahc, MSG2 + start_byte, MSG_EXT_SDTR); 3492 AHC_OUTB(ahc, MSG3 + start_byte, period); 3493 AHC_OUTB(ahc, MSG4 + start_byte, offset); 3494 AHC_OUTB(ahc, MSG_LEN, start_byte + 5); 3495 } 3496 3497 static void 3498 ahc_construct_wdtr(ahc, start_byte, bus_width) 3499 struct ahc_data *ahc; 3500 int start_byte; 3501 u_int8_t bus_width; 3502 { 3503 AHC_OUTB(ahc, MSG0 + start_byte, MSG_EXTENDED); 3504 AHC_OUTB(ahc, MSG1 + start_byte, MSG_EXT_WDTR_LEN); 3505 AHC_OUTB(ahc, MSG2 + start_byte, MSG_EXT_WDTR); 3506 AHC_OUTB(ahc, MSG3 + start_byte, bus_width); 3507 AHC_OUTB(ahc, MSG_LEN, start_byte + 4); 3508 } 3509