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