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