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