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