linux/drivers/scsi/aha152x.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/* aha152x.c -- Adaptec AHA-152x driver
   3 * Author: Jürgen E. Fischer, fischer@norbit.de
   4 * Copyright 1993-2004 Jürgen E. Fischer
   5 *
   6 * $Id: aha152x.c,v 2.7 2004/01/24 11:42:59 fischer Exp $
   7 *
   8 * $Log: aha152x.c,v $
   9 * Revision 2.7  2004/01/24 11:42:59  fischer
  10 * - gather code that is not used by PCMCIA at the end
  11 * - move request_region for !PCMCIA case to detection
  12 * - migration to new scsi host api (remove legacy code)
  13 * - free host scribble before scsi_done
  14 * - fix error handling
  15 * - one isapnp device added to id_table
  16 *
  17 * Revision 2.6  2003/10/30 20:52:47  fischer
  18 * - interfaces changes for kernel 2.6
  19 * - aha152x_probe_one introduced for pcmcia stub
  20 * - fixed pnpdev handling
  21 * - instead of allocation a new one, reuse command for request sense after check condition and reset
  22 * - fixes race in is_complete
  23 *
  24 * Revision 2.5  2002/04/14 11:24:53  fischer
  25 * - isapnp support
  26 * - abort fixed
  27 * - 2.5 support
  28 *
  29 * Revision 2.4  2000/12/16 12:53:56  fischer
  30 * - allow REQUEST SENSE to be queued
  31 * - handle shared PCI interrupts
  32 *
  33 * Revision 2.3  2000/11/04 16:40:26  fischer
  34 * - handle data overruns
  35 * - extend timeout for data phases
  36 *
  37 * Revision 2.2  2000/08/08 19:54:53  fischer
  38 * - minor changes
  39 *
  40 * Revision 2.1  2000/05/17 16:23:17  fischer
  41 * - signature update
  42 * - fix for data out w/o scatter gather
  43 *
  44 * Revision 2.0  1999/12/25 15:07:32  fischer
  45 * - interrupt routine completly reworked
  46 * - basic support for new eh code
  47 *
  48 * Revision 1.21  1999/11/10 23:46:36  fischer
  49 * - default to synchronous operation
  50 * - synchronous negotiation fixed
  51 * - added timeout to loops
  52 * - debugging output can be controlled through procfs
  53 *
  54 * Revision 1.20  1999/11/07 18:37:31  fischer
  55 * - synchronous operation works
  56 * - resid support for sg driver
  57 *
  58 * Revision 1.19  1999/11/02 22:39:59  fischer
  59 * - moved leading comments to README.aha152x
  60 * - new additional module parameters
  61 * - updates for 2.3
  62 * - support for the Tripace TC1550 controller
  63 * - interrupt handling changed
  64 *
  65 * Revision 1.18  1996/09/07 20:10:40  fischer
  66 * - fixed can_queue handling (multiple outstanding commands working again)
  67 *
  68 * Revision 1.17  1996/08/17 16:05:14  fischer
  69 * - biosparam improved
  70 * - interrupt verification
  71 * - updated documentation
  72 * - cleanups
  73 *
  74 * Revision 1.16  1996/06/09 00:04:56  root
  75 * - added configuration symbols for insmod (aha152x/aha152x1)
  76 *
  77 * Revision 1.15  1996/04/30 14:52:06  fischer
  78 * - proc info fixed
  79 * - support for extended translation for >1GB disks
  80 *
  81 * Revision 1.14  1996/01/17  15:11:20  fischer
  82 * - fixed lockup in MESSAGE IN phase after reconnection
  83 *
  84 * Revision 1.13  1996/01/09  02:15:53  fischer
  85 * - some cleanups
  86 * - moved request_irq behind controller initialization
  87 *   (to avoid spurious interrupts)
  88 *
  89 * Revision 1.12  1995/12/16  12:26:07  fischer
  90 * - barrier()s added
  91 * - configurable RESET delay added
  92 *
  93 * Revision 1.11  1995/12/06  21:18:35  fischer
  94 * - some minor updates
  95 *
  96 * Revision 1.10  1995/07/22  19:18:45  fischer
  97 * - support for 2 controllers
  98 * - started synchronous data transfers (not working yet)
  99 *
 100 * Revision 1.9  1995/03/18  09:20:24  root
 101 * - patches for PCMCIA and modules
 102 *
 103 * Revision 1.8  1995/01/21  22:07:19  root
 104 * - snarf_region => request_region
 105 * - aha152x_intr interface change
 106 *
 107 * Revision 1.7  1995/01/02  23:19:36  root
 108 * - updated COMMAND_SIZE to cmd_len
 109 * - changed sti() to restore_flags()
 110 * - fixed some #ifdef which generated warnings
 111 *
 112 * Revision 1.6  1994/11/24  20:35:27  root
 113 * - problem with odd number of bytes in fifo fixed
 114 *
 115 * Revision 1.5  1994/10/30  14:39:56  root
 116 * - abort code fixed
 117 * - debugging improved
 118 *
 119 * Revision 1.4  1994/09/12  11:33:01  root
 120 * - irqaction to request_irq
 121 * - abortion updated
 122 *
 123 * Revision 1.3  1994/08/04  13:53:05  root
 124 * - updates for mid-level-driver changes
 125 * - accept unexpected BUSFREE phase as error condition
 126 * - parity check now configurable
 127 *
 128 * Revision 1.2  1994/07/03  12:56:36  root
 129 * - cleaned up debugging code
 130 * - more tweaking on reset delays
 131 * - updated abort/reset code (pretty untested...)
 132 *
 133 * Revision 1.1  1994/05/28  21:18:49  root
 134 * - update for mid-level interface change (abort-reset)
 135 * - delays after resets adjusted for some slow devices
 136 *
 137 * Revision 1.0  1994/03/25  12:52:00  root
 138 * - Fixed "more data than expected" problem
 139 * - added new BIOS signatures
 140 *
 141 * Revision 0.102  1994/01/31  20:44:12  root
 142 * - minor changes in insw/outsw handling
 143 *
 144 * Revision 0.101  1993/12/13  01:16:27  root
 145 * - fixed STATUS phase (non-GOOD stati were dropped sometimes;
 146 *   fixes problems with CD-ROM sector size detection & media change)
 147 *
 148 * Revision 0.100  1993/12/10  16:58:47  root
 149 * - fix for unsuccessful selections in case of non-continuous id assignments
 150 *   on the scsi bus.
 151 *
 152 * Revision 0.99  1993/10/24  16:19:59  root
 153 * - fixed DATA IN (rare read errors gone)
 154 *
 155 * Revision 0.98  1993/10/17  12:54:44  root
 156 * - fixed some recent fixes (shame on me)
 157 * - moved initialization of scratch area to aha152x_queue
 158 *
 159 * Revision 0.97  1993/10/09  18:53:53  root
 160 * - DATA IN fixed. Rarely left data in the fifo.
 161 *
 162 * Revision 0.96  1993/10/03  00:53:59  root
 163 * - minor changes on DATA IN
 164 *
 165 * Revision 0.95  1993/09/24  10:36:01  root
 166 * - change handling of MSGI after reselection
 167 * - fixed sti/cli
 168 * - minor changes
 169 *
 170 * Revision 0.94  1993/09/18  14:08:22  root
 171 * - fixed bug in multiple outstanding command code
 172 * - changed detection
 173 * - support for kernel command line configuration
 174 * - reset corrected
 175 * - changed message handling
 176 *
 177 * Revision 0.93  1993/09/15  20:41:19  root
 178 * - fixed bugs with multiple outstanding commands
 179 *
 180 * Revision 0.92  1993/09/13  02:46:33  root
 181 * - multiple outstanding commands work (no problems with IBM drive)
 182 *
 183 * Revision 0.91  1993/09/12  20:51:46  root
 184 * added multiple outstanding commands
 185 * (some problem with this $%&? IBM device remain)
 186 *
 187 * Revision 0.9  1993/09/12  11:11:22  root
 188 * - corrected auto-configuration
 189 * - changed the auto-configuration (added some '#define's)
 190 * - added support for dis-/reconnection
 191 *
 192 * Revision 0.8  1993/09/06  23:09:39  root
 193 * - added support for the drive activity light
 194 * - minor changes
 195 *
 196 * Revision 0.7  1993/09/05  14:30:15  root
 197 * - improved phase detection
 198 * - now using the new snarf_region code of 0.99pl13
 199 *
 200 * Revision 0.6  1993/09/02  11:01:38  root
 201 * first public release; added some signatures and biosparam()
 202 *
 203 * Revision 0.5  1993/08/30  10:23:30  root
 204 * fixed timing problems with my IBM drive
 205 *
 206 * Revision 0.4  1993/08/29  14:06:52  root
 207 * fixed some problems with timeouts due incomplete commands
 208 *
 209 * Revision 0.3  1993/08/28  15:55:03  root
 210 * writing data works too.  mounted and worked on a dos partition
 211 *
 212 * Revision 0.2  1993/08/27  22:42:07  root
 213 * reading data works.  Mounted a msdos partition.
 214 *
 215 * Revision 0.1  1993/08/25  13:38:30  root
 216 * first "damn thing doesn't work" version
 217 *
 218 * Revision 0.0  1993/08/14  19:54:25  root
 219 * empty function bodies; detect() works.
 220 *
 221 **************************************************************************
 222
 223 see Documentation/scsi/aha152x.txt for configuration details
 224
 225 **************************************************************************/
 226
 227#include <linux/module.h>
 228#include <asm/irq.h>
 229#include <linux/io.h>
 230#include <linux/blkdev.h>
 231#include <linux/completion.h>
 232#include <linux/errno.h>
 233#include <linux/string.h>
 234#include <linux/wait.h>
 235#include <linux/ioport.h>
 236#include <linux/delay.h>
 237#include <linux/proc_fs.h>
 238#include <linux/interrupt.h>
 239#include <linux/init.h>
 240#include <linux/kernel.h>
 241#include <linux/isapnp.h>
 242#include <linux/spinlock.h>
 243#include <linux/workqueue.h>
 244#include <linux/list.h>
 245#include <linux/slab.h>
 246#include <scsi/scsicam.h>
 247
 248#include "scsi.h"
 249#include <scsi/scsi_dbg.h>
 250#include <scsi/scsi_host.h>
 251#include <scsi/scsi_transport_spi.h>
 252#include <scsi/scsi_eh.h>
 253#include "aha152x.h"
 254
 255static LIST_HEAD(aha152x_host_list);
 256
 257
 258/* DEFINES */
 259
 260/* For PCMCIA cards, always use AUTOCONF */
 261#if defined(AHA152X_PCMCIA) || defined(MODULE)
 262#if !defined(AUTOCONF)
 263#define AUTOCONF
 264#endif
 265#endif
 266
 267#if !defined(AUTOCONF) && !defined(SETUP0)
 268#error define AUTOCONF or SETUP0
 269#endif
 270
 271#define DO_LOCK(flags)          spin_lock_irqsave(&QLOCK,flags)
 272#define DO_UNLOCK(flags)        spin_unlock_irqrestore(&QLOCK,flags)
 273
 274#define LEAD            "(scsi%d:%d:%d) "
 275#define INFO_LEAD       KERN_INFO       LEAD
 276#define CMDINFO(cmd) \
 277                        (cmd) ? ((cmd)->device->host->host_no) : -1, \
 278                        (cmd) ? ((cmd)->device->id & 0x0f) : -1, \
 279                        (cmd) ? ((u8)(cmd)->device->lun & 0x07) : -1
 280
 281static inline void
 282CMD_INC_RESID(struct scsi_cmnd *cmd, int inc)
 283{
 284        scsi_set_resid(cmd, scsi_get_resid(cmd) + inc);
 285}
 286
 287#define DELAY_DEFAULT 1000
 288
 289#if defined(AHA152X_PCMCIA)
 290#define IRQ_MIN 0
 291#define IRQ_MAX 16
 292#else
 293#define IRQ_MIN 9
 294#if defined(__PPC)
 295#define IRQ_MAX (nr_irqs-1)
 296#else
 297#define IRQ_MAX 12
 298#endif
 299#endif
 300
 301enum {
 302        not_issued      = 0x0001,       /* command not yet issued */
 303        selecting       = 0x0002,       /* target is being selected */
 304        identified      = 0x0004,       /* IDENTIFY was sent */
 305        disconnected    = 0x0008,       /* target disconnected */
 306        completed       = 0x0010,       /* target sent COMMAND COMPLETE */
 307        aborted         = 0x0020,       /* ABORT was sent */
 308        resetted        = 0x0040,       /* BUS DEVICE RESET was sent */
 309        spiordy         = 0x0080,       /* waiting for SPIORDY to raise */
 310        syncneg         = 0x0100,       /* synchronous negotiation in progress */
 311        aborting        = 0x0200,       /* ABORT is pending */
 312        resetting       = 0x0400,       /* BUS DEVICE RESET is pending */
 313        check_condition = 0x0800,       /* requesting sense after CHECK CONDITION */
 314};
 315
 316MODULE_AUTHOR("Jürgen Fischer");
 317MODULE_DESCRIPTION(AHA152X_REVID);
 318MODULE_LICENSE("GPL");
 319
 320#if !defined(AHA152X_PCMCIA)
 321#if defined(MODULE)
 322static int io[] = {0, 0};
 323module_param_hw_array(io, int, ioport, NULL, 0);
 324MODULE_PARM_DESC(io,"base io address of controller");
 325
 326static int irq[] = {0, 0};
 327module_param_hw_array(irq, int, irq, NULL, 0);
 328MODULE_PARM_DESC(irq,"interrupt for controller");
 329
 330static int scsiid[] = {7, 7};
 331module_param_array(scsiid, int, NULL, 0);
 332MODULE_PARM_DESC(scsiid,"scsi id of controller");
 333
 334static int reconnect[] = {1, 1};
 335module_param_array(reconnect, int, NULL, 0);
 336MODULE_PARM_DESC(reconnect,"allow targets to disconnect");
 337
 338static int parity[] = {1, 1};
 339module_param_array(parity, int, NULL, 0);
 340MODULE_PARM_DESC(parity,"use scsi parity");
 341
 342static int sync[] = {1, 1};
 343module_param_array(sync, int, NULL, 0);
 344MODULE_PARM_DESC(sync,"use synchronous transfers");
 345
 346static int delay[] = {DELAY_DEFAULT, DELAY_DEFAULT};
 347module_param_array(delay, int, NULL, 0);
 348MODULE_PARM_DESC(delay,"scsi reset delay");
 349
 350static int exttrans[] = {0, 0};
 351module_param_array(exttrans, int, NULL, 0);
 352MODULE_PARM_DESC(exttrans,"use extended translation");
 353
 354static int aha152x[] = {0, 11, 7, 1, 1, 0, DELAY_DEFAULT, 0};
 355module_param_array(aha152x, int, NULL, 0);
 356MODULE_PARM_DESC(aha152x, "parameters for first controller");
 357
 358static int aha152x1[] = {0, 11, 7, 1, 1, 0, DELAY_DEFAULT, 0};
 359module_param_array(aha152x1, int, NULL, 0);
 360MODULE_PARM_DESC(aha152x1, "parameters for second controller");
 361#endif /* MODULE */
 362
 363#ifdef __ISAPNP__
 364static struct isapnp_device_id id_table[] = {
 365        { ISAPNP_ANY_ID, ISAPNP_ANY_ID, ISAPNP_VENDOR('A', 'D', 'P'), ISAPNP_FUNCTION(0x1502), 0 },
 366        { ISAPNP_ANY_ID, ISAPNP_ANY_ID, ISAPNP_VENDOR('A', 'D', 'P'), ISAPNP_FUNCTION(0x1505), 0 },
 367        { ISAPNP_ANY_ID, ISAPNP_ANY_ID, ISAPNP_VENDOR('A', 'D', 'P'), ISAPNP_FUNCTION(0x1510), 0 },
 368        { ISAPNP_ANY_ID, ISAPNP_ANY_ID, ISAPNP_VENDOR('A', 'D', 'P'), ISAPNP_FUNCTION(0x1515), 0 },
 369        { ISAPNP_ANY_ID, ISAPNP_ANY_ID, ISAPNP_VENDOR('A', 'D', 'P'), ISAPNP_FUNCTION(0x1520), 0 },
 370        { ISAPNP_ANY_ID, ISAPNP_ANY_ID, ISAPNP_VENDOR('A', 'D', 'P'), ISAPNP_FUNCTION(0x2015), 0 },
 371        { ISAPNP_ANY_ID, ISAPNP_ANY_ID, ISAPNP_VENDOR('A', 'D', 'P'), ISAPNP_FUNCTION(0x1522), 0 },
 372        { ISAPNP_ANY_ID, ISAPNP_ANY_ID, ISAPNP_VENDOR('A', 'D', 'P'), ISAPNP_FUNCTION(0x2215), 0 },
 373        { ISAPNP_ANY_ID, ISAPNP_ANY_ID, ISAPNP_VENDOR('A', 'D', 'P'), ISAPNP_FUNCTION(0x1530), 0 },
 374        { ISAPNP_ANY_ID, ISAPNP_ANY_ID, ISAPNP_VENDOR('A', 'D', 'P'), ISAPNP_FUNCTION(0x3015), 0 },
 375        { ISAPNP_ANY_ID, ISAPNP_ANY_ID, ISAPNP_VENDOR('A', 'D', 'P'), ISAPNP_FUNCTION(0x1532), 0 },
 376        { ISAPNP_ANY_ID, ISAPNP_ANY_ID, ISAPNP_VENDOR('A', 'D', 'P'), ISAPNP_FUNCTION(0x3215), 0 },
 377        { ISAPNP_ANY_ID, ISAPNP_ANY_ID, ISAPNP_VENDOR('A', 'D', 'P'), ISAPNP_FUNCTION(0x6360), 0 },
 378        { ISAPNP_DEVICE_SINGLE_END, }
 379};
 380MODULE_DEVICE_TABLE(isapnp, id_table);
 381#endif /* ISAPNP */
 382
 383#endif /* !AHA152X_PCMCIA */
 384
 385static struct scsi_host_template aha152x_driver_template;
 386
 387/*
 388 * internal states of the host
 389 *
 390 */
 391enum aha152x_state {
 392        idle=0,
 393        unknown,
 394        seldo,
 395        seldi,
 396        selto,
 397        busfree,
 398        msgo,
 399        cmd,
 400        msgi,
 401        status,
 402        datai,
 403        datao,
 404        parerr,
 405        rsti,
 406        maxstate
 407};
 408
 409/*
 410 * current state information of the host
 411 *
 412 */
 413struct aha152x_hostdata {
 414        struct scsi_cmnd *issue_SC;
 415                /* pending commands to issue */
 416
 417        struct scsi_cmnd *current_SC;
 418                /* current command on the bus */
 419
 420        struct scsi_cmnd *disconnected_SC;
 421                /* commands that disconnected */
 422
 423        struct scsi_cmnd *done_SC;
 424                /* command that was completed */
 425
 426        spinlock_t lock;
 427                /* host lock */
 428
 429#if defined(AHA152X_STAT)
 430        int           total_commands;
 431        int           disconnections;
 432        int           busfree_without_any_action;
 433        int           busfree_without_old_command;
 434        int           busfree_without_new_command;
 435        int           busfree_without_done_command;
 436        int           busfree_with_check_condition;
 437        int           count[maxstate];
 438        int           count_trans[maxstate];
 439        unsigned long time[maxstate];
 440#endif
 441
 442        int commands;           /* current number of commands */
 443
 444        int reconnect;          /* disconnection allowed */
 445        int parity;             /* parity checking enabled */
 446        int synchronous;        /* synchronous transferes enabled */
 447        int delay;              /* reset out delay */
 448        int ext_trans;          /* extended translation enabled */
 449
 450        int swint;              /* software-interrupt was fired during detect() */
 451        int service;            /* bh needs to be run */
 452        int in_intr;            /* bh is running */
 453
 454        /* current state,
 455           previous state,
 456           last state different from current state */
 457        enum aha152x_state state, prevstate, laststate;
 458
 459        int target;
 460                /* reconnecting target */
 461
 462        unsigned char syncrate[8];
 463                /* current synchronous transfer agreements */
 464
 465        unsigned char syncneg[8];
 466                /* 0: no negotiation;
 467                 * 1: negotiation in progress;
 468                 * 2: negotiation completed
 469                 */
 470
 471        int cmd_i;
 472                /* number of sent bytes of current command */
 473
 474        int msgi_len;
 475                /* number of received message bytes */
 476        unsigned char msgi[256];
 477                /* received message bytes */
 478
 479        int msgo_i, msgo_len;
 480                /* number of sent bytes and length of current messages */
 481        unsigned char msgo[256];
 482                /* pending messages */
 483
 484        int data_len;
 485                /* number of sent/received bytes in dataphase */
 486
 487        unsigned long io_port0;
 488        unsigned long io_port1;
 489
 490#ifdef __ISAPNP__
 491        struct pnp_dev *pnpdev;
 492#endif
 493        struct list_head host_list;
 494};
 495
 496
 497/*
 498 * host specific command extension
 499 *
 500 */
 501struct aha152x_scdata {
 502        struct scsi_cmnd *next; /* next sc in queue */
 503        struct completion *done;/* semaphore to block on */
 504        struct scsi_eh_save ses;
 505};
 506
 507/* access macros for hostdata */
 508
 509#define HOSTDATA(shpnt)         ((struct aha152x_hostdata *) &shpnt->hostdata)
 510
 511#define HOSTNO                  ((shpnt)->host_no)
 512
 513#define CURRENT_SC              (HOSTDATA(shpnt)->current_SC)
 514#define DONE_SC                 (HOSTDATA(shpnt)->done_SC)
 515#define ISSUE_SC                (HOSTDATA(shpnt)->issue_SC)
 516#define DISCONNECTED_SC         (HOSTDATA(shpnt)->disconnected_SC)
 517#define QLOCK                   (HOSTDATA(shpnt)->lock)
 518#define QLOCKER                 (HOSTDATA(shpnt)->locker)
 519#define QLOCKERL                (HOSTDATA(shpnt)->lockerl)
 520
 521#define STATE                   (HOSTDATA(shpnt)->state)
 522#define PREVSTATE               (HOSTDATA(shpnt)->prevstate)
 523#define LASTSTATE               (HOSTDATA(shpnt)->laststate)
 524
 525#define RECONN_TARGET           (HOSTDATA(shpnt)->target)
 526
 527#define CMD_I                   (HOSTDATA(shpnt)->cmd_i)
 528
 529#define MSGO(i)                 (HOSTDATA(shpnt)->msgo[i])
 530#define MSGO_I                  (HOSTDATA(shpnt)->msgo_i)
 531#define MSGOLEN                 (HOSTDATA(shpnt)->msgo_len)
 532#define ADDMSGO(x)              (MSGOLEN<256 ? (void)(MSGO(MSGOLEN++)=x) : aha152x_error(shpnt,"MSGO overflow"))
 533
 534#define MSGI(i)                 (HOSTDATA(shpnt)->msgi[i])
 535#define MSGILEN                 (HOSTDATA(shpnt)->msgi_len)
 536#define ADDMSGI(x)              (MSGILEN<256 ? (void)(MSGI(MSGILEN++)=x) : aha152x_error(shpnt,"MSGI overflow"))
 537
 538#define DATA_LEN                (HOSTDATA(shpnt)->data_len)
 539
 540#define SYNCRATE                (HOSTDATA(shpnt)->syncrate[CURRENT_SC->device->id])
 541#define SYNCNEG                 (HOSTDATA(shpnt)->syncneg[CURRENT_SC->device->id])
 542
 543#define DELAY                   (HOSTDATA(shpnt)->delay)
 544#define EXT_TRANS               (HOSTDATA(shpnt)->ext_trans)
 545#define TC1550                  (HOSTDATA(shpnt)->tc1550)
 546#define RECONNECT               (HOSTDATA(shpnt)->reconnect)
 547#define PARITY                  (HOSTDATA(shpnt)->parity)
 548#define SYNCHRONOUS             (HOSTDATA(shpnt)->synchronous)
 549
 550#define HOSTIOPORT0             (HOSTDATA(shpnt)->io_port0)
 551#define HOSTIOPORT1             (HOSTDATA(shpnt)->io_port1)
 552
 553#define SCDATA(SCpnt)           ((struct aha152x_scdata *) (SCpnt)->host_scribble)
 554#define SCNEXT(SCpnt)           SCDATA(SCpnt)->next
 555#define SCSEM(SCpnt)            SCDATA(SCpnt)->done
 556
 557#define SG_ADDRESS(buffer)      ((char *) sg_virt((buffer)))
 558
 559/* state handling */
 560static void seldi_run(struct Scsi_Host *shpnt);
 561static void seldo_run(struct Scsi_Host *shpnt);
 562static void selto_run(struct Scsi_Host *shpnt);
 563static void busfree_run(struct Scsi_Host *shpnt);
 564
 565static void msgo_init(struct Scsi_Host *shpnt);
 566static void msgo_run(struct Scsi_Host *shpnt);
 567static void msgo_end(struct Scsi_Host *shpnt);
 568
 569static void cmd_init(struct Scsi_Host *shpnt);
 570static void cmd_run(struct Scsi_Host *shpnt);
 571static void cmd_end(struct Scsi_Host *shpnt);
 572
 573static void datai_init(struct Scsi_Host *shpnt);
 574static void datai_run(struct Scsi_Host *shpnt);
 575static void datai_end(struct Scsi_Host *shpnt);
 576
 577static void datao_init(struct Scsi_Host *shpnt);
 578static void datao_run(struct Scsi_Host *shpnt);
 579static void datao_end(struct Scsi_Host *shpnt);
 580
 581static void status_run(struct Scsi_Host *shpnt);
 582
 583static void msgi_run(struct Scsi_Host *shpnt);
 584static void msgi_end(struct Scsi_Host *shpnt);
 585
 586static void parerr_run(struct Scsi_Host *shpnt);
 587static void rsti_run(struct Scsi_Host *shpnt);
 588
 589static void is_complete(struct Scsi_Host *shpnt);
 590
 591/*
 592 * driver states
 593 *
 594 */
 595static struct {
 596        char            *name;
 597        void            (*init)(struct Scsi_Host *);
 598        void            (*run)(struct Scsi_Host *);
 599        void            (*end)(struct Scsi_Host *);
 600        int             spio;
 601} states[] = {
 602        { "idle",       NULL,           NULL,           NULL,           0},
 603        { "unknown",    NULL,           NULL,           NULL,           0},
 604        { "seldo",      NULL,           seldo_run,      NULL,           0},
 605        { "seldi",      NULL,           seldi_run,      NULL,           0},
 606        { "selto",      NULL,           selto_run,      NULL,           0},
 607        { "busfree",    NULL,           busfree_run,    NULL,           0},
 608        { "msgo",       msgo_init,      msgo_run,       msgo_end,       1},
 609        { "cmd",        cmd_init,       cmd_run,        cmd_end,        1},
 610        { "msgi",       NULL,           msgi_run,       msgi_end,       1},
 611        { "status",     NULL,           status_run,     NULL,           1},
 612        { "datai",      datai_init,     datai_run,      datai_end,      0},
 613        { "datao",      datao_init,     datao_run,      datao_end,      0},
 614        { "parerr",     NULL,           parerr_run,     NULL,           0},
 615        { "rsti",       NULL,           rsti_run,       NULL,           0},
 616};
 617
 618/* setup & interrupt */
 619static irqreturn_t intr(int irq, void *dev_id);
 620static void reset_ports(struct Scsi_Host *shpnt);
 621static void aha152x_error(struct Scsi_Host *shpnt, char *msg);
 622static void done(struct Scsi_Host *shpnt, int error);
 623
 624/* diagnostics */
 625static void show_command(struct scsi_cmnd * ptr);
 626static void show_queues(struct Scsi_Host *shpnt);
 627static void disp_enintr(struct Scsi_Host *shpnt);
 628
 629
 630/*
 631 *  queue services:
 632 *
 633 */
 634static inline void append_SC(struct scsi_cmnd **SC, struct scsi_cmnd *new_SC)
 635{
 636        struct scsi_cmnd *end;
 637
 638        SCNEXT(new_SC) = NULL;
 639        if (!*SC)
 640                *SC = new_SC;
 641        else {
 642                for (end = *SC; SCNEXT(end); end = SCNEXT(end))
 643                        ;
 644                SCNEXT(end) = new_SC;
 645        }
 646}
 647
 648static inline struct scsi_cmnd *remove_first_SC(struct scsi_cmnd ** SC)
 649{
 650        struct scsi_cmnd *ptr;
 651
 652        ptr = *SC;
 653        if (ptr) {
 654                *SC = SCNEXT(*SC);
 655                SCNEXT(ptr)=NULL;
 656        }
 657        return ptr;
 658}
 659
 660static inline struct scsi_cmnd *remove_lun_SC(struct scsi_cmnd ** SC,
 661                                              int target, int lun)
 662{
 663        struct scsi_cmnd *ptr, *prev;
 664
 665        for (ptr = *SC, prev = NULL;
 666             ptr && ((ptr->device->id != target) || (ptr->device->lun != lun));
 667             prev = ptr, ptr = SCNEXT(ptr))
 668             ;
 669
 670        if (ptr) {
 671                if (prev)
 672                        SCNEXT(prev) = SCNEXT(ptr);
 673                else
 674                        *SC = SCNEXT(ptr);
 675
 676                SCNEXT(ptr)=NULL;
 677        }
 678
 679        return ptr;
 680}
 681
 682static inline struct scsi_cmnd *remove_SC(struct scsi_cmnd **SC,
 683                                          struct scsi_cmnd *SCp)
 684{
 685        struct scsi_cmnd *ptr, *prev;
 686
 687        for (ptr = *SC, prev = NULL;
 688             ptr && SCp!=ptr;
 689             prev = ptr, ptr = SCNEXT(ptr))
 690             ;
 691
 692        if (ptr) {
 693                if (prev)
 694                        SCNEXT(prev) = SCNEXT(ptr);
 695                else
 696                        *SC = SCNEXT(ptr);
 697
 698                SCNEXT(ptr)=NULL;
 699        }
 700
 701        return ptr;
 702}
 703
 704static irqreturn_t swintr(int irqno, void *dev_id)
 705{
 706        struct Scsi_Host *shpnt = dev_id;
 707
 708        HOSTDATA(shpnt)->swint++;
 709
 710        SETPORT(DMACNTRL0, INTEN);
 711        return IRQ_HANDLED;
 712}
 713
 714struct Scsi_Host *aha152x_probe_one(struct aha152x_setup *setup)
 715{
 716        struct Scsi_Host *shpnt;
 717
 718        shpnt = scsi_host_alloc(&aha152x_driver_template, sizeof(struct aha152x_hostdata));
 719        if (!shpnt) {
 720                printk(KERN_ERR "aha152x: scsi_host_alloc failed\n");
 721                return NULL;
 722        }
 723
 724        memset(HOSTDATA(shpnt), 0, sizeof *HOSTDATA(shpnt));
 725        INIT_LIST_HEAD(&HOSTDATA(shpnt)->host_list);
 726
 727        /* need to have host registered before triggering any interrupt */
 728        list_add_tail(&HOSTDATA(shpnt)->host_list, &aha152x_host_list);
 729
 730        shpnt->io_port   = setup->io_port;
 731        shpnt->n_io_port = IO_RANGE;
 732        shpnt->irq       = setup->irq;
 733
 734        if (!setup->tc1550) {
 735                HOSTIOPORT0 = setup->io_port;
 736                HOSTIOPORT1 = setup->io_port;
 737        } else {
 738                HOSTIOPORT0 = setup->io_port+0x10;
 739                HOSTIOPORT1 = setup->io_port-0x10;
 740        }
 741
 742        spin_lock_init(&QLOCK);
 743        RECONNECT   = setup->reconnect;
 744        SYNCHRONOUS = setup->synchronous;
 745        PARITY      = setup->parity;
 746        DELAY       = setup->delay;
 747        EXT_TRANS   = setup->ext_trans;
 748
 749        SETPORT(SCSIID, setup->scsiid << 4);
 750        shpnt->this_id = setup->scsiid;
 751
 752        if (setup->reconnect)
 753                shpnt->can_queue = AHA152X_MAXQUEUE;
 754
 755        /* RESET OUT */
 756        printk("aha152x: resetting bus...\n");
 757        SETPORT(SCSISEQ, SCSIRSTO);
 758        mdelay(256);
 759        SETPORT(SCSISEQ, 0);
 760        mdelay(DELAY);
 761
 762        reset_ports(shpnt);
 763
 764        printk(KERN_INFO
 765               "aha152x%d%s: "
 766               "vital data: rev=%x, "
 767               "io=0x%03lx (0x%03lx/0x%03lx), "
 768               "irq=%d, "
 769               "scsiid=%d, "
 770               "reconnect=%s, "
 771               "parity=%s, "
 772               "synchronous=%s, "
 773               "delay=%d, "
 774               "extended translation=%s\n",
 775               shpnt->host_no, setup->tc1550 ? " (tc1550 mode)" : "",
 776               GETPORT(REV) & 0x7,
 777               shpnt->io_port, HOSTIOPORT0, HOSTIOPORT1,
 778               shpnt->irq,
 779               shpnt->this_id,
 780               RECONNECT ? "enabled" : "disabled",
 781               PARITY ? "enabled" : "disabled",
 782               SYNCHRONOUS ? "enabled" : "disabled",
 783               DELAY,
 784               EXT_TRANS ? "enabled" : "disabled");
 785
 786        /* not expecting any interrupts */
 787        SETPORT(SIMODE0, 0);
 788        SETPORT(SIMODE1, 0);
 789
 790        if (request_irq(shpnt->irq, swintr, IRQF_SHARED, "aha152x", shpnt)) {
 791                printk(KERN_ERR "aha152x%d: irq %d busy.\n", shpnt->host_no, shpnt->irq);
 792                goto out_host_put;
 793        }
 794
 795        HOSTDATA(shpnt)->swint = 0;
 796
 797        printk(KERN_INFO "aha152x%d: trying software interrupt, ", shpnt->host_no);
 798
 799        mb();
 800        SETPORT(DMACNTRL0, SWINT|INTEN);
 801        mdelay(1000);
 802        free_irq(shpnt->irq, shpnt);
 803
 804        if (!HOSTDATA(shpnt)->swint) {
 805                if (TESTHI(DMASTAT, INTSTAT)) {
 806                        printk("lost.\n");
 807                } else {
 808                        printk("failed.\n");
 809                }
 810
 811                SETPORT(DMACNTRL0, INTEN);
 812
 813                printk(KERN_ERR "aha152x%d: irq %d possibly wrong.  "
 814                                "Please verify.\n", shpnt->host_no, shpnt->irq);
 815                goto out_host_put;
 816        }
 817        printk("ok.\n");
 818
 819
 820        /* clear interrupts */
 821        SETPORT(SSTAT0, 0x7f);
 822        SETPORT(SSTAT1, 0xef);
 823
 824        if (request_irq(shpnt->irq, intr, IRQF_SHARED, "aha152x", shpnt)) {
 825                printk(KERN_ERR "aha152x%d: failed to reassign irq %d.\n", shpnt->host_no, shpnt->irq);
 826                goto out_host_put;
 827        }
 828
 829        if( scsi_add_host(shpnt, NULL) ) {
 830                free_irq(shpnt->irq, shpnt);
 831                printk(KERN_ERR "aha152x%d: failed to add host.\n", shpnt->host_no);
 832                goto out_host_put;
 833        }
 834
 835        scsi_scan_host(shpnt);
 836
 837        return shpnt;
 838
 839out_host_put:
 840        list_del(&HOSTDATA(shpnt)->host_list);
 841        scsi_host_put(shpnt);
 842
 843        return NULL;
 844}
 845
 846void aha152x_release(struct Scsi_Host *shpnt)
 847{
 848        if (!shpnt)
 849                return;
 850
 851        scsi_remove_host(shpnt);
 852        if (shpnt->irq)
 853                free_irq(shpnt->irq, shpnt);
 854
 855#if !defined(AHA152X_PCMCIA)
 856        if (shpnt->io_port)
 857                release_region(shpnt->io_port, IO_RANGE);
 858#endif
 859
 860#ifdef __ISAPNP__
 861        if (HOSTDATA(shpnt)->pnpdev)
 862                pnp_device_detach(HOSTDATA(shpnt)->pnpdev);
 863#endif
 864
 865        list_del(&HOSTDATA(shpnt)->host_list);
 866        scsi_host_put(shpnt);
 867}
 868
 869
 870/*
 871 * setup controller to generate interrupts depending
 872 * on current state (lock has to be acquired)
 873 *
 874 */
 875static int setup_expected_interrupts(struct Scsi_Host *shpnt)
 876{
 877        if(CURRENT_SC) {
 878                CURRENT_SC->SCp.phase |= 1 << 16;
 879
 880                if(CURRENT_SC->SCp.phase & selecting) {
 881                        SETPORT(SSTAT1, SELTO);
 882                        SETPORT(SIMODE0, ENSELDO | (DISCONNECTED_SC ? ENSELDI : 0));
 883                        SETPORT(SIMODE1, ENSELTIMO);
 884                } else {
 885                        SETPORT(SIMODE0, (CURRENT_SC->SCp.phase & spiordy) ? ENSPIORDY : 0);
 886                        SETPORT(SIMODE1, ENPHASEMIS | ENSCSIRST | ENSCSIPERR | ENBUSFREE);
 887                }
 888        } else if(STATE==seldi) {
 889                SETPORT(SIMODE0, 0);
 890                SETPORT(SIMODE1, ENPHASEMIS | ENSCSIRST | ENSCSIPERR | ENBUSFREE);
 891        } else {
 892                SETPORT(SIMODE0, DISCONNECTED_SC ? ENSELDI : 0);
 893                SETPORT(SIMODE1, ENSCSIRST | ( (ISSUE_SC||DONE_SC) ? ENBUSFREE : 0));
 894        }
 895
 896        if(!HOSTDATA(shpnt)->in_intr)
 897                SETBITS(DMACNTRL0, INTEN);
 898
 899        return TESTHI(DMASTAT, INTSTAT);
 900}
 901
 902
 903/*
 904 *  Queue a command and setup interrupts for a free bus.
 905 */
 906static int aha152x_internal_queue(struct scsi_cmnd *SCpnt,
 907                                  struct completion *complete,
 908                                  int phase, void (*done)(struct scsi_cmnd *))
 909{
 910        struct Scsi_Host *shpnt = SCpnt->device->host;
 911        unsigned long flags;
 912
 913        SCpnt->scsi_done        = done;
 914        SCpnt->SCp.phase        = not_issued | phase;
 915        SCpnt->SCp.Status       = 0x1; /* Ilegal status by SCSI standard */
 916        SCpnt->SCp.Message      = 0;
 917        SCpnt->SCp.have_data_in = 0;
 918        SCpnt->SCp.sent_command = 0;
 919
 920        if(SCpnt->SCp.phase & (resetting|check_condition)) {
 921                if (!SCpnt->host_scribble || SCSEM(SCpnt) || SCNEXT(SCpnt)) {
 922                        scmd_printk(KERN_ERR, SCpnt, "cannot reuse command\n");
 923                        return FAILED;
 924                }
 925        } else {
 926                SCpnt->host_scribble = kmalloc(sizeof(struct aha152x_scdata), GFP_ATOMIC);
 927                if(!SCpnt->host_scribble) {
 928                        scmd_printk(KERN_ERR, SCpnt, "allocation failed\n");
 929                        return FAILED;
 930                }
 931        }
 932
 933        SCNEXT(SCpnt)           = NULL;
 934        SCSEM(SCpnt)            = complete;
 935
 936        /* setup scratch area
 937           SCp.ptr              : buffer pointer
 938           SCp.this_residual    : buffer length
 939           SCp.buffer           : next buffer
 940           SCp.buffers_residual : left buffers in list
 941           SCp.phase            : current state of the command */
 942
 943        if ((phase & resetting) || !scsi_sglist(SCpnt)) {
 944                SCpnt->SCp.ptr           = NULL;
 945                SCpnt->SCp.this_residual = 0;
 946                scsi_set_resid(SCpnt, 0);
 947                SCpnt->SCp.buffer           = NULL;
 948                SCpnt->SCp.buffers_residual = 0;
 949        } else {
 950                scsi_set_resid(SCpnt, scsi_bufflen(SCpnt));
 951                SCpnt->SCp.buffer           = scsi_sglist(SCpnt);
 952                SCpnt->SCp.ptr              = SG_ADDRESS(SCpnt->SCp.buffer);
 953                SCpnt->SCp.this_residual    = SCpnt->SCp.buffer->length;
 954                SCpnt->SCp.buffers_residual = scsi_sg_count(SCpnt) - 1;
 955        }
 956
 957        DO_LOCK(flags);
 958
 959#if defined(AHA152X_STAT)
 960        HOSTDATA(shpnt)->total_commands++;
 961#endif
 962
 963        /* Turn led on, when this is the first command. */
 964        HOSTDATA(shpnt)->commands++;
 965        if (HOSTDATA(shpnt)->commands==1)
 966                SETPORT(PORTA, 1);
 967
 968        append_SC(&ISSUE_SC, SCpnt);
 969
 970        if(!HOSTDATA(shpnt)->in_intr)
 971                setup_expected_interrupts(shpnt);
 972
 973        DO_UNLOCK(flags);
 974
 975        return 0;
 976}
 977
 978/*
 979 *  queue a command
 980 *
 981 */
 982static int aha152x_queue_lck(struct scsi_cmnd *SCpnt,
 983                             void (*done)(struct scsi_cmnd *))
 984{
 985        return aha152x_internal_queue(SCpnt, NULL, 0, done);
 986}
 987
 988static DEF_SCSI_QCMD(aha152x_queue)
 989
 990
 991/*
 992 *
 993 */
 994static void reset_done(struct scsi_cmnd *SCpnt)
 995{
 996        if(SCSEM(SCpnt)) {
 997                complete(SCSEM(SCpnt));
 998        } else {
 999                printk(KERN_ERR "aha152x: reset_done w/o completion\n");
1000        }
1001}
1002
1003/*
1004 *  Abort a command
1005 *
1006 */
1007static int aha152x_abort(struct scsi_cmnd *SCpnt)
1008{
1009        struct Scsi_Host *shpnt = SCpnt->device->host;
1010        struct scsi_cmnd *ptr;
1011        unsigned long flags;
1012
1013        DO_LOCK(flags);
1014
1015        ptr=remove_SC(&ISSUE_SC, SCpnt);
1016
1017        if(ptr) {
1018                HOSTDATA(shpnt)->commands--;
1019                if (!HOSTDATA(shpnt)->commands)
1020                        SETPORT(PORTA, 0);
1021                DO_UNLOCK(flags);
1022
1023                kfree(SCpnt->host_scribble);
1024                SCpnt->host_scribble=NULL;
1025
1026                return SUCCESS;
1027        }
1028
1029        DO_UNLOCK(flags);
1030
1031        /*
1032         * FIXME:
1033         * for current command: queue ABORT for message out and raise ATN
1034         * for disconnected command: pseudo SC with ABORT message or ABORT on reselection?
1035         *
1036         */
1037
1038        scmd_printk(KERN_ERR, SCpnt,
1039                    "cannot abort running or disconnected command\n");
1040
1041        return FAILED;
1042}
1043
1044/*
1045 * Reset a device
1046 *
1047 */
1048static int aha152x_device_reset(struct scsi_cmnd * SCpnt)
1049{
1050        struct Scsi_Host *shpnt = SCpnt->device->host;
1051        DECLARE_COMPLETION(done);
1052        int ret, issued, disconnected;
1053        unsigned char old_cmd_len = SCpnt->cmd_len;
1054        unsigned long flags;
1055        unsigned long timeleft;
1056
1057        if(CURRENT_SC==SCpnt) {
1058                scmd_printk(KERN_ERR, SCpnt, "cannot reset current device\n");
1059                return FAILED;
1060        }
1061
1062        DO_LOCK(flags);
1063        issued       = remove_SC(&ISSUE_SC, SCpnt) == NULL;
1064        disconnected = issued && remove_SC(&DISCONNECTED_SC, SCpnt);
1065        DO_UNLOCK(flags);
1066
1067        SCpnt->cmd_len         = 0;
1068
1069        aha152x_internal_queue(SCpnt, &done, resetting, reset_done);
1070
1071        timeleft = wait_for_completion_timeout(&done, 100*HZ);
1072        if (!timeleft) {
1073                /* remove command from issue queue */
1074                DO_LOCK(flags);
1075                remove_SC(&ISSUE_SC, SCpnt);
1076                DO_UNLOCK(flags);
1077        }
1078
1079        SCpnt->cmd_len         = old_cmd_len;
1080
1081        DO_LOCK(flags);
1082
1083        if(SCpnt->SCp.phase & resetted) {
1084                HOSTDATA(shpnt)->commands--;
1085                if (!HOSTDATA(shpnt)->commands)
1086                        SETPORT(PORTA, 0);
1087                kfree(SCpnt->host_scribble);
1088                SCpnt->host_scribble=NULL;
1089
1090                ret = SUCCESS;
1091        } else {
1092                /* requeue */
1093                if(!issued) {
1094                        append_SC(&ISSUE_SC, SCpnt);
1095                } else if(disconnected) {
1096                        append_SC(&DISCONNECTED_SC, SCpnt);
1097                }
1098
1099                ret = FAILED;
1100        }
1101
1102        DO_UNLOCK(flags);
1103        return ret;
1104}
1105
1106static void free_hard_reset_SCs(struct Scsi_Host *shpnt,
1107                                struct scsi_cmnd **SCs)
1108{
1109        struct scsi_cmnd *ptr;
1110
1111        ptr=*SCs;
1112        while(ptr) {
1113                struct scsi_cmnd *next;
1114
1115                if(SCDATA(ptr)) {
1116                        next = SCNEXT(ptr);
1117                } else {
1118                        scmd_printk(KERN_DEBUG, ptr,
1119                                    "queue corrupted at %p\n", ptr);
1120                        next = NULL;
1121                }
1122
1123                if (!ptr->device->soft_reset) {
1124                        remove_SC(SCs, ptr);
1125                        HOSTDATA(shpnt)->commands--;
1126                        kfree(ptr->host_scribble);
1127                        ptr->host_scribble=NULL;
1128                }
1129
1130                ptr = next;
1131        }
1132}
1133
1134/*
1135 * Reset the bus
1136 *
1137 * AIC-6260 has a hard reset (MRST signal), but apparently
1138 * one cannot trigger it via software. So live with
1139 * a soft reset; no-one seemed to have cared.
1140 */
1141static int aha152x_bus_reset_host(struct Scsi_Host *shpnt)
1142{
1143        unsigned long flags;
1144
1145        DO_LOCK(flags);
1146
1147        free_hard_reset_SCs(shpnt, &ISSUE_SC);
1148        free_hard_reset_SCs(shpnt, &DISCONNECTED_SC);
1149
1150        SETPORT(SCSISEQ, SCSIRSTO);
1151        mdelay(256);
1152        SETPORT(SCSISEQ, 0);
1153        mdelay(DELAY);
1154
1155        setup_expected_interrupts(shpnt);
1156        if(HOSTDATA(shpnt)->commands==0)
1157                SETPORT(PORTA, 0);
1158
1159        DO_UNLOCK(flags);
1160
1161        return SUCCESS;
1162}
1163
1164/*
1165 * Reset the bus
1166 *
1167 */
1168static int aha152x_bus_reset(struct scsi_cmnd *SCpnt)
1169{
1170        return aha152x_bus_reset_host(SCpnt->device->host);
1171}
1172
1173/*
1174 *  Restore default values to the AIC-6260 registers and reset the fifos
1175 *
1176 */
1177static void reset_ports(struct Scsi_Host *shpnt)
1178{
1179        unsigned long flags;
1180
1181        /* disable interrupts */
1182        SETPORT(DMACNTRL0, RSTFIFO);
1183
1184        SETPORT(SCSISEQ, 0);
1185
1186        SETPORT(SXFRCTL1, 0);
1187        SETPORT(SCSISIG, 0);
1188        SETRATE(0);
1189
1190        /* clear all interrupt conditions */
1191        SETPORT(SSTAT0, 0x7f);
1192        SETPORT(SSTAT1, 0xef);
1193
1194        SETPORT(SSTAT4, SYNCERR | FWERR | FRERR);
1195
1196        SETPORT(DMACNTRL0, 0);
1197        SETPORT(DMACNTRL1, 0);
1198
1199        SETPORT(BRSTCNTRL, 0xf1);
1200
1201        /* clear SCSI fifos and transfer count */
1202        SETPORT(SXFRCTL0, CH1|CLRCH1|CLRSTCNT);
1203        SETPORT(SXFRCTL0, CH1);
1204
1205        DO_LOCK(flags);
1206        setup_expected_interrupts(shpnt);
1207        DO_UNLOCK(flags);
1208}
1209
1210/*
1211 * Reset the host (bus and controller)
1212 *
1213 */
1214int aha152x_host_reset_host(struct Scsi_Host *shpnt)
1215{
1216        aha152x_bus_reset_host(shpnt);
1217        reset_ports(shpnt);
1218
1219        return SUCCESS;
1220}
1221
1222/*
1223 * Return the "logical geometry"
1224 *
1225 */
1226static int aha152x_biosparam(struct scsi_device *sdev, struct block_device *bdev,
1227                sector_t capacity, int *info_array)
1228{
1229        struct Scsi_Host *shpnt = sdev->host;
1230
1231        /* try default translation */
1232        info_array[0] = 64;
1233        info_array[1] = 32;
1234        info_array[2] = (unsigned long)capacity / (64 * 32);
1235
1236        /* for disks >1GB do some guessing */
1237        if (info_array[2] >= 1024) {
1238                int info[3];
1239
1240                /* try to figure out the geometry from the partition table */
1241                if (scsicam_bios_param(bdev, capacity, info) < 0 ||
1242                    !((info[0] == 64 && info[1] == 32) || (info[0] == 255 && info[1] == 63))) {
1243                        if (EXT_TRANS) {
1244                                printk(KERN_NOTICE
1245                                       "aha152x: unable to verify geometry for disk with >1GB.\n"
1246                                       "         using extended translation.\n");
1247                                info_array[0] = 255;
1248                                info_array[1] = 63;
1249                                info_array[2] = (unsigned long)capacity / (255 * 63);
1250                        } else {
1251                                printk(KERN_NOTICE
1252                                       "aha152x: unable to verify geometry for disk with >1GB.\n"
1253                                       "         Using default translation. Please verify yourself.\n"
1254                                       "         Perhaps you need to enable extended translation in the driver.\n"
1255                                       "         See Documentation/scsi/aha152x.txt for details.\n");
1256                        }
1257                } else {
1258                        info_array[0] = info[0];
1259                        info_array[1] = info[1];
1260                        info_array[2] = info[2];
1261
1262                        if (info[0] == 255 && !EXT_TRANS) {
1263                                printk(KERN_NOTICE
1264                                       "aha152x: current partition table is using extended translation.\n"
1265                                       "         using it also, although it's not explicitly enabled.\n");
1266                        }
1267                }
1268        }
1269
1270        return 0;
1271}
1272
1273/*
1274 *  Internal done function
1275 *
1276 */
1277static void done(struct Scsi_Host *shpnt, int error)
1278{
1279        if (CURRENT_SC) {
1280                if(DONE_SC)
1281                        scmd_printk(KERN_ERR, CURRENT_SC,
1282                                    "there's already a completed command %p "
1283                                    "- will cause abort\n", DONE_SC);
1284
1285                DONE_SC = CURRENT_SC;
1286                CURRENT_SC = NULL;
1287                DONE_SC->result = error;
1288        } else
1289                printk(KERN_ERR "aha152x: done() called outside of command\n");
1290}
1291
1292static struct work_struct aha152x_tq;
1293
1294/*
1295 * Run service completions on the card with interrupts enabled.
1296 *
1297 */
1298static void run(struct work_struct *work)
1299{
1300        struct aha152x_hostdata *hd;
1301
1302        list_for_each_entry(hd, &aha152x_host_list, host_list) {
1303                struct Scsi_Host *shost = container_of((void *)hd, struct Scsi_Host, hostdata);
1304
1305                is_complete(shost);
1306        }
1307}
1308
1309/*
1310 * Interrupt handler
1311 *
1312 */
1313static irqreturn_t intr(int irqno, void *dev_id)
1314{
1315        struct Scsi_Host *shpnt = dev_id;
1316        unsigned long flags;
1317        unsigned char rev, dmacntrl0;
1318
1319        /*
1320         * Read a couple of registers that are known to not be all 1's. If
1321         * we read all 1's (-1), that means that either:
1322         *
1323         * a. The host adapter chip has gone bad, and we cannot control it,
1324         *      OR
1325         * b. The host adapter is a PCMCIA card that has been ejected
1326         *
1327         * In either case, we cannot do anything with the host adapter at
1328         * this point in time. So just ignore the interrupt and return.
1329         * In the latter case, the interrupt might actually be meant for
1330         * someone else sharing this IRQ, and that driver will handle it.
1331         */
1332        rev = GETPORT(REV);
1333        dmacntrl0 = GETPORT(DMACNTRL0);
1334        if ((rev == 0xFF) && (dmacntrl0 == 0xFF))
1335                return IRQ_NONE;
1336
1337        if( TESTLO(DMASTAT, INTSTAT) )
1338                return IRQ_NONE;
1339
1340        /* no more interrupts from the controller, while we're busy.
1341           INTEN is restored by the BH handler */
1342        CLRBITS(DMACNTRL0, INTEN);
1343
1344        DO_LOCK(flags);
1345        if( HOSTDATA(shpnt)->service==0 ) {
1346                HOSTDATA(shpnt)->service=1;
1347
1348                /* Poke the BH handler */
1349                INIT_WORK(&aha152x_tq, run);
1350                schedule_work(&aha152x_tq);
1351        }
1352        DO_UNLOCK(flags);
1353
1354        return IRQ_HANDLED;
1355}
1356
1357/*
1358 * busfree phase
1359 * - handle completition/disconnection/error of current command
1360 * - start selection for next command (if any)
1361 */
1362static void busfree_run(struct Scsi_Host *shpnt)
1363{
1364        unsigned long flags;
1365#if defined(AHA152X_STAT)
1366        int action=0;
1367#endif
1368
1369        SETPORT(SXFRCTL0, CH1|CLRCH1|CLRSTCNT);
1370        SETPORT(SXFRCTL0, CH1);
1371
1372        SETPORT(SSTAT1, CLRBUSFREE);
1373
1374        if(CURRENT_SC) {
1375#if defined(AHA152X_STAT)
1376                action++;
1377#endif
1378                CURRENT_SC->SCp.phase &= ~syncneg;
1379
1380                if(CURRENT_SC->SCp.phase & completed) {
1381                        /* target sent COMMAND COMPLETE */
1382                        done(shpnt, (CURRENT_SC->SCp.Status & 0xff) | ((CURRENT_SC->SCp.Message & 0xff) << 8) | (DID_OK << 16));
1383
1384                } else if(CURRENT_SC->SCp.phase & aborted) {
1385                        done(shpnt, (CURRENT_SC->SCp.Status & 0xff) | ((CURRENT_SC->SCp.Message & 0xff) << 8) | (DID_ABORT << 16));
1386
1387                } else if(CURRENT_SC->SCp.phase & resetted) {
1388                        done(shpnt, (CURRENT_SC->SCp.Status & 0xff) | ((CURRENT_SC->SCp.Message & 0xff) << 8) | (DID_RESET << 16));
1389
1390                } else if(CURRENT_SC->SCp.phase & disconnected) {
1391                        /* target sent DISCONNECT */
1392#if defined(AHA152X_STAT)
1393                        HOSTDATA(shpnt)->disconnections++;
1394#endif
1395                        append_SC(&DISCONNECTED_SC, CURRENT_SC);
1396                        CURRENT_SC->SCp.phase |= 1 << 16;
1397                        CURRENT_SC = NULL;
1398
1399                } else {
1400                        done(shpnt, DID_ERROR << 16);
1401                }
1402#if defined(AHA152X_STAT)
1403        } else {
1404                HOSTDATA(shpnt)->busfree_without_old_command++;
1405#endif
1406        }
1407
1408        DO_LOCK(flags);
1409
1410        if(DONE_SC) {
1411#if defined(AHA152X_STAT)
1412                action++;
1413#endif
1414
1415                if(DONE_SC->SCp.phase & check_condition) {
1416                        struct scsi_cmnd *cmd = HOSTDATA(shpnt)->done_SC;
1417                        struct aha152x_scdata *sc = SCDATA(cmd);
1418
1419                        scsi_eh_restore_cmnd(cmd, &sc->ses);
1420
1421                        cmd->SCp.Status = SAM_STAT_CHECK_CONDITION;
1422
1423                        HOSTDATA(shpnt)->commands--;
1424                        if (!HOSTDATA(shpnt)->commands)
1425                                SETPORT(PORTA, 0);      /* turn led off */
1426                } else if(DONE_SC->SCp.Status==SAM_STAT_CHECK_CONDITION) {
1427#if defined(AHA152X_STAT)
1428                        HOSTDATA(shpnt)->busfree_with_check_condition++;
1429#endif
1430
1431                        if(!(DONE_SC->SCp.phase & not_issued)) {
1432                                struct aha152x_scdata *sc;
1433                                struct scsi_cmnd *ptr = DONE_SC;
1434                                DONE_SC=NULL;
1435
1436                                sc = SCDATA(ptr);
1437                                /* It was allocated in aha152x_internal_queue? */
1438                                BUG_ON(!sc);
1439                                scsi_eh_prep_cmnd(ptr, &sc->ses, NULL, 0, ~0);
1440
1441                                DO_UNLOCK(flags);
1442                                aha152x_internal_queue(ptr, NULL, check_condition, ptr->scsi_done);
1443                                DO_LOCK(flags);
1444                        }
1445                }
1446
1447                if(DONE_SC && DONE_SC->scsi_done) {
1448                        struct scsi_cmnd *ptr = DONE_SC;
1449                        DONE_SC=NULL;
1450
1451                        /* turn led off, when no commands are in the driver */
1452                        HOSTDATA(shpnt)->commands--;
1453                        if (!HOSTDATA(shpnt)->commands)
1454                                SETPORT(PORTA, 0);      /* turn led off */
1455
1456                        if(ptr->scsi_done != reset_done) {
1457                                kfree(ptr->host_scribble);
1458                                ptr->host_scribble=NULL;
1459                        }
1460
1461                        DO_UNLOCK(flags);
1462                        ptr->scsi_done(ptr);
1463                        DO_LOCK(flags);
1464                }
1465
1466                DONE_SC=NULL;
1467#if defined(AHA152X_STAT)
1468        } else {
1469                HOSTDATA(shpnt)->busfree_without_done_command++;
1470#endif
1471        }
1472
1473        if(ISSUE_SC)
1474                CURRENT_SC = remove_first_SC(&ISSUE_SC);
1475
1476        DO_UNLOCK(flags);
1477
1478        if(CURRENT_SC) {
1479#if defined(AHA152X_STAT)
1480                action++;
1481#endif
1482                CURRENT_SC->SCp.phase |= selecting;
1483
1484                /* clear selection timeout */
1485                SETPORT(SSTAT1, SELTO);
1486
1487                SETPORT(SCSIID, (shpnt->this_id << OID_) | CURRENT_SC->device->id);
1488                SETPORT(SXFRCTL1, (PARITY ? ENSPCHK : 0 ) | ENSTIMER);
1489                SETPORT(SCSISEQ, ENSELO | ENAUTOATNO | (DISCONNECTED_SC ? ENRESELI : 0));
1490        } else {
1491#if defined(AHA152X_STAT)
1492                HOSTDATA(shpnt)->busfree_without_new_command++;
1493#endif
1494                SETPORT(SCSISEQ, DISCONNECTED_SC ? ENRESELI : 0);
1495        }
1496
1497#if defined(AHA152X_STAT)
1498        if(!action)
1499                HOSTDATA(shpnt)->busfree_without_any_action++;
1500#endif
1501}
1502
1503/*
1504 * Selection done (OUT)
1505 * - queue IDENTIFY message and SDTR to selected target for message out
1506 *   (ATN asserted automagically via ENAUTOATNO in busfree())
1507 */
1508static void seldo_run(struct Scsi_Host *shpnt)
1509{
1510        SETPORT(SCSISIG, 0);
1511        SETPORT(SSTAT1, CLRBUSFREE);
1512        SETPORT(SSTAT1, CLRPHASECHG);
1513
1514        CURRENT_SC->SCp.phase &= ~(selecting|not_issued);
1515
1516        SETPORT(SCSISEQ, 0);
1517
1518        if (TESTLO(SSTAT0, SELDO)) {
1519                scmd_printk(KERN_ERR, CURRENT_SC,
1520                            "aha152x: passing bus free condition\n");
1521                done(shpnt, DID_NO_CONNECT << 16);
1522                return;
1523        }
1524
1525        SETPORT(SSTAT0, CLRSELDO);
1526
1527        ADDMSGO(IDENTIFY(RECONNECT, CURRENT_SC->device->lun));
1528
1529        if (CURRENT_SC->SCp.phase & aborting) {
1530                ADDMSGO(ABORT);
1531        } else if (CURRENT_SC->SCp.phase & resetting) {
1532                ADDMSGO(BUS_DEVICE_RESET);
1533        } else if (SYNCNEG==0 && SYNCHRONOUS) {
1534                CURRENT_SC->SCp.phase |= syncneg;
1535                MSGOLEN += spi_populate_sync_msg(&MSGO(MSGOLEN), 50, 8);
1536                SYNCNEG=1;              /* negotiation in progress */
1537        }
1538
1539        SETRATE(SYNCRATE);
1540}
1541
1542/*
1543 * Selection timeout
1544 * - return command to mid-level with failure cause
1545 *
1546 */
1547static void selto_run(struct Scsi_Host *shpnt)
1548{
1549        SETPORT(SCSISEQ, 0);
1550        SETPORT(SSTAT1, CLRSELTIMO);
1551
1552        if (!CURRENT_SC)
1553                return;
1554
1555        CURRENT_SC->SCp.phase &= ~selecting;
1556
1557        if (CURRENT_SC->SCp.phase & aborted)
1558                done(shpnt, DID_ABORT << 16);
1559        else if (TESTLO(SSTAT0, SELINGO))
1560                done(shpnt, DID_BUS_BUSY << 16);
1561        else
1562                /* ARBITRATION won, but SELECTION failed */
1563                done(shpnt, DID_NO_CONNECT << 16);
1564}
1565
1566/*
1567 * Selection in done
1568 * - put current command back to issue queue
1569 *   (reconnection of a disconnected nexus instead
1570 *    of successful selection out)
1571 *
1572 */
1573static void seldi_run(struct Scsi_Host *shpnt)
1574{
1575        int selid;
1576        int target;
1577        unsigned long flags;
1578
1579        SETPORT(SCSISIG, 0);
1580        SETPORT(SSTAT0, CLRSELDI);
1581        SETPORT(SSTAT1, CLRBUSFREE);
1582        SETPORT(SSTAT1, CLRPHASECHG);
1583
1584        if(CURRENT_SC) {
1585                if(!(CURRENT_SC->SCp.phase & not_issued))
1586                        scmd_printk(KERN_ERR, CURRENT_SC,
1587                                    "command should not have been issued yet\n");
1588
1589                DO_LOCK(flags);
1590                append_SC(&ISSUE_SC, CURRENT_SC);
1591                DO_UNLOCK(flags);
1592
1593                CURRENT_SC = NULL;
1594        }
1595
1596        if (!DISCONNECTED_SC)
1597                return;
1598
1599        RECONN_TARGET=-1;
1600
1601        selid = GETPORT(SELID) & ~(1 << shpnt->this_id);
1602
1603        if (selid==0) {
1604                shost_printk(KERN_INFO, shpnt,
1605                             "target id unknown (%02x)\n", selid);
1606                return;
1607        }
1608
1609        for(target=7; !(selid & (1 << target)); target--)
1610                ;
1611
1612        if(selid & ~(1 << target)) {
1613                shost_printk(KERN_INFO, shpnt,
1614                             "multiple targets reconnected (%02x)\n", selid);
1615        }
1616
1617
1618        SETPORT(SCSIID, (shpnt->this_id << OID_) | target);
1619        SETPORT(SCSISEQ, 0);
1620
1621        SETRATE(HOSTDATA(shpnt)->syncrate[target]);
1622
1623        RECONN_TARGET=target;
1624}
1625
1626/*
1627 * message in phase
1628 * - handle initial message after reconnection to identify
1629 *   reconnecting nexus
1630 * - queue command on DISCONNECTED_SC on DISCONNECT message
1631 * - set completed flag on COMMAND COMPLETE
1632 *   (other completition code moved to busfree_run)
1633 * - handle response to SDTR
1634 * - clear synchronous transfer agreements on BUS RESET
1635 *
1636 * FIXME: what about SAVE POINTERS, RESTORE POINTERS?
1637 *
1638 */
1639static void msgi_run(struct Scsi_Host *shpnt)
1640{
1641        for(;;) {
1642                int sstat1 = GETPORT(SSTAT1);
1643
1644                if(sstat1 & (PHASECHG|PHASEMIS|BUSFREE) || !(sstat1 & REQINIT))
1645                        return;
1646
1647                if (TESTLO(SSTAT0, SPIORDY))
1648                        return;
1649
1650                ADDMSGI(GETPORT(SCSIDAT));
1651
1652                if(!CURRENT_SC) {
1653                        if(LASTSTATE!=seldi) {
1654                                shost_printk(KERN_ERR, shpnt,
1655                                             "message in w/o current command"
1656                                             " not after reselection\n");
1657                        }
1658
1659                        /*
1660                         * Handle reselection
1661                         */
1662                        if(!(MSGI(0) & IDENTIFY_BASE)) {
1663                                shost_printk(KERN_ERR, shpnt,
1664                                             "target didn't identify after reselection\n");
1665                                continue;
1666                        }
1667
1668                        CURRENT_SC = remove_lun_SC(&DISCONNECTED_SC, RECONN_TARGET, MSGI(0) & 0x3f);
1669
1670                        if (!CURRENT_SC) {
1671                                show_queues(shpnt);
1672                                shost_printk(KERN_ERR, shpnt,
1673                                             "no disconnected command"
1674                                             " for target %d/%d\n",
1675                                             RECONN_TARGET, MSGI(0) & 0x3f);
1676                                continue;
1677                        }
1678
1679                        CURRENT_SC->SCp.Message = MSGI(0);
1680                        CURRENT_SC->SCp.phase &= ~disconnected;
1681
1682                        MSGILEN=0;
1683
1684                        /* next message if any */
1685                        continue;
1686                }
1687
1688                CURRENT_SC->SCp.Message = MSGI(0);
1689
1690                switch (MSGI(0)) {
1691                case DISCONNECT:
1692                        if (!RECONNECT)
1693                                scmd_printk(KERN_WARNING, CURRENT_SC,
1694                                            "target was not allowed to disconnect\n");
1695
1696                        CURRENT_SC->SCp.phase |= disconnected;
1697                        break;
1698
1699                case COMMAND_COMPLETE:
1700                        CURRENT_SC->SCp.phase |= completed;
1701                        break;
1702
1703                case MESSAGE_REJECT:
1704                        if (SYNCNEG==1) {
1705                                scmd_printk(KERN_INFO, CURRENT_SC,
1706                                            "Synchronous Data Transfer Request"
1707                                            " was rejected\n");
1708                                SYNCNEG=2;      /* negotiation completed */
1709                        } else
1710                                scmd_printk(KERN_INFO, CURRENT_SC,
1711                                            "inbound message (MESSAGE REJECT)\n");
1712                        break;
1713
1714                case SAVE_POINTERS:
1715                        break;
1716
1717                case RESTORE_POINTERS:
1718                        break;
1719
1720                case EXTENDED_MESSAGE:
1721                        if(MSGILEN<2 || MSGILEN<MSGI(1)+2) {
1722                                /* not yet completed */
1723                                continue;
1724                        }
1725
1726                        switch (MSGI(2)) {
1727                        case EXTENDED_SDTR:
1728                                {
1729                                        long ticks;
1730
1731                                        if (MSGI(1) != 3) {
1732                                                scmd_printk(KERN_ERR, CURRENT_SC,
1733                                                            "SDTR message length!=3\n");
1734                                                break;
1735                                        }
1736
1737                                        if (!HOSTDATA(shpnt)->synchronous)
1738                                                break;
1739
1740                                        printk(INFO_LEAD, CMDINFO(CURRENT_SC));
1741                                        spi_print_msg(&MSGI(0));
1742                                        printk("\n");
1743
1744                                        ticks = (MSGI(3) * 4 + 49) / 50;
1745
1746                                        if (syncneg) {
1747                                                /* negotiation in progress */
1748                                                if (ticks > 9 || MSGI(4) < 1 || MSGI(4) > 8) {
1749                                                        ADDMSGO(MESSAGE_REJECT);
1750                                                        scmd_printk(KERN_INFO,
1751                                                                    CURRENT_SC,
1752                                                                    "received Synchronous Data Transfer Request invalid - rejected\n");
1753                                                        break;
1754                                                }
1755
1756                                                SYNCRATE |= ((ticks - 2) << 4) + MSGI(4);
1757                                        } else if (ticks <= 9 && MSGI(4) >= 1) {
1758                                                ADDMSGO(EXTENDED_MESSAGE);
1759                                                ADDMSGO(3);
1760                                                ADDMSGO(EXTENDED_SDTR);
1761                                                if (ticks < 4) {
1762                                                        ticks = 4;
1763                                                        ADDMSGO(50);
1764                                                } else
1765                                                        ADDMSGO(MSGI(3));
1766
1767                                                if (MSGI(4) > 8)
1768                                                        MSGI(4) = 8;
1769
1770                                                ADDMSGO(MSGI(4));
1771
1772                                                SYNCRATE |= ((ticks - 2) << 4) + MSGI(4);
1773                                        } else {
1774                                                /* requested SDTR is too slow, do it asynchronously */
1775                                                scmd_printk(KERN_INFO,
1776                                                            CURRENT_SC,
1777                                                            "Synchronous Data Transfer Request too slow - Rejecting\n");
1778                                                ADDMSGO(MESSAGE_REJECT);
1779                                        }
1780
1781                                        /* negotiation completed */
1782                                        SYNCNEG=2;
1783                                        SETRATE(SYNCRATE);
1784                                }
1785                                break;
1786
1787                        case BUS_DEVICE_RESET:
1788                                {
1789                                        int i;
1790
1791                                        for(i=0; i<8; i++) {
1792                                                HOSTDATA(shpnt)->syncrate[i]=0;
1793                                                HOSTDATA(shpnt)->syncneg[i]=0;
1794                                        }
1795
1796                                }
1797                                break;
1798
1799                        case EXTENDED_MODIFY_DATA_POINTER:
1800                        case EXTENDED_EXTENDED_IDENTIFY:
1801                        case EXTENDED_WDTR:
1802                        default:
1803                                ADDMSGO(MESSAGE_REJECT);
1804                                break;
1805                        }
1806                        break;
1807                }
1808
1809                MSGILEN=0;
1810        }
1811}
1812
1813static void msgi_end(struct Scsi_Host *shpnt)
1814{
1815        if(MSGILEN>0)
1816                scmd_printk(KERN_WARNING, CURRENT_SC,
1817                            "target left before message completed (%d)\n",
1818                            MSGILEN);
1819
1820        if (MSGOLEN > 0 && !(GETPORT(SSTAT1) & BUSFREE))
1821                SETPORT(SCSISIG, P_MSGI | SIG_ATNO);
1822}
1823
1824/*
1825 * message out phase
1826 *
1827 */
1828static void msgo_init(struct Scsi_Host *shpnt)
1829{
1830        if(MSGOLEN==0) {
1831                if((CURRENT_SC->SCp.phase & syncneg) && SYNCNEG==2 && SYNCRATE==0) {
1832                        ADDMSGO(IDENTIFY(RECONNECT, CURRENT_SC->device->lun));
1833                } else {
1834                        scmd_printk(KERN_INFO, CURRENT_SC,
1835                                    "unexpected MESSAGE OUT phase; rejecting\n");
1836                        ADDMSGO(MESSAGE_REJECT);
1837                }
1838        }
1839
1840}
1841
1842/*
1843 * message out phase
1844 *
1845 */
1846static void msgo_run(struct Scsi_Host *shpnt)
1847{
1848        while(MSGO_I<MSGOLEN) {
1849                if (TESTLO(SSTAT0, SPIORDY))
1850                        return;
1851
1852                if (MSGO_I==MSGOLEN-1) {
1853                        /* Leave MESSAGE OUT after transfer */
1854                        SETPORT(SSTAT1, CLRATNO);
1855                }
1856
1857
1858                if (MSGO(MSGO_I) & IDENTIFY_BASE)
1859                        CURRENT_SC->SCp.phase |= identified;
1860
1861                if (MSGO(MSGO_I)==ABORT)
1862                        CURRENT_SC->SCp.phase |= aborted;
1863
1864                if (MSGO(MSGO_I)==BUS_DEVICE_RESET)
1865                        CURRENT_SC->SCp.phase |= resetted;
1866
1867                SETPORT(SCSIDAT, MSGO(MSGO_I++));
1868        }
1869}
1870
1871static void msgo_end(struct Scsi_Host *shpnt)
1872{
1873        if(MSGO_I<MSGOLEN) {
1874                scmd_printk(KERN_ERR, CURRENT_SC,
1875                            "message sent incompletely (%d/%d)\n",
1876                            MSGO_I, MSGOLEN);
1877                if(SYNCNEG==1) {
1878                        scmd_printk(KERN_INFO, CURRENT_SC,
1879                                    "Synchronous Data Transfer Request was rejected\n");
1880                        SYNCNEG=2;
1881                }
1882        }
1883
1884        MSGO_I  = 0;
1885        MSGOLEN = 0;
1886}
1887
1888/*
1889 * command phase
1890 *
1891 */
1892static void cmd_init(struct Scsi_Host *shpnt)
1893{
1894        if (CURRENT_SC->SCp.sent_command) {
1895                scmd_printk(KERN_ERR, CURRENT_SC,
1896                            "command already sent\n");
1897                done(shpnt, DID_ERROR << 16);
1898                return;
1899        }
1900
1901        CMD_I=0;
1902}
1903
1904/*
1905 * command phase
1906 *
1907 */
1908static void cmd_run(struct Scsi_Host *shpnt)
1909{
1910        while(CMD_I<CURRENT_SC->cmd_len) {
1911                if (TESTLO(SSTAT0, SPIORDY))
1912                        return;
1913
1914                SETPORT(SCSIDAT, CURRENT_SC->cmnd[CMD_I++]);
1915        }
1916}
1917
1918static void cmd_end(struct Scsi_Host *shpnt)
1919{
1920        if(CMD_I<CURRENT_SC->cmd_len)
1921                scmd_printk(KERN_ERR, CURRENT_SC,
1922                            "command sent incompletely (%d/%d)\n",
1923                            CMD_I, CURRENT_SC->cmd_len);
1924        else
1925                CURRENT_SC->SCp.sent_command++;
1926}
1927
1928/*
1929 * status phase
1930 *
1931 */
1932static void status_run(struct Scsi_Host *shpnt)
1933{
1934        if (TESTLO(SSTAT0, SPIORDY))
1935                return;
1936
1937        CURRENT_SC->SCp.Status = GETPORT(SCSIDAT);
1938
1939}
1940
1941/*
1942 * data in phase
1943 *
1944 */
1945static void datai_init(struct Scsi_Host *shpnt)
1946{
1947        SETPORT(DMACNTRL0, RSTFIFO);
1948        SETPORT(DMACNTRL0, RSTFIFO|ENDMA);
1949
1950        SETPORT(SXFRCTL0, CH1|CLRSTCNT);
1951        SETPORT(SXFRCTL0, CH1|SCSIEN|DMAEN);
1952
1953        SETPORT(SIMODE0, 0);
1954        SETPORT(SIMODE1, ENSCSIPERR | ENSCSIRST | ENPHASEMIS | ENBUSFREE);
1955
1956        DATA_LEN=0;
1957}
1958
1959static void datai_run(struct Scsi_Host *shpnt)
1960{
1961        unsigned long the_time;
1962        int fifodata, data_count;
1963
1964        /*
1965         * loop while the phase persists or the fifos are not empty
1966         *
1967         */
1968        while(TESTLO(DMASTAT, INTSTAT) || TESTLO(DMASTAT, DFIFOEMP) || TESTLO(SSTAT2, SEMPTY)) {
1969                /* FIXME: maybe this should be done by setting up
1970                 * STCNT to trigger ENSWRAP interrupt, instead of
1971                 * polling for DFIFOFULL
1972                 */
1973                the_time=jiffies + 100*HZ;
1974                while(TESTLO(DMASTAT, DFIFOFULL|INTSTAT) && time_before(jiffies,the_time))
1975                        barrier();
1976
1977                if(TESTLO(DMASTAT, DFIFOFULL|INTSTAT)) {
1978                        scmd_printk(KERN_ERR, CURRENT_SC, "datai timeout\n");
1979                        break;
1980                }
1981
1982                if(TESTHI(DMASTAT, DFIFOFULL)) {
1983                        fifodata = 128;
1984                } else {
1985                        the_time=jiffies + 100*HZ;
1986                        while(TESTLO(SSTAT2, SEMPTY) && time_before(jiffies,the_time))
1987                                barrier();
1988
1989                        if(TESTLO(SSTAT2, SEMPTY)) {
1990                                scmd_printk(KERN_ERR, CURRENT_SC,
1991                                            "datai sempty timeout");
1992                                break;
1993                        }
1994
1995                        fifodata = GETPORT(FIFOSTAT);
1996                }
1997
1998                if(CURRENT_SC->SCp.this_residual>0) {
1999                        while(fifodata>0 && CURRENT_SC->SCp.this_residual>0) {
2000                                data_count = fifodata > CURRENT_SC->SCp.this_residual ?
2001                                                CURRENT_SC->SCp.this_residual :
2002                                                fifodata;
2003                                fifodata -= data_count;
2004
2005                                if (data_count & 1) {
2006                                        SETPORT(DMACNTRL0, ENDMA|_8BIT);
2007                                        *CURRENT_SC->SCp.ptr++ = GETPORT(DATAPORT);
2008                                        CURRENT_SC->SCp.this_residual--;
2009                                        DATA_LEN++;
2010                                        SETPORT(DMACNTRL0, ENDMA);
2011                                }
2012
2013                                if (data_count > 1) {
2014                                        data_count >>= 1;
2015                                        insw(DATAPORT, CURRENT_SC->SCp.ptr, data_count);
2016                                        CURRENT_SC->SCp.ptr += 2 * data_count;
2017                                        CURRENT_SC->SCp.this_residual -= 2 * data_count;
2018                                        DATA_LEN += 2 * data_count;
2019                                }
2020
2021                                if (CURRENT_SC->SCp.this_residual == 0 &&
2022                                    CURRENT_SC->SCp.buffers_residual > 0) {
2023                                        /* advance to next buffer */
2024                                        CURRENT_SC->SCp.buffers_residual--;
2025                                        CURRENT_SC->SCp.buffer++;
2026                                        CURRENT_SC->SCp.ptr           = SG_ADDRESS(CURRENT_SC->SCp.buffer);
2027                                        CURRENT_SC->SCp.this_residual = CURRENT_SC->SCp.buffer->length;
2028                                }
2029                        }
2030                } else if (fifodata > 0) {
2031                        scmd_printk(KERN_ERR, CURRENT_SC,
2032                                    "no buffers left for %d(%d) bytes"
2033                                    " (data overrun!?)\n",
2034                                    fifodata, GETPORT(FIFOSTAT));
2035                        SETPORT(DMACNTRL0, ENDMA|_8BIT);
2036                        while(fifodata>0) {
2037                                int data;
2038                                data=GETPORT(DATAPORT);
2039                                fifodata--;
2040                                DATA_LEN++;
2041                        }
2042                        SETPORT(DMACNTRL0, ENDMA|_8BIT);
2043                }
2044        }
2045
2046        if(TESTLO(DMASTAT, INTSTAT) ||
2047           TESTLO(DMASTAT, DFIFOEMP) ||
2048           TESTLO(SSTAT2, SEMPTY) ||
2049           GETPORT(FIFOSTAT)>0) {
2050                /*
2051                 * something went wrong, if there's something left in the fifos
2052                 * or the phase didn't change
2053                 */
2054                scmd_printk(KERN_ERR, CURRENT_SC,
2055                            "fifos should be empty and phase should have changed\n");
2056        }
2057
2058        if(DATA_LEN!=GETSTCNT()) {
2059                scmd_printk(KERN_ERR, CURRENT_SC,
2060                            "manual transfer count differs from automatic "
2061                            "(count=%d;stcnt=%d;diff=%d;fifostat=%d)",
2062                            DATA_LEN, GETSTCNT(), GETSTCNT()-DATA_LEN,
2063                            GETPORT(FIFOSTAT));
2064                mdelay(10000);
2065        }
2066}
2067
2068static void datai_end(struct Scsi_Host *shpnt)
2069{
2070        CMD_INC_RESID(CURRENT_SC, -GETSTCNT());
2071
2072        SETPORT(SXFRCTL0, CH1|CLRSTCNT);
2073        SETPORT(DMACNTRL0, 0);
2074}
2075
2076/*
2077 * data out phase
2078 *
2079 */
2080static void datao_init(struct Scsi_Host *shpnt)
2081{
2082        SETPORT(DMACNTRL0, WRITE_READ | RSTFIFO);
2083        SETPORT(DMACNTRL0, WRITE_READ | ENDMA);
2084
2085        SETPORT(SXFRCTL0, CH1|CLRSTCNT);
2086        SETPORT(SXFRCTL0, CH1|SCSIEN|DMAEN);
2087
2088        SETPORT(SIMODE0, 0);
2089        SETPORT(SIMODE1, ENSCSIPERR | ENSCSIRST | ENPHASEMIS | ENBUSFREE );
2090
2091        DATA_LEN = scsi_get_resid(CURRENT_SC);
2092}
2093
2094static void datao_run(struct Scsi_Host *shpnt)
2095{
2096        unsigned long the_time;
2097        int data_count;
2098
2099        /* until phase changes or all data sent */
2100        while(TESTLO(DMASTAT, INTSTAT) && CURRENT_SC->SCp.this_residual>0) {
2101                data_count = 128;
2102                if(data_count > CURRENT_SC->SCp.this_residual)
2103                        data_count=CURRENT_SC->SCp.this_residual;
2104
2105                if(TESTLO(DMASTAT, DFIFOEMP)) {
2106                        scmd_printk(KERN_ERR, CURRENT_SC,
2107                                    "datao fifo not empty (%d)",
2108                                    GETPORT(FIFOSTAT));
2109                        break;
2110                }
2111
2112                if(data_count & 1) {
2113                        SETPORT(DMACNTRL0,WRITE_READ|ENDMA|_8BIT);
2114                        SETPORT(DATAPORT, *CURRENT_SC->SCp.ptr++);
2115                        CURRENT_SC->SCp.this_residual--;
2116                        CMD_INC_RESID(CURRENT_SC, -1);
2117                        SETPORT(DMACNTRL0,WRITE_READ|ENDMA);
2118                }
2119
2120                if(data_count > 1) {
2121                        data_count >>= 1;
2122                        outsw(DATAPORT, CURRENT_SC->SCp.ptr, data_count);
2123                        CURRENT_SC->SCp.ptr           += 2 * data_count;
2124                        CURRENT_SC->SCp.this_residual -= 2 * data_count;
2125                        CMD_INC_RESID(CURRENT_SC, -2 * data_count);
2126                }
2127
2128                if(CURRENT_SC->SCp.this_residual==0 && CURRENT_SC->SCp.buffers_residual>0) {
2129                        /* advance to next buffer */
2130                        CURRENT_SC->SCp.buffers_residual--;
2131                        CURRENT_SC->SCp.buffer++;
2132                        CURRENT_SC->SCp.ptr           = SG_ADDRESS(CURRENT_SC->SCp.buffer);
2133                        CURRENT_SC->SCp.this_residual = CURRENT_SC->SCp.buffer->length;
2134                }
2135
2136                the_time=jiffies + 100*HZ;
2137                while(TESTLO(DMASTAT, DFIFOEMP|INTSTAT) && time_before(jiffies,the_time))
2138                        barrier();
2139
2140                if(TESTLO(DMASTAT, DFIFOEMP|INTSTAT)) {
2141                        scmd_printk(KERN_ERR, CURRENT_SC, "dataout timeout\n");
2142                        break;
2143                }
2144        }
2145}
2146
2147static void datao_end(struct Scsi_Host *shpnt)
2148{
2149        if(TESTLO(DMASTAT, DFIFOEMP)) {
2150                int data_count = (DATA_LEN - scsi_get_resid(CURRENT_SC)) -
2151                        GETSTCNT();
2152
2153                CMD_INC_RESID(CURRENT_SC, data_count);
2154
2155                data_count -= CURRENT_SC->SCp.ptr -
2156                        SG_ADDRESS(CURRENT_SC->SCp.buffer);
2157                while(data_count>0) {
2158                        CURRENT_SC->SCp.buffer--;
2159                        CURRENT_SC->SCp.buffers_residual++;
2160                        data_count -= CURRENT_SC->SCp.buffer->length;
2161                }
2162                CURRENT_SC->SCp.ptr = SG_ADDRESS(CURRENT_SC->SCp.buffer) -
2163                        data_count;
2164                CURRENT_SC->SCp.this_residual = CURRENT_SC->SCp.buffer->length +
2165                        data_count;
2166        }
2167
2168        SETPORT(SXFRCTL0, CH1|CLRCH1|CLRSTCNT);
2169        SETPORT(SXFRCTL0, CH1);
2170
2171        SETPORT(DMACNTRL0, 0);
2172}
2173
2174/*
2175 * figure out what state we're in
2176 *
2177 */
2178static int update_state(struct Scsi_Host *shpnt)
2179{
2180        int dataphase=0;
2181        unsigned int stat0 = GETPORT(SSTAT0);
2182        unsigned int stat1 = GETPORT(SSTAT1);
2183
2184        PREVSTATE = STATE;
2185        STATE=unknown;
2186
2187        if(stat1 & SCSIRSTI) {
2188                STATE=rsti;
2189                SETPORT(SCSISEQ,0);
2190                SETPORT(SSTAT1,SCSIRSTI);
2191        } else if (stat0 & SELDI && PREVSTATE == busfree) {
2192                STATE=seldi;
2193        } else if(stat0 & SELDO && CURRENT_SC && (CURRENT_SC->SCp.phase & selecting)) {
2194                STATE=seldo;
2195        } else if(stat1 & SELTO) {
2196                STATE=selto;
2197        } else if(stat1 & BUSFREE) {
2198                STATE=busfree;
2199                SETPORT(SSTAT1,BUSFREE);
2200        } else if(stat1 & SCSIPERR) {
2201                STATE=parerr;
2202                SETPORT(SSTAT1,SCSIPERR);
2203        } else if(stat1 & REQINIT) {
2204                switch(GETPORT(SCSISIG) & P_MASK) {
2205                case P_MSGI:    STATE=msgi;     break;
2206                case P_MSGO:    STATE=msgo;     break;
2207                case P_DATAO:   STATE=datao;    break;
2208                case P_DATAI:   STATE=datai;    break;
2209                case P_STATUS:  STATE=status;   break;
2210                case P_CMD:     STATE=cmd;      break;
2211                }
2212                dataphase=1;
2213        }
2214
2215        if((stat0 & SELDI) && STATE!=seldi && !dataphase) {
2216                scmd_printk(KERN_INFO, CURRENT_SC, "reselection missed?");
2217        }
2218
2219        if(STATE!=PREVSTATE) {
2220                LASTSTATE=PREVSTATE;
2221        }
2222
2223        return dataphase;
2224}
2225
2226/*
2227 * handle parity error
2228 *
2229 * FIXME: in which phase?
2230 *
2231 */
2232static void parerr_run(struct Scsi_Host *shpnt)
2233{
2234        scmd_printk(KERN_ERR, CURRENT_SC, "parity error\n");
2235        done(shpnt, DID_PARITY << 16);
2236}
2237
2238/*
2239 * handle reset in
2240 *
2241 */
2242static void rsti_run(struct Scsi_Host *shpnt)
2243{
2244        struct scsi_cmnd *ptr;
2245
2246        shost_printk(KERN_NOTICE, shpnt, "scsi reset in\n");
2247
2248        ptr=DISCONNECTED_SC;
2249        while(ptr) {
2250                struct scsi_cmnd *next = SCNEXT(ptr);
2251
2252                if (!ptr->device->soft_reset) {
2253                        remove_SC(&DISCONNECTED_SC, ptr);
2254
2255                        kfree(ptr->host_scribble);
2256                        ptr->host_scribble=NULL;
2257
2258                        ptr->result =  DID_RESET << 16;
2259                        ptr->scsi_done(ptr);
2260                }
2261
2262                ptr = next;
2263        }
2264
2265        if(CURRENT_SC && !CURRENT_SC->device->soft_reset)
2266                done(shpnt, DID_RESET << 16 );
2267}
2268
2269
2270/*
2271 * bottom-half handler
2272 *
2273 */
2274static void is_complete(struct Scsi_Host *shpnt)
2275{
2276        int dataphase;
2277        unsigned long flags;
2278        int pending;
2279
2280        if(!shpnt)
2281                return;
2282
2283        DO_LOCK(flags);
2284
2285        if( HOSTDATA(shpnt)->service==0 )  {
2286                DO_UNLOCK(flags);
2287                return;
2288        }
2289
2290        HOSTDATA(shpnt)->service = 0;
2291
2292        if(HOSTDATA(shpnt)->in_intr) {
2293                DO_UNLOCK(flags);
2294                /* aha152x_error never returns.. */
2295                aha152x_error(shpnt, "bottom-half already running!?");
2296        }
2297        HOSTDATA(shpnt)->in_intr++;
2298
2299        /*
2300         * loop while there are interrupt conditions pending
2301         *
2302         */
2303        do {
2304                unsigned long start = jiffies;
2305                DO_UNLOCK(flags);
2306
2307                dataphase=update_state(shpnt);
2308
2309                /*
2310                 * end previous state
2311                 *
2312                 */
2313                if(PREVSTATE!=STATE && states[PREVSTATE].end)
2314                        states[PREVSTATE].end(shpnt);
2315
2316                /*
2317                 * disable SPIO mode if previous phase used it
2318                 * and this one doesn't
2319                 *
2320                 */
2321                if(states[PREVSTATE].spio && !states[STATE].spio) {
2322                        SETPORT(SXFRCTL0, CH1);
2323                        SETPORT(DMACNTRL0, 0);
2324                        if(CURRENT_SC)
2325                                CURRENT_SC->SCp.phase &= ~spiordy;
2326                }
2327
2328                /*
2329                 * accept current dataphase phase
2330                 *
2331                 */
2332                if(dataphase) {
2333                        SETPORT(SSTAT0, REQINIT);
2334                        SETPORT(SCSISIG, GETPORT(SCSISIG) & P_MASK);
2335                        SETPORT(SSTAT1, PHASECHG);
2336                }
2337
2338                /*
2339                 * enable SPIO mode if previous didn't use it
2340                 * and this one does
2341                 *
2342                 */
2343                if(!states[PREVSTATE].spio && states[STATE].spio) {
2344                        SETPORT(DMACNTRL0, 0);
2345                        SETPORT(SXFRCTL0, CH1|SPIOEN);
2346                        if(CURRENT_SC)
2347                                CURRENT_SC->SCp.phase |= spiordy;
2348                }
2349
2350                /*
2351                 * initialize for new state
2352                 *
2353                 */
2354                if(PREVSTATE!=STATE && states[STATE].init)
2355                        states[STATE].init(shpnt);
2356
2357                /*
2358                 * handle current state
2359                 *
2360                 */
2361                if(states[STATE].run)
2362                        states[STATE].run(shpnt);
2363                else
2364                        scmd_printk(KERN_ERR, CURRENT_SC,
2365                                    "unexpected state (%x)\n", STATE);
2366
2367                /*
2368                 * setup controller to interrupt on
2369                 * the next expected condition and
2370                 * loop if it's already there
2371                 *
2372                 */
2373                DO_LOCK(flags);
2374                pending=setup_expected_interrupts(shpnt);
2375#if defined(AHA152X_STAT)
2376                HOSTDATA(shpnt)->count[STATE]++;
2377                if(PREVSTATE!=STATE)
2378                        HOSTDATA(shpnt)->count_trans[STATE]++;
2379                HOSTDATA(shpnt)->time[STATE] += jiffies-start;
2380#endif
2381
2382        } while(pending);
2383
2384        /*
2385         * enable interrupts and leave bottom-half
2386         *
2387         */
2388        HOSTDATA(shpnt)->in_intr--;
2389        SETBITS(DMACNTRL0, INTEN);
2390        DO_UNLOCK(flags);
2391}
2392
2393
2394/*
2395 * Dump the current driver status and panic
2396 */
2397static void aha152x_error(struct Scsi_Host *shpnt, char *msg)
2398{
2399        shost_printk(KERN_EMERG, shpnt, "%s\n", msg);
2400        show_queues(shpnt);
2401        panic("aha152x panic\n");
2402}
2403
2404/*
2405 * display enabled interrupts
2406 */
2407static void disp_enintr(struct Scsi_Host *shpnt)
2408{
2409        int s0, s1;
2410
2411        s0 = GETPORT(SIMODE0);
2412        s1 = GETPORT(SIMODE1);
2413
2414        shost_printk(KERN_DEBUG, shpnt,
2415                     "enabled interrupts (%s%s%s%s%s%s%s%s%s%s%s%s%s%s)\n",
2416                     (s0 & ENSELDO) ? "ENSELDO " : "",
2417                     (s0 & ENSELDI) ? "ENSELDI " : "",
2418                     (s0 & ENSELINGO) ? "ENSELINGO " : "",
2419                     (s0 & ENSWRAP) ? "ENSWRAP " : "",
2420                     (s0 & ENSDONE) ? "ENSDONE " : "",
2421                     (s0 & ENSPIORDY) ? "ENSPIORDY " : "",
2422                     (s0 & ENDMADONE) ? "ENDMADONE " : "",
2423                     (s1 & ENSELTIMO) ? "ENSELTIMO " : "",
2424                     (s1 & ENATNTARG) ? "ENATNTARG " : "",
2425                     (s1 & ENPHASEMIS) ? "ENPHASEMIS " : "",
2426                     (s1 & ENBUSFREE) ? "ENBUSFREE " : "",
2427                     (s1 & ENSCSIPERR) ? "ENSCSIPERR " : "",
2428                     (s1 & ENPHASECHG) ? "ENPHASECHG " : "",
2429                     (s1 & ENREQINIT) ? "ENREQINIT " : "");
2430}
2431
2432/*
2433 * Show the command data of a command
2434 */
2435static void show_command(struct scsi_cmnd *ptr)
2436{
2437        scsi_print_command(ptr);
2438        scmd_printk(KERN_DEBUG, ptr,
2439                    "request_bufflen=%d; resid=%d; "
2440                    "phase |%s%s%s%s%s%s%s%s%s; next=0x%p",
2441                    scsi_bufflen(ptr), scsi_get_resid(ptr),
2442                    (ptr->SCp.phase & not_issued) ? "not issued|" : "",
2443                    (ptr->SCp.phase & selecting) ? "selecting|" : "",
2444                    (ptr->SCp.phase & identified) ? "identified|" : "",
2445                    (ptr->SCp.phase & disconnected) ? "disconnected|" : "",
2446                    (ptr->SCp.phase & completed) ? "completed|" : "",
2447                    (ptr->SCp.phase & spiordy) ? "spiordy|" : "",
2448                    (ptr->SCp.phase & syncneg) ? "syncneg|" : "",
2449                    (ptr->SCp.phase & aborted) ? "aborted|" : "",
2450                    (ptr->SCp.phase & resetted) ? "resetted|" : "",
2451                    (SCDATA(ptr)) ? SCNEXT(ptr) : NULL);
2452}
2453
2454/*
2455 * Dump the queued data
2456 */
2457static void show_queues(struct Scsi_Host *shpnt)
2458{
2459        struct scsi_cmnd *ptr;
2460        unsigned long flags;
2461
2462        DO_LOCK(flags);
2463        printk(KERN_DEBUG "\nqueue status:\nissue_SC:\n");
2464        for (ptr = ISSUE_SC; ptr; ptr = SCNEXT(ptr))
2465                show_command(ptr);
2466        DO_UNLOCK(flags);
2467
2468        printk(KERN_DEBUG "current_SC:\n");
2469        if (CURRENT_SC)
2470                show_command(CURRENT_SC);
2471        else
2472                printk(KERN_DEBUG "none\n");
2473
2474        printk(KERN_DEBUG "disconnected_SC:\n");
2475        for (ptr = DISCONNECTED_SC; ptr; ptr = SCDATA(ptr) ? SCNEXT(ptr) : NULL)
2476                show_command(ptr);
2477
2478        disp_enintr(shpnt);
2479}
2480
2481static void get_command(struct seq_file *m, struct scsi_cmnd * ptr)
2482{
2483        int i;
2484
2485        seq_printf(m, "%p: target=%d; lun=%d; cmnd=( ",
2486                ptr, ptr->device->id, (u8)ptr->device->lun);
2487
2488        for (i = 0; i < COMMAND_SIZE(ptr->cmnd[0]); i++)
2489                seq_printf(m, "0x%02x ", ptr->cmnd[i]);
2490
2491        seq_printf(m, "); resid=%d; residual=%d; buffers=%d; phase |",
2492                scsi_get_resid(ptr), ptr->SCp.this_residual,
2493                ptr->SCp.buffers_residual);
2494
2495        if (ptr->SCp.phase & not_issued)
2496                seq_puts(m, "not issued|");
2497        if (ptr->SCp.phase & selecting)
2498                seq_puts(m, "selecting|");
2499        if (ptr->SCp.phase & disconnected)
2500                seq_puts(m, "disconnected|");
2501        if (ptr->SCp.phase & aborted)
2502                seq_puts(m, "aborted|");
2503        if (ptr->SCp.phase & identified)
2504                seq_puts(m, "identified|");
2505        if (ptr->SCp.phase & completed)
2506                seq_puts(m, "completed|");
2507        if (ptr->SCp.phase & spiordy)
2508                seq_puts(m, "spiordy|");
2509        if (ptr->SCp.phase & syncneg)
2510                seq_puts(m, "syncneg|");
2511        seq_printf(m, "; next=0x%p\n", SCNEXT(ptr));
2512}
2513
2514static void get_ports(struct seq_file *m, struct Scsi_Host *shpnt)
2515{
2516        int s;
2517
2518        seq_printf(m, "\n%s: %s(%s) ", CURRENT_SC ? "on bus" : "waiting", states[STATE].name, states[PREVSTATE].name);
2519
2520        s = GETPORT(SCSISEQ);
2521        seq_puts(m, "SCSISEQ( ");
2522        if (s & TEMODEO)
2523                seq_puts(m, "TARGET MODE ");
2524        if (s & ENSELO)
2525                seq_puts(m, "SELO ");
2526        if (s & ENSELI)
2527                seq_puts(m, "SELI ");
2528        if (s & ENRESELI)
2529                seq_puts(m, "RESELI ");
2530        if (s & ENAUTOATNO)
2531                seq_puts(m, "AUTOATNO ");
2532        if (s & ENAUTOATNI)
2533                seq_puts(m, "AUTOATNI ");
2534        if (s & ENAUTOATNP)
2535                seq_puts(m, "AUTOATNP ");
2536        if (s & SCSIRSTO)
2537                seq_puts(m, "SCSIRSTO ");
2538        seq_puts(m, ");");
2539
2540        seq_puts(m, " SCSISIG(");
2541        s = GETPORT(SCSISIG);
2542        switch (s & P_MASK) {
2543        case P_DATAO:
2544                seq_puts(m, "DATA OUT");
2545                break;
2546        case P_DATAI:
2547                seq_puts(m, "DATA IN");
2548                break;
2549        case P_CMD:
2550                seq_puts(m, "COMMAND");
2551                break;
2552        case P_STATUS:
2553                seq_puts(m, "STATUS");
2554                break;
2555        case P_MSGO:
2556                seq_puts(m, "MESSAGE OUT");
2557                break;
2558        case P_MSGI:
2559                seq_puts(m, "MESSAGE IN");
2560                break;
2561        default:
2562                seq_puts(m, "*invalid*");
2563                break;
2564        }
2565
2566        seq_puts(m, "); ");
2567
2568        seq_printf(m, "INTSTAT (%s); ", TESTHI(DMASTAT, INTSTAT) ? "hi" : "lo");
2569
2570        seq_puts(m, "SSTAT( ");
2571        s = GETPORT(SSTAT0);
2572        if (s & TARGET)
2573                seq_puts(m, "TARGET ");
2574        if (s & SELDO)
2575                seq_puts(m, "SELDO ");
2576        if (s & SELDI)
2577                seq_puts(m, "SELDI ");
2578        if (s & SELINGO)
2579                seq_puts(m, "SELINGO ");
2580        if (s & SWRAP)
2581                seq_puts(m, "SWRAP ");
2582        if (s & SDONE)
2583                seq_puts(m, "SDONE ");
2584        if (s & SPIORDY)
2585                seq_puts(m, "SPIORDY ");
2586        if (s & DMADONE)
2587                seq_puts(m, "DMADONE ");
2588
2589        s = GETPORT(SSTAT1);
2590        if (s & SELTO)
2591                seq_puts(m, "SELTO ");
2592        if (s & ATNTARG)
2593                seq_puts(m, "ATNTARG ");
2594        if (s & SCSIRSTI)
2595                seq_puts(m, "SCSIRSTI ");
2596        if (s & PHASEMIS)
2597                seq_puts(m, "PHASEMIS ");
2598        if (s & BUSFREE)
2599                seq_puts(m, "BUSFREE ");
2600        if (s & SCSIPERR)
2601                seq_puts(m, "SCSIPERR ");
2602        if (s & PHASECHG)
2603                seq_puts(m, "PHASECHG ");
2604        if (s & REQINIT)
2605                seq_puts(m, "REQINIT ");
2606        seq_puts(m, "); ");
2607
2608
2609        seq_puts(m, "SSTAT( ");
2610
2611        s = GETPORT(SSTAT0) & GETPORT(SIMODE0);
2612
2613        if (s & TARGET)
2614                seq_puts(m, "TARGET ");
2615        if (s & SELDO)
2616                seq_puts(m, "SELDO ");
2617        if (s & SELDI)
2618                seq_puts(m, "SELDI ");
2619        if (s & SELINGO)
2620                seq_puts(m, "SELINGO ");
2621        if (s & SWRAP)
2622                seq_puts(m, "SWRAP ");
2623        if (s & SDONE)
2624                seq_puts(m, "SDONE ");
2625        if (s & SPIORDY)
2626                seq_puts(m, "SPIORDY ");
2627        if (s & DMADONE)
2628                seq_puts(m, "DMADONE ");
2629
2630        s = GETPORT(SSTAT1) & GETPORT(SIMODE1);
2631
2632        if (s & SELTO)
2633                seq_puts(m, "SELTO ");
2634        if (s & ATNTARG)
2635                seq_puts(m, "ATNTARG ");
2636        if (s & SCSIRSTI)
2637                seq_puts(m, "SCSIRSTI ");
2638        if (s & PHASEMIS)
2639                seq_puts(m, "PHASEMIS ");
2640        if (s & BUSFREE)
2641                seq_puts(m, "BUSFREE ");
2642        if (s & SCSIPERR)
2643                seq_puts(m, "SCSIPERR ");
2644        if (s & PHASECHG)
2645                seq_puts(m, "PHASECHG ");
2646        if (s & REQINIT)
2647                seq_puts(m, "REQINIT ");
2648        seq_puts(m, "); ");
2649
2650        seq_puts(m, "SXFRCTL0( ");
2651
2652        s = GETPORT(SXFRCTL0);
2653        if (s & SCSIEN)
2654                seq_puts(m, "SCSIEN ");
2655        if (s & DMAEN)
2656                seq_puts(m, "DMAEN ");
2657        if (s & CH1)
2658                seq_puts(m, "CH1 ");
2659        if (s & CLRSTCNT)
2660                seq_puts(m, "CLRSTCNT ");
2661        if (s & SPIOEN)
2662                seq_puts(m, "SPIOEN ");
2663        if (s & CLRCH1)
2664                seq_puts(m, "CLRCH1 ");
2665        seq_puts(m, "); ");
2666
2667        seq_puts(m, "SIGNAL( ");
2668
2669        s = GETPORT(SCSISIG);
2670        if (s & SIG_ATNI)
2671                seq_puts(m, "ATNI ");
2672        if (s & SIG_SELI)
2673                seq_puts(m, "SELI ");
2674        if (s & SIG_BSYI)
2675                seq_puts(m, "BSYI ");
2676        if (s & SIG_REQI)
2677                seq_puts(m, "REQI ");
2678        if (s & SIG_ACKI)
2679                seq_puts(m, "ACKI ");
2680        seq_puts(m, "); ");
2681
2682        seq_printf(m, "SELID(%02x), ", GETPORT(SELID));
2683
2684        seq_printf(m, "STCNT(%d), ", GETSTCNT());
2685
2686        seq_puts(m, "SSTAT2( ");
2687
2688        s = GETPORT(SSTAT2);
2689        if (s & SOFFSET)
2690                seq_puts(m, "SOFFSET ");
2691        if (s & SEMPTY)
2692                seq_puts(m, "SEMPTY ");
2693        if (s & SFULL)
2694                seq_puts(m, "SFULL ");
2695        seq_printf(m, "); SFCNT (%d); ", s & (SFULL | SFCNT));
2696
2697        s = GETPORT(SSTAT3);
2698        seq_printf(m, "SCSICNT (%d), OFFCNT(%d), ", (s & 0xf0) >> 4, s & 0x0f);
2699
2700        seq_puts(m, "SSTAT4( ");
2701        s = GETPORT(SSTAT4);
2702        if (s & SYNCERR)
2703                seq_puts(m, "SYNCERR ");
2704        if (s & FWERR)
2705                seq_puts(m, "FWERR ");
2706        if (s & FRERR)
2707                seq_puts(m, "FRERR ");
2708        seq_puts(m, "); ");
2709
2710        seq_puts(m, "DMACNTRL0( ");
2711        s = GETPORT(DMACNTRL0);
2712        seq_printf(m, "%s ", s & _8BIT ? "8BIT" : "16BIT");
2713        seq_printf(m, "%s ", s & DMA ? "DMA" : "PIO");
2714        seq_printf(m, "%s ", s & WRITE_READ ? "WRITE" : "READ");
2715        if (s & ENDMA)
2716                seq_puts(m, "ENDMA ");
2717        if (s & INTEN)
2718                seq_puts(m, "INTEN ");
2719        if (s & RSTFIFO)
2720                seq_puts(m, "RSTFIFO ");
2721        if (s & SWINT)
2722                seq_puts(m, "SWINT ");
2723        seq_puts(m, "); ");
2724
2725        seq_puts(m, "DMASTAT( ");
2726        s = GETPORT(DMASTAT);
2727        if (s & ATDONE)
2728                seq_puts(m, "ATDONE ");
2729        if (s & WORDRDY)
2730                seq_puts(m, "WORDRDY ");
2731        if (s & DFIFOFULL)
2732                seq_puts(m, "DFIFOFULL ");
2733        if (s & DFIFOEMP)
2734                seq_puts(m, "DFIFOEMP ");
2735        seq_puts(m, ")\n");
2736
2737        seq_puts(m, "enabled interrupts( ");
2738
2739        s = GETPORT(SIMODE0);
2740        if (s & ENSELDO)
2741                seq_puts(m, "ENSELDO ");
2742        if (s & ENSELDI)
2743                seq_puts(m, "ENSELDI ");
2744        if (s & ENSELINGO)
2745                seq_puts(m, "ENSELINGO ");
2746        if (s & ENSWRAP)
2747                seq_puts(m, "ENSWRAP ");
2748        if (s & ENSDONE)
2749                seq_puts(m, "ENSDONE ");
2750        if (s & ENSPIORDY)
2751                seq_puts(m, "ENSPIORDY ");
2752        if (s & ENDMADONE)
2753                seq_puts(m, "ENDMADONE ");
2754
2755        s = GETPORT(SIMODE1);
2756        if (s & ENSELTIMO)
2757                seq_puts(m, "ENSELTIMO ");
2758        if (s & ENATNTARG)
2759                seq_puts(m, "ENATNTARG ");
2760        if (s & ENPHASEMIS)
2761                seq_puts(m, "ENPHASEMIS ");
2762        if (s & ENBUSFREE)
2763                seq_puts(m, "ENBUSFREE ");
2764        if (s & ENSCSIPERR)
2765                seq_puts(m, "ENSCSIPERR ");
2766        if (s & ENPHASECHG)
2767                seq_puts(m, "ENPHASECHG ");
2768        if (s & ENREQINIT)
2769                seq_puts(m, "ENREQINIT ");
2770        seq_puts(m, ")\n");
2771}
2772
2773static int aha152x_set_info(struct Scsi_Host *shpnt, char *buffer, int length)
2774{
2775        if(!shpnt || !buffer || length<8 || strncmp("aha152x ", buffer, 8)!=0)
2776                return -EINVAL;
2777
2778#if defined(AHA152X_STAT)
2779        if(length>13 && strncmp("reset", buffer+8, 5)==0) {
2780                int i;
2781
2782                HOSTDATA(shpnt)->total_commands=0;
2783                HOSTDATA(shpnt)->disconnections=0;
2784                HOSTDATA(shpnt)->busfree_without_any_action=0;
2785                HOSTDATA(shpnt)->busfree_without_old_command=0;
2786                HOSTDATA(shpnt)->busfree_without_new_command=0;
2787                HOSTDATA(shpnt)->busfree_without_done_command=0;
2788                HOSTDATA(shpnt)->busfree_with_check_condition=0;
2789                for (i = idle; i<maxstate; i++) {
2790                        HOSTDATA(shpnt)->count[i]=0;
2791                        HOSTDATA(shpnt)->count_trans[i]=0;
2792                        HOSTDATA(shpnt)->time[i]=0;
2793                }
2794
2795                shost_printk(KERN_INFO, shpnt, "aha152x: stats reset.\n");
2796
2797        } else
2798#endif
2799        {
2800                return -EINVAL;
2801        }
2802
2803
2804        return length;
2805}
2806
2807static int aha152x_show_info(struct seq_file *m, struct Scsi_Host *shpnt)
2808{
2809        int i;
2810        struct scsi_cmnd *ptr;
2811        unsigned long flags;
2812
2813        seq_puts(m, AHA152X_REVID "\n");
2814
2815        seq_printf(m, "ioports 0x%04lx to 0x%04lx\n",
2816                shpnt->io_port, shpnt->io_port + shpnt->n_io_port - 1);
2817        seq_printf(m, "interrupt 0x%02x\n", shpnt->irq);
2818        seq_printf(m, "disconnection/reconnection %s\n",
2819                RECONNECT ? "enabled" : "disabled");
2820        seq_printf(m, "parity checking %s\n",
2821                PARITY ? "enabled" : "disabled");
2822        seq_printf(m, "synchronous transfers %s\n",
2823                SYNCHRONOUS ? "enabled" : "disabled");
2824        seq_printf(m, "%d commands currently queued\n", HOSTDATA(shpnt)->commands);
2825
2826        if(SYNCHRONOUS) {
2827                seq_puts(m, "synchronously operating targets (tick=50 ns):\n");
2828                for (i = 0; i < 8; i++)
2829                        if (HOSTDATA(shpnt)->syncrate[i] & 0x7f)
2830                                seq_printf(m, "target %d: period %dT/%dns; req/ack offset %d\n",
2831                                        i,
2832                                        (((HOSTDATA(shpnt)->syncrate[i] & 0x70) >> 4) + 2),
2833                                        (((HOSTDATA(shpnt)->syncrate[i] & 0x70) >> 4) + 2) * 50,
2834                                    HOSTDATA(shpnt)->syncrate[i] & 0x0f);
2835        }
2836        seq_puts(m, "\nqueue status:\n");
2837        DO_LOCK(flags);
2838        if (ISSUE_SC) {
2839                seq_puts(m, "not yet issued commands:\n");
2840                for (ptr = ISSUE_SC; ptr; ptr = SCNEXT(ptr))
2841                        get_command(m, ptr);
2842        } else
2843                seq_puts(m, "no not yet issued commands\n");
2844        DO_UNLOCK(flags);
2845
2846        if (CURRENT_SC) {
2847                seq_puts(m, "current command:\n");
2848                get_command(m, CURRENT_SC);
2849        } else
2850                seq_puts(m, "no current command\n");
2851
2852        if (DISCONNECTED_SC) {
2853                seq_puts(m, "disconnected commands:\n");
2854                for (ptr = DISCONNECTED_SC; ptr; ptr = SCNEXT(ptr))
2855                        get_command(m, ptr);
2856        } else
2857                seq_puts(m, "no disconnected commands\n");
2858
2859        get_ports(m, shpnt);
2860
2861#if defined(AHA152X_STAT)
2862        seq_printf(m, "statistics:\n"
2863                "total commands:               %d\n"
2864                "disconnections:               %d\n"
2865                "busfree with check condition: %d\n"
2866                "busfree without old command:  %d\n"
2867                "busfree without new command:  %d\n"
2868                "busfree without done command: %d\n"
2869                "busfree without any action:   %d\n"
2870                "state      "
2871                "transitions  "
2872                "count        "
2873                "time\n",
2874                HOSTDATA(shpnt)->total_commands,
2875                HOSTDATA(shpnt)->disconnections,
2876                HOSTDATA(shpnt)->busfree_with_check_condition,
2877                HOSTDATA(shpnt)->busfree_without_old_command,
2878                HOSTDATA(shpnt)->busfree_without_new_command,
2879                HOSTDATA(shpnt)->busfree_without_done_command,
2880                HOSTDATA(shpnt)->busfree_without_any_action);
2881        for(i=0; i<maxstate; i++) {
2882                seq_printf(m, "%-10s %-12d %-12d %-12ld\n",
2883                        states[i].name,
2884                        HOSTDATA(shpnt)->count_trans[i],
2885                        HOSTDATA(shpnt)->count[i],
2886                        HOSTDATA(shpnt)->time[i]);
2887        }
2888#endif
2889        return 0;
2890}
2891
2892static int aha152x_adjust_queue(struct scsi_device *device)
2893{
2894        blk_queue_bounce_limit(device->request_queue, BLK_BOUNCE_HIGH);
2895        return 0;
2896}
2897
2898static struct scsi_host_template aha152x_driver_template = {
2899        .module                         = THIS_MODULE,
2900        .name                           = AHA152X_REVID,
2901        .proc_name                      = "aha152x",
2902        .show_info                      = aha152x_show_info,
2903        .write_info                     = aha152x_set_info,
2904        .queuecommand                   = aha152x_queue,
2905        .eh_abort_handler               = aha152x_abort,
2906        .eh_device_reset_handler        = aha152x_device_reset,
2907        .eh_bus_reset_handler           = aha152x_bus_reset,
2908        .bios_param                     = aha152x_biosparam,
2909        .can_queue                      = 1,
2910        .this_id                        = 7,
2911        .sg_tablesize                   = SG_ALL,
2912        .dma_boundary                   = PAGE_SIZE - 1,
2913        .slave_alloc                    = aha152x_adjust_queue,
2914};
2915
2916#if !defined(AHA152X_PCMCIA)
2917static int setup_count;
2918static struct aha152x_setup setup[2];
2919
2920/* possible i/o addresses for the AIC-6260; default first */
2921static unsigned short ports[] = { 0x340, 0x140 };
2922
2923#if !defined(SKIP_BIOSTEST)
2924/* possible locations for the Adaptec BIOS; defaults first */
2925static unsigned int addresses[] =
2926{
2927        0xdc000,                /* default first */
2928        0xc8000,
2929        0xcc000,
2930        0xd0000,
2931        0xd4000,
2932        0xd8000,
2933        0xe0000,
2934        0xeb800,                /* VTech Platinum SMP */
2935        0xf0000,
2936};
2937
2938/* signatures for various AIC-6[23]60 based controllers.
2939   The point in detecting signatures is to avoid useless and maybe
2940   harmful probes on ports. I'm not sure that all listed boards pass
2941   auto-configuration. For those which fail the BIOS signature is
2942   obsolete, because user intervention to supply the configuration is
2943   needed anyway.  May be an information whether or not the BIOS supports
2944   extended translation could be also useful here. */
2945static struct signature {
2946        unsigned char *signature;
2947        int sig_offset;
2948        int sig_length;
2949} signatures[] =
2950{
2951        { "Adaptec AHA-1520 BIOS",      0x102e, 21 },
2952                /* Adaptec 152x */
2953        { "Adaptec AHA-1520B",          0x000b, 17 },
2954                /* Adaptec 152x rev B */
2955        { "Adaptec AHA-1520B",          0x0026, 17 },
2956                /* Iomega Jaz Jet ISA (AIC6370Q) */
2957        { "Adaptec ASW-B626 BIOS",      0x1029, 21 },
2958                /* on-board controller */
2959        { "Adaptec BIOS: ASW-B626",     0x000f, 22 },
2960                /* on-board controller */
2961        { "Adaptec ASW-B626 S2",        0x2e6c, 19 },
2962                /* on-board controller */
2963        { "Adaptec BIOS:AIC-6360",      0x000c, 21 },
2964                /* on-board controller */
2965        { "ScsiPro SP-360 BIOS",        0x2873, 19 },
2966                /* ScsiPro-Controller  */
2967        { "GA-400 LOCAL BUS SCSI BIOS", 0x102e, 26 },
2968                /* Gigabyte Local-Bus-SCSI */
2969        { "Adaptec BIOS:AVA-282X",      0x000c, 21 },
2970                /* Adaptec 282x */
2971        { "Adaptec IBM Dock II SCSI",   0x2edd, 24 },
2972                /* IBM Thinkpad Dock II */
2973        { "Adaptec BIOS:AHA-1532P",     0x001c, 22 },
2974                /* IBM Thinkpad Dock II SCSI */
2975        { "DTC3520A Host Adapter BIOS", 0x318a, 26 },
2976                /* DTC 3520A ISA SCSI */
2977};
2978#endif /* !SKIP_BIOSTEST */
2979
2980/*
2981 * Test, if port_base is valid.
2982 *
2983 */
2984static int aha152x_porttest(int io_port)
2985{
2986        int i;
2987
2988        SETPORT(io_port + O_DMACNTRL1, 0);      /* reset stack pointer */
2989        for (i = 0; i < 16; i++)
2990                SETPORT(io_port + O_STACK, i);
2991
2992        SETPORT(io_port + O_DMACNTRL1, 0);      /* reset stack pointer */
2993        for (i = 0; i < 16 && GETPORT(io_port + O_STACK) == i; i++)
2994                ;
2995
2996        return (i == 16);
2997}
2998
2999static int tc1550_porttest(int io_port)
3000{
3001        int i;
3002
3003        SETPORT(io_port + O_TC_DMACNTRL1, 0);   /* reset stack pointer */
3004        for (i = 0; i < 16; i++)
3005                SETPORT(io_port + O_STACK, i);
3006
3007        SETPORT(io_port + O_TC_DMACNTRL1, 0);   /* reset stack pointer */
3008        for (i = 0; i < 16 && GETPORT(io_port + O_TC_STACK) == i; i++)
3009                ;
3010
3011        return (i == 16);
3012}
3013
3014
3015static int checksetup(struct aha152x_setup *setup)
3016{
3017        int i;
3018        for (i = 0; i < ARRAY_SIZE(ports) && (setup->io_port != ports[i]); i++)
3019                ;
3020
3021        if (i == ARRAY_SIZE(ports))
3022                return 0;
3023
3024        if (!request_region(setup->io_port, IO_RANGE, "aha152x")) {
3025                printk(KERN_ERR "aha152x: io port 0x%x busy.\n", setup->io_port);
3026                return 0;
3027        }
3028
3029        if( aha152x_porttest(setup->io_port) ) {
3030                setup->tc1550=0;
3031        } else if( tc1550_porttest(setup->io_port) ) {
3032                setup->tc1550=1;
3033        } else {
3034                release_region(setup->io_port, IO_RANGE);
3035                return 0;
3036        }
3037
3038        release_region(setup->io_port, IO_RANGE);
3039
3040        if ((setup->irq < IRQ_MIN) || (setup->irq > IRQ_MAX))
3041                return 0;
3042
3043        if ((setup->scsiid < 0) || (setup->scsiid > 7))
3044                return 0;
3045
3046        if ((setup->reconnect < 0) || (setup->reconnect > 1))
3047                return 0;
3048
3049        if ((setup->parity < 0) || (setup->parity > 1))
3050                return 0;
3051
3052        if ((setup->synchronous < 0) || (setup->synchronous > 1))
3053                return 0;
3054
3055        if ((setup->ext_trans < 0) || (setup->ext_trans > 1))
3056                return 0;
3057
3058
3059        return 1;
3060}
3061
3062
3063static int __init aha152x_init(void)
3064{
3065        int i, j, ok;
3066#if defined(AUTOCONF)
3067        aha152x_config conf;
3068#endif
3069#ifdef __ISAPNP__
3070        struct pnp_dev *dev=NULL, *pnpdev[2] = {NULL, NULL};
3071#endif
3072
3073        if ( setup_count ) {
3074                printk(KERN_INFO "aha152x: processing commandline: ");
3075
3076                for (i = 0; i<setup_count; i++) {
3077                        if (!checksetup(&setup[i])) {
3078                                printk(KERN_ERR "\naha152x: %s\n", setup[i].conf);
3079                                printk(KERN_ERR "aha152x: invalid line\n");
3080                        }
3081                }
3082                printk("ok\n");
3083        }
3084
3085#if defined(SETUP0)
3086        if (setup_count < ARRAY_SIZE(setup)) {
3087                struct aha152x_setup override = SETUP0;
3088
3089                if (setup_count == 0 || (override.io_port != setup[0].io_port)) {
3090                        if (!checksetup(&override)) {
3091                                printk(KERN_ERR "\naha152x: invalid override SETUP0={0x%x,%d,%d,%d,%d,%d,%d,%d}\n",
3092                                       override.io_port,
3093                                       override.irq,
3094                                       override.scsiid,
3095                                       override.reconnect,
3096                                       override.parity,
3097                                       override.synchronous,
3098                                       override.delay,
3099                                       override.ext_trans);
3100                        } else
3101                                setup[setup_count++] = override;
3102                }
3103        }
3104#endif
3105
3106#if defined(SETUP1)
3107        if (setup_count < ARRAY_SIZE(setup)) {
3108                struct aha152x_setup override = SETUP1;
3109
3110                if (setup_count == 0 || (override.io_port != setup[0].io_port)) {
3111                        if (!checksetup(&override)) {
3112                                printk(KERN_ERR "\naha152x: invalid override SETUP1={0x%x,%d,%d,%d,%d,%d,%d,%d}\n",
3113                                       override.io_port,
3114                                       override.irq,
3115                                       override.scsiid,
3116                                       override.reconnect,
3117                                       override.parity,
3118                                       override.synchronous,
3119                                       override.delay,
3120                                       override.ext_trans);
3121                        } else
3122                                setup[setup_count++] = override;
3123                }
3124        }
3125#endif
3126
3127#if defined(MODULE)
3128        if (setup_count<ARRAY_SIZE(setup) && (aha152x[0]!=0 || io[0]!=0 || irq[0]!=0)) {
3129                if(aha152x[0]!=0) {
3130                        setup[setup_count].conf        = "";
3131                        setup[setup_count].io_port     = aha152x[0];
3132                        setup[setup_count].irq         = aha152x[1];
3133                        setup[setup_count].scsiid      = aha152x[2];
3134                        setup[setup_count].reconnect   = aha152x[3];
3135                        setup[setup_count].parity      = aha152x[4];
3136                        setup[setup_count].synchronous = aha152x[5];
3137                        setup[setup_count].delay       = aha152x[6];
3138                        setup[setup_count].ext_trans   = aha152x[7];
3139                } else if (io[0] != 0 || irq[0] != 0) {
3140                        if(io[0]!=0)  setup[setup_count].io_port = io[0];
3141                        if(irq[0]!=0) setup[setup_count].irq     = irq[0];
3142
3143                        setup[setup_count].scsiid      = scsiid[0];
3144                        setup[setup_count].reconnect   = reconnect[0];
3145                        setup[setup_count].parity      = parity[0];
3146                        setup[setup_count].synchronous = sync[0];
3147                        setup[setup_count].delay       = delay[0];
3148                        setup[setup_count].ext_trans   = exttrans[0];
3149                }
3150
3151                if (checksetup(&setup[setup_count]))
3152                        setup_count++;
3153                else
3154                        printk(KERN_ERR "aha152x: invalid module params io=0x%x, irq=%d,scsiid=%d,reconnect=%d,parity=%d,sync=%d,delay=%d,exttrans=%d\n",
3155                               setup[setup_count].io_port,
3156                               setup[setup_count].irq,
3157                               setup[setup_count].scsiid,
3158                               setup[setup_count].reconnect,
3159                               setup[setup_count].parity,
3160                               setup[setup_count].synchronous,
3161                               setup[setup_count].delay,
3162                               setup[setup_count].ext_trans);
3163        }
3164
3165        if (setup_count<ARRAY_SIZE(setup) && (aha152x1[0]!=0 || io[1]!=0 || irq[1]!=0)) {
3166                if(aha152x1[0]!=0) {
3167                        setup[setup_count].conf        = "";
3168                        setup[setup_count].io_port     = aha152x1[0];
3169                        setup[setup_count].irq         = aha152x1[1];
3170                        setup[setup_count].scsiid      = aha152x1[2];
3171                        setup[setup_count].reconnect   = aha152x1[3];
3172                        setup[setup_count].parity      = aha152x1[4];
3173                        setup[setup_count].synchronous = aha152x1[5];
3174                        setup[setup_count].delay       = aha152x1[6];
3175                        setup[setup_count].ext_trans   = aha152x1[7];
3176                } else if (io[1] != 0 || irq[1] != 0) {
3177                        if(io[1]!=0)  setup[setup_count].io_port = io[1];
3178                        if(irq[1]!=0) setup[setup_count].irq     = irq[1];
3179
3180                        setup[setup_count].scsiid      = scsiid[1];
3181                        setup[setup_count].reconnect   = reconnect[1];
3182                        setup[setup_count].parity      = parity[1];
3183                        setup[setup_count].synchronous = sync[1];
3184                        setup[setup_count].delay       = delay[1];
3185                        setup[setup_count].ext_trans   = exttrans[1];
3186                }
3187                if (checksetup(&setup[setup_count]))
3188                        setup_count++;
3189                else
3190                        printk(KERN_ERR "aha152x: invalid module params io=0x%x, irq=%d,scsiid=%d,reconnect=%d,parity=%d,sync=%d,delay=%d,exttrans=%d\n",
3191                               setup[setup_count].io_port,
3192                               setup[setup_count].irq,
3193                               setup[setup_count].scsiid,
3194                               setup[setup_count].reconnect,
3195                               setup[setup_count].parity,
3196                               setup[setup_count].synchronous,
3197                               setup[setup_count].delay,
3198                               setup[setup_count].ext_trans);
3199        }
3200#endif
3201
3202#ifdef __ISAPNP__
3203        for(i=0; setup_count<ARRAY_SIZE(setup) && id_table[i].vendor; i++) {
3204                while ( setup_count<ARRAY_SIZE(setup) &&
3205                        (dev=pnp_find_dev(NULL, id_table[i].vendor, id_table[i].function, dev)) ) {
3206                        if (pnp_device_attach(dev) < 0)
3207                                continue;
3208
3209                        if (pnp_activate_dev(dev) < 0) {
3210                                pnp_device_detach(dev);
3211                                continue;
3212                        }
3213
3214                        if (!pnp_port_valid(dev, 0)) {
3215                                pnp_device_detach(dev);
3216                                continue;
3217                        }
3218
3219                        if (setup_count==1 && pnp_port_start(dev, 0)==setup[0].io_port) {
3220                                pnp_device_detach(dev);
3221                                continue;
3222                        }
3223
3224                        setup[setup_count].io_port     = pnp_port_start(dev, 0);
3225                        setup[setup_count].irq         = pnp_irq(dev, 0);
3226                        setup[setup_count].scsiid      = 7;
3227                        setup[setup_count].reconnect   = 1;
3228                        setup[setup_count].parity      = 1;
3229                        setup[setup_count].synchronous = 1;
3230                        setup[setup_count].delay       = DELAY_DEFAULT;
3231                        setup[setup_count].ext_trans   = 0;
3232#if defined(__ISAPNP__)
3233                        pnpdev[setup_count]            = dev;
3234#endif
3235                        printk (KERN_INFO
3236                                "aha152x: found ISAPnP adapter at io=0x%03x, irq=%d\n",
3237                                setup[setup_count].io_port, setup[setup_count].irq);
3238                        setup_count++;
3239                }
3240        }
3241#endif
3242
3243#if defined(AUTOCONF)
3244        if (setup_count<ARRAY_SIZE(setup)) {
3245#if !defined(SKIP_BIOSTEST)
3246                ok = 0;
3247                for (i = 0; i < ARRAY_SIZE(addresses) && !ok; i++) {
3248                        void __iomem *p = ioremap(addresses[i], 0x4000);
3249                        if (!p)
3250                                continue;
3251                        for (j = 0; j<ARRAY_SIZE(signatures) && !ok; j++)
3252                                ok = check_signature(p + signatures[j].sig_offset,
3253                                                                signatures[j].signature, signatures[j].sig_length);
3254                        iounmap(p);
3255                }
3256                if (!ok && setup_count == 0)
3257                        return -ENODEV;
3258
3259                printk(KERN_INFO "aha152x: BIOS test: passed, ");
3260#else
3261                printk(KERN_INFO "aha152x: ");
3262#endif                          /* !SKIP_BIOSTEST */
3263
3264                ok = 0;
3265                for (i = 0; i < ARRAY_SIZE(ports) && setup_count < 2; i++) {
3266                        if ((setup_count == 1) && (setup[0].io_port == ports[i]))
3267                                continue;
3268
3269                        if (!request_region(ports[i], IO_RANGE, "aha152x")) {
3270                                printk(KERN_ERR "aha152x: io port 0x%x busy.\n", ports[i]);
3271                                continue;
3272                        }
3273
3274                        if (aha152x_porttest(ports[i])) {
3275                                setup[setup_count].tc1550  = 0;
3276
3277                                conf.cf_port =
3278                                    (GETPORT(ports[i] + O_PORTA) << 8) + GETPORT(ports[i] + O_PORTB);
3279                        } else if (tc1550_porttest(ports[i])) {
3280                                setup[setup_count].tc1550  = 1;
3281
3282                                conf.cf_port =
3283                                    (GETPORT(ports[i] + O_TC_PORTA) << 8) + GETPORT(ports[i] + O_TC_PORTB);
3284                        } else {
3285                                release_region(ports[i], IO_RANGE);
3286                                continue;
3287                        }
3288
3289                        release_region(ports[i], IO_RANGE);
3290
3291                        ok++;
3292                        setup[setup_count].io_port = ports[i];
3293                        setup[setup_count].irq = IRQ_MIN + conf.cf_irq;
3294                        setup[setup_count].scsiid = conf.cf_id;
3295                        setup[setup_count].reconnect = conf.cf_tardisc;
3296                        setup[setup_count].parity = !conf.cf_parity;
3297                        setup[setup_count].synchronous = conf.cf_syncneg;
3298                        setup[setup_count].delay = DELAY_DEFAULT;
3299                        setup[setup_count].ext_trans = 0;
3300                        setup_count++;
3301
3302                }
3303
3304                if (ok)
3305                        printk("auto configuration: ok, ");
3306        }
3307#endif
3308
3309        printk("%d controller(s) configured\n", setup_count);
3310
3311        for (i=0; i<setup_count; i++) {
3312                if ( request_region(setup[i].io_port, IO_RANGE, "aha152x") ) {
3313                        struct Scsi_Host *shpnt = aha152x_probe_one(&setup[i]);
3314
3315                        if( !shpnt ) {
3316                                release_region(setup[i].io_port, IO_RANGE);
3317#if defined(__ISAPNP__)
3318                        } else if( pnpdev[i] ) {
3319                                HOSTDATA(shpnt)->pnpdev=pnpdev[i];
3320                                pnpdev[i]=NULL;
3321#endif
3322                        }
3323                } else {
3324                        printk(KERN_ERR "aha152x: io port 0x%x busy.\n", setup[i].io_port);
3325                }
3326
3327#if defined(__ISAPNP__)
3328                if( pnpdev[i] )
3329                        pnp_device_detach(pnpdev[i]);
3330#endif
3331        }
3332
3333        return 0;
3334}
3335
3336static void __exit aha152x_exit(void)
3337{
3338        struct aha152x_hostdata *hd, *tmp;
3339
3340        list_for_each_entry_safe(hd, tmp, &aha152x_host_list, host_list) {
3341                struct Scsi_Host *shost = container_of((void *)hd, struct Scsi_Host, hostdata);
3342
3343                aha152x_release(shost);
3344        }
3345}
3346
3347module_init(aha152x_init);
3348module_exit(aha152x_exit);
3349
3350#if !defined(MODULE)
3351static int __init aha152x_setup(char *str)
3352{
3353        int ints[10];
3354
3355        get_options(str, ARRAY_SIZE(ints), ints);
3356
3357        if(setup_count>=ARRAY_SIZE(setup)) {
3358                printk(KERN_ERR "aha152x: you can only configure up to two controllers\n");
3359                return 1;
3360        }
3361
3362        setup[setup_count].conf        = str;
3363        setup[setup_count].io_port     = ints[0] >= 1 ? ints[1] : 0x340;
3364        setup[setup_count].irq         = ints[0] >= 2 ? ints[2] : 11;
3365        setup[setup_count].scsiid      = ints[0] >= 3 ? ints[3] : 7;
3366        setup[setup_count].reconnect   = ints[0] >= 4 ? ints[4] : 1;
3367        setup[setup_count].parity      = ints[0] >= 5 ? ints[5] : 1;
3368        setup[setup_count].synchronous = ints[0] >= 6 ? ints[6] : 1;
3369        setup[setup_count].delay       = ints[0] >= 7 ? ints[7] : DELAY_DEFAULT;
3370        setup[setup_count].ext_trans   = ints[0] >= 8 ? ints[8] : 0;
3371        if (ints[0] > 8) {                                                /*}*/
3372                printk(KERN_NOTICE "aha152x: usage: aha152x=<IOBASE>[,<IRQ>[,<SCSI ID>"
3373                       "[,<RECONNECT>[,<PARITY>[,<SYNCHRONOUS>[,<DELAY>[,<EXT_TRANS>]]]]]]]\n");
3374        } else {
3375                setup_count++;
3376                return 0;
3377        }
3378
3379        return 1;
3380}
3381__setup("aha152x=", aha152x_setup);
3382#endif
3383
3384#endif /* !AHA152X_PCMCIA */
3385