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