RT-AC66 3.0.0.4.374.130 core
[tomato.git] / release / src-rt-6.x / linux / linux-2.6 / drivers / scsi / aha152x.c
blob4b4d1233ce8a95e60e885b9575b505dc4f34d9e1
1 /* aha152x.c -- Adaptec AHA-152x driver
2 * Author: Jürgen E. Fischer, fischer@norbit.de
3 * Copyright 1993-2004 Jürgen E. Fischer
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License as published by the
7 * Free Software Foundation; either version 2, or (at your option) any
8 * later version.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
16 * $Id: aha152x.c,v 2.7 2004/01/24 11:42:59 fischer Exp $
18 * $Log: aha152x.c,v $
19 * Revision 2.7 2004/01/24 11:42:59 fischer
20 * - gather code that is not used by PCMCIA at the end
21 * - move request_region for !PCMCIA case to detection
22 * - migration to new scsi host api (remove legacy code)
23 * - free host scribble before scsi_done
24 * - fix error handling
25 * - one isapnp device added to id_table
27 * Revision 2.6 2003/10/30 20:52:47 fischer
28 * - interfaces changes for kernel 2.6
29 * - aha152x_probe_one introduced for pcmcia stub
30 * - fixed pnpdev handling
31 * - instead of allocation a new one, reuse command for request sense after check condition and reset
32 * - fixes race in is_complete
34 * Revision 2.5 2002/04/14 11:24:53 fischer
35 * - isapnp support
36 * - abort fixed
37 * - 2.5 support
39 * Revision 2.4 2000/12/16 12:53:56 fischer
40 * - allow REQUEST SENSE to be queued
41 * - handle shared PCI interrupts
43 * Revision 2.3 2000/11/04 16:40:26 fischer
44 * - handle data overruns
45 * - extend timeout for data phases
47 * Revision 2.2 2000/08/08 19:54:53 fischer
48 * - minor changes
50 * Revision 2.1 2000/05/17 16:23:17 fischer
51 * - signature update
52 * - fix for data out w/o scatter gather
54 * Revision 2.0 1999/12/25 15:07:32 fischer
55 * - interrupt routine completly reworked
56 * - basic support for new eh code
58 * Revision 1.21 1999/11/10 23:46:36 fischer
59 * - default to synchronous operation
60 * - synchronous negotiation fixed
61 * - added timeout to loops
62 * - debugging output can be controlled through procfs
64 * Revision 1.20 1999/11/07 18:37:31 fischer
65 * - synchronous operation works
66 * - resid support for sg driver
68 * Revision 1.19 1999/11/02 22:39:59 fischer
69 * - moved leading comments to README.aha152x
70 * - new additional module parameters
71 * - updates for 2.3
72 * - support for the Tripace TC1550 controller
73 * - interrupt handling changed
75 * Revision 1.18 1996/09/07 20:10:40 fischer
76 * - fixed can_queue handling (multiple outstanding commands working again)
78 * Revision 1.17 1996/08/17 16:05:14 fischer
79 * - biosparam improved
80 * - interrupt verification
81 * - updated documentation
82 * - cleanups
84 * Revision 1.16 1996/06/09 00:04:56 root
85 * - added configuration symbols for insmod (aha152x/aha152x1)
87 * Revision 1.15 1996/04/30 14:52:06 fischer
88 * - proc info fixed
89 * - support for extended translation for >1GB disks
91 * Revision 1.14 1996/01/17 15:11:20 fischer
92 * - fixed lockup in MESSAGE IN phase after reconnection
94 * Revision 1.13 1996/01/09 02:15:53 fischer
95 * - some cleanups
96 * - moved request_irq behind controller initialization
97 * (to avoid spurious interrupts)
99 * Revision 1.12 1995/12/16 12:26:07 fischer
100 * - barrier()s added
101 * - configurable RESET delay added
103 * Revision 1.11 1995/12/06 21:18:35 fischer
104 * - some minor updates
106 * Revision 1.10 1995/07/22 19:18:45 fischer
107 * - support for 2 controllers
108 * - started synchronous data transfers (not working yet)
110 * Revision 1.9 1995/03/18 09:20:24 root
111 * - patches for PCMCIA and modules
113 * Revision 1.8 1995/01/21 22:07:19 root
114 * - snarf_region => request_region
115 * - aha152x_intr interface change
117 * Revision 1.7 1995/01/02 23:19:36 root
118 * - updated COMMAND_SIZE to cmd_len
119 * - changed sti() to restore_flags()
120 * - fixed some #ifdef which generated warnings
122 * Revision 1.6 1994/11/24 20:35:27 root
123 * - problem with odd number of bytes in fifo fixed
125 * Revision 1.5 1994/10/30 14:39:56 root
126 * - abort code fixed
127 * - debugging improved
129 * Revision 1.4 1994/09/12 11:33:01 root
130 * - irqaction to request_irq
131 * - abortion updated
133 * Revision 1.3 1994/08/04 13:53:05 root
134 * - updates for mid-level-driver changes
135 * - accept unexpected BUSFREE phase as error condition
136 * - parity check now configurable
138 * Revision 1.2 1994/07/03 12:56:36 root
139 * - cleaned up debugging code
140 * - more tweaking on reset delays
141 * - updated abort/reset code (pretty untested...)
143 * Revision 1.1 1994/05/28 21:18:49 root
144 * - update for mid-level interface change (abort-reset)
145 * - delays after resets adjusted for some slow devices
147 * Revision 1.0 1994/03/25 12:52:00 root
148 * - Fixed "more data than expected" problem
149 * - added new BIOS signatures
151 * Revision 0.102 1994/01/31 20:44:12 root
152 * - minor changes in insw/outsw handling
154 * Revision 0.101 1993/12/13 01:16:27 root
155 * - fixed STATUS phase (non-GOOD stati were dropped sometimes;
156 * fixes problems with CD-ROM sector size detection & media change)
158 * Revision 0.100 1993/12/10 16:58:47 root
159 * - fix for unsuccessful selections in case of non-continuous id assignments
160 * on the scsi bus.
162 * Revision 0.99 1993/10/24 16:19:59 root
163 * - fixed DATA IN (rare read errors gone)
165 * Revision 0.98 1993/10/17 12:54:44 root
166 * - fixed some recent fixes (shame on me)
167 * - moved initialization of scratch area to aha152x_queue
169 * Revision 0.97 1993/10/09 18:53:53 root
170 * - DATA IN fixed. Rarely left data in the fifo.
172 * Revision 0.96 1993/10/03 00:53:59 root
173 * - minor changes on DATA IN
175 * Revision 0.95 1993/09/24 10:36:01 root
176 * - change handling of MSGI after reselection
177 * - fixed sti/cli
178 * - minor changes
180 * Revision 0.94 1993/09/18 14:08:22 root
181 * - fixed bug in multiple outstanding command code
182 * - changed detection
183 * - support for kernel command line configuration
184 * - reset corrected
185 * - changed message handling
187 * Revision 0.93 1993/09/15 20:41:19 root
188 * - fixed bugs with multiple outstanding commands
190 * Revision 0.92 1993/09/13 02:46:33 root
191 * - multiple outstanding commands work (no problems with IBM drive)
193 * Revision 0.91 1993/09/12 20:51:46 root
194 * added multiple outstanding commands
195 * (some problem with this $%&? IBM device remain)
197 * Revision 0.9 1993/09/12 11:11:22 root
198 * - corrected auto-configuration
199 * - changed the auto-configuration (added some '#define's)
200 * - added support for dis-/reconnection
202 * Revision 0.8 1993/09/06 23:09:39 root
203 * - added support for the drive activity light
204 * - minor changes
206 * Revision 0.7 1993/09/05 14:30:15 root
207 * - improved phase detection
208 * - now using the new snarf_region code of 0.99pl13
210 * Revision 0.6 1993/09/02 11:01:38 root
211 * first public release; added some signatures and biosparam()
213 * Revision 0.5 1993/08/30 10:23:30 root
214 * fixed timing problems with my IBM drive
216 * Revision 0.4 1993/08/29 14:06:52 root
217 * fixed some problems with timeouts due incomplete commands
219 * Revision 0.3 1993/08/28 15:55:03 root
220 * writing data works too. mounted and worked on a dos partition
222 * Revision 0.2 1993/08/27 22:42:07 root
223 * reading data works. Mounted a msdos partition.
225 * Revision 0.1 1993/08/25 13:38:30 root
226 * first "damn thing doesn't work" version
228 * Revision 0.0 1993/08/14 19:54:25 root
229 * empty function bodies; detect() works.
232 **************************************************************************
234 see Documentation/scsi/aha152x.txt for configuration details
236 **************************************************************************/
238 #include <linux/module.h>
239 #include <asm/irq.h>
240 #include <linux/io.h>
241 #include <linux/blkdev.h>
242 #include <asm/system.h>
243 #include <linux/errno.h>
244 #include <linux/string.h>
245 #include <linux/wait.h>
246 #include <linux/ioport.h>
247 #include <linux/delay.h>
248 #include <linux/proc_fs.h>
249 #include <linux/interrupt.h>
250 #include <linux/init.h>
251 #include <linux/kernel.h>
252 #include <linux/isapnp.h>
253 #include <linux/spinlock.h>
254 #include <linux/workqueue.h>
255 #include <linux/list.h>
256 #include <asm/semaphore.h>
257 #include <scsi/scsicam.h>
259 #include "scsi.h"
260 #include <scsi/scsi_dbg.h>
261 #include <scsi/scsi_host.h>
262 #include <scsi/scsi_transport_spi.h>
263 #include "aha152x.h"
265 static LIST_HEAD(aha152x_host_list);
268 /* DEFINES */
270 /* For PCMCIA cards, always use AUTOCONF */
271 #if defined(PCMCIA) || defined(MODULE)
272 #if !defined(AUTOCONF)
273 #define AUTOCONF
274 #endif
275 #endif
277 #if !defined(AUTOCONF) && !defined(SETUP0)
278 #error define AUTOCONF or SETUP0
279 #endif
281 #if defined(AHA152X_DEBUG)
282 #define DEBUG_DEFAULT debug_eh
284 #define DPRINTK(when,msgs...) \
285 do { if(HOSTDATA(shpnt)->debug & (when)) printk(msgs); } while(0)
287 #define DO_LOCK(flags) \
288 do { \
289 if(spin_is_locked(&QLOCK)) { \
290 DPRINTK(debug_intr, DEBUG_LEAD "(%s:%d) already locked at %s:%d\n", CMDINFO(CURRENT_SC), __FUNCTION__, __LINE__, QLOCKER, QLOCKERL); \
292 DPRINTK(debug_locks, DEBUG_LEAD "(%s:%d) locking\n", CMDINFO(CURRENT_SC), __FUNCTION__, __LINE__); \
293 spin_lock_irqsave(&QLOCK,flags); \
294 DPRINTK(debug_locks, DEBUG_LEAD "(%s:%d) locked\n", CMDINFO(CURRENT_SC), __FUNCTION__, __LINE__); \
295 QLOCKER=__FUNCTION__; \
296 QLOCKERL=__LINE__; \
297 } while(0)
299 #define DO_UNLOCK(flags) \
300 do { \
301 DPRINTK(debug_locks, DEBUG_LEAD "(%s:%d) unlocking (locked at %s:%d)\n", CMDINFO(CURRENT_SC), __FUNCTION__, __LINE__, QLOCKER, QLOCKERL); \
302 spin_unlock_irqrestore(&QLOCK,flags); \
303 DPRINTK(debug_locks, DEBUG_LEAD "(%s:%d) unlocked\n", CMDINFO(CURRENT_SC), __FUNCTION__, __LINE__); \
304 QLOCKER="(not locked)"; \
305 QLOCKERL=0; \
306 } while(0)
308 #else
309 #define DPRINTK(when,msgs...)
310 #define DO_LOCK(flags) spin_lock_irqsave(&QLOCK,flags)
311 #define DO_UNLOCK(flags) spin_unlock_irqrestore(&QLOCK,flags)
312 #endif
314 #define LEAD "(scsi%d:%d:%d) "
315 #define WARN_LEAD KERN_WARNING LEAD
316 #define INFO_LEAD KERN_INFO LEAD
317 #define NOTE_LEAD KERN_NOTICE LEAD
318 #define ERR_LEAD KERN_ERR LEAD
319 #define DEBUG_LEAD KERN_DEBUG LEAD
320 #define CMDINFO(cmd) \
321 (cmd) ? ((cmd)->device->host->host_no) : -1, \
322 (cmd) ? ((cmd)->device->id & 0x0f) : -1, \
323 (cmd) ? ((cmd)->device->lun & 0x07) : -1
325 #define DELAY_DEFAULT 1000
327 #if defined(PCMCIA)
328 #define IRQ_MIN 0
329 #define IRQ_MAX 16
330 #else
331 #define IRQ_MIN 9
332 #if defined(__PPC)
333 #define IRQ_MAX (NR_IRQS-1)
334 #else
335 #define IRQ_MAX 12
336 #endif
337 #endif
339 enum {
340 not_issued = 0x0001, /* command not yet issued */
341 selecting = 0x0002, /* target is beeing selected */
342 identified = 0x0004, /* IDENTIFY was sent */
343 disconnected = 0x0008, /* target disconnected */
344 completed = 0x0010, /* target sent COMMAND COMPLETE */
345 aborted = 0x0020, /* ABORT was sent */
346 resetted = 0x0040, /* BUS DEVICE RESET was sent */
347 spiordy = 0x0080, /* waiting for SPIORDY to raise */
348 syncneg = 0x0100, /* synchronous negotiation in progress */
349 aborting = 0x0200, /* ABORT is pending */
350 resetting = 0x0400, /* BUS DEVICE RESET is pending */
351 check_condition = 0x0800, /* requesting sense after CHECK CONDITION */
354 MODULE_AUTHOR("Jürgen Fischer");
355 MODULE_DESCRIPTION(AHA152X_REVID);
356 MODULE_LICENSE("GPL");
358 #if !defined(PCMCIA)
359 #if defined(MODULE)
360 static int io[] = {0, 0};
361 module_param_array(io, int, NULL, 0);
362 MODULE_PARM_DESC(io,"base io address of controller");
364 static int irq[] = {0, 0};
365 module_param_array(irq, int, NULL, 0);
366 MODULE_PARM_DESC(irq,"interrupt for controller");
368 static int scsiid[] = {7, 7};
369 module_param_array(scsiid, int, NULL, 0);
370 MODULE_PARM_DESC(scsiid,"scsi id of controller");
372 static int reconnect[] = {1, 1};
373 module_param_array(reconnect, int, NULL, 0);
374 MODULE_PARM_DESC(reconnect,"allow targets to disconnect");
376 static int parity[] = {1, 1};
377 module_param_array(parity, int, NULL, 0);
378 MODULE_PARM_DESC(parity,"use scsi parity");
380 static int sync[] = {1, 1};
381 module_param_array(sync, int, NULL, 0);
382 MODULE_PARM_DESC(sync,"use synchronous transfers");
384 static int delay[] = {DELAY_DEFAULT, DELAY_DEFAULT};
385 module_param_array(delay, int, NULL, 0);
386 MODULE_PARM_DESC(delay,"scsi reset delay");
388 static int exttrans[] = {0, 0};
389 module_param_array(exttrans, int, NULL, 0);
390 MODULE_PARM_DESC(exttrans,"use extended translation");
392 #if !defined(AHA152X_DEBUG)
393 static int aha152x[] = {0, 11, 7, 1, 1, 0, DELAY_DEFAULT, 0};
394 module_param_array(aha152x, int, NULL, 0);
395 MODULE_PARM_DESC(aha152x, "parameters for first controller");
397 static int aha152x1[] = {0, 11, 7, 1, 1, 0, DELAY_DEFAULT, 0};
398 module_param_array(aha152x1, int, NULL, 0);
399 MODULE_PARM_DESC(aha152x1, "parameters for second controller");
400 #else
401 static int debug[] = {DEBUG_DEFAULT, DEBUG_DEFAULT};
402 module_param_array(debug, int, NULL, 0);
403 MODULE_PARM_DESC(debug, "flags for driver debugging");
405 static int aha152x[] = {0, 11, 7, 1, 1, 1, DELAY_DEFAULT, 0, DEBUG_DEFAULT};
406 module_param_array(aha152x, int, NULL, 0);
407 MODULE_PARM_DESC(aha152x, "parameters for first controller");
409 static int aha152x1[] = {0, 11, 7, 1, 1, 1, DELAY_DEFAULT, 0, DEBUG_DEFAULT};
410 module_param_array(aha152x1, int, NULL, 0);
411 MODULE_PARM_DESC(aha152x1, "parameters for second controller");
412 #endif /* !defined(AHA152X_DEBUG) */
413 #endif /* MODULE */
415 #ifdef __ISAPNP__
416 static struct isapnp_device_id id_table[] __devinitdata = {
417 { ISAPNP_ANY_ID, ISAPNP_ANY_ID,
418 ISAPNP_VENDOR('A','D','P'), ISAPNP_FUNCTION(0x1505), 0 },
419 { ISAPNP_ANY_ID, ISAPNP_ANY_ID,
420 ISAPNP_VENDOR('A','D','P'), ISAPNP_FUNCTION(0x1530), 0 },
421 { ISAPNP_DEVICE_SINGLE_END, }
423 MODULE_DEVICE_TABLE(isapnp, id_table);
424 #endif /* ISAPNP */
426 #endif /* !PCMCIA */
428 static struct scsi_host_template aha152x_driver_template;
431 * internal states of the host
434 enum aha152x_state {
435 idle=0,
436 unknown,
437 seldo,
438 seldi,
439 selto,
440 busfree,
441 msgo,
442 cmd,
443 msgi,
444 status,
445 datai,
446 datao,
447 parerr,
448 rsti,
449 maxstate
453 * current state information of the host
456 struct aha152x_hostdata {
457 Scsi_Cmnd *issue_SC;
458 /* pending commands to issue */
460 Scsi_Cmnd *current_SC;
461 /* current command on the bus */
463 Scsi_Cmnd *disconnected_SC;
464 /* commands that disconnected */
466 Scsi_Cmnd *done_SC;
467 /* command that was completed */
469 spinlock_t lock;
470 /* host lock */
472 #if defined(AHA152X_DEBUG)
473 const char *locker;
474 /* which function has the lock */
475 int lockerl; /* where did it get it */
477 int debug; /* current debugging setting */
478 #endif
480 #if defined(AHA152X_STAT)
481 int total_commands;
482 int disconnections;
483 int busfree_without_any_action;
484 int busfree_without_old_command;
485 int busfree_without_new_command;
486 int busfree_without_done_command;
487 int busfree_with_check_condition;
488 int count[maxstate];
489 int count_trans[maxstate];
490 unsigned long time[maxstate];
491 #endif
493 int commands; /* current number of commands */
495 int reconnect; /* disconnection allowed */
496 int parity; /* parity checking enabled */
497 int synchronous; /* synchronous transferes enabled */
498 int delay; /* reset out delay */
499 int ext_trans; /* extended translation enabled */
501 int swint; /* software-interrupt was fired during detect() */
502 int service; /* bh needs to be run */
503 int in_intr; /* bh is running */
505 /* current state,
506 previous state,
507 last state different from current state */
508 enum aha152x_state state, prevstate, laststate;
510 int target;
511 /* reconnecting target */
513 unsigned char syncrate[8];
514 /* current synchronous transfer agreements */
516 unsigned char syncneg[8];
517 /* 0: no negotiation;
518 * 1: negotiation in progress;
519 * 2: negotiation completed
522 int cmd_i;
523 /* number of sent bytes of current command */
525 int msgi_len;
526 /* number of received message bytes */
527 unsigned char msgi[256];
528 /* received message bytes */
530 int msgo_i, msgo_len;
531 /* number of sent bytes and length of current messages */
532 unsigned char msgo[256];
533 /* pending messages */
535 int data_len;
536 /* number of sent/received bytes in dataphase */
538 unsigned long io_port0;
539 unsigned long io_port1;
541 #ifdef __ISAPNP__
542 struct pnp_dev *pnpdev;
543 #endif
544 struct list_head host_list;
549 * host specific command extension
552 struct aha152x_scdata {
553 Scsi_Cmnd *next; /* next sc in queue */
554 struct semaphore *sem; /* semaphore to block on */
555 unsigned char cmd_len;
556 unsigned char cmnd[MAX_COMMAND_SIZE];
557 unsigned short use_sg;
558 unsigned request_bufflen;
559 void *request_buffer;
563 /* access macros for hostdata */
565 #define HOSTDATA(shpnt) ((struct aha152x_hostdata *) &shpnt->hostdata)
567 #define HOSTNO ((shpnt)->host_no)
569 #define CURRENT_SC (HOSTDATA(shpnt)->current_SC)
570 #define DONE_SC (HOSTDATA(shpnt)->done_SC)
571 #define ISSUE_SC (HOSTDATA(shpnt)->issue_SC)
572 #define DISCONNECTED_SC (HOSTDATA(shpnt)->disconnected_SC)
573 #define QLOCK (HOSTDATA(shpnt)->lock)
574 #define QLOCKER (HOSTDATA(shpnt)->locker)
575 #define QLOCKERL (HOSTDATA(shpnt)->lockerl)
577 #define STATE (HOSTDATA(shpnt)->state)
578 #define PREVSTATE (HOSTDATA(shpnt)->prevstate)
579 #define LASTSTATE (HOSTDATA(shpnt)->laststate)
581 #define RECONN_TARGET (HOSTDATA(shpnt)->target)
583 #define CMD_I (HOSTDATA(shpnt)->cmd_i)
585 #define MSGO(i) (HOSTDATA(shpnt)->msgo[i])
586 #define MSGO_I (HOSTDATA(shpnt)->msgo_i)
587 #define MSGOLEN (HOSTDATA(shpnt)->msgo_len)
588 #define ADDMSGO(x) (MSGOLEN<256 ? (void)(MSGO(MSGOLEN++)=x) : aha152x_error(shpnt,"MSGO overflow"))
590 #define MSGI(i) (HOSTDATA(shpnt)->msgi[i])
591 #define MSGILEN (HOSTDATA(shpnt)->msgi_len)
592 #define ADDMSGI(x) (MSGILEN<256 ? (void)(MSGI(MSGILEN++)=x) : aha152x_error(shpnt,"MSGI overflow"))
594 #define DATA_LEN (HOSTDATA(shpnt)->data_len)
596 #define SYNCRATE (HOSTDATA(shpnt)->syncrate[CURRENT_SC->device->id])
597 #define SYNCNEG (HOSTDATA(shpnt)->syncneg[CURRENT_SC->device->id])
599 #define DELAY (HOSTDATA(shpnt)->delay)
600 #define EXT_TRANS (HOSTDATA(shpnt)->ext_trans)
601 #define TC1550 (HOSTDATA(shpnt)->tc1550)
602 #define RECONNECT (HOSTDATA(shpnt)->reconnect)
603 #define PARITY (HOSTDATA(shpnt)->parity)
604 #define SYNCHRONOUS (HOSTDATA(shpnt)->synchronous)
606 #define HOSTIOPORT0 (HOSTDATA(shpnt)->io_port0)
607 #define HOSTIOPORT1 (HOSTDATA(shpnt)->io_port1)
609 #define SCDATA(SCpnt) ((struct aha152x_scdata *) (SCpnt)->host_scribble)
610 #define SCNEXT(SCpnt) SCDATA(SCpnt)->next
611 #define SCSEM(SCpnt) SCDATA(SCpnt)->sem
613 #define SG_ADDRESS(buffer) ((char *) (page_address((buffer)->page)+(buffer)->offset))
615 /* state handling */
616 static void seldi_run(struct Scsi_Host *shpnt);
617 static void seldo_run(struct Scsi_Host *shpnt);
618 static void selto_run(struct Scsi_Host *shpnt);
619 static void busfree_run(struct Scsi_Host *shpnt);
621 static void msgo_init(struct Scsi_Host *shpnt);
622 static void msgo_run(struct Scsi_Host *shpnt);
623 static void msgo_end(struct Scsi_Host *shpnt);
625 static void cmd_init(struct Scsi_Host *shpnt);
626 static void cmd_run(struct Scsi_Host *shpnt);
627 static void cmd_end(struct Scsi_Host *shpnt);
629 static void datai_init(struct Scsi_Host *shpnt);
630 static void datai_run(struct Scsi_Host *shpnt);
631 static void datai_end(struct Scsi_Host *shpnt);
633 static void datao_init(struct Scsi_Host *shpnt);
634 static void datao_run(struct Scsi_Host *shpnt);
635 static void datao_end(struct Scsi_Host *shpnt);
637 static void status_run(struct Scsi_Host *shpnt);
639 static void msgi_run(struct Scsi_Host *shpnt);
640 static void msgi_end(struct Scsi_Host *shpnt);
642 static void parerr_run(struct Scsi_Host *shpnt);
643 static void rsti_run(struct Scsi_Host *shpnt);
645 static void is_complete(struct Scsi_Host *shpnt);
648 * driver states
651 static struct {
652 char *name;
653 void (*init)(struct Scsi_Host *);
654 void (*run)(struct Scsi_Host *);
655 void (*end)(struct Scsi_Host *);
656 int spio;
657 } states[] = {
658 { "idle", NULL, NULL, NULL, 0},
659 { "unknown", NULL, NULL, NULL, 0},
660 { "seldo", NULL, seldo_run, NULL, 0},
661 { "seldi", NULL, seldi_run, NULL, 0},
662 { "selto", NULL, selto_run, NULL, 0},
663 { "busfree", NULL, busfree_run, NULL, 0},
664 { "msgo", msgo_init, msgo_run, msgo_end, 1},
665 { "cmd", cmd_init, cmd_run, cmd_end, 1},
666 { "msgi", NULL, msgi_run, msgi_end, 1},
667 { "status", NULL, status_run, NULL, 1},
668 { "datai", datai_init, datai_run, datai_end, 0},
669 { "datao", datao_init, datao_run, datao_end, 0},
670 { "parerr", NULL, parerr_run, NULL, 0},
671 { "rsti", NULL, rsti_run, NULL, 0},
674 /* setup & interrupt */
675 static irqreturn_t intr(int irq, void *dev_id);
676 static void reset_ports(struct Scsi_Host *shpnt);
677 static void aha152x_error(struct Scsi_Host *shpnt, char *msg);
678 static void done(struct Scsi_Host *shpnt, int error);
680 /* diagnostics */
681 static void disp_ports(struct Scsi_Host *shpnt);
682 static void show_command(Scsi_Cmnd * ptr);
683 static void show_queues(struct Scsi_Host *shpnt);
684 static void disp_enintr(struct Scsi_Host *shpnt);
688 * queue services:
691 static inline void append_SC(Scsi_Cmnd **SC, Scsi_Cmnd *new_SC)
693 Scsi_Cmnd *end;
695 SCNEXT(new_SC) = NULL;
696 if (!*SC)
697 *SC = new_SC;
698 else {
699 for (end = *SC; SCNEXT(end); end = SCNEXT(end))
701 SCNEXT(end) = new_SC;
705 static inline Scsi_Cmnd *remove_first_SC(Scsi_Cmnd ** SC)
707 Scsi_Cmnd *ptr;
709 ptr = *SC;
710 if (ptr) {
711 *SC = SCNEXT(*SC);
712 SCNEXT(ptr)=NULL;
714 return ptr;
717 static inline Scsi_Cmnd *remove_lun_SC(Scsi_Cmnd ** SC, int target, int lun)
719 Scsi_Cmnd *ptr, *prev;
721 for (ptr = *SC, prev = NULL;
722 ptr && ((ptr->device->id != target) || (ptr->device->lun != lun));
723 prev = ptr, ptr = SCNEXT(ptr))
726 if (ptr) {
727 if (prev)
728 SCNEXT(prev) = SCNEXT(ptr);
729 else
730 *SC = SCNEXT(ptr);
732 SCNEXT(ptr)=NULL;
735 return ptr;
738 static inline Scsi_Cmnd *remove_SC(Scsi_Cmnd **SC, Scsi_Cmnd *SCp)
740 Scsi_Cmnd *ptr, *prev;
742 for (ptr = *SC, prev = NULL;
743 ptr && SCp!=ptr;
744 prev = ptr, ptr = SCNEXT(ptr))
747 if (ptr) {
748 if (prev)
749 SCNEXT(prev) = SCNEXT(ptr);
750 else
751 *SC = SCNEXT(ptr);
753 SCNEXT(ptr)=NULL;
756 return ptr;
759 static irqreturn_t swintr(int irqno, void *dev_id)
761 struct Scsi_Host *shpnt = dev_id;
763 HOSTDATA(shpnt)->swint++;
765 SETPORT(DMACNTRL0, INTEN);
766 return IRQ_HANDLED;
769 struct Scsi_Host *aha152x_probe_one(struct aha152x_setup *setup)
771 struct Scsi_Host *shpnt;
773 shpnt = scsi_host_alloc(&aha152x_driver_template, sizeof(struct aha152x_hostdata));
774 if (!shpnt) {
775 printk(KERN_ERR "aha152x: scsi_host_alloc failed\n");
776 return NULL;
779 memset(HOSTDATA(shpnt), 0, sizeof *HOSTDATA(shpnt));
780 INIT_LIST_HEAD(&HOSTDATA(shpnt)->host_list);
782 /* need to have host registered before triggering any interrupt */
783 list_add_tail(&HOSTDATA(shpnt)->host_list, &aha152x_host_list);
785 shpnt->io_port = setup->io_port;
786 shpnt->n_io_port = IO_RANGE;
787 shpnt->irq = setup->irq;
789 if (!setup->tc1550) {
790 HOSTIOPORT0 = setup->io_port;
791 HOSTIOPORT1 = setup->io_port;
792 } else {
793 HOSTIOPORT0 = setup->io_port+0x10;
794 HOSTIOPORT1 = setup->io_port-0x10;
797 spin_lock_init(&QLOCK);
798 RECONNECT = setup->reconnect;
799 SYNCHRONOUS = setup->synchronous;
800 PARITY = setup->parity;
801 DELAY = setup->delay;
802 EXT_TRANS = setup->ext_trans;
804 #if defined(AHA152X_DEBUG)
805 HOSTDATA(shpnt)->debug = setup->debug;
806 #endif
808 SETPORT(SCSIID, setup->scsiid << 4);
809 shpnt->this_id = setup->scsiid;
811 if (setup->reconnect)
812 shpnt->can_queue = AHA152X_MAXQUEUE;
814 /* RESET OUT */
815 printk("aha152x: resetting bus...\n");
816 SETPORT(SCSISEQ, SCSIRSTO);
817 mdelay(256);
818 SETPORT(SCSISEQ, 0);
819 mdelay(DELAY);
821 reset_ports(shpnt);
823 printk(KERN_INFO
824 "aha152x%d%s: "
825 "vital data: rev=%x, "
826 "io=0x%03lx (0x%03lx/0x%03lx), "
827 "irq=%d, "
828 "scsiid=%d, "
829 "reconnect=%s, "
830 "parity=%s, "
831 "synchronous=%s, "
832 "delay=%d, "
833 "extended translation=%s\n",
834 shpnt->host_no, setup->tc1550 ? " (tc1550 mode)" : "",
835 GETPORT(REV) & 0x7,
836 shpnt->io_port, HOSTIOPORT0, HOSTIOPORT1,
837 shpnt->irq,
838 shpnt->this_id,
839 RECONNECT ? "enabled" : "disabled",
840 PARITY ? "enabled" : "disabled",
841 SYNCHRONOUS ? "enabled" : "disabled",
842 DELAY,
843 EXT_TRANS ? "enabled" : "disabled");
845 /* not expecting any interrupts */
846 SETPORT(SIMODE0, 0);
847 SETPORT(SIMODE1, 0);
849 if( request_irq(shpnt->irq, swintr, IRQF_DISABLED|IRQF_SHARED, "aha152x", shpnt) ) {
850 printk(KERN_ERR "aha152x%d: irq %d busy.\n", shpnt->host_no, shpnt->irq);
851 goto out_host_put;
854 HOSTDATA(shpnt)->swint = 0;
856 printk(KERN_INFO "aha152x%d: trying software interrupt, ", shpnt->host_no);
858 mb();
859 SETPORT(DMACNTRL0, SWINT|INTEN);
860 mdelay(1000);
861 free_irq(shpnt->irq, shpnt);
863 if (!HOSTDATA(shpnt)->swint) {
864 if (TESTHI(DMASTAT, INTSTAT)) {
865 printk("lost.\n");
866 } else {
867 printk("failed.\n");
870 SETPORT(DMACNTRL0, INTEN);
872 printk(KERN_ERR "aha152x%d: irq %d possibly wrong. "
873 "Please verify.\n", shpnt->host_no, shpnt->irq);
874 goto out_host_put;
876 printk("ok.\n");
879 /* clear interrupts */
880 SETPORT(SSTAT0, 0x7f);
881 SETPORT(SSTAT1, 0xef);
883 if ( request_irq(shpnt->irq, intr, IRQF_DISABLED|IRQF_SHARED, "aha152x", shpnt) ) {
884 printk(KERN_ERR "aha152x%d: failed to reassign irq %d.\n", shpnt->host_no, shpnt->irq);
885 goto out_host_put;
888 if( scsi_add_host(shpnt, NULL) ) {
889 free_irq(shpnt->irq, shpnt);
890 printk(KERN_ERR "aha152x%d: failed to add host.\n", shpnt->host_no);
891 goto out_host_put;
894 scsi_scan_host(shpnt);
896 return shpnt;
898 out_host_put:
899 list_del(&HOSTDATA(shpnt)->host_list);
900 scsi_host_put(shpnt);
902 return NULL;
905 void aha152x_release(struct Scsi_Host *shpnt)
907 if(!shpnt)
908 return;
910 if (shpnt->irq)
911 free_irq(shpnt->irq, shpnt);
913 #if !defined(PCMCIA)
914 if (shpnt->io_port)
915 release_region(shpnt->io_port, IO_RANGE);
916 #endif
918 #ifdef __ISAPNP__
919 if (HOSTDATA(shpnt)->pnpdev)
920 pnp_device_detach(HOSTDATA(shpnt)->pnpdev);
921 #endif
923 scsi_remove_host(shpnt);
924 list_del(&HOSTDATA(shpnt)->host_list);
925 scsi_host_put(shpnt);
930 * setup controller to generate interrupts depending
931 * on current state (lock has to be acquired)
934 static int setup_expected_interrupts(struct Scsi_Host *shpnt)
936 if(CURRENT_SC) {
937 CURRENT_SC->SCp.phase |= 1 << 16;
939 if(CURRENT_SC->SCp.phase & selecting) {
940 DPRINTK(debug_intr, DEBUG_LEAD "expecting: (seldo) (seltimo) (seldi)\n", CMDINFO(CURRENT_SC));
941 SETPORT(SSTAT1, SELTO);
942 SETPORT(SIMODE0, ENSELDO | (DISCONNECTED_SC ? ENSELDI : 0));
943 SETPORT(SIMODE1, ENSELTIMO);
944 } else {
945 DPRINTK(debug_intr, DEBUG_LEAD "expecting: (phase change) (busfree) %s\n", CMDINFO(CURRENT_SC), CURRENT_SC->SCp.phase & spiordy ? "(spiordy)" : "");
946 SETPORT(SIMODE0, (CURRENT_SC->SCp.phase & spiordy) ? ENSPIORDY : 0);
947 SETPORT(SIMODE1, ENPHASEMIS | ENSCSIRST | ENSCSIPERR | ENBUSFREE);
949 } else if(STATE==seldi) {
950 DPRINTK(debug_intr, DEBUG_LEAD "expecting: (phase change) (identify)\n", CMDINFO(CURRENT_SC));
951 SETPORT(SIMODE0, 0);
952 SETPORT(SIMODE1, ENPHASEMIS | ENSCSIRST | ENSCSIPERR | ENBUSFREE);
953 } else {
954 DPRINTK(debug_intr, DEBUG_LEAD "expecting: %s %s\n",
955 CMDINFO(CURRENT_SC),
956 DISCONNECTED_SC ? "(reselection)" : "",
957 ISSUE_SC ? "(busfree)" : "");
958 SETPORT(SIMODE0, DISCONNECTED_SC ? ENSELDI : 0);
959 SETPORT(SIMODE1, ENSCSIRST | ( (ISSUE_SC||DONE_SC) ? ENBUSFREE : 0));
962 if(!HOSTDATA(shpnt)->in_intr)
963 SETBITS(DMACNTRL0, INTEN);
965 return TESTHI(DMASTAT, INTSTAT);
970 * Queue a command and setup interrupts for a free bus.
972 static int aha152x_internal_queue(Scsi_Cmnd *SCpnt, struct semaphore *sem, int phase, void (*done)(Scsi_Cmnd *))
974 struct Scsi_Host *shpnt = SCpnt->device->host;
975 unsigned long flags;
977 #if defined(AHA152X_DEBUG)
978 if (HOSTDATA(shpnt)->debug & debug_queue) {
979 printk(INFO_LEAD "queue: %p; cmd_len=%d pieces=%d size=%u cmnd=",
980 CMDINFO(SCpnt), SCpnt, SCpnt->cmd_len, SCpnt->use_sg, SCpnt->request_bufflen);
981 __scsi_print_command(SCpnt->cmnd);
983 #endif
985 SCpnt->scsi_done = done;
986 SCpnt->resid = SCpnt->request_bufflen;
987 SCpnt->SCp.phase = not_issued | phase;
988 SCpnt->SCp.Status = CHECK_CONDITION;
989 SCpnt->SCp.Message = 0;
990 SCpnt->SCp.have_data_in = 0;
991 SCpnt->SCp.sent_command = 0;
993 if(SCpnt->SCp.phase & (resetting|check_condition)) {
994 if(SCpnt->host_scribble==0 || SCSEM(SCpnt) || SCNEXT(SCpnt)) {
995 printk(ERR_LEAD "cannot reuse command\n", CMDINFO(SCpnt));
996 return FAILED;
998 } else {
999 struct aha152x_scdata *sc;
1001 SCpnt->host_scribble = kmalloc(sizeof(struct aha152x_scdata), GFP_ATOMIC);
1002 if(SCpnt->host_scribble==0) {
1003 printk(ERR_LEAD "allocation failed\n", CMDINFO(SCpnt));
1004 return FAILED;
1007 sc = SCDATA(SCpnt);
1008 memcpy(sc->cmnd, SCpnt->cmnd, sizeof(sc->cmnd));
1009 sc->request_buffer = SCpnt->request_buffer;
1010 sc->request_bufflen = SCpnt->request_bufflen;
1011 sc->use_sg = SCpnt->use_sg;
1012 sc->cmd_len = SCpnt->cmd_len;
1015 SCNEXT(SCpnt) = NULL;
1016 SCSEM(SCpnt) = sem;
1018 /* setup scratch area
1019 SCp.ptr : buffer pointer
1020 SCp.this_residual : buffer length
1021 SCp.buffer : next buffer
1022 SCp.buffers_residual : left buffers in list
1023 SCp.phase : current state of the command */
1024 if (SCpnt->use_sg) {
1025 SCpnt->SCp.buffer = (struct scatterlist *) SCpnt->request_buffer;
1026 SCpnt->SCp.ptr = SG_ADDRESS(SCpnt->SCp.buffer);
1027 SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length;
1028 SCpnt->SCp.buffers_residual = SCpnt->use_sg - 1;
1029 } else {
1030 SCpnt->SCp.ptr = (char *) SCpnt->request_buffer;
1031 SCpnt->SCp.this_residual = SCpnt->request_bufflen;
1032 SCpnt->SCp.buffer = NULL;
1033 SCpnt->SCp.buffers_residual = 0;
1036 DO_LOCK(flags);
1038 #if defined(AHA152X_STAT)
1039 HOSTDATA(shpnt)->total_commands++;
1040 #endif
1042 /* Turn led on, when this is the first command. */
1043 HOSTDATA(shpnt)->commands++;
1044 if (HOSTDATA(shpnt)->commands==1)
1045 SETPORT(PORTA, 1);
1047 append_SC(&ISSUE_SC, SCpnt);
1049 if(!HOSTDATA(shpnt)->in_intr)
1050 setup_expected_interrupts(shpnt);
1052 DO_UNLOCK(flags);
1054 return 0;
1058 * queue a command
1061 static int aha152x_queue(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *))
1063 #if 0
1064 if(*SCpnt->cmnd == REQUEST_SENSE) {
1065 SCpnt->result = 0;
1066 done(SCpnt);
1068 return 0;
1070 #endif
1072 return aha152x_internal_queue(SCpnt, NULL, 0, done);
1080 static void reset_done(Scsi_Cmnd *SCpnt)
1082 #if 0
1083 struct Scsi_Host *shpnt = SCpnt->host;
1084 DPRINTK(debug_eh, INFO_LEAD "reset_done called\n", CMDINFO(SCpnt));
1085 #endif
1086 if(SCSEM(SCpnt)) {
1087 up(SCSEM(SCpnt));
1088 } else {
1089 printk(KERN_ERR "aha152x: reset_done w/o semaphore\n");
1094 * Abort a command
1097 static int aha152x_abort(Scsi_Cmnd *SCpnt)
1099 struct Scsi_Host *shpnt = SCpnt->device->host;
1100 Scsi_Cmnd *ptr;
1101 unsigned long flags;
1103 #if defined(AHA152X_DEBUG)
1104 if(HOSTDATA(shpnt)->debug & debug_eh) {
1105 printk(DEBUG_LEAD "abort(%p)", CMDINFO(SCpnt), SCpnt);
1106 show_queues(shpnt);
1108 #endif
1110 DO_LOCK(flags);
1112 ptr=remove_SC(&ISSUE_SC, SCpnt);
1114 if(ptr) {
1115 DPRINTK(debug_eh, DEBUG_LEAD "not yet issued - SUCCESS\n", CMDINFO(SCpnt));
1117 HOSTDATA(shpnt)->commands--;
1118 if (!HOSTDATA(shpnt)->commands)
1119 SETPORT(PORTA, 0);
1120 DO_UNLOCK(flags);
1122 kfree(SCpnt->host_scribble);
1123 SCpnt->host_scribble=NULL;
1125 return SUCCESS;
1128 DO_UNLOCK(flags);
1131 * FIXME:
1132 * for current command: queue ABORT for message out and raise ATN
1133 * for disconnected command: pseudo SC with ABORT message or ABORT on reselection?
1137 printk(ERR_LEAD "cannot abort running or disconnected command\n", CMDINFO(SCpnt));
1139 return FAILED;
1142 static void timer_expired(unsigned long p)
1144 Scsi_Cmnd *SCp = (Scsi_Cmnd *)p;
1145 struct semaphore *sem = SCSEM(SCp);
1146 struct Scsi_Host *shpnt = SCp->device->host;
1147 unsigned long flags;
1149 /* remove command from issue queue */
1150 DO_LOCK(flags);
1151 remove_SC(&ISSUE_SC, SCp);
1152 DO_UNLOCK(flags);
1154 up(sem);
1158 * Reset a device
1161 static int aha152x_device_reset(Scsi_Cmnd * SCpnt)
1163 struct Scsi_Host *shpnt = SCpnt->device->host;
1164 DECLARE_MUTEX_LOCKED(sem);
1165 struct timer_list timer;
1166 int ret, issued, disconnected;
1167 unsigned char old_cmd_len = SCpnt->cmd_len;
1168 unsigned short old_use_sg = SCpnt->use_sg;
1169 void *old_buffer = SCpnt->request_buffer;
1170 unsigned old_bufflen = SCpnt->request_bufflen;
1171 unsigned long flags;
1173 #if defined(AHA152X_DEBUG)
1174 if(HOSTDATA(shpnt)->debug & debug_eh) {
1175 printk(INFO_LEAD "aha152x_device_reset(%p)", CMDINFO(SCpnt), SCpnt);
1176 show_queues(shpnt);
1178 #endif
1180 if(CURRENT_SC==SCpnt) {
1181 printk(ERR_LEAD "cannot reset current device\n", CMDINFO(SCpnt));
1182 return FAILED;
1185 DO_LOCK(flags);
1186 issued = remove_SC(&ISSUE_SC, SCpnt)==0;
1187 disconnected = issued && remove_SC(&DISCONNECTED_SC, SCpnt);
1188 DO_UNLOCK(flags);
1190 SCpnt->cmd_len = 0;
1191 SCpnt->use_sg = 0;
1192 SCpnt->request_buffer = NULL;
1193 SCpnt->request_bufflen = 0;
1195 init_timer(&timer);
1196 timer.data = (unsigned long) SCpnt;
1197 timer.expires = jiffies + 100*HZ; /* 10s */
1198 timer.function = (void (*)(unsigned long)) timer_expired;
1200 aha152x_internal_queue(SCpnt, &sem, resetting, reset_done);
1201 add_timer(&timer);
1202 down(&sem);
1203 del_timer(&timer);
1205 SCpnt->cmd_len = old_cmd_len;
1206 SCpnt->use_sg = old_use_sg;
1207 SCpnt->request_buffer = old_buffer;
1208 SCpnt->request_bufflen = old_bufflen;
1210 DO_LOCK(flags);
1212 if(SCpnt->SCp.phase & resetted) {
1213 HOSTDATA(shpnt)->commands--;
1214 if (!HOSTDATA(shpnt)->commands)
1215 SETPORT(PORTA, 0);
1216 kfree(SCpnt->host_scribble);
1217 SCpnt->host_scribble=NULL;
1219 ret = SUCCESS;
1220 } else {
1221 /* requeue */
1222 if(!issued) {
1223 append_SC(&ISSUE_SC, SCpnt);
1224 } else if(disconnected) {
1225 append_SC(&DISCONNECTED_SC, SCpnt);
1228 ret = FAILED;
1231 DO_UNLOCK(flags);
1232 return ret;
1235 static void free_hard_reset_SCs(struct Scsi_Host *shpnt, Scsi_Cmnd **SCs)
1237 Scsi_Cmnd *ptr;
1239 ptr=*SCs;
1240 while(ptr) {
1241 Scsi_Cmnd *next;
1243 if(SCDATA(ptr)) {
1244 next = SCNEXT(ptr);
1245 } else {
1246 printk(DEBUG_LEAD "queue corrupted at %p\n", CMDINFO(ptr), ptr);
1247 next = NULL;
1250 if (!ptr->device->soft_reset) {
1251 DPRINTK(debug_eh, DEBUG_LEAD "disconnected command %p removed\n", CMDINFO(ptr), ptr);
1252 remove_SC(SCs, ptr);
1253 HOSTDATA(shpnt)->commands--;
1254 kfree(ptr->host_scribble);
1255 ptr->host_scribble=NULL;
1258 ptr = next;
1263 * Reset the bus
1266 static int aha152x_bus_reset_host(struct Scsi_Host *shpnt)
1268 unsigned long flags;
1270 DO_LOCK(flags);
1272 #if defined(AHA152X_DEBUG)
1273 if(HOSTDATA(shpnt)->debug & debug_eh) {
1274 printk(KERN_DEBUG "scsi%d: bus reset", shpnt->host_no);
1275 show_queues(shpnt);
1277 #endif
1279 free_hard_reset_SCs(shpnt, &ISSUE_SC);
1280 free_hard_reset_SCs(shpnt, &DISCONNECTED_SC);
1282 DPRINTK(debug_eh, KERN_DEBUG "scsi%d: resetting bus\n", shpnt->host_no);
1284 SETPORT(SCSISEQ, SCSIRSTO);
1285 mdelay(256);
1286 SETPORT(SCSISEQ, 0);
1287 mdelay(DELAY);
1289 DPRINTK(debug_eh, KERN_DEBUG "scsi%d: bus resetted\n", shpnt->host_no);
1291 setup_expected_interrupts(shpnt);
1292 if(HOSTDATA(shpnt)->commands==0)
1293 SETPORT(PORTA, 0);
1295 DO_UNLOCK(flags);
1297 return SUCCESS;
1301 * Reset the bus
1304 static int aha152x_bus_reset(Scsi_Cmnd *SCpnt)
1306 return aha152x_bus_reset_host(SCpnt->device->host);
1310 * Restore default values to the AIC-6260 registers and reset the fifos
1313 static void reset_ports(struct Scsi_Host *shpnt)
1315 unsigned long flags;
1317 /* disable interrupts */
1318 SETPORT(DMACNTRL0, RSTFIFO);
1320 SETPORT(SCSISEQ, 0);
1322 SETPORT(SXFRCTL1, 0);
1323 SETPORT(SCSISIG, 0);
1324 SETRATE(0);
1326 /* clear all interrupt conditions */
1327 SETPORT(SSTAT0, 0x7f);
1328 SETPORT(SSTAT1, 0xef);
1330 SETPORT(SSTAT4, SYNCERR | FWERR | FRERR);
1332 SETPORT(DMACNTRL0, 0);
1333 SETPORT(DMACNTRL1, 0);
1335 SETPORT(BRSTCNTRL, 0xf1);
1337 /* clear SCSI fifos and transfer count */
1338 SETPORT(SXFRCTL0, CH1|CLRCH1|CLRSTCNT);
1339 SETPORT(SXFRCTL0, CH1);
1341 DO_LOCK(flags);
1342 setup_expected_interrupts(shpnt);
1343 DO_UNLOCK(flags);
1347 * Reset the host (bus and controller)
1350 int aha152x_host_reset_host(struct Scsi_Host *shpnt)
1352 DPRINTK(debug_eh, KERN_DEBUG "scsi%d: host reset\n", shpnt->host_no);
1354 aha152x_bus_reset_host(shpnt);
1356 DPRINTK(debug_eh, KERN_DEBUG "scsi%d: resetting ports\n", shpnt->host_no);
1357 reset_ports(shpnt);
1359 return SUCCESS;
1363 * Reset the host (bus and controller)
1366 static int aha152x_host_reset(Scsi_Cmnd *SCpnt)
1368 return aha152x_host_reset_host(SCpnt->device->host);
1372 * Return the "logical geometry"
1375 static int aha152x_biosparam(struct scsi_device *sdev, struct block_device *bdev,
1376 sector_t capacity, int *info_array)
1378 struct Scsi_Host *shpnt = sdev->host;
1380 /* try default translation */
1381 info_array[0] = 64;
1382 info_array[1] = 32;
1383 info_array[2] = (unsigned long)capacity / (64 * 32);
1385 /* for disks >1GB do some guessing */
1386 if (info_array[2] >= 1024) {
1387 int info[3];
1389 /* try to figure out the geometry from the partition table */
1390 if (scsicam_bios_param(bdev, capacity, info) < 0 ||
1391 !((info[0] == 64 && info[1] == 32) || (info[0] == 255 && info[1] == 63))) {
1392 if (EXT_TRANS) {
1393 printk(KERN_NOTICE
1394 "aha152x: unable to verify geometry for disk with >1GB.\n"
1395 " using extended translation.\n");
1396 info_array[0] = 255;
1397 info_array[1] = 63;
1398 info_array[2] = (unsigned long)capacity / (255 * 63);
1399 } else {
1400 printk(KERN_NOTICE
1401 "aha152x: unable to verify geometry for disk with >1GB.\n"
1402 " Using default translation. Please verify yourself.\n"
1403 " Perhaps you need to enable extended translation in the driver.\n"
1404 " See Documentation/scsi/aha152x.txt for details.\n");
1406 } else {
1407 info_array[0] = info[0];
1408 info_array[1] = info[1];
1409 info_array[2] = info[2];
1411 if (info[0] == 255 && !EXT_TRANS) {
1412 printk(KERN_NOTICE
1413 "aha152x: current partition table is using extended translation.\n"
1414 " using it also, although it's not explicitly enabled.\n");
1419 return 0;
1423 * Internal done function
1426 static void done(struct Scsi_Host *shpnt, int error)
1428 if (CURRENT_SC) {
1429 if(DONE_SC)
1430 printk(ERR_LEAD "there's already a completed command %p - will cause abort\n", CMDINFO(CURRENT_SC), DONE_SC);
1432 DONE_SC = CURRENT_SC;
1433 CURRENT_SC = NULL;
1434 DONE_SC->result = error;
1435 } else
1436 printk(KERN_ERR "aha152x: done() called outside of command\n");
1439 static struct work_struct aha152x_tq;
1442 * Run service completions on the card with interrupts enabled.
1445 static void run(struct work_struct *work)
1447 struct aha152x_hostdata *hd;
1449 list_for_each_entry(hd, &aha152x_host_list, host_list) {
1450 struct Scsi_Host *shost = container_of((void *)hd, struct Scsi_Host, hostdata);
1452 is_complete(shost);
1457 * Interrupt handler
1460 static irqreturn_t intr(int irqno, void *dev_id)
1462 struct Scsi_Host *shpnt = (struct Scsi_Host *)dev_id;
1463 unsigned long flags;
1464 unsigned char rev, dmacntrl0;
1466 if (!shpnt) {
1467 printk(KERN_ERR "aha152x: catched interrupt %d for unknown controller.\n", irqno);
1468 return IRQ_NONE;
1472 * Read a couple of registers that are known to not be all 1's. If
1473 * we read all 1's (-1), that means that either:
1475 * a. The host adapter chip has gone bad, and we cannot control it,
1476 * OR
1477 * b. The host adapter is a PCMCIA card that has been ejected
1479 * In either case, we cannot do anything with the host adapter at
1480 * this point in time. So just ignore the interrupt and return.
1481 * In the latter case, the interrupt might actually be meant for
1482 * someone else sharing this IRQ, and that driver will handle it.
1484 rev = GETPORT(REV);
1485 dmacntrl0 = GETPORT(DMACNTRL0);
1486 if ((rev == 0xFF) && (dmacntrl0 == 0xFF))
1487 return IRQ_NONE;
1489 if( TESTLO(DMASTAT, INTSTAT) )
1490 return IRQ_NONE;
1492 /* no more interrupts from the controller, while we're busy.
1493 INTEN is restored by the BH handler */
1494 CLRBITS(DMACNTRL0, INTEN);
1496 DO_LOCK(flags);
1497 if( HOSTDATA(shpnt)->service==0 ) {
1498 HOSTDATA(shpnt)->service=1;
1500 /* Poke the BH handler */
1501 INIT_WORK(&aha152x_tq, run);
1502 schedule_work(&aha152x_tq);
1504 DO_UNLOCK(flags);
1506 return IRQ_HANDLED;
1510 * busfree phase
1511 * - handle completition/disconnection/error of current command
1512 * - start selection for next command (if any)
1514 static void busfree_run(struct Scsi_Host *shpnt)
1516 unsigned long flags;
1517 #if defined(AHA152X_STAT)
1518 int action=0;
1519 #endif
1521 SETPORT(SXFRCTL0, CH1|CLRCH1|CLRSTCNT);
1522 SETPORT(SXFRCTL0, CH1);
1524 SETPORT(SSTAT1, CLRBUSFREE);
1526 if(CURRENT_SC) {
1527 #if defined(AHA152X_STAT)
1528 action++;
1529 #endif
1530 CURRENT_SC->SCp.phase &= ~syncneg;
1532 if(CURRENT_SC->SCp.phase & completed) {
1533 /* target sent COMMAND COMPLETE */
1534 done(shpnt, (CURRENT_SC->SCp.Status & 0xff) | ((CURRENT_SC->SCp.Message & 0xff) << 8) | (DID_OK << 16));
1536 } else if(CURRENT_SC->SCp.phase & aborted) {
1537 DPRINTK(debug_eh, DEBUG_LEAD "ABORT sent\n", CMDINFO(CURRENT_SC));
1538 done(shpnt, (CURRENT_SC->SCp.Status & 0xff) | ((CURRENT_SC->SCp.Message & 0xff) << 8) | (DID_ABORT << 16));
1540 } else if(CURRENT_SC->SCp.phase & resetted) {
1541 DPRINTK(debug_eh, DEBUG_LEAD "BUS DEVICE RESET sent\n", CMDINFO(CURRENT_SC));
1542 done(shpnt, (CURRENT_SC->SCp.Status & 0xff) | ((CURRENT_SC->SCp.Message & 0xff) << 8) | (DID_RESET << 16));
1544 } else if(CURRENT_SC->SCp.phase & disconnected) {
1545 /* target sent DISCONNECT */
1546 DPRINTK(debug_selection, DEBUG_LEAD "target disconnected at %d/%d\n",
1547 CMDINFO(CURRENT_SC),
1548 CURRENT_SC->resid,
1549 CURRENT_SC->request_bufflen);
1550 #if defined(AHA152X_STAT)
1551 HOSTDATA(shpnt)->disconnections++;
1552 #endif
1553 append_SC(&DISCONNECTED_SC, CURRENT_SC);
1554 CURRENT_SC->SCp.phase |= 1 << 16;
1555 CURRENT_SC = NULL;
1557 } else {
1558 done(shpnt, DID_ERROR << 16);
1560 #if defined(AHA152X_STAT)
1561 } else {
1562 HOSTDATA(shpnt)->busfree_without_old_command++;
1563 #endif
1566 DO_LOCK(flags);
1568 if(DONE_SC) {
1569 #if defined(AHA152X_STAT)
1570 action++;
1571 #endif
1573 if(DONE_SC->SCp.phase & check_condition) {
1574 struct scsi_cmnd *cmd = HOSTDATA(shpnt)->done_SC;
1575 struct aha152x_scdata *sc = SCDATA(cmd);
1577 #if 0
1578 if(HOSTDATA(shpnt)->debug & debug_eh) {
1579 printk(ERR_LEAD "received sense: ", CMDINFO(DONE_SC));
1580 scsi_print_sense("bh", DONE_SC);
1582 #endif
1584 /* restore old command */
1585 memcpy(cmd->cmnd, sc->cmnd, sizeof(sc->cmnd));
1586 cmd->request_buffer = sc->request_buffer;
1587 cmd->request_bufflen = sc->request_bufflen;
1588 cmd->use_sg = sc->use_sg;
1589 cmd->cmd_len = sc->cmd_len;
1591 cmd->SCp.Status = 0x02;
1593 HOSTDATA(shpnt)->commands--;
1594 if (!HOSTDATA(shpnt)->commands)
1595 SETPORT(PORTA, 0); /* turn led off */
1596 } else if(DONE_SC->SCp.Status==0x02) {
1597 #if defined(AHA152X_STAT)
1598 HOSTDATA(shpnt)->busfree_with_check_condition++;
1599 #endif
1600 #if 0
1601 DPRINTK(debug_eh, ERR_LEAD "CHECK CONDITION found\n", CMDINFO(DONE_SC));
1602 #endif
1604 if(!(DONE_SC->SCp.Status & not_issued)) {
1605 Scsi_Cmnd *ptr = DONE_SC;
1606 DONE_SC=NULL;
1607 #if 0
1608 DPRINTK(debug_eh, ERR_LEAD "requesting sense\n", CMDINFO(ptr));
1609 #endif
1611 ptr->cmnd[0] = REQUEST_SENSE;
1612 ptr->cmnd[1] = 0;
1613 ptr->cmnd[2] = 0;
1614 ptr->cmnd[3] = 0;
1615 ptr->cmnd[4] = sizeof(ptr->sense_buffer);
1616 ptr->cmnd[5] = 0;
1617 ptr->cmd_len = 6;
1618 ptr->use_sg = 0;
1619 ptr->request_buffer = ptr->sense_buffer;
1620 ptr->request_bufflen = sizeof(ptr->sense_buffer);
1622 DO_UNLOCK(flags);
1623 aha152x_internal_queue(ptr, NULL, check_condition, ptr->scsi_done);
1624 DO_LOCK(flags);
1625 #if 0
1626 } else {
1627 DPRINTK(debug_eh, ERR_LEAD "command not issued - CHECK CONDITION ignored\n", CMDINFO(DONE_SC));
1628 #endif
1632 if(DONE_SC && DONE_SC->scsi_done) {
1633 #if defined(AHA152X_DEBUG)
1634 int hostno=DONE_SC->device->host->host_no;
1635 int id=DONE_SC->device->id & 0xf;
1636 int lun=DONE_SC->device->lun & 0x7;
1637 #endif
1638 Scsi_Cmnd *ptr = DONE_SC;
1639 DONE_SC=NULL;
1641 /* turn led off, when no commands are in the driver */
1642 HOSTDATA(shpnt)->commands--;
1643 if (!HOSTDATA(shpnt)->commands)
1644 SETPORT(PORTA, 0); /* turn led off */
1646 if(ptr->scsi_done != reset_done) {
1647 kfree(ptr->host_scribble);
1648 ptr->host_scribble=NULL;
1651 DO_UNLOCK(flags);
1652 DPRINTK(debug_done, DEBUG_LEAD "calling scsi_done(%p)\n", hostno, id, lun, ptr);
1653 ptr->scsi_done(ptr);
1654 DPRINTK(debug_done, DEBUG_LEAD "scsi_done(%p) returned\n", hostno, id, lun, ptr);
1655 DO_LOCK(flags);
1658 DONE_SC=NULL;
1659 #if defined(AHA152X_STAT)
1660 } else {
1661 HOSTDATA(shpnt)->busfree_without_done_command++;
1662 #endif
1665 if(ISSUE_SC)
1666 CURRENT_SC = remove_first_SC(&ISSUE_SC);
1668 DO_UNLOCK(flags);
1670 if(CURRENT_SC) {
1671 #if defined(AHA152X_STAT)
1672 action++;
1673 #endif
1674 CURRENT_SC->SCp.phase |= selecting;
1676 DPRINTK(debug_selection, DEBUG_LEAD "selecting target\n", CMDINFO(CURRENT_SC));
1678 /* clear selection timeout */
1679 SETPORT(SSTAT1, SELTO);
1681 SETPORT(SCSIID, (shpnt->this_id << OID_) | CURRENT_SC->device->id);
1682 SETPORT(SXFRCTL1, (PARITY ? ENSPCHK : 0 ) | ENSTIMER);
1683 SETPORT(SCSISEQ, ENSELO | ENAUTOATNO | (DISCONNECTED_SC ? ENRESELI : 0));
1684 } else {
1685 #if defined(AHA152X_STAT)
1686 HOSTDATA(shpnt)->busfree_without_new_command++;
1687 #endif
1688 SETPORT(SCSISEQ, DISCONNECTED_SC ? ENRESELI : 0);
1691 #if defined(AHA152X_STAT)
1692 if(!action)
1693 HOSTDATA(shpnt)->busfree_without_any_action++;
1694 #endif
1698 * Selection done (OUT)
1699 * - queue IDENTIFY message and SDTR to selected target for message out
1700 * (ATN asserted automagically via ENAUTOATNO in busfree())
1702 static void seldo_run(struct Scsi_Host *shpnt)
1704 SETPORT(SCSISIG, 0);
1705 SETPORT(SSTAT1, CLRBUSFREE);
1706 SETPORT(SSTAT1, CLRPHASECHG);
1708 CURRENT_SC->SCp.phase &= ~(selecting|not_issued);
1710 SETPORT(SCSISEQ, 0);
1712 if (TESTLO(SSTAT0, SELDO)) {
1713 printk(ERR_LEAD "aha152x: passing bus free condition\n", CMDINFO(CURRENT_SC));
1714 done(shpnt, DID_NO_CONNECT << 16);
1715 return;
1718 SETPORT(SSTAT0, CLRSELDO);
1720 ADDMSGO(IDENTIFY(RECONNECT, CURRENT_SC->device->lun));
1722 if (CURRENT_SC->SCp.phase & aborting) {
1723 ADDMSGO(ABORT);
1724 } else if (CURRENT_SC->SCp.phase & resetting) {
1725 ADDMSGO(BUS_DEVICE_RESET);
1726 } else if (SYNCNEG==0 && SYNCHRONOUS) {
1727 CURRENT_SC->SCp.phase |= syncneg;
1728 MSGOLEN += spi_populate_sync_msg(&MSGO(MSGOLEN), 50, 8);
1729 SYNCNEG=1; /* negotiation in progress */
1732 SETRATE(SYNCRATE);
1736 * Selection timeout
1737 * - return command to mid-level with failure cause
1740 static void selto_run(struct Scsi_Host *shpnt)
1742 SETPORT(SCSISEQ, 0);
1743 SETPORT(SSTAT1, CLRSELTIMO);
1745 DPRINTK(debug_selection, DEBUG_LEAD "selection timeout\n", CMDINFO(CURRENT_SC));
1747 if(!CURRENT_SC) {
1748 DPRINTK(debug_selection, DEBUG_LEAD "!CURRENT_SC\n", CMDINFO(CURRENT_SC));
1749 return;
1752 CURRENT_SC->SCp.phase &= ~selecting;
1754 if (CURRENT_SC->SCp.phase & aborted) {
1755 DPRINTK(debug_selection, DEBUG_LEAD "aborted\n", CMDINFO(CURRENT_SC));
1756 done(shpnt, DID_ABORT << 16);
1757 } else if (TESTLO(SSTAT0, SELINGO)) {
1758 DPRINTK(debug_selection, DEBUG_LEAD "arbitration not won\n", CMDINFO(CURRENT_SC));
1759 done(shpnt, DID_BUS_BUSY << 16);
1760 } else {
1761 /* ARBITRATION won, but SELECTION failed */
1762 DPRINTK(debug_selection, DEBUG_LEAD "selection failed\n", CMDINFO(CURRENT_SC));
1763 done(shpnt, DID_NO_CONNECT << 16);
1768 * Selection in done
1769 * - put current command back to issue queue
1770 * (reconnection of a disconnected nexus instead
1771 * of successful selection out)
1774 static void seldi_run(struct Scsi_Host *shpnt)
1776 int selid;
1777 int target;
1778 unsigned long flags;
1780 SETPORT(SCSISIG, 0);
1781 SETPORT(SSTAT0, CLRSELDI);
1782 SETPORT(SSTAT1, CLRBUSFREE);
1783 SETPORT(SSTAT1, CLRPHASECHG);
1785 if(CURRENT_SC) {
1786 if(!(CURRENT_SC->SCp.phase & not_issued))
1787 printk(ERR_LEAD "command should not have been issued yet\n", CMDINFO(CURRENT_SC));
1789 DPRINTK(debug_selection, ERR_LEAD "command requeued - reselection\n", CMDINFO(CURRENT_SC));
1791 DO_LOCK(flags);
1792 append_SC(&ISSUE_SC, CURRENT_SC);
1793 DO_UNLOCK(flags);
1795 CURRENT_SC = NULL;
1798 if(!DISCONNECTED_SC) {
1799 DPRINTK(debug_selection, DEBUG_LEAD "unexpected SELDI ", CMDINFO(CURRENT_SC));
1800 return;
1803 RECONN_TARGET=-1;
1805 selid = GETPORT(SELID) & ~(1 << shpnt->this_id);
1807 if (selid==0) {
1808 printk("aha152x%d: target id unknown (%02x)\n", HOSTNO, selid);
1809 return;
1812 for(target=7; !(selid & (1 << target)); target--)
1815 if(selid & ~(1 << target)) {
1816 printk("aha152x%d: multiple targets reconnected (%02x)\n",
1817 HOSTNO, selid);
1821 SETPORT(SCSIID, (shpnt->this_id << OID_) | target);
1822 SETPORT(SCSISEQ, 0);
1824 SETRATE(HOSTDATA(shpnt)->syncrate[target]);
1826 RECONN_TARGET=target;
1827 DPRINTK(debug_selection, DEBUG_LEAD "target %d reselected (%02x).\n", CMDINFO(CURRENT_SC), target, selid);
1831 * message in phase
1832 * - handle initial message after reconnection to identify
1833 * reconnecting nexus
1834 * - queue command on DISCONNECTED_SC on DISCONNECT message
1835 * - set completed flag on COMMAND COMPLETE
1836 * (other completition code moved to busfree_run)
1837 * - handle response to SDTR
1838 * - clear synchronous transfer agreements on BUS RESET
1840 * FIXME: what about SAVE POINTERS, RESTORE POINTERS?
1843 static void msgi_run(struct Scsi_Host *shpnt)
1845 for(;;) {
1846 int sstat1 = GETPORT(SSTAT1);
1848 if(sstat1 & (PHASECHG|PHASEMIS|BUSFREE) || !(sstat1 & REQINIT))
1849 return;
1851 if(TESTLO(SSTAT0,SPIORDY)) {
1852 DPRINTK(debug_msgi, DEBUG_LEAD "!SPIORDY\n", CMDINFO(CURRENT_SC));
1853 return;
1856 ADDMSGI(GETPORT(SCSIDAT));
1858 #if defined(AHA152X_DEBUG)
1859 if (HOSTDATA(shpnt)->debug & debug_msgi) {
1860 printk(INFO_LEAD "inbound message %02x ", CMDINFO(CURRENT_SC), MSGI(0));
1861 spi_print_msg(&MSGI(0));
1862 printk("\n");
1864 #endif
1866 if(!CURRENT_SC) {
1867 if(LASTSTATE!=seldi) {
1868 printk(KERN_ERR "aha152x%d: message in w/o current command not after reselection\n", HOSTNO);
1872 * Handle reselection
1874 if(!(MSGI(0) & IDENTIFY_BASE)) {
1875 printk(KERN_ERR "aha152x%d: target didn't identify after reselection\n", HOSTNO);
1876 continue;
1879 CURRENT_SC = remove_lun_SC(&DISCONNECTED_SC, RECONN_TARGET, MSGI(0) & 0x3f);
1881 if (!CURRENT_SC) {
1882 show_queues(shpnt);
1883 printk(KERN_ERR "aha152x%d: no disconnected command for target %d/%d\n", HOSTNO, RECONN_TARGET, MSGI(0) & 0x3f);
1884 continue;
1887 DPRINTK(debug_msgi, DEBUG_LEAD "target reconnected\n", CMDINFO(CURRENT_SC));
1889 CURRENT_SC->SCp.Message = MSGI(0);
1890 CURRENT_SC->SCp.phase &= ~disconnected;
1892 MSGILEN=0;
1894 /* next message if any */
1895 continue;
1898 CURRENT_SC->SCp.Message = MSGI(0);
1900 switch (MSGI(0)) {
1901 case DISCONNECT:
1902 if (!RECONNECT)
1903 printk(WARN_LEAD "target was not allowed to disconnect\n", CMDINFO(CURRENT_SC));
1905 CURRENT_SC->SCp.phase |= disconnected;
1906 break;
1908 case COMMAND_COMPLETE:
1909 if(CURRENT_SC->SCp.phase & completed)
1910 DPRINTK(debug_msgi, DEBUG_LEAD "again COMMAND COMPLETE\n", CMDINFO(CURRENT_SC));
1912 CURRENT_SC->SCp.phase |= completed;
1913 break;
1915 case MESSAGE_REJECT:
1916 if (SYNCNEG==1) {
1917 printk(INFO_LEAD "Synchronous Data Transfer Request was rejected\n", CMDINFO(CURRENT_SC));
1918 SYNCNEG=2; /* negotiation completed */
1919 } else
1920 printk(INFO_LEAD "inbound message (MESSAGE REJECT)\n", CMDINFO(CURRENT_SC));
1921 break;
1923 case SAVE_POINTERS:
1924 break;
1926 case RESTORE_POINTERS:
1927 break;
1929 case EXTENDED_MESSAGE:
1930 if(MSGILEN<2 || MSGILEN<MSGI(1)+2) {
1931 /* not yet completed */
1932 continue;
1935 switch (MSGI(2)) {
1936 case EXTENDED_SDTR:
1938 long ticks;
1940 if (MSGI(1) != 3) {
1941 printk(ERR_LEAD "SDTR message length!=3\n", CMDINFO(CURRENT_SC));
1942 break;
1945 if (!HOSTDATA(shpnt)->synchronous)
1946 break;
1948 printk(INFO_LEAD, CMDINFO(CURRENT_SC));
1949 spi_print_msg(&MSGI(0));
1950 printk("\n");
1952 ticks = (MSGI(3) * 4 + 49) / 50;
1954 if (syncneg) {
1955 /* negotiation in progress */
1956 if (ticks > 9 || MSGI(4) < 1 || MSGI(4) > 8) {
1957 ADDMSGO(MESSAGE_REJECT);
1958 printk(INFO_LEAD "received Synchronous Data Transfer Request invalid - rejected\n", CMDINFO(CURRENT_SC));
1959 break;
1962 SYNCRATE |= ((ticks - 2) << 4) + MSGI(4);
1963 } else if (ticks <= 9 && MSGI(4) >= 1) {
1964 ADDMSGO(EXTENDED_MESSAGE);
1965 ADDMSGO(3);
1966 ADDMSGO(EXTENDED_SDTR);
1967 if (ticks < 4) {
1968 ticks = 4;
1969 ADDMSGO(50);
1970 } else
1971 ADDMSGO(MSGI(3));
1973 if (MSGI(4) > 8)
1974 MSGI(4) = 8;
1976 ADDMSGO(MSGI(4));
1978 SYNCRATE |= ((ticks - 2) << 4) + MSGI(4);
1979 } else {
1980 /* requested SDTR is too slow, do it asynchronously */
1981 printk(INFO_LEAD "Synchronous Data Transfer Request too slow - Rejecting\n", CMDINFO(CURRENT_SC));
1982 ADDMSGO(MESSAGE_REJECT);
1985 SYNCNEG=2; /* negotiation completed */
1986 SETRATE(SYNCRATE);
1988 break;
1990 case BUS_DEVICE_RESET:
1992 int i;
1994 for(i=0; i<8; i++) {
1995 HOSTDATA(shpnt)->syncrate[i]=0;
1996 HOSTDATA(shpnt)->syncneg[i]=0;
2000 break;
2002 case EXTENDED_MODIFY_DATA_POINTER:
2003 case EXTENDED_EXTENDED_IDENTIFY:
2004 case EXTENDED_WDTR:
2005 default:
2006 ADDMSGO(MESSAGE_REJECT);
2007 break;
2009 break;
2012 MSGILEN=0;
2016 static void msgi_end(struct Scsi_Host *shpnt)
2018 if(MSGILEN>0)
2019 printk(WARN_LEAD "target left before message completed (%d)\n", CMDINFO(CURRENT_SC), MSGILEN);
2021 if (MSGOLEN > 0 && !(GETPORT(SSTAT1) & BUSFREE)) {
2022 DPRINTK(debug_msgi, DEBUG_LEAD "msgo pending\n", CMDINFO(CURRENT_SC));
2023 SETPORT(SCSISIG, P_MSGI | SIG_ATNO);
2028 * message out phase
2031 static void msgo_init(struct Scsi_Host *shpnt)
2033 if(MSGOLEN==0) {
2034 if((CURRENT_SC->SCp.phase & syncneg) && SYNCNEG==2 && SYNCRATE==0) {
2035 ADDMSGO(IDENTIFY(RECONNECT, CURRENT_SC->device->lun));
2036 } else {
2037 printk(INFO_LEAD "unexpected MESSAGE OUT phase; rejecting\n", CMDINFO(CURRENT_SC));
2038 ADDMSGO(MESSAGE_REJECT);
2042 #if defined(AHA152X_DEBUG)
2043 if(HOSTDATA(shpnt)->debug & debug_msgo) {
2044 int i;
2046 printk(DEBUG_LEAD "messages( ", CMDINFO(CURRENT_SC));
2047 for (i=0; i<MSGOLEN; i+=spi_print_msg(&MSGO(i)), printk(" "))
2049 printk(")\n");
2051 #endif
2055 * message out phase
2058 static void msgo_run(struct Scsi_Host *shpnt)
2060 if(MSGO_I==MSGOLEN)
2061 DPRINTK(debug_msgo, DEBUG_LEAD "messages all sent (%d/%d)\n", CMDINFO(CURRENT_SC), MSGO_I, MSGOLEN);
2063 while(MSGO_I<MSGOLEN) {
2064 DPRINTK(debug_msgo, DEBUG_LEAD "message byte %02x (%d/%d)\n", CMDINFO(CURRENT_SC), MSGO(MSGO_I), MSGO_I, MSGOLEN);
2066 if(TESTLO(SSTAT0, SPIORDY)) {
2067 DPRINTK(debug_msgo, DEBUG_LEAD "!SPIORDY\n", CMDINFO(CURRENT_SC));
2068 return;
2071 if (MSGO_I==MSGOLEN-1) {
2072 /* Leave MESSAGE OUT after transfer */
2073 SETPORT(SSTAT1, CLRATNO);
2077 if (MSGO(MSGO_I) & IDENTIFY_BASE)
2078 CURRENT_SC->SCp.phase |= identified;
2080 if (MSGO(MSGO_I)==ABORT)
2081 CURRENT_SC->SCp.phase |= aborted;
2083 if (MSGO(MSGO_I)==BUS_DEVICE_RESET)
2084 CURRENT_SC->SCp.phase |= resetted;
2086 SETPORT(SCSIDAT, MSGO(MSGO_I++));
2090 static void msgo_end(struct Scsi_Host *shpnt)
2092 if(MSGO_I<MSGOLEN) {
2093 printk(ERR_LEAD "message sent incompletely (%d/%d)\n", CMDINFO(CURRENT_SC), MSGO_I, MSGOLEN);
2094 if(SYNCNEG==1) {
2095 printk(INFO_LEAD "Synchronous Data Transfer Request was rejected\n", CMDINFO(CURRENT_SC));
2096 SYNCNEG=2;
2100 MSGO_I = 0;
2101 MSGOLEN = 0;
2105 * command phase
2108 static void cmd_init(struct Scsi_Host *shpnt)
2110 if (CURRENT_SC->SCp.sent_command) {
2111 printk(ERR_LEAD "command already sent\n", CMDINFO(CURRENT_SC));
2112 done(shpnt, DID_ERROR << 16);
2113 return;
2116 #if defined(AHA152X_DEBUG)
2117 if (HOSTDATA(shpnt)->debug & debug_cmd) {
2118 printk(DEBUG_LEAD "cmd_init: ", CMDINFO(CURRENT_SC));
2119 __scsi_print_command(CURRENT_SC->cmnd);
2121 #endif
2123 CMD_I=0;
2127 * command phase
2130 static void cmd_run(struct Scsi_Host *shpnt)
2132 if(CMD_I==CURRENT_SC->cmd_len) {
2133 DPRINTK(debug_cmd, DEBUG_LEAD "command already completely sent (%d/%d)", CMDINFO(CURRENT_SC), CMD_I, CURRENT_SC->cmd_len);
2134 disp_ports(shpnt);
2137 while(CMD_I<CURRENT_SC->cmd_len) {
2138 DPRINTK(debug_cmd, DEBUG_LEAD "command byte %02x (%d/%d)\n", CMDINFO(CURRENT_SC), CURRENT_SC->cmnd[CMD_I], CMD_I, CURRENT_SC->cmd_len);
2140 if(TESTLO(SSTAT0, SPIORDY)) {
2141 DPRINTK(debug_cmd, DEBUG_LEAD "!SPIORDY\n", CMDINFO(CURRENT_SC));
2142 return;
2145 SETPORT(SCSIDAT, CURRENT_SC->cmnd[CMD_I++]);
2149 static void cmd_end(struct Scsi_Host *shpnt)
2151 if(CMD_I<CURRENT_SC->cmd_len)
2152 printk(ERR_LEAD "command sent incompletely (%d/%d)\n", CMDINFO(CURRENT_SC), CMD_I, CURRENT_SC->cmd_len);
2153 else
2154 CURRENT_SC->SCp.sent_command++;
2158 * status phase
2161 static void status_run(struct Scsi_Host *shpnt)
2163 if(TESTLO(SSTAT0,SPIORDY)) {
2164 DPRINTK(debug_status, DEBUG_LEAD "!SPIORDY\n", CMDINFO(CURRENT_SC));
2165 return;
2168 CURRENT_SC->SCp.Status = GETPORT(SCSIDAT);
2170 #if defined(AHA152X_DEBUG)
2171 if (HOSTDATA(shpnt)->debug & debug_status) {
2172 printk(DEBUG_LEAD "inbound status %02x ", CMDINFO(CURRENT_SC), CURRENT_SC->SCp.Status);
2173 scsi_print_status(CURRENT_SC->SCp.Status);
2174 printk("\n");
2176 #endif
2180 * data in phase
2183 static void datai_init(struct Scsi_Host *shpnt)
2185 SETPORT(DMACNTRL0, RSTFIFO);
2186 SETPORT(DMACNTRL0, RSTFIFO|ENDMA);
2188 SETPORT(SXFRCTL0, CH1|CLRSTCNT);
2189 SETPORT(SXFRCTL0, CH1|SCSIEN|DMAEN);
2191 SETPORT(SIMODE0, 0);
2192 SETPORT(SIMODE1, ENSCSIPERR | ENSCSIRST | ENPHASEMIS | ENBUSFREE);
2194 DATA_LEN=0;
2195 DPRINTK(debug_datai,
2196 DEBUG_LEAD "datai_init: request_bufflen=%d resid=%d\n",
2197 CMDINFO(CURRENT_SC), CURRENT_SC->request_bufflen, CURRENT_SC->resid);
2200 static void datai_run(struct Scsi_Host *shpnt)
2202 unsigned long the_time;
2203 int fifodata, data_count;
2206 * loop while the phase persists or the fifos are not empty
2209 while(TESTLO(DMASTAT, INTSTAT) || TESTLO(DMASTAT, DFIFOEMP) || TESTLO(SSTAT2, SEMPTY)) {
2210 /* FIXME: maybe this should be done by setting up
2211 * STCNT to trigger ENSWRAP interrupt, instead of
2212 * polling for DFIFOFULL
2214 the_time=jiffies + 100*HZ;
2215 while(TESTLO(DMASTAT, DFIFOFULL|INTSTAT) && time_before(jiffies,the_time))
2216 barrier();
2218 if(TESTLO(DMASTAT, DFIFOFULL|INTSTAT)) {
2219 printk(ERR_LEAD "datai timeout", CMDINFO(CURRENT_SC));
2220 disp_ports(shpnt);
2221 break;
2224 if(TESTHI(DMASTAT, DFIFOFULL)) {
2225 fifodata = 128;
2226 } else {
2227 the_time=jiffies + 100*HZ;
2228 while(TESTLO(SSTAT2, SEMPTY) && time_before(jiffies,the_time))
2229 barrier();
2231 if(TESTLO(SSTAT2, SEMPTY)) {
2232 printk(ERR_LEAD "datai sempty timeout", CMDINFO(CURRENT_SC));
2233 disp_ports(shpnt);
2234 break;
2237 fifodata = GETPORT(FIFOSTAT);
2240 if(CURRENT_SC->SCp.this_residual>0) {
2241 while(fifodata>0 && CURRENT_SC->SCp.this_residual>0) {
2242 data_count = fifodata>CURRENT_SC->SCp.this_residual ?
2243 CURRENT_SC->SCp.this_residual :
2244 fifodata;
2245 fifodata -= data_count;
2247 if(data_count & 1) {
2248 DPRINTK(debug_datai, DEBUG_LEAD "8bit\n", CMDINFO(CURRENT_SC));
2249 SETPORT(DMACNTRL0, ENDMA|_8BIT);
2250 *CURRENT_SC->SCp.ptr++ = GETPORT(DATAPORT);
2251 CURRENT_SC->SCp.this_residual--;
2252 DATA_LEN++;
2253 SETPORT(DMACNTRL0, ENDMA);
2256 if(data_count > 1) {
2257 DPRINTK(debug_datai, DEBUG_LEAD "16bit(%d)\n", CMDINFO(CURRENT_SC), data_count);
2258 data_count >>= 1;
2259 insw(DATAPORT, CURRENT_SC->SCp.ptr, data_count);
2260 CURRENT_SC->SCp.ptr += 2 * data_count;
2261 CURRENT_SC->SCp.this_residual -= 2 * data_count;
2262 DATA_LEN += 2 * data_count;
2265 if(CURRENT_SC->SCp.this_residual==0 && CURRENT_SC->SCp.buffers_residual>0) {
2266 /* advance to next buffer */
2267 CURRENT_SC->SCp.buffers_residual--;
2268 CURRENT_SC->SCp.buffer++;
2269 CURRENT_SC->SCp.ptr = SG_ADDRESS(CURRENT_SC->SCp.buffer);
2270 CURRENT_SC->SCp.this_residual = CURRENT_SC->SCp.buffer->length;
2273 } else if(fifodata>0) {
2274 printk(ERR_LEAD "no buffers left for %d(%d) bytes (data overrun!?)\n", CMDINFO(CURRENT_SC), fifodata, GETPORT(FIFOSTAT));
2275 SETPORT(DMACNTRL0, ENDMA|_8BIT);
2276 while(fifodata>0) {
2277 int data;
2278 data=GETPORT(DATAPORT);
2279 DPRINTK(debug_datai, DEBUG_LEAD "data=%02x\n", CMDINFO(CURRENT_SC), data);
2280 fifodata--;
2281 DATA_LEN++;
2283 SETPORT(DMACNTRL0, ENDMA|_8BIT);
2287 if(TESTLO(DMASTAT, INTSTAT) ||
2288 TESTLO(DMASTAT, DFIFOEMP) ||
2289 TESTLO(SSTAT2, SEMPTY) ||
2290 GETPORT(FIFOSTAT)>0) {
2292 * something went wrong, if there's something left in the fifos
2293 * or the phase didn't change
2295 printk(ERR_LEAD "fifos should be empty and phase should have changed\n", CMDINFO(CURRENT_SC));
2296 disp_ports(shpnt);
2299 if(DATA_LEN!=GETSTCNT()) {
2300 printk(ERR_LEAD
2301 "manual transfer count differs from automatic (count=%d;stcnt=%d;diff=%d;fifostat=%d)",
2302 CMDINFO(CURRENT_SC), DATA_LEN, GETSTCNT(), GETSTCNT()-DATA_LEN, GETPORT(FIFOSTAT));
2303 disp_ports(shpnt);
2304 mdelay(10000);
2308 static void datai_end(struct Scsi_Host *shpnt)
2310 CURRENT_SC->resid -= GETSTCNT();
2312 DPRINTK(debug_datai,
2313 DEBUG_LEAD "datai_end: request_bufflen=%d resid=%d stcnt=%d\n",
2314 CMDINFO(CURRENT_SC), CURRENT_SC->request_bufflen, CURRENT_SC->resid, GETSTCNT());
2316 SETPORT(SXFRCTL0, CH1|CLRSTCNT);
2317 SETPORT(DMACNTRL0, 0);
2321 * data out phase
2324 static void datao_init(struct Scsi_Host *shpnt)
2326 SETPORT(DMACNTRL0, WRITE_READ | RSTFIFO);
2327 SETPORT(DMACNTRL0, WRITE_READ | ENDMA);
2329 SETPORT(SXFRCTL0, CH1|CLRSTCNT);
2330 SETPORT(SXFRCTL0, CH1|SCSIEN|DMAEN);
2332 SETPORT(SIMODE0, 0);
2333 SETPORT(SIMODE1, ENSCSIPERR | ENSCSIRST | ENPHASEMIS | ENBUSFREE );
2335 DATA_LEN = CURRENT_SC->resid;
2337 DPRINTK(debug_datao,
2338 DEBUG_LEAD "datao_init: request_bufflen=%d; resid=%d\n",
2339 CMDINFO(CURRENT_SC), CURRENT_SC->request_bufflen, CURRENT_SC->resid);
2342 static void datao_run(struct Scsi_Host *shpnt)
2344 unsigned long the_time;
2345 int data_count;
2347 /* until phase changes or all data sent */
2348 while(TESTLO(DMASTAT, INTSTAT) && CURRENT_SC->SCp.this_residual>0) {
2349 data_count = 128;
2350 if(data_count > CURRENT_SC->SCp.this_residual)
2351 data_count=CURRENT_SC->SCp.this_residual;
2353 if(TESTLO(DMASTAT, DFIFOEMP)) {
2354 printk(ERR_LEAD "datao fifo not empty (%d)", CMDINFO(CURRENT_SC), GETPORT(FIFOSTAT));
2355 disp_ports(shpnt);
2356 break;
2359 if(data_count & 1) {
2360 SETPORT(DMACNTRL0,WRITE_READ|ENDMA|_8BIT);
2361 SETPORT(DATAPORT, *CURRENT_SC->SCp.ptr++);
2362 CURRENT_SC->SCp.this_residual--;
2363 CURRENT_SC->resid--;
2364 SETPORT(DMACNTRL0,WRITE_READ|ENDMA);
2367 if(data_count > 1) {
2368 data_count >>= 1;
2369 outsw(DATAPORT, CURRENT_SC->SCp.ptr, data_count);
2370 CURRENT_SC->SCp.ptr += 2 * data_count;
2371 CURRENT_SC->SCp.this_residual -= 2 * data_count;
2372 CURRENT_SC->resid -= 2 * data_count;
2375 if(CURRENT_SC->SCp.this_residual==0 && CURRENT_SC->SCp.buffers_residual>0) {
2376 /* advance to next buffer */
2377 CURRENT_SC->SCp.buffers_residual--;
2378 CURRENT_SC->SCp.buffer++;
2379 CURRENT_SC->SCp.ptr = SG_ADDRESS(CURRENT_SC->SCp.buffer);
2380 CURRENT_SC->SCp.this_residual = CURRENT_SC->SCp.buffer->length;
2383 the_time=jiffies + 100*HZ;
2384 while(TESTLO(DMASTAT, DFIFOEMP|INTSTAT) && time_before(jiffies,the_time))
2385 barrier();
2387 if(TESTLO(DMASTAT, DFIFOEMP|INTSTAT)) {
2388 printk(ERR_LEAD "dataout timeout", CMDINFO(CURRENT_SC));
2389 disp_ports(shpnt);
2390 break;
2395 static void datao_end(struct Scsi_Host *shpnt)
2397 if(TESTLO(DMASTAT, DFIFOEMP)) {
2398 int data_count = (DATA_LEN - CURRENT_SC->resid) - GETSTCNT();
2400 DPRINTK(debug_datao, DEBUG_LEAD "datao: %d bytes to resend (%d written, %d transferred)\n",
2401 CMDINFO(CURRENT_SC),
2402 data_count,
2403 DATA_LEN-CURRENT_SC->resid,
2404 GETSTCNT());
2406 CURRENT_SC->resid += data_count;
2408 if(CURRENT_SC->use_sg) {
2409 data_count -= CURRENT_SC->SCp.ptr - SG_ADDRESS(CURRENT_SC->SCp.buffer);
2410 while(data_count>0) {
2411 CURRENT_SC->SCp.buffer--;
2412 CURRENT_SC->SCp.buffers_residual++;
2413 data_count -= CURRENT_SC->SCp.buffer->length;
2415 CURRENT_SC->SCp.ptr = SG_ADDRESS(CURRENT_SC->SCp.buffer) - data_count;
2416 CURRENT_SC->SCp.this_residual = CURRENT_SC->SCp.buffer->length + data_count;
2417 } else {
2418 CURRENT_SC->SCp.ptr -= data_count;
2419 CURRENT_SC->SCp.this_residual += data_count;
2423 DPRINTK(debug_datao, DEBUG_LEAD "datao_end: request_bufflen=%d; resid=%d; stcnt=%d\n",
2424 CMDINFO(CURRENT_SC),
2425 CURRENT_SC->request_bufflen,
2426 CURRENT_SC->resid,
2427 GETSTCNT());
2429 SETPORT(SXFRCTL0, CH1|CLRCH1|CLRSTCNT);
2430 SETPORT(SXFRCTL0, CH1);
2432 SETPORT(DMACNTRL0, 0);
2436 * figure out what state we're in
2439 static int update_state(struct Scsi_Host *shpnt)
2441 int dataphase=0;
2442 unsigned int stat0 = GETPORT(SSTAT0);
2443 unsigned int stat1 = GETPORT(SSTAT1);
2445 PREVSTATE = STATE;
2446 STATE=unknown;
2448 if(stat1 & SCSIRSTI) {
2449 STATE=rsti;
2450 SETPORT(SCSISEQ,0);
2451 SETPORT(SSTAT1,SCSIRSTI);
2452 } else if(stat0 & SELDI && PREVSTATE==busfree) {
2453 STATE=seldi;
2454 } else if(stat0 & SELDO && CURRENT_SC && (CURRENT_SC->SCp.phase & selecting)) {
2455 STATE=seldo;
2456 } else if(stat1 & SELTO) {
2457 STATE=selto;
2458 } else if(stat1 & BUSFREE) {
2459 STATE=busfree;
2460 SETPORT(SSTAT1,BUSFREE);
2461 } else if(stat1 & SCSIPERR) {
2462 STATE=parerr;
2463 SETPORT(SSTAT1,SCSIPERR);
2464 } else if(stat1 & REQINIT) {
2465 switch(GETPORT(SCSISIG) & P_MASK) {
2466 case P_MSGI: STATE=msgi; break;
2467 case P_MSGO: STATE=msgo; break;
2468 case P_DATAO: STATE=datao; break;
2469 case P_DATAI: STATE=datai; break;
2470 case P_STATUS: STATE=status; break;
2471 case P_CMD: STATE=cmd; break;
2473 dataphase=1;
2476 if((stat0 & SELDI) && STATE!=seldi && !dataphase) {
2477 printk(INFO_LEAD "reselection missed?", CMDINFO(CURRENT_SC));
2478 disp_ports(shpnt);
2481 if(STATE!=PREVSTATE) {
2482 LASTSTATE=PREVSTATE;
2485 return dataphase;
2489 * handle parity error
2491 * FIXME: in which phase?
2494 static void parerr_run(struct Scsi_Host *shpnt)
2496 printk(ERR_LEAD "parity error\n", CMDINFO(CURRENT_SC));
2497 done(shpnt, DID_PARITY << 16);
2501 * handle reset in
2504 static void rsti_run(struct Scsi_Host *shpnt)
2506 Scsi_Cmnd *ptr;
2508 printk(KERN_NOTICE "aha152x%d: scsi reset in\n", HOSTNO);
2510 ptr=DISCONNECTED_SC;
2511 while(ptr) {
2512 Scsi_Cmnd *next = SCNEXT(ptr);
2514 if (!ptr->device->soft_reset) {
2515 remove_SC(&DISCONNECTED_SC, ptr);
2517 kfree(ptr->host_scribble);
2518 ptr->host_scribble=NULL;
2520 ptr->result = DID_RESET << 16;
2521 ptr->scsi_done(ptr);
2524 ptr = next;
2527 if(CURRENT_SC && !CURRENT_SC->device->soft_reset)
2528 done(shpnt, DID_RESET << 16 );
2533 * bottom-half handler
2536 static void is_complete(struct Scsi_Host *shpnt)
2538 int dataphase;
2539 unsigned long flags;
2540 int pending;
2542 if(!shpnt)
2543 return;
2545 DO_LOCK(flags);
2547 if( HOSTDATA(shpnt)->service==0 ) {
2548 DO_UNLOCK(flags);
2549 return;
2552 HOSTDATA(shpnt)->service = 0;
2554 if(HOSTDATA(shpnt)->in_intr) {
2555 DO_UNLOCK(flags);
2556 /* aha152x_error never returns.. */
2557 aha152x_error(shpnt, "bottom-half already running!?");
2559 HOSTDATA(shpnt)->in_intr++;
2562 * loop while there are interrupt conditions pending
2565 do {
2566 unsigned long start = jiffies;
2567 DO_UNLOCK(flags);
2569 dataphase=update_state(shpnt);
2571 DPRINTK(debug_phases, LEAD "start %s %s(%s)\n", CMDINFO(CURRENT_SC), states[STATE].name, states[PREVSTATE].name, states[LASTSTATE].name);
2574 * end previous state
2577 if(PREVSTATE!=STATE && states[PREVSTATE].end)
2578 states[PREVSTATE].end(shpnt);
2581 * disable SPIO mode if previous phase used it
2582 * and this one doesn't
2585 if(states[PREVSTATE].spio && !states[STATE].spio) {
2586 SETPORT(SXFRCTL0, CH1);
2587 SETPORT(DMACNTRL0, 0);
2588 if(CURRENT_SC)
2589 CURRENT_SC->SCp.phase &= ~spiordy;
2593 * accept current dataphase phase
2596 if(dataphase) {
2597 SETPORT(SSTAT0, REQINIT);
2598 SETPORT(SCSISIG, GETPORT(SCSISIG) & P_MASK);
2599 SETPORT(SSTAT1, PHASECHG);
2603 * enable SPIO mode if previous didn't use it
2604 * and this one does
2607 if(!states[PREVSTATE].spio && states[STATE].spio) {
2608 SETPORT(DMACNTRL0, 0);
2609 SETPORT(SXFRCTL0, CH1|SPIOEN);
2610 if(CURRENT_SC)
2611 CURRENT_SC->SCp.phase |= spiordy;
2615 * initialize for new state
2618 if(PREVSTATE!=STATE && states[STATE].init)
2619 states[STATE].init(shpnt);
2622 * handle current state
2625 if(states[STATE].run)
2626 states[STATE].run(shpnt);
2627 else
2628 printk(ERR_LEAD "unexpected state (%x)\n", CMDINFO(CURRENT_SC), STATE);
2631 * setup controller to interrupt on
2632 * the next expected condition and
2633 * loop if it's already there
2636 DO_LOCK(flags);
2637 pending=setup_expected_interrupts(shpnt);
2638 #if defined(AHA152X_STAT)
2639 HOSTDATA(shpnt)->count[STATE]++;
2640 if(PREVSTATE!=STATE)
2641 HOSTDATA(shpnt)->count_trans[STATE]++;
2642 HOSTDATA(shpnt)->time[STATE] += jiffies-start;
2643 #endif
2645 DPRINTK(debug_phases, LEAD "end %s %s(%s)\n", CMDINFO(CURRENT_SC), states[STATE].name, states[PREVSTATE].name, states[LASTSTATE].name);
2646 } while(pending);
2649 * enable interrupts and leave bottom-half
2652 HOSTDATA(shpnt)->in_intr--;
2653 SETBITS(DMACNTRL0, INTEN);
2654 DO_UNLOCK(flags);
2659 * Dump the current driver status and panic
2661 static void aha152x_error(struct Scsi_Host *shpnt, char *msg)
2663 printk(KERN_EMERG "\naha152x%d: %s\n", HOSTNO, msg);
2664 show_queues(shpnt);
2665 panic("aha152x panic\n");
2669 * Display registers of AIC-6260
2671 static void disp_ports(struct Scsi_Host *shpnt)
2673 #if defined(AHA152X_DEBUG)
2674 int s;
2676 printk("\n%s: %s(%s) ",
2677 CURRENT_SC ? "busy" : "waiting",
2678 states[STATE].name,
2679 states[PREVSTATE].name);
2681 s = GETPORT(SCSISEQ);
2682 printk("SCSISEQ( ");
2683 if (s & TEMODEO)
2684 printk("TARGET MODE ");
2685 if (s & ENSELO)
2686 printk("SELO ");
2687 if (s & ENSELI)
2688 printk("SELI ");
2689 if (s & ENRESELI)
2690 printk("RESELI ");
2691 if (s & ENAUTOATNO)
2692 printk("AUTOATNO ");
2693 if (s & ENAUTOATNI)
2694 printk("AUTOATNI ");
2695 if (s & ENAUTOATNP)
2696 printk("AUTOATNP ");
2697 if (s & SCSIRSTO)
2698 printk("SCSIRSTO ");
2699 printk(");");
2701 printk(" SCSISIG(");
2702 s = GETPORT(SCSISIG);
2703 switch (s & P_MASK) {
2704 case P_DATAO:
2705 printk("DATA OUT");
2706 break;
2707 case P_DATAI:
2708 printk("DATA IN");
2709 break;
2710 case P_CMD:
2711 printk("COMMAND");
2712 break;
2713 case P_STATUS:
2714 printk("STATUS");
2715 break;
2716 case P_MSGO:
2717 printk("MESSAGE OUT");
2718 break;
2719 case P_MSGI:
2720 printk("MESSAGE IN");
2721 break;
2722 default:
2723 printk("*invalid*");
2724 break;
2727 printk("); ");
2729 printk("INTSTAT (%s); ", TESTHI(DMASTAT, INTSTAT) ? "hi" : "lo");
2731 printk("SSTAT( ");
2732 s = GETPORT(SSTAT0);
2733 if (s & TARGET)
2734 printk("TARGET ");
2735 if (s & SELDO)
2736 printk("SELDO ");
2737 if (s & SELDI)
2738 printk("SELDI ");
2739 if (s & SELINGO)
2740 printk("SELINGO ");
2741 if (s & SWRAP)
2742 printk("SWRAP ");
2743 if (s & SDONE)
2744 printk("SDONE ");
2745 if (s & SPIORDY)
2746 printk("SPIORDY ");
2747 if (s & DMADONE)
2748 printk("DMADONE ");
2750 s = GETPORT(SSTAT1);
2751 if (s & SELTO)
2752 printk("SELTO ");
2753 if (s & ATNTARG)
2754 printk("ATNTARG ");
2755 if (s & SCSIRSTI)
2756 printk("SCSIRSTI ");
2757 if (s & PHASEMIS)
2758 printk("PHASEMIS ");
2759 if (s & BUSFREE)
2760 printk("BUSFREE ");
2761 if (s & SCSIPERR)
2762 printk("SCSIPERR ");
2763 if (s & PHASECHG)
2764 printk("PHASECHG ");
2765 if (s & REQINIT)
2766 printk("REQINIT ");
2767 printk("); ");
2770 printk("SSTAT( ");
2772 s = GETPORT(SSTAT0) & GETPORT(SIMODE0);
2774 if (s & TARGET)
2775 printk("TARGET ");
2776 if (s & SELDO)
2777 printk("SELDO ");
2778 if (s & SELDI)
2779 printk("SELDI ");
2780 if (s & SELINGO)
2781 printk("SELINGO ");
2782 if (s & SWRAP)
2783 printk("SWRAP ");
2784 if (s & SDONE)
2785 printk("SDONE ");
2786 if (s & SPIORDY)
2787 printk("SPIORDY ");
2788 if (s & DMADONE)
2789 printk("DMADONE ");
2791 s = GETPORT(SSTAT1) & GETPORT(SIMODE1);
2793 if (s & SELTO)
2794 printk("SELTO ");
2795 if (s & ATNTARG)
2796 printk("ATNTARG ");
2797 if (s & SCSIRSTI)
2798 printk("SCSIRSTI ");
2799 if (s & PHASEMIS)
2800 printk("PHASEMIS ");
2801 if (s & BUSFREE)
2802 printk("BUSFREE ");
2803 if (s & SCSIPERR)
2804 printk("SCSIPERR ");
2805 if (s & PHASECHG)
2806 printk("PHASECHG ");
2807 if (s & REQINIT)
2808 printk("REQINIT ");
2809 printk("); ");
2811 printk("SXFRCTL0( ");
2813 s = GETPORT(SXFRCTL0);
2814 if (s & SCSIEN)
2815 printk("SCSIEN ");
2816 if (s & DMAEN)
2817 printk("DMAEN ");
2818 if (s & CH1)
2819 printk("CH1 ");
2820 if (s & CLRSTCNT)
2821 printk("CLRSTCNT ");
2822 if (s & SPIOEN)
2823 printk("SPIOEN ");
2824 if (s & CLRCH1)
2825 printk("CLRCH1 ");
2826 printk("); ");
2828 printk("SIGNAL( ");
2830 s = GETPORT(SCSISIG);
2831 if (s & SIG_ATNI)
2832 printk("ATNI ");
2833 if (s & SIG_SELI)
2834 printk("SELI ");
2835 if (s & SIG_BSYI)
2836 printk("BSYI ");
2837 if (s & SIG_REQI)
2838 printk("REQI ");
2839 if (s & SIG_ACKI)
2840 printk("ACKI ");
2841 printk("); ");
2843 printk("SELID (%02x), ", GETPORT(SELID));
2845 printk("STCNT (%d), ", GETSTCNT());
2847 printk("SSTAT2( ");
2849 s = GETPORT(SSTAT2);
2850 if (s & SOFFSET)
2851 printk("SOFFSET ");
2852 if (s & SEMPTY)
2853 printk("SEMPTY ");
2854 if (s & SFULL)
2855 printk("SFULL ");
2856 printk("); SFCNT (%d); ", s & (SFULL | SFCNT));
2858 s = GETPORT(SSTAT3);
2859 printk("SCSICNT (%d), OFFCNT(%d), ", (s & 0xf0) >> 4, s & 0x0f);
2861 printk("SSTAT4( ");
2862 s = GETPORT(SSTAT4);
2863 if (s & SYNCERR)
2864 printk("SYNCERR ");
2865 if (s & FWERR)
2866 printk("FWERR ");
2867 if (s & FRERR)
2868 printk("FRERR ");
2869 printk("); ");
2871 printk("DMACNTRL0( ");
2872 s = GETPORT(DMACNTRL0);
2873 printk("%s ", s & _8BIT ? "8BIT" : "16BIT");
2874 printk("%s ", s & DMA ? "DMA" : "PIO");
2875 printk("%s ", s & WRITE_READ ? "WRITE" : "READ");
2876 if (s & ENDMA)
2877 printk("ENDMA ");
2878 if (s & INTEN)
2879 printk("INTEN ");
2880 if (s & RSTFIFO)
2881 printk("RSTFIFO ");
2882 if (s & SWINT)
2883 printk("SWINT ");
2884 printk("); ");
2886 printk("DMASTAT( ");
2887 s = GETPORT(DMASTAT);
2888 if (s & ATDONE)
2889 printk("ATDONE ");
2890 if (s & WORDRDY)
2891 printk("WORDRDY ");
2892 if (s & DFIFOFULL)
2893 printk("DFIFOFULL ");
2894 if (s & DFIFOEMP)
2895 printk("DFIFOEMP ");
2896 printk(")\n");
2897 #endif
2901 * display enabled interrupts
2903 static void disp_enintr(struct Scsi_Host *shpnt)
2905 int s;
2907 printk(KERN_DEBUG "enabled interrupts ( ");
2909 s = GETPORT(SIMODE0);
2910 if (s & ENSELDO)
2911 printk("ENSELDO ");
2912 if (s & ENSELDI)
2913 printk("ENSELDI ");
2914 if (s & ENSELINGO)
2915 printk("ENSELINGO ");
2916 if (s & ENSWRAP)
2917 printk("ENSWRAP ");
2918 if (s & ENSDONE)
2919 printk("ENSDONE ");
2920 if (s & ENSPIORDY)
2921 printk("ENSPIORDY ");
2922 if (s & ENDMADONE)
2923 printk("ENDMADONE ");
2925 s = GETPORT(SIMODE1);
2926 if (s & ENSELTIMO)
2927 printk("ENSELTIMO ");
2928 if (s & ENATNTARG)
2929 printk("ENATNTARG ");
2930 if (s & ENPHASEMIS)
2931 printk("ENPHASEMIS ");
2932 if (s & ENBUSFREE)
2933 printk("ENBUSFREE ");
2934 if (s & ENSCSIPERR)
2935 printk("ENSCSIPERR ");
2936 if (s & ENPHASECHG)
2937 printk("ENPHASECHG ");
2938 if (s & ENREQINIT)
2939 printk("ENREQINIT ");
2940 printk(")\n");
2944 * Show the command data of a command
2946 static void show_command(Scsi_Cmnd *ptr)
2948 scmd_printk(KERN_DEBUG, ptr, "%p: cmnd=(", ptr);
2950 __scsi_print_command(ptr->cmnd);
2952 printk(KERN_DEBUG "); request_bufflen=%d; resid=%d; phase |",
2953 ptr->request_bufflen, ptr->resid);
2955 if (ptr->SCp.phase & not_issued)
2956 printk("not issued|");
2957 if (ptr->SCp.phase & selecting)
2958 printk("selecting|");
2959 if (ptr->SCp.phase & identified)
2960 printk("identified|");
2961 if (ptr->SCp.phase & disconnected)
2962 printk("disconnected|");
2963 if (ptr->SCp.phase & completed)
2964 printk("completed|");
2965 if (ptr->SCp.phase & spiordy)
2966 printk("spiordy|");
2967 if (ptr->SCp.phase & syncneg)
2968 printk("syncneg|");
2969 if (ptr->SCp.phase & aborted)
2970 printk("aborted|");
2971 if (ptr->SCp.phase & resetted)
2972 printk("resetted|");
2973 if( SCDATA(ptr) ) {
2974 printk("; next=0x%p\n", SCNEXT(ptr));
2975 } else {
2976 printk("; next=(host scribble NULL)\n");
2981 * Dump the queued data
2983 static void show_queues(struct Scsi_Host *shpnt)
2985 Scsi_Cmnd *ptr;
2986 unsigned long flags;
2988 DO_LOCK(flags);
2989 printk(KERN_DEBUG "\nqueue status:\nissue_SC:\n");
2990 for (ptr = ISSUE_SC; ptr; ptr = SCNEXT(ptr))
2991 show_command(ptr);
2992 DO_UNLOCK(flags);
2994 printk(KERN_DEBUG "current_SC:\n");
2995 if (CURRENT_SC)
2996 show_command(CURRENT_SC);
2997 else
2998 printk(KERN_DEBUG "none\n");
3000 printk(KERN_DEBUG "disconnected_SC:\n");
3001 for (ptr = DISCONNECTED_SC; ptr; ptr = SCDATA(ptr) ? SCNEXT(ptr) : NULL)
3002 show_command(ptr);
3004 disp_ports(shpnt);
3005 disp_enintr(shpnt);
3008 #undef SPRINTF
3009 #define SPRINTF(args...) pos += sprintf(pos, ## args)
3011 static int get_command(char *pos, Scsi_Cmnd * ptr)
3013 char *start = pos;
3014 int i;
3016 SPRINTF("0x%08x: target=%d; lun=%d; cmnd=( ",
3017 (unsigned int) ptr, ptr->device->id, ptr->device->lun);
3019 for (i = 0; i < COMMAND_SIZE(ptr->cmnd[0]); i++)
3020 SPRINTF("0x%02x ", ptr->cmnd[i]);
3022 SPRINTF("); resid=%d; residual=%d; buffers=%d; phase |",
3023 ptr->resid, ptr->SCp.this_residual, ptr->SCp.buffers_residual);
3025 if (ptr->SCp.phase & not_issued)
3026 SPRINTF("not issued|");
3027 if (ptr->SCp.phase & selecting)
3028 SPRINTF("selecting|");
3029 if (ptr->SCp.phase & disconnected)
3030 SPRINTF("disconnected|");
3031 if (ptr->SCp.phase & aborted)
3032 SPRINTF("aborted|");
3033 if (ptr->SCp.phase & identified)
3034 SPRINTF("identified|");
3035 if (ptr->SCp.phase & completed)
3036 SPRINTF("completed|");
3037 if (ptr->SCp.phase & spiordy)
3038 SPRINTF("spiordy|");
3039 if (ptr->SCp.phase & syncneg)
3040 SPRINTF("syncneg|");
3041 SPRINTF("; next=0x%p\n", SCNEXT(ptr));
3043 return (pos - start);
3046 static int get_ports(struct Scsi_Host *shpnt, char *pos)
3048 char *start = pos;
3049 int s;
3051 SPRINTF("\n%s: %s(%s) ", CURRENT_SC ? "on bus" : "waiting", states[STATE].name, states[PREVSTATE].name);
3053 s = GETPORT(SCSISEQ);
3054 SPRINTF("SCSISEQ( ");
3055 if (s & TEMODEO)
3056 SPRINTF("TARGET MODE ");
3057 if (s & ENSELO)
3058 SPRINTF("SELO ");
3059 if (s & ENSELI)
3060 SPRINTF("SELI ");
3061 if (s & ENRESELI)
3062 SPRINTF("RESELI ");
3063 if (s & ENAUTOATNO)
3064 SPRINTF("AUTOATNO ");
3065 if (s & ENAUTOATNI)
3066 SPRINTF("AUTOATNI ");
3067 if (s & ENAUTOATNP)
3068 SPRINTF("AUTOATNP ");
3069 if (s & SCSIRSTO)
3070 SPRINTF("SCSIRSTO ");
3071 SPRINTF(");");
3073 SPRINTF(" SCSISIG(");
3074 s = GETPORT(SCSISIG);
3075 switch (s & P_MASK) {
3076 case P_DATAO:
3077 SPRINTF("DATA OUT");
3078 break;
3079 case P_DATAI:
3080 SPRINTF("DATA IN");
3081 break;
3082 case P_CMD:
3083 SPRINTF("COMMAND");
3084 break;
3085 case P_STATUS:
3086 SPRINTF("STATUS");
3087 break;
3088 case P_MSGO:
3089 SPRINTF("MESSAGE OUT");
3090 break;
3091 case P_MSGI:
3092 SPRINTF("MESSAGE IN");
3093 break;
3094 default:
3095 SPRINTF("*invalid*");
3096 break;
3099 SPRINTF("); ");
3101 SPRINTF("INTSTAT (%s); ", TESTHI(DMASTAT, INTSTAT) ? "hi" : "lo");
3103 SPRINTF("SSTAT( ");
3104 s = GETPORT(SSTAT0);
3105 if (s & TARGET)
3106 SPRINTF("TARGET ");
3107 if (s & SELDO)
3108 SPRINTF("SELDO ");
3109 if (s & SELDI)
3110 SPRINTF("SELDI ");
3111 if (s & SELINGO)
3112 SPRINTF("SELINGO ");
3113 if (s & SWRAP)
3114 SPRINTF("SWRAP ");
3115 if (s & SDONE)
3116 SPRINTF("SDONE ");
3117 if (s & SPIORDY)
3118 SPRINTF("SPIORDY ");
3119 if (s & DMADONE)
3120 SPRINTF("DMADONE ");
3122 s = GETPORT(SSTAT1);
3123 if (s & SELTO)
3124 SPRINTF("SELTO ");
3125 if (s & ATNTARG)
3126 SPRINTF("ATNTARG ");
3127 if (s & SCSIRSTI)
3128 SPRINTF("SCSIRSTI ");
3129 if (s & PHASEMIS)
3130 SPRINTF("PHASEMIS ");
3131 if (s & BUSFREE)
3132 SPRINTF("BUSFREE ");
3133 if (s & SCSIPERR)
3134 SPRINTF("SCSIPERR ");
3135 if (s & PHASECHG)
3136 SPRINTF("PHASECHG ");
3137 if (s & REQINIT)
3138 SPRINTF("REQINIT ");
3139 SPRINTF("); ");
3142 SPRINTF("SSTAT( ");
3144 s = GETPORT(SSTAT0) & GETPORT(SIMODE0);
3146 if (s & TARGET)
3147 SPRINTF("TARGET ");
3148 if (s & SELDO)
3149 SPRINTF("SELDO ");
3150 if (s & SELDI)
3151 SPRINTF("SELDI ");
3152 if (s & SELINGO)
3153 SPRINTF("SELINGO ");
3154 if (s & SWRAP)
3155 SPRINTF("SWRAP ");
3156 if (s & SDONE)
3157 SPRINTF("SDONE ");
3158 if (s & SPIORDY)
3159 SPRINTF("SPIORDY ");
3160 if (s & DMADONE)
3161 SPRINTF("DMADONE ");
3163 s = GETPORT(SSTAT1) & GETPORT(SIMODE1);
3165 if (s & SELTO)
3166 SPRINTF("SELTO ");
3167 if (s & ATNTARG)
3168 SPRINTF("ATNTARG ");
3169 if (s & SCSIRSTI)
3170 SPRINTF("SCSIRSTI ");
3171 if (s & PHASEMIS)
3172 SPRINTF("PHASEMIS ");
3173 if (s & BUSFREE)
3174 SPRINTF("BUSFREE ");
3175 if (s & SCSIPERR)
3176 SPRINTF("SCSIPERR ");
3177 if (s & PHASECHG)
3178 SPRINTF("PHASECHG ");
3179 if (s & REQINIT)
3180 SPRINTF("REQINIT ");
3181 SPRINTF("); ");
3183 SPRINTF("SXFRCTL0( ");
3185 s = GETPORT(SXFRCTL0);
3186 if (s & SCSIEN)
3187 SPRINTF("SCSIEN ");
3188 if (s & DMAEN)
3189 SPRINTF("DMAEN ");
3190 if (s & CH1)
3191 SPRINTF("CH1 ");
3192 if (s & CLRSTCNT)
3193 SPRINTF("CLRSTCNT ");
3194 if (s & SPIOEN)
3195 SPRINTF("SPIOEN ");
3196 if (s & CLRCH1)
3197 SPRINTF("CLRCH1 ");
3198 SPRINTF("); ");
3200 SPRINTF("SIGNAL( ");
3202 s = GETPORT(SCSISIG);
3203 if (s & SIG_ATNI)
3204 SPRINTF("ATNI ");
3205 if (s & SIG_SELI)
3206 SPRINTF("SELI ");
3207 if (s & SIG_BSYI)
3208 SPRINTF("BSYI ");
3209 if (s & SIG_REQI)
3210 SPRINTF("REQI ");
3211 if (s & SIG_ACKI)
3212 SPRINTF("ACKI ");
3213 SPRINTF("); ");
3215 SPRINTF("SELID(%02x), ", GETPORT(SELID));
3217 SPRINTF("STCNT(%d), ", GETSTCNT());
3219 SPRINTF("SSTAT2( ");
3221 s = GETPORT(SSTAT2);
3222 if (s & SOFFSET)
3223 SPRINTF("SOFFSET ");
3224 if (s & SEMPTY)
3225 SPRINTF("SEMPTY ");
3226 if (s & SFULL)
3227 SPRINTF("SFULL ");
3228 SPRINTF("); SFCNT (%d); ", s & (SFULL | SFCNT));
3230 s = GETPORT(SSTAT3);
3231 SPRINTF("SCSICNT (%d), OFFCNT(%d), ", (s & 0xf0) >> 4, s & 0x0f);
3233 SPRINTF("SSTAT4( ");
3234 s = GETPORT(SSTAT4);
3235 if (s & SYNCERR)
3236 SPRINTF("SYNCERR ");
3237 if (s & FWERR)
3238 SPRINTF("FWERR ");
3239 if (s & FRERR)
3240 SPRINTF("FRERR ");
3241 SPRINTF("); ");
3243 SPRINTF("DMACNTRL0( ");
3244 s = GETPORT(DMACNTRL0);
3245 SPRINTF("%s ", s & _8BIT ? "8BIT" : "16BIT");
3246 SPRINTF("%s ", s & DMA ? "DMA" : "PIO");
3247 SPRINTF("%s ", s & WRITE_READ ? "WRITE" : "READ");
3248 if (s & ENDMA)
3249 SPRINTF("ENDMA ");
3250 if (s & INTEN)
3251 SPRINTF("INTEN ");
3252 if (s & RSTFIFO)
3253 SPRINTF("RSTFIFO ");
3254 if (s & SWINT)
3255 SPRINTF("SWINT ");
3256 SPRINTF("); ");
3258 SPRINTF("DMASTAT( ");
3259 s = GETPORT(DMASTAT);
3260 if (s & ATDONE)
3261 SPRINTF("ATDONE ");
3262 if (s & WORDRDY)
3263 SPRINTF("WORDRDY ");
3264 if (s & DFIFOFULL)
3265 SPRINTF("DFIFOFULL ");
3266 if (s & DFIFOEMP)
3267 SPRINTF("DFIFOEMP ");
3268 SPRINTF(")\n");
3270 SPRINTF("enabled interrupts( ");
3272 s = GETPORT(SIMODE0);
3273 if (s & ENSELDO)
3274 SPRINTF("ENSELDO ");
3275 if (s & ENSELDI)
3276 SPRINTF("ENSELDI ");
3277 if (s & ENSELINGO)
3278 SPRINTF("ENSELINGO ");
3279 if (s & ENSWRAP)
3280 SPRINTF("ENSWRAP ");
3281 if (s & ENSDONE)
3282 SPRINTF("ENSDONE ");
3283 if (s & ENSPIORDY)
3284 SPRINTF("ENSPIORDY ");
3285 if (s & ENDMADONE)
3286 SPRINTF("ENDMADONE ");
3288 s = GETPORT(SIMODE1);
3289 if (s & ENSELTIMO)
3290 SPRINTF("ENSELTIMO ");
3291 if (s & ENATNTARG)
3292 SPRINTF("ENATNTARG ");
3293 if (s & ENPHASEMIS)
3294 SPRINTF("ENPHASEMIS ");
3295 if (s & ENBUSFREE)
3296 SPRINTF("ENBUSFREE ");
3297 if (s & ENSCSIPERR)
3298 SPRINTF("ENSCSIPERR ");
3299 if (s & ENPHASECHG)
3300 SPRINTF("ENPHASECHG ");
3301 if (s & ENREQINIT)
3302 SPRINTF("ENREQINIT ");
3303 SPRINTF(")\n");
3305 return (pos - start);
3308 static int aha152x_set_info(char *buffer, int length, struct Scsi_Host *shpnt)
3310 if(!shpnt || !buffer || length<8 || strncmp("aha152x ", buffer, 8)!=0)
3311 return -EINVAL;
3313 #if defined(AHA152X_DEBUG)
3314 if(length>14 && strncmp("debug ", buffer+8, 6)==0) {
3315 int debug = HOSTDATA(shpnt)->debug;
3317 HOSTDATA(shpnt)->debug = simple_strtoul(buffer+14, NULL, 0);
3319 printk(KERN_INFO "aha152x%d: debugging options set to 0x%04x (were 0x%04x)\n", HOSTNO, HOSTDATA(shpnt)->debug, debug);
3320 } else
3321 #endif
3322 #if defined(AHA152X_STAT)
3323 if(length>13 && strncmp("reset", buffer+8, 5)==0) {
3324 int i;
3326 HOSTDATA(shpnt)->total_commands=0;
3327 HOSTDATA(shpnt)->disconnections=0;
3328 HOSTDATA(shpnt)->busfree_without_any_action=0;
3329 HOSTDATA(shpnt)->busfree_without_old_command=0;
3330 HOSTDATA(shpnt)->busfree_without_new_command=0;
3331 HOSTDATA(shpnt)->busfree_without_done_command=0;
3332 HOSTDATA(shpnt)->busfree_with_check_condition=0;
3333 for (i = idle; i<maxstate; i++) {
3334 HOSTDATA(shpnt)->count[i]=0;
3335 HOSTDATA(shpnt)->count_trans[i]=0;
3336 HOSTDATA(shpnt)->time[i]=0;
3339 printk(KERN_INFO "aha152x%d: stats reseted.\n", HOSTNO);
3341 } else
3342 #endif
3344 return -EINVAL;
3348 return length;
3351 #undef SPRINTF
3352 #define SPRINTF(args...) \
3353 do { if(pos < buffer + length) pos += sprintf(pos, ## args); } while(0)
3355 static int aha152x_proc_info(struct Scsi_Host *shpnt, char *buffer, char **start,
3356 off_t offset, int length, int inout)
3358 int i;
3359 char *pos = buffer;
3360 Scsi_Cmnd *ptr;
3361 unsigned long flags;
3362 int thislength;
3364 DPRINTK(debug_procinfo,
3365 KERN_DEBUG "aha152x_proc_info: buffer=%p offset=%ld length=%d hostno=%d inout=%d\n",
3366 buffer, offset, length, shpnt->host_no, inout);
3369 if (inout)
3370 return aha152x_set_info(buffer, length, shpnt);
3372 SPRINTF(AHA152X_REVID "\n");
3374 SPRINTF("ioports 0x%04lx to 0x%04lx\n",
3375 shpnt->io_port, shpnt->io_port + shpnt->n_io_port - 1);
3376 SPRINTF("interrupt 0x%02x\n", shpnt->irq);
3377 SPRINTF("disconnection/reconnection %s\n",
3378 RECONNECT ? "enabled" : "disabled");
3379 SPRINTF("parity checking %s\n",
3380 PARITY ? "enabled" : "disabled");
3381 SPRINTF("synchronous transfers %s\n",
3382 SYNCHRONOUS ? "enabled" : "disabled");
3383 SPRINTF("%d commands currently queued\n", HOSTDATA(shpnt)->commands);
3385 if(SYNCHRONOUS) {
3386 SPRINTF("synchronously operating targets (tick=50 ns):\n");
3387 for (i = 0; i < 8; i++)
3388 if (HOSTDATA(shpnt)->syncrate[i] & 0x7f)
3389 SPRINTF("target %d: period %dT/%dns; req/ack offset %d\n",
3391 (((HOSTDATA(shpnt)->syncrate[i] & 0x70) >> 4) + 2),
3392 (((HOSTDATA(shpnt)->syncrate[i] & 0x70) >> 4) + 2) * 50,
3393 HOSTDATA(shpnt)->syncrate[i] & 0x0f);
3395 #if defined(AHA152X_DEBUG)
3396 #define PDEBUG(flags,txt) \
3397 if(HOSTDATA(shpnt)->debug & flags) SPRINTF("(%s) ", txt);
3399 SPRINTF("enabled debugging options: ");
3401 PDEBUG(debug_procinfo, "procinfo");
3402 PDEBUG(debug_queue, "queue");
3403 PDEBUG(debug_intr, "interrupt");
3404 PDEBUG(debug_selection, "selection");
3405 PDEBUG(debug_msgo, "message out");
3406 PDEBUG(debug_msgi, "message in");
3407 PDEBUG(debug_status, "status");
3408 PDEBUG(debug_cmd, "command");
3409 PDEBUG(debug_datai, "data in");
3410 PDEBUG(debug_datao, "data out");
3411 PDEBUG(debug_eh, "eh");
3412 PDEBUG(debug_locks, "locks");
3413 PDEBUG(debug_phases, "phases");
3415 SPRINTF("\n");
3416 #endif
3418 SPRINTF("\nqueue status:\n");
3419 DO_LOCK(flags);
3420 if (ISSUE_SC) {
3421 SPRINTF("not yet issued commands:\n");
3422 for (ptr = ISSUE_SC; ptr; ptr = SCNEXT(ptr))
3423 pos += get_command(pos, ptr);
3424 } else
3425 SPRINTF("no not yet issued commands\n");
3426 DO_UNLOCK(flags);
3428 if (CURRENT_SC) {
3429 SPRINTF("current command:\n");
3430 pos += get_command(pos, CURRENT_SC);
3431 } else
3432 SPRINTF("no current command\n");
3434 if (DISCONNECTED_SC) {
3435 SPRINTF("disconnected commands:\n");
3436 for (ptr = DISCONNECTED_SC; ptr; ptr = SCNEXT(ptr))
3437 pos += get_command(pos, ptr);
3438 } else
3439 SPRINTF("no disconnected commands\n");
3441 pos += get_ports(shpnt, pos);
3443 #if defined(AHA152X_STAT)
3444 SPRINTF("statistics:\n"
3445 "total commands: %d\n"
3446 "disconnections: %d\n"
3447 "busfree with check condition: %d\n"
3448 "busfree without old command: %d\n"
3449 "busfree without new command: %d\n"
3450 "busfree without done command: %d\n"
3451 "busfree without any action: %d\n"
3452 "state "
3453 "transitions "
3454 "count "
3455 "time\n",
3456 HOSTDATA(shpnt)->total_commands,
3457 HOSTDATA(shpnt)->disconnections,
3458 HOSTDATA(shpnt)->busfree_with_check_condition,
3459 HOSTDATA(shpnt)->busfree_without_old_command,
3460 HOSTDATA(shpnt)->busfree_without_new_command,
3461 HOSTDATA(shpnt)->busfree_without_done_command,
3462 HOSTDATA(shpnt)->busfree_without_any_action);
3463 for(i=0; i<maxstate; i++) {
3464 SPRINTF("%-10s %-12d %-12d %-12ld\n",
3465 states[i].name,
3466 HOSTDATA(shpnt)->count_trans[i],
3467 HOSTDATA(shpnt)->count[i],
3468 HOSTDATA(shpnt)->time[i]);
3470 #endif
3472 DPRINTK(debug_procinfo, KERN_DEBUG "aha152x_proc_info: pos=%p\n", pos);
3474 thislength = pos - (buffer + offset);
3475 DPRINTK(debug_procinfo, KERN_DEBUG "aha152x_proc_info: length=%d thislength=%d\n", length, thislength);
3477 if(thislength<0) {
3478 DPRINTK(debug_procinfo, KERN_DEBUG "aha152x_proc_info: output too short\n");
3479 *start = NULL;
3480 return 0;
3483 thislength = thislength<length ? thislength : length;
3485 DPRINTK(debug_procinfo, KERN_DEBUG "aha152x_proc_info: return %d\n", thislength);
3487 *start = buffer + offset;
3488 return thislength < length ? thislength : length;
3491 static struct scsi_host_template aha152x_driver_template = {
3492 .module = THIS_MODULE,
3493 .name = AHA152X_REVID,
3494 .proc_name = "aha152x",
3495 .proc_info = aha152x_proc_info,
3496 .queuecommand = aha152x_queue,
3497 .eh_abort_handler = aha152x_abort,
3498 .eh_device_reset_handler = aha152x_device_reset,
3499 .eh_bus_reset_handler = aha152x_bus_reset,
3500 .eh_host_reset_handler = aha152x_host_reset,
3501 .bios_param = aha152x_biosparam,
3502 .can_queue = 1,
3503 .this_id = 7,
3504 .sg_tablesize = SG_ALL,
3505 .cmd_per_lun = 1,
3506 .use_clustering = DISABLE_CLUSTERING,
3509 #if !defined(PCMCIA)
3510 static int setup_count;
3511 static struct aha152x_setup setup[2];
3513 /* possible i/o addresses for the AIC-6260; default first */
3514 static unsigned short ports[] = { 0x340, 0x140 };
3516 #if !defined(SKIP_BIOSTEST)
3517 /* possible locations for the Adaptec BIOS; defaults first */
3518 static unsigned int addresses[] =
3520 0xdc000, /* default first */
3521 0xc8000,
3522 0xcc000,
3523 0xd0000,
3524 0xd4000,
3525 0xd8000,
3526 0xe0000,
3527 0xeb800, /* VTech Platinum SMP */
3528 0xf0000,
3531 /* signatures for various AIC-6[23]60 based controllers.
3532 The point in detecting signatures is to avoid useless and maybe
3533 harmful probes on ports. I'm not sure that all listed boards pass
3534 auto-configuration. For those which fail the BIOS signature is
3535 obsolete, because user intervention to supply the configuration is
3536 needed anyway. May be an information whether or not the BIOS supports
3537 extended translation could be also useful here. */
3538 static struct signature {
3539 unsigned char *signature;
3540 int sig_offset;
3541 int sig_length;
3542 } signatures[] =
3544 { "Adaptec AHA-1520 BIOS", 0x102e, 21 },
3545 /* Adaptec 152x */
3546 { "Adaptec AHA-1520B", 0x000b, 17 },
3547 /* Adaptec 152x rev B */
3548 { "Adaptec AHA-1520B", 0x0026, 17 },
3549 /* Iomega Jaz Jet ISA (AIC6370Q) */
3550 { "Adaptec ASW-B626 BIOS", 0x1029, 21 },
3551 /* on-board controller */
3552 { "Adaptec BIOS: ASW-B626", 0x000f, 22 },
3553 /* on-board controller */
3554 { "Adaptec ASW-B626 S2", 0x2e6c, 19 },
3555 /* on-board controller */
3556 { "Adaptec BIOS:AIC-6360", 0x000c, 21 },
3557 /* on-board controller */
3558 { "ScsiPro SP-360 BIOS", 0x2873, 19 },
3559 /* ScsiPro-Controller */
3560 { "GA-400 LOCAL BUS SCSI BIOS", 0x102e, 26 },
3561 /* Gigabyte Local-Bus-SCSI */
3562 { "Adaptec BIOS:AVA-282X", 0x000c, 21 },
3563 /* Adaptec 282x */
3564 { "Adaptec IBM Dock II SCSI", 0x2edd, 24 },
3565 /* IBM Thinkpad Dock II */
3566 { "Adaptec BIOS:AHA-1532P", 0x001c, 22 },
3567 /* IBM Thinkpad Dock II SCSI */
3568 { "DTC3520A Host Adapter BIOS", 0x318a, 26 },
3569 /* DTC 3520A ISA SCSI */
3571 #endif /* !SKIP_BIOSTEST */
3574 * Test, if port_base is valid.
3577 static int aha152x_porttest(int io_port)
3579 int i;
3581 SETPORT(io_port + O_DMACNTRL1, 0); /* reset stack pointer */
3582 for (i = 0; i < 16; i++)
3583 SETPORT(io_port + O_STACK, i);
3585 SETPORT(io_port + O_DMACNTRL1, 0); /* reset stack pointer */
3586 for (i = 0; i < 16 && GETPORT(io_port + O_STACK) == i; i++)
3589 return (i == 16);
3592 static int tc1550_porttest(int io_port)
3594 int i;
3596 SETPORT(io_port + O_TC_DMACNTRL1, 0); /* reset stack pointer */
3597 for (i = 0; i < 16; i++)
3598 SETPORT(io_port + O_STACK, i);
3600 SETPORT(io_port + O_TC_DMACNTRL1, 0); /* reset stack pointer */
3601 for (i = 0; i < 16 && GETPORT(io_port + O_TC_STACK) == i; i++)
3604 return (i == 16);
3608 static int checksetup(struct aha152x_setup *setup)
3610 int i;
3611 for (i = 0; i < ARRAY_SIZE(ports) && (setup->io_port != ports[i]); i++)
3614 if (i == ARRAY_SIZE(ports))
3615 return 0;
3617 if ( request_region(setup->io_port, IO_RANGE, "aha152x")==0 ) {
3618 printk(KERN_ERR "aha152x: io port 0x%x busy.\n", setup->io_port);
3619 return 0;
3622 if( aha152x_porttest(setup->io_port) ) {
3623 setup->tc1550=0;
3624 } else if( tc1550_porttest(setup->io_port) ) {
3625 setup->tc1550=1;
3626 } else {
3627 release_region(setup->io_port, IO_RANGE);
3628 return 0;
3631 release_region(setup->io_port, IO_RANGE);
3633 if ((setup->irq < IRQ_MIN) || (setup->irq > IRQ_MAX))
3634 return 0;
3636 if ((setup->scsiid < 0) || (setup->scsiid > 7))
3637 return 0;
3639 if ((setup->reconnect < 0) || (setup->reconnect > 1))
3640 return 0;
3642 if ((setup->parity < 0) || (setup->parity > 1))
3643 return 0;
3645 if ((setup->synchronous < 0) || (setup->synchronous > 1))
3646 return 0;
3648 if ((setup->ext_trans < 0) || (setup->ext_trans > 1))
3649 return 0;
3652 return 1;
3656 static int __init aha152x_init(void)
3658 int i, j, ok;
3659 #if defined(AUTOCONF)
3660 aha152x_config conf;
3661 #endif
3662 #ifdef __ISAPNP__
3663 struct pnp_dev *dev=NULL, *pnpdev[2] = {NULL, NULL};
3664 #endif
3666 if ( setup_count ) {
3667 printk(KERN_INFO "aha152x: processing commandline: ");
3669 for (i = 0; i<setup_count; i++) {
3670 if (!checksetup(&setup[i])) {
3671 printk(KERN_ERR "\naha152x: %s\n", setup[i].conf);
3672 printk(KERN_ERR "aha152x: invalid line\n");
3675 printk("ok\n");
3678 #if defined(SETUP0)
3679 if (setup_count < ARRAY_SIZE(setup)) {
3680 struct aha152x_setup override = SETUP0;
3682 if (setup_count == 0 || (override.io_port != setup[0].io_port)) {
3683 if (!checksetup(&override)) {
3684 printk(KERN_ERR "\naha152x: invalid override SETUP0={0x%x,%d,%d,%d,%d,%d,%d,%d}\n",
3685 override.io_port,
3686 override.irq,
3687 override.scsiid,
3688 override.reconnect,
3689 override.parity,
3690 override.synchronous,
3691 override.delay,
3692 override.ext_trans);
3693 } else
3694 setup[setup_count++] = override;
3697 #endif
3699 #if defined(SETUP1)
3700 if (setup_count < ARRAY_SIZE(setup)) {
3701 struct aha152x_setup override = SETUP1;
3703 if (setup_count == 0 || (override.io_port != setup[0].io_port)) {
3704 if (!checksetup(&override)) {
3705 printk(KERN_ERR "\naha152x: invalid override SETUP1={0x%x,%d,%d,%d,%d,%d,%d,%d}\n",
3706 override.io_port,
3707 override.irq,
3708 override.scsiid,
3709 override.reconnect,
3710 override.parity,
3711 override.synchronous,
3712 override.delay,
3713 override.ext_trans);
3714 } else
3715 setup[setup_count++] = override;
3718 #endif
3720 #if defined(MODULE)
3721 if (setup_count<ARRAY_SIZE(setup) && (aha152x[0]!=0 || io[0]!=0 || irq[0]!=0)) {
3722 if(aha152x[0]!=0) {
3723 setup[setup_count].conf = "";
3724 setup[setup_count].io_port = aha152x[0];
3725 setup[setup_count].irq = aha152x[1];
3726 setup[setup_count].scsiid = aha152x[2];
3727 setup[setup_count].reconnect = aha152x[3];
3728 setup[setup_count].parity = aha152x[4];
3729 setup[setup_count].synchronous = aha152x[5];
3730 setup[setup_count].delay = aha152x[6];
3731 setup[setup_count].ext_trans = aha152x[7];
3732 #if defined(AHA152X_DEBUG)
3733 setup[setup_count].debug = aha152x[8];
3734 #endif
3735 } else if(io[0]!=0 || irq[0]!=0) {
3736 if(io[0]!=0) setup[setup_count].io_port = io[0];
3737 if(irq[0]!=0) setup[setup_count].irq = irq[0];
3739 setup[setup_count].scsiid = scsiid[0];
3740 setup[setup_count].reconnect = reconnect[0];
3741 setup[setup_count].parity = parity[0];
3742 setup[setup_count].synchronous = sync[0];
3743 setup[setup_count].delay = delay[0];
3744 setup[setup_count].ext_trans = exttrans[0];
3745 #if defined(AHA152X_DEBUG)
3746 setup[setup_count].debug = debug[0];
3747 #endif
3750 if (checksetup(&setup[setup_count]))
3751 setup_count++;
3752 else
3753 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",
3754 setup[setup_count].io_port,
3755 setup[setup_count].irq,
3756 setup[setup_count].scsiid,
3757 setup[setup_count].reconnect,
3758 setup[setup_count].parity,
3759 setup[setup_count].synchronous,
3760 setup[setup_count].delay,
3761 setup[setup_count].ext_trans);
3764 if (setup_count<ARRAY_SIZE(setup) && (aha152x1[0]!=0 || io[1]!=0 || irq[1]!=0)) {
3765 if(aha152x1[0]!=0) {
3766 setup[setup_count].conf = "";
3767 setup[setup_count].io_port = aha152x1[0];
3768 setup[setup_count].irq = aha152x1[1];
3769 setup[setup_count].scsiid = aha152x1[2];
3770 setup[setup_count].reconnect = aha152x1[3];
3771 setup[setup_count].parity = aha152x1[4];
3772 setup[setup_count].synchronous = aha152x1[5];
3773 setup[setup_count].delay = aha152x1[6];
3774 setup[setup_count].ext_trans = aha152x1[7];
3775 #if defined(AHA152X_DEBUG)
3776 setup[setup_count].debug = aha152x1[8];
3777 #endif
3778 } else if(io[1]!=0 || irq[1]!=0) {
3779 if(io[1]!=0) setup[setup_count].io_port = io[1];
3780 if(irq[1]!=0) setup[setup_count].irq = irq[1];
3782 setup[setup_count].scsiid = scsiid[1];
3783 setup[setup_count].reconnect = reconnect[1];
3784 setup[setup_count].parity = parity[1];
3785 setup[setup_count].synchronous = sync[1];
3786 setup[setup_count].delay = delay[1];
3787 setup[setup_count].ext_trans = exttrans[1];
3788 #if defined(AHA152X_DEBUG)
3789 setup[setup_count].debug = debug[1];
3790 #endif
3792 if (checksetup(&setup[setup_count]))
3793 setup_count++;
3794 else
3795 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",
3796 setup[setup_count].io_port,
3797 setup[setup_count].irq,
3798 setup[setup_count].scsiid,
3799 setup[setup_count].reconnect,
3800 setup[setup_count].parity,
3801 setup[setup_count].synchronous,
3802 setup[setup_count].delay,
3803 setup[setup_count].ext_trans);
3805 #endif
3807 #ifdef __ISAPNP__
3808 for(i=0; setup_count<ARRAY_SIZE(setup) && id_table[i].vendor; i++) {
3809 while ( setup_count<ARRAY_SIZE(setup) &&
3810 (dev=pnp_find_dev(NULL, id_table[i].vendor, id_table[i].function, dev)) ) {
3811 if (pnp_device_attach(dev) < 0)
3812 continue;
3814 if (pnp_activate_dev(dev) < 0) {
3815 pnp_device_detach(dev);
3816 continue;
3819 if (!pnp_port_valid(dev, 0)) {
3820 pnp_device_detach(dev);
3821 continue;
3824 if (setup_count==1 && pnp_port_start(dev, 0)==setup[0].io_port) {
3825 pnp_device_detach(dev);
3826 continue;
3829 setup[setup_count].io_port = pnp_port_start(dev, 0);
3830 setup[setup_count].irq = pnp_irq(dev, 0);
3831 setup[setup_count].scsiid = 7;
3832 setup[setup_count].reconnect = 1;
3833 setup[setup_count].parity = 1;
3834 setup[setup_count].synchronous = 1;
3835 setup[setup_count].delay = DELAY_DEFAULT;
3836 setup[setup_count].ext_trans = 0;
3837 #if defined(AHA152X_DEBUG)
3838 setup[setup_count].debug = DEBUG_DEFAULT;
3839 #endif
3840 #if defined(__ISAPNP__)
3841 pnpdev[setup_count] = dev;
3842 #endif
3843 printk (KERN_INFO
3844 "aha152x: found ISAPnP adapter at io=0x%03x, irq=%d\n",
3845 setup[setup_count].io_port, setup[setup_count].irq);
3846 setup_count++;
3849 #endif
3851 #if defined(AUTOCONF)
3852 if (setup_count<ARRAY_SIZE(setup)) {
3853 #if !defined(SKIP_BIOSTEST)
3854 ok = 0;
3855 for (i = 0; i < ARRAY_SIZE(addresses) && !ok; i++) {
3856 void __iomem *p = ioremap(addresses[i], 0x4000);
3857 if (!p)
3858 continue;
3859 for (j = 0; j<ARRAY_SIZE(signatures) && !ok; j++)
3860 ok = check_signature(p + signatures[j].sig_offset,
3861 signatures[j].signature, signatures[j].sig_length);
3862 iounmap(p);
3864 if (!ok && setup_count == 0)
3865 return 0;
3867 printk(KERN_INFO "aha152x: BIOS test: passed, ");
3868 #else
3869 printk(KERN_INFO "aha152x: ");
3870 #endif /* !SKIP_BIOSTEST */
3872 ok = 0;
3873 for (i = 0; i < ARRAY_SIZE(ports) && setup_count < 2; i++) {
3874 if ((setup_count == 1) && (setup[0].io_port == ports[i]))
3875 continue;
3877 if ( request_region(ports[i], IO_RANGE, "aha152x")==0 ) {
3878 printk(KERN_ERR "aha152x: io port 0x%x busy.\n", ports[i]);
3879 continue;
3882 if (aha152x_porttest(ports[i])) {
3883 setup[setup_count].tc1550 = 0;
3885 conf.cf_port =
3886 (GETPORT(ports[i] + O_PORTA) << 8) + GETPORT(ports[i] + O_PORTB);
3887 } else if (tc1550_porttest(ports[i])) {
3888 setup[setup_count].tc1550 = 1;
3890 conf.cf_port =
3891 (GETPORT(ports[i] + O_TC_PORTA) << 8) + GETPORT(ports[i] + O_TC_PORTB);
3892 } else {
3893 release_region(ports[i], IO_RANGE);
3894 continue;
3897 release_region(ports[i], IO_RANGE);
3899 ok++;
3900 setup[setup_count].io_port = ports[i];
3901 setup[setup_count].irq = IRQ_MIN + conf.cf_irq;
3902 setup[setup_count].scsiid = conf.cf_id;
3903 setup[setup_count].reconnect = conf.cf_tardisc;
3904 setup[setup_count].parity = !conf.cf_parity;
3905 setup[setup_count].synchronous = conf.cf_syncneg;
3906 setup[setup_count].delay = DELAY_DEFAULT;
3907 setup[setup_count].ext_trans = 0;
3908 #if defined(AHA152X_DEBUG)
3909 setup[setup_count].debug = DEBUG_DEFAULT;
3910 #endif
3911 setup_count++;
3915 if (ok)
3916 printk("auto configuration: ok, ");
3918 #endif
3920 printk("%d controller(s) configured\n", setup_count);
3922 for (i=0; i<setup_count; i++) {
3923 if ( request_region(setup[i].io_port, IO_RANGE, "aha152x") ) {
3924 struct Scsi_Host *shpnt = aha152x_probe_one(&setup[i]);
3926 if( !shpnt ) {
3927 release_region(setup[i].io_port, IO_RANGE);
3928 #if defined(__ISAPNP__)
3929 } else if( pnpdev[i] ) {
3930 HOSTDATA(shpnt)->pnpdev=pnpdev[i];
3931 pnpdev[i]=NULL;
3932 #endif
3934 } else {
3935 printk(KERN_ERR "aha152x: io port 0x%x busy.\n", setup[i].io_port);
3938 #if defined(__ISAPNP__)
3939 if( pnpdev[i] )
3940 pnp_device_detach(pnpdev[i]);
3941 #endif
3944 return 1;
3947 static void __exit aha152x_exit(void)
3949 struct aha152x_hostdata *hd;
3951 list_for_each_entry(hd, &aha152x_host_list, host_list) {
3952 struct Scsi_Host *shost = container_of((void *)hd, struct Scsi_Host, hostdata);
3954 aha152x_release(shost);
3958 module_init(aha152x_init);
3959 module_exit(aha152x_exit);
3961 #if !defined(MODULE)
3962 static int __init aha152x_setup(char *str)
3964 #if defined(AHA152X_DEBUG)
3965 int ints[11];
3966 #else
3967 int ints[10];
3968 #endif
3969 get_options(str, ARRAY_SIZE(ints), ints);
3971 if(setup_count>=ARRAY_SIZE(setup)) {
3972 printk(KERN_ERR "aha152x: you can only configure up to two controllers\n");
3973 return 1;
3976 setup[setup_count].conf = str;
3977 setup[setup_count].io_port = ints[0] >= 1 ? ints[1] : 0x340;
3978 setup[setup_count].irq = ints[0] >= 2 ? ints[2] : 11;
3979 setup[setup_count].scsiid = ints[0] >= 3 ? ints[3] : 7;
3980 setup[setup_count].reconnect = ints[0] >= 4 ? ints[4] : 1;
3981 setup[setup_count].parity = ints[0] >= 5 ? ints[5] : 1;
3982 setup[setup_count].synchronous = ints[0] >= 6 ? ints[6] : 1;
3983 setup[setup_count].delay = ints[0] >= 7 ? ints[7] : DELAY_DEFAULT;
3984 setup[setup_count].ext_trans = ints[0] >= 8 ? ints[8] : 0;
3985 #if defined(AHA152X_DEBUG)
3986 setup[setup_count].debug = ints[0] >= 9 ? ints[9] : DEBUG_DEFAULT;
3987 if (ints[0] > 9) {
3988 printk(KERN_NOTICE "aha152x: usage: aha152x=<IOBASE>[,<IRQ>[,<SCSI ID>"
3989 "[,<RECONNECT>[,<PARITY>[,<SYNCHRONOUS>[,<DELAY>[,<EXT_TRANS>[,<DEBUG>]]]]]]]]\n");
3990 #else
3991 if (ints[0] > 8) { /*}*/
3992 printk(KERN_NOTICE "aha152x: usage: aha152x=<IOBASE>[,<IRQ>[,<SCSI ID>"
3993 "[,<RECONNECT>[,<PARITY>[,<SYNCHRONOUS>[,<DELAY>[,<EXT_TRANS>]]]]]]]\n");
3994 #endif
3995 } else {
3996 setup_count++;
3997 return 0;
4000 return 1;
4002 __setup("aha152x=", aha152x_setup);
4003 #endif
4005 #endif /* !PCMCIA */