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