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