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
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 $
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
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
50 * Revision 2.1 2000/05/17 16:23:17 fischer
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
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
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
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
96 * - moved request_irq behind controller initialization
97 * (to avoid spurious interrupts)
99 * Revision 1.12 1995/12/16 12:26:07 fischer
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
127 * - debugging improved
129 * Revision 1.4 1994/09/12 11:33:01 root
130 * - irqaction to request_irq
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
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
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
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
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 <linux/sched.h>
241 #include <linux/io.h>
242 #include <linux/blkdev.h>
243 #include <asm/system.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 <asm/semaphore.h>
258 #include <scsi/scsicam.h>
261 #include <scsi/scsi_dbg.h>
262 #include <scsi/scsi_host.h>
263 #include <scsi/scsi_transport_spi.h>
266 static LIST_HEAD(aha152x_host_list
);
271 /* For PCMCIA cards, always use AUTOCONF */
272 #if defined(PCMCIA) || defined(MODULE)
273 #if !defined(AUTOCONF)
278 #if !defined(AUTOCONF) && !defined(SETUP0)
279 #error define AUTOCONF or SETUP0
282 #if defined(AHA152X_DEBUG)
283 #define DEBUG_DEFAULT debug_eh
285 #define DPRINTK(when,msgs...) \
286 do { if(HOSTDATA(shpnt)->debug & (when)) printk(msgs); } while(0)
288 #define DO_LOCK(flags) \
290 if(spin_is_locked(&QLOCK)) { \
291 DPRINTK(debug_intr, DEBUG_LEAD "(%s:%d) already locked at %s:%d\n", CMDINFO(CURRENT_SC), __FUNCTION__, __LINE__, QLOCKER, QLOCKERL); \
293 DPRINTK(debug_locks, DEBUG_LEAD "(%s:%d) locking\n", CMDINFO(CURRENT_SC), __FUNCTION__, __LINE__); \
294 spin_lock_irqsave(&QLOCK,flags); \
295 DPRINTK(debug_locks, DEBUG_LEAD "(%s:%d) locked\n", CMDINFO(CURRENT_SC), __FUNCTION__, __LINE__); \
296 QLOCKER=__FUNCTION__; \
300 #define DO_UNLOCK(flags) \
302 DPRINTK(debug_locks, DEBUG_LEAD "(%s:%d) unlocking (locked at %s:%d)\n", CMDINFO(CURRENT_SC), __FUNCTION__, __LINE__, QLOCKER, QLOCKERL); \
303 spin_unlock_irqrestore(&QLOCK,flags); \
304 DPRINTK(debug_locks, DEBUG_LEAD "(%s:%d) unlocked\n", CMDINFO(CURRENT_SC), __FUNCTION__, __LINE__); \
305 QLOCKER="(not locked)"; \
310 #define DPRINTK(when,msgs...)
311 #define DO_LOCK(flags) spin_lock_irqsave(&QLOCK,flags)
312 #define DO_UNLOCK(flags) spin_unlock_irqrestore(&QLOCK,flags)
315 #define LEAD "(scsi%d:%d:%d) "
316 #define WARN_LEAD KERN_WARNING LEAD
317 #define INFO_LEAD KERN_INFO LEAD
318 #define NOTE_LEAD KERN_NOTICE LEAD
319 #define ERR_LEAD KERN_ERR LEAD
320 #define DEBUG_LEAD KERN_DEBUG LEAD
321 #define CMDINFO(cmd) \
322 (cmd) ? ((cmd)->device->host->host_no) : -1, \
323 (cmd) ? ((cmd)->device->id & 0x0f) : -1, \
324 (cmd) ? ((cmd)->device->lun & 0x07) : -1
326 #define DELAY_DEFAULT 1000
334 #define IRQ_MAX (NR_IRQS-1)
341 not_issued
= 0x0001, /* command not yet issued */
342 selecting
= 0x0002, /* target is beeing selected */
343 identified
= 0x0004, /* IDENTIFY was sent */
344 disconnected
= 0x0008, /* target disconnected */
345 completed
= 0x0010, /* target sent COMMAND COMPLETE */
346 aborted
= 0x0020, /* ABORT was sent */
347 resetted
= 0x0040, /* BUS DEVICE RESET was sent */
348 spiordy
= 0x0080, /* waiting for SPIORDY to raise */
349 syncneg
= 0x0100, /* synchronous negotiation in progress */
350 aborting
= 0x0200, /* ABORT is pending */
351 resetting
= 0x0400, /* BUS DEVICE RESET is pending */
352 check_condition
= 0x0800, /* requesting sense after CHECK CONDITION */
355 MODULE_AUTHOR("Jürgen Fischer");
356 MODULE_DESCRIPTION(AHA152X_REVID
);
357 MODULE_LICENSE("GPL");
361 static int io
[] = {0, 0};
362 module_param_array(io
, int, NULL
, 0);
363 MODULE_PARM_DESC(io
,"base io address of controller");
365 static int irq
[] = {0, 0};
366 module_param_array(irq
, int, NULL
, 0);
367 MODULE_PARM_DESC(irq
,"interrupt for controller");
369 static int scsiid
[] = {7, 7};
370 module_param_array(scsiid
, int, NULL
, 0);
371 MODULE_PARM_DESC(scsiid
,"scsi id of controller");
373 static int reconnect
[] = {1, 1};
374 module_param_array(reconnect
, int, NULL
, 0);
375 MODULE_PARM_DESC(reconnect
,"allow targets to disconnect");
377 static int parity
[] = {1, 1};
378 module_param_array(parity
, int, NULL
, 0);
379 MODULE_PARM_DESC(parity
,"use scsi parity");
381 static int sync
[] = {1, 1};
382 module_param_array(sync
, int, NULL
, 0);
383 MODULE_PARM_DESC(sync
,"use synchronous transfers");
385 static int delay
[] = {DELAY_DEFAULT
, DELAY_DEFAULT
};
386 module_param_array(delay
, int, NULL
, 0);
387 MODULE_PARM_DESC(delay
,"scsi reset delay");
389 static int exttrans
[] = {0, 0};
390 module_param_array(exttrans
, int, NULL
, 0);
391 MODULE_PARM_DESC(exttrans
,"use extended translation");
393 #if !defined(AHA152X_DEBUG)
394 static int aha152x
[] = {0, 11, 7, 1, 1, 0, DELAY_DEFAULT
, 0};
395 module_param_array(aha152x
, int, NULL
, 0);
396 MODULE_PARM_DESC(aha152x
, "parameters for first controller");
398 static int aha152x1
[] = {0, 11, 7, 1, 1, 0, DELAY_DEFAULT
, 0};
399 module_param_array(aha152x1
, int, NULL
, 0);
400 MODULE_PARM_DESC(aha152x1
, "parameters for second controller");
402 static int debug
[] = {DEBUG_DEFAULT
, DEBUG_DEFAULT
};
403 module_param_array(debug
, int, NULL
, 0);
404 MODULE_PARM_DESC(debug
, "flags for driver debugging");
406 static int aha152x
[] = {0, 11, 7, 1, 1, 1, DELAY_DEFAULT
, 0, DEBUG_DEFAULT
};
407 module_param_array(aha152x
, int, NULL
, 0);
408 MODULE_PARM_DESC(aha152x
, "parameters for first controller");
410 static int aha152x1
[] = {0, 11, 7, 1, 1, 1, DELAY_DEFAULT
, 0, DEBUG_DEFAULT
};
411 module_param_array(aha152x1
, int, NULL
, 0);
412 MODULE_PARM_DESC(aha152x1
, "parameters for second controller");
413 #endif /* !defined(AHA152X_DEBUG) */
417 static struct isapnp_device_id id_table
[] __devinitdata
= {
418 { ISAPNP_ANY_ID
, ISAPNP_ANY_ID
,
419 ISAPNP_VENDOR('A','D','P'), ISAPNP_FUNCTION(0x1505), 0 },
420 { ISAPNP_ANY_ID
, ISAPNP_ANY_ID
,
421 ISAPNP_VENDOR('A','D','P'), ISAPNP_FUNCTION(0x1530), 0 },
422 { ISAPNP_DEVICE_SINGLE_END
, }
424 MODULE_DEVICE_TABLE(isapnp
, id_table
);
429 static struct scsi_host_template aha152x_driver_template
;
432 * internal states of the host
454 * current state information of the host
457 struct aha152x_hostdata
{
459 /* pending commands to issue */
461 Scsi_Cmnd
*current_SC
;
462 /* current command on the bus */
464 Scsi_Cmnd
*disconnected_SC
;
465 /* commands that disconnected */
468 /* command that was completed */
473 #if defined(AHA152X_DEBUG)
475 /* which function has the lock */
476 int lockerl
; /* where did it get it */
478 int debug
; /* current debugging setting */
481 #if defined(AHA152X_STAT)
484 int busfree_without_any_action
;
485 int busfree_without_old_command
;
486 int busfree_without_new_command
;
487 int busfree_without_done_command
;
488 int busfree_with_check_condition
;
490 int count_trans
[maxstate
];
491 unsigned long time
[maxstate
];
494 int commands
; /* current number of commands */
496 int reconnect
; /* disconnection allowed */
497 int parity
; /* parity checking enabled */
498 int synchronous
; /* synchronous transferes enabled */
499 int delay
; /* reset out delay */
500 int ext_trans
; /* extended translation enabled */
502 int swint
; /* software-interrupt was fired during detect() */
503 int service
; /* bh needs to be run */
504 int in_intr
; /* bh is running */
508 last state different from current state */
509 enum aha152x_state state
, prevstate
, laststate
;
512 /* reconnecting target */
514 unsigned char syncrate
[8];
515 /* current synchronous transfer agreements */
517 unsigned char syncneg
[8];
518 /* 0: no negotiation;
519 * 1: negotiation in progress;
520 * 2: negotiation completed
524 /* number of sent bytes of current command */
527 /* number of received message bytes */
528 unsigned char msgi
[256];
529 /* received message bytes */
531 int msgo_i
, msgo_len
;
532 /* number of sent bytes and length of current messages */
533 unsigned char msgo
[256];
534 /* pending messages */
537 /* number of sent/received bytes in dataphase */
539 unsigned long io_port0
;
540 unsigned long io_port1
;
543 struct pnp_dev
*pnpdev
;
545 struct list_head host_list
;
550 * host specific command extension
553 struct aha152x_scdata
{
554 Scsi_Cmnd
*next
; /* next sc in queue */
555 struct semaphore
*sem
; /* semaphore to block on */
556 unsigned char cmd_len
;
557 unsigned char cmnd
[MAX_COMMAND_SIZE
];
558 unsigned short use_sg
;
559 unsigned request_bufflen
;
560 void *request_buffer
;
564 /* access macros for hostdata */
566 #define HOSTDATA(shpnt) ((struct aha152x_hostdata *) &shpnt->hostdata)
568 #define HOSTNO ((shpnt)->host_no)
570 #define CURRENT_SC (HOSTDATA(shpnt)->current_SC)
571 #define DONE_SC (HOSTDATA(shpnt)->done_SC)
572 #define ISSUE_SC (HOSTDATA(shpnt)->issue_SC)
573 #define DISCONNECTED_SC (HOSTDATA(shpnt)->disconnected_SC)
574 #define QLOCK (HOSTDATA(shpnt)->lock)
575 #define QLOCKER (HOSTDATA(shpnt)->locker)
576 #define QLOCKERL (HOSTDATA(shpnt)->lockerl)
578 #define STATE (HOSTDATA(shpnt)->state)
579 #define PREVSTATE (HOSTDATA(shpnt)->prevstate)
580 #define LASTSTATE (HOSTDATA(shpnt)->laststate)
582 #define RECONN_TARGET (HOSTDATA(shpnt)->target)
584 #define CMD_I (HOSTDATA(shpnt)->cmd_i)
586 #define MSGO(i) (HOSTDATA(shpnt)->msgo[i])
587 #define MSGO_I (HOSTDATA(shpnt)->msgo_i)
588 #define MSGOLEN (HOSTDATA(shpnt)->msgo_len)
589 #define ADDMSGO(x) (MSGOLEN<256 ? (void)(MSGO(MSGOLEN++)=x) : aha152x_error(shpnt,"MSGO overflow"))
591 #define MSGI(i) (HOSTDATA(shpnt)->msgi[i])
592 #define MSGILEN (HOSTDATA(shpnt)->msgi_len)
593 #define ADDMSGI(x) (MSGILEN<256 ? (void)(MSGI(MSGILEN++)=x) : aha152x_error(shpnt,"MSGI overflow"))
595 #define DATA_LEN (HOSTDATA(shpnt)->data_len)
597 #define SYNCRATE (HOSTDATA(shpnt)->syncrate[CURRENT_SC->device->id])
598 #define SYNCNEG (HOSTDATA(shpnt)->syncneg[CURRENT_SC->device->id])
600 #define DELAY (HOSTDATA(shpnt)->delay)
601 #define EXT_TRANS (HOSTDATA(shpnt)->ext_trans)
602 #define TC1550 (HOSTDATA(shpnt)->tc1550)
603 #define RECONNECT (HOSTDATA(shpnt)->reconnect)
604 #define PARITY (HOSTDATA(shpnt)->parity)
605 #define SYNCHRONOUS (HOSTDATA(shpnt)->synchronous)
607 #define HOSTIOPORT0 (HOSTDATA(shpnt)->io_port0)
608 #define HOSTIOPORT1 (HOSTDATA(shpnt)->io_port1)
610 #define SCDATA(SCpnt) ((struct aha152x_scdata *) (SCpnt)->host_scribble)
611 #define SCNEXT(SCpnt) SCDATA(SCpnt)->next
612 #define SCSEM(SCpnt) SCDATA(SCpnt)->sem
614 #define SG_ADDRESS(buffer) ((char *) (page_address((buffer)->page)+(buffer)->offset))
617 static void seldi_run(struct Scsi_Host
*shpnt
);
618 static void seldo_run(struct Scsi_Host
*shpnt
);
619 static void selto_run(struct Scsi_Host
*shpnt
);
620 static void busfree_run(struct Scsi_Host
*shpnt
);
622 static void msgo_init(struct Scsi_Host
*shpnt
);
623 static void msgo_run(struct Scsi_Host
*shpnt
);
624 static void msgo_end(struct Scsi_Host
*shpnt
);
626 static void cmd_init(struct Scsi_Host
*shpnt
);
627 static void cmd_run(struct Scsi_Host
*shpnt
);
628 static void cmd_end(struct Scsi_Host
*shpnt
);
630 static void datai_init(struct Scsi_Host
*shpnt
);
631 static void datai_run(struct Scsi_Host
*shpnt
);
632 static void datai_end(struct Scsi_Host
*shpnt
);
634 static void datao_init(struct Scsi_Host
*shpnt
);
635 static void datao_run(struct Scsi_Host
*shpnt
);
636 static void datao_end(struct Scsi_Host
*shpnt
);
638 static void status_run(struct Scsi_Host
*shpnt
);
640 static void msgi_run(struct Scsi_Host
*shpnt
);
641 static void msgi_end(struct Scsi_Host
*shpnt
);
643 static void parerr_run(struct Scsi_Host
*shpnt
);
644 static void rsti_run(struct Scsi_Host
*shpnt
);
646 static void is_complete(struct Scsi_Host
*shpnt
);
654 void (*init
)(struct Scsi_Host
*);
655 void (*run
)(struct Scsi_Host
*);
656 void (*end
)(struct Scsi_Host
*);
659 { "idle", NULL
, NULL
, NULL
, 0},
660 { "unknown", NULL
, NULL
, NULL
, 0},
661 { "seldo", NULL
, seldo_run
, NULL
, 0},
662 { "seldi", NULL
, seldi_run
, NULL
, 0},
663 { "selto", NULL
, selto_run
, NULL
, 0},
664 { "busfree", NULL
, busfree_run
, NULL
, 0},
665 { "msgo", msgo_init
, msgo_run
, msgo_end
, 1},
666 { "cmd", cmd_init
, cmd_run
, cmd_end
, 1},
667 { "msgi", NULL
, msgi_run
, msgi_end
, 1},
668 { "status", NULL
, status_run
, NULL
, 1},
669 { "datai", datai_init
, datai_run
, datai_end
, 0},
670 { "datao", datao_init
, datao_run
, datao_end
, 0},
671 { "parerr", NULL
, parerr_run
, NULL
, 0},
672 { "rsti", NULL
, rsti_run
, NULL
, 0},
675 /* setup & interrupt */
676 static irqreturn_t
intr(int irq
, void *dev_id
);
677 static void reset_ports(struct Scsi_Host
*shpnt
);
678 static void aha152x_error(struct Scsi_Host
*shpnt
, char *msg
);
679 static void done(struct Scsi_Host
*shpnt
, int error
);
682 static void disp_ports(struct Scsi_Host
*shpnt
);
683 static void show_command(Scsi_Cmnd
* ptr
);
684 static void show_queues(struct Scsi_Host
*shpnt
);
685 static void disp_enintr(struct Scsi_Host
*shpnt
);
692 static inline void append_SC(Scsi_Cmnd
**SC
, Scsi_Cmnd
*new_SC
)
696 SCNEXT(new_SC
) = NULL
;
700 for (end
= *SC
; SCNEXT(end
); end
= SCNEXT(end
))
702 SCNEXT(end
) = new_SC
;
706 static inline Scsi_Cmnd
*remove_first_SC(Scsi_Cmnd
** SC
)
718 static inline Scsi_Cmnd
*remove_lun_SC(Scsi_Cmnd
** SC
, int target
, int lun
)
720 Scsi_Cmnd
*ptr
, *prev
;
722 for (ptr
= *SC
, prev
= NULL
;
723 ptr
&& ((ptr
->device
->id
!= target
) || (ptr
->device
->lun
!= lun
));
724 prev
= ptr
, ptr
= SCNEXT(ptr
))
729 SCNEXT(prev
) = SCNEXT(ptr
);
739 static inline Scsi_Cmnd
*remove_SC(Scsi_Cmnd
**SC
, Scsi_Cmnd
*SCp
)
741 Scsi_Cmnd
*ptr
, *prev
;
743 for (ptr
= *SC
, prev
= NULL
;
745 prev
= ptr
, ptr
= SCNEXT(ptr
))
750 SCNEXT(prev
) = SCNEXT(ptr
);
760 static irqreturn_t
swintr(int irqno
, void *dev_id
)
762 struct Scsi_Host
*shpnt
= dev_id
;
764 HOSTDATA(shpnt
)->swint
++;
766 SETPORT(DMACNTRL0
, INTEN
);
770 struct Scsi_Host
*aha152x_probe_one(struct aha152x_setup
*setup
)
772 struct Scsi_Host
*shpnt
;
774 shpnt
= scsi_host_alloc(&aha152x_driver_template
, sizeof(struct aha152x_hostdata
));
776 printk(KERN_ERR
"aha152x: scsi_host_alloc failed\n");
780 memset(HOSTDATA(shpnt
), 0, sizeof *HOSTDATA(shpnt
));
781 INIT_LIST_HEAD(&HOSTDATA(shpnt
)->host_list
);
783 /* need to have host registered before triggering any interrupt */
784 list_add_tail(&HOSTDATA(shpnt
)->host_list
, &aha152x_host_list
);
786 shpnt
->io_port
= setup
->io_port
;
787 shpnt
->n_io_port
= IO_RANGE
;
788 shpnt
->irq
= setup
->irq
;
790 if (!setup
->tc1550
) {
791 HOSTIOPORT0
= setup
->io_port
;
792 HOSTIOPORT1
= setup
->io_port
;
794 HOSTIOPORT0
= setup
->io_port
+0x10;
795 HOSTIOPORT1
= setup
->io_port
-0x10;
798 spin_lock_init(&QLOCK
);
799 RECONNECT
= setup
->reconnect
;
800 SYNCHRONOUS
= setup
->synchronous
;
801 PARITY
= setup
->parity
;
802 DELAY
= setup
->delay
;
803 EXT_TRANS
= setup
->ext_trans
;
805 #if defined(AHA152X_DEBUG)
806 HOSTDATA(shpnt
)->debug
= setup
->debug
;
809 SETPORT(SCSIID
, setup
->scsiid
<< 4);
810 shpnt
->this_id
= setup
->scsiid
;
812 if (setup
->reconnect
)
813 shpnt
->can_queue
= AHA152X_MAXQUEUE
;
816 printk("aha152x: resetting bus...\n");
817 SETPORT(SCSISEQ
, SCSIRSTO
);
826 "vital data: rev=%x, "
827 "io=0x%03lx (0x%03lx/0x%03lx), "
834 "extended translation=%s\n",
835 shpnt
->host_no
, setup
->tc1550
? " (tc1550 mode)" : "",
837 shpnt
->io_port
, HOSTIOPORT0
, HOSTIOPORT1
,
840 RECONNECT
? "enabled" : "disabled",
841 PARITY
? "enabled" : "disabled",
842 SYNCHRONOUS
? "enabled" : "disabled",
844 EXT_TRANS
? "enabled" : "disabled");
846 /* not expecting any interrupts */
850 if( request_irq(shpnt
->irq
, swintr
, IRQF_DISABLED
|IRQF_SHARED
, "aha152x", shpnt
) ) {
851 printk(KERN_ERR
"aha152x%d: irq %d busy.\n", shpnt
->host_no
, shpnt
->irq
);
855 HOSTDATA(shpnt
)->swint
= 0;
857 printk(KERN_INFO
"aha152x%d: trying software interrupt, ", shpnt
->host_no
);
860 SETPORT(DMACNTRL0
, SWINT
|INTEN
);
862 free_irq(shpnt
->irq
, shpnt
);
864 if (!HOSTDATA(shpnt
)->swint
) {
865 if (TESTHI(DMASTAT
, INTSTAT
)) {
871 SETPORT(DMACNTRL0
, INTEN
);
873 printk(KERN_ERR
"aha152x%d: irq %d possibly wrong. "
874 "Please verify.\n", shpnt
->host_no
, shpnt
->irq
);
880 /* clear interrupts */
881 SETPORT(SSTAT0
, 0x7f);
882 SETPORT(SSTAT1
, 0xef);
884 if ( request_irq(shpnt
->irq
, intr
, IRQF_DISABLED
|IRQF_SHARED
, "aha152x", shpnt
) ) {
885 printk(KERN_ERR
"aha152x%d: failed to reassign irq %d.\n", shpnt
->host_no
, shpnt
->irq
);
889 if( scsi_add_host(shpnt
, NULL
) ) {
890 free_irq(shpnt
->irq
, shpnt
);
891 printk(KERN_ERR
"aha152x%d: failed to add host.\n", shpnt
->host_no
);
895 scsi_scan_host(shpnt
);
900 list_del(&HOSTDATA(shpnt
)->host_list
);
901 scsi_host_put(shpnt
);
906 void aha152x_release(struct Scsi_Host
*shpnt
)
912 free_irq(shpnt
->irq
, shpnt
);
916 release_region(shpnt
->io_port
, IO_RANGE
);
920 if (HOSTDATA(shpnt
)->pnpdev
)
921 pnp_device_detach(HOSTDATA(shpnt
)->pnpdev
);
924 scsi_remove_host(shpnt
);
925 list_del(&HOSTDATA(shpnt
)->host_list
);
926 scsi_host_put(shpnt
);
931 * setup controller to generate interrupts depending
932 * on current state (lock has to be acquired)
935 static int setup_expected_interrupts(struct Scsi_Host
*shpnt
)
938 CURRENT_SC
->SCp
.phase
|= 1 << 16;
940 if(CURRENT_SC
->SCp
.phase
& selecting
) {
941 DPRINTK(debug_intr
, DEBUG_LEAD
"expecting: (seldo) (seltimo) (seldi)\n", CMDINFO(CURRENT_SC
));
942 SETPORT(SSTAT1
, SELTO
);
943 SETPORT(SIMODE0
, ENSELDO
| (DISCONNECTED_SC
? ENSELDI
: 0));
944 SETPORT(SIMODE1
, ENSELTIMO
);
946 DPRINTK(debug_intr
, DEBUG_LEAD
"expecting: (phase change) (busfree) %s\n", CMDINFO(CURRENT_SC
), CURRENT_SC
->SCp
.phase
& spiordy
? "(spiordy)" : "");
947 SETPORT(SIMODE0
, (CURRENT_SC
->SCp
.phase
& spiordy
) ? ENSPIORDY
: 0);
948 SETPORT(SIMODE1
, ENPHASEMIS
| ENSCSIRST
| ENSCSIPERR
| ENBUSFREE
);
950 } else if(STATE
==seldi
) {
951 DPRINTK(debug_intr
, DEBUG_LEAD
"expecting: (phase change) (identify)\n", CMDINFO(CURRENT_SC
));
953 SETPORT(SIMODE1
, ENPHASEMIS
| ENSCSIRST
| ENSCSIPERR
| ENBUSFREE
);
955 DPRINTK(debug_intr
, DEBUG_LEAD
"expecting: %s %s\n",
957 DISCONNECTED_SC
? "(reselection)" : "",
958 ISSUE_SC
? "(busfree)" : "");
959 SETPORT(SIMODE0
, DISCONNECTED_SC
? ENSELDI
: 0);
960 SETPORT(SIMODE1
, ENSCSIRST
| ( (ISSUE_SC
||DONE_SC
) ? ENBUSFREE
: 0));
963 if(!HOSTDATA(shpnt
)->in_intr
)
964 SETBITS(DMACNTRL0
, INTEN
);
966 return TESTHI(DMASTAT
, INTSTAT
);
971 * Queue a command and setup interrupts for a free bus.
973 static int aha152x_internal_queue(Scsi_Cmnd
*SCpnt
, struct semaphore
*sem
, int phase
, void (*done
)(Scsi_Cmnd
*))
975 struct Scsi_Host
*shpnt
= SCpnt
->device
->host
;
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
);
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
));
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
));
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
;
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;
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;
1039 #if defined(AHA152X_STAT)
1040 HOSTDATA(shpnt
)->total_commands
++;
1043 /* Turn led on, when this is the first command. */
1044 HOSTDATA(shpnt
)->commands
++;
1045 if (HOSTDATA(shpnt
)->commands
==1)
1048 append_SC(&ISSUE_SC
, SCpnt
);
1050 if(!HOSTDATA(shpnt
)->in_intr
)
1051 setup_expected_interrupts(shpnt
);
1062 static int aha152x_queue(Scsi_Cmnd
*SCpnt
, void (*done
)(Scsi_Cmnd
*))
1065 if(*SCpnt
->cmnd
== REQUEST_SENSE
) {
1073 return aha152x_internal_queue(SCpnt
, NULL
, 0, done
);
1081 static void reset_done(Scsi_Cmnd
*SCpnt
)
1084 struct Scsi_Host
*shpnt
= SCpnt
->host
;
1085 DPRINTK(debug_eh
, INFO_LEAD
"reset_done called\n", CMDINFO(SCpnt
));
1090 printk(KERN_ERR
"aha152x: reset_done w/o semaphore\n");
1098 static int aha152x_abort(Scsi_Cmnd
*SCpnt
)
1100 struct Scsi_Host
*shpnt
= SCpnt
->device
->host
;
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
);
1113 ptr
=remove_SC(&ISSUE_SC
, SCpnt
);
1116 DPRINTK(debug_eh
, DEBUG_LEAD
"not yet issued - SUCCESS\n", CMDINFO(SCpnt
));
1118 HOSTDATA(shpnt
)->commands
--;
1119 if (!HOSTDATA(shpnt
)->commands
)
1123 kfree(SCpnt
->host_scribble
);
1124 SCpnt
->host_scribble
=NULL
;
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
));
1143 static void timer_expired(unsigned long p
)
1145 Scsi_Cmnd
*SCp
= (Scsi_Cmnd
*)p
;
1146 struct semaphore
*sem
= SCSEM(SCp
);
1147 struct Scsi_Host
*shpnt
= SCp
->device
->host
;
1148 unsigned long flags
;
1150 /* remove command from issue queue */
1152 remove_SC(&ISSUE_SC
, SCp
);
1162 static int aha152x_device_reset(Scsi_Cmnd
* SCpnt
)
1164 struct Scsi_Host
*shpnt
= SCpnt
->device
->host
;
1165 DECLARE_MUTEX_LOCKED(sem
);
1166 struct timer_list timer
;
1167 int ret
, issued
, disconnected
;
1168 unsigned char old_cmd_len
= SCpnt
->cmd_len
;
1169 unsigned short old_use_sg
= SCpnt
->use_sg
;
1170 void *old_buffer
= SCpnt
->request_buffer
;
1171 unsigned old_bufflen
= SCpnt
->request_bufflen
;
1172 unsigned long flags
;
1174 #if defined(AHA152X_DEBUG)
1175 if(HOSTDATA(shpnt
)->debug
& debug_eh
) {
1176 printk(INFO_LEAD
"aha152x_device_reset(%p)", CMDINFO(SCpnt
), SCpnt
);
1181 if(CURRENT_SC
==SCpnt
) {
1182 printk(ERR_LEAD
"cannot reset current device\n", CMDINFO(SCpnt
));
1187 issued
= remove_SC(&ISSUE_SC
, SCpnt
)==0;
1188 disconnected
= issued
&& remove_SC(&DISCONNECTED_SC
, SCpnt
);
1193 SCpnt
->request_buffer
= NULL
;
1194 SCpnt
->request_bufflen
= 0;
1197 timer
.data
= (unsigned long) SCpnt
;
1198 timer
.expires
= jiffies
+ 100*HZ
; /* 10s */
1199 timer
.function
= (void (*)(unsigned long)) timer_expired
;
1201 aha152x_internal_queue(SCpnt
, &sem
, resetting
, reset_done
);
1206 SCpnt
->cmd_len
= old_cmd_len
;
1207 SCpnt
->use_sg
= old_use_sg
;
1208 SCpnt
->request_buffer
= old_buffer
;
1209 SCpnt
->request_bufflen
= old_bufflen
;
1213 if(SCpnt
->SCp
.phase
& resetted
) {
1214 HOSTDATA(shpnt
)->commands
--;
1215 if (!HOSTDATA(shpnt
)->commands
)
1217 kfree(SCpnt
->host_scribble
);
1218 SCpnt
->host_scribble
=NULL
;
1224 append_SC(&ISSUE_SC
, SCpnt
);
1225 } else if(disconnected
) {
1226 append_SC(&DISCONNECTED_SC
, SCpnt
);
1236 static void free_hard_reset_SCs(struct Scsi_Host
*shpnt
, Scsi_Cmnd
**SCs
)
1247 printk(DEBUG_LEAD
"queue corrupted at %p\n", CMDINFO(ptr
), ptr
);
1251 if (!ptr
->device
->soft_reset
) {
1252 DPRINTK(debug_eh
, DEBUG_LEAD
"disconnected command %p removed\n", CMDINFO(ptr
), ptr
);
1253 remove_SC(SCs
, ptr
);
1254 HOSTDATA(shpnt
)->commands
--;
1255 kfree(ptr
->host_scribble
);
1256 ptr
->host_scribble
=NULL
;
1267 static int aha152x_bus_reset_host(struct Scsi_Host
*shpnt
)
1269 unsigned long flags
;
1273 #if defined(AHA152X_DEBUG)
1274 if(HOSTDATA(shpnt
)->debug
& debug_eh
) {
1275 printk(KERN_DEBUG
"scsi%d: bus reset", shpnt
->host_no
);
1280 free_hard_reset_SCs(shpnt
, &ISSUE_SC
);
1281 free_hard_reset_SCs(shpnt
, &DISCONNECTED_SC
);
1283 DPRINTK(debug_eh
, KERN_DEBUG
"scsi%d: resetting bus\n", shpnt
->host_no
);
1285 SETPORT(SCSISEQ
, SCSIRSTO
);
1287 SETPORT(SCSISEQ
, 0);
1290 DPRINTK(debug_eh
, KERN_DEBUG
"scsi%d: bus resetted\n", shpnt
->host_no
);
1292 setup_expected_interrupts(shpnt
);
1293 if(HOSTDATA(shpnt
)->commands
==0)
1305 static int aha152x_bus_reset(Scsi_Cmnd
*SCpnt
)
1307 return aha152x_bus_reset_host(SCpnt
->device
->host
);
1311 * Restore default values to the AIC-6260 registers and reset the fifos
1314 static void reset_ports(struct Scsi_Host
*shpnt
)
1316 unsigned long flags
;
1318 /* disable interrupts */
1319 SETPORT(DMACNTRL0
, RSTFIFO
);
1321 SETPORT(SCSISEQ
, 0);
1323 SETPORT(SXFRCTL1
, 0);
1324 SETPORT(SCSISIG
, 0);
1327 /* clear all interrupt conditions */
1328 SETPORT(SSTAT0
, 0x7f);
1329 SETPORT(SSTAT1
, 0xef);
1331 SETPORT(SSTAT4
, SYNCERR
| FWERR
| FRERR
);
1333 SETPORT(DMACNTRL0
, 0);
1334 SETPORT(DMACNTRL1
, 0);
1336 SETPORT(BRSTCNTRL
, 0xf1);
1338 /* clear SCSI fifos and transfer count */
1339 SETPORT(SXFRCTL0
, CH1
|CLRCH1
|CLRSTCNT
);
1340 SETPORT(SXFRCTL0
, CH1
);
1343 setup_expected_interrupts(shpnt
);
1348 * Reset the host (bus and controller)
1351 int aha152x_host_reset_host(struct Scsi_Host
*shpnt
)
1353 DPRINTK(debug_eh
, KERN_DEBUG
"scsi%d: host reset\n", shpnt
->host_no
);
1355 aha152x_bus_reset_host(shpnt
);
1357 DPRINTK(debug_eh
, KERN_DEBUG
"scsi%d: resetting ports\n", shpnt
->host_no
);
1364 * Reset the host (bus and controller)
1367 static int aha152x_host_reset(Scsi_Cmnd
*SCpnt
)
1369 return aha152x_host_reset_host(SCpnt
->device
->host
);
1373 * Return the "logical geometry"
1376 static int aha152x_biosparam(struct scsi_device
*sdev
, struct block_device
*bdev
,
1377 sector_t capacity
, int *info_array
)
1379 struct Scsi_Host
*shpnt
= sdev
->host
;
1381 /* try default translation */
1384 info_array
[2] = (unsigned long)capacity
/ (64 * 32);
1386 /* for disks >1GB do some guessing */
1387 if (info_array
[2] >= 1024) {
1390 /* try to figure out the geometry from the partition table */
1391 if (scsicam_bios_param(bdev
, capacity
, info
) < 0 ||
1392 !((info
[0] == 64 && info
[1] == 32) || (info
[0] == 255 && info
[1] == 63))) {
1395 "aha152x: unable to verify geometry for disk with >1GB.\n"
1396 " using extended translation.\n");
1397 info_array
[0] = 255;
1399 info_array
[2] = (unsigned long)capacity
/ (255 * 63);
1402 "aha152x: unable to verify geometry for disk with >1GB.\n"
1403 " Using default translation. Please verify yourself.\n"
1404 " Perhaps you need to enable extended translation in the driver.\n"
1405 " See Documentation/scsi/aha152x.txt for details.\n");
1408 info_array
[0] = info
[0];
1409 info_array
[1] = info
[1];
1410 info_array
[2] = info
[2];
1412 if (info
[0] == 255 && !EXT_TRANS
) {
1414 "aha152x: current partition table is using extended translation.\n"
1415 " using it also, although it's not explicitly enabled.\n");
1424 * Internal done function
1427 static void done(struct Scsi_Host
*shpnt
, int error
)
1431 printk(ERR_LEAD
"there's already a completed command %p - will cause abort\n", CMDINFO(CURRENT_SC
), DONE_SC
);
1433 DONE_SC
= CURRENT_SC
;
1435 DONE_SC
->result
= error
;
1437 printk(KERN_ERR
"aha152x: done() called outside of command\n");
1440 static struct work_struct aha152x_tq
;
1443 * Run service completions on the card with interrupts enabled.
1446 static void run(struct work_struct
*work
)
1448 struct aha152x_hostdata
*hd
;
1450 list_for_each_entry(hd
, &aha152x_host_list
, host_list
) {
1451 struct Scsi_Host
*shost
= container_of((void *)hd
, struct Scsi_Host
, hostdata
);
1461 static irqreturn_t
intr(int irqno
, void *dev_id
)
1463 struct Scsi_Host
*shpnt
= (struct Scsi_Host
*)dev_id
;
1464 unsigned long flags
;
1465 unsigned char rev
, dmacntrl0
;
1468 printk(KERN_ERR
"aha152x: catched interrupt %d for unknown controller.\n", irqno
);
1473 * Read a couple of registers that are known to not be all 1's. If
1474 * we read all 1's (-1), that means that either:
1476 * a. The host adapter chip has gone bad, and we cannot control it,
1478 * b. The host adapter is a PCMCIA card that has been ejected
1480 * In either case, we cannot do anything with the host adapter at
1481 * this point in time. So just ignore the interrupt and return.
1482 * In the latter case, the interrupt might actually be meant for
1483 * someone else sharing this IRQ, and that driver will handle it.
1486 dmacntrl0
= GETPORT(DMACNTRL0
);
1487 if ((rev
== 0xFF) && (dmacntrl0
== 0xFF))
1490 if( TESTLO(DMASTAT
, INTSTAT
) )
1493 /* no more interrupts from the controller, while we're busy.
1494 INTEN is restored by the BH handler */
1495 CLRBITS(DMACNTRL0
, INTEN
);
1498 if( HOSTDATA(shpnt
)->service
==0 ) {
1499 HOSTDATA(shpnt
)->service
=1;
1501 /* Poke the BH handler */
1502 INIT_WORK(&aha152x_tq
, run
);
1503 schedule_work(&aha152x_tq
);
1512 * - handle completition/disconnection/error of current command
1513 * - start selection for next command (if any)
1515 static void busfree_run(struct Scsi_Host
*shpnt
)
1517 unsigned long flags
;
1518 #if defined(AHA152X_STAT)
1522 SETPORT(SXFRCTL0
, CH1
|CLRCH1
|CLRSTCNT
);
1523 SETPORT(SXFRCTL0
, CH1
);
1525 SETPORT(SSTAT1
, CLRBUSFREE
);
1528 #if defined(AHA152X_STAT)
1531 CURRENT_SC
->SCp
.phase
&= ~syncneg
;
1533 if(CURRENT_SC
->SCp
.phase
& completed
) {
1534 /* target sent COMMAND COMPLETE */
1535 done(shpnt
, (CURRENT_SC
->SCp
.Status
& 0xff) | ((CURRENT_SC
->SCp
.Message
& 0xff) << 8) | (DID_OK
<< 16));
1537 } else if(CURRENT_SC
->SCp
.phase
& aborted
) {
1538 DPRINTK(debug_eh
, DEBUG_LEAD
"ABORT sent\n", CMDINFO(CURRENT_SC
));
1539 done(shpnt
, (CURRENT_SC
->SCp
.Status
& 0xff) | ((CURRENT_SC
->SCp
.Message
& 0xff) << 8) | (DID_ABORT
<< 16));
1541 } else if(CURRENT_SC
->SCp
.phase
& resetted
) {
1542 DPRINTK(debug_eh
, DEBUG_LEAD
"BUS DEVICE RESET sent\n", CMDINFO(CURRENT_SC
));
1543 done(shpnt
, (CURRENT_SC
->SCp
.Status
& 0xff) | ((CURRENT_SC
->SCp
.Message
& 0xff) << 8) | (DID_RESET
<< 16));
1545 } else if(CURRENT_SC
->SCp
.phase
& disconnected
) {
1546 /* target sent DISCONNECT */
1547 DPRINTK(debug_selection
, DEBUG_LEAD
"target disconnected at %d/%d\n",
1548 CMDINFO(CURRENT_SC
),
1550 CURRENT_SC
->request_bufflen
);
1551 #if defined(AHA152X_STAT)
1552 HOSTDATA(shpnt
)->disconnections
++;
1554 append_SC(&DISCONNECTED_SC
, CURRENT_SC
);
1555 CURRENT_SC
->SCp
.phase
|= 1 << 16;
1559 done(shpnt
, DID_ERROR
<< 16);
1561 #if defined(AHA152X_STAT)
1563 HOSTDATA(shpnt
)->busfree_without_old_command
++;
1570 #if defined(AHA152X_STAT)
1574 if(DONE_SC
->SCp
.phase
& check_condition
) {
1575 struct scsi_cmnd
*cmd
= HOSTDATA(shpnt
)->done_SC
;
1576 struct aha152x_scdata
*sc
= SCDATA(cmd
);
1579 if(HOSTDATA(shpnt
)->debug
& debug_eh
) {
1580 printk(ERR_LEAD
"received sense: ", CMDINFO(DONE_SC
));
1581 scsi_print_sense("bh", DONE_SC
);
1585 /* restore old command */
1586 memcpy(cmd
->cmnd
, sc
->cmnd
, sizeof(sc
->cmnd
));
1587 cmd
->request_buffer
= sc
->request_buffer
;
1588 cmd
->request_bufflen
= sc
->request_bufflen
;
1589 cmd
->use_sg
= sc
->use_sg
;
1590 cmd
->cmd_len
= sc
->cmd_len
;
1592 cmd
->SCp
.Status
= 0x02;
1594 HOSTDATA(shpnt
)->commands
--;
1595 if (!HOSTDATA(shpnt
)->commands
)
1596 SETPORT(PORTA
, 0); /* turn led off */
1597 } else if(DONE_SC
->SCp
.Status
==0x02) {
1598 #if defined(AHA152X_STAT)
1599 HOSTDATA(shpnt
)->busfree_with_check_condition
++;
1602 DPRINTK(debug_eh
, ERR_LEAD
"CHECK CONDITION found\n", CMDINFO(DONE_SC
));
1605 if(!(DONE_SC
->SCp
.Status
& not_issued
)) {
1606 Scsi_Cmnd
*ptr
= DONE_SC
;
1609 DPRINTK(debug_eh
, ERR_LEAD
"requesting sense\n", CMDINFO(ptr
));
1612 ptr
->cmnd
[0] = REQUEST_SENSE
;
1616 ptr
->cmnd
[4] = sizeof(ptr
->sense_buffer
);
1620 ptr
->request_buffer
= ptr
->sense_buffer
;
1621 ptr
->request_bufflen
= sizeof(ptr
->sense_buffer
);
1624 aha152x_internal_queue(ptr
, NULL
, check_condition
, ptr
->scsi_done
);
1628 DPRINTK(debug_eh
, ERR_LEAD
"command not issued - CHECK CONDITION ignored\n", CMDINFO(DONE_SC
));
1633 if(DONE_SC
&& DONE_SC
->scsi_done
) {
1634 #if defined(AHA152X_DEBUG)
1635 int hostno
=DONE_SC
->device
->host
->host_no
;
1636 int id
=DONE_SC
->device
->id
& 0xf;
1637 int lun
=DONE_SC
->device
->lun
& 0x7;
1639 Scsi_Cmnd
*ptr
= DONE_SC
;
1642 /* turn led off, when no commands are in the driver */
1643 HOSTDATA(shpnt
)->commands
--;
1644 if (!HOSTDATA(shpnt
)->commands
)
1645 SETPORT(PORTA
, 0); /* turn led off */
1647 if(ptr
->scsi_done
!= reset_done
) {
1648 kfree(ptr
->host_scribble
);
1649 ptr
->host_scribble
=NULL
;
1653 DPRINTK(debug_done
, DEBUG_LEAD
"calling scsi_done(%p)\n", hostno
, id
, lun
, ptr
);
1654 ptr
->scsi_done(ptr
);
1655 DPRINTK(debug_done
, DEBUG_LEAD
"scsi_done(%p) returned\n", hostno
, id
, lun
, ptr
);
1660 #if defined(AHA152X_STAT)
1662 HOSTDATA(shpnt
)->busfree_without_done_command
++;
1667 CURRENT_SC
= remove_first_SC(&ISSUE_SC
);
1672 #if defined(AHA152X_STAT)
1675 CURRENT_SC
->SCp
.phase
|= selecting
;
1677 DPRINTK(debug_selection
, DEBUG_LEAD
"selecting target\n", CMDINFO(CURRENT_SC
));
1679 /* clear selection timeout */
1680 SETPORT(SSTAT1
, SELTO
);
1682 SETPORT(SCSIID
, (shpnt
->this_id
<< OID_
) | CURRENT_SC
->device
->id
);
1683 SETPORT(SXFRCTL1
, (PARITY
? ENSPCHK
: 0 ) | ENSTIMER
);
1684 SETPORT(SCSISEQ
, ENSELO
| ENAUTOATNO
| (DISCONNECTED_SC
? ENRESELI
: 0));
1686 #if defined(AHA152X_STAT)
1687 HOSTDATA(shpnt
)->busfree_without_new_command
++;
1689 SETPORT(SCSISEQ
, DISCONNECTED_SC
? ENRESELI
: 0);
1692 #if defined(AHA152X_STAT)
1694 HOSTDATA(shpnt
)->busfree_without_any_action
++;
1699 * Selection done (OUT)
1700 * - queue IDENTIFY message and SDTR to selected target for message out
1701 * (ATN asserted automagically via ENAUTOATNO in busfree())
1703 static void seldo_run(struct Scsi_Host
*shpnt
)
1705 SETPORT(SCSISIG
, 0);
1706 SETPORT(SSTAT1
, CLRBUSFREE
);
1707 SETPORT(SSTAT1
, CLRPHASECHG
);
1709 CURRENT_SC
->SCp
.phase
&= ~(selecting
|not_issued
);
1711 SETPORT(SCSISEQ
, 0);
1713 if (TESTLO(SSTAT0
, SELDO
)) {
1714 printk(ERR_LEAD
"aha152x: passing bus free condition\n", CMDINFO(CURRENT_SC
));
1715 done(shpnt
, DID_NO_CONNECT
<< 16);
1719 SETPORT(SSTAT0
, CLRSELDO
);
1721 ADDMSGO(IDENTIFY(RECONNECT
, CURRENT_SC
->device
->lun
));
1723 if (CURRENT_SC
->SCp
.phase
& aborting
) {
1725 } else if (CURRENT_SC
->SCp
.phase
& resetting
) {
1726 ADDMSGO(BUS_DEVICE_RESET
);
1727 } else if (SYNCNEG
==0 && SYNCHRONOUS
) {
1728 CURRENT_SC
->SCp
.phase
|= syncneg
;
1729 MSGOLEN
+= spi_populate_sync_msg(&MSGO(MSGOLEN
), 50, 8);
1730 SYNCNEG
=1; /* negotiation in progress */
1738 * - return command to mid-level with failure cause
1741 static void selto_run(struct Scsi_Host
*shpnt
)
1743 SETPORT(SCSISEQ
, 0);
1744 SETPORT(SSTAT1
, CLRSELTIMO
);
1746 DPRINTK(debug_selection
, DEBUG_LEAD
"selection timeout\n", CMDINFO(CURRENT_SC
));
1749 DPRINTK(debug_selection
, DEBUG_LEAD
"!CURRENT_SC\n", CMDINFO(CURRENT_SC
));
1753 CURRENT_SC
->SCp
.phase
&= ~selecting
;
1755 if (CURRENT_SC
->SCp
.phase
& aborted
) {
1756 DPRINTK(debug_selection
, DEBUG_LEAD
"aborted\n", CMDINFO(CURRENT_SC
));
1757 done(shpnt
, DID_ABORT
<< 16);
1758 } else if (TESTLO(SSTAT0
, SELINGO
)) {
1759 DPRINTK(debug_selection
, DEBUG_LEAD
"arbitration not won\n", CMDINFO(CURRENT_SC
));
1760 done(shpnt
, DID_BUS_BUSY
<< 16);
1762 /* ARBITRATION won, but SELECTION failed */
1763 DPRINTK(debug_selection
, DEBUG_LEAD
"selection failed\n", CMDINFO(CURRENT_SC
));
1764 done(shpnt
, DID_NO_CONNECT
<< 16);
1770 * - put current command back to issue queue
1771 * (reconnection of a disconnected nexus instead
1772 * of successful selection out)
1775 static void seldi_run(struct Scsi_Host
*shpnt
)
1779 unsigned long flags
;
1781 SETPORT(SCSISIG
, 0);
1782 SETPORT(SSTAT0
, CLRSELDI
);
1783 SETPORT(SSTAT1
, CLRBUSFREE
);
1784 SETPORT(SSTAT1
, CLRPHASECHG
);
1787 if(!(CURRENT_SC
->SCp
.phase
& not_issued
))
1788 printk(ERR_LEAD
"command should not have been issued yet\n", CMDINFO(CURRENT_SC
));
1790 DPRINTK(debug_selection
, ERR_LEAD
"command requeued - reselection\n", CMDINFO(CURRENT_SC
));
1793 append_SC(&ISSUE_SC
, CURRENT_SC
);
1799 if(!DISCONNECTED_SC
) {
1800 DPRINTK(debug_selection
, DEBUG_LEAD
"unexpected SELDI ", CMDINFO(CURRENT_SC
));
1806 selid
= GETPORT(SELID
) & ~(1 << shpnt
->this_id
);
1809 printk("aha152x%d: target id unknown (%02x)\n", HOSTNO
, selid
);
1813 for(target
=7; !(selid
& (1 << target
)); target
--)
1816 if(selid
& ~(1 << target
)) {
1817 printk("aha152x%d: multiple targets reconnected (%02x)\n",
1822 SETPORT(SCSIID
, (shpnt
->this_id
<< OID_
) | target
);
1823 SETPORT(SCSISEQ
, 0);
1825 SETRATE(HOSTDATA(shpnt
)->syncrate
[target
]);
1827 RECONN_TARGET
=target
;
1828 DPRINTK(debug_selection
, DEBUG_LEAD
"target %d reselected (%02x).\n", CMDINFO(CURRENT_SC
), target
, selid
);
1833 * - handle initial message after reconnection to identify
1834 * reconnecting nexus
1835 * - queue command on DISCONNECTED_SC on DISCONNECT message
1836 * - set completed flag on COMMAND COMPLETE
1837 * (other completition code moved to busfree_run)
1838 * - handle response to SDTR
1839 * - clear synchronous transfer agreements on BUS RESET
1841 * FIXME: what about SAVE POINTERS, RESTORE POINTERS?
1844 static void msgi_run(struct Scsi_Host
*shpnt
)
1847 int sstat1
= GETPORT(SSTAT1
);
1849 if(sstat1
& (PHASECHG
|PHASEMIS
|BUSFREE
) || !(sstat1
& REQINIT
))
1852 if(TESTLO(SSTAT0
,SPIORDY
)) {
1853 DPRINTK(debug_msgi
, DEBUG_LEAD
"!SPIORDY\n", CMDINFO(CURRENT_SC
));
1857 ADDMSGI(GETPORT(SCSIDAT
));
1859 #if defined(AHA152X_DEBUG)
1860 if (HOSTDATA(shpnt
)->debug
& debug_msgi
) {
1861 printk(INFO_LEAD
"inbound message %02x ", CMDINFO(CURRENT_SC
), MSGI(0));
1862 spi_print_msg(&MSGI(0));
1868 if(LASTSTATE
!=seldi
) {
1869 printk(KERN_ERR
"aha152x%d: message in w/o current command not after reselection\n", HOSTNO
);
1873 * Handle reselection
1875 if(!(MSGI(0) & IDENTIFY_BASE
)) {
1876 printk(KERN_ERR
"aha152x%d: target didn't identify after reselection\n", HOSTNO
);
1880 CURRENT_SC
= remove_lun_SC(&DISCONNECTED_SC
, RECONN_TARGET
, MSGI(0) & 0x3f);
1884 printk(KERN_ERR
"aha152x%d: no disconnected command for target %d/%d\n", HOSTNO
, RECONN_TARGET
, MSGI(0) & 0x3f);
1888 DPRINTK(debug_msgi
, DEBUG_LEAD
"target reconnected\n", CMDINFO(CURRENT_SC
));
1890 CURRENT_SC
->SCp
.Message
= MSGI(0);
1891 CURRENT_SC
->SCp
.phase
&= ~disconnected
;
1895 /* next message if any */
1899 CURRENT_SC
->SCp
.Message
= MSGI(0);
1904 printk(WARN_LEAD
"target was not allowed to disconnect\n", CMDINFO(CURRENT_SC
));
1906 CURRENT_SC
->SCp
.phase
|= disconnected
;
1909 case COMMAND_COMPLETE
:
1910 if(CURRENT_SC
->SCp
.phase
& completed
)
1911 DPRINTK(debug_msgi
, DEBUG_LEAD
"again COMMAND COMPLETE\n", CMDINFO(CURRENT_SC
));
1913 CURRENT_SC
->SCp
.phase
|= completed
;
1916 case MESSAGE_REJECT
:
1918 printk(INFO_LEAD
"Synchronous Data Transfer Request was rejected\n", CMDINFO(CURRENT_SC
));
1919 SYNCNEG
=2; /* negotiation completed */
1921 printk(INFO_LEAD
"inbound message (MESSAGE REJECT)\n", CMDINFO(CURRENT_SC
));
1927 case RESTORE_POINTERS
:
1930 case EXTENDED_MESSAGE
:
1931 if(MSGILEN
<2 || MSGILEN
<MSGI(1)+2) {
1932 /* not yet completed */
1942 printk(ERR_LEAD
"SDTR message length!=3\n", CMDINFO(CURRENT_SC
));
1946 if (!HOSTDATA(shpnt
)->synchronous
)
1949 printk(INFO_LEAD
, CMDINFO(CURRENT_SC
));
1950 spi_print_msg(&MSGI(0));
1953 ticks
= (MSGI(3) * 4 + 49) / 50;
1956 /* negotiation in progress */
1957 if (ticks
> 9 || MSGI(4) < 1 || MSGI(4) > 8) {
1958 ADDMSGO(MESSAGE_REJECT
);
1959 printk(INFO_LEAD
"received Synchronous Data Transfer Request invalid - rejected\n", CMDINFO(CURRENT_SC
));
1963 SYNCRATE
|= ((ticks
- 2) << 4) + MSGI(4);
1964 } else if (ticks
<= 9 && MSGI(4) >= 1) {
1965 ADDMSGO(EXTENDED_MESSAGE
);
1967 ADDMSGO(EXTENDED_SDTR
);
1979 SYNCRATE
|= ((ticks
- 2) << 4) + MSGI(4);
1981 /* requested SDTR is too slow, do it asynchronously */
1982 printk(INFO_LEAD
"Synchronous Data Transfer Request too slow - Rejecting\n", CMDINFO(CURRENT_SC
));
1983 ADDMSGO(MESSAGE_REJECT
);
1986 SYNCNEG
=2; /* negotiation completed */
1991 case BUS_DEVICE_RESET
:
1995 for(i
=0; i
<8; i
++) {
1996 HOSTDATA(shpnt
)->syncrate
[i
]=0;
1997 HOSTDATA(shpnt
)->syncneg
[i
]=0;
2003 case EXTENDED_MODIFY_DATA_POINTER
:
2004 case EXTENDED_EXTENDED_IDENTIFY
:
2007 ADDMSGO(MESSAGE_REJECT
);
2017 static void msgi_end(struct Scsi_Host
*shpnt
)
2020 printk(WARN_LEAD
"target left before message completed (%d)\n", CMDINFO(CURRENT_SC
), MSGILEN
);
2022 if (MSGOLEN
> 0 && !(GETPORT(SSTAT1
) & BUSFREE
)) {
2023 DPRINTK(debug_msgi
, DEBUG_LEAD
"msgo pending\n", CMDINFO(CURRENT_SC
));
2024 SETPORT(SCSISIG
, P_MSGI
| SIG_ATNO
);
2032 static void msgo_init(struct Scsi_Host
*shpnt
)
2035 if((CURRENT_SC
->SCp
.phase
& syncneg
) && SYNCNEG
==2 && SYNCRATE
==0) {
2036 ADDMSGO(IDENTIFY(RECONNECT
, CURRENT_SC
->device
->lun
));
2038 printk(INFO_LEAD
"unexpected MESSAGE OUT phase; rejecting\n", CMDINFO(CURRENT_SC
));
2039 ADDMSGO(MESSAGE_REJECT
);
2043 #if defined(AHA152X_DEBUG)
2044 if(HOSTDATA(shpnt
)->debug
& debug_msgo
) {
2047 printk(DEBUG_LEAD
"messages( ", CMDINFO(CURRENT_SC
));
2048 for (i
=0; i
<MSGOLEN
; i
+=spi_print_msg(&MSGO(i
)), printk(" "))
2059 static void msgo_run(struct Scsi_Host
*shpnt
)
2062 DPRINTK(debug_msgo
, DEBUG_LEAD
"messages all sent (%d/%d)\n", CMDINFO(CURRENT_SC
), MSGO_I
, MSGOLEN
);
2064 while(MSGO_I
<MSGOLEN
) {
2065 DPRINTK(debug_msgo
, DEBUG_LEAD
"message byte %02x (%d/%d)\n", CMDINFO(CURRENT_SC
), MSGO(MSGO_I
), MSGO_I
, MSGOLEN
);
2067 if(TESTLO(SSTAT0
, SPIORDY
)) {
2068 DPRINTK(debug_msgo
, DEBUG_LEAD
"!SPIORDY\n", CMDINFO(CURRENT_SC
));
2072 if (MSGO_I
==MSGOLEN
-1) {
2073 /* Leave MESSAGE OUT after transfer */
2074 SETPORT(SSTAT1
, CLRATNO
);
2078 if (MSGO(MSGO_I
) & IDENTIFY_BASE
)
2079 CURRENT_SC
->SCp
.phase
|= identified
;
2081 if (MSGO(MSGO_I
)==ABORT
)
2082 CURRENT_SC
->SCp
.phase
|= aborted
;
2084 if (MSGO(MSGO_I
)==BUS_DEVICE_RESET
)
2085 CURRENT_SC
->SCp
.phase
|= resetted
;
2087 SETPORT(SCSIDAT
, MSGO(MSGO_I
++));
2091 static void msgo_end(struct Scsi_Host
*shpnt
)
2093 if(MSGO_I
<MSGOLEN
) {
2094 printk(ERR_LEAD
"message sent incompletely (%d/%d)\n", CMDINFO(CURRENT_SC
), MSGO_I
, MSGOLEN
);
2096 printk(INFO_LEAD
"Synchronous Data Transfer Request was rejected\n", CMDINFO(CURRENT_SC
));
2109 static void cmd_init(struct Scsi_Host
*shpnt
)
2111 if (CURRENT_SC
->SCp
.sent_command
) {
2112 printk(ERR_LEAD
"command already sent\n", CMDINFO(CURRENT_SC
));
2113 done(shpnt
, DID_ERROR
<< 16);
2117 #if defined(AHA152X_DEBUG)
2118 if (HOSTDATA(shpnt
)->debug
& debug_cmd
) {
2119 printk(DEBUG_LEAD
"cmd_init: ", CMDINFO(CURRENT_SC
));
2120 __scsi_print_command(CURRENT_SC
->cmnd
);
2131 static void cmd_run(struct Scsi_Host
*shpnt
)
2133 if(CMD_I
==CURRENT_SC
->cmd_len
) {
2134 DPRINTK(debug_cmd
, DEBUG_LEAD
"command already completely sent (%d/%d)", CMDINFO(CURRENT_SC
), CMD_I
, CURRENT_SC
->cmd_len
);
2138 while(CMD_I
<CURRENT_SC
->cmd_len
) {
2139 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
);
2141 if(TESTLO(SSTAT0
, SPIORDY
)) {
2142 DPRINTK(debug_cmd
, DEBUG_LEAD
"!SPIORDY\n", CMDINFO(CURRENT_SC
));
2146 SETPORT(SCSIDAT
, CURRENT_SC
->cmnd
[CMD_I
++]);
2150 static void cmd_end(struct Scsi_Host
*shpnt
)
2152 if(CMD_I
<CURRENT_SC
->cmd_len
)
2153 printk(ERR_LEAD
"command sent incompletely (%d/%d)\n", CMDINFO(CURRENT_SC
), CMD_I
, CURRENT_SC
->cmd_len
);
2155 CURRENT_SC
->SCp
.sent_command
++;
2162 static void status_run(struct Scsi_Host
*shpnt
)
2164 if(TESTLO(SSTAT0
,SPIORDY
)) {
2165 DPRINTK(debug_status
, DEBUG_LEAD
"!SPIORDY\n", CMDINFO(CURRENT_SC
));
2169 CURRENT_SC
->SCp
.Status
= GETPORT(SCSIDAT
);
2171 #if defined(AHA152X_DEBUG)
2172 if (HOSTDATA(shpnt
)->debug
& debug_status
) {
2173 printk(DEBUG_LEAD
"inbound status %02x ", CMDINFO(CURRENT_SC
), CURRENT_SC
->SCp
.Status
);
2174 scsi_print_status(CURRENT_SC
->SCp
.Status
);
2184 static void datai_init(struct Scsi_Host
*shpnt
)
2186 SETPORT(DMACNTRL0
, RSTFIFO
);
2187 SETPORT(DMACNTRL0
, RSTFIFO
|ENDMA
);
2189 SETPORT(SXFRCTL0
, CH1
|CLRSTCNT
);
2190 SETPORT(SXFRCTL0
, CH1
|SCSIEN
|DMAEN
);
2192 SETPORT(SIMODE0
, 0);
2193 SETPORT(SIMODE1
, ENSCSIPERR
| ENSCSIRST
| ENPHASEMIS
| ENBUSFREE
);
2196 DPRINTK(debug_datai
,
2197 DEBUG_LEAD
"datai_init: request_bufflen=%d resid=%d\n",
2198 CMDINFO(CURRENT_SC
), CURRENT_SC
->request_bufflen
, CURRENT_SC
->resid
);
2201 static void datai_run(struct Scsi_Host
*shpnt
)
2203 unsigned long the_time
;
2204 int fifodata
, data_count
;
2207 * loop while the phase persists or the fifos are not empty
2210 while(TESTLO(DMASTAT
, INTSTAT
) || TESTLO(DMASTAT
, DFIFOEMP
) || TESTLO(SSTAT2
, SEMPTY
)) {
2211 /* FIXME: maybe this should be done by setting up
2212 * STCNT to trigger ENSWRAP interrupt, instead of
2213 * polling for DFIFOFULL
2215 the_time
=jiffies
+ 100*HZ
;
2216 while(TESTLO(DMASTAT
, DFIFOFULL
|INTSTAT
) && time_before(jiffies
,the_time
))
2219 if(TESTLO(DMASTAT
, DFIFOFULL
|INTSTAT
)) {
2220 printk(ERR_LEAD
"datai timeout", CMDINFO(CURRENT_SC
));
2225 if(TESTHI(DMASTAT
, DFIFOFULL
)) {
2228 the_time
=jiffies
+ 100*HZ
;
2229 while(TESTLO(SSTAT2
, SEMPTY
) && time_before(jiffies
,the_time
))
2232 if(TESTLO(SSTAT2
, SEMPTY
)) {
2233 printk(ERR_LEAD
"datai sempty timeout", CMDINFO(CURRENT_SC
));
2238 fifodata
= GETPORT(FIFOSTAT
);
2241 if(CURRENT_SC
->SCp
.this_residual
>0) {
2242 while(fifodata
>0 && CURRENT_SC
->SCp
.this_residual
>0) {
2243 data_count
= fifodata
>CURRENT_SC
->SCp
.this_residual
?
2244 CURRENT_SC
->SCp
.this_residual
:
2246 fifodata
-= data_count
;
2248 if(data_count
& 1) {
2249 DPRINTK(debug_datai
, DEBUG_LEAD
"8bit\n", CMDINFO(CURRENT_SC
));
2250 SETPORT(DMACNTRL0
, ENDMA
|_8BIT
);
2251 *CURRENT_SC
->SCp
.ptr
++ = GETPORT(DATAPORT
);
2252 CURRENT_SC
->SCp
.this_residual
--;
2254 SETPORT(DMACNTRL0
, ENDMA
);
2257 if(data_count
> 1) {
2258 DPRINTK(debug_datai
, DEBUG_LEAD
"16bit(%d)\n", CMDINFO(CURRENT_SC
), data_count
);
2260 insw(DATAPORT
, CURRENT_SC
->SCp
.ptr
, data_count
);
2261 CURRENT_SC
->SCp
.ptr
+= 2 * data_count
;
2262 CURRENT_SC
->SCp
.this_residual
-= 2 * data_count
;
2263 DATA_LEN
+= 2 * data_count
;
2266 if(CURRENT_SC
->SCp
.this_residual
==0 && CURRENT_SC
->SCp
.buffers_residual
>0) {
2267 /* advance to next buffer */
2268 CURRENT_SC
->SCp
.buffers_residual
--;
2269 CURRENT_SC
->SCp
.buffer
++;
2270 CURRENT_SC
->SCp
.ptr
= SG_ADDRESS(CURRENT_SC
->SCp
.buffer
);
2271 CURRENT_SC
->SCp
.this_residual
= CURRENT_SC
->SCp
.buffer
->length
;
2274 } else if(fifodata
>0) {
2275 printk(ERR_LEAD
"no buffers left for %d(%d) bytes (data overrun!?)\n", CMDINFO(CURRENT_SC
), fifodata
, GETPORT(FIFOSTAT
));
2276 SETPORT(DMACNTRL0
, ENDMA
|_8BIT
);
2279 data
=GETPORT(DATAPORT
);
2280 DPRINTK(debug_datai
, DEBUG_LEAD
"data=%02x\n", CMDINFO(CURRENT_SC
), data
);
2284 SETPORT(DMACNTRL0
, ENDMA
|_8BIT
);
2288 if(TESTLO(DMASTAT
, INTSTAT
) ||
2289 TESTLO(DMASTAT
, DFIFOEMP
) ||
2290 TESTLO(SSTAT2
, SEMPTY
) ||
2291 GETPORT(FIFOSTAT
)>0) {
2293 * something went wrong, if there's something left in the fifos
2294 * or the phase didn't change
2296 printk(ERR_LEAD
"fifos should be empty and phase should have changed\n", CMDINFO(CURRENT_SC
));
2300 if(DATA_LEN
!=GETSTCNT()) {
2302 "manual transfer count differs from automatic (count=%d;stcnt=%d;diff=%d;fifostat=%d)",
2303 CMDINFO(CURRENT_SC
), DATA_LEN
, GETSTCNT(), GETSTCNT()-DATA_LEN
, GETPORT(FIFOSTAT
));
2309 static void datai_end(struct Scsi_Host
*shpnt
)
2311 CURRENT_SC
->resid
-= GETSTCNT();
2313 DPRINTK(debug_datai
,
2314 DEBUG_LEAD
"datai_end: request_bufflen=%d resid=%d stcnt=%d\n",
2315 CMDINFO(CURRENT_SC
), CURRENT_SC
->request_bufflen
, CURRENT_SC
->resid
, GETSTCNT());
2317 SETPORT(SXFRCTL0
, CH1
|CLRSTCNT
);
2318 SETPORT(DMACNTRL0
, 0);
2325 static void datao_init(struct Scsi_Host
*shpnt
)
2327 SETPORT(DMACNTRL0
, WRITE_READ
| RSTFIFO
);
2328 SETPORT(DMACNTRL0
, WRITE_READ
| ENDMA
);
2330 SETPORT(SXFRCTL0
, CH1
|CLRSTCNT
);
2331 SETPORT(SXFRCTL0
, CH1
|SCSIEN
|DMAEN
);
2333 SETPORT(SIMODE0
, 0);
2334 SETPORT(SIMODE1
, ENSCSIPERR
| ENSCSIRST
| ENPHASEMIS
| ENBUSFREE
);
2336 DATA_LEN
= CURRENT_SC
->resid
;
2338 DPRINTK(debug_datao
,
2339 DEBUG_LEAD
"datao_init: request_bufflen=%d; resid=%d\n",
2340 CMDINFO(CURRENT_SC
), CURRENT_SC
->request_bufflen
, CURRENT_SC
->resid
);
2343 static void datao_run(struct Scsi_Host
*shpnt
)
2345 unsigned long the_time
;
2348 /* until phase changes or all data sent */
2349 while(TESTLO(DMASTAT
, INTSTAT
) && CURRENT_SC
->SCp
.this_residual
>0) {
2351 if(data_count
> CURRENT_SC
->SCp
.this_residual
)
2352 data_count
=CURRENT_SC
->SCp
.this_residual
;
2354 if(TESTLO(DMASTAT
, DFIFOEMP
)) {
2355 printk(ERR_LEAD
"datao fifo not empty (%d)", CMDINFO(CURRENT_SC
), GETPORT(FIFOSTAT
));
2360 if(data_count
& 1) {
2361 SETPORT(DMACNTRL0
,WRITE_READ
|ENDMA
|_8BIT
);
2362 SETPORT(DATAPORT
, *CURRENT_SC
->SCp
.ptr
++);
2363 CURRENT_SC
->SCp
.this_residual
--;
2364 CURRENT_SC
->resid
--;
2365 SETPORT(DMACNTRL0
,WRITE_READ
|ENDMA
);
2368 if(data_count
> 1) {
2370 outsw(DATAPORT
, CURRENT_SC
->SCp
.ptr
, data_count
);
2371 CURRENT_SC
->SCp
.ptr
+= 2 * data_count
;
2372 CURRENT_SC
->SCp
.this_residual
-= 2 * data_count
;
2373 CURRENT_SC
->resid
-= 2 * data_count
;
2376 if(CURRENT_SC
->SCp
.this_residual
==0 && CURRENT_SC
->SCp
.buffers_residual
>0) {
2377 /* advance to next buffer */
2378 CURRENT_SC
->SCp
.buffers_residual
--;
2379 CURRENT_SC
->SCp
.buffer
++;
2380 CURRENT_SC
->SCp
.ptr
= SG_ADDRESS(CURRENT_SC
->SCp
.buffer
);
2381 CURRENT_SC
->SCp
.this_residual
= CURRENT_SC
->SCp
.buffer
->length
;
2384 the_time
=jiffies
+ 100*HZ
;
2385 while(TESTLO(DMASTAT
, DFIFOEMP
|INTSTAT
) && time_before(jiffies
,the_time
))
2388 if(TESTLO(DMASTAT
, DFIFOEMP
|INTSTAT
)) {
2389 printk(ERR_LEAD
"dataout timeout", CMDINFO(CURRENT_SC
));
2396 static void datao_end(struct Scsi_Host
*shpnt
)
2398 if(TESTLO(DMASTAT
, DFIFOEMP
)) {
2399 int data_count
= (DATA_LEN
- CURRENT_SC
->resid
) - GETSTCNT();
2401 DPRINTK(debug_datao
, DEBUG_LEAD
"datao: %d bytes to resend (%d written, %d transferred)\n",
2402 CMDINFO(CURRENT_SC
),
2404 DATA_LEN
-CURRENT_SC
->resid
,
2407 CURRENT_SC
->resid
+= data_count
;
2409 if(CURRENT_SC
->use_sg
) {
2410 data_count
-= CURRENT_SC
->SCp
.ptr
- SG_ADDRESS(CURRENT_SC
->SCp
.buffer
);
2411 while(data_count
>0) {
2412 CURRENT_SC
->SCp
.buffer
--;
2413 CURRENT_SC
->SCp
.buffers_residual
++;
2414 data_count
-= CURRENT_SC
->SCp
.buffer
->length
;
2416 CURRENT_SC
->SCp
.ptr
= SG_ADDRESS(CURRENT_SC
->SCp
.buffer
) - data_count
;
2417 CURRENT_SC
->SCp
.this_residual
= CURRENT_SC
->SCp
.buffer
->length
+ data_count
;
2419 CURRENT_SC
->SCp
.ptr
-= data_count
;
2420 CURRENT_SC
->SCp
.this_residual
+= data_count
;
2424 DPRINTK(debug_datao
, DEBUG_LEAD
"datao_end: request_bufflen=%d; resid=%d; stcnt=%d\n",
2425 CMDINFO(CURRENT_SC
),
2426 CURRENT_SC
->request_bufflen
,
2430 SETPORT(SXFRCTL0
, CH1
|CLRCH1
|CLRSTCNT
);
2431 SETPORT(SXFRCTL0
, CH1
);
2433 SETPORT(DMACNTRL0
, 0);
2437 * figure out what state we're in
2440 static int update_state(struct Scsi_Host
*shpnt
)
2443 unsigned int stat0
= GETPORT(SSTAT0
);
2444 unsigned int stat1
= GETPORT(SSTAT1
);
2449 if(stat1
& SCSIRSTI
) {
2452 SETPORT(SSTAT1
,SCSIRSTI
);
2453 } else if(stat0
& SELDI
&& PREVSTATE
==busfree
) {
2455 } else if(stat0
& SELDO
&& CURRENT_SC
&& (CURRENT_SC
->SCp
.phase
& selecting
)) {
2457 } else if(stat1
& SELTO
) {
2459 } else if(stat1
& BUSFREE
) {
2461 SETPORT(SSTAT1
,BUSFREE
);
2462 } else if(stat1
& SCSIPERR
) {
2464 SETPORT(SSTAT1
,SCSIPERR
);
2465 } else if(stat1
& REQINIT
) {
2466 switch(GETPORT(SCSISIG
) & P_MASK
) {
2467 case P_MSGI
: STATE
=msgi
; break;
2468 case P_MSGO
: STATE
=msgo
; break;
2469 case P_DATAO
: STATE
=datao
; break;
2470 case P_DATAI
: STATE
=datai
; break;
2471 case P_STATUS
: STATE
=status
; break;
2472 case P_CMD
: STATE
=cmd
; break;
2477 if((stat0
& SELDI
) && STATE
!=seldi
&& !dataphase
) {
2478 printk(INFO_LEAD
"reselection missed?", CMDINFO(CURRENT_SC
));
2482 if(STATE
!=PREVSTATE
) {
2483 LASTSTATE
=PREVSTATE
;
2490 * handle parity error
2492 * FIXME: in which phase?
2495 static void parerr_run(struct Scsi_Host
*shpnt
)
2497 printk(ERR_LEAD
"parity error\n", CMDINFO(CURRENT_SC
));
2498 done(shpnt
, DID_PARITY
<< 16);
2505 static void rsti_run(struct Scsi_Host
*shpnt
)
2509 printk(KERN_NOTICE
"aha152x%d: scsi reset in\n", HOSTNO
);
2511 ptr
=DISCONNECTED_SC
;
2513 Scsi_Cmnd
*next
= SCNEXT(ptr
);
2515 if (!ptr
->device
->soft_reset
) {
2516 remove_SC(&DISCONNECTED_SC
, ptr
);
2518 kfree(ptr
->host_scribble
);
2519 ptr
->host_scribble
=NULL
;
2521 ptr
->result
= DID_RESET
<< 16;
2522 ptr
->scsi_done(ptr
);
2528 if(CURRENT_SC
&& !CURRENT_SC
->device
->soft_reset
)
2529 done(shpnt
, DID_RESET
<< 16 );
2534 * bottom-half handler
2537 static void is_complete(struct Scsi_Host
*shpnt
)
2540 unsigned long flags
;
2548 if( HOSTDATA(shpnt
)->service
==0 ) {
2553 HOSTDATA(shpnt
)->service
= 0;
2555 if(HOSTDATA(shpnt
)->in_intr
) {
2557 /* aha152x_error never returns.. */
2558 aha152x_error(shpnt
, "bottom-half already running!?");
2560 HOSTDATA(shpnt
)->in_intr
++;
2563 * loop while there are interrupt conditions pending
2567 unsigned long start
= jiffies
;
2570 dataphase
=update_state(shpnt
);
2572 DPRINTK(debug_phases
, LEAD
"start %s %s(%s)\n", CMDINFO(CURRENT_SC
), states
[STATE
].name
, states
[PREVSTATE
].name
, states
[LASTSTATE
].name
);
2575 * end previous state
2578 if(PREVSTATE
!=STATE
&& states
[PREVSTATE
].end
)
2579 states
[PREVSTATE
].end(shpnt
);
2582 * disable SPIO mode if previous phase used it
2583 * and this one doesn't
2586 if(states
[PREVSTATE
].spio
&& !states
[STATE
].spio
) {
2587 SETPORT(SXFRCTL0
, CH1
);
2588 SETPORT(DMACNTRL0
, 0);
2590 CURRENT_SC
->SCp
.phase
&= ~spiordy
;
2594 * accept current dataphase phase
2598 SETPORT(SSTAT0
, REQINIT
);
2599 SETPORT(SCSISIG
, GETPORT(SCSISIG
) & P_MASK
);
2600 SETPORT(SSTAT1
, PHASECHG
);
2604 * enable SPIO mode if previous didn't use it
2608 if(!states
[PREVSTATE
].spio
&& states
[STATE
].spio
) {
2609 SETPORT(DMACNTRL0
, 0);
2610 SETPORT(SXFRCTL0
, CH1
|SPIOEN
);
2612 CURRENT_SC
->SCp
.phase
|= spiordy
;
2616 * initialize for new state
2619 if(PREVSTATE
!=STATE
&& states
[STATE
].init
)
2620 states
[STATE
].init(shpnt
);
2623 * handle current state
2626 if(states
[STATE
].run
)
2627 states
[STATE
].run(shpnt
);
2629 printk(ERR_LEAD
"unexpected state (%x)\n", CMDINFO(CURRENT_SC
), STATE
);
2632 * setup controller to interrupt on
2633 * the next expected condition and
2634 * loop if it's already there
2638 pending
=setup_expected_interrupts(shpnt
);
2639 #if defined(AHA152X_STAT)
2640 HOSTDATA(shpnt
)->count
[STATE
]++;
2641 if(PREVSTATE
!=STATE
)
2642 HOSTDATA(shpnt
)->count_trans
[STATE
]++;
2643 HOSTDATA(shpnt
)->time
[STATE
] += jiffies
-start
;
2646 DPRINTK(debug_phases
, LEAD
"end %s %s(%s)\n", CMDINFO(CURRENT_SC
), states
[STATE
].name
, states
[PREVSTATE
].name
, states
[LASTSTATE
].name
);
2650 * enable interrupts and leave bottom-half
2653 HOSTDATA(shpnt
)->in_intr
--;
2654 SETBITS(DMACNTRL0
, INTEN
);
2660 * Dump the current driver status and panic
2662 static void aha152x_error(struct Scsi_Host
*shpnt
, char *msg
)
2664 printk(KERN_EMERG
"\naha152x%d: %s\n", HOSTNO
, msg
);
2666 panic("aha152x panic\n");
2670 * Display registers of AIC-6260
2672 static void disp_ports(struct Scsi_Host
*shpnt
)
2674 #if defined(AHA152X_DEBUG)
2677 printk("\n%s: %s(%s) ",
2678 CURRENT_SC
? "busy" : "waiting",
2680 states
[PREVSTATE
].name
);
2682 s
= GETPORT(SCSISEQ
);
2683 printk("SCSISEQ( ");
2685 printk("TARGET MODE ");
2693 printk("AUTOATNO ");
2695 printk("AUTOATNI ");
2697 printk("AUTOATNP ");
2699 printk("SCSIRSTO ");
2702 printk(" SCSISIG(");
2703 s
= GETPORT(SCSISIG
);
2704 switch (s
& P_MASK
) {
2718 printk("MESSAGE OUT");
2721 printk("MESSAGE IN");
2724 printk("*invalid*");
2730 printk("INTSTAT (%s); ", TESTHI(DMASTAT
, INTSTAT
) ? "hi" : "lo");
2733 s
= GETPORT(SSTAT0
);
2751 s
= GETPORT(SSTAT1
);
2757 printk("SCSIRSTI ");
2759 printk("PHASEMIS ");
2763 printk("SCSIPERR ");
2765 printk("PHASECHG ");
2773 s
= GETPORT(SSTAT0
) & GETPORT(SIMODE0
);
2792 s
= GETPORT(SSTAT1
) & GETPORT(SIMODE1
);
2799 printk("SCSIRSTI ");
2801 printk("PHASEMIS ");
2805 printk("SCSIPERR ");
2807 printk("PHASECHG ");
2812 printk("SXFRCTL0( ");
2814 s
= GETPORT(SXFRCTL0
);
2822 printk("CLRSTCNT ");
2831 s
= GETPORT(SCSISIG
);
2844 printk("SELID (%02x), ", GETPORT(SELID
));
2846 printk("STCNT (%d), ", GETSTCNT());
2850 s
= GETPORT(SSTAT2
);
2857 printk("); SFCNT (%d); ", s
& (SFULL
| SFCNT
));
2859 s
= GETPORT(SSTAT3
);
2860 printk("SCSICNT (%d), OFFCNT(%d), ", (s
& 0xf0) >> 4, s
& 0x0f);
2863 s
= GETPORT(SSTAT4
);
2872 printk("DMACNTRL0( ");
2873 s
= GETPORT(DMACNTRL0
);
2874 printk("%s ", s
& _8BIT
? "8BIT" : "16BIT");
2875 printk("%s ", s
& DMA
? "DMA" : "PIO");
2876 printk("%s ", s
& WRITE_READ
? "WRITE" : "READ");
2887 printk("DMASTAT( ");
2888 s
= GETPORT(DMASTAT
);
2894 printk("DFIFOFULL ");
2896 printk("DFIFOEMP ");
2902 * display enabled interrupts
2904 static void disp_enintr(struct Scsi_Host
*shpnt
)
2908 printk(KERN_DEBUG
"enabled interrupts ( ");
2910 s
= GETPORT(SIMODE0
);
2916 printk("ENSELINGO ");
2922 printk("ENSPIORDY ");
2924 printk("ENDMADONE ");
2926 s
= GETPORT(SIMODE1
);
2928 printk("ENSELTIMO ");
2930 printk("ENATNTARG ");
2932 printk("ENPHASEMIS ");
2934 printk("ENBUSFREE ");
2936 printk("ENSCSIPERR ");
2938 printk("ENPHASECHG ");
2940 printk("ENREQINIT ");
2945 * Show the command data of a command
2947 static void show_command(Scsi_Cmnd
*ptr
)
2949 scmd_printk(KERN_DEBUG
, ptr
, "%p: cmnd=(", ptr
);
2951 __scsi_print_command(ptr
->cmnd
);
2953 printk(KERN_DEBUG
"); request_bufflen=%d; resid=%d; phase |",
2954 ptr
->request_bufflen
, ptr
->resid
);
2956 if (ptr
->SCp
.phase
& not_issued
)
2957 printk("not issued|");
2958 if (ptr
->SCp
.phase
& selecting
)
2959 printk("selecting|");
2960 if (ptr
->SCp
.phase
& identified
)
2961 printk("identified|");
2962 if (ptr
->SCp
.phase
& disconnected
)
2963 printk("disconnected|");
2964 if (ptr
->SCp
.phase
& completed
)
2965 printk("completed|");
2966 if (ptr
->SCp
.phase
& spiordy
)
2968 if (ptr
->SCp
.phase
& syncneg
)
2970 if (ptr
->SCp
.phase
& aborted
)
2972 if (ptr
->SCp
.phase
& resetted
)
2973 printk("resetted|");
2975 printk("; next=0x%p\n", SCNEXT(ptr
));
2977 printk("; next=(host scribble NULL)\n");
2982 * Dump the queued data
2984 static void show_queues(struct Scsi_Host
*shpnt
)
2987 unsigned long flags
;
2990 printk(KERN_DEBUG
"\nqueue status:\nissue_SC:\n");
2991 for (ptr
= ISSUE_SC
; ptr
; ptr
= SCNEXT(ptr
))
2995 printk(KERN_DEBUG
"current_SC:\n");
2997 show_command(CURRENT_SC
);
2999 printk(KERN_DEBUG
"none\n");
3001 printk(KERN_DEBUG
"disconnected_SC:\n");
3002 for (ptr
= DISCONNECTED_SC
; ptr
; ptr
= SCDATA(ptr
) ? SCNEXT(ptr
) : NULL
)
3010 #define SPRINTF(args...) pos += sprintf(pos, ## args)
3012 static int get_command(char *pos
, Scsi_Cmnd
* ptr
)
3017 SPRINTF("0x%08x: target=%d; lun=%d; cmnd=( ",
3018 (unsigned int) ptr
, ptr
->device
->id
, ptr
->device
->lun
);
3020 for (i
= 0; i
< COMMAND_SIZE(ptr
->cmnd
[0]); i
++)
3021 SPRINTF("0x%02x ", ptr
->cmnd
[i
]);
3023 SPRINTF("); resid=%d; residual=%d; buffers=%d; phase |",
3024 ptr
->resid
, ptr
->SCp
.this_residual
, ptr
->SCp
.buffers_residual
);
3026 if (ptr
->SCp
.phase
& not_issued
)
3027 SPRINTF("not issued|");
3028 if (ptr
->SCp
.phase
& selecting
)
3029 SPRINTF("selecting|");
3030 if (ptr
->SCp
.phase
& disconnected
)
3031 SPRINTF("disconnected|");
3032 if (ptr
->SCp
.phase
& aborted
)
3033 SPRINTF("aborted|");
3034 if (ptr
->SCp
.phase
& identified
)
3035 SPRINTF("identified|");
3036 if (ptr
->SCp
.phase
& completed
)
3037 SPRINTF("completed|");
3038 if (ptr
->SCp
.phase
& spiordy
)
3039 SPRINTF("spiordy|");
3040 if (ptr
->SCp
.phase
& syncneg
)
3041 SPRINTF("syncneg|");
3042 SPRINTF("; next=0x%p\n", SCNEXT(ptr
));
3044 return (pos
- start
);
3047 static int get_ports(struct Scsi_Host
*shpnt
, char *pos
)
3052 SPRINTF("\n%s: %s(%s) ", CURRENT_SC
? "on bus" : "waiting", states
[STATE
].name
, states
[PREVSTATE
].name
);
3054 s
= GETPORT(SCSISEQ
);
3055 SPRINTF("SCSISEQ( ");
3057 SPRINTF("TARGET MODE ");
3065 SPRINTF("AUTOATNO ");
3067 SPRINTF("AUTOATNI ");
3069 SPRINTF("AUTOATNP ");
3071 SPRINTF("SCSIRSTO ");
3074 SPRINTF(" SCSISIG(");
3075 s
= GETPORT(SCSISIG
);
3076 switch (s
& P_MASK
) {
3078 SPRINTF("DATA OUT");
3090 SPRINTF("MESSAGE OUT");
3093 SPRINTF("MESSAGE IN");
3096 SPRINTF("*invalid*");
3102 SPRINTF("INTSTAT (%s); ", TESTHI(DMASTAT
, INTSTAT
) ? "hi" : "lo");
3105 s
= GETPORT(SSTAT0
);
3113 SPRINTF("SELINGO ");
3119 SPRINTF("SPIORDY ");
3121 SPRINTF("DMADONE ");
3123 s
= GETPORT(SSTAT1
);
3127 SPRINTF("ATNTARG ");
3129 SPRINTF("SCSIRSTI ");
3131 SPRINTF("PHASEMIS ");
3133 SPRINTF("BUSFREE ");
3135 SPRINTF("SCSIPERR ");
3137 SPRINTF("PHASECHG ");
3139 SPRINTF("REQINIT ");
3145 s
= GETPORT(SSTAT0
) & GETPORT(SIMODE0
);
3154 SPRINTF("SELINGO ");
3160 SPRINTF("SPIORDY ");
3162 SPRINTF("DMADONE ");
3164 s
= GETPORT(SSTAT1
) & GETPORT(SIMODE1
);
3169 SPRINTF("ATNTARG ");
3171 SPRINTF("SCSIRSTI ");
3173 SPRINTF("PHASEMIS ");
3175 SPRINTF("BUSFREE ");
3177 SPRINTF("SCSIPERR ");
3179 SPRINTF("PHASECHG ");
3181 SPRINTF("REQINIT ");
3184 SPRINTF("SXFRCTL0( ");
3186 s
= GETPORT(SXFRCTL0
);
3194 SPRINTF("CLRSTCNT ");
3201 SPRINTF("SIGNAL( ");
3203 s
= GETPORT(SCSISIG
);
3216 SPRINTF("SELID(%02x), ", GETPORT(SELID
));
3218 SPRINTF("STCNT(%d), ", GETSTCNT());
3220 SPRINTF("SSTAT2( ");
3222 s
= GETPORT(SSTAT2
);
3224 SPRINTF("SOFFSET ");
3229 SPRINTF("); SFCNT (%d); ", s
& (SFULL
| SFCNT
));
3231 s
= GETPORT(SSTAT3
);
3232 SPRINTF("SCSICNT (%d), OFFCNT(%d), ", (s
& 0xf0) >> 4, s
& 0x0f);
3234 SPRINTF("SSTAT4( ");
3235 s
= GETPORT(SSTAT4
);
3237 SPRINTF("SYNCERR ");
3244 SPRINTF("DMACNTRL0( ");
3245 s
= GETPORT(DMACNTRL0
);
3246 SPRINTF("%s ", s
& _8BIT
? "8BIT" : "16BIT");
3247 SPRINTF("%s ", s
& DMA
? "DMA" : "PIO");
3248 SPRINTF("%s ", s
& WRITE_READ
? "WRITE" : "READ");
3254 SPRINTF("RSTFIFO ");
3259 SPRINTF("DMASTAT( ");
3260 s
= GETPORT(DMASTAT
);
3264 SPRINTF("WORDRDY ");
3266 SPRINTF("DFIFOFULL ");
3268 SPRINTF("DFIFOEMP ");
3271 SPRINTF("enabled interrupts( ");
3273 s
= GETPORT(SIMODE0
);
3275 SPRINTF("ENSELDO ");
3277 SPRINTF("ENSELDI ");
3279 SPRINTF("ENSELINGO ");
3281 SPRINTF("ENSWRAP ");
3283 SPRINTF("ENSDONE ");
3285 SPRINTF("ENSPIORDY ");
3287 SPRINTF("ENDMADONE ");
3289 s
= GETPORT(SIMODE1
);
3291 SPRINTF("ENSELTIMO ");
3293 SPRINTF("ENATNTARG ");
3295 SPRINTF("ENPHASEMIS ");
3297 SPRINTF("ENBUSFREE ");
3299 SPRINTF("ENSCSIPERR ");
3301 SPRINTF("ENPHASECHG ");
3303 SPRINTF("ENREQINIT ");
3306 return (pos
- start
);
3309 static int aha152x_set_info(char *buffer
, int length
, struct Scsi_Host
*shpnt
)
3311 if(!shpnt
|| !buffer
|| length
<8 || strncmp("aha152x ", buffer
, 8)!=0)
3314 #if defined(AHA152X_DEBUG)
3315 if(length
>14 && strncmp("debug ", buffer
+8, 6)==0) {
3316 int debug
= HOSTDATA(shpnt
)->debug
;
3318 HOSTDATA(shpnt
)->debug
= simple_strtoul(buffer
+14, NULL
, 0);
3320 printk(KERN_INFO
"aha152x%d: debugging options set to 0x%04x (were 0x%04x)\n", HOSTNO
, HOSTDATA(shpnt
)->debug
, debug
);
3323 #if defined(AHA152X_STAT)
3324 if(length
>13 && strncmp("reset", buffer
+8, 5)==0) {
3327 HOSTDATA(shpnt
)->total_commands
=0;
3328 HOSTDATA(shpnt
)->disconnections
=0;
3329 HOSTDATA(shpnt
)->busfree_without_any_action
=0;
3330 HOSTDATA(shpnt
)->busfree_without_old_command
=0;
3331 HOSTDATA(shpnt
)->busfree_without_new_command
=0;
3332 HOSTDATA(shpnt
)->busfree_without_done_command
=0;
3333 HOSTDATA(shpnt
)->busfree_with_check_condition
=0;
3334 for (i
= idle
; i
<maxstate
; i
++) {
3335 HOSTDATA(shpnt
)->count
[i
]=0;
3336 HOSTDATA(shpnt
)->count_trans
[i
]=0;
3337 HOSTDATA(shpnt
)->time
[i
]=0;
3340 printk(KERN_INFO
"aha152x%d: stats reseted.\n", HOSTNO
);
3353 #define SPRINTF(args...) \
3354 do { if(pos < buffer + length) pos += sprintf(pos, ## args); } while(0)
3356 static int aha152x_proc_info(struct Scsi_Host
*shpnt
, char *buffer
, char **start
,
3357 off_t offset
, int length
, int inout
)
3362 unsigned long flags
;
3365 DPRINTK(debug_procinfo
,
3366 KERN_DEBUG
"aha152x_proc_info: buffer=%p offset=%ld length=%d hostno=%d inout=%d\n",
3367 buffer
, offset
, length
, shpnt
->host_no
, inout
);
3371 return aha152x_set_info(buffer
, length
, shpnt
);
3373 SPRINTF(AHA152X_REVID
"\n");
3375 SPRINTF("ioports 0x%04lx to 0x%04lx\n",
3376 shpnt
->io_port
, shpnt
->io_port
+ shpnt
->n_io_port
- 1);
3377 SPRINTF("interrupt 0x%02x\n", shpnt
->irq
);
3378 SPRINTF("disconnection/reconnection %s\n",
3379 RECONNECT
? "enabled" : "disabled");
3380 SPRINTF("parity checking %s\n",
3381 PARITY
? "enabled" : "disabled");
3382 SPRINTF("synchronous transfers %s\n",
3383 SYNCHRONOUS
? "enabled" : "disabled");
3384 SPRINTF("%d commands currently queued\n", HOSTDATA(shpnt
)->commands
);
3387 SPRINTF("synchronously operating targets (tick=50 ns):\n");
3388 for (i
= 0; i
< 8; i
++)
3389 if (HOSTDATA(shpnt
)->syncrate
[i
] & 0x7f)
3390 SPRINTF("target %d: period %dT/%dns; req/ack offset %d\n",
3392 (((HOSTDATA(shpnt
)->syncrate
[i
] & 0x70) >> 4) + 2),
3393 (((HOSTDATA(shpnt
)->syncrate
[i
] & 0x70) >> 4) + 2) * 50,
3394 HOSTDATA(shpnt
)->syncrate
[i
] & 0x0f);
3396 #if defined(AHA152X_DEBUG)
3397 #define PDEBUG(flags,txt) \
3398 if(HOSTDATA(shpnt)->debug & flags) SPRINTF("(%s) ", txt);
3400 SPRINTF("enabled debugging options: ");
3402 PDEBUG(debug_procinfo
, "procinfo");
3403 PDEBUG(debug_queue
, "queue");
3404 PDEBUG(debug_intr
, "interrupt");
3405 PDEBUG(debug_selection
, "selection");
3406 PDEBUG(debug_msgo
, "message out");
3407 PDEBUG(debug_msgi
, "message in");
3408 PDEBUG(debug_status
, "status");
3409 PDEBUG(debug_cmd
, "command");
3410 PDEBUG(debug_datai
, "data in");
3411 PDEBUG(debug_datao
, "data out");
3412 PDEBUG(debug_eh
, "eh");
3413 PDEBUG(debug_locks
, "locks");
3414 PDEBUG(debug_phases
, "phases");
3419 SPRINTF("\nqueue status:\n");
3422 SPRINTF("not yet issued commands:\n");
3423 for (ptr
= ISSUE_SC
; ptr
; ptr
= SCNEXT(ptr
))
3424 pos
+= get_command(pos
, ptr
);
3426 SPRINTF("no not yet issued commands\n");
3430 SPRINTF("current command:\n");
3431 pos
+= get_command(pos
, CURRENT_SC
);
3433 SPRINTF("no current command\n");
3435 if (DISCONNECTED_SC
) {
3436 SPRINTF("disconnected commands:\n");
3437 for (ptr
= DISCONNECTED_SC
; ptr
; ptr
= SCNEXT(ptr
))
3438 pos
+= get_command(pos
, ptr
);
3440 SPRINTF("no disconnected commands\n");
3442 pos
+= get_ports(shpnt
, pos
);
3444 #if defined(AHA152X_STAT)
3445 SPRINTF("statistics:\n"
3446 "total commands: %d\n"
3447 "disconnections: %d\n"
3448 "busfree with check condition: %d\n"
3449 "busfree without old command: %d\n"
3450 "busfree without new command: %d\n"
3451 "busfree without done command: %d\n"
3452 "busfree without any action: %d\n"
3457 HOSTDATA(shpnt
)->total_commands
,
3458 HOSTDATA(shpnt
)->disconnections
,
3459 HOSTDATA(shpnt
)->busfree_with_check_condition
,
3460 HOSTDATA(shpnt
)->busfree_without_old_command
,
3461 HOSTDATA(shpnt
)->busfree_without_new_command
,
3462 HOSTDATA(shpnt
)->busfree_without_done_command
,
3463 HOSTDATA(shpnt
)->busfree_without_any_action
);
3464 for(i
=0; i
<maxstate
; i
++) {
3465 SPRINTF("%-10s %-12d %-12d %-12ld\n",
3467 HOSTDATA(shpnt
)->count_trans
[i
],
3468 HOSTDATA(shpnt
)->count
[i
],
3469 HOSTDATA(shpnt
)->time
[i
]);
3473 DPRINTK(debug_procinfo
, KERN_DEBUG
"aha152x_proc_info: pos=%p\n", pos
);
3475 thislength
= pos
- (buffer
+ offset
);
3476 DPRINTK(debug_procinfo
, KERN_DEBUG
"aha152x_proc_info: length=%d thislength=%d\n", length
, thislength
);
3479 DPRINTK(debug_procinfo
, KERN_DEBUG
"aha152x_proc_info: output too short\n");
3484 thislength
= thislength
<length
? thislength
: length
;
3486 DPRINTK(debug_procinfo
, KERN_DEBUG
"aha152x_proc_info: return %d\n", thislength
);
3488 *start
= buffer
+ offset
;
3489 return thislength
< length
? thislength
: length
;
3492 static struct scsi_host_template aha152x_driver_template
= {
3493 .module
= THIS_MODULE
,
3494 .name
= AHA152X_REVID
,
3495 .proc_name
= "aha152x",
3496 .proc_info
= aha152x_proc_info
,
3497 .queuecommand
= aha152x_queue
,
3498 .eh_abort_handler
= aha152x_abort
,
3499 .eh_device_reset_handler
= aha152x_device_reset
,
3500 .eh_bus_reset_handler
= aha152x_bus_reset
,
3501 .eh_host_reset_handler
= aha152x_host_reset
,
3502 .bios_param
= aha152x_biosparam
,
3505 .sg_tablesize
= SG_ALL
,
3507 .use_clustering
= DISABLE_CLUSTERING
,
3510 #if !defined(PCMCIA)
3511 static int setup_count
;
3512 static struct aha152x_setup setup
[2];
3514 /* possible i/o addresses for the AIC-6260; default first */
3515 static unsigned short ports
[] = { 0x340, 0x140 };
3517 #if !defined(SKIP_BIOSTEST)
3518 /* possible locations for the Adaptec BIOS; defaults first */
3519 static unsigned int addresses
[] =
3521 0xdc000, /* default first */
3528 0xeb800, /* VTech Platinum SMP */
3532 /* signatures for various AIC-6[23]60 based controllers.
3533 The point in detecting signatures is to avoid useless and maybe
3534 harmful probes on ports. I'm not sure that all listed boards pass
3535 auto-configuration. For those which fail the BIOS signature is
3536 obsolete, because user intervention to supply the configuration is
3537 needed anyway. May be an information whether or not the BIOS supports
3538 extended translation could be also useful here. */
3539 static struct signature
{
3540 unsigned char *signature
;
3545 { "Adaptec AHA-1520 BIOS", 0x102e, 21 },
3547 { "Adaptec AHA-1520B", 0x000b, 17 },
3548 /* Adaptec 152x rev B */
3549 { "Adaptec AHA-1520B", 0x0026, 17 },
3550 /* Iomega Jaz Jet ISA (AIC6370Q) */
3551 { "Adaptec ASW-B626 BIOS", 0x1029, 21 },
3552 /* on-board controller */
3553 { "Adaptec BIOS: ASW-B626", 0x000f, 22 },
3554 /* on-board controller */
3555 { "Adaptec ASW-B626 S2", 0x2e6c, 19 },
3556 /* on-board controller */
3557 { "Adaptec BIOS:AIC-6360", 0x000c, 21 },
3558 /* on-board controller */
3559 { "ScsiPro SP-360 BIOS", 0x2873, 19 },
3560 /* ScsiPro-Controller */
3561 { "GA-400 LOCAL BUS SCSI BIOS", 0x102e, 26 },
3562 /* Gigabyte Local-Bus-SCSI */
3563 { "Adaptec BIOS:AVA-282X", 0x000c, 21 },
3565 { "Adaptec IBM Dock II SCSI", 0x2edd, 24 },
3566 /* IBM Thinkpad Dock II */
3567 { "Adaptec BIOS:AHA-1532P", 0x001c, 22 },
3568 /* IBM Thinkpad Dock II SCSI */
3569 { "DTC3520A Host Adapter BIOS", 0x318a, 26 },
3570 /* DTC 3520A ISA SCSI */
3572 #endif /* !SKIP_BIOSTEST */
3575 * Test, if port_base is valid.
3578 static int aha152x_porttest(int io_port
)
3582 SETPORT(io_port
+ O_DMACNTRL1
, 0); /* reset stack pointer */
3583 for (i
= 0; i
< 16; i
++)
3584 SETPORT(io_port
+ O_STACK
, i
);
3586 SETPORT(io_port
+ O_DMACNTRL1
, 0); /* reset stack pointer */
3587 for (i
= 0; i
< 16 && GETPORT(io_port
+ O_STACK
) == i
; i
++)
3593 static int tc1550_porttest(int io_port
)
3597 SETPORT(io_port
+ O_TC_DMACNTRL1
, 0); /* reset stack pointer */
3598 for (i
= 0; i
< 16; i
++)
3599 SETPORT(io_port
+ O_STACK
, i
);
3601 SETPORT(io_port
+ O_TC_DMACNTRL1
, 0); /* reset stack pointer */
3602 for (i
= 0; i
< 16 && GETPORT(io_port
+ O_TC_STACK
) == i
; i
++)
3609 static int checksetup(struct aha152x_setup
*setup
)
3612 for (i
= 0; i
< ARRAY_SIZE(ports
) && (setup
->io_port
!= ports
[i
]); i
++)
3615 if (i
== ARRAY_SIZE(ports
))
3618 if ( request_region(setup
->io_port
, IO_RANGE
, "aha152x")==0 ) {
3619 printk(KERN_ERR
"aha152x: io port 0x%x busy.\n", setup
->io_port
);
3623 if( aha152x_porttest(setup
->io_port
) ) {
3625 } else if( tc1550_porttest(setup
->io_port
) ) {
3628 release_region(setup
->io_port
, IO_RANGE
);
3632 release_region(setup
->io_port
, IO_RANGE
);
3634 if ((setup
->irq
< IRQ_MIN
) || (setup
->irq
> IRQ_MAX
))
3637 if ((setup
->scsiid
< 0) || (setup
->scsiid
> 7))
3640 if ((setup
->reconnect
< 0) || (setup
->reconnect
> 1))
3643 if ((setup
->parity
< 0) || (setup
->parity
> 1))
3646 if ((setup
->synchronous
< 0) || (setup
->synchronous
> 1))
3649 if ((setup
->ext_trans
< 0) || (setup
->ext_trans
> 1))
3657 static int __init
aha152x_init(void)
3660 #if defined(AUTOCONF)
3661 aha152x_config conf
;
3664 struct pnp_dev
*dev
=NULL
, *pnpdev
[2] = {NULL
, NULL
};
3667 if ( setup_count
) {
3668 printk(KERN_INFO
"aha152x: processing commandline: ");
3670 for (i
= 0; i
<setup_count
; i
++) {
3671 if (!checksetup(&setup
[i
])) {
3672 printk(KERN_ERR
"\naha152x: %s\n", setup
[i
].conf
);
3673 printk(KERN_ERR
"aha152x: invalid line\n");
3680 if (setup_count
< ARRAY_SIZE(setup
)) {
3681 struct aha152x_setup override
= SETUP0
;
3683 if (setup_count
== 0 || (override
.io_port
!= setup
[0].io_port
)) {
3684 if (!checksetup(&override
)) {
3685 printk(KERN_ERR
"\naha152x: invalid override SETUP0={0x%x,%d,%d,%d,%d,%d,%d,%d}\n",
3691 override
.synchronous
,
3693 override
.ext_trans
);
3695 setup
[setup_count
++] = override
;
3701 if (setup_count
< ARRAY_SIZE(setup
)) {
3702 struct aha152x_setup override
= SETUP1
;
3704 if (setup_count
== 0 || (override
.io_port
!= setup
[0].io_port
)) {
3705 if (!checksetup(&override
)) {
3706 printk(KERN_ERR
"\naha152x: invalid override SETUP1={0x%x,%d,%d,%d,%d,%d,%d,%d}\n",
3712 override
.synchronous
,
3714 override
.ext_trans
);
3716 setup
[setup_count
++] = override
;
3722 if (setup_count
<ARRAY_SIZE(setup
) && (aha152x
[0]!=0 || io
[0]!=0 || irq
[0]!=0)) {
3724 setup
[setup_count
].conf
= "";
3725 setup
[setup_count
].io_port
= aha152x
[0];
3726 setup
[setup_count
].irq
= aha152x
[1];
3727 setup
[setup_count
].scsiid
= aha152x
[2];
3728 setup
[setup_count
].reconnect
= aha152x
[3];
3729 setup
[setup_count
].parity
= aha152x
[4];
3730 setup
[setup_count
].synchronous
= aha152x
[5];
3731 setup
[setup_count
].delay
= aha152x
[6];
3732 setup
[setup_count
].ext_trans
= aha152x
[7];
3733 #if defined(AHA152X_DEBUG)
3734 setup
[setup_count
].debug
= aha152x
[8];
3736 } else if(io
[0]!=0 || irq
[0]!=0) {
3737 if(io
[0]!=0) setup
[setup_count
].io_port
= io
[0];
3738 if(irq
[0]!=0) setup
[setup_count
].irq
= irq
[0];
3740 setup
[setup_count
].scsiid
= scsiid
[0];
3741 setup
[setup_count
].reconnect
= reconnect
[0];
3742 setup
[setup_count
].parity
= parity
[0];
3743 setup
[setup_count
].synchronous
= sync
[0];
3744 setup
[setup_count
].delay
= delay
[0];
3745 setup
[setup_count
].ext_trans
= exttrans
[0];
3746 #if defined(AHA152X_DEBUG)
3747 setup
[setup_count
].debug
= debug
[0];
3751 if (checksetup(&setup
[setup_count
]))
3754 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",
3755 setup
[setup_count
].io_port
,
3756 setup
[setup_count
].irq
,
3757 setup
[setup_count
].scsiid
,
3758 setup
[setup_count
].reconnect
,
3759 setup
[setup_count
].parity
,
3760 setup
[setup_count
].synchronous
,
3761 setup
[setup_count
].delay
,
3762 setup
[setup_count
].ext_trans
);
3765 if (setup_count
<ARRAY_SIZE(setup
) && (aha152x1
[0]!=0 || io
[1]!=0 || irq
[1]!=0)) {
3766 if(aha152x1
[0]!=0) {
3767 setup
[setup_count
].conf
= "";
3768 setup
[setup_count
].io_port
= aha152x1
[0];
3769 setup
[setup_count
].irq
= aha152x1
[1];
3770 setup
[setup_count
].scsiid
= aha152x1
[2];
3771 setup
[setup_count
].reconnect
= aha152x1
[3];
3772 setup
[setup_count
].parity
= aha152x1
[4];
3773 setup
[setup_count
].synchronous
= aha152x1
[5];
3774 setup
[setup_count
].delay
= aha152x1
[6];
3775 setup
[setup_count
].ext_trans
= aha152x1
[7];
3776 #if defined(AHA152X_DEBUG)
3777 setup
[setup_count
].debug
= aha152x1
[8];
3779 } else if(io
[1]!=0 || irq
[1]!=0) {
3780 if(io
[1]!=0) setup
[setup_count
].io_port
= io
[1];
3781 if(irq
[1]!=0) setup
[setup_count
].irq
= irq
[1];
3783 setup
[setup_count
].scsiid
= scsiid
[1];
3784 setup
[setup_count
].reconnect
= reconnect
[1];
3785 setup
[setup_count
].parity
= parity
[1];
3786 setup
[setup_count
].synchronous
= sync
[1];
3787 setup
[setup_count
].delay
= delay
[1];
3788 setup
[setup_count
].ext_trans
= exttrans
[1];
3789 #if defined(AHA152X_DEBUG)
3790 setup
[setup_count
].debug
= debug
[1];
3793 if (checksetup(&setup
[setup_count
]))
3796 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",
3797 setup
[setup_count
].io_port
,
3798 setup
[setup_count
].irq
,
3799 setup
[setup_count
].scsiid
,
3800 setup
[setup_count
].reconnect
,
3801 setup
[setup_count
].parity
,
3802 setup
[setup_count
].synchronous
,
3803 setup
[setup_count
].delay
,
3804 setup
[setup_count
].ext_trans
);
3809 for(i
=0; setup_count
<ARRAY_SIZE(setup
) && id_table
[i
].vendor
; i
++) {
3810 while ( setup_count
<ARRAY_SIZE(setup
) &&
3811 (dev
=pnp_find_dev(NULL
, id_table
[i
].vendor
, id_table
[i
].function
, dev
)) ) {
3812 if (pnp_device_attach(dev
) < 0)
3815 if (pnp_activate_dev(dev
) < 0) {
3816 pnp_device_detach(dev
);
3820 if (!pnp_port_valid(dev
, 0)) {
3821 pnp_device_detach(dev
);
3825 if (setup_count
==1 && pnp_port_start(dev
, 0)==setup
[0].io_port
) {
3826 pnp_device_detach(dev
);
3830 setup
[setup_count
].io_port
= pnp_port_start(dev
, 0);
3831 setup
[setup_count
].irq
= pnp_irq(dev
, 0);
3832 setup
[setup_count
].scsiid
= 7;
3833 setup
[setup_count
].reconnect
= 1;
3834 setup
[setup_count
].parity
= 1;
3835 setup
[setup_count
].synchronous
= 1;
3836 setup
[setup_count
].delay
= DELAY_DEFAULT
;
3837 setup
[setup_count
].ext_trans
= 0;
3838 #if defined(AHA152X_DEBUG)
3839 setup
[setup_count
].debug
= DEBUG_DEFAULT
;
3841 #if defined(__ISAPNP__)
3842 pnpdev
[setup_count
] = dev
;
3845 "aha152x: found ISAPnP adapter at io=0x%03x, irq=%d\n",
3846 setup
[setup_count
].io_port
, setup
[setup_count
].irq
);
3852 #if defined(AUTOCONF)
3853 if (setup_count
<ARRAY_SIZE(setup
)) {
3854 #if !defined(SKIP_BIOSTEST)
3856 for (i
= 0; i
< ARRAY_SIZE(addresses
) && !ok
; i
++) {
3857 void __iomem
*p
= ioremap(addresses
[i
], 0x4000);
3860 for (j
= 0; j
<ARRAY_SIZE(signatures
) && !ok
; j
++)
3861 ok
= check_signature(p
+ signatures
[j
].sig_offset
,
3862 signatures
[j
].signature
, signatures
[j
].sig_length
);
3865 if (!ok
&& setup_count
== 0)
3868 printk(KERN_INFO
"aha152x: BIOS test: passed, ");
3870 printk(KERN_INFO
"aha152x: ");
3871 #endif /* !SKIP_BIOSTEST */
3874 for (i
= 0; i
< ARRAY_SIZE(ports
) && setup_count
< 2; i
++) {
3875 if ((setup_count
== 1) && (setup
[0].io_port
== ports
[i
]))
3878 if ( request_region(ports
[i
], IO_RANGE
, "aha152x")==0 ) {
3879 printk(KERN_ERR
"aha152x: io port 0x%x busy.\n", ports
[i
]);
3883 if (aha152x_porttest(ports
[i
])) {
3884 setup
[setup_count
].tc1550
= 0;
3887 (GETPORT(ports
[i
] + O_PORTA
) << 8) + GETPORT(ports
[i
] + O_PORTB
);
3888 } else if (tc1550_porttest(ports
[i
])) {
3889 setup
[setup_count
].tc1550
= 1;
3892 (GETPORT(ports
[i
] + O_TC_PORTA
) << 8) + GETPORT(ports
[i
] + O_TC_PORTB
);
3894 release_region(ports
[i
], IO_RANGE
);
3898 release_region(ports
[i
], IO_RANGE
);
3901 setup
[setup_count
].io_port
= ports
[i
];
3902 setup
[setup_count
].irq
= IRQ_MIN
+ conf
.cf_irq
;
3903 setup
[setup_count
].scsiid
= conf
.cf_id
;
3904 setup
[setup_count
].reconnect
= conf
.cf_tardisc
;
3905 setup
[setup_count
].parity
= !conf
.cf_parity
;
3906 setup
[setup_count
].synchronous
= conf
.cf_syncneg
;
3907 setup
[setup_count
].delay
= DELAY_DEFAULT
;
3908 setup
[setup_count
].ext_trans
= 0;
3909 #if defined(AHA152X_DEBUG)
3910 setup
[setup_count
].debug
= DEBUG_DEFAULT
;
3917 printk("auto configuration: ok, ");
3921 printk("%d controller(s) configured\n", setup_count
);
3923 for (i
=0; i
<setup_count
; i
++) {
3924 if ( request_region(setup
[i
].io_port
, IO_RANGE
, "aha152x") ) {
3925 struct Scsi_Host
*shpnt
= aha152x_probe_one(&setup
[i
]);
3928 release_region(setup
[i
].io_port
, IO_RANGE
);
3929 #if defined(__ISAPNP__)
3930 } else if( pnpdev
[i
] ) {
3931 HOSTDATA(shpnt
)->pnpdev
=pnpdev
[i
];
3936 printk(KERN_ERR
"aha152x: io port 0x%x busy.\n", setup
[i
].io_port
);
3939 #if defined(__ISAPNP__)
3941 pnp_device_detach(pnpdev
[i
]);
3948 static void __exit
aha152x_exit(void)
3950 struct aha152x_hostdata
*hd
;
3952 list_for_each_entry(hd
, &aha152x_host_list
, host_list
) {
3953 struct Scsi_Host
*shost
= container_of((void *)hd
, struct Scsi_Host
, hostdata
);
3955 aha152x_release(shost
);
3959 module_init(aha152x_init
);
3960 module_exit(aha152x_exit
);
3962 #if !defined(MODULE)
3963 static int __init
aha152x_setup(char *str
)
3965 #if defined(AHA152X_DEBUG)
3970 get_options(str
, ARRAY_SIZE(ints
), ints
);
3972 if(setup_count
>=ARRAY_SIZE(setup
)) {
3973 printk(KERN_ERR
"aha152x: you can only configure up to two controllers\n");
3977 setup
[setup_count
].conf
= str
;
3978 setup
[setup_count
].io_port
= ints
[0] >= 1 ? ints
[1] : 0x340;
3979 setup
[setup_count
].irq
= ints
[0] >= 2 ? ints
[2] : 11;
3980 setup
[setup_count
].scsiid
= ints
[0] >= 3 ? ints
[3] : 7;
3981 setup
[setup_count
].reconnect
= ints
[0] >= 4 ? ints
[4] : 1;
3982 setup
[setup_count
].parity
= ints
[0] >= 5 ? ints
[5] : 1;
3983 setup
[setup_count
].synchronous
= ints
[0] >= 6 ? ints
[6] : 1;
3984 setup
[setup_count
].delay
= ints
[0] >= 7 ? ints
[7] : DELAY_DEFAULT
;
3985 setup
[setup_count
].ext_trans
= ints
[0] >= 8 ? ints
[8] : 0;
3986 #if defined(AHA152X_DEBUG)
3987 setup
[setup_count
].debug
= ints
[0] >= 9 ? ints
[9] : DEBUG_DEFAULT
;
3989 printk(KERN_NOTICE
"aha152x: usage: aha152x=<IOBASE>[,<IRQ>[,<SCSI ID>"
3990 "[,<RECONNECT>[,<PARITY>[,<SYNCHRONOUS>[,<DELAY>[,<EXT_TRANS>[,<DEBUG>]]]]]]]]\n");
3992 if (ints
[0] > 8) { /*}*/
3993 printk(KERN_NOTICE
"aha152x: usage: aha152x=<IOBASE>[,<IRQ>[,<SCSI ID>"
3994 "[,<RECONNECT>[,<PARITY>[,<SYNCHRONOUS>[,<DELAY>[,<EXT_TRANS>]]]]]]]\n");
4003 __setup("aha152x=", aha152x_setup
);
4006 #endif /* !PCMCIA */