1 /* 2 * @(#)aha274x.c 1.29 94/10/29 jda 3 * 4 * Adaptec 274x device driver for Linux. 5 * Copyright (c) 1994 The University of Calgary Department of Computer Science. 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License as published by 9 * the Free Software Foundation; either version 2 of the License, or 10 * (at your option) any later version. 11 * 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with this program; if not, write to the Free Software 19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20 * 21 * Sources include the Adaptec 1740 driver (aha1740.c), the 22 * Ultrastor 24F driver (ultrastor.c), various Linux kernel 23 * source, the Adaptec EISA config file (!adp7771.cfg), the 24 * Adaptec AHA-2740A Series User's Guide, the Linux Kernel 25 * Hacker's Guide, Writing a SCSI Device Driver for Linux, 26 * the Adaptec 1542 driver (aha1542.c), the Adaptec EISA 27 * overlay file (adp7770.ovl), the Adaptec AHA-2740 Series 28 * Technical Reference Manual, the Adaptec AIC-7770 Data 29 * Book, the ANSI SCSI specification, the ANSI SCSI-2 30 * specification (draft 10c), ... 31 * 32 * On a twin-bus adapter card, channel B is ignored. Rationale: 33 * it would greatly complicate the sequencer and host driver code, 34 * and both busses are multiplexed on to the EISA bus anyway. So 35 * I don't really see any technical advantage to supporting both. 36 * 37 * As well, multiple adapter card using the same IRQ level are 38 * not supported. It doesn't make sense to configure the cards 39 * this way from a performance standpoint. Not to mention that 40 * the kernel would have to support two devices per registered IRQ. 41 */ 42
43 #include <stdarg.h>
44 #include <asm/io.h>
45 #include <linux/string.h>
46 #include <linux/kernel.h>
47 #include <linux/ioport.h>
48 #include <linux/delay.h>
49
50 #include "../block/blk.h"
51 #include "sd.h"
52 #include "scsi.h"
53 #include "hosts.h"
54 #include "aha274x.h"
55
56 /* 57 * There should be a specific return value for this in scsi.h, but 58 * it seems that most drivers ignore it. 59 */ 60 #defineDID_UNDERFLOWDID_ERROR 61
62 /* EISA stuff */ 63
64 #defineMINEISA 1
65 #defineMAXEISA 15
66 #defineSLOTBASE(x) ((x) << 12)
67
68 #defineMAXIRQ 15
69
70 /* AIC-7770 offset definitions */ 71
72 #defineO_MINREG(x) ((x) + 0xc00) /* i/o range to reserve */ 73 #defineO_MAXREG(x) ((x) + 0xcbf)
74
75 #defineO_SCSISEQ(x) ((x) + 0xc00) /* scsi sequence control */ 76 #defineO_SCSISIGI(x) ((x) + 0xc03) /* scsi control signal read */ 77 #defineO_SCSISIGO(x) ((x) + 0xc03) /* scsi control signal write */ 78 #defineO_SCSIID(x) ((x) + 0xc05) /* scsi id */ 79 #define O_SSTAT0(x) ((x) + 0xc0b) /* scsi status register 0 */ 80 #defineO_CLRSINT1(x) ((x) + 0xc0c) /* clear scsi interrupt 1 */ 81 #defineO_SSTAT1(x) ((x) + 0xc0c) /* scsi status register 1 */ 82 #defineO_SELID(x) ((x) + 0xc19) /* [re]selection id */ 83 #defineO_SBLKCTL(x) ((x) + 0xc1f) /* scsi block control */ 84 #defineO_SEQCTL(x) ((x) + 0xc60) /* sequencer control */ 85 #defineO_SEQRAM(x) ((x) + 0xc61) /* sequencer ram data */ 86 #defineO_SEQADDR(x) ((x) + 0xc62) /* sequencer address (W) */ 87 #defineO_BIDx(x) ((x) + 0xc80) /* board id */ 88 #defineO_BCTL(x) ((x) + 0xc84) /* board control */ 89 #defineO_HCNTRL(x) ((x) + 0xc87) /* host control */ 90 #defineO_SCBPTR(x) ((x) + 0xc90) /* scb pointer */ 91 #defineO_INTSTAT(x) ((x) + 0xc91) /* interrupt status */ 92 #defineO_ERROR(x) ((x) + 0xc92) /* hard error */ 93 #defineO_CLRINT(x) ((x) + 0xc92) /* clear interrupt status */ 94 #defineO_SCBCNT(x) ((x) + 0xc9a) /* scb auto increment */ 95 #defineO_QINFIFO(x) ((x) + 0xc9b) /* queue in fifo */ 96 #defineO_QINCNT(x) ((x) + 0xc9c) /* queue in count */ 97 #defineO_QOUTFIFO(x) ((x) + 0xc9d) /* queue out fifo */ 98 #defineO_QOUTCNT(x) ((x) + 0xc9e) /* queue out count */ 99 #defineO_SCBARRAY(x) ((x) + 0xca0) /* scb array start */ 100
101 /* host adapter offset definitions */ 102
103 #defineHA_REJBYTE(x) ((x) + 0xc31) /* 1st message in byte */ 104 #defineHA_MSG_FLAGS(x) ((x) + 0xc35) /* outgoing message flag */ 105 #defineHA_MSG_LEN(x) ((x) + 0xc36) /* outgoing message length */ 106 #defineHA_MSG_START(x) ((x) + 0xc37) /* outgoing message body */ 107 #defineHA_ARG_1(x) ((x) + 0xc4c) /* sdtr <-> rate parameters */ 108 #defineHA_ARG_2(x) ((x) + 0xc4d)
109 #defineHA_RETURN_1(x) ((x) + 0xc4c)
110 #define HA_RETURN_2(x) ((x) + 0xc4d)
111 #defineHA_SIGSTATE(x) ((x) + 0xc4e) /* value in SCSISIGO */ 112 #defineHA_NEEDSDTR(x) ((x) + 0xc4f) /* synchronous negotiation? */ 113
114 #defineHA_SCSICONF(x) ((x) + 0xc5a) /* SCSI config register */ 115 #defineHA_INTDEF(x) ((x) + 0xc5c) /* interrupt def'n register */ 116 #defineHA_HOSTCONF(x) ((x) + 0xc5d) /* host config def'n register */ 117
118 /* debugging code */ 119
120 #defineAHA274X_DEBUG 121
122 /* 123 * If a parity error occurs during a data transfer phase, run the 124 * command to completion - it's easier that way - making a note 125 * of the error condition in this location. This then will modify 126 * a DID_OK status into a DID_PARITY one for the higher-level SCSI 127 * code. 128 */ 129 #defineaha274x_parity(cmd) ((cmd)->SCp.Status)
130
131 /* 132 * Since the sequencer code DMAs the scatter-gather structures 133 * directly from memory, we use this macro to assert that the 134 * kernel structure hasn't changed. 135 */ 136 #defineSG_STRUCT_CHECK(sg) \
137 ((char *)&(sg).address - (char *)&(sg) != 0 || \
138 (char *)&(sg).length - (char *)&(sg) != 8 || \
139 sizeof((sg).address) != 4 || \
140 sizeof((sg).length) != 4 || \
141 sizeof(sg) != 12)
142
143 /* 144 * "Static" structures. Note that these are NOT initialized 145 * to zero inside the kernel - we have to initialize them all 146 * explicitly. 147 * 148 * We support a maximum of one adapter card per IRQ level (see the 149 * rationale for this above). On an interrupt, use the IRQ as an 150 * index into aha274x_boards[] to locate the card information. 151 */ 152 staticstructScsi_Host *aha274x_boards[MAXIRQ + 1];
153
154 structaha274x_host{ 155 intbase; /* card base address */ 156 intstartup; /* intr type check */ 157 volatileintunpause; /* value for HCNTRL */ 158 volatileScsi_Cmnd *SCB_array[AHA274X_MAXSCB]; /* active commands */ 159 };
160
161 structaha274x_scb{ 162 unsignedcharcontrol;
163 unsignedchartarget_channel_lun; /* 4/1/3 bits */ 164 unsignedcharSG_segment_count;
165 unsignedcharSG_list_pointer[4];
166 unsignedcharSCSI_cmd_pointer[4];
167 unsignedcharSCSI_cmd_length;
168 unsignedcharRESERVED[2]; /* must be zero */ 169 unsignedchartarget_status;
170 unsignedcharresidual_data_count[3];
171 unsignedcharresidual_SG_segment_count;
172 unsignedchardata_pointer[4];
173 unsignedchardata_count[3];
174 #if 0
175 /* 176 * No real point in transferring this to the 177 * SCB registers. 178 */ 179 unsignedcharRESERVED[6];
180 #endif 181 };
182
183 /* 184 * NB. This table MUST be ordered shortest period first. 185 */ 186 staticstruct{ 187 shortperiod;
188 shortrate;
189 char *english;
190 }aha274x_synctab[] = { 191 {100, 0, "10.0"},
192 {125, 1, "8.0"},
193 {150, 2, "6.67"},
194 {175, 3, "5.7"},
195 {200, 4, "5.0"},
196 {225, 5, "4.4"},
197 {250, 6, "4.0"},
198 {275, 7, "3.6"} 199 };
200
201 staticintaha274x_synctab_max =
202 sizeof(aha274x_synctab) / sizeof(aha274x_synctab[0]);
203
204 enumaha_type{ 205 T_NONE,
206 T_274X,
207 T_284X,
208 T_MAX 209 };
210
211 #ifdefAHA274X_DEBUG 212
213 externintvsprintf(char *, constchar *, va_list);
214
215 static 216 voiddebug(constchar *fmt, ...)
/* */ 217 { 218 va_listap;
219 charbuf[256];
220
221 va_start(ap, fmt);
222 vsprintf(buf, fmt, ap);
223 printk(buf);
224 va_end(ap);
225 } 226
227 static 228 voiddebug_config(enumaha_typetype, intbase)
/* */ 229 { 230 intioport2, ioport3, ioport4;
231
232 staticchar *BRT[T_MAX][16] = { 233 {}, /* T_NONE */ 234 { 235 "2", "???", "???", "12", /* T_274X */ 236 "???", "???", "???", "28",
237 "???", "???", "???", "44",
238 "???", "???", "???", "60"
239 },
240 { 241 "2", "4", "8", "12", /* T_284X */ 242 "16", "20", "24", "28",
243 "32", "36", "40", "44",
244 "48", "52", "56", "60"
245 } 246 };
247 staticintDFT[4] = { 248 0, 50, 75, 100
249 };
250 staticintSST[4] = { 251 256, 128, 64, 32
252 };
253
254 ioport2 = inb(HA_HOSTCONF(base));
255 ioport3 = inb(HA_SCSICONF(base));
256 ioport4 = inb(HA_INTDEF(base));
257
258 if (type == T_284X)
259 printk("AHA284X AT SLOT %d:\n", base >> 12);
260 else 261 printk("AHA274X AT EISA SLOT %d:\n", base >> 12);
262
263 printk(" irq %d\n"
264 " bus release time %s bclks\n"
265 " data fifo threshold %d%%\n",
266 ioport4 & 0xf,
267 BRT[type][(ioport2 >> 2) & 0xf],
268 DFT[(ioport2 >> 6) & 0x3]);
269
270 printk(" SCSI CHANNEL A:\n"
271 " scsi id %d\n"
272 " scsi bus parity check %sabled\n"
273 " scsi selection timeout %d ms\n"
274 " scsi bus reset at power-on %sabled\n",
275 ioport3 & 0x7,
276 (ioport3 & 0x20) ? "en" : "dis",
277 SST[(ioport3 >> 3) & 0x3],
278 (ioport3 & 0x40) ? "en" : "dis");
279
280 if (type == T_274X) { 281 printk(" scsi bus termination %sabled\n",
282 (ioport3 & 0x80) ? "en" : "dis");
283 } 284 } 285
286 static 287 voiddebug_rate(intbase, intrate)
/* */ 288 { 289 inttarget = inb(O_SCSIID(base)) >> 4;
290
291 if (rate) { 292 printk("aha274x: target %d now synchronous at %sMb/s\n",
293 target,
294 aha274x_synctab[(rate >> 4) & 0x7].english);
295 }else{ 296 printk("aha274x: target %d using asynchronous mode\n",
297 target);
298 } 299 } 300
301 #else 302
303 # definedebug(fmt, args...)
304 # definedebug_config(x)
305 # definedebug_rate(x,y)
306
307 #endifAHA274X_DEBUG 308
309 /* 310 * XXX - these options apply unilaterally to _all_ 274x/284x 311 * cards in the system. This should be fixed, but then, 312 * does anyone really have more than one in a machine? 313 */ 314 staticintaha274x_extended = 0; /* extended translation on? */ 315
316 voidaha274x_setup(char *s, int *dummy)
/* */ 317 { 318 inti;
319 char *p;
320
321 staticstruct{ 322 char *name;
323 int *flag;
324 }options[] = { 325 {"extended", &aha274x_extended},
326 {NULL, NULL} 327 };
328
329 for (p = strtok(s, ","); p; p = strtok(NULL, ",")) { 330 for (i = 0; options[i].name; i++)
331 if (!strcmp(options[i].name, p))
332 *(options[i].flag) = !0;
333 } 334 } 335
336 static 337 voidaha274x_getscb(intbase, structaha274x_scb *scb)
/* */ 338 { 339 /* 340 * This is almost identical to aha274x_putscb(). 341 */ 342 outb(0x80, O_SCBCNT(base)); /* SCBAUTO */ 343
344 asmvolatile("cld\n\t"
345 "rep\n\t"
346 "insb"
347 : /* no output */ 348 :"D" (scb), "c" (sizeof(*scb)), "d" (O_SCBARRAY(base))
349 :"di", "cx", "dx");
350
351 outb(0, O_SCBCNT(base));
352 } 353
354 /* 355 * How much data should be transferred for this SCSI command? Stop 356 * at segment sg_last if it's a scatter-gather command so we can 357 * compute underflow easily. 358 */ 359 static 360 unsignedaha274x_length(Scsi_Cmnd *cmd, intsg_last)
/* */ 361 { 362 inti, segments;
363 unsignedlength;
364 structscatterlist *sg;
365
366 segments = cmd->use_sg - sg_last;
367 sg = (structscatterlist *)cmd->buffer;
368
369 if (cmd->use_sg) { 370 for (i = length = 0;
371 i < cmd->use_sg && i < segments;
372 i++)
373 { 374 length += sg[i].length;
375 } 376 }else 377 length = cmd->request_bufflen;
378
379 return(length);
380 } 381
382 static 383 voidaha274x_sg_check(Scsi_Cmnd *cmd)
/* */ 384 { 385 inti;
386 structscatterlist *sg = (structscatterlist *)cmd->buffer;
387
388 if (cmd->use_sg) { 389 for (i = 0; i < cmd->use_sg; i++)
390 if ((unsigned)sg[i].length > 0xffff)
391 panic("aha274x_sg_check: s/g segment > 64k\n");
392 } 393 } 394
395 static 396 voidaha274x_to_scsirate(unsignedchar *rate,
/* */ 397 unsignedchartransfer,
398 unsignedcharoffset)
399 { 400 inti;
401
402 transfer *= 4;
403
404 for (i = 0; i < aha274x_synctab_max-1; i++) { 405
406 if (transfer == aha274x_synctab[i].period) { 407 *rate = (aha274x_synctab[i].rate << 4) | (offset & 0xf);
408 return;
409 } 410
411 if (transfer > aha274x_synctab[i].period &&
412 transfer < aha274x_synctab[i+1].period)
413 { 414 *rate = (aha274x_synctab[i+1].rate << 4) |
415 (offset & 0xf);
416 return;
417 } 418 } 419 *rate = 0;
420 } 421
422 /* 423 * Pause the sequencer and wait for it to actually stop - this 424 * is important since the sequencer can disable pausing for critical 425 * sections. 426 */ 427 #definePAUSE_SEQUENCER(p) \
428 do{ \
429 outb(0xe, O_HCNTRL(p->base)); /* IRQMS|PAUSE|INTEN */ \
430 \
431 while ((inb(O_HCNTRL(p->base)) & 0x4) == 0) \
432 ; \
433 }while (0)
434
435 /* 436 * Unpause the sequencer. Unremarkable, yet done often enough to 437 * warrant an easy way to do it. 438 */ 439 #defineUNPAUSE_SEQUENCER(p) \
440 outb(p->unpause, O_HCNTRL(p->base)) /* IRQMS|INTEN */ 441
442 /* 443 * See comments in aha274x_loadram() wrt this. 444 */ 445 #defineRESTART_SEQUENCER(p) \
446 do{ \
447 do{ \
448 outb(0x2, O_SEQCTL(p->base)); \
449 }while (inw(O_SEQADDR(p->base)) != 0); \
450 \
451 UNPAUSE_SEQUENCER(p); \
452 }while (0)
453
454 /* 455 * Since we declared this using SA_INTERRUPT, interrupts should 456 * be disabled all through this function unless we say otherwise. 457 */ 458 static 459 voidaha274x_isr(intirq, structpt_regs * regs)
/* */ 460 { 461 intbase, intstat;
462 structaha274x_host *p;
463
464 p = (structaha274x_host *)aha274x_boards[irq]->hostdata;
465 base = p->base;
466
467 /* 468 * Check the startup flag - if no commands have been queued, 469 * we probably have the interrupt type set wrong. Reverse 470 * the stored value and the active one in the host control 471 * register. 472 */ 473 if (p->startup) { 474 p->unpause ^= 0x8;
475 outb(inb(O_HCNTRL(p->base)) ^ 0x8, O_HCNTRL(p->base));
476 return;
477 } 478
479 /* 480 * Handle all the interrupt sources - especially for SCSI 481 * interrupts, we won't get a second chance at them. 482 */ 483 intstat = inb(O_INTSTAT(base));
484
485 if (intstat & 0x8) {/* BRKADRINT */ 486
487 panic("aha274x_isr: brkadrint, error = 0x%x, seqaddr = 0x%x\n",
488 inb(O_ERROR(base)), inw(O_SEQADDR(base)));
489 } 490
491 if (intstat & 0x4) {/* SCSIINT */ 492
493 intscbptr = inb(O_SCBPTR(base));
494 intstatus = inb(O_SSTAT1(base));
495 Scsi_Cmnd *cmd;
496
497 cmd = (Scsi_Cmnd *)p->SCB_array[scbptr];
498 if (!cmd) { 499 printk("aha274x_isr: no command for scb (scsiint)\n");
500 /* 501 * Turn off the interrupt and set status 502 * to zero, so that it falls through the 503 * reset of the SCSIINT code. 504 */ 505 outb(status, O_CLRSINT1(base));
506 UNPAUSE_SEQUENCER(p);
507 outb(0x4, O_CLRINT(base)); /* undocumented */ 508 status = 0;
509 } 510 p->SCB_array[scbptr] = NULL;
511
512 /* 513 * Only the SCSI Status 1 register has information 514 * about exceptional conditions that we'd have a 515 * SCSIINT about; anything in SSTAT0 will be handled 516 * by the sequencer. Note that there can be multiple 517 * bits set. 518 */ 519 if (status & 0x80) {/* SELTO */ 520 /* 521 * Hardware selection timer has expired. Turn 522 * off SCSI selection sequence. 523 */ 524 outb(0, O_SCSISEQ(base));
525 cmd->result = DID_TIME_OUT << 16;
526
527 /* 528 * If there's an active message, it belongs to the 529 * command that is getting punted - remove it. 530 */ 531 outb(0, HA_MSG_FLAGS(base));
532
533 /* 534 * Shut off the offending interrupt sources, reset 535 * the sequencer address to zero and unpause it, 536 * then call the high-level SCSI completion routine. 537 * 538 * WARNING! This is a magic sequence! After many 539 * hours of guesswork, turning off the SCSI interrupts 540 * in CLRSINT? does NOT clear the SCSIINT bit in 541 * INTSTAT. By writing to the (undocumented, unused 542 * according to the AIC-7770 manual) third bit of 543 * CLRINT, you can clear INTSTAT. But, if you do it 544 * while the sequencer is paused, you get a BRKADRINT 545 * with an Illegal Host Address status, so the 546 * sequencer has to be restarted first. 547 */ 548 outb(0x80, O_CLRSINT1(base)); /* CLRSELTIMO */ 549 RESTART_SEQUENCER(p);
550
551 outb(0x4, O_CLRINT(base)); /* undocumented */ 552 cmd->scsi_done(cmd);
553 } 554
555 if (status & 0x4) {/* SCSIPERR */ 556 /* 557 * A parity error has occurred during a data 558 * transfer phase. Flag it and continue. 559 */ 560 printk("aha274x: parity error on target %d, lun %d\n",
561 cmd->target,
562 cmd->lun);
563 aha274x_parity(cmd) = DID_PARITY;
564
565 /* 566 * Clear interrupt and resume as above. 567 */ 568 outb(0x4, O_CLRSINT1(base)); /* CLRSCSIPERR */ 569 UNPAUSE_SEQUENCER(p);
570
571 outb(0x4, O_CLRINT(base)); /* undocumented */ 572 } 573
574 if ((status & (0x8|0x4)) == 0 && status) { 575 /* 576 * We don't know what's going on. Turn off the 577 * interrupt source and try to continue. 578 */ 579 printk("aha274x_isr: sstat1 = 0x%x\n", status);
580 outb(status, O_CLRSINT1(base));
581 UNPAUSE_SEQUENCER(p);
582 outb(0x4, O_CLRINT(base)); /* undocumented */ 583 } 584 } 585
586 if (intstat & 0x2) {/* CMDCMPLT */ 587
588 intcomplete, old_scbptr;
589 structaha274x_scbscb;
590 unsignedactual;
591 Scsi_Cmnd *cmd;
592
593 /* 594 * The sequencer will continue running when it 595 * issues this interrupt. There may be >1 commands 596 * finished, so loop until we've processed them all. 597 */ 598 do{ 599 complete = inb(O_QOUTFIFO(base));
600
601 cmd = (Scsi_Cmnd *)p->SCB_array[complete];
602 if (!cmd) { 603 printk("aha274x warning: "
604 "no command for scb (cmdcmplt)\n");
605 continue;
606 } 607 p->SCB_array[complete] = NULL;
608
609 PAUSE_SEQUENCER(p);
610
611 /* 612 * After pausing the sequencer (and waiting 613 * for it to stop), save its SCB pointer, then 614 * write in our completed one and read the SCB 615 * registers. Afterwards, restore the saved 616 * pointer, unpause the sequencer and call the 617 * higher-level completion function - unpause 618 * first since we have no idea how long done() 619 * will take. 620 */ 621 old_scbptr = inb(O_SCBPTR(base));
622 outb(complete, O_SCBPTR(base));
623
624 aha274x_getscb(base, &scb);
625 outb(old_scbptr, O_SCBPTR(base));
626
627 UNPAUSE_SEQUENCER(p);
628
629 cmd->result = scb.target_status |
630 (aha274x_parity(cmd) << 16);
631
632 /* 633 * Did we underflow? At this time, there's only 634 * one other driver that bothers to check for this, 635 * and cmd->underflow seems to be set rather half- 636 * heartedly in the higher-level SCSI code. 637 */ 638 actual = aha274x_length(cmd,
639 scb.residual_SG_segment_count);
640
641 actual -= ((scb.residual_data_count[2] << 16) |
642 (scb.residual_data_count[1] << 8) |
643 (scb.residual_data_count[0]));
644
645 if (actual < cmd->underflow) { 646 printk("aha274x: target %d underflow - "
647 "wanted (at least) %u, got %u\n",
648 cmd->target, cmd->underflow, actual);
649
650 cmd->result = scb.target_status |
651 (DID_UNDERFLOW << 16);
652 } 653
654 cmd->scsi_done(cmd);
655
656 /* 657 * Clear interrupt status before checking 658 * the output queue again. This eliminates 659 * a race condition whereby a command could 660 * complete between the queue poll and the 661 * interrupt clearing, so notification of the 662 * command being complete never made it back 663 * up to the kernel. 664 */ 665 outb(0x2, O_CLRINT(base)); /* CLRCMDINT */ 666
667 }while (inb(O_QOUTCNT(base)));
668 } 669
670 if (intstat & 0x1) {/* SEQINT */ 671
672 unsignedchartransfer, offset, rate;
673
674 /* 675 * Although the sequencer is paused immediately on 676 * a SEQINT, an interrupt for a SCSIINT or a CMDCMPLT 677 * condition will have unpaused the sequencer before 678 * this point. 679 */ 680 PAUSE_SEQUENCER(p);
681
682 switch (intstat & 0xf0) { 683 case 0x00:
684 panic("aha274x_isr: unknown scsi bus phase\n");
685 case 0x10:
686 debug("aha274x_isr warning: "
687 "issuing message reject, 1st byte 0x%x\n",
688 inb(HA_REJBYTE(base)));
689 break;
690 case 0x20:
691 panic("aha274x_isr: reconnecting target %d "
692 "didn't issue IDENTIFY message\n",
693 (inb(O_SELID(base)) >> 4) & 0xf);
694 case 0x30:
695 debug("aha274x_isr: sequencer couldn't find match "
696 "for reconnecting target %d - issuing ABORT\n",
697 (inb(O_SELID(base)) >> 4) & 0xf);
698 break;
699 case 0x40:
700 transfer = inb(HA_ARG_1(base));
701 offset = inb(HA_ARG_2(base));
702 aha274x_to_scsirate(&rate, transfer, offset);
703 outb(rate, HA_RETURN_1(base));
704 debug_rate(base, rate);
705 break;
706 default:
707 debug("aha274x_isr: seqint, "
708 "intstat = 0x%x, scsisigi = 0x%x\n",
709 intstat, inb(O_SCSISIGI(base)));
710 break;
711 } 712
713 outb(0x1, O_CLRINT(base)); /* CLRSEQINT */ 714 UNPAUSE_SEQUENCER(p);
715 } 716 } 717
718 /* 719 * Probing for EISA boards: it looks like the first two bytes 720 * are a manufacturer code - three characters, five bits each: 721 * 722 * BYTE 0 BYTE 1 BYTE 2 BYTE 3 723 * ?1111122 22233333 PPPPPPPP RRRRRRRR 724 * 725 * The characters are baselined off ASCII '@', so add that value 726 * to each to get the real ASCII code for it. The next two bytes 727 * appear to be a product and revision number, probably vendor- 728 * specific. This is what is being searched for at each port, 729 * and what should probably correspond to the ID= field in the 730 * ECU's .cfg file for the card - if your card is not detected, 731 * make sure your signature is listed in the array. 732 * 733 * The fourth byte's lowest bit seems to be an enabled/disabled 734 * flag (rest of the bits are reserved?). 735 */ 736
737 static 738 enumaha_typeaha274x_probe(intslot, ints_base)
/* */ 739 { 740 inti;
741 unsignedcharbuf[4];
742
743 staticstruct{ 744 intn;
745 unsignedcharsignature[sizeof(buf)];
746 enumaha_typetype;
747 }S[] = { 748 {4, { 0x04, 0x90, 0x77, 0x71 }, T_274X}, /* host adapter 274x */ 749 {4, { 0x04, 0x90, 0x77, 0x70 }, T_274X}, /* motherboard 274x */ 750 {4, { 0x04, 0x90, 0x77, 0x56 }, T_284X}, /* 284x, BIOS enabled */ 751 };
752
753 for (i = 0; i < sizeof(buf); i++) { 754 /* 755 * The VL-bus cards need to be primed by 756 * writing before a signature check. 757 */ 758 outb(0x80 + i, s_base);
759 buf[i] = inb(s_base + i);
760 } 761
762 for (i = 0; i < sizeof(S)/sizeof(S[0]); i++) { 763 if (!memcmp(buf, S[i].signature, S[i].n)) { 764 /* 765 * Signature match on enabled card? 766 */ 767 if (inb(s_base + 4) & 1)
768 return(S[i].type);
769 printk("aha274x disabled at slot %d, ignored\n", slot);
770 } 771 } 772 return(T_NONE);
773 } 774
775 /* 776 * Return ' ' for plain 274x, 'T' for twin-channel, 'W' for 777 * wide channel, '?' for anything else. 778 */ 779
780 static 781 charaha274x_type(intbase)
/* */ 782 { 783 /* 784 * The AIC-7770 can be wired so that, on chip reset, 785 * the SCSI Block Control register indicates how many 786 * busses the chip is configured for. 787 */ 788 switch (inb(O_SBLKCTL(base))) { 789 case 0:
790 return(' ');
791 case 2:
792 return('W');
793 case 8:
794 return('T');
795 default:
796 printk("aha274x has unknown bus configuration\n");
797 return('?');
798 } 799 } 800
801 static 802 voidaha274x_loadram(intbase)
/* */ 803 { 804 staticunsignedcharseqprog[] = { 805 /* 806 * Each sequencer instruction is 29 bits 807 * long (fill in the excess with zeroes) 808 * and has to be loaded from least -> most 809 * significant byte, so this table has the 810 * byte ordering reversed. 811 */ 812 # include "aha274x_seq.h"
813 };
814
815 /* 816 * When the AIC-7770 is paused (as on chip reset), the 817 * sequencer address can be altered and a sequencer 818 * program can be loaded by writing it, byte by byte, to 819 * the sequencer RAM port - the Adaptec documentation 820 * recommends using REP OUTSB to do this, hence the inline 821 * assembly. Since the address autoincrements as we load 822 * the program, reset it back to zero afterward. Disable 823 * sequencer RAM parity error detection while loading, and 824 * make sure the LOADRAM bit is enabled for loading. 825 */ 826 outb(0x83, O_SEQCTL(base)); /* PERRORDIS|SEQRESET|LOADRAM */ 827
828 asmvolatile("cld\n\t"
829 "rep\n\t"
830 "outsb"
831 : /* no output */ 832 :"S" (seqprog), "c" (sizeof(seqprog)), "d" (O_SEQRAM(base))
833 :"si", "cx", "dx");
834
835 /* 836 * WARNING! This is a magic sequence! After extensive 837 * experimentation, it seems that you MUST turn off the 838 * LOADRAM bit before you play with SEQADDR again, else 839 * you will end up with parity errors being flagged on 840 * your sequencer program. (You would also think that 841 * turning off LOADRAM and setting SEQRESET to reset the 842 * address to zero would work, but you need to do it twice 843 * for it to take effect on the address. Timing problem?) 844 */ 845 outb(0, O_SEQCTL(base));
846 do{ 847 /* 848 * Actually, reset it until 849 * the address shows up as 850 * zero just to be safe.. 851 */ 852 outb(0x2, O_SEQCTL(base)); /* SEQRESET */ 853
854 }while (inw(O_SEQADDR(base)) != 0);
855 } 856
857 static 858 intaha274x_register(Scsi_Host_Template *template,
/* */ 859 enumaha_typetype,
860 intbase)
861 { 862 inti, irq, scsi_id;
863 structScsi_Host *host;
864 structaha274x_host *p;
865
866 /* 867 * Give the AIC-7770 a reset - reading the 274x's registers 868 * returns zeroes unless you do. This forces a pause of the 869 * Sequencer. 870 */ 871 outb(1, O_HCNTRL(base)); /* CHIPRST */ 872
873 /* 874 * The IRQ level in i/o port 4 maps directly onto the real 875 * IRQ number. If it's ok, register it with the kernel. 876 * 877 * NB. the Adaptec documentation says the IRQ number is only 878 * in the lower four bits; the ECU information shows the 879 * high bit being used as well. Which is correct? 880 */ 881 irq = inb(HA_INTDEF(base)) & 0xf;
882 if (irq < 9 || irq > 15) { 883 printk("aha274x uses unsupported IRQ level, ignoring\n");
884 return(0);
885 } 886
887 /* 888 * Lock out other contenders for our i/o space. 889 */ 890 request_region(O_MINREG(base), O_MAXREG(base)-O_MINREG(base), "aha27x");
891
892 /* 893 * Any card-type-specific adjustments before we register 894 * the scsi host(s). 895 */ 896
897 scsi_id = inb(HA_SCSICONF(base)) & 0x7;
898
899 switch (aha274x_type(base)) { 900 case 'T':
901 printk("aha274x warning: ignoring channel B of 274x-twin\n");
902 break;
903 case ' ':
904 break;
905 default:
906 printk("aha274x is an unsupported type, ignoring\n");
907 return(0);
908 } 909
910 /* 911 * Before registry, make sure that the offsets of the 912 * struct scatterlist are what the sequencer will expect, 913 * otherwise disable scatter-gather altogether until someone 914 * can fix it. This is important since the sequencer will 915 * DMA elements of the SG array in while executing commands. 916 */ 917 if (template->sg_tablesize != SG_NONE) { 918 structscatterlistsg;
919
920 if (SG_STRUCT_CHECK(sg)) { 921 printk("aha274x warning: kernel scatter-gather "
922 "structures changed, disabling it\n");
923 template->sg_tablesize = SG_NONE;
924 } 925 } 926
927 /* 928 * Register each "host" and fill in the returned Scsi_Host 929 * structure as best we can. Some of the parameters aren't 930 * really relevant for EISA, and none of the high-level SCSI 931 * code looks at it anyway.. why are the fields there? Also 932 * save the pointer so that we can find the information when 933 * an IRQ is triggered. 934 */ 935 host = scsi_register(template, sizeof(structaha274x_host));
936 host->this_id = scsi_id;
937 host->irq = irq;
938
939 aha274x_boards[irq] = host;
940
941 p = (structaha274x_host *)host->hostdata;
942 for (i = 0; i < AHA274X_MAXSCB; i++)
943 p->SCB_array[i] = NULL;
944 p->base = base;
945
946 /* 947 * The interrupt trigger is different depending 948 * on whether the card is EISA or VL-bus - sometimes. 949 * The startup variable will be cleared once the first 950 * command is queued, and is checked in the isr to 951 * try and detect when the interrupt type is set 952 * incorrectly, triggering an interrupt immediately. 953 */ 954 p->unpause = (type != T_274X ? 0x2 : 0xa);
955 p->startup = !0;
956
957 /* 958 * Register IRQ with the kernel _after_ the host information 959 * is set up, in case we take an interrupt right away, due to 960 * the interrupt type being set wrong. 961 */ 962 if (request_irq(irq, aha274x_isr, SA_INTERRUPT, "AHA274x/284x")) { 963 printk("aha274x couldn't register irq %d, ignoring\n", irq);
964 return(0);
965 } 966
967 /* 968 * A reminder until this can be detected automatically. 969 */ 970 printk("aha274x: extended translation %sabled\n",
971 aha274x_extended ? "en" : "dis");
972
973 /* 974 * Print out debugging information before re-enabling 975 * the card - a lot of registers on it can't be read 976 * when the sequencer is active. 977 */ 978 debug_config(type, base);
979
980 /* 981 * Load the sequencer program, then re-enable the board - 982 * resetting the AIC-7770 disables it, leaving the lights 983 * on with nobody home. 984 */ 985 aha274x_loadram(base);
986 outb(1, O_BCTL(base)); /* ENABLE */ 987
988 /* 989 * Set the host adapter registers to indicate that synchronous 990 * negotiation should be attempted the first time the targets 991 * are communicated with. Also initialize the active message 992 * flag to indicate that there is no message. 993 */ 994 outb(0xff, HA_NEEDSDTR(base));
995 outb(0, HA_MSG_FLAGS(base));
996
997 /* 998 * Unpause the sequencer before returning and enable 999 * interrupts - we shouldn't get any until the first1000 * command is sent to us by the high-level SCSI code.1001 */1002 UNPAUSE_SEQUENCER(p);
1003 return(1);
1004 }1005
1006 intaha274x_detect(Scsi_Host_Template *template)
/* */1007 {1008 enumaha_typetype;
1009 intfound = 0, slot, base;
1010
1011 for (slot = MINEISA; slot <= MAXEISA; slot++) {1012
1013 base = SLOTBASE(slot);
1014
1015 if (check_region(O_MINREG(base),
1016 O_MAXREG(base)-O_MINREG(base)))
1017 {1018 /*1019 * Some other driver has staked a1020 * claim to this i/o region already.1021 */1022 continue;
1023 }1024
1025 type = aha274x_probe(slot, O_BIDx(base));
1026
1027 if (type != T_NONE) {1028 /*1029 * We "find" a 274x if we locate the card1030 * signature and we can set it up and register1031 * it with the kernel without incident.1032 */1033 found += aha274x_register(template, type, base);
1034 }1035 }1036 template->name = (char *)aha274x_info(NULL);
1037 return(found);
1038 }1039
1040 constchar *aha274x_info(structScsi_Host * shost)
/* */1041 {1042 return("Adaptec AHA274x/284x (EISA/VL-bus -> Fast SCSI) "
1043 AHA274X_SEQ_VERSION "/"
1044 AHA274X_H_VERSION "/"
1045 "1.29");
1046 }1047
1048 intaha274x_command(Scsi_Cmnd *cmd)
/* */1049 {1050 /*1051 * This is a relic of non-interrupt-driven SCSI1052 * drivers. With the can_queue variable set, this1053 * should never be called.1054 */1055 panic("aha274x_command was called\n");
1056 }1057
1058 static1059 voidaha274x_buildscb(structaha274x_host *p,
/* */1060 Scsi_Cmnd *cmd,
1061 structaha274x_scb *scb)
1062 {1063 void *addr;
1064 unsignedlength;
1065
1066 memset(scb, 0, sizeof(*scb));
1067
1068 /*1069 * NB. channel selection (bit 3) is always zero.1070 */1071 scb->target_channel_lun = ((cmd->target << 4) & 0xf0) |
1072 (cmd->lun & 0x7);
1073
1074 /*1075 * The interpretation of request_buffer and request_bufflen1076 * changes depending on whether or not use_sg is zero; a1077 * non-zero use_sg indicates the number of elements in the1078 * scatter-gather array.1079 *1080 * The AIC-7770 can't support transfers of any sort larger1081 * than 2^24 (three-byte count) without backflips. For what1082 * the kernel is doing, this shouldn't occur. I hope.1083 */1084 length = aha274x_length(cmd, 0);
1085
1086 /*1087 * The sequencer code cannot yet handle scatter-gather segments1088 * larger than 64k (two-byte length). The 1.1.x kernels, however,1089 * have a four-byte length field in the struct scatterlist, so1090 * make sure we don't exceed 64k on these kernels for now.1091 */1092 aha274x_sg_check(cmd);
1093
1094 if (length > 0xffffff) {1095 panic("aha274x_buildscb: can't transfer > 2^24 - 1 bytes\n");
1096 }1097
1098 /*1099 * XXX - this relies on the host data being stored in a1100 * little-endian format.1101 */1102 addr = cmd->cmnd;
1103 scb->SCSI_cmd_length = cmd->cmd_len;
1104 memcpy(scb->SCSI_cmd_pointer, &addr, sizeof(scb->SCSI_cmd_pointer));
1105
1106 if (cmd->use_sg) {1107 #if 0
1108 debug("aha274x_buildscb: SG used, %d segments, length %u\n",
1109 cmd->use_sg,
1110 length);
1111 #endif1112 scb->SG_segment_count = cmd->use_sg;
1113 memcpy(scb->SG_list_pointer,
1114 &cmd->request_buffer,
1115 sizeof(scb->SG_list_pointer));
1116 }else{1117 scb->SG_segment_count = 0;
1118 memcpy(scb->data_pointer,
1119 &cmd->request_buffer,
1120 sizeof(scb->data_pointer));
1121 memcpy(scb->data_count,
1122 &cmd->request_bufflen,
1123 sizeof(scb->data_count));
1124 }1125 }1126
1127 static1128 voidaha274x_putscb(intbase, structaha274x_scb *scb)
/* */1129 {1130 /*1131 * By turning on the SCB auto increment, any reference1132 * to the SCB I/O space postincrements the SCB address1133 * we're looking at. So turn this on and dump the relevant1134 * portion of the SCB to the card.1135 */1136 outb(0x80, O_SCBCNT(base)); /* SCBAUTO */1137
1138 asmvolatile("cld\n\t"
1139 "rep\n\t"
1140 "outsb"
1141 : /* no output */1142 :"S" (scb), "c" (sizeof(*scb)), "d" (O_SCBARRAY(base))
1143 :"si", "cx", "dx");
1144
1145 outb(0, O_SCBCNT(base));
1146 }1147
1148 intaha274x_queue(Scsi_Cmnd *cmd, void (*fn)(Scsi_Cmnd *))
/* */1149 {1150 longflags;
1151 intempty, old_scbptr;
1152 structaha274x_host *p;
1153 structaha274x_scbscb;
1154
1155 #if 0
1156 debug("aha274x_queue: cmd 0x%x (size %u), target %d, lun %d\n",
1157 cmd->cmnd[0],
1158 cmd->cmd_len,
1159 cmd->target,
1160 cmd->lun);
1161 #endif1162
1163 p = (structaha274x_host *)cmd->host->hostdata;
1164
1165 /*1166 * Construct the SCB beforehand, so the sequencer is1167 * paused a minimal amount of time.1168 */1169 aha274x_buildscb(p, cmd, &scb);
1170
1171 /*1172 * Clear the startup flag - we can now legitimately1173 * expect interrupts.1174 */1175 p->startup = 0;
1176
1177 /*1178 * This is a critical section, since we don't want the1179 * interrupt routine mucking with the host data or the1180 * card. Since the kernel documentation is vague on1181 * whether or not we are in a cli/sti pair already, save1182 * the flags to be on the safe side.1183 */1184 save_flags(flags);
1185 cli();
1186
1187 /*1188 * Find a free slot in the SCB array to load this command1189 * into. Since can_queue is set to AHA274X_MAXSCB, we1190 * should always find one.1191 */1192 for (empty = 0; empty < AHA274X_MAXSCB; empty++)
1193 if (!p->SCB_array[empty])
1194 break;
1195 if (empty == AHA274X_MAXSCB)
1196 panic("aha274x_queue: couldn't find a free scb\n");
1197
1198 /*1199 * Pause the sequencer so we can play with its registers -1200 * wait for it to acknowledge the pause.1201 *1202 * XXX - should the interrupts be left on while doing this?1203 */1204 PAUSE_SEQUENCER(p);
1205
1206 /*1207 * Save the SCB pointer and put our own pointer in - this1208 * selects one of the four banks of SCB registers. Load1209 * the SCB, then write its pointer into the queue in FIFO1210 * and restore the saved SCB pointer.1211 */1212 old_scbptr = inb(O_SCBPTR(p->base));
1213 outb(empty, O_SCBPTR(p->base));
1214
1215 aha274x_putscb(p->base, &scb);
1216
1217 outb(empty, O_QINFIFO(p->base));
1218 outb(old_scbptr, O_SCBPTR(p->base));
1219
1220 /*1221 * Make sure the Scsi_Cmnd pointer is saved, the struct it1222 * points to is set up properly, and the parity error flag1223 * is reset, then unpause the sequencer and watch the fun1224 * begin.1225 */1226 cmd->scsi_done = fn;
1227 p->SCB_array[empty] = cmd;
1228 aha274x_parity(cmd) = DID_OK;
1229
1230 UNPAUSE_SEQUENCER(p);
1231
1232 restore_flags(flags);
1233 return(0);
1234 }1235
1236 /* return values from aha274x_kill */1237
1238 enumk_state{1239 k_ok, /* scb found and message sent */1240 k_busy, /* message already present */1241 k_absent, /* couldn't locate scb */1242 k_disconnect, /* scb found, but disconnected */1243 };
1244
1245 /*1246 * This must be called with interrupts disabled - it's going to1247 * be messing around with the host data, and an interrupt being1248 * fielded in the middle could get ugly.1249 *1250 * Since so much of the abort and reset code is shared, this1251 * function performs more magic than it really should. If the1252 * command completes ok, then it will call scsi_done with the1253 * result code passed in. The unpause parameter controls whether1254 * or not the sequencer gets unpaused - the reset function, for1255 * instance, may want to do something more aggressive.1256 *1257 * Note that the command is checked for in our SCB_array first1258 * before the sequencer is paused, so if k_absent is returned,1259 * then the sequencer is NOT paused.1260 */1261
1262 static1263 enumk_stateaha274x_kill(Scsi_Cmnd *cmd, unsignedcharmessage,
/* */1264 unsignedintresult, intunpause)
1265 {1266 structaha274x_host *p;
1267 inti, scb, found, queued;
1268 unsignedcharscbsave[AHA274X_MAXSCB];
1269
1270 p = (structaha274x_host *)cmd->host->hostdata;
1271
1272 /*1273 * If we can't find the command, assume it just completed1274 * and shrug it away.1275 */1276 for (scb = 0; scb < AHA274X_MAXSCB; scb++)
1277 if (p->SCB_array[scb] == cmd)
1278 break;
1279
1280 if (scb == AHA274X_MAXSCB)
1281 return(k_absent);
1282
1283 PAUSE_SEQUENCER(p);
1284
1285 /*1286 * This is the best case, really. Check to see if the1287 * command is still in the sequencer's input queue. If1288 * so, simply remove it. Reload the queue afterward.1289 */1290 queued = inb(O_QINCNT(p->base));
1291
1292 for (i = found = 0; i < queued; i++) {1293 scbsave[i] = inb(O_QINFIFO(p->base));
1294
1295 if (scbsave[i] == scb) {1296 found = 1;
1297 i -= 1;
1298 }1299 }1300
1301 queued -= found;
1302 for (i = 0; i < queued; i++)
1303 outb(scbsave[i], O_QINFIFO(p->base));
1304
1305 if (found)
1306 gotocomplete;
1307
1308 /*1309 * Check the current SCB bank. If it's not the one belonging1310 * to the command we want to kill, assume that the command1311 * is disconnected. It's rather a pain to force a reconnect1312 * and send a message to the target, so we abdicate responsibility1313 * in this case.1314 */1315 if (inb(O_SCBPTR(p->base)) != scb) {1316 if (unpause)
1317 UNPAUSE_SEQUENCER(p);
1318 return(k_disconnect);
1319 }1320
1321 /*1322 * Presumably at this point our target command is active. Check1323 * to see if there's a message already in effect. If not, place1324 * our message in and assert ATN so the target goes into MESSAGE1325 * OUT phase.1326 */1327 if (inb(HA_MSG_FLAGS(p->base)) & 0x80) {1328 if (unpause)
1329 UNPAUSE_SEQUENCER(p);
1330 return(k_busy);
1331 }1332
1333 outb(0x80, HA_MSG_FLAGS(p->base)); /* active message */1334 outb(1, HA_MSG_LEN(p->base)); /* length = 1 */1335 outb(message, HA_MSG_START(p->base)); /* message body */1336
1337 /*1338 * Assert ATN. Use the value of SCSISIGO saved by the1339 * sequencer code so we don't alter its contents radically1340 * in the middle of something critical.1341 */1342 outb(inb(HA_SIGSTATE(p->base)) | 0x10, O_SCSISIGO(p->base));
1343
1344 /*1345 * The command has been killed. Do the bookkeeping, unpause1346 * the sequencer, and notify the higher-level SCSI code.1347 */1348 complete:
1349 p->SCB_array[scb] = NULL;
1350 if (unpause)
1351 UNPAUSE_SEQUENCER(p);
1352
1353 cmd->result = result << 16;
1354 cmd->scsi_done(cmd);
1355 return(k_ok);
1356 }1357
1358 intaha274x_abort(Scsi_Cmnd *cmd)
/* */1359 {1360 intrv;
1361 longflags;
1362
1363 save_flags(flags);
1364 cli();
1365
1366 switch (aha274x_kill(cmd, ABORT, DID_ABORT, !0)) {1367 casek_ok: rv = SCSI_ABORT_SUCCESS; break;
1368 casek_busy: rv = SCSI_ABORT_BUSY; break;
1369 casek_absent: rv = SCSI_ABORT_NOT_RUNNING; break;
1370 casek_disconnect: rv = SCSI_ABORT_SNOOZE; break;
1371 default:
1372 panic("aha274x_do_abort: internal error\n");
1373 }1374
1375 restore_flags(flags);
1376 return(rv);
1377 }1378
1379 /*1380 * Resetting the bus always succeeds - is has to, otherwise the1381 * kernel will panic! Try a surgical technique - sending a BUS1382 * DEVICE RESET message - on the offending target before pulling1383 * the SCSI bus reset line.1384 */1385
1386 intaha274x_reset(Scsi_Cmnd *cmd)
/* */1387 {1388 inti;
1389 longflags;
1390 Scsi_Cmnd *reset;
1391 structaha274x_host *p;
1392
1393 p = (structaha274x_host *)cmd->host->hostdata;
1394 save_flags(flags);
1395 cli();
1396
1397 switch (aha274x_kill(cmd, BUS_DEVICE_RESET, DID_RESET, 0)) {1398
1399 casek_ok:
1400 /*1401 * The RESET message was sent to the target1402 * with no problems. Flag that target as1403 * needing a SDTR negotiation on the next1404 * connection and restart the sequencer.1405 */1406 outb((1 << cmd->target), HA_NEEDSDTR(p->base));
1407 UNPAUSE_SEQUENCER(p);
1408 break;
1409
1410 casek_absent:
1411 /*1412 * The sequencer will not be paused if aha274x_kill()1413 * couldn't find the command.1414 */1415 PAUSE_SEQUENCER(p);
1416 /* falls through */1417
1418 casek_busy:
1419 casek_disconnect:
1420 /*1421 * Do a hard reset of the SCSI bus. According to the1422 * SCSI-2 draft specification, reset has to be asserted1423 * for at least 25us. I'm invoking the kernel delay1424 * function for 30us since I'm not totally trusting of1425 * the busy loop timing.1426 *1427 * XXX - I'm not convinced this works. I tried resetting1428 * the bus before, trying to get the devices on the1429 * bus to revert to asynchronous transfer, and it1430 * never seemed to work.1431 */1432 debug("aha274x: attempting to reset scsi bus and card\n");
1433
1434 outb(1, O_SCSISEQ(p->base)); /* SCSIRSTO */1435 udelay(30);
1436 outb(0, O_SCSISEQ(p->base)); /* !SCSIRSTO */1437
1438 outb(0xff, HA_NEEDSDTR(p->base));
1439 UNPAUSE_SEQUENCER(p);
1440
1441 /*1442 * Locate the command and return a "reset" status1443 * for it. This is not completely correct and will1444 * probably return to haunt me later.1445 */1446 for (i = 0; i < AHA274X_MAXSCB; i++) {1447 if (cmd == p->SCB_array[i]) {1448 reset = (Scsi_Cmnd *)p->SCB_array[i];
1449 p->SCB_array[i] = NULL;
1450 reset->result = DID_RESET << 16;
1451 reset->scsi_done(reset);
1452 break;
1453 }1454 }1455 break;
1456
1457 default:
1458 panic("aha274x_reset: internal error\n");
1459 }1460
1461 restore_flags(flags);
1462 return(SCSI_RESET_SUCCESS);
1463 }1464
1465 intaha274x_biosparam(Disk *disk, intdevno, intgeom[])
/* */1466 {1467 intheads, sectors, cylinders;
1468
1469 /*1470 * XXX - if I could portably find the card's configuration1471 * information, then this could be autodetected instead1472 * of left to a boot-time switch.1473 */1474 heads = 64;
1475 sectors = 32;
1476 cylinders = disk->capacity / (heads * sectors);
1477
1478 if (aha274x_extended && cylinders > 1024) {1479 heads = 255;
1480 sectors = 63;
1481 cylinders = disk->capacity / (255 * 63);
1482 }1483
1484 geom[0] = heads;
1485 geom[1] = sectors;
1486 geom[2] = cylinders;
1487
1488 return(0);
1489 }1490