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