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