linux/drivers/scsi/in2000.c
<<
>>
Prefs
   1/*
   2 *    in2000.c -  Linux device driver for the
   3 *                Always IN2000 ISA SCSI card.
   4 *
   5 * Copyright (c) 1996 John Shifflett, GeoLog Consulting
   6 *    john@geolog.com
   7 *    jshiffle@netcom.com
   8 *
   9 * This program is free software; you can redistribute it and/or modify
  10 * it under the terms of the GNU General Public License as published by
  11 * the Free Software Foundation; either version 2, or (at your option)
  12 * any later version.
  13 *
  14 * This program is distributed in the hope that it will be useful,
  15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17 * GNU General Public License for more details.
  18 *
  19 * For the avoidance of doubt the "preferred form" of this code is one which
  20 * is in an open non patent encumbered format. Where cryptographic key signing
  21 * forms part of the process of creating an executable the information
  22 * including keys needed to generate an equivalently functional executable
  23 * are deemed to be part of the source code.
  24 *
  25 * Drew Eckhardt's excellent 'Generic NCR5380' sources provided
  26 * much of the inspiration and some of the code for this driver.
  27 * The Linux IN2000 driver distributed in the Linux kernels through
  28 * version 1.2.13 was an extremely valuable reference on the arcane
  29 * (and still mysterious) workings of the IN2000's fifo. It also
  30 * is where I lifted in2000_biosparam(), the gist of the card
  31 * detection scheme, and other bits of code. Many thanks to the
  32 * talented and courageous people who wrote, contributed to, and
  33 * maintained that driver (including Brad McLean, Shaun Savage,
  34 * Bill Earnest, Larry Doolittle, Roger Sunshine, John Luckey,
  35 * Matt Postiff, Peter Lu, zerucha@shell.portal.com, and Eric
  36 * Youngdale). I should also mention the driver written by
  37 * Hamish Macdonald for the (GASP!) Amiga A2091 card, included
  38 * in the Linux-m68k distribution; it gave me a good initial
  39 * understanding of the proper way to run a WD33c93 chip, and I
  40 * ended up stealing lots of code from it.
  41 *
  42 * _This_ driver is (I feel) an improvement over the old one in
  43 * several respects:
  44 *    -  All problems relating to the data size of a SCSI request are
  45 *          gone (as far as I know). The old driver couldn't handle
  46 *          swapping to partitions because that involved 4k blocks, nor
  47 *          could it deal with the st.c tape driver unmodified, because
  48 *          that usually involved 4k - 32k blocks. The old driver never
  49 *          quite got away from a morbid dependence on 2k block sizes -
  50 *          which of course is the size of the card's fifo.
  51 *
  52 *    -  Target Disconnection/Reconnection is now supported. Any
  53 *          system with more than one device active on the SCSI bus
  54 *          will benefit from this. The driver defaults to what I'm
  55 *          calling 'adaptive disconnect' - meaning that each command
  56 *          is evaluated individually as to whether or not it should
  57 *          be run with the option to disconnect/reselect (if the
  58 *          device chooses), or as a "SCSI-bus-hog".
  59 *
  60 *    -  Synchronous data transfers are now supported. Because there
  61 *          are a few devices (and many improperly terminated systems)
  62 *          that choke when doing sync, the default is sync DISABLED
  63 *          for all devices. This faster protocol can (and should!)
  64 *          be enabled on selected devices via the command-line.
  65 *
  66 *    -  Runtime operating parameters can now be specified through
  67 *       either the LILO or the 'insmod' command line. For LILO do:
  68 *          "in2000=blah,blah,blah"
  69 *       and with insmod go like:
  70 *          "insmod /usr/src/linux/modules/in2000.o setup_strings=blah,blah"
  71 *       The defaults should be good for most people. See the comment
  72 *       for 'setup_strings' below for more details.
  73 *
  74 *    -  The old driver relied exclusively on what the Western Digital
  75 *          docs call "Combination Level 2 Commands", which are a great
  76 *          idea in that the CPU is relieved of a lot of interrupt
  77 *          overhead. However, by accepting a certain (user-settable)
  78 *          amount of additional interrupts, this driver achieves
  79 *          better control over the SCSI bus, and data transfers are
  80 *          almost as fast while being much easier to define, track,
  81 *          and debug.
  82 *
  83 *    -  You can force detection of a card whose BIOS has been disabled.
  84 *
  85 *    -  Multiple IN2000 cards might almost be supported. I've tried to
  86 *       keep it in mind, but have no way to test...
  87 *
  88 *
  89 * TODO:
  90 *       tagged queuing. multiple cards.
  91 *
  92 *
  93 * NOTE:
  94 *       When using this or any other SCSI driver as a module, you'll
  95 *       find that with the stock kernel, at most _two_ SCSI hard
  96 *       drives will be linked into the device list (ie, usable).
  97 *       If your IN2000 card has more than 2 disks on its bus, you
  98 *       might want to change the define of 'SD_EXTRA_DEVS' in the
  99 *       'hosts.h' file from 2 to whatever is appropriate. It took
 100 *       me a while to track down this surprisingly obscure and
 101 *       undocumented little "feature".
 102 *
 103 *
 104 * People with bug reports, wish-lists, complaints, comments,
 105 * or improvements are asked to pah-leeez email me (John Shifflett)
 106 * at john@geolog.com or jshiffle@netcom.com! I'm anxious to get
 107 * this thing into as good a shape as possible, and I'm positive
 108 * there are lots of lurking bugs and "Stupid Places".
 109 *
 110 * Updated for Linux 2.5 by Alan Cox <alan@lxorguk.ukuu.org.uk>
 111 *      - Using new_eh handler
 112 *      - Hopefully got all the locking right again
 113 *      See "FIXME" notes for items that could do with more work
 114 */
 115
 116#include <linux/module.h>
 117#include <linux/blkdev.h>
 118#include <linux/interrupt.h>
 119#include <linux/string.h>
 120#include <linux/delay.h>
 121#include <linux/proc_fs.h>
 122#include <linux/ioport.h>
 123#include <linux/stat.h>
 124
 125#include <asm/io.h>
 126#include <asm/system.h>
 127
 128#include "scsi.h"
 129#include <scsi/scsi_host.h>
 130
 131#define IN2000_VERSION    "1.33-2.5"
 132#define IN2000_DATE       "2002/11/03"
 133
 134#include "in2000.h"
 135
 136
 137/*
 138 * 'setup_strings' is a single string used to pass operating parameters and
 139 * settings from the kernel/module command-line to the driver. 'setup_args[]'
 140 * is an array of strings that define the compile-time default values for
 141 * these settings. If Linux boots with a LILO or insmod command-line, those
 142 * settings are combined with 'setup_args[]'. Note that LILO command-lines
 143 * are prefixed with "in2000=" while insmod uses a "setup_strings=" prefix.
 144 * The driver recognizes the following keywords (lower case required) and
 145 * arguments:
 146 *
 147 * -  ioport:addr    -Where addr is IO address of a (usually ROM-less) card.
 148 * -  noreset        -No optional args. Prevents SCSI bus reset at boot time.
 149 * -  nosync:x       -x is a bitmask where the 1st 7 bits correspond with
 150 *                    the 7 possible SCSI devices (bit 0 for device #0, etc).
 151 *                    Set a bit to PREVENT sync negotiation on that device.
 152 *                    The driver default is sync DISABLED on all devices.
 153 * -  period:ns      -ns is the minimum # of nanoseconds in a SCSI data transfer
 154 *                    period. Default is 500; acceptable values are 250 - 1000.
 155 * -  disconnect:x   -x = 0 to never allow disconnects, 2 to always allow them.
 156 *                    x = 1 does 'adaptive' disconnects, which is the default
 157 *                    and generally the best choice.
 158 * -  debug:x        -If 'DEBUGGING_ON' is defined, x is a bitmask that causes
 159 *                    various types of debug output to printed - see the DB_xxx
 160 *                    defines in in2000.h
 161 * -  proc:x         -If 'PROC_INTERFACE' is defined, x is a bitmask that
 162 *                    determines how the /proc interface works and what it
 163 *                    does - see the PR_xxx defines in in2000.h
 164 *
 165 * Syntax Notes:
 166 * -  Numeric arguments can be decimal or the '0x' form of hex notation. There
 167 *    _must_ be a colon between a keyword and its numeric argument, with no
 168 *    spaces.
 169 * -  Keywords are separated by commas, no spaces, in the standard kernel
 170 *    command-line manner.
 171 * -  A keyword in the 'nth' comma-separated command-line member will overwrite
 172 *    the 'nth' element of setup_args[]. A blank command-line member (in
 173 *    other words, a comma with no preceding keyword) will _not_ overwrite
 174 *    the corresponding setup_args[] element.
 175 *
 176 * A few LILO examples (for insmod, use 'setup_strings' instead of 'in2000'):
 177 * -  in2000=ioport:0x220,noreset
 178 * -  in2000=period:250,disconnect:2,nosync:0x03
 179 * -  in2000=debug:0x1e
 180 * -  in2000=proc:3
 181 */
 182
 183/* Normally, no defaults are specified... */
 184static char *setup_args[] = { "", "", "", "", "", "", "", "", "" };
 185
 186/* filled in by 'insmod' */
 187static char *setup_strings;
 188
 189module_param(setup_strings, charp, 0);
 190
 191static inline uchar read_3393(struct IN2000_hostdata *hostdata, uchar reg_num)
 192{
 193        write1_io(reg_num, IO_WD_ADDR);
 194        return read1_io(IO_WD_DATA);
 195}
 196
 197
 198#define READ_AUX_STAT() read1_io(IO_WD_ASR)
 199
 200
 201static inline void write_3393(struct IN2000_hostdata *hostdata, uchar reg_num, uchar value)
 202{
 203        write1_io(reg_num, IO_WD_ADDR);
 204        write1_io(value, IO_WD_DATA);
 205}
 206
 207
 208static inline void write_3393_cmd(struct IN2000_hostdata *hostdata, uchar cmd)
 209{
 210/*   while (READ_AUX_STAT() & ASR_CIP)
 211      printk("|");*/
 212        write1_io(WD_COMMAND, IO_WD_ADDR);
 213        write1_io(cmd, IO_WD_DATA);
 214}
 215
 216
 217static uchar read_1_byte(struct IN2000_hostdata *hostdata)
 218{
 219        uchar asr, x = 0;
 220
 221        write_3393(hostdata, WD_CONTROL, CTRL_IDI | CTRL_EDI | CTRL_POLLED);
 222        write_3393_cmd(hostdata, WD_CMD_TRANS_INFO | 0x80);
 223        do {
 224                asr = READ_AUX_STAT();
 225                if (asr & ASR_DBR)
 226                        x = read_3393(hostdata, WD_DATA);
 227        } while (!(asr & ASR_INT));
 228        return x;
 229}
 230
 231
 232static void write_3393_count(struct IN2000_hostdata *hostdata, unsigned long value)
 233{
 234        write1_io(WD_TRANSFER_COUNT_MSB, IO_WD_ADDR);
 235        write1_io((value >> 16), IO_WD_DATA);
 236        write1_io((value >> 8), IO_WD_DATA);
 237        write1_io(value, IO_WD_DATA);
 238}
 239
 240
 241static unsigned long read_3393_count(struct IN2000_hostdata *hostdata)
 242{
 243        unsigned long value;
 244
 245        write1_io(WD_TRANSFER_COUNT_MSB, IO_WD_ADDR);
 246        value = read1_io(IO_WD_DATA) << 16;
 247        value |= read1_io(IO_WD_DATA) << 8;
 248        value |= read1_io(IO_WD_DATA);
 249        return value;
 250}
 251
 252
 253/* The 33c93 needs to be told which direction a command transfers its
 254 * data; we use this function to figure it out. Returns true if there
 255 * will be a DATA_OUT phase with this command, false otherwise.
 256 * (Thanks to Joerg Dorchain for the research and suggestion.)
 257 */
 258static int is_dir_out(Scsi_Cmnd * cmd)
 259{
 260        switch (cmd->cmnd[0]) {
 261        case WRITE_6:
 262        case WRITE_10:
 263        case WRITE_12:
 264        case WRITE_LONG:
 265        case WRITE_SAME:
 266        case WRITE_BUFFER:
 267        case WRITE_VERIFY:
 268        case WRITE_VERIFY_12:
 269        case COMPARE:
 270        case COPY:
 271        case COPY_VERIFY:
 272        case SEARCH_EQUAL:
 273        case SEARCH_HIGH:
 274        case SEARCH_LOW:
 275        case SEARCH_EQUAL_12:
 276        case SEARCH_HIGH_12:
 277        case SEARCH_LOW_12:
 278        case FORMAT_UNIT:
 279        case REASSIGN_BLOCKS:
 280        case RESERVE:
 281        case MODE_SELECT:
 282        case MODE_SELECT_10:
 283        case LOG_SELECT:
 284        case SEND_DIAGNOSTIC:
 285        case CHANGE_DEFINITION:
 286        case UPDATE_BLOCK:
 287        case SET_WINDOW:
 288        case MEDIUM_SCAN:
 289        case SEND_VOLUME_TAG:
 290        case 0xea:
 291                return 1;
 292        default:
 293                return 0;
 294        }
 295}
 296
 297
 298
 299static struct sx_period sx_table[] = {
 300        {1, 0x20},
 301        {252, 0x20},
 302        {376, 0x30},
 303        {500, 0x40},
 304        {624, 0x50},
 305        {752, 0x60},
 306        {876, 0x70},
 307        {1000, 0x00},
 308        {0, 0}
 309};
 310
 311static int round_period(unsigned int period)
 312{
 313        int x;
 314
 315        for (x = 1; sx_table[x].period_ns; x++) {
 316                if ((period <= sx_table[x - 0].period_ns) && (period > sx_table[x - 1].period_ns)) {
 317                        return x;
 318                }
 319        }
 320        return 7;
 321}
 322
 323static uchar calc_sync_xfer(unsigned int period, unsigned int offset)
 324{
 325        uchar result;
 326
 327        period *= 4;            /* convert SDTR code to ns */
 328        result = sx_table[round_period(period)].reg_value;
 329        result |= (offset < OPTIMUM_SX_OFF) ? offset : OPTIMUM_SX_OFF;
 330        return result;
 331}
 332
 333
 334
 335static void in2000_execute(struct Scsi_Host *instance);
 336
 337static int in2000_queuecommand_lck(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *))
 338{
 339        struct Scsi_Host *instance;
 340        struct IN2000_hostdata *hostdata;
 341        Scsi_Cmnd *tmp;
 342
 343        instance = cmd->device->host;
 344        hostdata = (struct IN2000_hostdata *) instance->hostdata;
 345
 346        DB(DB_QUEUE_COMMAND, scmd_printk(KERN_DEBUG, cmd, "Q-%02x-%ld(", cmd->cmnd[0], cmd->serial_number))
 347
 348/* Set up a few fields in the Scsi_Cmnd structure for our own use:
 349 *  - host_scribble is the pointer to the next cmd in the input queue
 350 *  - scsi_done points to the routine we call when a cmd is finished
 351 *  - result is what you'd expect
 352 */
 353            cmd->host_scribble = NULL;
 354        cmd->scsi_done = done;
 355        cmd->result = 0;
 356
 357/* We use the Scsi_Pointer structure that's included with each command
 358 * as a scratchpad (as it's intended to be used!). The handy thing about
 359 * the SCp.xxx fields is that they're always associated with a given
 360 * cmd, and are preserved across disconnect-reselect. This means we
 361 * can pretty much ignore SAVE_POINTERS and RESTORE_POINTERS messages
 362 * if we keep all the critical pointers and counters in SCp:
 363 *  - SCp.ptr is the pointer into the RAM buffer
 364 *  - SCp.this_residual is the size of that buffer
 365 *  - SCp.buffer points to the current scatter-gather buffer
 366 *  - SCp.buffers_residual tells us how many S.G. buffers there are
 367 *  - SCp.have_data_in helps keep track of >2048 byte transfers
 368 *  - SCp.sent_command is not used
 369 *  - SCp.phase records this command's SRCID_ER bit setting
 370 */
 371
 372        if (scsi_bufflen(cmd)) {
 373                cmd->SCp.buffer = scsi_sglist(cmd);
 374                cmd->SCp.buffers_residual = scsi_sg_count(cmd) - 1;
 375                cmd->SCp.ptr = sg_virt(cmd->SCp.buffer);
 376                cmd->SCp.this_residual = cmd->SCp.buffer->length;
 377        } else {
 378                cmd->SCp.buffer = NULL;
 379                cmd->SCp.buffers_residual = 0;
 380                cmd->SCp.ptr = NULL;
 381                cmd->SCp.this_residual = 0;
 382        }
 383        cmd->SCp.have_data_in = 0;
 384
 385/* We don't set SCp.phase here - that's done in in2000_execute() */
 386
 387/* WD docs state that at the conclusion of a "LEVEL2" command, the
 388 * status byte can be retrieved from the LUN register. Apparently,
 389 * this is the case only for *uninterrupted* LEVEL2 commands! If
 390 * there are any unexpected phases entered, even if they are 100%
 391 * legal (different devices may choose to do things differently),
 392 * the LEVEL2 command sequence is exited. This often occurs prior
 393 * to receiving the status byte, in which case the driver does a
 394 * status phase interrupt and gets the status byte on its own.
 395 * While such a command can then be "resumed" (ie restarted to
 396 * finish up as a LEVEL2 command), the LUN register will NOT be
 397 * a valid status byte at the command's conclusion, and we must
 398 * use the byte obtained during the earlier interrupt. Here, we
 399 * preset SCp.Status to an illegal value (0xff) so that when
 400 * this command finally completes, we can tell where the actual
 401 * status byte is stored.
 402 */
 403
 404        cmd->SCp.Status = ILLEGAL_STATUS_BYTE;
 405
 406/* We need to disable interrupts before messing with the input
 407 * queue and calling in2000_execute().
 408 */
 409
 410        /*
 411         * Add the cmd to the end of 'input_Q'. Note that REQUEST_SENSE
 412         * commands are added to the head of the queue so that the desired
 413         * sense data is not lost before REQUEST_SENSE executes.
 414         */
 415
 416        if (!(hostdata->input_Q) || (cmd->cmnd[0] == REQUEST_SENSE)) {
 417                cmd->host_scribble = (uchar *) hostdata->input_Q;
 418                hostdata->input_Q = cmd;
 419        } else {                /* find the end of the queue */
 420                for (tmp = (Scsi_Cmnd *) hostdata->input_Q; tmp->host_scribble; tmp = (Scsi_Cmnd *) tmp->host_scribble);
 421                tmp->host_scribble = (uchar *) cmd;
 422        }
 423
 424/* We know that there's at least one command in 'input_Q' now.
 425 * Go see if any of them are runnable!
 426 */
 427
 428        in2000_execute(cmd->device->host);
 429
 430        DB(DB_QUEUE_COMMAND, printk(")Q-%ld ", cmd->serial_number))
 431            return 0;
 432}
 433
 434static DEF_SCSI_QCMD(in2000_queuecommand)
 435
 436
 437
 438/*
 439 * This routine attempts to start a scsi command. If the host_card is
 440 * already connected, we give up immediately. Otherwise, look through
 441 * the input_Q, using the first command we find that's intended
 442 * for a currently non-busy target/lun.
 443 * Note that this function is always called with interrupts already
 444 * disabled (either from in2000_queuecommand() or in2000_intr()).
 445 */
 446static void in2000_execute(struct Scsi_Host *instance)
 447{
 448        struct IN2000_hostdata *hostdata;
 449        Scsi_Cmnd *cmd, *prev;
 450        int i;
 451        unsigned short *sp;
 452        unsigned short f;
 453        unsigned short flushbuf[16];
 454
 455
 456        hostdata = (struct IN2000_hostdata *) instance->hostdata;
 457
 458        DB(DB_EXECUTE, printk("EX("))
 459
 460            if (hostdata->selecting || hostdata->connected) {
 461
 462                DB(DB_EXECUTE, printk(")EX-0 "))
 463
 464                    return;
 465        }
 466
 467        /*
 468         * Search through the input_Q for a command destined
 469         * for an idle target/lun.
 470         */
 471
 472        cmd = (Scsi_Cmnd *) hostdata->input_Q;
 473        prev = NULL;
 474        while (cmd) {
 475                if (!(hostdata->busy[cmd->device->id] & (1 << cmd->device->lun)))
 476                        break;
 477                prev = cmd;
 478                cmd = (Scsi_Cmnd *) cmd->host_scribble;
 479        }
 480
 481        /* quit if queue empty or all possible targets are busy */
 482
 483        if (!cmd) {
 484
 485                DB(DB_EXECUTE, printk(")EX-1 "))
 486
 487                    return;
 488        }
 489
 490        /*  remove command from queue */
 491
 492        if (prev)
 493                prev->host_scribble = cmd->host_scribble;
 494        else
 495                hostdata->input_Q = (Scsi_Cmnd *) cmd->host_scribble;
 496
 497#ifdef PROC_STATISTICS
 498        hostdata->cmd_cnt[cmd->device->id]++;
 499#endif
 500
 501/*
 502 * Start the selection process
 503 */
 504
 505        if (is_dir_out(cmd))
 506                write_3393(hostdata, WD_DESTINATION_ID, cmd->device->id);
 507        else
 508                write_3393(hostdata, WD_DESTINATION_ID, cmd->device->id | DSTID_DPD);
 509
 510/* Now we need to figure out whether or not this command is a good
 511 * candidate for disconnect/reselect. We guess to the best of our
 512 * ability, based on a set of hierarchical rules. When several
 513 * devices are operating simultaneously, disconnects are usually
 514 * an advantage. In a single device system, or if only 1 device
 515 * is being accessed, transfers usually go faster if disconnects
 516 * are not allowed:
 517 *
 518 * + Commands should NEVER disconnect if hostdata->disconnect =
 519 *   DIS_NEVER (this holds for tape drives also), and ALWAYS
 520 *   disconnect if hostdata->disconnect = DIS_ALWAYS.
 521 * + Tape drive commands should always be allowed to disconnect.
 522 * + Disconnect should be allowed if disconnected_Q isn't empty.
 523 * + Commands should NOT disconnect if input_Q is empty.
 524 * + Disconnect should be allowed if there are commands in input_Q
 525 *   for a different target/lun. In this case, the other commands
 526 *   should be made disconnect-able, if not already.
 527 *
 528 * I know, I know - this code would flunk me out of any
 529 * "C Programming 101" class ever offered. But it's easy
 530 * to change around and experiment with for now.
 531 */
 532
 533        cmd->SCp.phase = 0;     /* assume no disconnect */
 534        if (hostdata->disconnect == DIS_NEVER)
 535                goto no;
 536        if (hostdata->disconnect == DIS_ALWAYS)
 537                goto yes;
 538        if (cmd->device->type == 1)     /* tape drive? */
 539                goto yes;
 540        if (hostdata->disconnected_Q)   /* other commands disconnected? */
 541                goto yes;
 542        if (!(hostdata->input_Q))       /* input_Q empty? */
 543                goto no;
 544        for (prev = (Scsi_Cmnd *) hostdata->input_Q; prev; prev = (Scsi_Cmnd *) prev->host_scribble) {
 545                if ((prev->device->id != cmd->device->id) || (prev->device->lun != cmd->device->lun)) {
 546                        for (prev = (Scsi_Cmnd *) hostdata->input_Q; prev; prev = (Scsi_Cmnd *) prev->host_scribble)
 547                                prev->SCp.phase = 1;
 548                        goto yes;
 549                }
 550        }
 551        goto no;
 552
 553      yes:
 554        cmd->SCp.phase = 1;
 555
 556#ifdef PROC_STATISTICS
 557        hostdata->disc_allowed_cnt[cmd->device->id]++;
 558#endif
 559
 560      no:
 561        write_3393(hostdata, WD_SOURCE_ID, ((cmd->SCp.phase) ? SRCID_ER : 0));
 562
 563        write_3393(hostdata, WD_TARGET_LUN, cmd->device->lun);
 564        write_3393(hostdata, WD_SYNCHRONOUS_TRANSFER, hostdata->sync_xfer[cmd->device->id]);
 565        hostdata->busy[cmd->device->id] |= (1 << cmd->device->lun);
 566
 567        if ((hostdata->level2 <= L2_NONE) || (hostdata->sync_stat[cmd->device->id] == SS_UNSET)) {
 568
 569                /*
 570                 * Do a 'Select-With-ATN' command. This will end with
 571                 * one of the following interrupts:
 572                 *    CSR_RESEL_AM:  failure - can try again later.
 573                 *    CSR_TIMEOUT:   failure - give up.
 574                 *    CSR_SELECT:    success - proceed.
 575                 */
 576
 577                hostdata->selecting = cmd;
 578
 579/* Every target has its own synchronous transfer setting, kept in
 580 * the sync_xfer array, and a corresponding status byte in sync_stat[].
 581 * Each target's sync_stat[] entry is initialized to SS_UNSET, and its
 582 * sync_xfer[] entry is initialized to the default/safe value. SS_UNSET
 583 * means that the parameters are undetermined as yet, and that we
 584 * need to send an SDTR message to this device after selection is
 585 * complete. We set SS_FIRST to tell the interrupt routine to do so,
 586 * unless we don't want to even _try_ synchronous transfers: In this
 587 * case we set SS_SET to make the defaults final.
 588 */
 589                if (hostdata->sync_stat[cmd->device->id] == SS_UNSET) {
 590                        if (hostdata->sync_off & (1 << cmd->device->id))
 591                                hostdata->sync_stat[cmd->device->id] = SS_SET;
 592                        else
 593                                hostdata->sync_stat[cmd->device->id] = SS_FIRST;
 594                }
 595                hostdata->state = S_SELECTING;
 596                write_3393_count(hostdata, 0);  /* this guarantees a DATA_PHASE interrupt */
 597                write_3393_cmd(hostdata, WD_CMD_SEL_ATN);
 598        }
 599
 600        else {
 601
 602                /*
 603                 * Do a 'Select-With-ATN-Xfer' command. This will end with
 604                 * one of the following interrupts:
 605                 *    CSR_RESEL_AM:  failure - can try again later.
 606                 *    CSR_TIMEOUT:   failure - give up.
 607                 *    anything else: success - proceed.
 608                 */
 609
 610                hostdata->connected = cmd;
 611                write_3393(hostdata, WD_COMMAND_PHASE, 0);
 612
 613                /* copy command_descriptor_block into WD chip
 614                 * (take advantage of auto-incrementing)
 615                 */
 616
 617                write1_io(WD_CDB_1, IO_WD_ADDR);
 618                for (i = 0; i < cmd->cmd_len; i++)
 619                        write1_io(cmd->cmnd[i], IO_WD_DATA);
 620
 621                /* The wd33c93 only knows about Group 0, 1, and 5 commands when
 622                 * it's doing a 'select-and-transfer'. To be safe, we write the
 623                 * size of the CDB into the OWN_ID register for every case. This
 624                 * way there won't be problems with vendor-unique, audio, etc.
 625                 */
 626
 627                write_3393(hostdata, WD_OWN_ID, cmd->cmd_len);
 628
 629                /* When doing a non-disconnect command, we can save ourselves a DATA
 630                 * phase interrupt later by setting everything up now. With writes we
 631                 * need to pre-fill the fifo; if there's room for the 32 flush bytes,
 632                 * put them in there too - that'll avoid a fifo interrupt. Reads are
 633                 * somewhat simpler.
 634                 * KLUDGE NOTE: It seems that you can't completely fill the fifo here:
 635                 * This results in the IO_FIFO_COUNT register rolling over to zero,
 636                 * and apparently the gate array logic sees this as empty, not full,
 637                 * so the 3393 chip is never signalled to start reading from the
 638                 * fifo. Or maybe it's seen as a permanent fifo interrupt condition.
 639                 * Regardless, we fix this by temporarily pretending that the fifo
 640                 * is 16 bytes smaller. (I see now that the old driver has a comment
 641                 * about "don't fill completely" in an analogous place - must be the
 642                 * same deal.) This results in CDROM, swap partitions, and tape drives
 643                 * needing an extra interrupt per write command - I think we can live
 644                 * with that!
 645                 */
 646
 647                if (!(cmd->SCp.phase)) {
 648                        write_3393_count(hostdata, cmd->SCp.this_residual);
 649                        write_3393(hostdata, WD_CONTROL, CTRL_IDI | CTRL_EDI | CTRL_BUS);
 650                        write1_io(0, IO_FIFO_WRITE);    /* clear fifo counter, write mode */
 651
 652                        if (is_dir_out(cmd)) {
 653                                hostdata->fifo = FI_FIFO_WRITING;
 654                                if ((i = cmd->SCp.this_residual) > (IN2000_FIFO_SIZE - 16))
 655                                        i = IN2000_FIFO_SIZE - 16;
 656                                cmd->SCp.have_data_in = i;      /* this much data in fifo */
 657                                i >>= 1;        /* Gulp. Assuming modulo 2. */
 658                                sp = (unsigned short *) cmd->SCp.ptr;
 659                                f = hostdata->io_base + IO_FIFO;
 660
 661#ifdef FAST_WRITE_IO
 662
 663                                FAST_WRITE2_IO();
 664#else
 665                                while (i--)
 666                                        write2_io(*sp++, IO_FIFO);
 667
 668#endif
 669
 670                                /* Is there room for the flush bytes? */
 671
 672                                if (cmd->SCp.have_data_in <= ((IN2000_FIFO_SIZE - 16) - 32)) {
 673                                        sp = flushbuf;
 674                                        i = 16;
 675
 676#ifdef FAST_WRITE_IO
 677
 678                                        FAST_WRITE2_IO();
 679#else
 680                                        while (i--)
 681                                                write2_io(0, IO_FIFO);
 682
 683#endif
 684
 685                                }
 686                        }
 687
 688                        else {
 689                                write1_io(0, IO_FIFO_READ);     /* put fifo in read mode */
 690                                hostdata->fifo = FI_FIFO_READING;
 691                                cmd->SCp.have_data_in = 0;      /* nothing transferred yet */
 692                        }
 693
 694                } else {
 695                        write_3393_count(hostdata, 0);  /* this guarantees a DATA_PHASE interrupt */
 696                }
 697                hostdata->state = S_RUNNING_LEVEL2;
 698                write_3393_cmd(hostdata, WD_CMD_SEL_ATN_XFER);
 699        }
 700
 701        /*
 702         * Since the SCSI bus can handle only 1 connection at a time,
 703         * we get out of here now. If the selection fails, or when
 704         * the command disconnects, we'll come back to this routine
 705         * to search the input_Q again...
 706         */
 707
 708        DB(DB_EXECUTE, printk("%s%ld)EX-2 ", (cmd->SCp.phase) ? "d:" : "", cmd->serial_number))
 709
 710}
 711
 712
 713
 714static void transfer_pio(uchar * buf, int cnt, int data_in_dir, struct IN2000_hostdata *hostdata)
 715{
 716        uchar asr;
 717
 718        DB(DB_TRANSFER, printk("(%p,%d,%s)", buf, cnt, data_in_dir ? "in" : "out"))
 719
 720            write_3393(hostdata, WD_CONTROL, CTRL_IDI | CTRL_EDI | CTRL_POLLED);
 721        write_3393_count(hostdata, cnt);
 722        write_3393_cmd(hostdata, WD_CMD_TRANS_INFO);
 723        if (data_in_dir) {
 724                do {
 725                        asr = READ_AUX_STAT();
 726                        if (asr & ASR_DBR)
 727                                *buf++ = read_3393(hostdata, WD_DATA);
 728                } while (!(asr & ASR_INT));
 729        } else {
 730                do {
 731                        asr = READ_AUX_STAT();
 732                        if (asr & ASR_DBR)
 733                                write_3393(hostdata, WD_DATA, *buf++);
 734                } while (!(asr & ASR_INT));
 735        }
 736
 737        /* Note: we are returning with the interrupt UN-cleared.
 738         * Since (presumably) an entire I/O operation has
 739         * completed, the bus phase is probably different, and
 740         * the interrupt routine will discover this when it
 741         * responds to the uncleared int.
 742         */
 743
 744}
 745
 746
 747
 748static void transfer_bytes(Scsi_Cmnd * cmd, int data_in_dir)
 749{
 750        struct IN2000_hostdata *hostdata;
 751        unsigned short *sp;
 752        unsigned short f;
 753        int i;
 754
 755        hostdata = (struct IN2000_hostdata *) cmd->device->host->hostdata;
 756
 757/* Normally, you'd expect 'this_residual' to be non-zero here.
 758 * In a series of scatter-gather transfers, however, this
 759 * routine will usually be called with 'this_residual' equal
 760 * to 0 and 'buffers_residual' non-zero. This means that a
 761 * previous transfer completed, clearing 'this_residual', and
 762 * now we need to setup the next scatter-gather buffer as the
 763 * source or destination for THIS transfer.
 764 */
 765        if (!cmd->SCp.this_residual && cmd->SCp.buffers_residual) {
 766                ++cmd->SCp.buffer;
 767                --cmd->SCp.buffers_residual;
 768                cmd->SCp.this_residual = cmd->SCp.buffer->length;
 769                cmd->SCp.ptr = sg_virt(cmd->SCp.buffer);
 770        }
 771
 772/* Set up hardware registers */
 773
 774        write_3393(hostdata, WD_SYNCHRONOUS_TRANSFER, hostdata->sync_xfer[cmd->device->id]);
 775        write_3393_count(hostdata, cmd->SCp.this_residual);
 776        write_3393(hostdata, WD_CONTROL, CTRL_IDI | CTRL_EDI | CTRL_BUS);
 777        write1_io(0, IO_FIFO_WRITE);    /* zero counter, assume write */
 778
 779/* Reading is easy. Just issue the command and return - we'll
 780 * get an interrupt later when we have actual data to worry about.
 781 */
 782
 783        if (data_in_dir) {
 784                write1_io(0, IO_FIFO_READ);
 785                if ((hostdata->level2 >= L2_DATA) || (hostdata->level2 == L2_BASIC && cmd->SCp.phase == 0)) {
 786                        write_3393(hostdata, WD_COMMAND_PHASE, 0x45);
 787                        write_3393_cmd(hostdata, WD_CMD_SEL_ATN_XFER);
 788                        hostdata->state = S_RUNNING_LEVEL2;
 789                } else
 790                        write_3393_cmd(hostdata, WD_CMD_TRANS_INFO);
 791                hostdata->fifo = FI_FIFO_READING;
 792                cmd->SCp.have_data_in = 0;
 793                return;
 794        }
 795
 796/* Writing is more involved - we'll start the WD chip and write as
 797 * much data to the fifo as we can right now. Later interrupts will
 798 * write any bytes that don't make it at this stage.
 799 */
 800
 801        if ((hostdata->level2 >= L2_DATA) || (hostdata->level2 == L2_BASIC && cmd->SCp.phase == 0)) {
 802                write_3393(hostdata, WD_COMMAND_PHASE, 0x45);
 803                write_3393_cmd(hostdata, WD_CMD_SEL_ATN_XFER);
 804                hostdata->state = S_RUNNING_LEVEL2;
 805        } else
 806                write_3393_cmd(hostdata, WD_CMD_TRANS_INFO);
 807        hostdata->fifo = FI_FIFO_WRITING;
 808        sp = (unsigned short *) cmd->SCp.ptr;
 809
 810        if ((i = cmd->SCp.this_residual) > IN2000_FIFO_SIZE)
 811                i = IN2000_FIFO_SIZE;
 812        cmd->SCp.have_data_in = i;
 813        i >>= 1;                /* Gulp. We assume this_residual is modulo 2 */
 814        f = hostdata->io_base + IO_FIFO;
 815
 816#ifdef FAST_WRITE_IO
 817
 818        FAST_WRITE2_IO();
 819#else
 820        while (i--)
 821                write2_io(*sp++, IO_FIFO);
 822
 823#endif
 824
 825}
 826
 827
 828/* We need to use spin_lock_irqsave() & spin_unlock_irqrestore() in this
 829 * function in order to work in an SMP environment. (I'd be surprised
 830 * if the driver is ever used by anyone on a real multi-CPU motherboard,
 831 * but it _does_ need to be able to compile and run in an SMP kernel.)
 832 */
 833
 834static irqreturn_t in2000_intr(int irqnum, void *dev_id)
 835{
 836        struct Scsi_Host *instance = dev_id;
 837        struct IN2000_hostdata *hostdata;
 838        Scsi_Cmnd *patch, *cmd;
 839        uchar asr, sr, phs, id, lun, *ucp, msg;
 840        int i, j;
 841        unsigned long length;
 842        unsigned short *sp;
 843        unsigned short f;
 844        unsigned long flags;
 845
 846        hostdata = (struct IN2000_hostdata *) instance->hostdata;
 847
 848/* Get the spin_lock and disable further ints, for SMP */
 849
 850        spin_lock_irqsave(instance->host_lock, flags);
 851
 852#ifdef PROC_STATISTICS
 853        hostdata->int_cnt++;
 854#endif
 855
 856/* The IN2000 card has 2 interrupt sources OR'ed onto its IRQ line - the
 857 * WD3393 chip and the 2k fifo (which is actually a dual-port RAM combined
 858 * with a big logic array, so it's a little different than what you might
 859 * expect). As far as I know, there's no reason that BOTH can't be active
 860 * at the same time, but there's a problem: while we can read the 3393
 861 * to tell if _it_ wants an interrupt, I don't know of a way to ask the
 862 * fifo the same question. The best we can do is check the 3393 and if
 863 * it _isn't_ the source of the interrupt, then we can be pretty sure
 864 * that the fifo is the culprit.
 865 *  UPDATE: I have it on good authority (Bill Earnest) that bit 0 of the
 866 *          IO_FIFO_COUNT register mirrors the fifo interrupt state. I
 867 *          assume that bit clear means interrupt active. As it turns
 868 *          out, the driver really doesn't need to check for this after
 869 *          all, so my remarks above about a 'problem' can safely be
 870 *          ignored. The way the logic is set up, there's no advantage
 871 *          (that I can see) to worrying about it.
 872 *
 873 * It seems that the fifo interrupt signal is negated when we extract
 874 * bytes during read or write bytes during write.
 875 *  - fifo will interrupt when data is moving from it to the 3393, and
 876 *    there are 31 (or less?) bytes left to go. This is sort of short-
 877 *    sighted: what if you don't WANT to do more? In any case, our
 878 *    response is to push more into the fifo - either actual data or
 879 *    dummy bytes if need be. Note that we apparently have to write at
 880 *    least 32 additional bytes to the fifo after an interrupt in order
 881 *    to get it to release the ones it was holding on to - writing fewer
 882 *    than 32 will result in another fifo int.
 883 *  UPDATE: Again, info from Bill Earnest makes this more understandable:
 884 *          32 bytes = two counts of the fifo counter register. He tells
 885 *          me that the fifo interrupt is a non-latching signal derived
 886 *          from a straightforward boolean interpretation of the 7
 887 *          highest bits of the fifo counter and the fifo-read/fifo-write
 888 *          state. Who'd a thought?
 889 */
 890
 891        write1_io(0, IO_LED_ON);
 892        asr = READ_AUX_STAT();
 893        if (!(asr & ASR_INT)) { /* no WD33c93 interrupt? */
 894
 895/* Ok. This is definitely a FIFO-only interrupt.
 896 *
 897 * If FI_FIFO_READING is set, there are up to 2048 bytes waiting to be read,
 898 * maybe more to come from the SCSI bus. Read as many as we can out of the
 899 * fifo and into memory at the location of SCp.ptr[SCp.have_data_in], and
 900 * update have_data_in afterwards.
 901 *
 902 * If we have FI_FIFO_WRITING, the FIFO has almost run out of bytes to move
 903 * into the WD3393 chip (I think the interrupt happens when there are 31
 904 * bytes left, but it may be fewer...). The 3393 is still waiting, so we
 905 * shove some more into the fifo, which gets things moving again. If the
 906 * original SCSI command specified more than 2048 bytes, there may still
 907 * be some of that data left: fine - use it (from SCp.ptr[SCp.have_data_in]).
 908 * Don't forget to update have_data_in. If we've already written out the
 909 * entire buffer, feed 32 dummy bytes to the fifo - they're needed to
 910 * push out the remaining real data.
 911 *    (Big thanks to Bill Earnest for getting me out of the mud in here.)
 912 */
 913
 914                cmd = (Scsi_Cmnd *) hostdata->connected;        /* assume we're connected */
 915                CHECK_NULL(cmd, "fifo_int")
 916
 917                    if (hostdata->fifo == FI_FIFO_READING) {
 918
 919                        DB(DB_FIFO, printk("{R:%02x} ", read1_io(IO_FIFO_COUNT)))
 920
 921                            sp = (unsigned short *) (cmd->SCp.ptr + cmd->SCp.have_data_in);
 922                        i = read1_io(IO_FIFO_COUNT) & 0xfe;
 923                        i <<= 2;        /* # of words waiting in the fifo */
 924                        f = hostdata->io_base + IO_FIFO;
 925
 926#ifdef FAST_READ_IO
 927
 928                        FAST_READ2_IO();
 929#else
 930                        while (i--)
 931                                *sp++ = read2_io(IO_FIFO);
 932
 933#endif
 934
 935                        i = sp - (unsigned short *) (cmd->SCp.ptr + cmd->SCp.have_data_in);
 936                        i <<= 1;
 937                        cmd->SCp.have_data_in += i;
 938                }
 939
 940                else if (hostdata->fifo == FI_FIFO_WRITING) {
 941
 942                        DB(DB_FIFO, printk("{W:%02x} ", read1_io(IO_FIFO_COUNT)))
 943
 944/* If all bytes have been written to the fifo, flush out the stragglers.
 945 * Note that while writing 16 dummy words seems arbitrary, we don't
 946 * have another choice that I can see. What we really want is to read
 947 * the 3393 transfer count register (that would tell us how many bytes
 948 * needed flushing), but the TRANSFER_INFO command hasn't completed
 949 * yet (not enough bytes!) and that register won't be accessible. So,
 950 * we use 16 words - a number obtained through trial and error.
 951 *  UPDATE: Bill says this is exactly what Always does, so there.
 952 *          More thanks due him for help in this section.
 953 */
 954                            if (cmd->SCp.this_residual == cmd->SCp.have_data_in) {
 955                                i = 16;
 956                                while (i--)     /* write 32 dummy bytes */
 957                                        write2_io(0, IO_FIFO);
 958                        }
 959
 960/* If there are still bytes left in the SCSI buffer, write as many as we
 961 * can out to the fifo.
 962 */
 963
 964                        else {
 965                                sp = (unsigned short *) (cmd->SCp.ptr + cmd->SCp.have_data_in);
 966                                i = cmd->SCp.this_residual - cmd->SCp.have_data_in;     /* bytes yet to go */
 967                                j = read1_io(IO_FIFO_COUNT) & 0xfe;
 968                                j <<= 2;        /* how many words the fifo has room for */
 969                                if ((j << 1) > i)
 970                                        j = (i >> 1);
 971                                while (j--)
 972                                        write2_io(*sp++, IO_FIFO);
 973
 974                                i = sp - (unsigned short *) (cmd->SCp.ptr + cmd->SCp.have_data_in);
 975                                i <<= 1;
 976                                cmd->SCp.have_data_in += i;
 977                        }
 978                }
 979
 980                else {
 981                        printk("*** Spurious FIFO interrupt ***");
 982                }
 983
 984                write1_io(0, IO_LED_OFF);
 985
 986/* release the SMP spin_lock and restore irq state */
 987                spin_unlock_irqrestore(instance->host_lock, flags);
 988                return IRQ_HANDLED;
 989        }
 990
 991/* This interrupt was triggered by the WD33c93 chip. The fifo interrupt
 992 * may also be asserted, but we don't bother to check it: we get more
 993 * detailed info from FIFO_READING and FIFO_WRITING (see below).
 994 */
 995
 996        cmd = (Scsi_Cmnd *) hostdata->connected;        /* assume we're connected */
 997        sr = read_3393(hostdata, WD_SCSI_STATUS);       /* clear the interrupt */
 998        phs = read_3393(hostdata, WD_COMMAND_PHASE);
 999
1000        if (!cmd && (sr != CSR_RESEL_AM && sr != CSR_TIMEOUT && sr != CSR_SELECT)) {
1001                printk("\nNR:wd-intr-1\n");
1002                write1_io(0, IO_LED_OFF);
1003
1004/* release the SMP spin_lock and restore irq state */
1005                spin_unlock_irqrestore(instance->host_lock, flags);
1006                return IRQ_HANDLED;
1007        }
1008
1009        DB(DB_INTR, printk("{%02x:%02x-", asr, sr))
1010
1011/* After starting a FIFO-based transfer, the next _WD3393_ interrupt is
1012 * guaranteed to be in response to the completion of the transfer.
1013 * If we were reading, there's probably data in the fifo that needs
1014 * to be copied into RAM - do that here. Also, we have to update
1015 * 'this_residual' and 'ptr' based on the contents of the
1016 * TRANSFER_COUNT register, in case the device decided to do an
1017 * intermediate disconnect (a device may do this if it has to
1018 * do a seek,  or just to be nice and let other devices have
1019 * some bus time during long transfers).
1020 * After doing whatever is necessary with the fifo, we go on and
1021 * service the WD3393 interrupt normally.
1022 */
1023            if (hostdata->fifo == FI_FIFO_READING) {
1024
1025/* buffer index = start-of-buffer + #-of-bytes-already-read */
1026
1027                sp = (unsigned short *) (cmd->SCp.ptr + cmd->SCp.have_data_in);
1028
1029/* bytes remaining in fifo = (total-wanted - #-not-got) - #-already-read */
1030
1031                i = (cmd->SCp.this_residual - read_3393_count(hostdata)) - cmd->SCp.have_data_in;
1032                i >>= 1;        /* Gulp. We assume this will always be modulo 2 */
1033                f = hostdata->io_base + IO_FIFO;
1034
1035#ifdef FAST_READ_IO
1036
1037                FAST_READ2_IO();
1038#else
1039                while (i--)
1040                        *sp++ = read2_io(IO_FIFO);
1041
1042#endif
1043
1044                hostdata->fifo = FI_FIFO_UNUSED;
1045                length = cmd->SCp.this_residual;
1046                cmd->SCp.this_residual = read_3393_count(hostdata);
1047                cmd->SCp.ptr += (length - cmd->SCp.this_residual);
1048
1049                DB(DB_TRANSFER, printk("(%p,%d)", cmd->SCp.ptr, cmd->SCp.this_residual))
1050
1051        }
1052
1053        else if (hostdata->fifo == FI_FIFO_WRITING) {
1054                hostdata->fifo = FI_FIFO_UNUSED;
1055                length = cmd->SCp.this_residual;
1056                cmd->SCp.this_residual = read_3393_count(hostdata);
1057                cmd->SCp.ptr += (length - cmd->SCp.this_residual);
1058
1059                DB(DB_TRANSFER, printk("(%p,%d)", cmd->SCp.ptr, cmd->SCp.this_residual))
1060
1061        }
1062
1063/* Respond to the specific WD3393 interrupt - there are quite a few! */
1064
1065        switch (sr) {
1066
1067        case CSR_TIMEOUT:
1068                DB(DB_INTR, printk("TIMEOUT"))
1069
1070                    if (hostdata->state == S_RUNNING_LEVEL2)
1071                        hostdata->connected = NULL;
1072                else {
1073                        cmd = (Scsi_Cmnd *) hostdata->selecting;        /* get a valid cmd */
1074                        CHECK_NULL(cmd, "csr_timeout")
1075                            hostdata->selecting = NULL;
1076                }
1077
1078                cmd->result = DID_NO_CONNECT << 16;
1079                hostdata->busy[cmd->device->id] &= ~(1 << cmd->device->lun);
1080                hostdata->state = S_UNCONNECTED;
1081                cmd->scsi_done(cmd);
1082
1083/* We are not connected to a target - check to see if there
1084 * are commands waiting to be executed.
1085 */
1086
1087                in2000_execute(instance);
1088                break;
1089
1090
1091/* Note: this interrupt should not occur in a LEVEL2 command */
1092
1093        case CSR_SELECT:
1094                DB(DB_INTR, printk("SELECT"))
1095                    hostdata->connected = cmd = (Scsi_Cmnd *) hostdata->selecting;
1096                CHECK_NULL(cmd, "csr_select")
1097                    hostdata->selecting = NULL;
1098
1099                /* construct an IDENTIFY message with correct disconnect bit */
1100
1101                hostdata->outgoing_msg[0] = (0x80 | 0x00 | cmd->device->lun);
1102                if (cmd->SCp.phase)
1103                        hostdata->outgoing_msg[0] |= 0x40;
1104
1105                if (hostdata->sync_stat[cmd->device->id] == SS_FIRST) {
1106#ifdef SYNC_DEBUG
1107                        printk(" sending SDTR ");
1108#endif
1109
1110                        hostdata->sync_stat[cmd->device->id] = SS_WAITING;
1111
1112                        /* tack on a 2nd message to ask about synchronous transfers */
1113
1114                        hostdata->outgoing_msg[1] = EXTENDED_MESSAGE;
1115                        hostdata->outgoing_msg[2] = 3;
1116                        hostdata->outgoing_msg[3] = EXTENDED_SDTR;
1117                        hostdata->outgoing_msg[4] = OPTIMUM_SX_PER / 4;
1118                        hostdata->outgoing_msg[5] = OPTIMUM_SX_OFF;
1119                        hostdata->outgoing_len = 6;
1120                } else
1121                        hostdata->outgoing_len = 1;
1122
1123                hostdata->state = S_CONNECTED;
1124                break;
1125
1126
1127        case CSR_XFER_DONE | PHS_DATA_IN:
1128        case CSR_UNEXP | PHS_DATA_IN:
1129        case CSR_SRV_REQ | PHS_DATA_IN:
1130                DB(DB_INTR, printk("IN-%d.%d", cmd->SCp.this_residual, cmd->SCp.buffers_residual))
1131                    transfer_bytes(cmd, DATA_IN_DIR);
1132                if (hostdata->state != S_RUNNING_LEVEL2)
1133                        hostdata->state = S_CONNECTED;
1134                break;
1135
1136
1137        case CSR_XFER_DONE | PHS_DATA_OUT:
1138        case CSR_UNEXP | PHS_DATA_OUT:
1139        case CSR_SRV_REQ | PHS_DATA_OUT:
1140                DB(DB_INTR, printk("OUT-%d.%d", cmd->SCp.this_residual, cmd->SCp.buffers_residual))
1141                    transfer_bytes(cmd, DATA_OUT_DIR);
1142                if (hostdata->state != S_RUNNING_LEVEL2)
1143                        hostdata->state = S_CONNECTED;
1144                break;
1145
1146
1147/* Note: this interrupt should not occur in a LEVEL2 command */
1148
1149        case CSR_XFER_DONE | PHS_COMMAND:
1150        case CSR_UNEXP | PHS_COMMAND:
1151        case CSR_SRV_REQ | PHS_COMMAND:
1152                DB(DB_INTR, printk("CMND-%02x,%ld", cmd->cmnd[0], cmd->serial_number))
1153                    transfer_pio(cmd->cmnd, cmd->cmd_len, DATA_OUT_DIR, hostdata);
1154                hostdata->state = S_CONNECTED;
1155                break;
1156
1157
1158        case CSR_XFER_DONE | PHS_STATUS:
1159        case CSR_UNEXP | PHS_STATUS:
1160        case CSR_SRV_REQ | PHS_STATUS:
1161                DB(DB_INTR, printk("STATUS="))
1162
1163                    cmd->SCp.Status = read_1_byte(hostdata);
1164                DB(DB_INTR, printk("%02x", cmd->SCp.Status))
1165                    if (hostdata->level2 >= L2_BASIC) {
1166                        sr = read_3393(hostdata, WD_SCSI_STATUS);       /* clear interrupt */
1167                        hostdata->state = S_RUNNING_LEVEL2;
1168                        write_3393(hostdata, WD_COMMAND_PHASE, 0x50);
1169                        write_3393_cmd(hostdata, WD_CMD_SEL_ATN_XFER);
1170                } else {
1171                        hostdata->state = S_CONNECTED;
1172                }
1173                break;
1174
1175
1176        case CSR_XFER_DONE | PHS_MESS_IN:
1177        case CSR_UNEXP | PHS_MESS_IN:
1178        case CSR_SRV_REQ | PHS_MESS_IN:
1179                DB(DB_INTR, printk("MSG_IN="))
1180
1181                    msg = read_1_byte(hostdata);
1182                sr = read_3393(hostdata, WD_SCSI_STATUS);       /* clear interrupt */
1183
1184                hostdata->incoming_msg[hostdata->incoming_ptr] = msg;
1185                if (hostdata->incoming_msg[0] == EXTENDED_MESSAGE)
1186                        msg = EXTENDED_MESSAGE;
1187                else
1188                        hostdata->incoming_ptr = 0;
1189
1190                cmd->SCp.Message = msg;
1191                switch (msg) {
1192
1193                case COMMAND_COMPLETE:
1194                        DB(DB_INTR, printk("CCMP-%ld", cmd->serial_number))
1195                            write_3393_cmd(hostdata, WD_CMD_NEGATE_ACK);
1196                        hostdata->state = S_PRE_CMP_DISC;
1197                        break;
1198
1199                case SAVE_POINTERS:
1200                        DB(DB_INTR, printk("SDP"))
1201                            write_3393_cmd(hostdata, WD_CMD_NEGATE_ACK);
1202                        hostdata->state = S_CONNECTED;
1203                        break;
1204
1205                case RESTORE_POINTERS:
1206                        DB(DB_INTR, printk("RDP"))
1207                            if (hostdata->level2 >= L2_BASIC) {
1208                                write_3393(hostdata, WD_COMMAND_PHASE, 0x45);
1209                                write_3393_cmd(hostdata, WD_CMD_SEL_ATN_XFER);
1210                                hostdata->state = S_RUNNING_LEVEL2;
1211                        } else {
1212                                write_3393_cmd(hostdata, WD_CMD_NEGATE_ACK);
1213                                hostdata->state = S_CONNECTED;
1214                        }
1215                        break;
1216
1217                case DISCONNECT:
1218                        DB(DB_INTR, printk("DIS"))
1219                            cmd->device->disconnect = 1;
1220                        write_3393_cmd(hostdata, WD_CMD_NEGATE_ACK);
1221                        hostdata->state = S_PRE_TMP_DISC;
1222                        break;
1223
1224                case MESSAGE_REJECT:
1225                        DB(DB_INTR, printk("REJ"))
1226#ifdef SYNC_DEBUG
1227                            printk("-REJ-");
1228#endif
1229                        if (hostdata->sync_stat[cmd->device->id] == SS_WAITING)
1230                                hostdata->sync_stat[cmd->device->id] = SS_SET;
1231                        write_3393_cmd(hostdata, WD_CMD_NEGATE_ACK);
1232                        hostdata->state = S_CONNECTED;
1233                        break;
1234
1235                case EXTENDED_MESSAGE:
1236                        DB(DB_INTR, printk("EXT"))
1237
1238                            ucp = hostdata->incoming_msg;
1239
1240#ifdef SYNC_DEBUG
1241                        printk("%02x", ucp[hostdata->incoming_ptr]);
1242#endif
1243                        /* Is this the last byte of the extended message? */
1244
1245                        if ((hostdata->incoming_ptr >= 2) && (hostdata->incoming_ptr == (ucp[1] + 1))) {
1246
1247                                switch (ucp[2]) {       /* what's the EXTENDED code? */
1248                                case EXTENDED_SDTR:
1249                                        id = calc_sync_xfer(ucp[3], ucp[4]);
1250                                        if (hostdata->sync_stat[cmd->device->id] != SS_WAITING) {
1251
1252/* A device has sent an unsolicited SDTR message; rather than go
1253 * through the effort of decoding it and then figuring out what
1254 * our reply should be, we're just gonna say that we have a
1255 * synchronous fifo depth of 0. This will result in asynchronous
1256 * transfers - not ideal but so much easier.
1257 * Actually, this is OK because it assures us that if we don't
1258 * specifically ask for sync transfers, we won't do any.
1259 */
1260
1261                                                write_3393_cmd(hostdata, WD_CMD_ASSERT_ATN);    /* want MESS_OUT */
1262                                                hostdata->outgoing_msg[0] = EXTENDED_MESSAGE;
1263                                                hostdata->outgoing_msg[1] = 3;
1264                                                hostdata->outgoing_msg[2] = EXTENDED_SDTR;
1265                                                hostdata->outgoing_msg[3] = hostdata->default_sx_per / 4;
1266                                                hostdata->outgoing_msg[4] = 0;
1267                                                hostdata->outgoing_len = 5;
1268                                                hostdata->sync_xfer[cmd->device->id] = calc_sync_xfer(hostdata->default_sx_per / 4, 0);
1269                                        } else {
1270                                                hostdata->sync_xfer[cmd->device->id] = id;
1271                                        }
1272#ifdef SYNC_DEBUG
1273                                        printk("sync_xfer=%02x", hostdata->sync_xfer[cmd->device->id]);
1274#endif
1275                                        hostdata->sync_stat[cmd->device->id] = SS_SET;
1276                                        write_3393_cmd(hostdata, WD_CMD_NEGATE_ACK);
1277                                        hostdata->state = S_CONNECTED;
1278                                        break;
1279                                case EXTENDED_WDTR:
1280                                        write_3393_cmd(hostdata, WD_CMD_ASSERT_ATN);    /* want MESS_OUT */
1281                                        printk("sending WDTR ");
1282                                        hostdata->outgoing_msg[0] = EXTENDED_MESSAGE;
1283                                        hostdata->outgoing_msg[1] = 2;
1284                                        hostdata->outgoing_msg[2] = EXTENDED_WDTR;
1285                                        hostdata->outgoing_msg[3] = 0;  /* 8 bit transfer width */
1286                                        hostdata->outgoing_len = 4;
1287                                        write_3393_cmd(hostdata, WD_CMD_NEGATE_ACK);
1288                                        hostdata->state = S_CONNECTED;
1289                                        break;
1290                                default:
1291                                        write_3393_cmd(hostdata, WD_CMD_ASSERT_ATN);    /* want MESS_OUT */
1292                                        printk("Rejecting Unknown Extended Message(%02x). ", ucp[2]);
1293                                        hostdata->outgoing_msg[0] = MESSAGE_REJECT;
1294                                        hostdata->outgoing_len = 1;
1295                                        write_3393_cmd(hostdata, WD_CMD_NEGATE_ACK);
1296                                        hostdata->state = S_CONNECTED;
1297                                        break;
1298                                }
1299                                hostdata->incoming_ptr = 0;
1300                        }
1301
1302                        /* We need to read more MESS_IN bytes for the extended message */
1303
1304                        else {
1305                                hostdata->incoming_ptr++;
1306                                write_3393_cmd(hostdata, WD_CMD_NEGATE_ACK);
1307                                hostdata->state = S_CONNECTED;
1308                        }
1309                        break;
1310
1311                default:
1312                        printk("Rejecting Unknown Message(%02x) ", msg);
1313                        write_3393_cmd(hostdata, WD_CMD_ASSERT_ATN);    /* want MESS_OUT */
1314                        hostdata->outgoing_msg[0] = MESSAGE_REJECT;
1315                        hostdata->outgoing_len = 1;
1316                        write_3393_cmd(hostdata, WD_CMD_NEGATE_ACK);
1317                        hostdata->state = S_CONNECTED;
1318                }
1319                break;
1320
1321
1322/* Note: this interrupt will occur only after a LEVEL2 command */
1323
1324        case CSR_SEL_XFER_DONE:
1325
1326/* Make sure that reselection is enabled at this point - it may
1327 * have been turned off for the command that just completed.
1328 */
1329
1330                write_3393(hostdata, WD_SOURCE_ID, SRCID_ER);
1331                if (phs == 0x60) {
1332                        DB(DB_INTR, printk("SX-DONE-%ld", cmd->serial_number))
1333                            cmd->SCp.Message = COMMAND_COMPLETE;
1334                        lun = read_3393(hostdata, WD_TARGET_LUN);
1335                        DB(DB_INTR, printk(":%d.%d", cmd->SCp.Status, lun))
1336                            hostdata->connected = NULL;
1337                        hostdata->busy[cmd->device->id] &= ~(1 << cmd->device->lun);
1338                        hostdata->state = S_UNCONNECTED;
1339                        if (cmd->SCp.Status == ILLEGAL_STATUS_BYTE)
1340                                cmd->SCp.Status = lun;
1341                        if (cmd->cmnd[0] == REQUEST_SENSE && cmd->SCp.Status != GOOD)
1342                                cmd->result = (cmd->result & 0x00ffff) | (DID_ERROR << 16);
1343                        else
1344                                cmd->result = cmd->SCp.Status | (cmd->SCp.Message << 8);
1345                        cmd->scsi_done(cmd);
1346
1347/* We are no longer connected to a target - check to see if
1348 * there are commands waiting to be executed.
1349 */
1350
1351                        in2000_execute(instance);
1352                } else {
1353                        printk("%02x:%02x:%02x-%ld: Unknown SEL_XFER_DONE phase!!---", asr, sr, phs, cmd->serial_number);
1354                }
1355                break;
1356
1357
1358/* Note: this interrupt will occur only after a LEVEL2 command */
1359
1360        case CSR_SDP:
1361                DB(DB_INTR, printk("SDP"))
1362                    hostdata->state = S_RUNNING_LEVEL2;
1363                write_3393(hostdata, WD_COMMAND_PHASE, 0x41);
1364                write_3393_cmd(hostdata, WD_CMD_SEL_ATN_XFER);
1365                break;
1366
1367
1368        case CSR_XFER_DONE | PHS_MESS_OUT:
1369        case CSR_UNEXP | PHS_MESS_OUT:
1370        case CSR_SRV_REQ | PHS_MESS_OUT:
1371                DB(DB_INTR, printk("MSG_OUT="))
1372
1373/* To get here, we've probably requested MESSAGE_OUT and have
1374 * already put the correct bytes in outgoing_msg[] and filled
1375 * in outgoing_len. We simply send them out to the SCSI bus.
1376 * Sometimes we get MESSAGE_OUT phase when we're not expecting
1377 * it - like when our SDTR message is rejected by a target. Some
1378 * targets send the REJECT before receiving all of the extended
1379 * message, and then seem to go back to MESSAGE_OUT for a byte
1380 * or two. Not sure why, or if I'm doing something wrong to
1381 * cause this to happen. Regardless, it seems that sending
1382 * NOP messages in these situations results in no harm and
1383 * makes everyone happy.
1384 */
1385                    if (hostdata->outgoing_len == 0) {
1386                        hostdata->outgoing_len = 1;
1387                        hostdata->outgoing_msg[0] = NOP;
1388                }
1389                transfer_pio(hostdata->outgoing_msg, hostdata->outgoing_len, DATA_OUT_DIR, hostdata);
1390                DB(DB_INTR, printk("%02x", hostdata->outgoing_msg[0]))
1391                    hostdata->outgoing_len = 0;
1392                hostdata->state = S_CONNECTED;
1393                break;
1394
1395
1396        case CSR_UNEXP_DISC:
1397
1398/* I think I've seen this after a request-sense that was in response
1399 * to an error condition, but not sure. We certainly need to do
1400 * something when we get this interrupt - the question is 'what?'.
1401 * Let's think positively, and assume some command has finished
1402 * in a legal manner (like a command that provokes a request-sense),
1403 * so we treat it as a normal command-complete-disconnect.
1404 */
1405
1406
1407/* Make sure that reselection is enabled at this point - it may
1408 * have been turned off for the command that just completed.
1409 */
1410
1411                write_3393(hostdata, WD_SOURCE_ID, SRCID_ER);
1412                if (cmd == NULL) {
1413                        printk(" - Already disconnected! ");
1414                        hostdata->state = S_UNCONNECTED;
1415
1416/* release the SMP spin_lock and restore irq state */
1417                        spin_unlock_irqrestore(instance->host_lock, flags);
1418                        return IRQ_HANDLED;
1419                }
1420                DB(DB_INTR, printk("UNEXP_DISC-%ld", cmd->serial_number))
1421                    hostdata->connected = NULL;
1422                hostdata->busy[cmd->device->id] &= ~(1 << cmd->device->lun);
1423                hostdata->state = S_UNCONNECTED;
1424                if (cmd->cmnd[0] == REQUEST_SENSE && cmd->SCp.Status != GOOD)
1425                        cmd->result = (cmd->result & 0x00ffff) | (DID_ERROR << 16);
1426                else
1427                        cmd->result = cmd->SCp.Status | (cmd->SCp.Message << 8);
1428                cmd->scsi_done(cmd);
1429
1430/* We are no longer connected to a target - check to see if
1431 * there are commands waiting to be executed.
1432 */
1433
1434                in2000_execute(instance);
1435                break;
1436
1437
1438        case CSR_DISC:
1439
1440/* Make sure that reselection is enabled at this point - it may
1441 * have been turned off for the command that just completed.
1442 */
1443
1444                write_3393(hostdata, WD_SOURCE_ID, SRCID_ER);
1445                DB(DB_INTR, printk("DISC-%ld", cmd->serial_number))
1446                    if (cmd == NULL) {
1447                        printk(" - Already disconnected! ");
1448                        hostdata->state = S_UNCONNECTED;
1449                }
1450                switch (hostdata->state) {
1451                case S_PRE_CMP_DISC:
1452                        hostdata->connected = NULL;
1453                        hostdata->busy[cmd->device->id] &= ~(1 << cmd->device->lun);
1454                        hostdata->state = S_UNCONNECTED;
1455                        DB(DB_INTR, printk(":%d", cmd->SCp.Status))
1456                            if (cmd->cmnd[0] == REQUEST_SENSE && cmd->SCp.Status != GOOD)
1457                                cmd->result = (cmd->result & 0x00ffff) | (DID_ERROR << 16);
1458                        else
1459                                cmd->result = cmd->SCp.Status | (cmd->SCp.Message << 8);
1460                        cmd->scsi_done(cmd);
1461                        break;
1462                case S_PRE_TMP_DISC:
1463                case S_RUNNING_LEVEL2:
1464                        cmd->host_scribble = (uchar *) hostdata->disconnected_Q;
1465                        hostdata->disconnected_Q = cmd;
1466                        hostdata->connected = NULL;
1467                        hostdata->state = S_UNCONNECTED;
1468
1469#ifdef PROC_STATISTICS
1470                        hostdata->disc_done_cnt[cmd->device->id]++;
1471#endif
1472
1473                        break;
1474                default:
1475                        printk("*** Unexpected DISCONNECT interrupt! ***");
1476                        hostdata->state = S_UNCONNECTED;
1477                }
1478
1479/* We are no longer connected to a target - check to see if
1480 * there are commands waiting to be executed.
1481 */
1482
1483                in2000_execute(instance);
1484                break;
1485
1486
1487        case CSR_RESEL_AM:
1488                DB(DB_INTR, printk("RESEL"))
1489
1490                    /* First we have to make sure this reselection didn't */
1491                    /* happen during Arbitration/Selection of some other device. */
1492                    /* If yes, put losing command back on top of input_Q. */
1493                    if (hostdata->level2 <= L2_NONE) {
1494
1495                        if (hostdata->selecting) {
1496                                cmd = (Scsi_Cmnd *) hostdata->selecting;
1497                                hostdata->selecting = NULL;
1498                                hostdata->busy[cmd->device->id] &= ~(1 << cmd->device->lun);
1499                                cmd->host_scribble = (uchar *) hostdata->input_Q;
1500                                hostdata->input_Q = cmd;
1501                        }
1502                }
1503
1504                else {
1505
1506                        if (cmd) {
1507                                if (phs == 0x00) {
1508                                        hostdata->busy[cmd->device->id] &= ~(1 << cmd->device->lun);
1509                                        cmd->host_scribble = (uchar *) hostdata->input_Q;
1510                                        hostdata->input_Q = cmd;
1511                                } else {
1512                                        printk("---%02x:%02x:%02x-TROUBLE: Intrusive ReSelect!---", asr, sr, phs);
1513                                        while (1)
1514                                                printk("\r");
1515                                }
1516                        }
1517
1518                }
1519
1520                /* OK - find out which device reselected us. */
1521
1522                id = read_3393(hostdata, WD_SOURCE_ID);
1523                id &= SRCID_MASK;
1524
1525                /* and extract the lun from the ID message. (Note that we don't
1526                 * bother to check for a valid message here - I guess this is
1527                 * not the right way to go, but....)
1528                 */
1529
1530                lun = read_3393(hostdata, WD_DATA);
1531                if (hostdata->level2 < L2_RESELECT)
1532                        write_3393_cmd(hostdata, WD_CMD_NEGATE_ACK);
1533                lun &= 7;
1534
1535                /* Now we look for the command that's reconnecting. */
1536
1537                cmd = (Scsi_Cmnd *) hostdata->disconnected_Q;
1538                patch = NULL;
1539                while (cmd) {
1540                        if (id == cmd->device->id && lun == cmd->device->lun)
1541                                break;
1542                        patch = cmd;
1543                        cmd = (Scsi_Cmnd *) cmd->host_scribble;
1544                }
1545
1546                /* Hmm. Couldn't find a valid command.... What to do? */
1547
1548                if (!cmd) {
1549                        printk("---TROUBLE: target %d.%d not in disconnect queue---", id, lun);
1550                        break;
1551                }
1552
1553                /* Ok, found the command - now start it up again. */
1554
1555                if (patch)
1556                        patch->host_scribble = cmd->host_scribble;
1557                else
1558                        hostdata->disconnected_Q = (Scsi_Cmnd *) cmd->host_scribble;
1559                hostdata->connected = cmd;
1560
1561                /* We don't need to worry about 'initialize_SCp()' or 'hostdata->busy[]'
1562                 * because these things are preserved over a disconnect.
1563                 * But we DO need to fix the DPD bit so it's correct for this command.
1564                 */
1565
1566                if (is_dir_out(cmd))
1567                        write_3393(hostdata, WD_DESTINATION_ID, cmd->device->id);
1568                else
1569                        write_3393(hostdata, WD_DESTINATION_ID, cmd->device->id | DSTID_DPD);
1570                if (hostdata->level2 >= L2_RESELECT) {
1571                        write_3393_count(hostdata, 0);  /* we want a DATA_PHASE interrupt */
1572                        write_3393(hostdata, WD_COMMAND_PHASE, 0x45);
1573                        write_3393_cmd(hostdata, WD_CMD_SEL_ATN_XFER);
1574                        hostdata->state = S_RUNNING_LEVEL2;
1575                } else
1576                        hostdata->state = S_CONNECTED;
1577
1578                DB(DB_INTR, printk("-%ld", cmd->serial_number))
1579                    break;
1580
1581        default:
1582                printk("--UNKNOWN INTERRUPT:%02x:%02x:%02x--", asr, sr, phs);
1583        }
1584
1585        write1_io(0, IO_LED_OFF);
1586
1587        DB(DB_INTR, printk("} "))
1588
1589/* release the SMP spin_lock and restore irq state */
1590            spin_unlock_irqrestore(instance->host_lock, flags);
1591        return IRQ_HANDLED;
1592}
1593
1594
1595
1596#define RESET_CARD         0
1597#define RESET_CARD_AND_BUS 1
1598#define B_FLAG 0x80
1599
1600/*
1601 *      Caller must hold instance lock!
1602 */
1603
1604static int reset_hardware(struct Scsi_Host *instance, int type)
1605{
1606        struct IN2000_hostdata *hostdata;
1607        int qt, x;
1608
1609        hostdata = (struct IN2000_hostdata *) instance->hostdata;
1610
1611        write1_io(0, IO_LED_ON);
1612        if (type == RESET_CARD_AND_BUS) {
1613                write1_io(0, IO_CARD_RESET);
1614                x = read1_io(IO_HARDWARE);
1615        }
1616        x = read_3393(hostdata, WD_SCSI_STATUS);        /* clear any WD intrpt */
1617        write_3393(hostdata, WD_OWN_ID, instance->this_id | OWNID_EAF | OWNID_RAF | OWNID_FS_8);
1618        write_3393(hostdata, WD_CONTROL, CTRL_IDI | CTRL_EDI | CTRL_POLLED);
1619        write_3393(hostdata, WD_SYNCHRONOUS_TRANSFER, calc_sync_xfer(hostdata->default_sx_per / 4, DEFAULT_SX_OFF));
1620
1621        write1_io(0, IO_FIFO_WRITE);    /* clear fifo counter */
1622        write1_io(0, IO_FIFO_READ);     /* start fifo out in read mode */
1623        write_3393(hostdata, WD_COMMAND, WD_CMD_RESET);
1624        /* FIXME: timeout ?? */
1625        while (!(READ_AUX_STAT() & ASR_INT))
1626                cpu_relax();    /* wait for RESET to complete */
1627
1628        x = read_3393(hostdata, WD_SCSI_STATUS);        /* clear interrupt */
1629
1630        write_3393(hostdata, WD_QUEUE_TAG, 0xa5);       /* any random number */
1631        qt = read_3393(hostdata, WD_QUEUE_TAG);
1632        if (qt == 0xa5) {
1633                x |= B_FLAG;
1634                write_3393(hostdata, WD_QUEUE_TAG, 0);
1635        }
1636        write_3393(hostdata, WD_TIMEOUT_PERIOD, TIMEOUT_PERIOD_VALUE);
1637        write_3393(hostdata, WD_CONTROL, CTRL_IDI | CTRL_EDI | CTRL_POLLED);
1638        write1_io(0, IO_LED_OFF);
1639        return x;
1640}
1641
1642
1643
1644static int in2000_bus_reset(Scsi_Cmnd * cmd)
1645{
1646        struct Scsi_Host *instance;
1647        struct IN2000_hostdata *hostdata;
1648        int x;
1649        unsigned long flags;
1650
1651        instance = cmd->device->host;
1652        hostdata = (struct IN2000_hostdata *) instance->hostdata;
1653
1654        printk(KERN_WARNING "scsi%d: Reset. ", instance->host_no);
1655
1656        spin_lock_irqsave(instance->host_lock, flags);
1657
1658        /* do scsi-reset here */
1659        reset_hardware(instance, RESET_CARD_AND_BUS);
1660        for (x = 0; x < 8; x++) {
1661                hostdata->busy[x] = 0;
1662                hostdata->sync_xfer[x] = calc_sync_xfer(DEFAULT_SX_PER / 4, DEFAULT_SX_OFF);
1663                hostdata->sync_stat[x] = SS_UNSET;      /* using default sync values */
1664        }
1665        hostdata->input_Q = NULL;
1666        hostdata->selecting = NULL;
1667        hostdata->connected = NULL;
1668        hostdata->disconnected_Q = NULL;
1669        hostdata->state = S_UNCONNECTED;
1670        hostdata->fifo = FI_FIFO_UNUSED;
1671        hostdata->incoming_ptr = 0;
1672        hostdata->outgoing_len = 0;
1673
1674        cmd->result = DID_RESET << 16;
1675
1676        spin_unlock_irqrestore(instance->host_lock, flags);
1677        return SUCCESS;
1678}
1679
1680static int __in2000_abort(Scsi_Cmnd * cmd)
1681{
1682        struct Scsi_Host *instance;
1683        struct IN2000_hostdata *hostdata;
1684        Scsi_Cmnd *tmp, *prev;
1685        uchar sr, asr;
1686        unsigned long timeout;
1687
1688        instance = cmd->device->host;
1689        hostdata = (struct IN2000_hostdata *) instance->hostdata;
1690
1691        printk(KERN_DEBUG "scsi%d: Abort-", instance->host_no);
1692        printk("(asr=%02x,count=%ld,resid=%d,buf_resid=%d,have_data=%d,FC=%02x)- ", READ_AUX_STAT(), read_3393_count(hostdata), cmd->SCp.this_residual, cmd->SCp.buffers_residual, cmd->SCp.have_data_in, read1_io(IO_FIFO_COUNT));
1693
1694/*
1695 * Case 1 : If the command hasn't been issued yet, we simply remove it
1696 *     from the inout_Q.
1697 */
1698
1699        tmp = (Scsi_Cmnd *) hostdata->input_Q;
1700        prev = NULL;
1701        while (tmp) {
1702                if (tmp == cmd) {
1703                        if (prev)
1704                                prev->host_scribble = cmd->host_scribble;
1705                        cmd->host_scribble = NULL;
1706                        cmd->result = DID_ABORT << 16;
1707                        printk(KERN_WARNING "scsi%d: Abort - removing command %ld from input_Q. ", instance->host_no, cmd->serial_number);
1708                        cmd->scsi_done(cmd);
1709                        return SUCCESS;
1710                }
1711                prev = tmp;
1712                tmp = (Scsi_Cmnd *) tmp->host_scribble;
1713        }
1714
1715/*
1716 * Case 2 : If the command is connected, we're going to fail the abort
1717 *     and let the high level SCSI driver retry at a later time or
1718 *     issue a reset.
1719 *
1720 *     Timeouts, and therefore aborted commands, will be highly unlikely
1721 *     and handling them cleanly in this situation would make the common
1722 *     case of noresets less efficient, and would pollute our code.  So,
1723 *     we fail.
1724 */
1725
1726        if (hostdata->connected == cmd) {
1727
1728                printk(KERN_WARNING "scsi%d: Aborting connected command %ld - ", instance->host_no, cmd->serial_number);
1729
1730                printk("sending wd33c93 ABORT command - ");
1731                write_3393(hostdata, WD_CONTROL, CTRL_IDI | CTRL_EDI | CTRL_POLLED);
1732                write_3393_cmd(hostdata, WD_CMD_ABORT);
1733
1734/* Now we have to attempt to flush out the FIFO... */
1735
1736                printk("flushing fifo - ");
1737                timeout = 1000000;
1738                do {
1739                        asr = READ_AUX_STAT();
1740                        if (asr & ASR_DBR)
1741                                read_3393(hostdata, WD_DATA);
1742                } while (!(asr & ASR_INT) && timeout-- > 0);
1743                sr = read_3393(hostdata, WD_SCSI_STATUS);
1744                printk("asr=%02x, sr=%02x, %ld bytes un-transferred (timeout=%ld) - ", asr, sr, read_3393_count(hostdata), timeout);
1745
1746                /*
1747                 * Abort command processed.
1748                 * Still connected.
1749                 * We must disconnect.
1750                 */
1751
1752                printk("sending wd33c93 DISCONNECT command - ");
1753                write_3393_cmd(hostdata, WD_CMD_DISCONNECT);
1754
1755                timeout = 1000000;
1756                asr = READ_AUX_STAT();
1757                while ((asr & ASR_CIP) && timeout-- > 0)
1758                        asr = READ_AUX_STAT();
1759                sr = read_3393(hostdata, WD_SCSI_STATUS);
1760                printk("asr=%02x, sr=%02x.", asr, sr);
1761
1762                hostdata->busy[cmd->device->id] &= ~(1 << cmd->device->lun);
1763                hostdata->connected = NULL;
1764                hostdata->state = S_UNCONNECTED;
1765                cmd->result = DID_ABORT << 16;
1766                cmd->scsi_done(cmd);
1767
1768                in2000_execute(instance);
1769
1770                return SUCCESS;
1771        }
1772
1773/*
1774 * Case 3: If the command is currently disconnected from the bus,
1775 * we're not going to expend much effort here: Let's just return
1776 * an ABORT_SNOOZE and hope for the best...
1777 */
1778
1779        for (tmp = (Scsi_Cmnd *) hostdata->disconnected_Q; tmp; tmp = (Scsi_Cmnd *) tmp->host_scribble)
1780                if (cmd == tmp) {
1781                        printk(KERN_DEBUG "scsi%d: unable to abort disconnected command.\n", instance->host_no);
1782                        return FAILED;
1783                }
1784
1785/*
1786 * Case 4 : If we reached this point, the command was not found in any of
1787 *     the queues.
1788 *
1789 * We probably reached this point because of an unlikely race condition
1790 * between the command completing successfully and the abortion code,
1791 * so we won't panic, but we will notify the user in case something really
1792 * broke.
1793 */
1794
1795        in2000_execute(instance);
1796
1797        printk("scsi%d: warning : SCSI command probably completed successfully" "         before abortion. ", instance->host_no);
1798        return SUCCESS;
1799}
1800
1801static int in2000_abort(Scsi_Cmnd * cmd)
1802{
1803        int rc;
1804
1805        spin_lock_irq(cmd->device->host->host_lock);
1806        rc = __in2000_abort(cmd);
1807        spin_unlock_irq(cmd->device->host->host_lock);
1808
1809        return rc;
1810}
1811
1812
1813#define MAX_IN2000_HOSTS 3
1814#define MAX_SETUP_ARGS ARRAY_SIZE(setup_args)
1815#define SETUP_BUFFER_SIZE 200
1816static char setup_buffer[SETUP_BUFFER_SIZE];
1817static char setup_used[MAX_SETUP_ARGS];
1818static int done_setup = 0;
1819
1820static void __init in2000_setup(char *str, int *ints)
1821{
1822        int i;
1823        char *p1, *p2;
1824
1825        strlcpy(setup_buffer, str, SETUP_BUFFER_SIZE);
1826        p1 = setup_buffer;
1827        i = 0;
1828        while (*p1 && (i < MAX_SETUP_ARGS)) {
1829                p2 = strchr(p1, ',');
1830                if (p2) {
1831                        *p2 = '\0';
1832                        if (p1 != p2)
1833                                setup_args[i] = p1;
1834                        p1 = p2 + 1;
1835                        i++;
1836                } else {
1837                        setup_args[i] = p1;
1838                        break;
1839                }
1840        }
1841        for (i = 0; i < MAX_SETUP_ARGS; i++)
1842                setup_used[i] = 0;
1843        done_setup = 1;
1844}
1845
1846
1847/* check_setup_args() returns index if key found, 0 if not
1848 */
1849
1850static int __init check_setup_args(char *key, int *val, char *buf)
1851{
1852        int x;
1853        char *cp;
1854
1855        for (x = 0; x < MAX_SETUP_ARGS; x++) {
1856                if (setup_used[x])
1857                        continue;
1858                if (!strncmp(setup_args[x], key, strlen(key)))
1859                        break;
1860        }
1861        if (x == MAX_SETUP_ARGS)
1862                return 0;
1863        setup_used[x] = 1;
1864        cp = setup_args[x] + strlen(key);
1865        *val = -1;
1866        if (*cp != ':')
1867                return ++x;
1868        cp++;
1869        if ((*cp >= '0') && (*cp <= '9')) {
1870                *val = simple_strtoul(cp, NULL, 0);
1871        }
1872        return ++x;
1873}
1874
1875
1876
1877/* The "correct" (ie portable) way to access memory-mapped hardware
1878 * such as the IN2000 EPROM and dip switch is through the use of
1879 * special macros declared in 'asm/io.h'. We use readb() and readl()
1880 * when reading from the card's BIOS area in in2000_detect().
1881 */
1882static u32 bios_tab[] in2000__INITDATA = {
1883        0xc8000,
1884        0xd0000,
1885        0xd8000,
1886        0
1887};
1888
1889static unsigned short base_tab[] in2000__INITDATA = {
1890        0x220,
1891        0x200,
1892        0x110,
1893        0x100,
1894};
1895
1896static int int_tab[] in2000__INITDATA = {
1897        15,
1898        14,
1899        11,
1900        10
1901};
1902
1903static int probe_bios(u32 addr, u32 *s1, uchar *switches)
1904{
1905        void __iomem *p = ioremap(addr, 0x34);
1906        if (!p)
1907                return 0;
1908        *s1 = readl(p + 0x10);
1909        if (*s1 == 0x41564f4e || readl(p + 0x30) == 0x61776c41) {
1910                /* Read the switch image that's mapped into EPROM space */
1911                *switches = ~readb(p + 0x20);
1912                iounmap(p);
1913                return 1;
1914        }
1915        iounmap(p);
1916        return 0;
1917}
1918
1919static int __init in2000_detect(struct scsi_host_template * tpnt)
1920{
1921        struct Scsi_Host *instance;
1922        struct IN2000_hostdata *hostdata;
1923        int detect_count;
1924        int bios;
1925        int x;
1926        unsigned short base;
1927        uchar switches;
1928        uchar hrev;
1929        unsigned long flags;
1930        int val;
1931        char buf[32];
1932
1933/* Thanks to help from Bill Earnest, probing for IN2000 cards is a
1934 * pretty straightforward and fool-proof operation. There are 3
1935 * possible locations for the IN2000 EPROM in memory space - if we
1936 * find a BIOS signature, we can read the dip switch settings from
1937 * the byte at BIOS+32 (shadowed in by logic on the card). From 2
1938 * of the switch bits we get the card's address in IO space. There's
1939 * an image of the dip switch there, also, so we have a way to back-
1940 * check that this really is an IN2000 card. Very nifty. Use the
1941 * 'ioport:xx' command-line parameter if your BIOS EPROM is absent
1942 * or disabled.
1943 */
1944
1945        if (!done_setup && setup_strings)
1946                in2000_setup(setup_strings, NULL);
1947
1948        detect_count = 0;
1949        for (bios = 0; bios_tab[bios]; bios++) {
1950                u32 s1 = 0;
1951                if (check_setup_args("ioport", &val, buf)) {
1952                        base = val;
1953                        switches = ~inb(base + IO_SWITCHES) & 0xff;
1954                        printk("Forcing IN2000 detection at IOport 0x%x ", base);
1955                        bios = 2;
1956                }
1957/*
1958 * There have been a couple of BIOS versions with different layouts
1959 * for the obvious ID strings. We look for the 2 most common ones and
1960 * hope that they cover all the cases...
1961 */
1962                else if (probe_bios(bios_tab[bios], &s1, &switches)) {
1963                        printk("Found IN2000 BIOS at 0x%x ", (unsigned int) bios_tab[bios]);
1964
1965/* Find out where the IO space is */
1966
1967                        x = switches & (SW_ADDR0 | SW_ADDR1);
1968                        base = base_tab[x];
1969
1970/* Check for the IN2000 signature in IO space. */
1971
1972                        x = ~inb(base + IO_SWITCHES) & 0xff;
1973                        if (x != switches) {
1974                                printk("Bad IO signature: %02x vs %02x.\n", x, switches);
1975                                continue;
1976                        }
1977                } else
1978                        continue;
1979
1980/* OK. We have a base address for the IO ports - run a few safety checks */
1981
1982                if (!(switches & SW_BIT7)) {    /* I _think_ all cards do this */
1983                        printk("There is no IN-2000 SCSI card at IOport 0x%03x!\n", base);
1984                        continue;
1985                }
1986
1987/* Let's assume any hardware version will work, although the driver
1988 * has only been tested on 0x21, 0x22, 0x25, 0x26, and 0x27. We'll
1989 * print out the rev number for reference later, but accept them all.
1990 */
1991
1992                hrev = inb(base + IO_HARDWARE);
1993
1994                /* Bit 2 tells us if interrupts are disabled */
1995                if (switches & SW_DISINT) {
1996                        printk("The IN-2000 SCSI card at IOport 0x%03x ", base);
1997                        printk("is not configured for interrupt operation!\n");
1998                        printk("This driver requires an interrupt: cancelling detection.\n");
1999                        continue;
2000                }
2001
2002/* Ok. We accept that there's an IN2000 at ioaddr 'base'. Now
2003 * initialize it.
2004 */
2005
2006                tpnt->proc_name = "in2000";
2007                instance = scsi_register(tpnt, sizeof(struct IN2000_hostdata));
2008                if (instance == NULL)
2009                        continue;
2010                detect_count++;
2011                hostdata = (struct IN2000_hostdata *) instance->hostdata;
2012                instance->io_port = hostdata->io_base = base;
2013                hostdata->dip_switch = switches;
2014                hostdata->hrev = hrev;
2015
2016                write1_io(0, IO_FIFO_WRITE);    /* clear fifo counter */
2017                write1_io(0, IO_FIFO_READ);     /* start fifo out in read mode */
2018                write1_io(0, IO_INTR_MASK);     /* allow all ints */
2019                x = int_tab[(switches & (SW_INT0 | SW_INT1)) >> SW_INT_SHIFT];
2020                if (request_irq(x, in2000_intr, IRQF_DISABLED, "in2000", instance)) {
2021                        printk("in2000_detect: Unable to allocate IRQ.\n");
2022                        detect_count--;
2023                        continue;
2024                }
2025                instance->irq = x;
2026                instance->n_io_port = 13;
2027                request_region(base, 13, "in2000");     /* lock in this IO space for our use */
2028
2029                for (x = 0; x < 8; x++) {
2030                        hostdata->busy[x] = 0;
2031                        hostdata->sync_xfer[x] = calc_sync_xfer(DEFAULT_SX_PER / 4, DEFAULT_SX_OFF);
2032                        hostdata->sync_stat[x] = SS_UNSET;      /* using default sync values */
2033#ifdef PROC_STATISTICS
2034                        hostdata->cmd_cnt[x] = 0;
2035                        hostdata->disc_allowed_cnt[x] = 0;
2036                        hostdata->disc_done_cnt[x] = 0;
2037#endif
2038                }
2039                hostdata->input_Q = NULL;
2040                hostdata->selecting = NULL;
2041                hostdata->connected = NULL;
2042                hostdata->disconnected_Q = NULL;
2043                hostdata->state = S_UNCONNECTED;
2044                hostdata->fifo = FI_FIFO_UNUSED;
2045                hostdata->level2 = L2_BASIC;
2046                hostdata->disconnect = DIS_ADAPTIVE;
2047                hostdata->args = DEBUG_DEFAULTS;
2048                hostdata->incoming_ptr = 0;
2049                hostdata->outgoing_len = 0;
2050                hostdata->default_sx_per = DEFAULT_SX_PER;
2051
2052/* Older BIOS's had a 'sync on/off' switch - use its setting */
2053
2054                if (s1 == 0x41564f4e && (switches & SW_SYNC_DOS5))
2055                        hostdata->sync_off = 0x00;      /* sync defaults to on */
2056                else
2057                        hostdata->sync_off = 0xff;      /* sync defaults to off */
2058
2059#ifdef PROC_INTERFACE
2060                hostdata->proc = PR_VERSION | PR_INFO | PR_STATISTICS | PR_CONNECTED | PR_INPUTQ | PR_DISCQ | PR_STOP;
2061#ifdef PROC_STATISTICS
2062                hostdata->int_cnt = 0;
2063#endif
2064#endif
2065
2066                if (check_setup_args("nosync", &val, buf))
2067                        hostdata->sync_off = val;
2068
2069                if (check_setup_args("period", &val, buf))
2070                        hostdata->default_sx_per = sx_table[round_period((unsigned int) val)].period_ns;
2071
2072                if (check_setup_args("disconnect", &val, buf)) {
2073                        if ((val >= DIS_NEVER) && (val <= DIS_ALWAYS))
2074                                hostdata->disconnect = val;
2075                        else
2076                                hostdata->disconnect = DIS_ADAPTIVE;
2077                }
2078
2079                if (check_setup_args("noreset", &val, buf))
2080                        hostdata->args ^= A_NO_SCSI_RESET;
2081
2082                if (check_setup_args("level2", &val, buf))
2083                        hostdata->level2 = val;
2084
2085                if (check_setup_args("debug", &val, buf))
2086                        hostdata->args = (val & DB_MASK);
2087
2088#ifdef PROC_INTERFACE
2089                if (check_setup_args("proc", &val, buf))
2090                        hostdata->proc = val;
2091#endif
2092
2093
2094                /* FIXME: not strictly needed I think but the called code expects
2095                   to be locked */
2096                spin_lock_irqsave(instance->host_lock, flags);
2097                x = reset_hardware(instance, (hostdata->args & A_NO_SCSI_RESET) ? RESET_CARD : RESET_CARD_AND_BUS);
2098                spin_unlock_irqrestore(instance->host_lock, flags);
2099
2100                hostdata->microcode = read_3393(hostdata, WD_CDB_1);
2101                if (x & 0x01) {
2102                        if (x & B_FLAG)
2103                                hostdata->chip = C_WD33C93B;
2104                        else
2105                                hostdata->chip = C_WD33C93A;
2106                } else
2107                        hostdata->chip = C_WD33C93;
2108
2109                printk("dip_switch=%02x irq=%d ioport=%02x floppy=%s sync/DOS5=%s ", (switches & 0x7f), instance->irq, hostdata->io_base, (switches & SW_FLOPPY) ? "Yes" : "No", (switches & SW_SYNC_DOS5) ? "Yes" : "No");
2110                printk("hardware_ver=%02x chip=%s microcode=%02x\n", hrev, (hostdata->chip == C_WD33C93) ? "WD33c93" : (hostdata->chip == C_WD33C93A) ? "WD33c93A" : (hostdata->chip == C_WD33C93B) ? "WD33c93B" : "unknown", hostdata->microcode);
2111#ifdef DEBUGGING_ON
2112                printk("setup_args = ");
2113                for (x = 0; x < MAX_SETUP_ARGS; x++)
2114                        printk("%s,", setup_args[x]);
2115                printk("\n");
2116#endif
2117                if (hostdata->sync_off == 0xff)
2118                        printk("Sync-transfer DISABLED on all devices: ENABLE from command-line\n");
2119                printk("IN2000 driver version %s - %s\n", IN2000_VERSION, IN2000_DATE);
2120        }
2121
2122        return detect_count;
2123}
2124
2125static int in2000_release(struct Scsi_Host *shost)
2126{
2127        if (shost->irq)
2128                free_irq(shost->irq, shost);
2129        if (shost->io_port && shost->n_io_port)
2130                release_region(shost->io_port, shost->n_io_port);
2131        return 0;
2132}
2133
2134/* NOTE: I lifted this function straight out of the old driver,
2135 *       and have not tested it. Presumably it does what it's
2136 *       supposed to do...
2137 */
2138
2139static int in2000_biosparam(struct scsi_device *sdev, struct block_device *bdev, sector_t capacity, int *iinfo)
2140{
2141        int size;
2142
2143        size = capacity;
2144        iinfo[0] = 64;
2145        iinfo[1] = 32;
2146        iinfo[2] = size >> 11;
2147
2148/* This should approximate the large drive handling that the DOS ASPI manager
2149   uses.  Drives very near the boundaries may not be handled correctly (i.e.
2150   near 2.0 Gb and 4.0 Gb) */
2151
2152        if (iinfo[2] > 1024) {
2153                iinfo[0] = 64;
2154                iinfo[1] = 63;
2155                iinfo[2] = (unsigned long) capacity / (iinfo[0] * iinfo[1]);
2156        }
2157        if (iinfo[2] > 1024) {
2158                iinfo[0] = 128;
2159                iinfo[1] = 63;
2160                iinfo[2] = (unsigned long) capacity / (iinfo[0] * iinfo[1]);
2161        }
2162        if (iinfo[2] > 1024) {
2163                iinfo[0] = 255;
2164                iinfo[1] = 63;
2165                iinfo[2] = (unsigned long) capacity / (iinfo[0] * iinfo[1]);
2166        }
2167        return 0;
2168}
2169
2170
2171static int in2000_proc_info(struct Scsi_Host *instance, char *buf, char **start, off_t off, int len, int in)
2172{
2173
2174#ifdef PROC_INTERFACE
2175
2176        char *bp;
2177        char tbuf[128];
2178        unsigned long flags;
2179        struct IN2000_hostdata *hd;
2180        Scsi_Cmnd *cmd;
2181        int x, i;
2182        static int stop = 0;
2183
2184        hd = (struct IN2000_hostdata *) instance->hostdata;
2185
2186/* If 'in' is TRUE we need to _read_ the proc file. We accept the following
2187 * keywords (same format as command-line, but only ONE per read):
2188 *    debug
2189 *    disconnect
2190 *    period
2191 *    resync
2192 *    proc
2193 */
2194
2195        if (in) {
2196                buf[len] = '\0';
2197                bp = buf;
2198                if (!strncmp(bp, "debug:", 6)) {
2199                        bp += 6;
2200                        hd->args = simple_strtoul(bp, NULL, 0) & DB_MASK;
2201                } else if (!strncmp(bp, "disconnect:", 11)) {
2202                        bp += 11;
2203                        x = simple_strtoul(bp, NULL, 0);
2204                        if (x < DIS_NEVER || x > DIS_ALWAYS)
2205                                x = DIS_ADAPTIVE;
2206                        hd->disconnect = x;
2207                } else if (!strncmp(bp, "period:", 7)) {
2208                        bp += 7;
2209                        x = simple_strtoul(bp, NULL, 0);
2210                        hd->default_sx_per = sx_table[round_period((unsigned int) x)].period_ns;
2211                } else if (!strncmp(bp, "resync:", 7)) {
2212                        bp += 7;
2213                        x = simple_strtoul(bp, NULL, 0);
2214                        for (i = 0; i < 7; i++)
2215                                if (x & (1 << i))
2216                                        hd->sync_stat[i] = SS_UNSET;
2217                } else if (!strncmp(bp, "proc:", 5)) {
2218                        bp += 5;
2219                        hd->proc = simple_strtoul(bp, NULL, 0);
2220                } else if (!strncmp(bp, "level2:", 7)) {
2221                        bp += 7;
2222                        hd->level2 = simple_strtoul(bp, NULL, 0);
2223                }
2224                return len;
2225        }
2226
2227        spin_lock_irqsave(instance->host_lock, flags);
2228        bp = buf;
2229        *bp = '\0';
2230        if (hd->proc & PR_VERSION) {
2231                sprintf(tbuf, "\nVersion %s - %s. Compiled %s %s", IN2000_VERSION, IN2000_DATE, __DATE__, __TIME__);
2232                strcat(bp, tbuf);
2233        }
2234        if (hd->proc & PR_INFO) {
2235                sprintf(tbuf, "\ndip_switch=%02x: irq=%d io=%02x floppy=%s sync/DOS5=%s", (hd->dip_switch & 0x7f), instance->irq, hd->io_base, (hd->dip_switch & 0x40) ? "Yes" : "No", (hd->dip_switch & 0x20) ? "Yes" : "No");
2236                strcat(bp, tbuf);
2237                strcat(bp, "\nsync_xfer[] =       ");
2238                for (x = 0; x < 7; x++) {
2239                        sprintf(tbuf, "\t%02x", hd->sync_xfer[x]);
2240                        strcat(bp, tbuf);
2241                }
2242                strcat(bp, "\nsync_stat[] =       ");
2243                for (x = 0; x < 7; x++) {
2244                        sprintf(tbuf, "\t%02x", hd->sync_stat[x]);
2245                        strcat(bp, tbuf);
2246                }
2247        }
2248#ifdef PROC_STATISTICS
2249        if (hd->proc & PR_STATISTICS) {
2250                strcat(bp, "\ncommands issued:    ");
2251                for (x = 0; x < 7; x++) {
2252                        sprintf(tbuf, "\t%ld", hd->cmd_cnt[x]);
2253                        strcat(bp, tbuf);
2254                }
2255                strcat(bp, "\ndisconnects allowed:");
2256                for (x = 0; x < 7; x++) {
2257                        sprintf(tbuf, "\t%ld", hd->disc_allowed_cnt[x]);
2258                        strcat(bp, tbuf);
2259                }
2260                strcat(bp, "\ndisconnects done:   ");
2261                for (x = 0; x < 7; x++) {
2262                        sprintf(tbuf, "\t%ld", hd->disc_done_cnt[x]);
2263                        strcat(bp, tbuf);
2264                }
2265                sprintf(tbuf, "\ninterrupts:      \t%ld", hd->int_cnt);
2266                strcat(bp, tbuf);
2267        }
2268#endif
2269        if (hd->proc & PR_CONNECTED) {
2270                strcat(bp, "\nconnected:     ");
2271                if (hd->connected) {
2272                        cmd = (Scsi_Cmnd *) hd->connected;
2273                        sprintf(tbuf, " %ld-%d:%d(%02x)", cmd->serial_number, cmd->device->id, cmd->device->lun, cmd->cmnd[0]);
2274                        strcat(bp, tbuf);
2275                }
2276        }
2277        if (hd->proc & PR_INPUTQ) {
2278                strcat(bp, "\ninput_Q:       ");
2279                cmd = (Scsi_Cmnd *) hd->input_Q;
2280                while (cmd) {
2281                        sprintf(tbuf, " %ld-%d:%d(%02x)", cmd->serial_number, cmd->device->id, cmd->device->lun, cmd->cmnd[0]);
2282                        strcat(bp, tbuf);
2283                        cmd = (Scsi_Cmnd *) cmd->host_scribble;
2284                }
2285        }
2286        if (hd->proc & PR_DISCQ) {
2287                strcat(bp, "\ndisconnected_Q:");
2288                cmd = (Scsi_Cmnd *) hd->disconnected_Q;
2289                while (cmd) {
2290                        sprintf(tbuf, " %ld-%d:%d(%02x)", cmd->serial_number, cmd->device->id, cmd->device->lun, cmd->cmnd[0]);
2291                        strcat(bp, tbuf);
2292                        cmd = (Scsi_Cmnd *) cmd->host_scribble;
2293                }
2294        }
2295        if (hd->proc & PR_TEST) {
2296                ;               /* insert your own custom function here */
2297        }
2298        strcat(bp, "\n");
2299        spin_unlock_irqrestore(instance->host_lock, flags);
2300        *start = buf;
2301        if (stop) {
2302                stop = 0;
2303                return 0;       /* return 0 to signal end-of-file */
2304        }
2305        if (off > 0x40000)      /* ALWAYS stop after 256k bytes have been read */
2306                stop = 1;
2307        if (hd->proc & PR_STOP) /* stop every other time */
2308                stop = 1;
2309        return strlen(bp);
2310
2311#else                           /* PROC_INTERFACE */
2312
2313        return 0;
2314
2315#endif                          /* PROC_INTERFACE */
2316
2317}
2318
2319MODULE_LICENSE("GPL");
2320
2321
2322static struct scsi_host_template driver_template = {
2323        .proc_name                      = "in2000",
2324        .proc_info                      = in2000_proc_info,
2325        .name                           = "Always IN2000",
2326        .detect                         = in2000_detect, 
2327        .release                        = in2000_release,
2328        .queuecommand                   = in2000_queuecommand,
2329        .eh_abort_handler               = in2000_abort,
2330        .eh_bus_reset_handler           = in2000_bus_reset,
2331        .bios_param                     = in2000_biosparam, 
2332        .can_queue                      = IN2000_CAN_Q,
2333        .this_id                        = IN2000_HOST_ID,
2334        .sg_tablesize                   = IN2000_SG,
2335        .cmd_per_lun                    = IN2000_CPL,
2336        .use_clustering                 = DISABLE_CLUSTERING,
2337};
2338#include "scsi_module.c"
2339