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(", cmd->cmnd[0]))
 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 "))
 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)EX-2 ", (cmd->SCp.phase) ? "d:" : ""))
 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", cmd->cmnd[0]))
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"))
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"))
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: Unknown SEL_XFER_DONE phase!!---", asr, sr, phs);
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"))
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"))
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                    break;
1579
1580        default:
1581                printk("--UNKNOWN INTERRUPT:%02x:%02x:%02x--", asr, sr, phs);
1582        }
1583
1584        write1_io(0, IO_LED_OFF);
1585
1586        DB(DB_INTR, printk("} "))
1587
1588/* release the SMP spin_lock and restore irq state */
1589            spin_unlock_irqrestore(instance->host_lock, flags);
1590        return IRQ_HANDLED;
1591}
1592
1593
1594
1595#define RESET_CARD         0
1596#define RESET_CARD_AND_BUS 1
1597#define B_FLAG 0x80
1598
1599/*
1600 *      Caller must hold instance lock!
1601 */
1602
1603static int reset_hardware(struct Scsi_Host *instance, int type)
1604{
1605        struct IN2000_hostdata *hostdata;
1606        int qt, x;
1607
1608        hostdata = (struct IN2000_hostdata *) instance->hostdata;
1609
1610        write1_io(0, IO_LED_ON);
1611        if (type == RESET_CARD_AND_BUS) {
1612                write1_io(0, IO_CARD_RESET);
1613                x = read1_io(IO_HARDWARE);
1614        }
1615        x = read_3393(hostdata, WD_SCSI_STATUS);        /* clear any WD intrpt */
1616        write_3393(hostdata, WD_OWN_ID, instance->this_id | OWNID_EAF | OWNID_RAF | OWNID_FS_8);
1617        write_3393(hostdata, WD_CONTROL, CTRL_IDI | CTRL_EDI | CTRL_POLLED);
1618        write_3393(hostdata, WD_SYNCHRONOUS_TRANSFER, calc_sync_xfer(hostdata->default_sx_per / 4, DEFAULT_SX_OFF));
1619
1620        write1_io(0, IO_FIFO_WRITE);    /* clear fifo counter */
1621        write1_io(0, IO_FIFO_READ);     /* start fifo out in read mode */
1622        write_3393(hostdata, WD_COMMAND, WD_CMD_RESET);
1623        /* FIXME: timeout ?? */
1624        while (!(READ_AUX_STAT() & ASR_INT))
1625                cpu_relax();    /* wait for RESET to complete */
1626
1627        x = read_3393(hostdata, WD_SCSI_STATUS);        /* clear interrupt */
1628
1629        write_3393(hostdata, WD_QUEUE_TAG, 0xa5);       /* any random number */
1630        qt = read_3393(hostdata, WD_QUEUE_TAG);
1631        if (qt == 0xa5) {
1632                x |= B_FLAG;
1633                write_3393(hostdata, WD_QUEUE_TAG, 0);
1634        }
1635        write_3393(hostdata, WD_TIMEOUT_PERIOD, TIMEOUT_PERIOD_VALUE);
1636        write_3393(hostdata, WD_CONTROL, CTRL_IDI | CTRL_EDI | CTRL_POLLED);
1637        write1_io(0, IO_LED_OFF);
1638        return x;
1639}
1640
1641
1642
1643static int in2000_bus_reset(Scsi_Cmnd * cmd)
1644{
1645        struct Scsi_Host *instance;
1646        struct IN2000_hostdata *hostdata;
1647        int x;
1648        unsigned long flags;
1649
1650        instance = cmd->device->host;
1651        hostdata = (struct IN2000_hostdata *) instance->hostdata;
1652
1653        printk(KERN_WARNING "scsi%d: Reset. ", instance->host_no);
1654
1655        spin_lock_irqsave(instance->host_lock, flags);
1656
1657        /* do scsi-reset here */
1658        reset_hardware(instance, RESET_CARD_AND_BUS);
1659        for (x = 0; x < 8; x++) {
1660                hostdata->busy[x] = 0;
1661                hostdata->sync_xfer[x] = calc_sync_xfer(DEFAULT_SX_PER / 4, DEFAULT_SX_OFF);
1662                hostdata->sync_stat[x] = SS_UNSET;      /* using default sync values */
1663        }
1664        hostdata->input_Q = NULL;
1665        hostdata->selecting = NULL;
1666        hostdata->connected = NULL;
1667        hostdata->disconnected_Q = NULL;
1668        hostdata->state = S_UNCONNECTED;
1669        hostdata->fifo = FI_FIFO_UNUSED;
1670        hostdata->incoming_ptr = 0;
1671        hostdata->outgoing_len = 0;
1672
1673        cmd->result = DID_RESET << 16;
1674
1675        spin_unlock_irqrestore(instance->host_lock, flags);
1676        return SUCCESS;
1677}
1678
1679static int __in2000_abort(Scsi_Cmnd * cmd)
1680{
1681        struct Scsi_Host *instance;
1682        struct IN2000_hostdata *hostdata;
1683        Scsi_Cmnd *tmp, *prev;
1684        uchar sr, asr;
1685        unsigned long timeout;
1686
1687        instance = cmd->device->host;
1688        hostdata = (struct IN2000_hostdata *) instance->hostdata;
1689
1690        printk(KERN_DEBUG "scsi%d: Abort-", instance->host_no);
1691        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));
1692
1693/*
1694 * Case 1 : If the command hasn't been issued yet, we simply remove it
1695 *     from the inout_Q.
1696 */
1697
1698        tmp = (Scsi_Cmnd *) hostdata->input_Q;
1699        prev = NULL;
1700        while (tmp) {
1701                if (tmp == cmd) {
1702                        if (prev)
1703                                prev->host_scribble = cmd->host_scribble;
1704                        cmd->host_scribble = NULL;
1705                        cmd->result = DID_ABORT << 16;
1706                        printk(KERN_WARNING "scsi%d: Abort - removing command from input_Q. ", instance->host_no);
1707                        cmd->scsi_done(cmd);
1708                        return SUCCESS;
1709                }
1710                prev = tmp;
1711                tmp = (Scsi_Cmnd *) tmp->host_scribble;
1712        }
1713
1714/*
1715 * Case 2 : If the command is connected, we're going to fail the abort
1716 *     and let the high level SCSI driver retry at a later time or
1717 *     issue a reset.
1718 *
1719 *     Timeouts, and therefore aborted commands, will be highly unlikely
1720 *     and handling them cleanly in this situation would make the common
1721 *     case of noresets less efficient, and would pollute our code.  So,
1722 *     we fail.
1723 */
1724
1725        if (hostdata->connected == cmd) {
1726
1727                printk(KERN_WARNING "scsi%d: Aborting connected command - ", instance->host_no);
1728
1729                printk("sending wd33c93 ABORT command - ");
1730                write_3393(hostdata, WD_CONTROL, CTRL_IDI | CTRL_EDI | CTRL_POLLED);
1731                write_3393_cmd(hostdata, WD_CMD_ABORT);
1732
1733/* Now we have to attempt to flush out the FIFO... */
1734
1735                printk("flushing fifo - ");
1736                timeout = 1000000;
1737                do {
1738                        asr = READ_AUX_STAT();
1739                        if (asr & ASR_DBR)
1740                                read_3393(hostdata, WD_DATA);
1741                } while (!(asr & ASR_INT) && timeout-- > 0);
1742                sr = read_3393(hostdata, WD_SCSI_STATUS);
1743                printk("asr=%02x, sr=%02x, %ld bytes un-transferred (timeout=%ld) - ", asr, sr, read_3393_count(hostdata), timeout);
1744
1745                /*
1746                 * Abort command processed.
1747                 * Still connected.
1748                 * We must disconnect.
1749                 */
1750
1751                printk("sending wd33c93 DISCONNECT command - ");
1752                write_3393_cmd(hostdata, WD_CMD_DISCONNECT);
1753
1754                timeout = 1000000;
1755                asr = READ_AUX_STAT();
1756                while ((asr & ASR_CIP) && timeout-- > 0)
1757                        asr = READ_AUX_STAT();
1758                sr = read_3393(hostdata, WD_SCSI_STATUS);
1759                printk("asr=%02x, sr=%02x.", asr, sr);
1760
1761                hostdata->busy[cmd->device->id] &= ~(1 << cmd->device->lun);
1762                hostdata->connected = NULL;
1763                hostdata->state = S_UNCONNECTED;
1764                cmd->result = DID_ABORT << 16;
1765                cmd->scsi_done(cmd);
1766
1767                in2000_execute(instance);
1768
1769                return SUCCESS;
1770        }
1771
1772/*
1773 * Case 3: If the command is currently disconnected from the bus,
1774 * we're not going to expend much effort here: Let's just return
1775 * an ABORT_SNOOZE and hope for the best...
1776 */
1777
1778        for (tmp = (Scsi_Cmnd *) hostdata->disconnected_Q; tmp; tmp = (Scsi_Cmnd *) tmp->host_scribble)
1779                if (cmd == tmp) {
1780                        printk(KERN_DEBUG "scsi%d: unable to abort disconnected command.\n", instance->host_no);
1781                        return FAILED;
1782                }
1783
1784/*
1785 * Case 4 : If we reached this point, the command was not found in any of
1786 *     the queues.
1787 *
1788 * We probably reached this point because of an unlikely race condition
1789 * between the command completing successfully and the abortion code,
1790 * so we won't panic, but we will notify the user in case something really
1791 * broke.
1792 */
1793
1794        in2000_execute(instance);
1795
1796        printk("scsi%d: warning : SCSI command probably completed successfully" "         before abortion. ", instance->host_no);
1797        return SUCCESS;
1798}
1799
1800static int in2000_abort(Scsi_Cmnd * cmd)
1801{
1802        int rc;
1803
1804        spin_lock_irq(cmd->device->host->host_lock);
1805        rc = __in2000_abort(cmd);
1806        spin_unlock_irq(cmd->device->host->host_lock);
1807
1808        return rc;
1809}
1810
1811
1812#define MAX_IN2000_HOSTS 3
1813#define MAX_SETUP_ARGS ARRAY_SIZE(setup_args)
1814#define SETUP_BUFFER_SIZE 200
1815static char setup_buffer[SETUP_BUFFER_SIZE];
1816static char setup_used[MAX_SETUP_ARGS];
1817static int done_setup = 0;
1818
1819static void __init in2000_setup(char *str, int *ints)
1820{
1821        int i;
1822        char *p1, *p2;
1823
1824        strlcpy(setup_buffer, str, SETUP_BUFFER_SIZE);
1825        p1 = setup_buffer;
1826        i = 0;
1827        while (*p1 && (i < MAX_SETUP_ARGS)) {
1828                p2 = strchr(p1, ',');
1829                if (p2) {
1830                        *p2 = '\0';
1831                        if (p1 != p2)
1832                                setup_args[i] = p1;
1833                        p1 = p2 + 1;
1834                        i++;
1835                } else {
1836                        setup_args[i] = p1;
1837                        break;
1838                }
1839        }
1840        for (i = 0; i < MAX_SETUP_ARGS; i++)
1841                setup_used[i] = 0;
1842        done_setup = 1;
1843}
1844
1845
1846/* check_setup_args() returns index if key found, 0 if not
1847 */
1848
1849static int __init check_setup_args(char *key, int *val, char *buf)
1850{
1851        int x;
1852        char *cp;
1853
1854        for (x = 0; x < MAX_SETUP_ARGS; x++) {
1855                if (setup_used[x])
1856                        continue;
1857                if (!strncmp(setup_args[x], key, strlen(key)))
1858                        break;
1859        }
1860        if (x == MAX_SETUP_ARGS)
1861                return 0;
1862        setup_used[x] = 1;
1863        cp = setup_args[x] + strlen(key);
1864        *val = -1;
1865        if (*cp != ':')
1866                return ++x;
1867        cp++;
1868        if ((*cp >= '0') && (*cp <= '9')) {
1869                *val = simple_strtoul(cp, NULL, 0);
1870        }
1871        return ++x;
1872}
1873
1874
1875
1876/* The "correct" (ie portable) way to access memory-mapped hardware
1877 * such as the IN2000 EPROM and dip switch is through the use of
1878 * special macros declared in 'asm/io.h'. We use readb() and readl()
1879 * when reading from the card's BIOS area in in2000_detect().
1880 */
1881static u32 bios_tab[] in2000__INITDATA = {
1882        0xc8000,
1883        0xd0000,
1884        0xd8000,
1885        0
1886};
1887
1888static unsigned short base_tab[] in2000__INITDATA = {
1889        0x220,
1890        0x200,
1891        0x110,
1892        0x100,
1893};
1894
1895static int int_tab[] in2000__INITDATA = {
1896        15,
1897        14,
1898        11,
1899        10
1900};
1901
1902static int probe_bios(u32 addr, u32 *s1, uchar *switches)
1903{
1904        void __iomem *p = ioremap(addr, 0x34);
1905        if (!p)
1906                return 0;
1907        *s1 = readl(p + 0x10);
1908        if (*s1 == 0x41564f4e || readl(p + 0x30) == 0x61776c41) {
1909                /* Read the switch image that's mapped into EPROM space */
1910                *switches = ~readb(p + 0x20);
1911                iounmap(p);
1912                return 1;
1913        }
1914        iounmap(p);
1915        return 0;
1916}
1917
1918static int __init in2000_detect(struct scsi_host_template * tpnt)
1919{
1920        struct Scsi_Host *instance;
1921        struct IN2000_hostdata *hostdata;
1922        int detect_count;
1923        int bios;
1924        int x;
1925        unsigned short base;
1926        uchar switches;
1927        uchar hrev;
1928        unsigned long flags;
1929        int val;
1930        char buf[32];
1931
1932/* Thanks to help from Bill Earnest, probing for IN2000 cards is a
1933 * pretty straightforward and fool-proof operation. There are 3
1934 * possible locations for the IN2000 EPROM in memory space - if we
1935 * find a BIOS signature, we can read the dip switch settings from
1936 * the byte at BIOS+32 (shadowed in by logic on the card). From 2
1937 * of the switch bits we get the card's address in IO space. There's
1938 * an image of the dip switch there, also, so we have a way to back-
1939 * check that this really is an IN2000 card. Very nifty. Use the
1940 * 'ioport:xx' command-line parameter if your BIOS EPROM is absent
1941 * or disabled.
1942 */
1943
1944        if (!done_setup && setup_strings)
1945                in2000_setup(setup_strings, NULL);
1946
1947        detect_count = 0;
1948        for (bios = 0; bios_tab[bios]; bios++) {
1949                u32 s1 = 0;
1950                if (check_setup_args("ioport", &val, buf)) {
1951                        base = val;
1952                        switches = ~inb(base + IO_SWITCHES) & 0xff;
1953                        printk("Forcing IN2000 detection at IOport 0x%x ", base);
1954                        bios = 2;
1955                }
1956/*
1957 * There have been a couple of BIOS versions with different layouts
1958 * for the obvious ID strings. We look for the 2 most common ones and
1959 * hope that they cover all the cases...
1960 */
1961                else if (probe_bios(bios_tab[bios], &s1, &switches)) {
1962                        printk("Found IN2000 BIOS at 0x%x ", (unsigned int) bios_tab[bios]);
1963
1964/* Find out where the IO space is */
1965
1966                        x = switches & (SW_ADDR0 | SW_ADDR1);
1967                        base = base_tab[x];
1968
1969/* Check for the IN2000 signature in IO space. */
1970
1971                        x = ~inb(base + IO_SWITCHES) & 0xff;
1972                        if (x != switches) {
1973                                printk("Bad IO signature: %02x vs %02x.\n", x, switches);
1974                                continue;
1975                        }
1976                } else
1977                        continue;
1978
1979/* OK. We have a base address for the IO ports - run a few safety checks */
1980
1981                if (!(switches & SW_BIT7)) {    /* I _think_ all cards do this */
1982                        printk("There is no IN-2000 SCSI card at IOport 0x%03x!\n", base);
1983                        continue;
1984                }
1985
1986/* Let's assume any hardware version will work, although the driver
1987 * has only been tested on 0x21, 0x22, 0x25, 0x26, and 0x27. We'll
1988 * print out the rev number for reference later, but accept them all.
1989 */
1990
1991                hrev = inb(base + IO_HARDWARE);
1992
1993                /* Bit 2 tells us if interrupts are disabled */
1994                if (switches & SW_DISINT) {
1995                        printk("The IN-2000 SCSI card at IOport 0x%03x ", base);
1996                        printk("is not configured for interrupt operation!\n");
1997                        printk("This driver requires an interrupt: cancelling detection.\n");
1998                        continue;
1999                }
2000
2001/* Ok. We accept that there's an IN2000 at ioaddr 'base'. Now
2002 * initialize it.
2003 */
2004
2005                tpnt->proc_name = "in2000";
2006                instance = scsi_register(tpnt, sizeof(struct IN2000_hostdata));
2007                if (instance == NULL)
2008                        continue;
2009                detect_count++;
2010                hostdata = (struct IN2000_hostdata *) instance->hostdata;
2011                instance->io_port = hostdata->io_base = base;
2012                hostdata->dip_switch = switches;
2013                hostdata->hrev = hrev;
2014
2015                write1_io(0, IO_FIFO_WRITE);    /* clear fifo counter */
2016                write1_io(0, IO_FIFO_READ);     /* start fifo out in read mode */
2017                write1_io(0, IO_INTR_MASK);     /* allow all ints */
2018                x = int_tab[(switches & (SW_INT0 | SW_INT1)) >> SW_INT_SHIFT];
2019                if (request_irq(x, in2000_intr, IRQF_DISABLED, "in2000", instance)) {
2020                        printk("in2000_detect: Unable to allocate IRQ.\n");
2021                        detect_count--;
2022                        continue;
2023                }
2024                instance->irq = x;
2025                instance->n_io_port = 13;
2026                request_region(base, 13, "in2000");     /* lock in this IO space for our use */
2027
2028                for (x = 0; x < 8; x++) {
2029                        hostdata->busy[x] = 0;
2030                        hostdata->sync_xfer[x] = calc_sync_xfer(DEFAULT_SX_PER / 4, DEFAULT_SX_OFF);
2031                        hostdata->sync_stat[x] = SS_UNSET;      /* using default sync values */
2032#ifdef PROC_STATISTICS
2033                        hostdata->cmd_cnt[x] = 0;
2034                        hostdata->disc_allowed_cnt[x] = 0;
2035                        hostdata->disc_done_cnt[x] = 0;
2036#endif
2037                }
2038                hostdata->input_Q = NULL;
2039                hostdata->selecting = NULL;
2040                hostdata->connected = NULL;
2041                hostdata->disconnected_Q = NULL;
2042                hostdata->state = S_UNCONNECTED;
2043                hostdata->fifo = FI_FIFO_UNUSED;
2044                hostdata->level2 = L2_BASIC;
2045                hostdata->disconnect = DIS_ADAPTIVE;
2046                hostdata->args = DEBUG_DEFAULTS;
2047                hostdata->incoming_ptr = 0;
2048                hostdata->outgoing_len = 0;
2049                hostdata->default_sx_per = DEFAULT_SX_PER;
2050
2051/* Older BIOS's had a 'sync on/off' switch - use its setting */
2052
2053                if (s1 == 0x41564f4e && (switches & SW_SYNC_DOS5))
2054                        hostdata->sync_off = 0x00;      /* sync defaults to on */
2055                else
2056                        hostdata->sync_off = 0xff;      /* sync defaults to off */
2057
2058#ifdef PROC_INTERFACE
2059                hostdata->proc = PR_VERSION | PR_INFO | PR_STATISTICS | PR_CONNECTED | PR_INPUTQ | PR_DISCQ | PR_STOP;
2060#ifdef PROC_STATISTICS
2061                hostdata->int_cnt = 0;
2062#endif
2063#endif
2064
2065                if (check_setup_args("nosync", &val, buf))
2066                        hostdata->sync_off = val;
2067
2068                if (check_setup_args("period", &val, buf))
2069                        hostdata->default_sx_per = sx_table[round_period((unsigned int) val)].period_ns;
2070
2071                if (check_setup_args("disconnect", &val, buf)) {
2072                        if ((val >= DIS_NEVER) && (val <= DIS_ALWAYS))
2073                                hostdata->disconnect = val;
2074                        else
2075                                hostdata->disconnect = DIS_ADAPTIVE;
2076                }
2077
2078                if (check_setup_args("noreset", &val, buf))
2079                        hostdata->args ^= A_NO_SCSI_RESET;
2080
2081                if (check_setup_args("level2", &val, buf))
2082                        hostdata->level2 = val;
2083
2084                if (check_setup_args("debug", &val, buf))
2085                        hostdata->args = (val & DB_MASK);
2086
2087#ifdef PROC_INTERFACE
2088                if (check_setup_args("proc", &val, buf))
2089                        hostdata->proc = val;
2090#endif
2091
2092
2093                /* FIXME: not strictly needed I think but the called code expects
2094                   to be locked */
2095                spin_lock_irqsave(instance->host_lock, flags);
2096                x = reset_hardware(instance, (hostdata->args & A_NO_SCSI_RESET) ? RESET_CARD : RESET_CARD_AND_BUS);
2097                spin_unlock_irqrestore(instance->host_lock, flags);
2098
2099                hostdata->microcode = read_3393(hostdata, WD_CDB_1);
2100                if (x & 0x01) {
2101                        if (x & B_FLAG)
2102                                hostdata->chip = C_WD33C93B;
2103                        else
2104                                hostdata->chip = C_WD33C93A;
2105                } else
2106                        hostdata->chip = C_WD33C93;
2107
2108                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");
2109                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);
2110#ifdef DEBUGGING_ON
2111                printk("setup_args = ");
2112                for (x = 0; x < MAX_SETUP_ARGS; x++)
2113                        printk("%s,", setup_args[x]);
2114                printk("\n");
2115#endif
2116                if (hostdata->sync_off == 0xff)
2117                        printk("Sync-transfer DISABLED on all devices: ENABLE from command-line\n");
2118                printk("IN2000 driver version %s - %s\n", IN2000_VERSION, IN2000_DATE);
2119        }
2120
2121        return detect_count;
2122}
2123
2124static int in2000_release(struct Scsi_Host *shost)
2125{
2126        if (shost->irq)
2127                free_irq(shost->irq, shost);
2128        if (shost->io_port && shost->n_io_port)
2129                release_region(shost->io_port, shost->n_io_port);
2130        return 0;
2131}
2132
2133/* NOTE: I lifted this function straight out of the old driver,
2134 *       and have not tested it. Presumably it does what it's
2135 *       supposed to do...
2136 */
2137
2138static int in2000_biosparam(struct scsi_device *sdev, struct block_device *bdev, sector_t capacity, int *iinfo)
2139{
2140        int size;
2141
2142        size = capacity;
2143        iinfo[0] = 64;
2144        iinfo[1] = 32;
2145        iinfo[2] = size >> 11;
2146
2147/* This should approximate the large drive handling that the DOS ASPI manager
2148   uses.  Drives very near the boundaries may not be handled correctly (i.e.
2149   near 2.0 Gb and 4.0 Gb) */
2150
2151        if (iinfo[2] > 1024) {
2152                iinfo[0] = 64;
2153                iinfo[1] = 63;
2154                iinfo[2] = (unsigned long) capacity / (iinfo[0] * iinfo[1]);
2155        }
2156        if (iinfo[2] > 1024) {
2157                iinfo[0] = 128;
2158                iinfo[1] = 63;
2159                iinfo[2] = (unsigned long) capacity / (iinfo[0] * iinfo[1]);
2160        }
2161        if (iinfo[2] > 1024) {
2162                iinfo[0] = 255;
2163                iinfo[1] = 63;
2164                iinfo[2] = (unsigned long) capacity / (iinfo[0] * iinfo[1]);
2165        }
2166        return 0;
2167}
2168
2169
2170static int in2000_proc_info(struct Scsi_Host *instance, char *buf, char **start, off_t off, int len, int in)
2171{
2172
2173#ifdef PROC_INTERFACE
2174
2175        char *bp;
2176        char tbuf[128];
2177        unsigned long flags;
2178        struct IN2000_hostdata *hd;
2179        Scsi_Cmnd *cmd;
2180        int x, i;
2181        static int stop = 0;
2182
2183        hd = (struct IN2000_hostdata *) instance->hostdata;
2184
2185/* If 'in' is TRUE we need to _read_ the proc file. We accept the following
2186 * keywords (same format as command-line, but only ONE per read):
2187 *    debug
2188 *    disconnect
2189 *    period
2190 *    resync
2191 *    proc
2192 */
2193
2194        if (in) {
2195                buf[len] = '\0';
2196                bp = buf;
2197                if (!strncmp(bp, "debug:", 6)) {
2198                        bp += 6;
2199                        hd->args = simple_strtoul(bp, NULL, 0) & DB_MASK;
2200                } else if (!strncmp(bp, "disconnect:", 11)) {
2201                        bp += 11;
2202                        x = simple_strtoul(bp, NULL, 0);
2203                        if (x < DIS_NEVER || x > DIS_ALWAYS)
2204                                x = DIS_ADAPTIVE;
2205                        hd->disconnect = x;
2206                } else if (!strncmp(bp, "period:", 7)) {
2207                        bp += 7;
2208                        x = simple_strtoul(bp, NULL, 0);
2209                        hd->default_sx_per = sx_table[round_period((unsigned int) x)].period_ns;
2210                } else if (!strncmp(bp, "resync:", 7)) {
2211                        bp += 7;
2212                        x = simple_strtoul(bp, NULL, 0);
2213                        for (i = 0; i < 7; i++)
2214                                if (x & (1 << i))
2215                                        hd->sync_stat[i] = SS_UNSET;
2216                } else if (!strncmp(bp, "proc:", 5)) {
2217                        bp += 5;
2218                        hd->proc = simple_strtoul(bp, NULL, 0);
2219                } else if (!strncmp(bp, "level2:", 7)) {
2220                        bp += 7;
2221                        hd->level2 = simple_strtoul(bp, NULL, 0);
2222                }
2223                return len;
2224        }
2225
2226        spin_lock_irqsave(instance->host_lock, flags);
2227        bp = buf;
2228        *bp = '\0';
2229        if (hd->proc & PR_VERSION) {
2230                sprintf(tbuf, "\nVersion %s - %s.", IN2000_VERSION, IN2000_DATE);
2231                strcat(bp, tbuf);
2232        }
2233        if (hd->proc & PR_INFO) {
2234                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");
2235                strcat(bp, tbuf);
2236                strcat(bp, "\nsync_xfer[] =       ");
2237                for (x = 0; x < 7; x++) {
2238                        sprintf(tbuf, "\t%02x", hd->sync_xfer[x]);
2239                        strcat(bp, tbuf);
2240                }
2241                strcat(bp, "\nsync_stat[] =       ");
2242                for (x = 0; x < 7; x++) {
2243                        sprintf(tbuf, "\t%02x", hd->sync_stat[x]);
2244                        strcat(bp, tbuf);
2245                }
2246        }
2247#ifdef PROC_STATISTICS
2248        if (hd->proc & PR_STATISTICS) {
2249                strcat(bp, "\ncommands issued:    ");
2250                for (x = 0; x < 7; x++) {
2251                        sprintf(tbuf, "\t%ld", hd->cmd_cnt[x]);
2252                        strcat(bp, tbuf);
2253                }
2254                strcat(bp, "\ndisconnects allowed:");
2255                for (x = 0; x < 7; x++) {
2256                        sprintf(tbuf, "\t%ld", hd->disc_allowed_cnt[x]);
2257                        strcat(bp, tbuf);
2258                }
2259                strcat(bp, "\ndisconnects done:   ");
2260                for (x = 0; x < 7; x++) {
2261                        sprintf(tbuf, "\t%ld", hd->disc_done_cnt[x]);
2262                        strcat(bp, tbuf);
2263                }
2264                sprintf(tbuf, "\ninterrupts:      \t%ld", hd->int_cnt);
2265                strcat(bp, tbuf);
2266        }
2267#endif
2268        if (hd->proc & PR_CONNECTED) {
2269                strcat(bp, "\nconnected:     ");
2270                if (hd->connected) {
2271                        cmd = (Scsi_Cmnd *) hd->connected;
2272                        sprintf(tbuf, " %d:%d(%02x)", cmd->device->id, cmd->device->lun, cmd->cmnd[0]);
2273                        strcat(bp, tbuf);
2274                }
2275        }
2276        if (hd->proc & PR_INPUTQ) {
2277                strcat(bp, "\ninput_Q:       ");
2278                cmd = (Scsi_Cmnd *) hd->input_Q;
2279                while (cmd) {
2280                        sprintf(tbuf, " %d:%d(%02x)", cmd->device->id, cmd->device->lun, cmd->cmnd[0]);
2281                        strcat(bp, tbuf);
2282                        cmd = (Scsi_Cmnd *) cmd->host_scribble;
2283                }
2284        }
2285        if (hd->proc & PR_DISCQ) {
2286                strcat(bp, "\ndisconnected_Q:");
2287                cmd = (Scsi_Cmnd *) hd->disconnected_Q;
2288                while (cmd) {
2289                        sprintf(tbuf, " %d:%d(%02x)", cmd->device->id, cmd->device->lun, cmd->cmnd[0]);
2290                        strcat(bp, tbuf);
2291                        cmd = (Scsi_Cmnd *) cmd->host_scribble;
2292                }
2293        }
2294        if (hd->proc & PR_TEST) {
2295                ;               /* insert your own custom function here */
2296        }
2297        strcat(bp, "\n");
2298        spin_unlock_irqrestore(instance->host_lock, flags);
2299        *start = buf;
2300        if (stop) {
2301                stop = 0;
2302                return 0;       /* return 0 to signal end-of-file */
2303        }
2304        if (off > 0x40000)      /* ALWAYS stop after 256k bytes have been read */
2305                stop = 1;
2306        if (hd->proc & PR_STOP) /* stop every other time */
2307                stop = 1;
2308        return strlen(bp);
2309
2310#else                           /* PROC_INTERFACE */
2311
2312        return 0;
2313
2314#endif                          /* PROC_INTERFACE */
2315
2316}
2317
2318MODULE_LICENSE("GPL");
2319
2320
2321static struct scsi_host_template driver_template = {
2322        .proc_name                      = "in2000",
2323        .proc_info                      = in2000_proc_info,
2324        .name                           = "Always IN2000",
2325        .detect                         = in2000_detect, 
2326        .release                        = in2000_release,
2327        .queuecommand                   = in2000_queuecommand,
2328        .eh_abort_handler               = in2000_abort,
2329        .eh_bus_reset_handler           = in2000_bus_reset,
2330        .bios_param                     = in2000_biosparam, 
2331        .can_queue                      = IN2000_CAN_Q,
2332        .this_id                        = IN2000_HOST_ID,
2333        .sg_tablesize                   = IN2000_SG,
2334        .cmd_per_lun                    = IN2000_CPL,
2335        .use_clustering                 = DISABLE_CLUSTERING,
2336};
2337#include "scsi_module.c"
2338