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