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