PageRenderTime 73ms CodeModel.GetById 18ms app.highlight 44ms RepoModel.GetById 0ms app.codeStats 1ms

/drivers/scsi/aha152x.c

https://bitbucket.org/cyanogenmod/android_kernel_asus_tf300t
C | 3985 lines | 2794 code | 615 blank | 576 comment | 580 complexity | d03cc28137d1cd08fbfbd47e155f6a28 MD5 | raw file
Possible License(s): LGPL-2.0, AGPL-1.0, GPL-2.0

Large files files are truncated, but you can click here to view the full file

   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 <asm/system.h>
 243#include <linux/completion.h>
 244#include <linux/errno.h>
 245#include <linux/string.h>
 246#include <linux/wait.h>
 247#include <linux/ioport.h>
 248#include <linux/delay.h>
 249#include <linux/proc_fs.h>
 250#include <linux/interrupt.h>
 251#include <linux/init.h>
 252#include <linux/kernel.h>
 253#include <linux/isapnp.h>
 254#include <linux/spinlock.h>
 255#include <linux/workqueue.h>
 256#include <linux/list.h>
 257#include <linux/slab.h>
 258#include <scsi/scsicam.h>
 259
 260#include "scsi.h"
 261#include <scsi/scsi_dbg.h>
 262#include <scsi/scsi_host.h>
 263#include <scsi/scsi_transport_spi.h>
 264#include <scsi/scsi_eh.h>
 265#include "aha152x.h"
 266
 267static LIST_HEAD(aha152x_host_list);
 268
 269
 270/* DEFINES */
 271
 272/* For PCMCIA cards, always use AUTOCONF */
 273#if defined(PCMCIA) || defined(MODULE)
 274#if !defined(AUTOCONF)
 275#define AUTOCONF
 276#endif
 277#endif
 278
 279#if !defined(AUTOCONF) && !defined(SETUP0)
 280#error define AUTOCONF or SETUP0
 281#endif
 282
 283#if defined(AHA152X_DEBUG)
 284#define DEBUG_DEFAULT debug_eh
 285
 286#define DPRINTK(when,msgs...) \
 287	do { if(HOSTDATA(shpnt)->debug & (when)) printk(msgs); } while(0)
 288
 289#define DO_LOCK(flags)	\
 290	do { \
 291		if(spin_is_locked(&QLOCK)) { \
 292			DPRINTK(debug_intr, DEBUG_LEAD "(%s:%d) already locked at %s:%d\n", CMDINFO(CURRENT_SC), __func__, __LINE__, QLOCKER, QLOCKERL); \
 293		} \
 294		DPRINTK(debug_locking, DEBUG_LEAD "(%s:%d) locking\n", CMDINFO(CURRENT_SC), __func__, __LINE__); \
 295		spin_lock_irqsave(&QLOCK,flags); \
 296		DPRINTK(debug_locking, DEBUG_LEAD "(%s:%d) locked\n", CMDINFO(CURRENT_SC), __func__, __LINE__); \
 297		QLOCKER=__func__; \
 298		QLOCKERL=__LINE__; \
 299	} while(0)
 300
 301#define DO_UNLOCK(flags)	\
 302	do { \
 303		DPRINTK(debug_locking, DEBUG_LEAD "(%s:%d) unlocking (locked at %s:%d)\n", CMDINFO(CURRENT_SC), __func__, __LINE__, QLOCKER, QLOCKERL); \
 304		spin_unlock_irqrestore(&QLOCK,flags); \
 305		DPRINTK(debug_locking, DEBUG_LEAD "(%s:%d) unlocked\n", CMDINFO(CURRENT_SC), __func__, __LINE__); \
 306		QLOCKER="(not locked)"; \
 307		QLOCKERL=0; \
 308	} while(0)
 309
 310#else
 311#define DPRINTK(when,msgs...)
 312#define	DO_LOCK(flags)		spin_lock_irqsave(&QLOCK,flags)
 313#define	DO_UNLOCK(flags)	spin_unlock_irqrestore(&QLOCK,flags)
 314#endif
 315
 316#define LEAD		"(scsi%d:%d:%d) "
 317#define WARN_LEAD	KERN_WARNING	LEAD
 318#define INFO_LEAD	KERN_INFO	LEAD
 319#define NOTE_LEAD	KERN_NOTICE	LEAD
 320#define ERR_LEAD	KERN_ERR	LEAD
 321#define DEBUG_LEAD	KERN_DEBUG	LEAD
 322#define CMDINFO(cmd) \
 323			(cmd) ? ((cmd)->device->host->host_no) : -1, \
 324                        (cmd) ? ((cmd)->device->id & 0x0f) : -1, \
 325			(cmd) ? ((cmd)->device->lun & 0x07) : -1
 326
 327static inline void
 328CMD_INC_RESID(struct scsi_cmnd *cmd, int inc)
 329{
 330	scsi_set_resid(cmd, scsi_get_resid(cmd) + inc);
 331}
 332
 333#define DELAY_DEFAULT 1000
 334
 335#if defined(PCMCIA)
 336#define IRQ_MIN 0
 337#define IRQ_MAX 16
 338#else
 339#define IRQ_MIN 9
 340#if defined(__PPC)
 341#define IRQ_MAX (nr_irqs-1)
 342#else
 343#define IRQ_MAX 12
 344#endif
 345#endif
 346
 347enum {
 348	not_issued	= 0x0001,	/* command not yet issued */
 349	selecting	= 0x0002, 	/* target is beeing selected */
 350	identified	= 0x0004,	/* IDENTIFY was sent */
 351	disconnected	= 0x0008,	/* target disconnected */
 352	completed	= 0x0010,	/* target sent COMMAND COMPLETE */ 
 353	aborted		= 0x0020,	/* ABORT was sent */
 354	resetted	= 0x0040,	/* BUS DEVICE RESET was sent */
 355	spiordy		= 0x0080,	/* waiting for SPIORDY to raise */
 356	syncneg		= 0x0100,	/* synchronous negotiation in progress */
 357	aborting	= 0x0200,	/* ABORT is pending */
 358	resetting	= 0x0400,	/* BUS DEVICE RESET is pending */
 359	check_condition = 0x0800,	/* requesting sense after CHECK CONDITION */
 360};
 361
 362MODULE_AUTHOR("Jürgen Fischer");
 363MODULE_DESCRIPTION(AHA152X_REVID);
 364MODULE_LICENSE("GPL");
 365
 366#if !defined(PCMCIA)
 367#if defined(MODULE)
 368static int io[] = {0, 0};
 369module_param_array(io, int, NULL, 0);
 370MODULE_PARM_DESC(io,"base io address of controller");
 371
 372static int irq[] = {0, 0};
 373module_param_array(irq, int, NULL, 0);
 374MODULE_PARM_DESC(irq,"interrupt for controller");
 375
 376static int scsiid[] = {7, 7};
 377module_param_array(scsiid, int, NULL, 0);
 378MODULE_PARM_DESC(scsiid,"scsi id of controller");
 379
 380static int reconnect[] = {1, 1};
 381module_param_array(reconnect, int, NULL, 0);
 382MODULE_PARM_DESC(reconnect,"allow targets to disconnect");
 383
 384static int parity[] = {1, 1};
 385module_param_array(parity, int, NULL, 0);
 386MODULE_PARM_DESC(parity,"use scsi parity");
 387
 388static int sync[] = {1, 1};
 389module_param_array(sync, int, NULL, 0);
 390MODULE_PARM_DESC(sync,"use synchronous transfers");
 391
 392static int delay[] = {DELAY_DEFAULT, DELAY_DEFAULT};
 393module_param_array(delay, int, NULL, 0);
 394MODULE_PARM_DESC(delay,"scsi reset delay");
 395
 396static int exttrans[] = {0, 0};
 397module_param_array(exttrans, int, NULL, 0);
 398MODULE_PARM_DESC(exttrans,"use extended translation");
 399
 400#if !defined(AHA152X_DEBUG)
 401static int aha152x[] = {0, 11, 7, 1, 1, 0, DELAY_DEFAULT, 0};
 402module_param_array(aha152x, int, NULL, 0);
 403MODULE_PARM_DESC(aha152x, "parameters for first controller");
 404
 405static int aha152x1[] = {0, 11, 7, 1, 1, 0, DELAY_DEFAULT, 0};
 406module_param_array(aha152x1, int, NULL, 0);
 407MODULE_PARM_DESC(aha152x1, "parameters for second controller");
 408#else
 409static int debug[] = {DEBUG_DEFAULT, DEBUG_DEFAULT};
 410module_param_array(debug, int, NULL, 0);
 411MODULE_PARM_DESC(debug, "flags for driver debugging");
 412
 413static int aha152x[]   = {0, 11, 7, 1, 1, 1, DELAY_DEFAULT, 0, DEBUG_DEFAULT};
 414module_param_array(aha152x, int, NULL, 0);
 415MODULE_PARM_DESC(aha152x, "parameters for first controller");
 416
 417static int aha152x1[]  = {0, 11, 7, 1, 1, 1, DELAY_DEFAULT, 0, DEBUG_DEFAULT};
 418module_param_array(aha152x1, int, NULL, 0);
 419MODULE_PARM_DESC(aha152x1, "parameters for second controller");
 420#endif /* !defined(AHA152X_DEBUG) */
 421#endif /* MODULE */
 422
 423#ifdef __ISAPNP__
 424static struct isapnp_device_id id_table[] __devinitdata = {
 425	{ ISAPNP_ANY_ID, ISAPNP_ANY_ID,	ISAPNP_VENDOR('A', 'D', 'P'), ISAPNP_FUNCTION(0x1502), 0 },
 426	{ ISAPNP_ANY_ID, ISAPNP_ANY_ID,	ISAPNP_VENDOR('A', 'D', 'P'), ISAPNP_FUNCTION(0x1505), 0 },
 427	{ ISAPNP_ANY_ID, ISAPNP_ANY_ID,	ISAPNP_VENDOR('A', 'D', 'P'), ISAPNP_FUNCTION(0x1510), 0 },
 428	{ ISAPNP_ANY_ID, ISAPNP_ANY_ID,	ISAPNP_VENDOR('A', 'D', 'P'), ISAPNP_FUNCTION(0x1515), 0 },
 429	{ ISAPNP_ANY_ID, ISAPNP_ANY_ID,	ISAPNP_VENDOR('A', 'D', 'P'), ISAPNP_FUNCTION(0x1520), 0 },
 430	{ ISAPNP_ANY_ID, ISAPNP_ANY_ID,	ISAPNP_VENDOR('A', 'D', 'P'), ISAPNP_FUNCTION(0x2015), 0 },
 431	{ ISAPNP_ANY_ID, ISAPNP_ANY_ID,	ISAPNP_VENDOR('A', 'D', 'P'), ISAPNP_FUNCTION(0x1522), 0 },
 432	{ ISAPNP_ANY_ID, ISAPNP_ANY_ID,	ISAPNP_VENDOR('A', 'D', 'P'), ISAPNP_FUNCTION(0x2215), 0 },
 433	{ ISAPNP_ANY_ID, ISAPNP_ANY_ID,	ISAPNP_VENDOR('A', 'D', 'P'), ISAPNP_FUNCTION(0x1530), 0 },
 434	{ ISAPNP_ANY_ID, ISAPNP_ANY_ID,	ISAPNP_VENDOR('A', 'D', 'P'), ISAPNP_FUNCTION(0x3015), 0 },
 435	{ ISAPNP_ANY_ID, ISAPNP_ANY_ID,	ISAPNP_VENDOR('A', 'D', 'P'), ISAPNP_FUNCTION(0x1532), 0 },
 436	{ ISAPNP_ANY_ID, ISAPNP_ANY_ID,	ISAPNP_VENDOR('A', 'D', 'P'), ISAPNP_FUNCTION(0x3215), 0 },
 437	{ ISAPNP_ANY_ID, ISAPNP_ANY_ID,	ISAPNP_VENDOR('A', 'D', 'P'), ISAPNP_FUNCTION(0x6360), 0 },
 438	{ ISAPNP_DEVICE_SINGLE_END, }
 439};
 440MODULE_DEVICE_TABLE(isapnp, id_table);
 441#endif /* ISAPNP */
 442
 443#endif /* !PCMCIA */
 444
 445static struct scsi_host_template aha152x_driver_template;
 446
 447/*
 448 * internal states of the host
 449 *
 450 */ 
 451enum aha152x_state {
 452	idle=0,
 453	unknown,
 454	seldo,
 455	seldi,
 456	selto,
 457	busfree,
 458	msgo,
 459	cmd,
 460	msgi,
 461	status,
 462	datai,
 463	datao,
 464	parerr,
 465	rsti,
 466	maxstate
 467};
 468
 469/*
 470 * current state information of the host
 471 *
 472 */
 473struct aha152x_hostdata {
 474	Scsi_Cmnd *issue_SC;
 475		/* pending commands to issue */
 476
 477	Scsi_Cmnd *current_SC;
 478		/* current command on the bus */
 479
 480	Scsi_Cmnd *disconnected_SC;
 481		/* commands that disconnected */
 482
 483	Scsi_Cmnd *done_SC;
 484		/* command that was completed */
 485
 486	spinlock_t lock;
 487		/* host lock */
 488
 489#if defined(AHA152X_DEBUG)
 490	const char *locker;
 491		/* which function has the lock */
 492	int lockerl;	/* where did it get it */
 493
 494	int debug;	/* current debugging setting */
 495#endif
 496
 497#if defined(AHA152X_STAT)
 498	int           total_commands;
 499	int	      disconnections;
 500	int	      busfree_without_any_action;
 501	int	      busfree_without_old_command;
 502	int	      busfree_without_new_command;
 503	int	      busfree_without_done_command;
 504	int	      busfree_with_check_condition;
 505	int           count[maxstate];
 506	int           count_trans[maxstate];
 507	unsigned long time[maxstate];
 508#endif
 509
 510	int commands;		/* current number of commands */
 511
 512	int reconnect;		/* disconnection allowed */
 513	int parity;		/* parity checking enabled */
 514	int synchronous;	/* synchronous transferes enabled */
 515	int delay;		/* reset out delay */
 516	int ext_trans;		/* extended translation enabled */
 517
 518	int swint; 		/* software-interrupt was fired during detect() */
 519	int service;		/* bh needs to be run */
 520	int in_intr;		/* bh is running */
 521
 522	/* current state,
 523	   previous state,
 524	   last state different from current state */
 525	enum aha152x_state state, prevstate, laststate;
 526
 527	int target;
 528		/* reconnecting target */
 529
 530	unsigned char syncrate[8];
 531		/* current synchronous transfer agreements */
 532
 533	unsigned char syncneg[8];
 534		/* 0: no negotiation;
 535		 * 1: negotiation in progress;
 536		 * 2: negotiation completed
 537		 */
 538
 539	int cmd_i;
 540		/* number of sent bytes of current command */
 541
 542	int msgi_len;
 543		/* number of received message bytes */
 544	unsigned char msgi[256];
 545		/* received message bytes */
 546
 547	int msgo_i, msgo_len;	
 548		/* number of sent bytes and length of current messages */
 549	unsigned char msgo[256];
 550		/* pending messages */
 551
 552	int data_len;
 553		/* number of sent/received bytes in dataphase */
 554
 555	unsigned long io_port0;
 556	unsigned long io_port1;
 557
 558#ifdef __ISAPNP__
 559	struct pnp_dev *pnpdev;
 560#endif
 561	struct list_head host_list;
 562};
 563
 564
 565/*
 566 * host specific command extension
 567 *
 568 */
 569struct aha152x_scdata {
 570	Scsi_Cmnd *next;	/* next sc in queue */
 571	struct completion *done;/* semaphore to block on */
 572	struct scsi_eh_save ses;
 573};
 574
 575/* access macros for hostdata */
 576
 577#define HOSTDATA(shpnt)		((struct aha152x_hostdata *) &shpnt->hostdata)
 578
 579#define HOSTNO			((shpnt)->host_no)
 580
 581#define CURRENT_SC		(HOSTDATA(shpnt)->current_SC)
 582#define DONE_SC			(HOSTDATA(shpnt)->done_SC)
 583#define ISSUE_SC		(HOSTDATA(shpnt)->issue_SC)
 584#define DISCONNECTED_SC		(HOSTDATA(shpnt)->disconnected_SC)
 585#define QLOCK			(HOSTDATA(shpnt)->lock)
 586#define QLOCKER			(HOSTDATA(shpnt)->locker)
 587#define QLOCKERL		(HOSTDATA(shpnt)->lockerl)
 588
 589#define STATE			(HOSTDATA(shpnt)->state)
 590#define PREVSTATE		(HOSTDATA(shpnt)->prevstate)
 591#define LASTSTATE		(HOSTDATA(shpnt)->laststate)
 592
 593#define RECONN_TARGET		(HOSTDATA(shpnt)->target)
 594
 595#define CMD_I			(HOSTDATA(shpnt)->cmd_i)
 596
 597#define MSGO(i)			(HOSTDATA(shpnt)->msgo[i])
 598#define MSGO_I			(HOSTDATA(shpnt)->msgo_i)
 599#define MSGOLEN			(HOSTDATA(shpnt)->msgo_len)
 600#define ADDMSGO(x)		(MSGOLEN<256 ? (void)(MSGO(MSGOLEN++)=x) : aha152x_error(shpnt,"MSGO overflow"))
 601
 602#define MSGI(i)			(HOSTDATA(shpnt)->msgi[i])
 603#define MSGILEN			(HOSTDATA(shpnt)->msgi_len)
 604#define ADDMSGI(x)		(MSGILEN<256 ? (void)(MSGI(MSGILEN++)=x) : aha152x_error(shpnt,"MSGI overflow"))
 605
 606#define DATA_LEN		(HOSTDATA(shpnt)->data_len)
 607
 608#define SYNCRATE		(HOSTDATA(shpnt)->syncrate[CURRENT_SC->device->id])
 609#define SYNCNEG			(HOSTDATA(shpnt)->syncneg[CURRENT_SC->device->id])
 610
 611#define DELAY			(HOSTDATA(shpnt)->delay)
 612#define EXT_TRANS		(HOSTDATA(shpnt)->ext_trans)
 613#define TC1550			(HOSTDATA(shpnt)->tc1550)
 614#define RECONNECT		(HOSTDATA(shpnt)->reconnect)
 615#define PARITY			(HOSTDATA(shpnt)->parity)
 616#define SYNCHRONOUS		(HOSTDATA(shpnt)->synchronous)
 617
 618#define HOSTIOPORT0		(HOSTDATA(shpnt)->io_port0)
 619#define HOSTIOPORT1		(HOSTDATA(shpnt)->io_port1)
 620
 621#define SCDATA(SCpnt)		((struct aha152x_scdata *) (SCpnt)->host_scribble)
 622#define SCNEXT(SCpnt)		SCDATA(SCpnt)->next
 623#define SCSEM(SCpnt)		SCDATA(SCpnt)->done
 624
 625#define SG_ADDRESS(buffer)	((char *) sg_virt((buffer)))
 626
 627/* state handling */
 628static void seldi_run(struct Scsi_Host *shpnt);
 629static void seldo_run(struct Scsi_Host *shpnt);
 630static void selto_run(struct Scsi_Host *shpnt);
 631static void busfree_run(struct Scsi_Host *shpnt);
 632
 633static void msgo_init(struct Scsi_Host *shpnt);
 634static void msgo_run(struct Scsi_Host *shpnt);
 635static void msgo_end(struct Scsi_Host *shpnt);
 636
 637static void cmd_init(struct Scsi_Host *shpnt);
 638static void cmd_run(struct Scsi_Host *shpnt);
 639static void cmd_end(struct Scsi_Host *shpnt);
 640
 641static void datai_init(struct Scsi_Host *shpnt);
 642static void datai_run(struct Scsi_Host *shpnt);
 643static void datai_end(struct Scsi_Host *shpnt);
 644
 645static void datao_init(struct Scsi_Host *shpnt);
 646static void datao_run(struct Scsi_Host *shpnt);
 647static void datao_end(struct Scsi_Host *shpnt);
 648
 649static void status_run(struct Scsi_Host *shpnt);
 650
 651static void msgi_run(struct Scsi_Host *shpnt);
 652static void msgi_end(struct Scsi_Host *shpnt);
 653
 654static void parerr_run(struct Scsi_Host *shpnt);
 655static void rsti_run(struct Scsi_Host *shpnt);
 656
 657static void is_complete(struct Scsi_Host *shpnt);
 658
 659/*
 660 * driver states
 661 *
 662 */
 663static struct {
 664	char		*name;
 665	void		(*init)(struct Scsi_Host *);
 666	void		(*run)(struct Scsi_Host *);
 667	void		(*end)(struct Scsi_Host *);
 668	int		spio;
 669} states[] = {
 670	{ "idle",	NULL,		NULL,		NULL,		0},
 671	{ "unknown",	NULL,		NULL,		NULL,		0},
 672	{ "seldo",	NULL,		seldo_run,	NULL,		0},
 673	{ "seldi",	NULL,		seldi_run,	NULL,		0},
 674	{ "selto",	NULL,		selto_run,	NULL,		0},
 675	{ "busfree",	NULL,		busfree_run,	NULL,		0},
 676	{ "msgo",	msgo_init,	msgo_run,	msgo_end,	1},
 677	{ "cmd",	cmd_init,	cmd_run,	cmd_end,	1},
 678	{ "msgi",	NULL,		msgi_run,	msgi_end,	1},
 679	{ "status",	NULL,		status_run,	NULL,		1},
 680	{ "datai",	datai_init,	datai_run,	datai_end,	0},
 681	{ "datao",	datao_init,	datao_run,	datao_end,	0},
 682	{ "parerr",	NULL,		parerr_run,	NULL,		0},
 683	{ "rsti",	NULL,		rsti_run,	NULL,		0},
 684};
 685
 686/* setup & interrupt */
 687static irqreturn_t intr(int irq, void *dev_id);
 688static void reset_ports(struct Scsi_Host *shpnt);
 689static void aha152x_error(struct Scsi_Host *shpnt, char *msg);
 690static void done(struct Scsi_Host *shpnt, int error);
 691
 692/* diagnostics */
 693static void disp_ports(struct Scsi_Host *shpnt);
 694static void show_command(Scsi_Cmnd * ptr);
 695static void show_queues(struct Scsi_Host *shpnt);
 696static void disp_enintr(struct Scsi_Host *shpnt);
 697
 698
 699/*
 700 *  queue services:
 701 *
 702 */
 703static inline void append_SC(Scsi_Cmnd **SC, Scsi_Cmnd *new_SC)
 704{
 705	Scsi_Cmnd *end;
 706
 707	SCNEXT(new_SC) = NULL;
 708	if (!*SC)
 709		*SC = new_SC;
 710	else {
 711		for (end = *SC; SCNEXT(end); end = SCNEXT(end))
 712			;
 713		SCNEXT(end) = new_SC;
 714	}
 715}
 716
 717static inline Scsi_Cmnd *remove_first_SC(Scsi_Cmnd ** SC)
 718{
 719	Scsi_Cmnd *ptr;
 720
 721	ptr = *SC;
 722	if (ptr) {
 723		*SC = SCNEXT(*SC);
 724		SCNEXT(ptr)=NULL;
 725	}
 726	return ptr;
 727}
 728
 729static inline Scsi_Cmnd *remove_lun_SC(Scsi_Cmnd ** SC, int target, int lun)
 730{
 731	Scsi_Cmnd *ptr, *prev;
 732
 733	for (ptr = *SC, prev = NULL;
 734	     ptr && ((ptr->device->id != target) || (ptr->device->lun != lun));
 735	     prev = ptr, ptr = SCNEXT(ptr))
 736	     ;
 737
 738	if (ptr) {
 739		if (prev)
 740			SCNEXT(prev) = SCNEXT(ptr);
 741		else
 742			*SC = SCNEXT(ptr);
 743
 744		SCNEXT(ptr)=NULL;
 745	}
 746
 747	return ptr;
 748}
 749
 750static inline Scsi_Cmnd *remove_SC(Scsi_Cmnd **SC, Scsi_Cmnd *SCp)
 751{
 752	Scsi_Cmnd *ptr, *prev;
 753
 754	for (ptr = *SC, prev = NULL;
 755	     ptr && SCp!=ptr;
 756	     prev = ptr, ptr = SCNEXT(ptr))
 757	     ;
 758
 759	if (ptr) {
 760		if (prev)
 761			SCNEXT(prev) = SCNEXT(ptr);
 762		else
 763			*SC = SCNEXT(ptr);
 764
 765		SCNEXT(ptr)=NULL;
 766	}
 767
 768	return ptr;
 769}
 770
 771static irqreturn_t swintr(int irqno, void *dev_id)
 772{
 773	struct Scsi_Host *shpnt = dev_id;
 774
 775	HOSTDATA(shpnt)->swint++;
 776
 777	SETPORT(DMACNTRL0, INTEN);
 778	return IRQ_HANDLED;
 779}
 780
 781struct Scsi_Host *aha152x_probe_one(struct aha152x_setup *setup)
 782{
 783	struct Scsi_Host *shpnt;
 784
 785	shpnt = scsi_host_alloc(&aha152x_driver_template, sizeof(struct aha152x_hostdata));
 786	if (!shpnt) {
 787		printk(KERN_ERR "aha152x: scsi_host_alloc failed\n");
 788		return NULL;
 789	}
 790
 791	memset(HOSTDATA(shpnt), 0, sizeof *HOSTDATA(shpnt));
 792	INIT_LIST_HEAD(&HOSTDATA(shpnt)->host_list);
 793
 794	/* need to have host registered before triggering any interrupt */
 795	list_add_tail(&HOSTDATA(shpnt)->host_list, &aha152x_host_list);
 796
 797	shpnt->io_port   = setup->io_port;
 798	shpnt->n_io_port = IO_RANGE;
 799	shpnt->irq       = setup->irq;
 800
 801	if (!setup->tc1550) {
 802		HOSTIOPORT0 = setup->io_port;
 803		HOSTIOPORT1 = setup->io_port;
 804	} else {
 805		HOSTIOPORT0 = setup->io_port+0x10;
 806		HOSTIOPORT1 = setup->io_port-0x10;
 807	}
 808
 809	spin_lock_init(&QLOCK);
 810	RECONNECT   = setup->reconnect;
 811	SYNCHRONOUS = setup->synchronous;
 812	PARITY      = setup->parity;
 813	DELAY       = setup->delay;
 814	EXT_TRANS   = setup->ext_trans;
 815
 816#if defined(AHA152X_DEBUG)
 817	HOSTDATA(shpnt)->debug = setup->debug;
 818#endif
 819
 820	SETPORT(SCSIID, setup->scsiid << 4);
 821	shpnt->this_id = setup->scsiid;
 822
 823	if (setup->reconnect)
 824		shpnt->can_queue = AHA152X_MAXQUEUE;
 825
 826	/* RESET OUT */
 827	printk("aha152x: resetting bus...\n");
 828	SETPORT(SCSISEQ, SCSIRSTO);
 829	mdelay(256);
 830	SETPORT(SCSISEQ, 0);
 831	mdelay(DELAY);
 832
 833	reset_ports(shpnt);
 834
 835	printk(KERN_INFO
 836	       "aha152x%d%s: "
 837	       "vital data: rev=%x, "
 838	       "io=0x%03lx (0x%03lx/0x%03lx), "
 839	       "irq=%d, "
 840	       "scsiid=%d, "
 841	       "reconnect=%s, "
 842	       "parity=%s, "
 843	       "synchronous=%s, "
 844	       "delay=%d, "
 845	       "extended translation=%s\n",
 846	       shpnt->host_no, setup->tc1550 ? " (tc1550 mode)" : "",
 847	       GETPORT(REV) & 0x7,
 848	       shpnt->io_port, HOSTIOPORT0, HOSTIOPORT1,
 849	       shpnt->irq,
 850	       shpnt->this_id,
 851	       RECONNECT ? "enabled" : "disabled",
 852	       PARITY ? "enabled" : "disabled",
 853	       SYNCHRONOUS ? "enabled" : "disabled",
 854	       DELAY,
 855	       EXT_TRANS ? "enabled" : "disabled");
 856
 857	/* not expecting any interrupts */
 858	SETPORT(SIMODE0, 0);
 859	SETPORT(SIMODE1, 0);
 860
 861	if( request_irq(shpnt->irq, swintr, IRQF_DISABLED|IRQF_SHARED, "aha152x", shpnt) ) {
 862		printk(KERN_ERR "aha152x%d: irq %d busy.\n", shpnt->host_no, shpnt->irq);
 863		goto out_host_put;
 864	}
 865
 866	HOSTDATA(shpnt)->swint = 0;
 867
 868	printk(KERN_INFO "aha152x%d: trying software interrupt, ", shpnt->host_no);
 869
 870	mb();
 871	SETPORT(DMACNTRL0, SWINT|INTEN);
 872	mdelay(1000);
 873	free_irq(shpnt->irq, shpnt);
 874
 875	if (!HOSTDATA(shpnt)->swint) {
 876		if (TESTHI(DMASTAT, INTSTAT)) {
 877			printk("lost.\n");
 878		} else {
 879			printk("failed.\n");
 880		}
 881
 882		SETPORT(DMACNTRL0, INTEN);
 883
 884		printk(KERN_ERR "aha152x%d: irq %d possibly wrong.  "
 885				"Please verify.\n", shpnt->host_no, shpnt->irq);
 886		goto out_host_put;
 887	}
 888	printk("ok.\n");
 889
 890
 891	/* clear interrupts */
 892	SETPORT(SSTAT0, 0x7f);
 893	SETPORT(SSTAT1, 0xef);
 894
 895	if ( request_irq(shpnt->irq, intr, IRQF_DISABLED|IRQF_SHARED, "aha152x", shpnt) ) {
 896		printk(KERN_ERR "aha152x%d: failed to reassign irq %d.\n", shpnt->host_no, shpnt->irq);
 897		goto out_host_put;
 898	}
 899
 900	if( scsi_add_host(shpnt, NULL) ) {
 901		free_irq(shpnt->irq, shpnt);
 902		printk(KERN_ERR "aha152x%d: failed to add host.\n", shpnt->host_no);
 903		goto out_host_put;
 904	}
 905
 906	scsi_scan_host(shpnt);
 907
 908	return shpnt;
 909
 910out_host_put:
 911	list_del(&HOSTDATA(shpnt)->host_list);
 912	scsi_host_put(shpnt);
 913
 914	return NULL;
 915}
 916
 917void aha152x_release(struct Scsi_Host *shpnt)
 918{
 919	if (!shpnt)
 920		return;
 921
 922	scsi_remove_host(shpnt);
 923	if (shpnt->irq)
 924		free_irq(shpnt->irq, shpnt);
 925
 926#if !defined(PCMCIA)
 927	if (shpnt->io_port)
 928		release_region(shpnt->io_port, IO_RANGE);
 929#endif
 930
 931#ifdef __ISAPNP__
 932	if (HOSTDATA(shpnt)->pnpdev)
 933		pnp_device_detach(HOSTDATA(shpnt)->pnpdev);
 934#endif
 935
 936	list_del(&HOSTDATA(shpnt)->host_list);
 937	scsi_host_put(shpnt);
 938}
 939
 940
 941/*
 942 * setup controller to generate interrupts depending
 943 * on current state (lock has to be acquired)
 944 *
 945 */ 
 946static int setup_expected_interrupts(struct Scsi_Host *shpnt)
 947{
 948	if(CURRENT_SC) {
 949		CURRENT_SC->SCp.phase |= 1 << 16;
 950	
 951		if(CURRENT_SC->SCp.phase & selecting) {
 952			DPRINTK(debug_intr, DEBUG_LEAD "expecting: (seldo) (seltimo) (seldi)\n", CMDINFO(CURRENT_SC));
 953			SETPORT(SSTAT1, SELTO);
 954			SETPORT(SIMODE0, ENSELDO | (DISCONNECTED_SC ? ENSELDI : 0));
 955			SETPORT(SIMODE1, ENSELTIMO);
 956		} else {
 957			DPRINTK(debug_intr, DEBUG_LEAD "expecting: (phase change) (busfree) %s\n", CMDINFO(CURRENT_SC), CURRENT_SC->SCp.phase & spiordy ? "(spiordy)" : "");
 958			SETPORT(SIMODE0, (CURRENT_SC->SCp.phase & spiordy) ? ENSPIORDY : 0);
 959			SETPORT(SIMODE1, ENPHASEMIS | ENSCSIRST | ENSCSIPERR | ENBUSFREE); 
 960		}
 961	} else if(STATE==seldi) {
 962		DPRINTK(debug_intr, DEBUG_LEAD "expecting: (phase change) (identify)\n", CMDINFO(CURRENT_SC));
 963		SETPORT(SIMODE0, 0);
 964		SETPORT(SIMODE1, ENPHASEMIS | ENSCSIRST | ENSCSIPERR | ENBUSFREE); 
 965	} else {
 966		DPRINTK(debug_intr, DEBUG_LEAD "expecting: %s %s\n",
 967			CMDINFO(CURRENT_SC),
 968			DISCONNECTED_SC ? "(reselection)" : "",
 969			ISSUE_SC ? "(busfree)" : "");
 970		SETPORT(SIMODE0, DISCONNECTED_SC ? ENSELDI : 0);
 971		SETPORT(SIMODE1, ENSCSIRST | ( (ISSUE_SC||DONE_SC) ? ENBUSFREE : 0));
 972	}
 973
 974	if(!HOSTDATA(shpnt)->in_intr)
 975		SETBITS(DMACNTRL0, INTEN);
 976
 977	return TESTHI(DMASTAT, INTSTAT);
 978}
 979
 980
 981/* 
 982 *  Queue a command and setup interrupts for a free bus.
 983 */
 984static int aha152x_internal_queue(Scsi_Cmnd *SCpnt, struct completion *complete,
 985		int phase, void (*done)(Scsi_Cmnd *))
 986{
 987	struct Scsi_Host *shpnt = SCpnt->device->host;
 988	unsigned long flags;
 989
 990#if defined(AHA152X_DEBUG)
 991	if (HOSTDATA(shpnt)->debug & debug_queue) {
 992		printk(INFO_LEAD "queue: %p; cmd_len=%d pieces=%d size=%u cmnd=",
 993		       CMDINFO(SCpnt), SCpnt, SCpnt->cmd_len,
 994		       scsi_sg_count(SCpnt), scsi_bufflen(SCpnt));
 995		__scsi_print_command(SCpnt->cmnd);
 996	}
 997#endif
 998
 999	SCpnt->scsi_done	= done;
1000	SCpnt->SCp.phase	= not_issued | phase;
1001	SCpnt->SCp.Status	= 0x1; /* Ilegal status by SCSI standard */
1002	SCpnt->SCp.Message	= 0;
1003	SCpnt->SCp.have_data_in	= 0;
1004	SCpnt->SCp.sent_command	= 0;
1005
1006	if(SCpnt->SCp.phase & (resetting|check_condition)) {
1007		if (!SCpnt->host_scribble || SCSEM(SCpnt) || SCNEXT(SCpnt)) {
1008			printk(ERR_LEAD "cannot reuse command\n", CMDINFO(SCpnt));
1009			return FAILED;
1010		}
1011	} else {
1012		SCpnt->host_scribble = kmalloc(sizeof(struct aha152x_scdata), GFP_ATOMIC);
1013		if(!SCpnt->host_scribble) {
1014			printk(ERR_LEAD "allocation failed\n", CMDINFO(SCpnt));
1015			return FAILED;
1016		}
1017	}
1018
1019	SCNEXT(SCpnt)		= NULL;
1020	SCSEM(SCpnt)		= complete;
1021
1022	/* setup scratch area
1023	   SCp.ptr              : buffer pointer
1024	   SCp.this_residual    : buffer length
1025	   SCp.buffer           : next buffer
1026	   SCp.buffers_residual : left buffers in list
1027	   SCp.phase            : current state of the command */
1028
1029	if ((phase & resetting) || !scsi_sglist(SCpnt)) {
1030		SCpnt->SCp.ptr           = NULL;
1031		SCpnt->SCp.this_residual = 0;
1032		scsi_set_resid(SCpnt, 0);
1033		SCpnt->SCp.buffer           = NULL;
1034		SCpnt->SCp.buffers_residual = 0;
1035	} else {
1036		scsi_set_resid(SCpnt, scsi_bufflen(SCpnt));
1037		SCpnt->SCp.buffer           = scsi_sglist(SCpnt);
1038		SCpnt->SCp.ptr              = SG_ADDRESS(SCpnt->SCp.buffer);
1039		SCpnt->SCp.this_residual    = SCpnt->SCp.buffer->length;
1040		SCpnt->SCp.buffers_residual = scsi_sg_count(SCpnt) - 1;
1041	}
1042
1043	DO_LOCK(flags);
1044
1045#if defined(AHA152X_STAT)
1046	HOSTDATA(shpnt)->total_commands++;
1047#endif
1048
1049	/* Turn led on, when this is the first command. */
1050	HOSTDATA(shpnt)->commands++;
1051	if (HOSTDATA(shpnt)->commands==1)
1052		SETPORT(PORTA, 1);
1053
1054	append_SC(&ISSUE_SC, SCpnt);
1055
1056	if(!HOSTDATA(shpnt)->in_intr)
1057		setup_expected_interrupts(shpnt);
1058
1059	DO_UNLOCK(flags);
1060
1061	return 0;
1062}
1063
1064/*
1065 *  queue a command
1066 *
1067 */
1068static int aha152x_queue_lck(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *))
1069{
1070#if 0
1071	if(*SCpnt->cmnd == REQUEST_SENSE) {
1072		SCpnt->result = 0;
1073		done(SCpnt);
1074
1075		return 0;
1076	}
1077#endif
1078
1079	return aha152x_internal_queue(SCpnt, NULL, 0, done);
1080}
1081
1082static DEF_SCSI_QCMD(aha152x_queue)
1083
1084
1085/*
1086 *  
1087 *
1088 */
1089static void reset_done(Scsi_Cmnd *SCpnt)
1090{
1091#if 0
1092	struct Scsi_Host *shpnt = SCpnt->host;
1093	DPRINTK(debug_eh, INFO_LEAD "reset_done called\n", CMDINFO(SCpnt));
1094#endif
1095	if(SCSEM(SCpnt)) {
1096		complete(SCSEM(SCpnt));
1097	} else {
1098		printk(KERN_ERR "aha152x: reset_done w/o completion\n");
1099	}
1100}
1101
1102/*
1103 *  Abort a command
1104 *
1105 */
1106static int aha152x_abort(Scsi_Cmnd *SCpnt)
1107{
1108	struct Scsi_Host *shpnt = SCpnt->device->host;
1109	Scsi_Cmnd *ptr;
1110	unsigned long flags;
1111
1112#if defined(AHA152X_DEBUG)
1113	if(HOSTDATA(shpnt)->debug & debug_eh) {
1114		printk(DEBUG_LEAD "abort(%p)", CMDINFO(SCpnt), SCpnt);
1115		show_queues(shpnt);
1116	}
1117#endif
1118
1119	DO_LOCK(flags);
1120
1121	ptr=remove_SC(&ISSUE_SC, SCpnt);
1122
1123	if(ptr) {
1124		DPRINTK(debug_eh, DEBUG_LEAD "not yet issued - SUCCESS\n", CMDINFO(SCpnt));
1125
1126		HOSTDATA(shpnt)->commands--;
1127		if (!HOSTDATA(shpnt)->commands)
1128			SETPORT(PORTA, 0);
1129		DO_UNLOCK(flags);
1130
1131		kfree(SCpnt->host_scribble);
1132		SCpnt->host_scribble=NULL;
1133
1134		return SUCCESS;
1135	} 
1136
1137	DO_UNLOCK(flags);
1138
1139	/*
1140	 * FIXME:
1141	 * for current command: queue ABORT for message out and raise ATN
1142	 * for disconnected command: pseudo SC with ABORT message or ABORT on reselection?
1143	 *
1144	 */
1145
1146	printk(ERR_LEAD "cannot abort running or disconnected command\n", CMDINFO(SCpnt));
1147
1148	return FAILED;
1149}
1150
1151/*
1152 * Reset a device
1153 *
1154 */
1155static int aha152x_device_reset(Scsi_Cmnd * SCpnt)
1156{
1157	struct Scsi_Host *shpnt = SCpnt->device->host;
1158	DECLARE_COMPLETION(done);
1159	int ret, issued, disconnected;
1160	unsigned char old_cmd_len = SCpnt->cmd_len;
1161	unsigned long flags;
1162	unsigned long timeleft;
1163
1164#if defined(AHA152X_DEBUG)
1165	if(HOSTDATA(shpnt)->debug & debug_eh) {
1166		printk(INFO_LEAD "aha152x_device_reset(%p)", CMDINFO(SCpnt), SCpnt);
1167		show_queues(shpnt);
1168	}
1169#endif
1170
1171	if(CURRENT_SC==SCpnt) {
1172		printk(ERR_LEAD "cannot reset current device\n", CMDINFO(SCpnt));
1173		return FAILED;
1174	}
1175
1176	DO_LOCK(flags);
1177	issued       = remove_SC(&ISSUE_SC, SCpnt) == NULL;
1178	disconnected = issued && remove_SC(&DISCONNECTED_SC, SCpnt);
1179	DO_UNLOCK(flags);
1180
1181	SCpnt->cmd_len         = 0;
1182
1183	aha152x_internal_queue(SCpnt, &done, resetting, reset_done);
1184
1185	timeleft = wait_for_completion_timeout(&done, 100*HZ);
1186	if (!timeleft) {
1187		/* remove command from issue queue */
1188		DO_LOCK(flags);
1189		remove_SC(&ISSUE_SC, SCpnt);
1190		DO_UNLOCK(flags);
1191	}
1192
1193	SCpnt->cmd_len         = old_cmd_len;
1194
1195	DO_LOCK(flags);
1196
1197	if(SCpnt->SCp.phase & resetted) {
1198		HOSTDATA(shpnt)->commands--;
1199		if (!HOSTDATA(shpnt)->commands)
1200			SETPORT(PORTA, 0);
1201		kfree(SCpnt->host_scribble);
1202		SCpnt->host_scribble=NULL;
1203
1204		ret = SUCCESS;
1205	} else {
1206		/* requeue */
1207		if(!issued) {
1208			append_SC(&ISSUE_SC, SCpnt);
1209		} else if(disconnected) {
1210			append_SC(&DISCONNECTED_SC, SCpnt);
1211		}
1212	
1213		ret = FAILED;
1214	}
1215
1216	DO_UNLOCK(flags);
1217	return ret;
1218}
1219
1220static void free_hard_reset_SCs(struct Scsi_Host *shpnt, Scsi_Cmnd **SCs)
1221{
1222	Scsi_Cmnd *ptr;
1223
1224	ptr=*SCs;
1225	while(ptr) {
1226		Scsi_Cmnd *next;
1227
1228		if(SCDATA(ptr)) {
1229			next = SCNEXT(ptr);
1230		} else {
1231			printk(DEBUG_LEAD "queue corrupted at %p\n", CMDINFO(ptr), ptr);
1232			next = NULL;
1233		}
1234
1235		if (!ptr->device->soft_reset) {
1236			DPRINTK(debug_eh, DEBUG_LEAD "disconnected command %p removed\n", CMDINFO(ptr), ptr);
1237			remove_SC(SCs, ptr);
1238			HOSTDATA(shpnt)->commands--;
1239			kfree(ptr->host_scribble);
1240			ptr->host_scribble=NULL;
1241		}
1242
1243		ptr = next;
1244	}
1245}
1246
1247/*
1248 * Reset the bus
1249 *
1250 */
1251static int aha152x_bus_reset_host(struct Scsi_Host *shpnt)
1252{
1253	unsigned long flags;
1254
1255	DO_LOCK(flags);
1256
1257#if defined(AHA152X_DEBUG)
1258	if(HOSTDATA(shpnt)->debug & debug_eh) {
1259		printk(KERN_DEBUG "scsi%d: bus reset", shpnt->host_no);
1260		show_queues(shpnt);
1261	}
1262#endif
1263
1264	free_hard_reset_SCs(shpnt, &ISSUE_SC);
1265	free_hard_reset_SCs(shpnt, &DISCONNECTED_SC);
1266
1267	DPRINTK(debug_eh, KERN_DEBUG "scsi%d: resetting bus\n", shpnt->host_no);
1268
1269	SETPORT(SCSISEQ, SCSIRSTO);
1270	mdelay(256);
1271	SETPORT(SCSISEQ, 0);
1272	mdelay(DELAY);
1273
1274	DPRINTK(debug_eh, KERN_DEBUG "scsi%d: bus resetted\n", shpnt->host_no);
1275
1276	setup_expected_interrupts(shpnt);
1277	if(HOSTDATA(shpnt)->commands==0)
1278		SETPORT(PORTA, 0);
1279
1280	DO_UNLOCK(flags);
1281
1282	return SUCCESS;
1283}
1284
1285/*
1286 * Reset the bus
1287 *
1288 */
1289static int aha152x_bus_reset(Scsi_Cmnd *SCpnt)
1290{
1291	return aha152x_bus_reset_host(SCpnt->device->host);
1292}
1293
1294/*
1295 *  Restore default values to the AIC-6260 registers and reset the fifos
1296 *
1297 */
1298static void reset_ports(struct Scsi_Host *shpnt)
1299{
1300	unsigned long flags;
1301
1302	/* disable interrupts */
1303	SETPORT(DMACNTRL0, RSTFIFO);
1304
1305	SETPORT(SCSISEQ, 0);
1306
1307	SETPORT(SXFRCTL1, 0);
1308	SETPORT(SCSISIG, 0);
1309	SETRATE(0);
1310
1311	/* clear all interrupt conditions */
1312	SETPORT(SSTAT0, 0x7f);
1313	SETPORT(SSTAT1, 0xef);
1314
1315	SETPORT(SSTAT4, SYNCERR | FWERR | FRERR);
1316
1317	SETPORT(DMACNTRL0, 0);
1318	SETPORT(DMACNTRL1, 0);
1319
1320	SETPORT(BRSTCNTRL, 0xf1);
1321
1322	/* clear SCSI fifos and transfer count */
1323	SETPORT(SXFRCTL0, CH1|CLRCH1|CLRSTCNT);
1324	SETPORT(SXFRCTL0, CH1);
1325
1326	DO_LOCK(flags);
1327	setup_expected_interrupts(shpnt);
1328	DO_UNLOCK(flags);
1329}
1330
1331/*
1332 * Reset the host (bus and controller)
1333 *
1334 */
1335int aha152x_host_reset_host(struct Scsi_Host *shpnt)
1336{
1337	DPRINTK(debug_eh, KERN_DEBUG "scsi%d: host reset\n", shpnt->host_no);
1338
1339	aha152x_bus_reset_host(shpnt);
1340
1341	DPRINTK(debug_eh, KERN_DEBUG "scsi%d: resetting ports\n", shpnt->host_no);
1342	reset_ports(shpnt);
1343
1344	return SUCCESS;
1345}
1346
1347/*
1348 * Reset the host (bus and controller)
1349 * 
1350 */
1351static int aha152x_host_reset(Scsi_Cmnd *SCpnt)
1352{
1353	return aha152x_host_reset_host(SCpnt->device->host);
1354}
1355
1356/*
1357 * Return the "logical geometry"
1358 *
1359 */
1360static int aha152x_biosparam(struct scsi_device *sdev, struct block_device *bdev,
1361		sector_t capacity, int *info_array)
1362{
1363	struct Scsi_Host *shpnt = sdev->host;
1364
1365	/* try default translation */
1366	info_array[0] = 64;
1367	info_array[1] = 32;
1368	info_array[2] = (unsigned long)capacity / (64 * 32);
1369
1370	/* for disks >1GB do some guessing */
1371	if (info_array[2] >= 1024) {
1372		int info[3];
1373
1374		/* try to figure out the geometry from the partition table */
1375		if (scsicam_bios_param(bdev, capacity, info) < 0 ||
1376		    !((info[0] == 64 && info[1] == 32) || (info[0] == 255 && info[1] == 63))) {
1377			if (EXT_TRANS) {
1378				printk(KERN_NOTICE
1379				       "aha152x: unable to verify geometry for disk with >1GB.\n"
1380				       "         using extended translation.\n");
1381				info_array[0] = 255;
1382				info_array[1] = 63;
1383				info_array[2] = (unsigned long)capacity / (255 * 63);
1384			} else {
1385				printk(KERN_NOTICE
1386				       "aha152x: unable to verify geometry for disk with >1GB.\n"
1387				       "         Using default translation. Please verify yourself.\n"
1388				       "         Perhaps you need to enable extended translation in the driver.\n"
1389				       "         See Documentation/scsi/aha152x.txt for details.\n");
1390			}
1391		} else {
1392			info_array[0] = info[0];
1393			info_array[1] = info[1];
1394			info_array[2] = info[2];
1395
1396			if (info[0] == 255 && !EXT_TRANS) {
1397				printk(KERN_NOTICE
1398				       "aha152x: current partition table is using extended translation.\n"
1399				       "         using it also, although it's not explicitly enabled.\n");
1400			}
1401		}
1402	}
1403
1404	return 0;
1405}
1406
1407/*
1408 *  Internal done function
1409 *
1410 */
1411static void done(struct Scsi_Host *shpnt, int error)
1412{
1413	if (CURRENT_SC) {
1414		if(DONE_SC)
1415			printk(ERR_LEAD "there's already a completed command %p - will cause abort\n", CMDINFO(CURRENT_SC), DONE_SC);
1416
1417		DONE_SC = CURRENT_SC;
1418		CURRENT_SC = NULL;
1419		DONE_SC->result = error;
1420	} else
1421		printk(KERN_ERR "aha152x: done() called outside of command\n");
1422}
1423
1424static struct work_struct aha152x_tq;
1425
1426/*
1427 * Run service completions on the card with interrupts enabled.
1428 *
1429 */
1430static void run(struct work_struct *work)
1431{
1432	struct aha152x_hostdata *hd;
1433
1434	list_for_each_entry(hd, &aha152x_host_list, host_list) {
1435		struct Scsi_Host *shost = container_of((void *)hd, struct Scsi_Host, hostdata);
1436
1437		is_complete(shost);
1438	}
1439}
1440
1441/*
1442 * Interrupt handler
1443 *
1444 */
1445static irqreturn_t intr(int irqno, void *dev_id)
1446{
1447	struct Scsi_Host *shpnt = dev_id;
1448	unsigned long flags;
1449	unsigned char rev, dmacntrl0;
1450
1451	/*
1452	 * Read a couple of registers that are known to not be all 1's. If
1453	 * we read all 1's (-1), that means that either:
1454	 *
1455	 * a. The host adapter chip has gone bad, and we cannot control it,
1456	 *	OR
1457	 * b. The host adapter is a PCMCIA card that has been ejected
1458	 *
1459	 * In either case, we cannot do anything with the host adapter at
1460	 * this point in time. So just ignore the interrupt and return.
1461	 * In the latter case, the interrupt might actually be meant for
1462	 * someone else sharing this IRQ, and that driver will handle it.
1463	 */
1464	rev = GETPORT(REV);
1465	dmacntrl0 = GETPORT(DMACNTRL0);
1466	if ((rev == 0xFF) && (dmacntrl0 == 0xFF))
1467		return IRQ_NONE;
1468
1469	if( TESTLO(DMASTAT, INTSTAT) )
1470		return IRQ_NONE;	
1471
1472	/* no more interrupts from the controller, while we're busy.
1473	   INTEN is restored by the BH handler */
1474	CLRBITS(DMACNTRL0, INTEN);
1475
1476	DO_LOCK(flags);
1477	if( HOSTDATA(shpnt)->service==0 ) {
1478		HOSTDATA(shpnt)->service=1;
1479
1480		/* Poke the BH handler */
1481		INIT_WORK(&aha152x_tq, run);
1482		schedule_work(&aha152x_tq);
1483	}
1484	DO_UNLOCK(flags);
1485
1486	return IRQ_HANDLED;
1487}
1488
1489/*
1490 * busfree phase
1491 * - handle completition/disconnection/error of current command
1492 * - start selection for next command (if any)
1493 */
1494static void busfree_run(struct Scsi_Host *shpnt)
1495{
1496	unsigned long flags;
1497#if defined(AHA152X_STAT)
1498	int action=0;
1499#endif
1500
1501	SETPORT(SXFRCTL0, CH1|CLRCH1|CLRSTCNT);
1502	SETPORT(SXFRCTL0, CH1);
1503
1504	SETPORT(SSTAT1, CLRBUSFREE);
1505	
1506	if(CURRENT_SC) {
1507#if defined(AHA152X_STAT)
1508		action++;
1509#endif
1510		CURRENT_SC->SCp.phase &= ~syncneg;
1511
1512		if(CURRENT_SC->SCp.phase & completed) {
1513			/* target sent COMMAND COMPLETE */
1514			done(shpnt, (CURRENT_SC->SCp.Status & 0xff) | ((CURRENT_SC->SCp.Message & 0xff) << 8) | (DID_OK << 16));
1515
1516		} else if(CURRENT_SC->SCp.phase & aborted) {
1517			DPRINTK(debug_eh, DEBUG_LEAD "ABORT sent\n", CMDINFO(CURRENT_SC));
1518			done(shpnt, (CURRENT_SC->SCp.Status & 0xff) | ((CURRENT_SC->SCp.Message & 0xff) << 8) | (DID_ABORT << 16));
1519
1520		} else if(CURRENT_SC->SCp.phase & resetted) {
1521			DPRINTK(debug_eh, DEBUG_LEAD "BUS DEVICE RESET sent\n", CMDINFO(CURRENT_SC));
1522			done(shpnt, (CURRENT_SC->SCp.Status & 0xff) | ((CURRENT_SC->SCp.Message & 0xff) << 8) | (DID_RESET << 16));
1523
1524		} else if(CURRENT_SC->SCp.phase & disconnected) {
1525			/* target sent DISCONNECT */
1526			DPRINTK(debug_selection, DEBUG_LEAD "target disconnected at %d/%d\n",
1527				CMDINFO(CURRENT_SC),
1528				scsi_get_resid(CURRENT_SC),
1529				scsi_bufflen(CURRENT_SC));
1530#if defined(AHA152X_STAT)
1531			HOSTDATA(shpnt)->disconnections++;
1532#endif
1533			append_SC(&DISCONNECTED_SC, CURRENT_SC);
1534			CURRENT_SC->SCp.phase |= 1 << 16;
1535			CURRENT_SC = NULL;
1536
1537		} else {
1538			done(shpnt, DID_ERROR << 16);
1539		}
1540#if defined(AHA152X_STAT)
1541	} else {
1542		HOSTDATA(shpnt)->busfree_without_old_command++;
1543#endif
1544	}
1545
1546	DO_LOCK(flags);
1547
1548	if(DONE_SC) {
1549#if defined(AHA152X_STAT)
1550		action++;
1551#endif
1552
1553		if(DONE_SC->SCp.phase & check_condition) {
1554			struct scsi_cmnd *cmd = HOSTDATA(shpnt)->done_SC;
1555			struct aha152x_scdata *sc = SCDATA(cmd);
1556
1557#if 0
1558			if(HOSTDATA(shpnt)->debug & debug_eh) {
1559				printk(ERR_LEAD "received sense: ", CMDINFO(DONE_SC));
1560				scsi_print_sense("bh", DONE_SC);
1561			}
1562#endif
1563
1564			scsi_eh_restore_cmnd(cmd, &sc->ses);
1565
1566			cmd->SCp.Status = SAM_STAT_CHECK_CONDITION;
1567
1568			HOSTDATA(shpnt)->commands--;
1569			if (!HOSTDATA(shpnt)->commands)
1570				SETPORT(PORTA, 0);	/* turn led off */
1571		} else if(DONE_SC->SCp.Status==SAM_STAT_CHECK_CONDITION) {
1572#if defined(AHA152X_STAT)
1573			HOSTDATA(shpnt)->busfree_with_check_condition++;
1574#endif
1575#if 0
1576			DPRINTK(debug_eh, ERR_LEAD "CHECK CONDITION found\n", CMDINFO(DONE_SC));
1577#endif
1578
1579			if(!(DONE_SC->SCp.phase & not_issued)) {
1580				struct aha152x_scdata *sc;
1581				Scsi_Cmnd *ptr = DONE_SC;
1582				DONE_SC=NULL;
1583#if 0
1584				DPRINTK(debug_eh, ERR_LEAD "requesting sense\n", CMDINFO(ptr));
1585#endif
1586
1587				sc = SCDATA(ptr);
1588				/* It was allocated in aha152x_internal_queue? */
1589				BUG_ON(!sc);
1590				scsi_eh_prep_cmnd(ptr, &sc->ses, NULL, 0, ~0);
1591
1592				DO_UNLOCK(flags);
1593				aha152x_internal_queue(ptr, NULL, check_condition, ptr->scsi_done);
1594				DO_LOCK(flags);
1595#if 0
1596			} else {
1597				DPRINTK(debug_eh, ERR_LEAD "command not issued - CHECK CONDITION ignored\n", CMDINFO(DONE_SC));
1598#endif
1599			}
1600		}
1601
1602		if(DONE_SC && DONE_SC->scsi_done) {
1603#if defined(AHA152X_DEBUG)
1604			int hostno=DONE_SC->device->host->host_no;
1605			int id=DONE_SC->device->id & 0xf;
1606			int lun=DONE_SC->device->lun & 0x7;
1607#endif
1608			Scsi_Cmnd *ptr = DONE_SC;
1609			DONE_SC=NULL;
1610
1611			/* turn led off, when no commands are in the driver */
1612			HOSTDATA(shpnt)->commands--;
1613			if (!HOSTDATA(shpnt)->commands)
1614				SETPORT(PORTA, 0);	/* turn led off */
1615
1616			if(ptr->scsi_done != reset_done) {
1617				kfree(ptr->host_scribble);
1618				ptr->host_scribble=NULL;
1619			}
1620
1621			DO_UNLOCK(flags);
1622			DPRINTK(debug_done, DEBUG_LEAD "calling scsi_done(%p)\n", hostno, id, lun, ptr);
1623                	ptr->scsi_done(ptr);
1624			DPRINTK(debug_done, DEBUG_LEAD "scsi_done(%p) returned\n", hostno, id, lun, ptr);
1625			DO_LOCK(flags);
1626		}
1627
1628		DONE_SC=NULL;
1629#if defined(AHA152X_STAT)
1630	} else {
1631		HOSTDATA(shpnt)->busfree_without_done_command++;
1632#endif
1633	}
1634
1635	if(ISSUE_SC)
1636		CURRENT_SC = remove_first_SC(&ISSUE_SC);
1637
1638	DO_UNLOCK(flags);
1639
1640	if(CURRENT_SC) {
1641#if defined(AHA152X_STAT)
1642		action++;
1643#endif
1644	    	CURRENT_SC->SCp.phase |= selecting;
1645
1646		DPRINTK(debug_selection, DEBUG_LEAD "selecting target\n", CMDINFO(CURRENT_SC));
1647
1648		/* clear selection timeout */
1649		SETPORT(SSTAT1, SELTO);
1650
1651		SETPORT(SCSIID, (shpnt->this_id << OID_) | CURRENT_SC->device->id);
1652		SETPORT(SXFRCTL1, (PARITY ? ENSPCHK : 0 ) | ENSTIMER);
1653		SETPORT(SCSISEQ, ENSELO | ENAUTOATNO | (DISCONNECTED_SC ? ENRESELI : 0));
1654	} else {
1655#if defined(AHA152X_STAT)
1656		HOSTDATA(shpnt)->busfree_without_new_command++;
1657#endif
1658		SETPORT(SCSISEQ, DISCONNECTED_SC ? ENRESELI : 0);
1659	}
1660
1661#if defined(AHA152X_STAT)
1662	if(!action)
1663		HOSTDATA(shpnt)->busfree_without_any_action++;
1664#endif
1665}
1666
1667/*
1668 * Selection done (OUT)
1669 * - queue IDENTIFY message and SDTR to selected target for message out
1670 *   (ATN asserted automagically via ENAUTOATNO in busfree())
1671 */
1672static void seldo_run(struct Scsi_Host *shpnt)
1673{
1674	SETPORT(SCSISIG, 0);
1675	SETPORT(SSTAT1, CLRBUSFREE);
1676	SETPORT(SSTAT1, CLRPHASECHG);
1677
1678    	CURRENT_SC->SCp.phase &= ~(selecting|not_issued);
1679
1680	SETPORT(SCSISEQ, 0);
1681
1682	if (TESTLO(SSTAT0, SELDO)) {
1683		printk(ERR_LEAD "aha152x: passing bus free condition\n", CMDINFO(CURRENT_SC));
1684		done(shpnt, DID_NO_CONNECT << 16);
1685		return;
1686	}
1687
1688	SETPORT(SSTAT0, CLRSELDO);
1689	
1690	ADDMSGO(IDENTIFY(RECONNECT, CURRENT_SC->device->lun));
1691
1692	if (CURRENT_SC->SCp.phase & aborting) {
1693		ADDMSGO(ABORT);
1694	} else if (CURRENT_SC->SCp.phase & resetting) {
1695		ADDMSGO(BUS_DEVICE_RESET);
1696	} else if (SYNCNEG==0 && SYNCHRONOUS) {
1697    		CURRENT_SC->SCp.phase |= syncneg;
1698		MSGOLEN += spi_populate_sync_msg(&MSGO(MSGOLEN), 50, 8);
1699		SYNCNEG=1;		/* negotiation in progress */
1700	}
1701
1702	SETRATE(SYNCRATE);
1703}
1704
1705/*
1706 * Selection timeout
1707 * - return command to mid-level with failure cause
1708 *
1709 */
1710static void selto_run(struct Scsi_Host *shpnt)
1711{
1712	SETPORT(SCSISEQ, 0);		
1713	SETPORT(SSTAT1, CLRSELTIMO);
1714
1715	DPRINTK(debug_selection, DEBUG_LEAD "selection timeout\n", CMDINFO(CURRENT_SC));
1716
1717	if(!CURRENT_SC) {
1718		DPRINTK(debug_selection, DEBUG_LEAD "!CURRENT_SC\n", CMDINFO(CURRENT_SC));
1719		return;
1720	}
1721
1722    	CURRENT_SC->SCp.phase &= ~selecting;
1723
1724	if (CURRENT_SC->SCp.phase & aborted) {
1725		DPRINTK(debug_selection, DEBUG_LEAD "aborted\n", CMDINFO(CURRENT_SC));
1726		done(shpnt, DID_ABORT << 16);
1727	} else if (TESTLO(SSTAT0, SELINGO)) {
1728		DPRINTK(debug_selection, DEBUG_LEAD "arbitration not won\n", CMDINFO(CURRENT_SC));
1729		done(shpnt, DID_BUS_BUSY << 16);
1730	} else {
1731		/* ARBITRATION won, but SELECTION failed */
1732		DPRINTK(debug_selection, DEBUG_LEAD "selection failed\n", CMDINFO(CURRENT_SC));
1733		done(shpnt, DID_NO_CONNECT << 16);
1734	}
1735}
1736
1737/*
1738 * Selection in done
1739 * - put current command back to issue queue
1740 *   (reconnection of a disconnected nexus instead
1741 *    of successful selection out)
1742 *
1743 */
1744static void seldi_run(struct Scsi_Host *shpnt)
1745{
1746	int selid;
1747	int target;
1748	unsigned long flags;
1749
1750	SETPORT(SCSISIG, 0);
1751	SETPORT(SSTAT0, CLRSELDI);
1752	SETPORT(SSTAT1, CLRBUSFREE);
1753	SETPORT(SSTAT1, CLRPHASECHG);
1754
1755	if(CURRENT_SC) {
1756		if(!(CURRENT_SC->SCp.phase & not_issued))
1757			printk(ERR_LEAD "command should not have been issued yet\n", CMDINFO(CURRENT_SC));
1758
1759		DPRINTK(debug_selection, ERR_LEAD "command requeued - reselection\n", CMDINFO(CURRENT_SC));
1760
1761		DO_LOCK(flags);
1762		append_SC(&ISSUE_SC, CURRENT_SC);
1763		DO_UNLOCK(flags);
1764
1765		CURRENT_SC = NULL;
1766	}
1767
1768	if(!DISCONNECTED_SC) {
1769		DPRINTK(debug_selection, DEBUG_LEAD "unexpected SELDI ", CMDINFO(CURRENT_SC));
1770		return;
1771	}
1772
1773	RECONN_TARGET=-1;
1774
1775	selid = GETPORT(SELID) & ~(1 << shpnt->this_id);
1776
1777	if (selid==0) {
1778		printk("aha152x%d: target id unknown (%02x)\n", HOSTNO, selid);
1779		return;
1780	}
1781
1782	for(target=7; !(selid & (1 << target)); target--)
1783		;
1784
1785	if(selid & ~(1 << target)) {
1786		printk("aha152x%d: multiple targets reconnected (%02x)\n",
1787		       HOSTNO, selid);
1788	}
1789
1790
1791	SETPORT(SCSIID, (shpnt->this_id << OID_) | target);
1792	SETPORT(SCSISEQ, 0);
1793
1794	SETRATE(HOSTDATA(shpnt)->syncrate[target]);
1795
1796	RECONN_TARGET=target;
1797	DPRINTK(debug_selection, DEBUG_LEAD "target %d reselected (%02x).\n", CMDINFO(CURRENT_SC), target, selid);
1798}
1799
1800/*
1801 * message in phase
1802 * - handle initial message after reconnection to identify
1803 *   reconnecting nexus
1804 * - queue command on DISCONNECTED_SC on DISCONNECT message
1805 * - set completed flag on COMMAND COMPLETE
1806 *   (other completition code moved to busfree_run)
1807 * - handle response to SDTR
1808 * - clear synchronous transfer agreements on BUS RESET
1809 *
1810 * FIXME: what about SAVE POINTERS, RESTORE POINTERS?
1811 *
1812 */
1813static void msgi_run(struct Scsi_Host *shpnt)
1814{
1815	for(;;) {
1816		int sstat1 = GETPORT(SSTAT1);
1817
1818		if(sstat1 & (PHASECHG|PHASEMIS|BUSFREE) || !(sstat1 & REQINIT))
1819			return;
1820
1821		if(TESTLO(SSTAT0,SPIORDY)) {
1822			DPRINTK(debug_msgi, DEBUG_LEAD "!SPIORDY\n", CMDINFO(CURRENT_SC));
1823			return;
1824		}	
1825
1826		ADDMSGI(GETPORT(SCSIDAT));
1827
1828#if defined(AHA152X_DEBUG)
1829		if (HOSTDATA(shpnt)->debug & debug_msgi) {
1830			printk(INFO_LEAD "inbound message %02x ", CMDINFO(CURRENT_SC), MSGI(0));
1831			spi_print_msg(&MSGI(0));
1832			printk("\n");
1833		}
1834#endif
1835
1836		if(!CURRENT_SC) {
1837			if(LASTSTATE!=seldi) {
1838				printk(KERN_ERR "aha152x%d: message in w/o current command not after reselection\n", HOSTNO);
1839			}
1840
1841			/*
1842	 	 	 * Handle reselection
1843	 		 */
1844			if(!(MSGI(0) & IDENTIFY_BASE)) {
1845				printk(KERN_ERR "aha152x%d: target didn't identify after reselection\n", HOSTNO);
1846				continue;
1847			}
1848
1849			CURRENT_SC = remove_lun_SC(&DISCONNECTED_SC, RECONN_TARGET, MSGI(0) & 0x3f);
1850
1851			if (!CURRENT_SC) {
1852				show_queues(shpnt);
1853				printk(KERN_ERR "aha152x%d: no disconnected command for target %d/%d\n", HOSTNO, RECONN_TARGET, MSGI(0) & 0x3f);
1854				continue;
1855			}
1856
1857			DPRINTK(debug_msgi, DEBUG_LEAD "target reconnected\n", CMDINFO(CURRENT_SC));
1858
1859			CURRENT_SC->SCp.Message = MSGI(0);
1860			CURRENT_SC->SCp.phase &= ~disconnected;
1861
1862			MSGILEN=0;
1863
1864			/* next message if any */
1865			continue;
1866		} 
1867
1868		CURRENT_SC->SCp.Message = MSGI(0);
1869
1870		switch (MSGI(0)) {
1871		case DISCONNECT:
1872			if (!RECONNECT)
1873				printk(WARN_LEAD "target was not allowed to disconnect\n", CMDINFO(CURRENT_SC));
1874
1875			CURRENT_SC->SCp.phase |= disconnected;
1876			break;
1877
1878		case COMMAND_COMPLETE:
1879			if(CURRENT_SC->SCp.phase & completed)
1880				DPRINTK(debug_msgi, DEBUG_LEAD "again COMMAND COMPLETE\n", CMDINFO(CURRENT_SC));
1881
1882			CURRENT_SC->SCp.phase |= completed;
1883			break;
1884
1885		case MESSAGE_REJECT:
1886			if

Large files files are truncated, but you can click here to view the full file