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