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