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