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