ACPI: thinkpad-acpi: change thinkpad-acpi input default and kconfig help
[linux-2.6/linux-acpi-2.6/ibm-acpi-2.6.git] / drivers / scsi / aha152x.c
blob85f2394ffc3e352042ef1bb26c0da5f97198f8a4
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/completion.h>
244 #include <linux/errno.h>
245 #include <linux/string.h>
246 #include <linux/wait.h>
247 #include <linux/ioport.h>
248 #include <linux/delay.h>
249 #include <linux/proc_fs.h>
250 #include <linux/interrupt.h>
251 #include <linux/init.h>
252 #include <linux/kernel.h>
253 #include <linux/isapnp.h>
254 #include <linux/spinlock.h>
255 #include <linux/workqueue.h>
256 #include <linux/list.h>
257 #include <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 completion *done;/* 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)->done
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 completion *complete,
973 int phase, void (*done)(Scsi_Cmnd *))
975 struct Scsi_Host *shpnt = SCpnt->device->host;
976 unsigned long flags;
978 #if defined(AHA152X_DEBUG)
979 if (HOSTDATA(shpnt)->debug & debug_queue) {
980 printk(INFO_LEAD "queue: %p; cmd_len=%d pieces=%d size=%u cmnd=",
981 CMDINFO(SCpnt), SCpnt, SCpnt->cmd_len, SCpnt->use_sg, SCpnt->request_bufflen);
982 __scsi_print_command(SCpnt->cmnd);
984 #endif
986 SCpnt->scsi_done = done;
987 SCpnt->resid = SCpnt->request_bufflen;
988 SCpnt->SCp.phase = not_issued | phase;
989 SCpnt->SCp.Status = CHECK_CONDITION;
990 SCpnt->SCp.Message = 0;
991 SCpnt->SCp.have_data_in = 0;
992 SCpnt->SCp.sent_command = 0;
994 if(SCpnt->SCp.phase & (resetting|check_condition)) {
995 if(SCpnt->host_scribble==0 || SCSEM(SCpnt) || SCNEXT(SCpnt)) {
996 printk(ERR_LEAD "cannot reuse command\n", CMDINFO(SCpnt));
997 return FAILED;
999 } else {
1000 struct aha152x_scdata *sc;
1002 SCpnt->host_scribble = kmalloc(sizeof(struct aha152x_scdata), GFP_ATOMIC);
1003 if(SCpnt->host_scribble==0) {
1004 printk(ERR_LEAD "allocation failed\n", CMDINFO(SCpnt));
1005 return FAILED;
1008 sc = SCDATA(SCpnt);
1009 memcpy(sc->cmnd, SCpnt->cmnd, sizeof(sc->cmnd));
1010 sc->request_buffer = SCpnt->request_buffer;
1011 sc->request_bufflen = SCpnt->request_bufflen;
1012 sc->use_sg = SCpnt->use_sg;
1013 sc->cmd_len = SCpnt->cmd_len;
1016 SCNEXT(SCpnt) = NULL;
1017 SCSEM(SCpnt) = complete;
1019 /* setup scratch area
1020 SCp.ptr : buffer pointer
1021 SCp.this_residual : buffer length
1022 SCp.buffer : next buffer
1023 SCp.buffers_residual : left buffers in list
1024 SCp.phase : current state of the command */
1025 if (SCpnt->use_sg) {
1026 SCpnt->SCp.buffer = (struct scatterlist *) SCpnt->request_buffer;
1027 SCpnt->SCp.ptr = SG_ADDRESS(SCpnt->SCp.buffer);
1028 SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length;
1029 SCpnt->SCp.buffers_residual = SCpnt->use_sg - 1;
1030 } else {
1031 SCpnt->SCp.ptr = (char *) SCpnt->request_buffer;
1032 SCpnt->SCp.this_residual = SCpnt->request_bufflen;
1033 SCpnt->SCp.buffer = NULL;
1034 SCpnt->SCp.buffers_residual = 0;
1037 DO_LOCK(flags);
1039 #if defined(AHA152X_STAT)
1040 HOSTDATA(shpnt)->total_commands++;
1041 #endif
1043 /* Turn led on, when this is the first command. */
1044 HOSTDATA(shpnt)->commands++;
1045 if (HOSTDATA(shpnt)->commands==1)
1046 SETPORT(PORTA, 1);
1048 append_SC(&ISSUE_SC, SCpnt);
1050 if(!HOSTDATA(shpnt)->in_intr)
1051 setup_expected_interrupts(shpnt);
1053 DO_UNLOCK(flags);
1055 return 0;
1059 * queue a command
1062 static int aha152x_queue(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *))
1064 #if 0
1065 if(*SCpnt->cmnd == REQUEST_SENSE) {
1066 SCpnt->result = 0;
1067 done(SCpnt);
1069 return 0;
1071 #endif
1073 return aha152x_internal_queue(SCpnt, NULL, 0, done);
1081 static void reset_done(Scsi_Cmnd *SCpnt)
1083 #if 0
1084 struct Scsi_Host *shpnt = SCpnt->host;
1085 DPRINTK(debug_eh, INFO_LEAD "reset_done called\n", CMDINFO(SCpnt));
1086 #endif
1087 if(SCSEM(SCpnt)) {
1088 complete(SCSEM(SCpnt));
1089 } else {
1090 printk(KERN_ERR "aha152x: reset_done w/o completion\n");
1095 * Abort a command
1098 static int aha152x_abort(Scsi_Cmnd *SCpnt)
1100 struct Scsi_Host *shpnt = SCpnt->device->host;
1101 Scsi_Cmnd *ptr;
1102 unsigned long flags;
1104 #if defined(AHA152X_DEBUG)
1105 if(HOSTDATA(shpnt)->debug & debug_eh) {
1106 printk(DEBUG_LEAD "abort(%p)", CMDINFO(SCpnt), SCpnt);
1107 show_queues(shpnt);
1109 #endif
1111 DO_LOCK(flags);
1113 ptr=remove_SC(&ISSUE_SC, SCpnt);
1115 if(ptr) {
1116 DPRINTK(debug_eh, DEBUG_LEAD "not yet issued - SUCCESS\n", CMDINFO(SCpnt));
1118 HOSTDATA(shpnt)->commands--;
1119 if (!HOSTDATA(shpnt)->commands)
1120 SETPORT(PORTA, 0);
1121 DO_UNLOCK(flags);
1123 kfree(SCpnt->host_scribble);
1124 SCpnt->host_scribble=NULL;
1126 return SUCCESS;
1129 DO_UNLOCK(flags);
1132 * FIXME:
1133 * for current command: queue ABORT for message out and raise ATN
1134 * for disconnected command: pseudo SC with ABORT message or ABORT on reselection?
1138 printk(ERR_LEAD "cannot abort running or disconnected command\n", CMDINFO(SCpnt));
1140 return FAILED;
1144 * Reset a device
1147 static int aha152x_device_reset(Scsi_Cmnd * SCpnt)
1149 struct Scsi_Host *shpnt = SCpnt->device->host;
1150 DECLARE_COMPLETION(done);
1151 int ret, issued, disconnected;
1152 unsigned char old_cmd_len = SCpnt->cmd_len;
1153 unsigned short old_use_sg = SCpnt->use_sg;
1154 void *old_buffer = SCpnt->request_buffer;
1155 unsigned old_bufflen = SCpnt->request_bufflen;
1156 unsigned long flags;
1157 unsigned long timeleft;
1159 #if defined(AHA152X_DEBUG)
1160 if(HOSTDATA(shpnt)->debug & debug_eh) {
1161 printk(INFO_LEAD "aha152x_device_reset(%p)", CMDINFO(SCpnt), SCpnt);
1162 show_queues(shpnt);
1164 #endif
1166 if(CURRENT_SC==SCpnt) {
1167 printk(ERR_LEAD "cannot reset current device\n", CMDINFO(SCpnt));
1168 return FAILED;
1171 DO_LOCK(flags);
1172 issued = remove_SC(&ISSUE_SC, SCpnt)==0;
1173 disconnected = issued && remove_SC(&DISCONNECTED_SC, SCpnt);
1174 DO_UNLOCK(flags);
1176 SCpnt->cmd_len = 0;
1177 SCpnt->use_sg = 0;
1178 SCpnt->request_buffer = NULL;
1179 SCpnt->request_bufflen = 0;
1181 aha152x_internal_queue(SCpnt, &done, resetting, reset_done);
1183 timeleft = wait_for_completion_timeout(&done, 100*HZ);
1184 if (!timeleft) {
1185 /* remove command from issue queue */
1186 DO_LOCK(flags);
1187 remove_SC(&ISSUE_SC, SCpnt);
1188 DO_UNLOCK(flags);
1191 SCpnt->cmd_len = old_cmd_len;
1192 SCpnt->use_sg = old_use_sg;
1193 SCpnt->request_buffer = old_buffer;
1194 SCpnt->request_bufflen = old_bufflen;
1196 DO_LOCK(flags);
1198 if(SCpnt->SCp.phase & resetted) {
1199 HOSTDATA(shpnt)->commands--;
1200 if (!HOSTDATA(shpnt)->commands)
1201 SETPORT(PORTA, 0);
1202 kfree(SCpnt->host_scribble);
1203 SCpnt->host_scribble=NULL;
1205 ret = SUCCESS;
1206 } else {
1207 /* requeue */
1208 if(!issued) {
1209 append_SC(&ISSUE_SC, SCpnt);
1210 } else if(disconnected) {
1211 append_SC(&DISCONNECTED_SC, SCpnt);
1214 ret = FAILED;
1217 DO_UNLOCK(flags);
1218 return ret;
1221 static void free_hard_reset_SCs(struct Scsi_Host *shpnt, Scsi_Cmnd **SCs)
1223 Scsi_Cmnd *ptr;
1225 ptr=*SCs;
1226 while(ptr) {
1227 Scsi_Cmnd *next;
1229 if(SCDATA(ptr)) {
1230 next = SCNEXT(ptr);
1231 } else {
1232 printk(DEBUG_LEAD "queue corrupted at %p\n", CMDINFO(ptr), ptr);
1233 next = NULL;
1236 if (!ptr->device->soft_reset) {
1237 DPRINTK(debug_eh, DEBUG_LEAD "disconnected command %p removed\n", CMDINFO(ptr), ptr);
1238 remove_SC(SCs, ptr);
1239 HOSTDATA(shpnt)->commands--;
1240 kfree(ptr->host_scribble);
1241 ptr->host_scribble=NULL;
1244 ptr = next;
1249 * Reset the bus
1252 static int aha152x_bus_reset_host(struct Scsi_Host *shpnt)
1254 unsigned long flags;
1256 DO_LOCK(flags);
1258 #if defined(AHA152X_DEBUG)
1259 if(HOSTDATA(shpnt)->debug & debug_eh) {
1260 printk(KERN_DEBUG "scsi%d: bus reset", shpnt->host_no);
1261 show_queues(shpnt);
1263 #endif
1265 free_hard_reset_SCs(shpnt, &ISSUE_SC);
1266 free_hard_reset_SCs(shpnt, &DISCONNECTED_SC);
1268 DPRINTK(debug_eh, KERN_DEBUG "scsi%d: resetting bus\n", shpnt->host_no);
1270 SETPORT(SCSISEQ, SCSIRSTO);
1271 mdelay(256);
1272 SETPORT(SCSISEQ, 0);
1273 mdelay(DELAY);
1275 DPRINTK(debug_eh, KERN_DEBUG "scsi%d: bus resetted\n", shpnt->host_no);
1277 setup_expected_interrupts(shpnt);
1278 if(HOSTDATA(shpnt)->commands==0)
1279 SETPORT(PORTA, 0);
1281 DO_UNLOCK(flags);
1283 return SUCCESS;
1287 * Reset the bus
1290 static int aha152x_bus_reset(Scsi_Cmnd *SCpnt)
1292 return aha152x_bus_reset_host(SCpnt->device->host);
1296 * Restore default values to the AIC-6260 registers and reset the fifos
1299 static void reset_ports(struct Scsi_Host *shpnt)
1301 unsigned long flags;
1303 /* disable interrupts */
1304 SETPORT(DMACNTRL0, RSTFIFO);
1306 SETPORT(SCSISEQ, 0);
1308 SETPORT(SXFRCTL1, 0);
1309 SETPORT(SCSISIG, 0);
1310 SETRATE(0);
1312 /* clear all interrupt conditions */
1313 SETPORT(SSTAT0, 0x7f);
1314 SETPORT(SSTAT1, 0xef);
1316 SETPORT(SSTAT4, SYNCERR | FWERR | FRERR);
1318 SETPORT(DMACNTRL0, 0);
1319 SETPORT(DMACNTRL1, 0);
1321 SETPORT(BRSTCNTRL, 0xf1);
1323 /* clear SCSI fifos and transfer count */
1324 SETPORT(SXFRCTL0, CH1|CLRCH1|CLRSTCNT);
1325 SETPORT(SXFRCTL0, CH1);
1327 DO_LOCK(flags);
1328 setup_expected_interrupts(shpnt);
1329 DO_UNLOCK(flags);
1333 * Reset the host (bus and controller)
1336 int aha152x_host_reset_host(struct Scsi_Host *shpnt)
1338 DPRINTK(debug_eh, KERN_DEBUG "scsi%d: host reset\n", shpnt->host_no);
1340 aha152x_bus_reset_host(shpnt);
1342 DPRINTK(debug_eh, KERN_DEBUG "scsi%d: resetting ports\n", shpnt->host_no);
1343 reset_ports(shpnt);
1345 return SUCCESS;
1349 * Reset the host (bus and controller)
1352 static int aha152x_host_reset(Scsi_Cmnd *SCpnt)
1354 return aha152x_host_reset_host(SCpnt->device->host);
1358 * Return the "logical geometry"
1361 static int aha152x_biosparam(struct scsi_device *sdev, struct block_device *bdev,
1362 sector_t capacity, int *info_array)
1364 struct Scsi_Host *shpnt = sdev->host;
1366 /* try default translation */
1367 info_array[0] = 64;
1368 info_array[1] = 32;
1369 info_array[2] = (unsigned long)capacity / (64 * 32);
1371 /* for disks >1GB do some guessing */
1372 if (info_array[2] >= 1024) {
1373 int info[3];
1375 /* try to figure out the geometry from the partition table */
1376 if (scsicam_bios_param(bdev, capacity, info) < 0 ||
1377 !((info[0] == 64 && info[1] == 32) || (info[0] == 255 && info[1] == 63))) {
1378 if (EXT_TRANS) {
1379 printk(KERN_NOTICE
1380 "aha152x: unable to verify geometry for disk with >1GB.\n"
1381 " using extended translation.\n");
1382 info_array[0] = 255;
1383 info_array[1] = 63;
1384 info_array[2] = (unsigned long)capacity / (255 * 63);
1385 } else {
1386 printk(KERN_NOTICE
1387 "aha152x: unable to verify geometry for disk with >1GB.\n"
1388 " Using default translation. Please verify yourself.\n"
1389 " Perhaps you need to enable extended translation in the driver.\n"
1390 " See Documentation/scsi/aha152x.txt for details.\n");
1392 } else {
1393 info_array[0] = info[0];
1394 info_array[1] = info[1];
1395 info_array[2] = info[2];
1397 if (info[0] == 255 && !EXT_TRANS) {
1398 printk(KERN_NOTICE
1399 "aha152x: current partition table is using extended translation.\n"
1400 " using it also, although it's not explicitly enabled.\n");
1405 return 0;
1409 * Internal done function
1412 static void done(struct Scsi_Host *shpnt, int error)
1414 if (CURRENT_SC) {
1415 if(DONE_SC)
1416 printk(ERR_LEAD "there's already a completed command %p - will cause abort\n", CMDINFO(CURRENT_SC), DONE_SC);
1418 DONE_SC = CURRENT_SC;
1419 CURRENT_SC = NULL;
1420 DONE_SC->result = error;
1421 } else
1422 printk(KERN_ERR "aha152x: done() called outside of command\n");
1425 static struct work_struct aha152x_tq;
1428 * Run service completions on the card with interrupts enabled.
1431 static void run(struct work_struct *work)
1433 struct aha152x_hostdata *hd;
1435 list_for_each_entry(hd, &aha152x_host_list, host_list) {
1436 struct Scsi_Host *shost = container_of((void *)hd, struct Scsi_Host, hostdata);
1438 is_complete(shost);
1443 * Interrupt handler
1446 static irqreturn_t intr(int irqno, void *dev_id)
1448 struct Scsi_Host *shpnt = (struct Scsi_Host *)dev_id;
1449 unsigned long flags;
1450 unsigned char rev, dmacntrl0;
1452 if (!shpnt) {
1453 printk(KERN_ERR "aha152x: catched interrupt %d for unknown controller.\n", irqno);
1454 return IRQ_NONE;
1458 * Read a couple of registers that are known to not be all 1's. If
1459 * we read all 1's (-1), that means that either:
1461 * a. The host adapter chip has gone bad, and we cannot control it,
1462 * OR
1463 * b. The host adapter is a PCMCIA card that has been ejected
1465 * In either case, we cannot do anything with the host adapter at
1466 * this point in time. So just ignore the interrupt and return.
1467 * In the latter case, the interrupt might actually be meant for
1468 * someone else sharing this IRQ, and that driver will handle it.
1470 rev = GETPORT(REV);
1471 dmacntrl0 = GETPORT(DMACNTRL0);
1472 if ((rev == 0xFF) && (dmacntrl0 == 0xFF))
1473 return IRQ_NONE;
1475 if( TESTLO(DMASTAT, INTSTAT) )
1476 return IRQ_NONE;
1478 /* no more interrupts from the controller, while we're busy.
1479 INTEN is restored by the BH handler */
1480 CLRBITS(DMACNTRL0, INTEN);
1482 DO_LOCK(flags);
1483 if( HOSTDATA(shpnt)->service==0 ) {
1484 HOSTDATA(shpnt)->service=1;
1486 /* Poke the BH handler */
1487 INIT_WORK(&aha152x_tq, run);
1488 schedule_work(&aha152x_tq);
1490 DO_UNLOCK(flags);
1492 return IRQ_HANDLED;
1496 * busfree phase
1497 * - handle completition/disconnection/error of current command
1498 * - start selection for next command (if any)
1500 static void busfree_run(struct Scsi_Host *shpnt)
1502 unsigned long flags;
1503 #if defined(AHA152X_STAT)
1504 int action=0;
1505 #endif
1507 SETPORT(SXFRCTL0, CH1|CLRCH1|CLRSTCNT);
1508 SETPORT(SXFRCTL0, CH1);
1510 SETPORT(SSTAT1, CLRBUSFREE);
1512 if(CURRENT_SC) {
1513 #if defined(AHA152X_STAT)
1514 action++;
1515 #endif
1516 CURRENT_SC->SCp.phase &= ~syncneg;
1518 if(CURRENT_SC->SCp.phase & completed) {
1519 /* target sent COMMAND COMPLETE */
1520 done(shpnt, (CURRENT_SC->SCp.Status & 0xff) | ((CURRENT_SC->SCp.Message & 0xff) << 8) | (DID_OK << 16));
1522 } else if(CURRENT_SC->SCp.phase & aborted) {
1523 DPRINTK(debug_eh, DEBUG_LEAD "ABORT sent\n", CMDINFO(CURRENT_SC));
1524 done(shpnt, (CURRENT_SC->SCp.Status & 0xff) | ((CURRENT_SC->SCp.Message & 0xff) << 8) | (DID_ABORT << 16));
1526 } else if(CURRENT_SC->SCp.phase & resetted) {
1527 DPRINTK(debug_eh, DEBUG_LEAD "BUS DEVICE RESET sent\n", CMDINFO(CURRENT_SC));
1528 done(shpnt, (CURRENT_SC->SCp.Status & 0xff) | ((CURRENT_SC->SCp.Message & 0xff) << 8) | (DID_RESET << 16));
1530 } else if(CURRENT_SC->SCp.phase & disconnected) {
1531 /* target sent DISCONNECT */
1532 DPRINTK(debug_selection, DEBUG_LEAD "target disconnected at %d/%d\n",
1533 CMDINFO(CURRENT_SC),
1534 CURRENT_SC->resid,
1535 CURRENT_SC->request_bufflen);
1536 #if defined(AHA152X_STAT)
1537 HOSTDATA(shpnt)->disconnections++;
1538 #endif
1539 append_SC(&DISCONNECTED_SC, CURRENT_SC);
1540 CURRENT_SC->SCp.phase |= 1 << 16;
1541 CURRENT_SC = NULL;
1543 } else {
1544 done(shpnt, DID_ERROR << 16);
1546 #if defined(AHA152X_STAT)
1547 } else {
1548 HOSTDATA(shpnt)->busfree_without_old_command++;
1549 #endif
1552 DO_LOCK(flags);
1554 if(DONE_SC) {
1555 #if defined(AHA152X_STAT)
1556 action++;
1557 #endif
1559 if(DONE_SC->SCp.phase & check_condition) {
1560 struct scsi_cmnd *cmd = HOSTDATA(shpnt)->done_SC;
1561 struct aha152x_scdata *sc = SCDATA(cmd);
1563 #if 0
1564 if(HOSTDATA(shpnt)->debug & debug_eh) {
1565 printk(ERR_LEAD "received sense: ", CMDINFO(DONE_SC));
1566 scsi_print_sense("bh", DONE_SC);
1568 #endif
1570 /* restore old command */
1571 memcpy(cmd->cmnd, sc->cmnd, sizeof(sc->cmnd));
1572 cmd->request_buffer = sc->request_buffer;
1573 cmd->request_bufflen = sc->request_bufflen;
1574 cmd->use_sg = sc->use_sg;
1575 cmd->cmd_len = sc->cmd_len;
1577 cmd->SCp.Status = 0x02;
1579 HOSTDATA(shpnt)->commands--;
1580 if (!HOSTDATA(shpnt)->commands)
1581 SETPORT(PORTA, 0); /* turn led off */
1582 } else if(DONE_SC->SCp.Status==0x02) {
1583 #if defined(AHA152X_STAT)
1584 HOSTDATA(shpnt)->busfree_with_check_condition++;
1585 #endif
1586 #if 0
1587 DPRINTK(debug_eh, ERR_LEAD "CHECK CONDITION found\n", CMDINFO(DONE_SC));
1588 #endif
1590 if(!(DONE_SC->SCp.Status & not_issued)) {
1591 Scsi_Cmnd *ptr = DONE_SC;
1592 DONE_SC=NULL;
1593 #if 0
1594 DPRINTK(debug_eh, ERR_LEAD "requesting sense\n", CMDINFO(ptr));
1595 #endif
1597 ptr->cmnd[0] = REQUEST_SENSE;
1598 ptr->cmnd[1] = 0;
1599 ptr->cmnd[2] = 0;
1600 ptr->cmnd[3] = 0;
1601 ptr->cmnd[4] = sizeof(ptr->sense_buffer);
1602 ptr->cmnd[5] = 0;
1603 ptr->cmd_len = 6;
1604 ptr->use_sg = 0;
1605 ptr->request_buffer = ptr->sense_buffer;
1606 ptr->request_bufflen = sizeof(ptr->sense_buffer);
1608 DO_UNLOCK(flags);
1609 aha152x_internal_queue(ptr, NULL, check_condition, ptr->scsi_done);
1610 DO_LOCK(flags);
1611 #if 0
1612 } else {
1613 DPRINTK(debug_eh, ERR_LEAD "command not issued - CHECK CONDITION ignored\n", CMDINFO(DONE_SC));
1614 #endif
1618 if(DONE_SC && DONE_SC->scsi_done) {
1619 #if defined(AHA152X_DEBUG)
1620 int hostno=DONE_SC->device->host->host_no;
1621 int id=DONE_SC->device->id & 0xf;
1622 int lun=DONE_SC->device->lun & 0x7;
1623 #endif
1624 Scsi_Cmnd *ptr = DONE_SC;
1625 DONE_SC=NULL;
1627 /* turn led off, when no commands are in the driver */
1628 HOSTDATA(shpnt)->commands--;
1629 if (!HOSTDATA(shpnt)->commands)
1630 SETPORT(PORTA, 0); /* turn led off */
1632 if(ptr->scsi_done != reset_done) {
1633 kfree(ptr->host_scribble);
1634 ptr->host_scribble=NULL;
1637 DO_UNLOCK(flags);
1638 DPRINTK(debug_done, DEBUG_LEAD "calling scsi_done(%p)\n", hostno, id, lun, ptr);
1639 ptr->scsi_done(ptr);
1640 DPRINTK(debug_done, DEBUG_LEAD "scsi_done(%p) returned\n", hostno, id, lun, ptr);
1641 DO_LOCK(flags);
1644 DONE_SC=NULL;
1645 #if defined(AHA152X_STAT)
1646 } else {
1647 HOSTDATA(shpnt)->busfree_without_done_command++;
1648 #endif
1651 if(ISSUE_SC)
1652 CURRENT_SC = remove_first_SC(&ISSUE_SC);
1654 DO_UNLOCK(flags);
1656 if(CURRENT_SC) {
1657 #if defined(AHA152X_STAT)
1658 action++;
1659 #endif
1660 CURRENT_SC->SCp.phase |= selecting;
1662 DPRINTK(debug_selection, DEBUG_LEAD "selecting target\n", CMDINFO(CURRENT_SC));
1664 /* clear selection timeout */
1665 SETPORT(SSTAT1, SELTO);
1667 SETPORT(SCSIID, (shpnt->this_id << OID_) | CURRENT_SC->device->id);
1668 SETPORT(SXFRCTL1, (PARITY ? ENSPCHK : 0 ) | ENSTIMER);
1669 SETPORT(SCSISEQ, ENSELO | ENAUTOATNO | (DISCONNECTED_SC ? ENRESELI : 0));
1670 } else {
1671 #if defined(AHA152X_STAT)
1672 HOSTDATA(shpnt)->busfree_without_new_command++;
1673 #endif
1674 SETPORT(SCSISEQ, DISCONNECTED_SC ? ENRESELI : 0);
1677 #if defined(AHA152X_STAT)
1678 if(!action)
1679 HOSTDATA(shpnt)->busfree_without_any_action++;
1680 #endif
1684 * Selection done (OUT)
1685 * - queue IDENTIFY message and SDTR to selected target for message out
1686 * (ATN asserted automagically via ENAUTOATNO in busfree())
1688 static void seldo_run(struct Scsi_Host *shpnt)
1690 SETPORT(SCSISIG, 0);
1691 SETPORT(SSTAT1, CLRBUSFREE);
1692 SETPORT(SSTAT1, CLRPHASECHG);
1694 CURRENT_SC->SCp.phase &= ~(selecting|not_issued);
1696 SETPORT(SCSISEQ, 0);
1698 if (TESTLO(SSTAT0, SELDO)) {
1699 printk(ERR_LEAD "aha152x: passing bus free condition\n", CMDINFO(CURRENT_SC));
1700 done(shpnt, DID_NO_CONNECT << 16);
1701 return;
1704 SETPORT(SSTAT0, CLRSELDO);
1706 ADDMSGO(IDENTIFY(RECONNECT, CURRENT_SC->device->lun));
1708 if (CURRENT_SC->SCp.phase & aborting) {
1709 ADDMSGO(ABORT);
1710 } else if (CURRENT_SC->SCp.phase & resetting) {
1711 ADDMSGO(BUS_DEVICE_RESET);
1712 } else if (SYNCNEG==0 && SYNCHRONOUS) {
1713 CURRENT_SC->SCp.phase |= syncneg;
1714 MSGOLEN += spi_populate_sync_msg(&MSGO(MSGOLEN), 50, 8);
1715 SYNCNEG=1; /* negotiation in progress */
1718 SETRATE(SYNCRATE);
1722 * Selection timeout
1723 * - return command to mid-level with failure cause
1726 static void selto_run(struct Scsi_Host *shpnt)
1728 SETPORT(SCSISEQ, 0);
1729 SETPORT(SSTAT1, CLRSELTIMO);
1731 DPRINTK(debug_selection, DEBUG_LEAD "selection timeout\n", CMDINFO(CURRENT_SC));
1733 if(!CURRENT_SC) {
1734 DPRINTK(debug_selection, DEBUG_LEAD "!CURRENT_SC\n", CMDINFO(CURRENT_SC));
1735 return;
1738 CURRENT_SC->SCp.phase &= ~selecting;
1740 if (CURRENT_SC->SCp.phase & aborted) {
1741 DPRINTK(debug_selection, DEBUG_LEAD "aborted\n", CMDINFO(CURRENT_SC));
1742 done(shpnt, DID_ABORT << 16);
1743 } else if (TESTLO(SSTAT0, SELINGO)) {
1744 DPRINTK(debug_selection, DEBUG_LEAD "arbitration not won\n", CMDINFO(CURRENT_SC));
1745 done(shpnt, DID_BUS_BUSY << 16);
1746 } else {
1747 /* ARBITRATION won, but SELECTION failed */
1748 DPRINTK(debug_selection, DEBUG_LEAD "selection failed\n", CMDINFO(CURRENT_SC));
1749 done(shpnt, DID_NO_CONNECT << 16);
1754 * Selection in done
1755 * - put current command back to issue queue
1756 * (reconnection of a disconnected nexus instead
1757 * of successful selection out)
1760 static void seldi_run(struct Scsi_Host *shpnt)
1762 int selid;
1763 int target;
1764 unsigned long flags;
1766 SETPORT(SCSISIG, 0);
1767 SETPORT(SSTAT0, CLRSELDI);
1768 SETPORT(SSTAT1, CLRBUSFREE);
1769 SETPORT(SSTAT1, CLRPHASECHG);
1771 if(CURRENT_SC) {
1772 if(!(CURRENT_SC->SCp.phase & not_issued))
1773 printk(ERR_LEAD "command should not have been issued yet\n", CMDINFO(CURRENT_SC));
1775 DPRINTK(debug_selection, ERR_LEAD "command requeued - reselection\n", CMDINFO(CURRENT_SC));
1777 DO_LOCK(flags);
1778 append_SC(&ISSUE_SC, CURRENT_SC);
1779 DO_UNLOCK(flags);
1781 CURRENT_SC = NULL;
1784 if(!DISCONNECTED_SC) {
1785 DPRINTK(debug_selection, DEBUG_LEAD "unexpected SELDI ", CMDINFO(CURRENT_SC));
1786 return;
1789 RECONN_TARGET=-1;
1791 selid = GETPORT(SELID) & ~(1 << shpnt->this_id);
1793 if (selid==0) {
1794 printk("aha152x%d: target id unknown (%02x)\n", HOSTNO, selid);
1795 return;
1798 for(target=7; !(selid & (1 << target)); target--)
1801 if(selid & ~(1 << target)) {
1802 printk("aha152x%d: multiple targets reconnected (%02x)\n",
1803 HOSTNO, selid);
1807 SETPORT(SCSIID, (shpnt->this_id << OID_) | target);
1808 SETPORT(SCSISEQ, 0);
1810 SETRATE(HOSTDATA(shpnt)->syncrate[target]);
1812 RECONN_TARGET=target;
1813 DPRINTK(debug_selection, DEBUG_LEAD "target %d reselected (%02x).\n", CMDINFO(CURRENT_SC), target, selid);
1817 * message in phase
1818 * - handle initial message after reconnection to identify
1819 * reconnecting nexus
1820 * - queue command on DISCONNECTED_SC on DISCONNECT message
1821 * - set completed flag on COMMAND COMPLETE
1822 * (other completition code moved to busfree_run)
1823 * - handle response to SDTR
1824 * - clear synchronous transfer agreements on BUS RESET
1826 * FIXME: what about SAVE POINTERS, RESTORE POINTERS?
1829 static void msgi_run(struct Scsi_Host *shpnt)
1831 for(;;) {
1832 int sstat1 = GETPORT(SSTAT1);
1834 if(sstat1 & (PHASECHG|PHASEMIS|BUSFREE) || !(sstat1 & REQINIT))
1835 return;
1837 if(TESTLO(SSTAT0,SPIORDY)) {
1838 DPRINTK(debug_msgi, DEBUG_LEAD "!SPIORDY\n", CMDINFO(CURRENT_SC));
1839 return;
1842 ADDMSGI(GETPORT(SCSIDAT));
1844 #if defined(AHA152X_DEBUG)
1845 if (HOSTDATA(shpnt)->debug & debug_msgi) {
1846 printk(INFO_LEAD "inbound message %02x ", CMDINFO(CURRENT_SC), MSGI(0));
1847 spi_print_msg(&MSGI(0));
1848 printk("\n");
1850 #endif
1852 if(!CURRENT_SC) {
1853 if(LASTSTATE!=seldi) {
1854 printk(KERN_ERR "aha152x%d: message in w/o current command not after reselection\n", HOSTNO);
1858 * Handle reselection
1860 if(!(MSGI(0) & IDENTIFY_BASE)) {
1861 printk(KERN_ERR "aha152x%d: target didn't identify after reselection\n", HOSTNO);
1862 continue;
1865 CURRENT_SC = remove_lun_SC(&DISCONNECTED_SC, RECONN_TARGET, MSGI(0) & 0x3f);
1867 if (!CURRENT_SC) {
1868 show_queues(shpnt);
1869 printk(KERN_ERR "aha152x%d: no disconnected command for target %d/%d\n", HOSTNO, RECONN_TARGET, MSGI(0) & 0x3f);
1870 continue;
1873 DPRINTK(debug_msgi, DEBUG_LEAD "target reconnected\n", CMDINFO(CURRENT_SC));
1875 CURRENT_SC->SCp.Message = MSGI(0);
1876 CURRENT_SC->SCp.phase &= ~disconnected;
1878 MSGILEN=0;
1880 /* next message if any */
1881 continue;
1884 CURRENT_SC->SCp.Message = MSGI(0);
1886 switch (MSGI(0)) {
1887 case DISCONNECT:
1888 if (!RECONNECT)
1889 printk(WARN_LEAD "target was not allowed to disconnect\n", CMDINFO(CURRENT_SC));
1891 CURRENT_SC->SCp.phase |= disconnected;
1892 break;
1894 case COMMAND_COMPLETE:
1895 if(CURRENT_SC->SCp.phase & completed)
1896 DPRINTK(debug_msgi, DEBUG_LEAD "again COMMAND COMPLETE\n", CMDINFO(CURRENT_SC));
1898 CURRENT_SC->SCp.phase |= completed;
1899 break;
1901 case MESSAGE_REJECT:
1902 if (SYNCNEG==1) {
1903 printk(INFO_LEAD "Synchronous Data Transfer Request was rejected\n", CMDINFO(CURRENT_SC));
1904 SYNCNEG=2; /* negotiation completed */
1905 } else
1906 printk(INFO_LEAD "inbound message (MESSAGE REJECT)\n", CMDINFO(CURRENT_SC));
1907 break;
1909 case SAVE_POINTERS:
1910 break;
1912 case RESTORE_POINTERS:
1913 break;
1915 case EXTENDED_MESSAGE:
1916 if(MSGILEN<2 || MSGILEN<MSGI(1)+2) {
1917 /* not yet completed */
1918 continue;
1921 switch (MSGI(2)) {
1922 case EXTENDED_SDTR:
1924 long ticks;
1926 if (MSGI(1) != 3) {
1927 printk(ERR_LEAD "SDTR message length!=3\n", CMDINFO(CURRENT_SC));
1928 break;
1931 if (!HOSTDATA(shpnt)->synchronous)
1932 break;
1934 printk(INFO_LEAD, CMDINFO(CURRENT_SC));
1935 spi_print_msg(&MSGI(0));
1936 printk("\n");
1938 ticks = (MSGI(3) * 4 + 49) / 50;
1940 if (syncneg) {
1941 /* negotiation in progress */
1942 if (ticks > 9 || MSGI(4) < 1 || MSGI(4) > 8) {
1943 ADDMSGO(MESSAGE_REJECT);
1944 printk(INFO_LEAD "received Synchronous Data Transfer Request invalid - rejected\n", CMDINFO(CURRENT_SC));
1945 break;
1948 SYNCRATE |= ((ticks - 2) << 4) + MSGI(4);
1949 } else if (ticks <= 9 && MSGI(4) >= 1) {
1950 ADDMSGO(EXTENDED_MESSAGE);
1951 ADDMSGO(3);
1952 ADDMSGO(EXTENDED_SDTR);
1953 if (ticks < 4) {
1954 ticks = 4;
1955 ADDMSGO(50);
1956 } else
1957 ADDMSGO(MSGI(3));
1959 if (MSGI(4) > 8)
1960 MSGI(4) = 8;
1962 ADDMSGO(MSGI(4));
1964 SYNCRATE |= ((ticks - 2) << 4) + MSGI(4);
1965 } else {
1966 /* requested SDTR is too slow, do it asynchronously */
1967 printk(INFO_LEAD "Synchronous Data Transfer Request too slow - Rejecting\n", CMDINFO(CURRENT_SC));
1968 ADDMSGO(MESSAGE_REJECT);
1971 SYNCNEG=2; /* negotiation completed */
1972 SETRATE(SYNCRATE);
1974 break;
1976 case BUS_DEVICE_RESET:
1978 int i;
1980 for(i=0; i<8; i++) {
1981 HOSTDATA(shpnt)->syncrate[i]=0;
1982 HOSTDATA(shpnt)->syncneg[i]=0;
1986 break;
1988 case EXTENDED_MODIFY_DATA_POINTER:
1989 case EXTENDED_EXTENDED_IDENTIFY:
1990 case EXTENDED_WDTR:
1991 default:
1992 ADDMSGO(MESSAGE_REJECT);
1993 break;
1995 break;
1998 MSGILEN=0;
2002 static void msgi_end(struct Scsi_Host *shpnt)
2004 if(MSGILEN>0)
2005 printk(WARN_LEAD "target left before message completed (%d)\n", CMDINFO(CURRENT_SC), MSGILEN);
2007 if (MSGOLEN > 0 && !(GETPORT(SSTAT1) & BUSFREE)) {
2008 DPRINTK(debug_msgi, DEBUG_LEAD "msgo pending\n", CMDINFO(CURRENT_SC));
2009 SETPORT(SCSISIG, P_MSGI | SIG_ATNO);
2014 * message out phase
2017 static void msgo_init(struct Scsi_Host *shpnt)
2019 if(MSGOLEN==0) {
2020 if((CURRENT_SC->SCp.phase & syncneg) && SYNCNEG==2 && SYNCRATE==0) {
2021 ADDMSGO(IDENTIFY(RECONNECT, CURRENT_SC->device->lun));
2022 } else {
2023 printk(INFO_LEAD "unexpected MESSAGE OUT phase; rejecting\n", CMDINFO(CURRENT_SC));
2024 ADDMSGO(MESSAGE_REJECT);
2028 #if defined(AHA152X_DEBUG)
2029 if(HOSTDATA(shpnt)->debug & debug_msgo) {
2030 int i;
2032 printk(DEBUG_LEAD "messages( ", CMDINFO(CURRENT_SC));
2033 for (i=0; i<MSGOLEN; i+=spi_print_msg(&MSGO(i)), printk(" "))
2035 printk(")\n");
2037 #endif
2041 * message out phase
2044 static void msgo_run(struct Scsi_Host *shpnt)
2046 if(MSGO_I==MSGOLEN)
2047 DPRINTK(debug_msgo, DEBUG_LEAD "messages all sent (%d/%d)\n", CMDINFO(CURRENT_SC), MSGO_I, MSGOLEN);
2049 while(MSGO_I<MSGOLEN) {
2050 DPRINTK(debug_msgo, DEBUG_LEAD "message byte %02x (%d/%d)\n", CMDINFO(CURRENT_SC), MSGO(MSGO_I), MSGO_I, MSGOLEN);
2052 if(TESTLO(SSTAT0, SPIORDY)) {
2053 DPRINTK(debug_msgo, DEBUG_LEAD "!SPIORDY\n", CMDINFO(CURRENT_SC));
2054 return;
2057 if (MSGO_I==MSGOLEN-1) {
2058 /* Leave MESSAGE OUT after transfer */
2059 SETPORT(SSTAT1, CLRATNO);
2063 if (MSGO(MSGO_I) & IDENTIFY_BASE)
2064 CURRENT_SC->SCp.phase |= identified;
2066 if (MSGO(MSGO_I)==ABORT)
2067 CURRENT_SC->SCp.phase |= aborted;
2069 if (MSGO(MSGO_I)==BUS_DEVICE_RESET)
2070 CURRENT_SC->SCp.phase |= resetted;
2072 SETPORT(SCSIDAT, MSGO(MSGO_I++));
2076 static void msgo_end(struct Scsi_Host *shpnt)
2078 if(MSGO_I<MSGOLEN) {
2079 printk(ERR_LEAD "message sent incompletely (%d/%d)\n", CMDINFO(CURRENT_SC), MSGO_I, MSGOLEN);
2080 if(SYNCNEG==1) {
2081 printk(INFO_LEAD "Synchronous Data Transfer Request was rejected\n", CMDINFO(CURRENT_SC));
2082 SYNCNEG=2;
2086 MSGO_I = 0;
2087 MSGOLEN = 0;
2091 * command phase
2094 static void cmd_init(struct Scsi_Host *shpnt)
2096 if (CURRENT_SC->SCp.sent_command) {
2097 printk(ERR_LEAD "command already sent\n", CMDINFO(CURRENT_SC));
2098 done(shpnt, DID_ERROR << 16);
2099 return;
2102 #if defined(AHA152X_DEBUG)
2103 if (HOSTDATA(shpnt)->debug & debug_cmd) {
2104 printk(DEBUG_LEAD "cmd_init: ", CMDINFO(CURRENT_SC));
2105 __scsi_print_command(CURRENT_SC->cmnd);
2107 #endif
2109 CMD_I=0;
2113 * command phase
2116 static void cmd_run(struct Scsi_Host *shpnt)
2118 if(CMD_I==CURRENT_SC->cmd_len) {
2119 DPRINTK(debug_cmd, DEBUG_LEAD "command already completely sent (%d/%d)", CMDINFO(CURRENT_SC), CMD_I, CURRENT_SC->cmd_len);
2120 disp_ports(shpnt);
2123 while(CMD_I<CURRENT_SC->cmd_len) {
2124 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);
2126 if(TESTLO(SSTAT0, SPIORDY)) {
2127 DPRINTK(debug_cmd, DEBUG_LEAD "!SPIORDY\n", CMDINFO(CURRENT_SC));
2128 return;
2131 SETPORT(SCSIDAT, CURRENT_SC->cmnd[CMD_I++]);
2135 static void cmd_end(struct Scsi_Host *shpnt)
2137 if(CMD_I<CURRENT_SC->cmd_len)
2138 printk(ERR_LEAD "command sent incompletely (%d/%d)\n", CMDINFO(CURRENT_SC), CMD_I, CURRENT_SC->cmd_len);
2139 else
2140 CURRENT_SC->SCp.sent_command++;
2144 * status phase
2147 static void status_run(struct Scsi_Host *shpnt)
2149 if(TESTLO(SSTAT0,SPIORDY)) {
2150 DPRINTK(debug_status, DEBUG_LEAD "!SPIORDY\n", CMDINFO(CURRENT_SC));
2151 return;
2154 CURRENT_SC->SCp.Status = GETPORT(SCSIDAT);
2156 #if defined(AHA152X_DEBUG)
2157 if (HOSTDATA(shpnt)->debug & debug_status) {
2158 printk(DEBUG_LEAD "inbound status %02x ", CMDINFO(CURRENT_SC), CURRENT_SC->SCp.Status);
2159 scsi_print_status(CURRENT_SC->SCp.Status);
2160 printk("\n");
2162 #endif
2166 * data in phase
2169 static void datai_init(struct Scsi_Host *shpnt)
2171 SETPORT(DMACNTRL0, RSTFIFO);
2172 SETPORT(DMACNTRL0, RSTFIFO|ENDMA);
2174 SETPORT(SXFRCTL0, CH1|CLRSTCNT);
2175 SETPORT(SXFRCTL0, CH1|SCSIEN|DMAEN);
2177 SETPORT(SIMODE0, 0);
2178 SETPORT(SIMODE1, ENSCSIPERR | ENSCSIRST | ENPHASEMIS | ENBUSFREE);
2180 DATA_LEN=0;
2181 DPRINTK(debug_datai,
2182 DEBUG_LEAD "datai_init: request_bufflen=%d resid=%d\n",
2183 CMDINFO(CURRENT_SC), CURRENT_SC->request_bufflen, CURRENT_SC->resid);
2186 static void datai_run(struct Scsi_Host *shpnt)
2188 unsigned long the_time;
2189 int fifodata, data_count;
2192 * loop while the phase persists or the fifos are not empty
2195 while(TESTLO(DMASTAT, INTSTAT) || TESTLO(DMASTAT, DFIFOEMP) || TESTLO(SSTAT2, SEMPTY)) {
2196 /* FIXME: maybe this should be done by setting up
2197 * STCNT to trigger ENSWRAP interrupt, instead of
2198 * polling for DFIFOFULL
2200 the_time=jiffies + 100*HZ;
2201 while(TESTLO(DMASTAT, DFIFOFULL|INTSTAT) && time_before(jiffies,the_time))
2202 barrier();
2204 if(TESTLO(DMASTAT, DFIFOFULL|INTSTAT)) {
2205 printk(ERR_LEAD "datai timeout", CMDINFO(CURRENT_SC));
2206 disp_ports(shpnt);
2207 break;
2210 if(TESTHI(DMASTAT, DFIFOFULL)) {
2211 fifodata = 128;
2212 } else {
2213 the_time=jiffies + 100*HZ;
2214 while(TESTLO(SSTAT2, SEMPTY) && time_before(jiffies,the_time))
2215 barrier();
2217 if(TESTLO(SSTAT2, SEMPTY)) {
2218 printk(ERR_LEAD "datai sempty timeout", CMDINFO(CURRENT_SC));
2219 disp_ports(shpnt);
2220 break;
2223 fifodata = GETPORT(FIFOSTAT);
2226 if(CURRENT_SC->SCp.this_residual>0) {
2227 while(fifodata>0 && CURRENT_SC->SCp.this_residual>0) {
2228 data_count = fifodata>CURRENT_SC->SCp.this_residual ?
2229 CURRENT_SC->SCp.this_residual :
2230 fifodata;
2231 fifodata -= data_count;
2233 if(data_count & 1) {
2234 DPRINTK(debug_datai, DEBUG_LEAD "8bit\n", CMDINFO(CURRENT_SC));
2235 SETPORT(DMACNTRL0, ENDMA|_8BIT);
2236 *CURRENT_SC->SCp.ptr++ = GETPORT(DATAPORT);
2237 CURRENT_SC->SCp.this_residual--;
2238 DATA_LEN++;
2239 SETPORT(DMACNTRL0, ENDMA);
2242 if(data_count > 1) {
2243 DPRINTK(debug_datai, DEBUG_LEAD "16bit(%d)\n", CMDINFO(CURRENT_SC), data_count);
2244 data_count >>= 1;
2245 insw(DATAPORT, CURRENT_SC->SCp.ptr, data_count);
2246 CURRENT_SC->SCp.ptr += 2 * data_count;
2247 CURRENT_SC->SCp.this_residual -= 2 * data_count;
2248 DATA_LEN += 2 * data_count;
2251 if(CURRENT_SC->SCp.this_residual==0 && CURRENT_SC->SCp.buffers_residual>0) {
2252 /* advance to next buffer */
2253 CURRENT_SC->SCp.buffers_residual--;
2254 CURRENT_SC->SCp.buffer++;
2255 CURRENT_SC->SCp.ptr = SG_ADDRESS(CURRENT_SC->SCp.buffer);
2256 CURRENT_SC->SCp.this_residual = CURRENT_SC->SCp.buffer->length;
2259 } else if(fifodata>0) {
2260 printk(ERR_LEAD "no buffers left for %d(%d) bytes (data overrun!?)\n", CMDINFO(CURRENT_SC), fifodata, GETPORT(FIFOSTAT));
2261 SETPORT(DMACNTRL0, ENDMA|_8BIT);
2262 while(fifodata>0) {
2263 int data;
2264 data=GETPORT(DATAPORT);
2265 DPRINTK(debug_datai, DEBUG_LEAD "data=%02x\n", CMDINFO(CURRENT_SC), data);
2266 fifodata--;
2267 DATA_LEN++;
2269 SETPORT(DMACNTRL0, ENDMA|_8BIT);
2273 if(TESTLO(DMASTAT, INTSTAT) ||
2274 TESTLO(DMASTAT, DFIFOEMP) ||
2275 TESTLO(SSTAT2, SEMPTY) ||
2276 GETPORT(FIFOSTAT)>0) {
2278 * something went wrong, if there's something left in the fifos
2279 * or the phase didn't change
2281 printk(ERR_LEAD "fifos should be empty and phase should have changed\n", CMDINFO(CURRENT_SC));
2282 disp_ports(shpnt);
2285 if(DATA_LEN!=GETSTCNT()) {
2286 printk(ERR_LEAD
2287 "manual transfer count differs from automatic (count=%d;stcnt=%d;diff=%d;fifostat=%d)",
2288 CMDINFO(CURRENT_SC), DATA_LEN, GETSTCNT(), GETSTCNT()-DATA_LEN, GETPORT(FIFOSTAT));
2289 disp_ports(shpnt);
2290 mdelay(10000);
2294 static void datai_end(struct Scsi_Host *shpnt)
2296 CURRENT_SC->resid -= GETSTCNT();
2298 DPRINTK(debug_datai,
2299 DEBUG_LEAD "datai_end: request_bufflen=%d resid=%d stcnt=%d\n",
2300 CMDINFO(CURRENT_SC), CURRENT_SC->request_bufflen, CURRENT_SC->resid, GETSTCNT());
2302 SETPORT(SXFRCTL0, CH1|CLRSTCNT);
2303 SETPORT(DMACNTRL0, 0);
2307 * data out phase
2310 static void datao_init(struct Scsi_Host *shpnt)
2312 SETPORT(DMACNTRL0, WRITE_READ | RSTFIFO);
2313 SETPORT(DMACNTRL0, WRITE_READ | ENDMA);
2315 SETPORT(SXFRCTL0, CH1|CLRSTCNT);
2316 SETPORT(SXFRCTL0, CH1|SCSIEN|DMAEN);
2318 SETPORT(SIMODE0, 0);
2319 SETPORT(SIMODE1, ENSCSIPERR | ENSCSIRST | ENPHASEMIS | ENBUSFREE );
2321 DATA_LEN = CURRENT_SC->resid;
2323 DPRINTK(debug_datao,
2324 DEBUG_LEAD "datao_init: request_bufflen=%d; resid=%d\n",
2325 CMDINFO(CURRENT_SC), CURRENT_SC->request_bufflen, CURRENT_SC->resid);
2328 static void datao_run(struct Scsi_Host *shpnt)
2330 unsigned long the_time;
2331 int data_count;
2333 /* until phase changes or all data sent */
2334 while(TESTLO(DMASTAT, INTSTAT) && CURRENT_SC->SCp.this_residual>0) {
2335 data_count = 128;
2336 if(data_count > CURRENT_SC->SCp.this_residual)
2337 data_count=CURRENT_SC->SCp.this_residual;
2339 if(TESTLO(DMASTAT, DFIFOEMP)) {
2340 printk(ERR_LEAD "datao fifo not empty (%d)", CMDINFO(CURRENT_SC), GETPORT(FIFOSTAT));
2341 disp_ports(shpnt);
2342 break;
2345 if(data_count & 1) {
2346 SETPORT(DMACNTRL0,WRITE_READ|ENDMA|_8BIT);
2347 SETPORT(DATAPORT, *CURRENT_SC->SCp.ptr++);
2348 CURRENT_SC->SCp.this_residual--;
2349 CURRENT_SC->resid--;
2350 SETPORT(DMACNTRL0,WRITE_READ|ENDMA);
2353 if(data_count > 1) {
2354 data_count >>= 1;
2355 outsw(DATAPORT, CURRENT_SC->SCp.ptr, data_count);
2356 CURRENT_SC->SCp.ptr += 2 * data_count;
2357 CURRENT_SC->SCp.this_residual -= 2 * data_count;
2358 CURRENT_SC->resid -= 2 * data_count;
2361 if(CURRENT_SC->SCp.this_residual==0 && CURRENT_SC->SCp.buffers_residual>0) {
2362 /* advance to next buffer */
2363 CURRENT_SC->SCp.buffers_residual--;
2364 CURRENT_SC->SCp.buffer++;
2365 CURRENT_SC->SCp.ptr = SG_ADDRESS(CURRENT_SC->SCp.buffer);
2366 CURRENT_SC->SCp.this_residual = CURRENT_SC->SCp.buffer->length;
2369 the_time=jiffies + 100*HZ;
2370 while(TESTLO(DMASTAT, DFIFOEMP|INTSTAT) && time_before(jiffies,the_time))
2371 barrier();
2373 if(TESTLO(DMASTAT, DFIFOEMP|INTSTAT)) {
2374 printk(ERR_LEAD "dataout timeout", CMDINFO(CURRENT_SC));
2375 disp_ports(shpnt);
2376 break;
2381 static void datao_end(struct Scsi_Host *shpnt)
2383 if(TESTLO(DMASTAT, DFIFOEMP)) {
2384 int data_count = (DATA_LEN - CURRENT_SC->resid) - GETSTCNT();
2386 DPRINTK(debug_datao, DEBUG_LEAD "datao: %d bytes to resend (%d written, %d transferred)\n",
2387 CMDINFO(CURRENT_SC),
2388 data_count,
2389 DATA_LEN-CURRENT_SC->resid,
2390 GETSTCNT());
2392 CURRENT_SC->resid += data_count;
2394 if(CURRENT_SC->use_sg) {
2395 data_count -= CURRENT_SC->SCp.ptr - SG_ADDRESS(CURRENT_SC->SCp.buffer);
2396 while(data_count>0) {
2397 CURRENT_SC->SCp.buffer--;
2398 CURRENT_SC->SCp.buffers_residual++;
2399 data_count -= CURRENT_SC->SCp.buffer->length;
2401 CURRENT_SC->SCp.ptr = SG_ADDRESS(CURRENT_SC->SCp.buffer) - data_count;
2402 CURRENT_SC->SCp.this_residual = CURRENT_SC->SCp.buffer->length + data_count;
2403 } else {
2404 CURRENT_SC->SCp.ptr -= data_count;
2405 CURRENT_SC->SCp.this_residual += data_count;
2409 DPRINTK(debug_datao, DEBUG_LEAD "datao_end: request_bufflen=%d; resid=%d; stcnt=%d\n",
2410 CMDINFO(CURRENT_SC),
2411 CURRENT_SC->request_bufflen,
2412 CURRENT_SC->resid,
2413 GETSTCNT());
2415 SETPORT(SXFRCTL0, CH1|CLRCH1|CLRSTCNT);
2416 SETPORT(SXFRCTL0, CH1);
2418 SETPORT(DMACNTRL0, 0);
2422 * figure out what state we're in
2425 static int update_state(struct Scsi_Host *shpnt)
2427 int dataphase=0;
2428 unsigned int stat0 = GETPORT(SSTAT0);
2429 unsigned int stat1 = GETPORT(SSTAT1);
2431 PREVSTATE = STATE;
2432 STATE=unknown;
2434 if(stat1 & SCSIRSTI) {
2435 STATE=rsti;
2436 SETPORT(SCSISEQ,0);
2437 SETPORT(SSTAT1,SCSIRSTI);
2438 } else if(stat0 & SELDI && PREVSTATE==busfree) {
2439 STATE=seldi;
2440 } else if(stat0 & SELDO && CURRENT_SC && (CURRENT_SC->SCp.phase & selecting)) {
2441 STATE=seldo;
2442 } else if(stat1 & SELTO) {
2443 STATE=selto;
2444 } else if(stat1 & BUSFREE) {
2445 STATE=busfree;
2446 SETPORT(SSTAT1,BUSFREE);
2447 } else if(stat1 & SCSIPERR) {
2448 STATE=parerr;
2449 SETPORT(SSTAT1,SCSIPERR);
2450 } else if(stat1 & REQINIT) {
2451 switch(GETPORT(SCSISIG) & P_MASK) {
2452 case P_MSGI: STATE=msgi; break;
2453 case P_MSGO: STATE=msgo; break;
2454 case P_DATAO: STATE=datao; break;
2455 case P_DATAI: STATE=datai; break;
2456 case P_STATUS: STATE=status; break;
2457 case P_CMD: STATE=cmd; break;
2459 dataphase=1;
2462 if((stat0 & SELDI) && STATE!=seldi && !dataphase) {
2463 printk(INFO_LEAD "reselection missed?", CMDINFO(CURRENT_SC));
2464 disp_ports(shpnt);
2467 if(STATE!=PREVSTATE) {
2468 LASTSTATE=PREVSTATE;
2471 return dataphase;
2475 * handle parity error
2477 * FIXME: in which phase?
2480 static void parerr_run(struct Scsi_Host *shpnt)
2482 printk(ERR_LEAD "parity error\n", CMDINFO(CURRENT_SC));
2483 done(shpnt, DID_PARITY << 16);
2487 * handle reset in
2490 static void rsti_run(struct Scsi_Host *shpnt)
2492 Scsi_Cmnd *ptr;
2494 printk(KERN_NOTICE "aha152x%d: scsi reset in\n", HOSTNO);
2496 ptr=DISCONNECTED_SC;
2497 while(ptr) {
2498 Scsi_Cmnd *next = SCNEXT(ptr);
2500 if (!ptr->device->soft_reset) {
2501 remove_SC(&DISCONNECTED_SC, ptr);
2503 kfree(ptr->host_scribble);
2504 ptr->host_scribble=NULL;
2506 ptr->result = DID_RESET << 16;
2507 ptr->scsi_done(ptr);
2510 ptr = next;
2513 if(CURRENT_SC && !CURRENT_SC->device->soft_reset)
2514 done(shpnt, DID_RESET << 16 );
2519 * bottom-half handler
2522 static void is_complete(struct Scsi_Host *shpnt)
2524 int dataphase;
2525 unsigned long flags;
2526 int pending;
2528 if(!shpnt)
2529 return;
2531 DO_LOCK(flags);
2533 if( HOSTDATA(shpnt)->service==0 ) {
2534 DO_UNLOCK(flags);
2535 return;
2538 HOSTDATA(shpnt)->service = 0;
2540 if(HOSTDATA(shpnt)->in_intr) {
2541 DO_UNLOCK(flags);
2542 /* aha152x_error never returns.. */
2543 aha152x_error(shpnt, "bottom-half already running!?");
2545 HOSTDATA(shpnt)->in_intr++;
2548 * loop while there are interrupt conditions pending
2551 do {
2552 unsigned long start = jiffies;
2553 DO_UNLOCK(flags);
2555 dataphase=update_state(shpnt);
2557 DPRINTK(debug_phases, LEAD "start %s %s(%s)\n", CMDINFO(CURRENT_SC), states[STATE].name, states[PREVSTATE].name, states[LASTSTATE].name);
2560 * end previous state
2563 if(PREVSTATE!=STATE && states[PREVSTATE].end)
2564 states[PREVSTATE].end(shpnt);
2567 * disable SPIO mode if previous phase used it
2568 * and this one doesn't
2571 if(states[PREVSTATE].spio && !states[STATE].spio) {
2572 SETPORT(SXFRCTL0, CH1);
2573 SETPORT(DMACNTRL0, 0);
2574 if(CURRENT_SC)
2575 CURRENT_SC->SCp.phase &= ~spiordy;
2579 * accept current dataphase phase
2582 if(dataphase) {
2583 SETPORT(SSTAT0, REQINIT);
2584 SETPORT(SCSISIG, GETPORT(SCSISIG) & P_MASK);
2585 SETPORT(SSTAT1, PHASECHG);
2589 * enable SPIO mode if previous didn't use it
2590 * and this one does
2593 if(!states[PREVSTATE].spio && states[STATE].spio) {
2594 SETPORT(DMACNTRL0, 0);
2595 SETPORT(SXFRCTL0, CH1|SPIOEN);
2596 if(CURRENT_SC)
2597 CURRENT_SC->SCp.phase |= spiordy;
2601 * initialize for new state
2604 if(PREVSTATE!=STATE && states[STATE].init)
2605 states[STATE].init(shpnt);
2608 * handle current state
2611 if(states[STATE].run)
2612 states[STATE].run(shpnt);
2613 else
2614 printk(ERR_LEAD "unexpected state (%x)\n", CMDINFO(CURRENT_SC), STATE);
2617 * setup controller to interrupt on
2618 * the next expected condition and
2619 * loop if it's already there
2622 DO_LOCK(flags);
2623 pending=setup_expected_interrupts(shpnt);
2624 #if defined(AHA152X_STAT)
2625 HOSTDATA(shpnt)->count[STATE]++;
2626 if(PREVSTATE!=STATE)
2627 HOSTDATA(shpnt)->count_trans[STATE]++;
2628 HOSTDATA(shpnt)->time[STATE] += jiffies-start;
2629 #endif
2631 DPRINTK(debug_phases, LEAD "end %s %s(%s)\n", CMDINFO(CURRENT_SC), states[STATE].name, states[PREVSTATE].name, states[LASTSTATE].name);
2632 } while(pending);
2635 * enable interrupts and leave bottom-half
2638 HOSTDATA(shpnt)->in_intr--;
2639 SETBITS(DMACNTRL0, INTEN);
2640 DO_UNLOCK(flags);
2645 * Dump the current driver status and panic
2647 static void aha152x_error(struct Scsi_Host *shpnt, char *msg)
2649 printk(KERN_EMERG "\naha152x%d: %s\n", HOSTNO, msg);
2650 show_queues(shpnt);
2651 panic("aha152x panic\n");
2655 * Display registers of AIC-6260
2657 static void disp_ports(struct Scsi_Host *shpnt)
2659 #if defined(AHA152X_DEBUG)
2660 int s;
2662 printk("\n%s: %s(%s) ",
2663 CURRENT_SC ? "busy" : "waiting",
2664 states[STATE].name,
2665 states[PREVSTATE].name);
2667 s = GETPORT(SCSISEQ);
2668 printk("SCSISEQ( ");
2669 if (s & TEMODEO)
2670 printk("TARGET MODE ");
2671 if (s & ENSELO)
2672 printk("SELO ");
2673 if (s & ENSELI)
2674 printk("SELI ");
2675 if (s & ENRESELI)
2676 printk("RESELI ");
2677 if (s & ENAUTOATNO)
2678 printk("AUTOATNO ");
2679 if (s & ENAUTOATNI)
2680 printk("AUTOATNI ");
2681 if (s & ENAUTOATNP)
2682 printk("AUTOATNP ");
2683 if (s & SCSIRSTO)
2684 printk("SCSIRSTO ");
2685 printk(");");
2687 printk(" SCSISIG(");
2688 s = GETPORT(SCSISIG);
2689 switch (s & P_MASK) {
2690 case P_DATAO:
2691 printk("DATA OUT");
2692 break;
2693 case P_DATAI:
2694 printk("DATA IN");
2695 break;
2696 case P_CMD:
2697 printk("COMMAND");
2698 break;
2699 case P_STATUS:
2700 printk("STATUS");
2701 break;
2702 case P_MSGO:
2703 printk("MESSAGE OUT");
2704 break;
2705 case P_MSGI:
2706 printk("MESSAGE IN");
2707 break;
2708 default:
2709 printk("*invalid*");
2710 break;
2713 printk("); ");
2715 printk("INTSTAT (%s); ", TESTHI(DMASTAT, INTSTAT) ? "hi" : "lo");
2717 printk("SSTAT( ");
2718 s = GETPORT(SSTAT0);
2719 if (s & TARGET)
2720 printk("TARGET ");
2721 if (s & SELDO)
2722 printk("SELDO ");
2723 if (s & SELDI)
2724 printk("SELDI ");
2725 if (s & SELINGO)
2726 printk("SELINGO ");
2727 if (s & SWRAP)
2728 printk("SWRAP ");
2729 if (s & SDONE)
2730 printk("SDONE ");
2731 if (s & SPIORDY)
2732 printk("SPIORDY ");
2733 if (s & DMADONE)
2734 printk("DMADONE ");
2736 s = GETPORT(SSTAT1);
2737 if (s & SELTO)
2738 printk("SELTO ");
2739 if (s & ATNTARG)
2740 printk("ATNTARG ");
2741 if (s & SCSIRSTI)
2742 printk("SCSIRSTI ");
2743 if (s & PHASEMIS)
2744 printk("PHASEMIS ");
2745 if (s & BUSFREE)
2746 printk("BUSFREE ");
2747 if (s & SCSIPERR)
2748 printk("SCSIPERR ");
2749 if (s & PHASECHG)
2750 printk("PHASECHG ");
2751 if (s & REQINIT)
2752 printk("REQINIT ");
2753 printk("); ");
2756 printk("SSTAT( ");
2758 s = GETPORT(SSTAT0) & GETPORT(SIMODE0);
2760 if (s & TARGET)
2761 printk("TARGET ");
2762 if (s & SELDO)
2763 printk("SELDO ");
2764 if (s & SELDI)
2765 printk("SELDI ");
2766 if (s & SELINGO)
2767 printk("SELINGO ");
2768 if (s & SWRAP)
2769 printk("SWRAP ");
2770 if (s & SDONE)
2771 printk("SDONE ");
2772 if (s & SPIORDY)
2773 printk("SPIORDY ");
2774 if (s & DMADONE)
2775 printk("DMADONE ");
2777 s = GETPORT(SSTAT1) & GETPORT(SIMODE1);
2779 if (s & SELTO)
2780 printk("SELTO ");
2781 if (s & ATNTARG)
2782 printk("ATNTARG ");
2783 if (s & SCSIRSTI)
2784 printk("SCSIRSTI ");
2785 if (s & PHASEMIS)
2786 printk("PHASEMIS ");
2787 if (s & BUSFREE)
2788 printk("BUSFREE ");
2789 if (s & SCSIPERR)
2790 printk("SCSIPERR ");
2791 if (s & PHASECHG)
2792 printk("PHASECHG ");
2793 if (s & REQINIT)
2794 printk("REQINIT ");
2795 printk("); ");
2797 printk("SXFRCTL0( ");
2799 s = GETPORT(SXFRCTL0);
2800 if (s & SCSIEN)
2801 printk("SCSIEN ");
2802 if (s & DMAEN)
2803 printk("DMAEN ");
2804 if (s & CH1)
2805 printk("CH1 ");
2806 if (s & CLRSTCNT)
2807 printk("CLRSTCNT ");
2808 if (s & SPIOEN)
2809 printk("SPIOEN ");
2810 if (s & CLRCH1)
2811 printk("CLRCH1 ");
2812 printk("); ");
2814 printk("SIGNAL( ");
2816 s = GETPORT(SCSISIG);
2817 if (s & SIG_ATNI)
2818 printk("ATNI ");
2819 if (s & SIG_SELI)
2820 printk("SELI ");
2821 if (s & SIG_BSYI)
2822 printk("BSYI ");
2823 if (s & SIG_REQI)
2824 printk("REQI ");
2825 if (s & SIG_ACKI)
2826 printk("ACKI ");
2827 printk("); ");
2829 printk("SELID (%02x), ", GETPORT(SELID));
2831 printk("STCNT (%d), ", GETSTCNT());
2833 printk("SSTAT2( ");
2835 s = GETPORT(SSTAT2);
2836 if (s & SOFFSET)
2837 printk("SOFFSET ");
2838 if (s & SEMPTY)
2839 printk("SEMPTY ");
2840 if (s & SFULL)
2841 printk("SFULL ");
2842 printk("); SFCNT (%d); ", s & (SFULL | SFCNT));
2844 s = GETPORT(SSTAT3);
2845 printk("SCSICNT (%d), OFFCNT(%d), ", (s & 0xf0) >> 4, s & 0x0f);
2847 printk("SSTAT4( ");
2848 s = GETPORT(SSTAT4);
2849 if (s & SYNCERR)
2850 printk("SYNCERR ");
2851 if (s & FWERR)
2852 printk("FWERR ");
2853 if (s & FRERR)
2854 printk("FRERR ");
2855 printk("); ");
2857 printk("DMACNTRL0( ");
2858 s = GETPORT(DMACNTRL0);
2859 printk("%s ", s & _8BIT ? "8BIT" : "16BIT");
2860 printk("%s ", s & DMA ? "DMA" : "PIO");
2861 printk("%s ", s & WRITE_READ ? "WRITE" : "READ");
2862 if (s & ENDMA)
2863 printk("ENDMA ");
2864 if (s & INTEN)
2865 printk("INTEN ");
2866 if (s & RSTFIFO)
2867 printk("RSTFIFO ");
2868 if (s & SWINT)
2869 printk("SWINT ");
2870 printk("); ");
2872 printk("DMASTAT( ");
2873 s = GETPORT(DMASTAT);
2874 if (s & ATDONE)
2875 printk("ATDONE ");
2876 if (s & WORDRDY)
2877 printk("WORDRDY ");
2878 if (s & DFIFOFULL)
2879 printk("DFIFOFULL ");
2880 if (s & DFIFOEMP)
2881 printk("DFIFOEMP ");
2882 printk(")\n");
2883 #endif
2887 * display enabled interrupts
2889 static void disp_enintr(struct Scsi_Host *shpnt)
2891 int s;
2893 printk(KERN_DEBUG "enabled interrupts ( ");
2895 s = GETPORT(SIMODE0);
2896 if (s & ENSELDO)
2897 printk("ENSELDO ");
2898 if (s & ENSELDI)
2899 printk("ENSELDI ");
2900 if (s & ENSELINGO)
2901 printk("ENSELINGO ");
2902 if (s & ENSWRAP)
2903 printk("ENSWRAP ");
2904 if (s & ENSDONE)
2905 printk("ENSDONE ");
2906 if (s & ENSPIORDY)
2907 printk("ENSPIORDY ");
2908 if (s & ENDMADONE)
2909 printk("ENDMADONE ");
2911 s = GETPORT(SIMODE1);
2912 if (s & ENSELTIMO)
2913 printk("ENSELTIMO ");
2914 if (s & ENATNTARG)
2915 printk("ENATNTARG ");
2916 if (s & ENPHASEMIS)
2917 printk("ENPHASEMIS ");
2918 if (s & ENBUSFREE)
2919 printk("ENBUSFREE ");
2920 if (s & ENSCSIPERR)
2921 printk("ENSCSIPERR ");
2922 if (s & ENPHASECHG)
2923 printk("ENPHASECHG ");
2924 if (s & ENREQINIT)
2925 printk("ENREQINIT ");
2926 printk(")\n");
2930 * Show the command data of a command
2932 static void show_command(Scsi_Cmnd *ptr)
2934 scmd_printk(KERN_DEBUG, ptr, "%p: cmnd=(", ptr);
2936 __scsi_print_command(ptr->cmnd);
2938 printk(KERN_DEBUG "); request_bufflen=%d; resid=%d; phase |",
2939 ptr->request_bufflen, ptr->resid);
2941 if (ptr->SCp.phase & not_issued)
2942 printk("not issued|");
2943 if (ptr->SCp.phase & selecting)
2944 printk("selecting|");
2945 if (ptr->SCp.phase & identified)
2946 printk("identified|");
2947 if (ptr->SCp.phase & disconnected)
2948 printk("disconnected|");
2949 if (ptr->SCp.phase & completed)
2950 printk("completed|");
2951 if (ptr->SCp.phase & spiordy)
2952 printk("spiordy|");
2953 if (ptr->SCp.phase & syncneg)
2954 printk("syncneg|");
2955 if (ptr->SCp.phase & aborted)
2956 printk("aborted|");
2957 if (ptr->SCp.phase & resetted)
2958 printk("resetted|");
2959 if( SCDATA(ptr) ) {
2960 printk("; next=0x%p\n", SCNEXT(ptr));
2961 } else {
2962 printk("; next=(host scribble NULL)\n");
2967 * Dump the queued data
2969 static void show_queues(struct Scsi_Host *shpnt)
2971 Scsi_Cmnd *ptr;
2972 unsigned long flags;
2974 DO_LOCK(flags);
2975 printk(KERN_DEBUG "\nqueue status:\nissue_SC:\n");
2976 for (ptr = ISSUE_SC; ptr; ptr = SCNEXT(ptr))
2977 show_command(ptr);
2978 DO_UNLOCK(flags);
2980 printk(KERN_DEBUG "current_SC:\n");
2981 if (CURRENT_SC)
2982 show_command(CURRENT_SC);
2983 else
2984 printk(KERN_DEBUG "none\n");
2986 printk(KERN_DEBUG "disconnected_SC:\n");
2987 for (ptr = DISCONNECTED_SC; ptr; ptr = SCDATA(ptr) ? SCNEXT(ptr) : NULL)
2988 show_command(ptr);
2990 disp_ports(shpnt);
2991 disp_enintr(shpnt);
2994 #undef SPRINTF
2995 #define SPRINTF(args...) pos += sprintf(pos, ## args)
2997 static int get_command(char *pos, Scsi_Cmnd * ptr)
2999 char *start = pos;
3000 int i;
3002 SPRINTF("0x%08x: target=%d; lun=%d; cmnd=( ",
3003 (unsigned int) ptr, ptr->device->id, ptr->device->lun);
3005 for (i = 0; i < COMMAND_SIZE(ptr->cmnd[0]); i++)
3006 SPRINTF("0x%02x ", ptr->cmnd[i]);
3008 SPRINTF("); resid=%d; residual=%d; buffers=%d; phase |",
3009 ptr->resid, ptr->SCp.this_residual, ptr->SCp.buffers_residual);
3011 if (ptr->SCp.phase & not_issued)
3012 SPRINTF("not issued|");
3013 if (ptr->SCp.phase & selecting)
3014 SPRINTF("selecting|");
3015 if (ptr->SCp.phase & disconnected)
3016 SPRINTF("disconnected|");
3017 if (ptr->SCp.phase & aborted)
3018 SPRINTF("aborted|");
3019 if (ptr->SCp.phase & identified)
3020 SPRINTF("identified|");
3021 if (ptr->SCp.phase & completed)
3022 SPRINTF("completed|");
3023 if (ptr->SCp.phase & spiordy)
3024 SPRINTF("spiordy|");
3025 if (ptr->SCp.phase & syncneg)
3026 SPRINTF("syncneg|");
3027 SPRINTF("; next=0x%p\n", SCNEXT(ptr));
3029 return (pos - start);
3032 static int get_ports(struct Scsi_Host *shpnt, char *pos)
3034 char *start = pos;
3035 int s;
3037 SPRINTF("\n%s: %s(%s) ", CURRENT_SC ? "on bus" : "waiting", states[STATE].name, states[PREVSTATE].name);
3039 s = GETPORT(SCSISEQ);
3040 SPRINTF("SCSISEQ( ");
3041 if (s & TEMODEO)
3042 SPRINTF("TARGET MODE ");
3043 if (s & ENSELO)
3044 SPRINTF("SELO ");
3045 if (s & ENSELI)
3046 SPRINTF("SELI ");
3047 if (s & ENRESELI)
3048 SPRINTF("RESELI ");
3049 if (s & ENAUTOATNO)
3050 SPRINTF("AUTOATNO ");
3051 if (s & ENAUTOATNI)
3052 SPRINTF("AUTOATNI ");
3053 if (s & ENAUTOATNP)
3054 SPRINTF("AUTOATNP ");
3055 if (s & SCSIRSTO)
3056 SPRINTF("SCSIRSTO ");
3057 SPRINTF(");");
3059 SPRINTF(" SCSISIG(");
3060 s = GETPORT(SCSISIG);
3061 switch (s & P_MASK) {
3062 case P_DATAO:
3063 SPRINTF("DATA OUT");
3064 break;
3065 case P_DATAI:
3066 SPRINTF("DATA IN");
3067 break;
3068 case P_CMD:
3069 SPRINTF("COMMAND");
3070 break;
3071 case P_STATUS:
3072 SPRINTF("STATUS");
3073 break;
3074 case P_MSGO:
3075 SPRINTF("MESSAGE OUT");
3076 break;
3077 case P_MSGI:
3078 SPRINTF("MESSAGE IN");
3079 break;
3080 default:
3081 SPRINTF("*invalid*");
3082 break;
3085 SPRINTF("); ");
3087 SPRINTF("INTSTAT (%s); ", TESTHI(DMASTAT, INTSTAT) ? "hi" : "lo");
3089 SPRINTF("SSTAT( ");
3090 s = GETPORT(SSTAT0);
3091 if (s & TARGET)
3092 SPRINTF("TARGET ");
3093 if (s & SELDO)
3094 SPRINTF("SELDO ");
3095 if (s & SELDI)
3096 SPRINTF("SELDI ");
3097 if (s & SELINGO)
3098 SPRINTF("SELINGO ");
3099 if (s & SWRAP)
3100 SPRINTF("SWRAP ");
3101 if (s & SDONE)
3102 SPRINTF("SDONE ");
3103 if (s & SPIORDY)
3104 SPRINTF("SPIORDY ");
3105 if (s & DMADONE)
3106 SPRINTF("DMADONE ");
3108 s = GETPORT(SSTAT1);
3109 if (s & SELTO)
3110 SPRINTF("SELTO ");
3111 if (s & ATNTARG)
3112 SPRINTF("ATNTARG ");
3113 if (s & SCSIRSTI)
3114 SPRINTF("SCSIRSTI ");
3115 if (s & PHASEMIS)
3116 SPRINTF("PHASEMIS ");
3117 if (s & BUSFREE)
3118 SPRINTF("BUSFREE ");
3119 if (s & SCSIPERR)
3120 SPRINTF("SCSIPERR ");
3121 if (s & PHASECHG)
3122 SPRINTF("PHASECHG ");
3123 if (s & REQINIT)
3124 SPRINTF("REQINIT ");
3125 SPRINTF("); ");
3128 SPRINTF("SSTAT( ");
3130 s = GETPORT(SSTAT0) & GETPORT(SIMODE0);
3132 if (s & TARGET)
3133 SPRINTF("TARGET ");
3134 if (s & SELDO)
3135 SPRINTF("SELDO ");
3136 if (s & SELDI)
3137 SPRINTF("SELDI ");
3138 if (s & SELINGO)
3139 SPRINTF("SELINGO ");
3140 if (s & SWRAP)
3141 SPRINTF("SWRAP ");
3142 if (s & SDONE)
3143 SPRINTF("SDONE ");
3144 if (s & SPIORDY)
3145 SPRINTF("SPIORDY ");
3146 if (s & DMADONE)
3147 SPRINTF("DMADONE ");
3149 s = GETPORT(SSTAT1) & GETPORT(SIMODE1);
3151 if (s & SELTO)
3152 SPRINTF("SELTO ");
3153 if (s & ATNTARG)
3154 SPRINTF("ATNTARG ");
3155 if (s & SCSIRSTI)
3156 SPRINTF("SCSIRSTI ");
3157 if (s & PHASEMIS)
3158 SPRINTF("PHASEMIS ");
3159 if (s & BUSFREE)
3160 SPRINTF("BUSFREE ");
3161 if (s & SCSIPERR)
3162 SPRINTF("SCSIPERR ");
3163 if (s & PHASECHG)
3164 SPRINTF("PHASECHG ");
3165 if (s & REQINIT)
3166 SPRINTF("REQINIT ");
3167 SPRINTF("); ");
3169 SPRINTF("SXFRCTL0( ");
3171 s = GETPORT(SXFRCTL0);
3172 if (s & SCSIEN)
3173 SPRINTF("SCSIEN ");
3174 if (s & DMAEN)
3175 SPRINTF("DMAEN ");
3176 if (s & CH1)
3177 SPRINTF("CH1 ");
3178 if (s & CLRSTCNT)
3179 SPRINTF("CLRSTCNT ");
3180 if (s & SPIOEN)
3181 SPRINTF("SPIOEN ");
3182 if (s & CLRCH1)
3183 SPRINTF("CLRCH1 ");
3184 SPRINTF("); ");
3186 SPRINTF("SIGNAL( ");
3188 s = GETPORT(SCSISIG);
3189 if (s & SIG_ATNI)
3190 SPRINTF("ATNI ");
3191 if (s & SIG_SELI)
3192 SPRINTF("SELI ");
3193 if (s & SIG_BSYI)
3194 SPRINTF("BSYI ");
3195 if (s & SIG_REQI)
3196 SPRINTF("REQI ");
3197 if (s & SIG_ACKI)
3198 SPRINTF("ACKI ");
3199 SPRINTF("); ");
3201 SPRINTF("SELID(%02x), ", GETPORT(SELID));
3203 SPRINTF("STCNT(%d), ", GETSTCNT());
3205 SPRINTF("SSTAT2( ");
3207 s = GETPORT(SSTAT2);
3208 if (s & SOFFSET)
3209 SPRINTF("SOFFSET ");
3210 if (s & SEMPTY)
3211 SPRINTF("SEMPTY ");
3212 if (s & SFULL)
3213 SPRINTF("SFULL ");
3214 SPRINTF("); SFCNT (%d); ", s & (SFULL | SFCNT));
3216 s = GETPORT(SSTAT3);
3217 SPRINTF("SCSICNT (%d), OFFCNT(%d), ", (s & 0xf0) >> 4, s & 0x0f);
3219 SPRINTF("SSTAT4( ");
3220 s = GETPORT(SSTAT4);
3221 if (s & SYNCERR)
3222 SPRINTF("SYNCERR ");
3223 if (s & FWERR)
3224 SPRINTF("FWERR ");
3225 if (s & FRERR)
3226 SPRINTF("FRERR ");
3227 SPRINTF("); ");
3229 SPRINTF("DMACNTRL0( ");
3230 s = GETPORT(DMACNTRL0);
3231 SPRINTF("%s ", s & _8BIT ? "8BIT" : "16BIT");
3232 SPRINTF("%s ", s & DMA ? "DMA" : "PIO");
3233 SPRINTF("%s ", s & WRITE_READ ? "WRITE" : "READ");
3234 if (s & ENDMA)
3235 SPRINTF("ENDMA ");
3236 if (s & INTEN)
3237 SPRINTF("INTEN ");
3238 if (s & RSTFIFO)
3239 SPRINTF("RSTFIFO ");
3240 if (s & SWINT)
3241 SPRINTF("SWINT ");
3242 SPRINTF("); ");
3244 SPRINTF("DMASTAT( ");
3245 s = GETPORT(DMASTAT);
3246 if (s & ATDONE)
3247 SPRINTF("ATDONE ");
3248 if (s & WORDRDY)
3249 SPRINTF("WORDRDY ");
3250 if (s & DFIFOFULL)
3251 SPRINTF("DFIFOFULL ");
3252 if (s & DFIFOEMP)
3253 SPRINTF("DFIFOEMP ");
3254 SPRINTF(")\n");
3256 SPRINTF("enabled interrupts( ");
3258 s = GETPORT(SIMODE0);
3259 if (s & ENSELDO)
3260 SPRINTF("ENSELDO ");
3261 if (s & ENSELDI)
3262 SPRINTF("ENSELDI ");
3263 if (s & ENSELINGO)
3264 SPRINTF("ENSELINGO ");
3265 if (s & ENSWRAP)
3266 SPRINTF("ENSWRAP ");
3267 if (s & ENSDONE)
3268 SPRINTF("ENSDONE ");
3269 if (s & ENSPIORDY)
3270 SPRINTF("ENSPIORDY ");
3271 if (s & ENDMADONE)
3272 SPRINTF("ENDMADONE ");
3274 s = GETPORT(SIMODE1);
3275 if (s & ENSELTIMO)
3276 SPRINTF("ENSELTIMO ");
3277 if (s & ENATNTARG)
3278 SPRINTF("ENATNTARG ");
3279 if (s & ENPHASEMIS)
3280 SPRINTF("ENPHASEMIS ");
3281 if (s & ENBUSFREE)
3282 SPRINTF("ENBUSFREE ");
3283 if (s & ENSCSIPERR)
3284 SPRINTF("ENSCSIPERR ");
3285 if (s & ENPHASECHG)
3286 SPRINTF("ENPHASECHG ");
3287 if (s & ENREQINIT)
3288 SPRINTF("ENREQINIT ");
3289 SPRINTF(")\n");
3291 return (pos - start);
3294 static int aha152x_set_info(char *buffer, int length, struct Scsi_Host *shpnt)
3296 if(!shpnt || !buffer || length<8 || strncmp("aha152x ", buffer, 8)!=0)
3297 return -EINVAL;
3299 #if defined(AHA152X_DEBUG)
3300 if(length>14 && strncmp("debug ", buffer+8, 6)==0) {
3301 int debug = HOSTDATA(shpnt)->debug;
3303 HOSTDATA(shpnt)->debug = simple_strtoul(buffer+14, NULL, 0);
3305 printk(KERN_INFO "aha152x%d: debugging options set to 0x%04x (were 0x%04x)\n", HOSTNO, HOSTDATA(shpnt)->debug, debug);
3306 } else
3307 #endif
3308 #if defined(AHA152X_STAT)
3309 if(length>13 && strncmp("reset", buffer+8, 5)==0) {
3310 int i;
3312 HOSTDATA(shpnt)->total_commands=0;
3313 HOSTDATA(shpnt)->disconnections=0;
3314 HOSTDATA(shpnt)->busfree_without_any_action=0;
3315 HOSTDATA(shpnt)->busfree_without_old_command=0;
3316 HOSTDATA(shpnt)->busfree_without_new_command=0;
3317 HOSTDATA(shpnt)->busfree_without_done_command=0;
3318 HOSTDATA(shpnt)->busfree_with_check_condition=0;
3319 for (i = idle; i<maxstate; i++) {
3320 HOSTDATA(shpnt)->count[i]=0;
3321 HOSTDATA(shpnt)->count_trans[i]=0;
3322 HOSTDATA(shpnt)->time[i]=0;
3325 printk(KERN_INFO "aha152x%d: stats reseted.\n", HOSTNO);
3327 } else
3328 #endif
3330 return -EINVAL;
3334 return length;
3337 #undef SPRINTF
3338 #define SPRINTF(args...) \
3339 do { if(pos < buffer + length) pos += sprintf(pos, ## args); } while(0)
3341 static int aha152x_proc_info(struct Scsi_Host *shpnt, char *buffer, char **start,
3342 off_t offset, int length, int inout)
3344 int i;
3345 char *pos = buffer;
3346 Scsi_Cmnd *ptr;
3347 unsigned long flags;
3348 int thislength;
3350 DPRINTK(debug_procinfo,
3351 KERN_DEBUG "aha152x_proc_info: buffer=%p offset=%ld length=%d hostno=%d inout=%d\n",
3352 buffer, offset, length, shpnt->host_no, inout);
3355 if (inout)
3356 return aha152x_set_info(buffer, length, shpnt);
3358 SPRINTF(AHA152X_REVID "\n");
3360 SPRINTF("ioports 0x%04lx to 0x%04lx\n",
3361 shpnt->io_port, shpnt->io_port + shpnt->n_io_port - 1);
3362 SPRINTF("interrupt 0x%02x\n", shpnt->irq);
3363 SPRINTF("disconnection/reconnection %s\n",
3364 RECONNECT ? "enabled" : "disabled");
3365 SPRINTF("parity checking %s\n",
3366 PARITY ? "enabled" : "disabled");
3367 SPRINTF("synchronous transfers %s\n",
3368 SYNCHRONOUS ? "enabled" : "disabled");
3369 SPRINTF("%d commands currently queued\n", HOSTDATA(shpnt)->commands);
3371 if(SYNCHRONOUS) {
3372 SPRINTF("synchronously operating targets (tick=50 ns):\n");
3373 for (i = 0; i < 8; i++)
3374 if (HOSTDATA(shpnt)->syncrate[i] & 0x7f)
3375 SPRINTF("target %d: period %dT/%dns; req/ack offset %d\n",
3377 (((HOSTDATA(shpnt)->syncrate[i] & 0x70) >> 4) + 2),
3378 (((HOSTDATA(shpnt)->syncrate[i] & 0x70) >> 4) + 2) * 50,
3379 HOSTDATA(shpnt)->syncrate[i] & 0x0f);
3381 #if defined(AHA152X_DEBUG)
3382 #define PDEBUG(flags,txt) \
3383 if(HOSTDATA(shpnt)->debug & flags) SPRINTF("(%s) ", txt);
3385 SPRINTF("enabled debugging options: ");
3387 PDEBUG(debug_procinfo, "procinfo");
3388 PDEBUG(debug_queue, "queue");
3389 PDEBUG(debug_intr, "interrupt");
3390 PDEBUG(debug_selection, "selection");
3391 PDEBUG(debug_msgo, "message out");
3392 PDEBUG(debug_msgi, "message in");
3393 PDEBUG(debug_status, "status");
3394 PDEBUG(debug_cmd, "command");
3395 PDEBUG(debug_datai, "data in");
3396 PDEBUG(debug_datao, "data out");
3397 PDEBUG(debug_eh, "eh");
3398 PDEBUG(debug_locks, "locks");
3399 PDEBUG(debug_phases, "phases");
3401 SPRINTF("\n");
3402 #endif
3404 SPRINTF("\nqueue status:\n");
3405 DO_LOCK(flags);
3406 if (ISSUE_SC) {
3407 SPRINTF("not yet issued commands:\n");
3408 for (ptr = ISSUE_SC; ptr; ptr = SCNEXT(ptr))
3409 pos += get_command(pos, ptr);
3410 } else
3411 SPRINTF("no not yet issued commands\n");
3412 DO_UNLOCK(flags);
3414 if (CURRENT_SC) {
3415 SPRINTF("current command:\n");
3416 pos += get_command(pos, CURRENT_SC);
3417 } else
3418 SPRINTF("no current command\n");
3420 if (DISCONNECTED_SC) {
3421 SPRINTF("disconnected commands:\n");
3422 for (ptr = DISCONNECTED_SC; ptr; ptr = SCNEXT(ptr))
3423 pos += get_command(pos, ptr);
3424 } else
3425 SPRINTF("no disconnected commands\n");
3427 pos += get_ports(shpnt, pos);
3429 #if defined(AHA152X_STAT)
3430 SPRINTF("statistics:\n"
3431 "total commands: %d\n"
3432 "disconnections: %d\n"
3433 "busfree with check condition: %d\n"
3434 "busfree without old command: %d\n"
3435 "busfree without new command: %d\n"
3436 "busfree without done command: %d\n"
3437 "busfree without any action: %d\n"
3438 "state "
3439 "transitions "
3440 "count "
3441 "time\n",
3442 HOSTDATA(shpnt)->total_commands,
3443 HOSTDATA(shpnt)->disconnections,
3444 HOSTDATA(shpnt)->busfree_with_check_condition,
3445 HOSTDATA(shpnt)->busfree_without_old_command,
3446 HOSTDATA(shpnt)->busfree_without_new_command,
3447 HOSTDATA(shpnt)->busfree_without_done_command,
3448 HOSTDATA(shpnt)->busfree_without_any_action);
3449 for(i=0; i<maxstate; i++) {
3450 SPRINTF("%-10s %-12d %-12d %-12ld\n",
3451 states[i].name,
3452 HOSTDATA(shpnt)->count_trans[i],
3453 HOSTDATA(shpnt)->count[i],
3454 HOSTDATA(shpnt)->time[i]);
3456 #endif
3458 DPRINTK(debug_procinfo, KERN_DEBUG "aha152x_proc_info: pos=%p\n", pos);
3460 thislength = pos - (buffer + offset);
3461 DPRINTK(debug_procinfo, KERN_DEBUG "aha152x_proc_info: length=%d thislength=%d\n", length, thislength);
3463 if(thislength<0) {
3464 DPRINTK(debug_procinfo, KERN_DEBUG "aha152x_proc_info: output too short\n");
3465 *start = NULL;
3466 return 0;
3469 thislength = thislength<length ? thislength : length;
3471 DPRINTK(debug_procinfo, KERN_DEBUG "aha152x_proc_info: return %d\n", thislength);
3473 *start = buffer + offset;
3474 return thislength < length ? thislength : length;
3477 static struct scsi_host_template aha152x_driver_template = {
3478 .module = THIS_MODULE,
3479 .name = AHA152X_REVID,
3480 .proc_name = "aha152x",
3481 .proc_info = aha152x_proc_info,
3482 .queuecommand = aha152x_queue,
3483 .eh_abort_handler = aha152x_abort,
3484 .eh_device_reset_handler = aha152x_device_reset,
3485 .eh_bus_reset_handler = aha152x_bus_reset,
3486 .eh_host_reset_handler = aha152x_host_reset,
3487 .bios_param = aha152x_biosparam,
3488 .can_queue = 1,
3489 .this_id = 7,
3490 .sg_tablesize = SG_ALL,
3491 .cmd_per_lun = 1,
3492 .use_clustering = DISABLE_CLUSTERING,
3495 #if !defined(PCMCIA)
3496 static int setup_count;
3497 static struct aha152x_setup setup[2];
3499 /* possible i/o addresses for the AIC-6260; default first */
3500 static unsigned short ports[] = { 0x340, 0x140 };
3502 #if !defined(SKIP_BIOSTEST)
3503 /* possible locations for the Adaptec BIOS; defaults first */
3504 static unsigned int addresses[] =
3506 0xdc000, /* default first */
3507 0xc8000,
3508 0xcc000,
3509 0xd0000,
3510 0xd4000,
3511 0xd8000,
3512 0xe0000,
3513 0xeb800, /* VTech Platinum SMP */
3514 0xf0000,
3517 /* signatures for various AIC-6[23]60 based controllers.
3518 The point in detecting signatures is to avoid useless and maybe
3519 harmful probes on ports. I'm not sure that all listed boards pass
3520 auto-configuration. For those which fail the BIOS signature is
3521 obsolete, because user intervention to supply the configuration is
3522 needed anyway. May be an information whether or not the BIOS supports
3523 extended translation could be also useful here. */
3524 static struct signature {
3525 unsigned char *signature;
3526 int sig_offset;
3527 int sig_length;
3528 } signatures[] =
3530 { "Adaptec AHA-1520 BIOS", 0x102e, 21 },
3531 /* Adaptec 152x */
3532 { "Adaptec AHA-1520B", 0x000b, 17 },
3533 /* Adaptec 152x rev B */
3534 { "Adaptec AHA-1520B", 0x0026, 17 },
3535 /* Iomega Jaz Jet ISA (AIC6370Q) */
3536 { "Adaptec ASW-B626 BIOS", 0x1029, 21 },
3537 /* on-board controller */
3538 { "Adaptec BIOS: ASW-B626", 0x000f, 22 },
3539 /* on-board controller */
3540 { "Adaptec ASW-B626 S2", 0x2e6c, 19 },
3541 /* on-board controller */
3542 { "Adaptec BIOS:AIC-6360", 0x000c, 21 },
3543 /* on-board controller */
3544 { "ScsiPro SP-360 BIOS", 0x2873, 19 },
3545 /* ScsiPro-Controller */
3546 { "GA-400 LOCAL BUS SCSI BIOS", 0x102e, 26 },
3547 /* Gigabyte Local-Bus-SCSI */
3548 { "Adaptec BIOS:AVA-282X", 0x000c, 21 },
3549 /* Adaptec 282x */
3550 { "Adaptec IBM Dock II SCSI", 0x2edd, 24 },
3551 /* IBM Thinkpad Dock II */
3552 { "Adaptec BIOS:AHA-1532P", 0x001c, 22 },
3553 /* IBM Thinkpad Dock II SCSI */
3554 { "DTC3520A Host Adapter BIOS", 0x318a, 26 },
3555 /* DTC 3520A ISA SCSI */
3557 #endif /* !SKIP_BIOSTEST */
3560 * Test, if port_base is valid.
3563 static int aha152x_porttest(int io_port)
3565 int i;
3567 SETPORT(io_port + O_DMACNTRL1, 0); /* reset stack pointer */
3568 for (i = 0; i < 16; i++)
3569 SETPORT(io_port + O_STACK, i);
3571 SETPORT(io_port + O_DMACNTRL1, 0); /* reset stack pointer */
3572 for (i = 0; i < 16 && GETPORT(io_port + O_STACK) == i; i++)
3575 return (i == 16);
3578 static int tc1550_porttest(int io_port)
3580 int i;
3582 SETPORT(io_port + O_TC_DMACNTRL1, 0); /* reset stack pointer */
3583 for (i = 0; i < 16; i++)
3584 SETPORT(io_port + O_STACK, i);
3586 SETPORT(io_port + O_TC_DMACNTRL1, 0); /* reset stack pointer */
3587 for (i = 0; i < 16 && GETPORT(io_port + O_TC_STACK) == i; i++)
3590 return (i == 16);
3594 static int checksetup(struct aha152x_setup *setup)
3596 int i;
3597 for (i = 0; i < ARRAY_SIZE(ports) && (setup->io_port != ports[i]); i++)
3600 if (i == ARRAY_SIZE(ports))
3601 return 0;
3603 if ( request_region(setup->io_port, IO_RANGE, "aha152x")==0 ) {
3604 printk(KERN_ERR "aha152x: io port 0x%x busy.\n", setup->io_port);
3605 return 0;
3608 if( aha152x_porttest(setup->io_port) ) {
3609 setup->tc1550=0;
3610 } else if( tc1550_porttest(setup->io_port) ) {
3611 setup->tc1550=1;
3612 } else {
3613 release_region(setup->io_port, IO_RANGE);
3614 return 0;
3617 release_region(setup->io_port, IO_RANGE);
3619 if ((setup->irq < IRQ_MIN) || (setup->irq > IRQ_MAX))
3620 return 0;
3622 if ((setup->scsiid < 0) || (setup->scsiid > 7))
3623 return 0;
3625 if ((setup->reconnect < 0) || (setup->reconnect > 1))
3626 return 0;
3628 if ((setup->parity < 0) || (setup->parity > 1))
3629 return 0;
3631 if ((setup->synchronous < 0) || (setup->synchronous > 1))
3632 return 0;
3634 if ((setup->ext_trans < 0) || (setup->ext_trans > 1))
3635 return 0;
3638 return 1;
3642 static int __init aha152x_init(void)
3644 int i, j, ok;
3645 #if defined(AUTOCONF)
3646 aha152x_config conf;
3647 #endif
3648 #ifdef __ISAPNP__
3649 struct pnp_dev *dev=NULL, *pnpdev[2] = {NULL, NULL};
3650 #endif
3652 if ( setup_count ) {
3653 printk(KERN_INFO "aha152x: processing commandline: ");
3655 for (i = 0; i<setup_count; i++) {
3656 if (!checksetup(&setup[i])) {
3657 printk(KERN_ERR "\naha152x: %s\n", setup[i].conf);
3658 printk(KERN_ERR "aha152x: invalid line\n");
3661 printk("ok\n");
3664 #if defined(SETUP0)
3665 if (setup_count < ARRAY_SIZE(setup)) {
3666 struct aha152x_setup override = SETUP0;
3668 if (setup_count == 0 || (override.io_port != setup[0].io_port)) {
3669 if (!checksetup(&override)) {
3670 printk(KERN_ERR "\naha152x: invalid override SETUP0={0x%x,%d,%d,%d,%d,%d,%d,%d}\n",
3671 override.io_port,
3672 override.irq,
3673 override.scsiid,
3674 override.reconnect,
3675 override.parity,
3676 override.synchronous,
3677 override.delay,
3678 override.ext_trans);
3679 } else
3680 setup[setup_count++] = override;
3683 #endif
3685 #if defined(SETUP1)
3686 if (setup_count < ARRAY_SIZE(setup)) {
3687 struct aha152x_setup override = SETUP1;
3689 if (setup_count == 0 || (override.io_port != setup[0].io_port)) {
3690 if (!checksetup(&override)) {
3691 printk(KERN_ERR "\naha152x: invalid override SETUP1={0x%x,%d,%d,%d,%d,%d,%d,%d}\n",
3692 override.io_port,
3693 override.irq,
3694 override.scsiid,
3695 override.reconnect,
3696 override.parity,
3697 override.synchronous,
3698 override.delay,
3699 override.ext_trans);
3700 } else
3701 setup[setup_count++] = override;
3704 #endif
3706 #if defined(MODULE)
3707 if (setup_count<ARRAY_SIZE(setup) && (aha152x[0]!=0 || io[0]!=0 || irq[0]!=0)) {
3708 if(aha152x[0]!=0) {
3709 setup[setup_count].conf = "";
3710 setup[setup_count].io_port = aha152x[0];
3711 setup[setup_count].irq = aha152x[1];
3712 setup[setup_count].scsiid = aha152x[2];
3713 setup[setup_count].reconnect = aha152x[3];
3714 setup[setup_count].parity = aha152x[4];
3715 setup[setup_count].synchronous = aha152x[5];
3716 setup[setup_count].delay = aha152x[6];
3717 setup[setup_count].ext_trans = aha152x[7];
3718 #if defined(AHA152X_DEBUG)
3719 setup[setup_count].debug = aha152x[8];
3720 #endif
3721 } else if(io[0]!=0 || irq[0]!=0) {
3722 if(io[0]!=0) setup[setup_count].io_port = io[0];
3723 if(irq[0]!=0) setup[setup_count].irq = irq[0];
3725 setup[setup_count].scsiid = scsiid[0];
3726 setup[setup_count].reconnect = reconnect[0];
3727 setup[setup_count].parity = parity[0];
3728 setup[setup_count].synchronous = sync[0];
3729 setup[setup_count].delay = delay[0];
3730 setup[setup_count].ext_trans = exttrans[0];
3731 #if defined(AHA152X_DEBUG)
3732 setup[setup_count].debug = debug[0];
3733 #endif
3736 if (checksetup(&setup[setup_count]))
3737 setup_count++;
3738 else
3739 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",
3740 setup[setup_count].io_port,
3741 setup[setup_count].irq,
3742 setup[setup_count].scsiid,
3743 setup[setup_count].reconnect,
3744 setup[setup_count].parity,
3745 setup[setup_count].synchronous,
3746 setup[setup_count].delay,
3747 setup[setup_count].ext_trans);
3750 if (setup_count<ARRAY_SIZE(setup) && (aha152x1[0]!=0 || io[1]!=0 || irq[1]!=0)) {
3751 if(aha152x1[0]!=0) {
3752 setup[setup_count].conf = "";
3753 setup[setup_count].io_port = aha152x1[0];
3754 setup[setup_count].irq = aha152x1[1];
3755 setup[setup_count].scsiid = aha152x1[2];
3756 setup[setup_count].reconnect = aha152x1[3];
3757 setup[setup_count].parity = aha152x1[4];
3758 setup[setup_count].synchronous = aha152x1[5];
3759 setup[setup_count].delay = aha152x1[6];
3760 setup[setup_count].ext_trans = aha152x1[7];
3761 #if defined(AHA152X_DEBUG)
3762 setup[setup_count].debug = aha152x1[8];
3763 #endif
3764 } else if(io[1]!=0 || irq[1]!=0) {
3765 if(io[1]!=0) setup[setup_count].io_port = io[1];
3766 if(irq[1]!=0) setup[setup_count].irq = irq[1];
3768 setup[setup_count].scsiid = scsiid[1];
3769 setup[setup_count].reconnect = reconnect[1];
3770 setup[setup_count].parity = parity[1];
3771 setup[setup_count].synchronous = sync[1];
3772 setup[setup_count].delay = delay[1];
3773 setup[setup_count].ext_trans = exttrans[1];
3774 #if defined(AHA152X_DEBUG)
3775 setup[setup_count].debug = debug[1];
3776 #endif
3778 if (checksetup(&setup[setup_count]))
3779 setup_count++;
3780 else
3781 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",
3782 setup[setup_count].io_port,
3783 setup[setup_count].irq,
3784 setup[setup_count].scsiid,
3785 setup[setup_count].reconnect,
3786 setup[setup_count].parity,
3787 setup[setup_count].synchronous,
3788 setup[setup_count].delay,
3789 setup[setup_count].ext_trans);
3791 #endif
3793 #ifdef __ISAPNP__
3794 for(i=0; setup_count<ARRAY_SIZE(setup) && id_table[i].vendor; i++) {
3795 while ( setup_count<ARRAY_SIZE(setup) &&
3796 (dev=pnp_find_dev(NULL, id_table[i].vendor, id_table[i].function, dev)) ) {
3797 if (pnp_device_attach(dev) < 0)
3798 continue;
3800 if (pnp_activate_dev(dev) < 0) {
3801 pnp_device_detach(dev);
3802 continue;
3805 if (!pnp_port_valid(dev, 0)) {
3806 pnp_device_detach(dev);
3807 continue;
3810 if (setup_count==1 && pnp_port_start(dev, 0)==setup[0].io_port) {
3811 pnp_device_detach(dev);
3812 continue;
3815 setup[setup_count].io_port = pnp_port_start(dev, 0);
3816 setup[setup_count].irq = pnp_irq(dev, 0);
3817 setup[setup_count].scsiid = 7;
3818 setup[setup_count].reconnect = 1;
3819 setup[setup_count].parity = 1;
3820 setup[setup_count].synchronous = 1;
3821 setup[setup_count].delay = DELAY_DEFAULT;
3822 setup[setup_count].ext_trans = 0;
3823 #if defined(AHA152X_DEBUG)
3824 setup[setup_count].debug = DEBUG_DEFAULT;
3825 #endif
3826 #if defined(__ISAPNP__)
3827 pnpdev[setup_count] = dev;
3828 #endif
3829 printk (KERN_INFO
3830 "aha152x: found ISAPnP adapter at io=0x%03x, irq=%d\n",
3831 setup[setup_count].io_port, setup[setup_count].irq);
3832 setup_count++;
3835 #endif
3837 #if defined(AUTOCONF)
3838 if (setup_count<ARRAY_SIZE(setup)) {
3839 #if !defined(SKIP_BIOSTEST)
3840 ok = 0;
3841 for (i = 0; i < ARRAY_SIZE(addresses) && !ok; i++) {
3842 void __iomem *p = ioremap(addresses[i], 0x4000);
3843 if (!p)
3844 continue;
3845 for (j = 0; j<ARRAY_SIZE(signatures) && !ok; j++)
3846 ok = check_signature(p + signatures[j].sig_offset,
3847 signatures[j].signature, signatures[j].sig_length);
3848 iounmap(p);
3850 if (!ok && setup_count == 0)
3851 return 0;
3853 printk(KERN_INFO "aha152x: BIOS test: passed, ");
3854 #else
3855 printk(KERN_INFO "aha152x: ");
3856 #endif /* !SKIP_BIOSTEST */
3858 ok = 0;
3859 for (i = 0; i < ARRAY_SIZE(ports) && setup_count < 2; i++) {
3860 if ((setup_count == 1) && (setup[0].io_port == ports[i]))
3861 continue;
3863 if ( request_region(ports[i], IO_RANGE, "aha152x")==0 ) {
3864 printk(KERN_ERR "aha152x: io port 0x%x busy.\n", ports[i]);
3865 continue;
3868 if (aha152x_porttest(ports[i])) {
3869 setup[setup_count].tc1550 = 0;
3871 conf.cf_port =
3872 (GETPORT(ports[i] + O_PORTA) << 8) + GETPORT(ports[i] + O_PORTB);
3873 } else if (tc1550_porttest(ports[i])) {
3874 setup[setup_count].tc1550 = 1;
3876 conf.cf_port =
3877 (GETPORT(ports[i] + O_TC_PORTA) << 8) + GETPORT(ports[i] + O_TC_PORTB);
3878 } else {
3879 release_region(ports[i], IO_RANGE);
3880 continue;
3883 release_region(ports[i], IO_RANGE);
3885 ok++;
3886 setup[setup_count].io_port = ports[i];
3887 setup[setup_count].irq = IRQ_MIN + conf.cf_irq;
3888 setup[setup_count].scsiid = conf.cf_id;
3889 setup[setup_count].reconnect = conf.cf_tardisc;
3890 setup[setup_count].parity = !conf.cf_parity;
3891 setup[setup_count].synchronous = conf.cf_syncneg;
3892 setup[setup_count].delay = DELAY_DEFAULT;
3893 setup[setup_count].ext_trans = 0;
3894 #if defined(AHA152X_DEBUG)
3895 setup[setup_count].debug = DEBUG_DEFAULT;
3896 #endif
3897 setup_count++;
3901 if (ok)
3902 printk("auto configuration: ok, ");
3904 #endif
3906 printk("%d controller(s) configured\n", setup_count);
3908 for (i=0; i<setup_count; i++) {
3909 if ( request_region(setup[i].io_port, IO_RANGE, "aha152x") ) {
3910 struct Scsi_Host *shpnt = aha152x_probe_one(&setup[i]);
3912 if( !shpnt ) {
3913 release_region(setup[i].io_port, IO_RANGE);
3914 #if defined(__ISAPNP__)
3915 } else if( pnpdev[i] ) {
3916 HOSTDATA(shpnt)->pnpdev=pnpdev[i];
3917 pnpdev[i]=NULL;
3918 #endif
3920 } else {
3921 printk(KERN_ERR "aha152x: io port 0x%x busy.\n", setup[i].io_port);
3924 #if defined(__ISAPNP__)
3925 if( pnpdev[i] )
3926 pnp_device_detach(pnpdev[i]);
3927 #endif
3930 return 1;
3933 static void __exit aha152x_exit(void)
3935 struct aha152x_hostdata *hd;
3937 list_for_each_entry(hd, &aha152x_host_list, host_list) {
3938 struct Scsi_Host *shost = container_of((void *)hd, struct Scsi_Host, hostdata);
3940 aha152x_release(shost);
3944 module_init(aha152x_init);
3945 module_exit(aha152x_exit);
3947 #if !defined(MODULE)
3948 static int __init aha152x_setup(char *str)
3950 #if defined(AHA152X_DEBUG)
3951 int ints[11];
3952 #else
3953 int ints[10];
3954 #endif
3955 get_options(str, ARRAY_SIZE(ints), ints);
3957 if(setup_count>=ARRAY_SIZE(setup)) {
3958 printk(KERN_ERR "aha152x: you can only configure up to two controllers\n");
3959 return 1;
3962 setup[setup_count].conf = str;
3963 setup[setup_count].io_port = ints[0] >= 1 ? ints[1] : 0x340;
3964 setup[setup_count].irq = ints[0] >= 2 ? ints[2] : 11;
3965 setup[setup_count].scsiid = ints[0] >= 3 ? ints[3] : 7;
3966 setup[setup_count].reconnect = ints[0] >= 4 ? ints[4] : 1;
3967 setup[setup_count].parity = ints[0] >= 5 ? ints[5] : 1;
3968 setup[setup_count].synchronous = ints[0] >= 6 ? ints[6] : 1;
3969 setup[setup_count].delay = ints[0] >= 7 ? ints[7] : DELAY_DEFAULT;
3970 setup[setup_count].ext_trans = ints[0] >= 8 ? ints[8] : 0;
3971 #if defined(AHA152X_DEBUG)
3972 setup[setup_count].debug = ints[0] >= 9 ? ints[9] : DEBUG_DEFAULT;
3973 if (ints[0] > 9) {
3974 printk(KERN_NOTICE "aha152x: usage: aha152x=<IOBASE>[,<IRQ>[,<SCSI ID>"
3975 "[,<RECONNECT>[,<PARITY>[,<SYNCHRONOUS>[,<DELAY>[,<EXT_TRANS>[,<DEBUG>]]]]]]]]\n");
3976 #else
3977 if (ints[0] > 8) { /*}*/
3978 printk(KERN_NOTICE "aha152x: usage: aha152x=<IOBASE>[,<IRQ>[,<SCSI ID>"
3979 "[,<RECONNECT>[,<PARITY>[,<SYNCHRONOUS>[,<DELAY>[,<EXT_TRANS>]]]]]]]\n");
3980 #endif
3981 } else {
3982 setup_count++;
3983 return 0;
3986 return 1;
3988 __setup("aha152x=", aha152x_setup);
3989 #endif
3991 #endif /* !PCMCIA */