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