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>
240 #include <linux/io.h>
241 #include <linux/blkdev.h>
242 #include <asm/system.h>
243 #include <linux/errno.h>
244 #include <linux/string.h>
245 #include <linux/wait.h>
246 #include <linux/ioport.h>
247 #include <linux/delay.h>
248 #include <linux/proc_fs.h>
249 #include <linux/interrupt.h>
250 #include <linux/init.h>
251 #include <linux/kernel.h>
252 #include <linux/isapnp.h>
253 #include <linux/spinlock.h>
254 #include <linux/workqueue.h>
255 #include <linux/list.h>
256 #include <asm/semaphore.h>
257 #include <scsi/scsicam.h>
260 #include <scsi/scsi_dbg.h>
261 #include <scsi/scsi_host.h>
262 #include <scsi/scsi_transport_spi.h>
265 static LIST_HEAD(aha152x_host_list
);
270 /* For PCMCIA cards, always use AUTOCONF */
271 #if defined(PCMCIA) || defined(MODULE)
272 #if !defined(AUTOCONF)
277 #if !defined(AUTOCONF) && !defined(SETUP0)
278 #error define AUTOCONF or SETUP0
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) \
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__; \
299 #define DO_UNLOCK(flags) \
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)"; \
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)
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
333 #define IRQ_MAX (NR_IRQS-1)
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");
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");
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) */
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
);
428 static struct scsi_host_template aha152x_driver_template
;
431 * internal states of the host
453 * current state information of the host
456 struct aha152x_hostdata
{
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 */
467 /* command that was completed */
472 #if defined(AHA152X_DEBUG)
474 /* which function has the lock */
475 int lockerl
; /* where did it get it */
477 int debug
; /* current debugging setting */
480 #if defined(AHA152X_STAT)
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
;
489 int count_trans
[maxstate
];
490 unsigned long time
[maxstate
];
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 */
507 last state different from current state */
508 enum aha152x_state state
, prevstate
, laststate
;
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
523 /* number of sent bytes of current command */
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 */
536 /* number of sent/received bytes in dataphase */
538 unsigned long io_port0
;
539 unsigned long io_port1
;
542 struct pnp_dev
*pnpdev
;
544 struct list_head host_list
;
549 * host specific command extension
552 struct aha152x_scdata
{
553 Scsi_Cmnd
*next
; /* next sc in queue */
554 struct semaphore
*sem
; /* semaphore to block on */
555 unsigned char cmd_len
;
556 unsigned char cmnd
[MAX_COMMAND_SIZE
];
557 unsigned short use_sg
;
558 unsigned request_bufflen
;
559 void *request_buffer
;
563 /* access macros for hostdata */
565 #define HOSTDATA(shpnt) ((struct aha152x_hostdata *) &shpnt->hostdata)
567 #define HOSTNO ((shpnt)->host_no)
569 #define CURRENT_SC (HOSTDATA(shpnt)->current_SC)
570 #define DONE_SC (HOSTDATA(shpnt)->done_SC)
571 #define ISSUE_SC (HOSTDATA(shpnt)->issue_SC)
572 #define DISCONNECTED_SC (HOSTDATA(shpnt)->disconnected_SC)
573 #define QLOCK (HOSTDATA(shpnt)->lock)
574 #define QLOCKER (HOSTDATA(shpnt)->locker)
575 #define QLOCKERL (HOSTDATA(shpnt)->lockerl)
577 #define STATE (HOSTDATA(shpnt)->state)
578 #define PREVSTATE (HOSTDATA(shpnt)->prevstate)
579 #define LASTSTATE (HOSTDATA(shpnt)->laststate)
581 #define RECONN_TARGET (HOSTDATA(shpnt)->target)
583 #define CMD_I (HOSTDATA(shpnt)->cmd_i)
585 #define MSGO(i) (HOSTDATA(shpnt)->msgo[i])
586 #define MSGO_I (HOSTDATA(shpnt)->msgo_i)
587 #define MSGOLEN (HOSTDATA(shpnt)->msgo_len)
588 #define ADDMSGO(x) (MSGOLEN<256 ? (void)(MSGO(MSGOLEN++)=x) : aha152x_error(shpnt,"MSGO overflow"))
590 #define MSGI(i) (HOSTDATA(shpnt)->msgi[i])
591 #define MSGILEN (HOSTDATA(shpnt)->msgi_len)
592 #define ADDMSGI(x) (MSGILEN<256 ? (void)(MSGI(MSGILEN++)=x) : aha152x_error(shpnt,"MSGI overflow"))
594 #define DATA_LEN (HOSTDATA(shpnt)->data_len)
596 #define SYNCRATE (HOSTDATA(shpnt)->syncrate[CURRENT_SC->device->id])
597 #define SYNCNEG (HOSTDATA(shpnt)->syncneg[CURRENT_SC->device->id])
599 #define DELAY (HOSTDATA(shpnt)->delay)
600 #define EXT_TRANS (HOSTDATA(shpnt)->ext_trans)
601 #define TC1550 (HOSTDATA(shpnt)->tc1550)
602 #define RECONNECT (HOSTDATA(shpnt)->reconnect)
603 #define PARITY (HOSTDATA(shpnt)->parity)
604 #define SYNCHRONOUS (HOSTDATA(shpnt)->synchronous)
606 #define HOSTIOPORT0 (HOSTDATA(shpnt)->io_port0)
607 #define HOSTIOPORT1 (HOSTDATA(shpnt)->io_port1)
609 #define SCDATA(SCpnt) ((struct aha152x_scdata *) (SCpnt)->host_scribble)
610 #define SCNEXT(SCpnt) SCDATA(SCpnt)->next
611 #define SCSEM(SCpnt) SCDATA(SCpnt)->sem
613 #define SG_ADDRESS(buffer) ((char *) (page_address((buffer)->page)+(buffer)->offset))
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
);
653 void (*init
)(struct Scsi_Host
*);
654 void (*run
)(struct Scsi_Host
*);
655 void (*end
)(struct Scsi_Host
*);
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
);
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
);
691 static inline void append_SC(Scsi_Cmnd
**SC
, Scsi_Cmnd
*new_SC
)
695 SCNEXT(new_SC
) = NULL
;
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
)
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
))
728 SCNEXT(prev
) = SCNEXT(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
;
744 prev
= ptr
, ptr
= SCNEXT(ptr
))
749 SCNEXT(prev
) = SCNEXT(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
);
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
));
775 printk(KERN_ERR
"aha152x: scsi_host_alloc failed\n");
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
;
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
;
808 SETPORT(SCSIID
, setup
->scsiid
<< 4);
809 shpnt
->this_id
= setup
->scsiid
;
811 if (setup
->reconnect
)
812 shpnt
->can_queue
= AHA152X_MAXQUEUE
;
815 printk("aha152x: resetting bus...\n");
816 SETPORT(SCSISEQ
, SCSIRSTO
);
825 "vital data: rev=%x, "
826 "io=0x%03lx (0x%03lx/0x%03lx), "
833 "extended translation=%s\n",
834 shpnt
->host_no
, setup
->tc1550
? " (tc1550 mode)" : "",
836 shpnt
->io_port
, HOSTIOPORT0
, HOSTIOPORT1
,
839 RECONNECT
? "enabled" : "disabled",
840 PARITY
? "enabled" : "disabled",
841 SYNCHRONOUS
? "enabled" : "disabled",
843 EXT_TRANS
? "enabled" : "disabled");
845 /* not expecting any interrupts */
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
);
854 HOSTDATA(shpnt
)->swint
= 0;
856 printk(KERN_INFO
"aha152x%d: trying software interrupt, ", shpnt
->host_no
);
859 SETPORT(DMACNTRL0
, SWINT
|INTEN
);
861 free_irq(shpnt
->irq
, shpnt
);
863 if (!HOSTDATA(shpnt
)->swint
) {
864 if (TESTHI(DMASTAT
, INTSTAT
)) {
870 SETPORT(DMACNTRL0
, INTEN
);
872 printk(KERN_ERR
"aha152x%d: irq %d possibly wrong. "
873 "Please verify.\n", shpnt
->host_no
, shpnt
->irq
);
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
);
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
);
894 scsi_scan_host(shpnt
);
899 list_del(&HOSTDATA(shpnt
)->host_list
);
900 scsi_host_put(shpnt
);
905 void aha152x_release(struct Scsi_Host
*shpnt
)
911 free_irq(shpnt
->irq
, shpnt
);
915 release_region(shpnt
->io_port
, IO_RANGE
);
919 if (HOSTDATA(shpnt
)->pnpdev
)
920 pnp_device_detach(HOSTDATA(shpnt
)->pnpdev
);
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
)
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
);
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
));
952 SETPORT(SIMODE1
, ENPHASEMIS
| ENSCSIRST
| ENSCSIPERR
| ENBUSFREE
);
954 DPRINTK(debug_intr
, DEBUG_LEAD
"expecting: %s %s\n",
956 DISCONNECTED_SC
? "(reselection)" : "",
957 ISSUE_SC
? "(busfree)" : "");
958 SETPORT(SIMODE0
, DISCONNECTED_SC
? ENSELDI
: 0);
959 SETPORT(SIMODE1
, ENSCSIRST
| ( (ISSUE_SC
||DONE_SC
) ? ENBUSFREE
: 0));
962 if(!HOSTDATA(shpnt
)->in_intr
)
963 SETBITS(DMACNTRL0
, INTEN
);
965 return TESTHI(DMASTAT
, INTSTAT
);
970 * Queue a command and setup interrupts for a free bus.
972 static int aha152x_internal_queue(Scsi_Cmnd
*SCpnt
, struct semaphore
*sem
, int phase
, void (*done
)(Scsi_Cmnd
*))
974 struct Scsi_Host
*shpnt
= SCpnt
->device
->host
;
977 #if defined(AHA152X_DEBUG)
978 if (HOSTDATA(shpnt
)->debug
& debug_queue
) {
979 printk(INFO_LEAD
"queue: %p; cmd_len=%d pieces=%d size=%u cmnd=",
980 CMDINFO(SCpnt
), SCpnt
, SCpnt
->cmd_len
, SCpnt
->use_sg
, SCpnt
->request_bufflen
);
981 __scsi_print_command(SCpnt
->cmnd
);
985 SCpnt
->scsi_done
= done
;
986 SCpnt
->resid
= SCpnt
->request_bufflen
;
987 SCpnt
->SCp
.phase
= not_issued
| phase
;
988 SCpnt
->SCp
.Status
= CHECK_CONDITION
;
989 SCpnt
->SCp
.Message
= 0;
990 SCpnt
->SCp
.have_data_in
= 0;
991 SCpnt
->SCp
.sent_command
= 0;
993 if(SCpnt
->SCp
.phase
& (resetting
|check_condition
)) {
994 if(SCpnt
->host_scribble
==0 || SCSEM(SCpnt
) || SCNEXT(SCpnt
)) {
995 printk(ERR_LEAD
"cannot reuse command\n", CMDINFO(SCpnt
));
999 struct aha152x_scdata
*sc
;
1001 SCpnt
->host_scribble
= kmalloc(sizeof(struct aha152x_scdata
), GFP_ATOMIC
);
1002 if(SCpnt
->host_scribble
==0) {
1003 printk(ERR_LEAD
"allocation failed\n", CMDINFO(SCpnt
));
1008 memcpy(sc
->cmnd
, SCpnt
->cmnd
, sizeof(sc
->cmnd
));
1009 sc
->request_buffer
= SCpnt
->request_buffer
;
1010 sc
->request_bufflen
= SCpnt
->request_bufflen
;
1011 sc
->use_sg
= SCpnt
->use_sg
;
1012 sc
->cmd_len
= SCpnt
->cmd_len
;
1015 SCNEXT(SCpnt
) = NULL
;
1018 /* setup scratch area
1019 SCp.ptr : buffer pointer
1020 SCp.this_residual : buffer length
1021 SCp.buffer : next buffer
1022 SCp.buffers_residual : left buffers in list
1023 SCp.phase : current state of the command */
1024 if (SCpnt
->use_sg
) {
1025 SCpnt
->SCp
.buffer
= (struct scatterlist
*) SCpnt
->request_buffer
;
1026 SCpnt
->SCp
.ptr
= SG_ADDRESS(SCpnt
->SCp
.buffer
);
1027 SCpnt
->SCp
.this_residual
= SCpnt
->SCp
.buffer
->length
;
1028 SCpnt
->SCp
.buffers_residual
= SCpnt
->use_sg
- 1;
1030 SCpnt
->SCp
.ptr
= (char *) SCpnt
->request_buffer
;
1031 SCpnt
->SCp
.this_residual
= SCpnt
->request_bufflen
;
1032 SCpnt
->SCp
.buffer
= NULL
;
1033 SCpnt
->SCp
.buffers_residual
= 0;
1038 #if defined(AHA152X_STAT)
1039 HOSTDATA(shpnt
)->total_commands
++;
1042 /* Turn led on, when this is the first command. */
1043 HOSTDATA(shpnt
)->commands
++;
1044 if (HOSTDATA(shpnt
)->commands
==1)
1047 append_SC(&ISSUE_SC
, SCpnt
);
1049 if(!HOSTDATA(shpnt
)->in_intr
)
1050 setup_expected_interrupts(shpnt
);
1061 static int aha152x_queue(Scsi_Cmnd
*SCpnt
, void (*done
)(Scsi_Cmnd
*))
1064 if(*SCpnt
->cmnd
== REQUEST_SENSE
) {
1072 return aha152x_internal_queue(SCpnt
, NULL
, 0, done
);
1080 static void reset_done(Scsi_Cmnd
*SCpnt
)
1083 struct Scsi_Host
*shpnt
= SCpnt
->host
;
1084 DPRINTK(debug_eh
, INFO_LEAD
"reset_done called\n", CMDINFO(SCpnt
));
1089 printk(KERN_ERR
"aha152x: reset_done w/o semaphore\n");
1097 static int aha152x_abort(Scsi_Cmnd
*SCpnt
)
1099 struct Scsi_Host
*shpnt
= SCpnt
->device
->host
;
1101 unsigned long flags
;
1103 #if defined(AHA152X_DEBUG)
1104 if(HOSTDATA(shpnt
)->debug
& debug_eh
) {
1105 printk(DEBUG_LEAD
"abort(%p)", CMDINFO(SCpnt
), SCpnt
);
1112 ptr
=remove_SC(&ISSUE_SC
, SCpnt
);
1115 DPRINTK(debug_eh
, DEBUG_LEAD
"not yet issued - SUCCESS\n", CMDINFO(SCpnt
));
1117 HOSTDATA(shpnt
)->commands
--;
1118 if (!HOSTDATA(shpnt
)->commands
)
1122 kfree(SCpnt
->host_scribble
);
1123 SCpnt
->host_scribble
=NULL
;
1132 * for current command: queue ABORT for message out and raise ATN
1133 * for disconnected command: pseudo SC with ABORT message or ABORT on reselection?
1137 printk(ERR_LEAD
"cannot abort running or disconnected command\n", CMDINFO(SCpnt
));
1142 static void timer_expired(unsigned long p
)
1144 Scsi_Cmnd
*SCp
= (Scsi_Cmnd
*)p
;
1145 struct semaphore
*sem
= SCSEM(SCp
);
1146 struct Scsi_Host
*shpnt
= SCp
->device
->host
;
1147 unsigned long flags
;
1149 /* remove command from issue queue */
1151 remove_SC(&ISSUE_SC
, SCp
);
1161 static int aha152x_device_reset(Scsi_Cmnd
* SCpnt
)
1163 struct Scsi_Host
*shpnt
= SCpnt
->device
->host
;
1164 DECLARE_MUTEX_LOCKED(sem
);
1165 struct timer_list timer
;
1166 int ret
, issued
, disconnected
;
1167 unsigned char old_cmd_len
= SCpnt
->cmd_len
;
1168 unsigned short old_use_sg
= SCpnt
->use_sg
;
1169 void *old_buffer
= SCpnt
->request_buffer
;
1170 unsigned old_bufflen
= SCpnt
->request_bufflen
;
1171 unsigned long flags
;
1173 #if defined(AHA152X_DEBUG)
1174 if(HOSTDATA(shpnt
)->debug
& debug_eh
) {
1175 printk(INFO_LEAD
"aha152x_device_reset(%p)", CMDINFO(SCpnt
), SCpnt
);
1180 if(CURRENT_SC
==SCpnt
) {
1181 printk(ERR_LEAD
"cannot reset current device\n", CMDINFO(SCpnt
));
1186 issued
= remove_SC(&ISSUE_SC
, SCpnt
)==0;
1187 disconnected
= issued
&& remove_SC(&DISCONNECTED_SC
, SCpnt
);
1192 SCpnt
->request_buffer
= NULL
;
1193 SCpnt
->request_bufflen
= 0;
1196 timer
.data
= (unsigned long) SCpnt
;
1197 timer
.expires
= jiffies
+ 100*HZ
; /* 10s */
1198 timer
.function
= (void (*)(unsigned long)) timer_expired
;
1200 aha152x_internal_queue(SCpnt
, &sem
, resetting
, reset_done
);
1205 SCpnt
->cmd_len
= old_cmd_len
;
1206 SCpnt
->use_sg
= old_use_sg
;
1207 SCpnt
->request_buffer
= old_buffer
;
1208 SCpnt
->request_bufflen
= old_bufflen
;
1212 if(SCpnt
->SCp
.phase
& resetted
) {
1213 HOSTDATA(shpnt
)->commands
--;
1214 if (!HOSTDATA(shpnt
)->commands
)
1216 kfree(SCpnt
->host_scribble
);
1217 SCpnt
->host_scribble
=NULL
;
1223 append_SC(&ISSUE_SC
, SCpnt
);
1224 } else if(disconnected
) {
1225 append_SC(&DISCONNECTED_SC
, SCpnt
);
1235 static void free_hard_reset_SCs(struct Scsi_Host
*shpnt
, Scsi_Cmnd
**SCs
)
1246 printk(DEBUG_LEAD
"queue corrupted at %p\n", CMDINFO(ptr
), ptr
);
1250 if (!ptr
->device
->soft_reset
) {
1251 DPRINTK(debug_eh
, DEBUG_LEAD
"disconnected command %p removed\n", CMDINFO(ptr
), ptr
);
1252 remove_SC(SCs
, ptr
);
1253 HOSTDATA(shpnt
)->commands
--;
1254 kfree(ptr
->host_scribble
);
1255 ptr
->host_scribble
=NULL
;
1266 static int aha152x_bus_reset_host(struct Scsi_Host
*shpnt
)
1268 unsigned long flags
;
1272 #if defined(AHA152X_DEBUG)
1273 if(HOSTDATA(shpnt
)->debug
& debug_eh
) {
1274 printk(KERN_DEBUG
"scsi%d: bus reset", shpnt
->host_no
);
1279 free_hard_reset_SCs(shpnt
, &ISSUE_SC
);
1280 free_hard_reset_SCs(shpnt
, &DISCONNECTED_SC
);
1282 DPRINTK(debug_eh
, KERN_DEBUG
"scsi%d: resetting bus\n", shpnt
->host_no
);
1284 SETPORT(SCSISEQ
, SCSIRSTO
);
1286 SETPORT(SCSISEQ
, 0);
1289 DPRINTK(debug_eh
, KERN_DEBUG
"scsi%d: bus resetted\n", shpnt
->host_no
);
1291 setup_expected_interrupts(shpnt
);
1292 if(HOSTDATA(shpnt
)->commands
==0)
1304 static int aha152x_bus_reset(Scsi_Cmnd
*SCpnt
)
1306 return aha152x_bus_reset_host(SCpnt
->device
->host
);
1310 * Restore default values to the AIC-6260 registers and reset the fifos
1313 static void reset_ports(struct Scsi_Host
*shpnt
)
1315 unsigned long flags
;
1317 /* disable interrupts */
1318 SETPORT(DMACNTRL0
, RSTFIFO
);
1320 SETPORT(SCSISEQ
, 0);
1322 SETPORT(SXFRCTL1
, 0);
1323 SETPORT(SCSISIG
, 0);
1326 /* clear all interrupt conditions */
1327 SETPORT(SSTAT0
, 0x7f);
1328 SETPORT(SSTAT1
, 0xef);
1330 SETPORT(SSTAT4
, SYNCERR
| FWERR
| FRERR
);
1332 SETPORT(DMACNTRL0
, 0);
1333 SETPORT(DMACNTRL1
, 0);
1335 SETPORT(BRSTCNTRL
, 0xf1);
1337 /* clear SCSI fifos and transfer count */
1338 SETPORT(SXFRCTL0
, CH1
|CLRCH1
|CLRSTCNT
);
1339 SETPORT(SXFRCTL0
, CH1
);
1342 setup_expected_interrupts(shpnt
);
1347 * Reset the host (bus and controller)
1350 int aha152x_host_reset_host(struct Scsi_Host
*shpnt
)
1352 DPRINTK(debug_eh
, KERN_DEBUG
"scsi%d: host reset\n", shpnt
->host_no
);
1354 aha152x_bus_reset_host(shpnt
);
1356 DPRINTK(debug_eh
, KERN_DEBUG
"scsi%d: resetting ports\n", shpnt
->host_no
);
1363 * Reset the host (bus and controller)
1366 static int aha152x_host_reset(Scsi_Cmnd
*SCpnt
)
1368 return aha152x_host_reset_host(SCpnt
->device
->host
);
1372 * Return the "logical geometry"
1375 static int aha152x_biosparam(struct scsi_device
*sdev
, struct block_device
*bdev
,
1376 sector_t capacity
, int *info_array
)
1378 struct Scsi_Host
*shpnt
= sdev
->host
;
1380 /* try default translation */
1383 info_array
[2] = (unsigned long)capacity
/ (64 * 32);
1385 /* for disks >1GB do some guessing */
1386 if (info_array
[2] >= 1024) {
1389 /* try to figure out the geometry from the partition table */
1390 if (scsicam_bios_param(bdev
, capacity
, info
) < 0 ||
1391 !((info
[0] == 64 && info
[1] == 32) || (info
[0] == 255 && info
[1] == 63))) {
1394 "aha152x: unable to verify geometry for disk with >1GB.\n"
1395 " using extended translation.\n");
1396 info_array
[0] = 255;
1398 info_array
[2] = (unsigned long)capacity
/ (255 * 63);
1401 "aha152x: unable to verify geometry for disk with >1GB.\n"
1402 " Using default translation. Please verify yourself.\n"
1403 " Perhaps you need to enable extended translation in the driver.\n"
1404 " See Documentation/scsi/aha152x.txt for details.\n");
1407 info_array
[0] = info
[0];
1408 info_array
[1] = info
[1];
1409 info_array
[2] = info
[2];
1411 if (info
[0] == 255 && !EXT_TRANS
) {
1413 "aha152x: current partition table is using extended translation.\n"
1414 " using it also, although it's not explicitly enabled.\n");
1423 * Internal done function
1426 static void done(struct Scsi_Host
*shpnt
, int error
)
1430 printk(ERR_LEAD
"there's already a completed command %p - will cause abort\n", CMDINFO(CURRENT_SC
), DONE_SC
);
1432 DONE_SC
= CURRENT_SC
;
1434 DONE_SC
->result
= error
;
1436 printk(KERN_ERR
"aha152x: done() called outside of command\n");
1439 static struct work_struct aha152x_tq
;
1442 * Run service completions on the card with interrupts enabled.
1445 static void run(struct work_struct
*work
)
1447 struct aha152x_hostdata
*hd
;
1449 list_for_each_entry(hd
, &aha152x_host_list
, host_list
) {
1450 struct Scsi_Host
*shost
= container_of((void *)hd
, struct Scsi_Host
, hostdata
);
1460 static irqreturn_t
intr(int irqno
, void *dev_id
)
1462 struct Scsi_Host
*shpnt
= (struct Scsi_Host
*)dev_id
;
1463 unsigned long flags
;
1464 unsigned char rev
, dmacntrl0
;
1467 printk(KERN_ERR
"aha152x: catched interrupt %d for unknown controller.\n", irqno
);
1472 * Read a couple of registers that are known to not be all 1's. If
1473 * we read all 1's (-1), that means that either:
1475 * a. The host adapter chip has gone bad, and we cannot control it,
1477 * b. The host adapter is a PCMCIA card that has been ejected
1479 * In either case, we cannot do anything with the host adapter at
1480 * this point in time. So just ignore the interrupt and return.
1481 * In the latter case, the interrupt might actually be meant for
1482 * someone else sharing this IRQ, and that driver will handle it.
1485 dmacntrl0
= GETPORT(DMACNTRL0
);
1486 if ((rev
== 0xFF) && (dmacntrl0
== 0xFF))
1489 if( TESTLO(DMASTAT
, INTSTAT
) )
1492 /* no more interrupts from the controller, while we're busy.
1493 INTEN is restored by the BH handler */
1494 CLRBITS(DMACNTRL0
, INTEN
);
1497 if( HOSTDATA(shpnt
)->service
==0 ) {
1498 HOSTDATA(shpnt
)->service
=1;
1500 /* Poke the BH handler */
1501 INIT_WORK(&aha152x_tq
, run
);
1502 schedule_work(&aha152x_tq
);
1511 * - handle completition/disconnection/error of current command
1512 * - start selection for next command (if any)
1514 static void busfree_run(struct Scsi_Host
*shpnt
)
1516 unsigned long flags
;
1517 #if defined(AHA152X_STAT)
1521 SETPORT(SXFRCTL0
, CH1
|CLRCH1
|CLRSTCNT
);
1522 SETPORT(SXFRCTL0
, CH1
);
1524 SETPORT(SSTAT1
, CLRBUSFREE
);
1527 #if defined(AHA152X_STAT)
1530 CURRENT_SC
->SCp
.phase
&= ~syncneg
;
1532 if(CURRENT_SC
->SCp
.phase
& completed
) {
1533 /* target sent COMMAND COMPLETE */
1534 done(shpnt
, (CURRENT_SC
->SCp
.Status
& 0xff) | ((CURRENT_SC
->SCp
.Message
& 0xff) << 8) | (DID_OK
<< 16));
1536 } else if(CURRENT_SC
->SCp
.phase
& aborted
) {
1537 DPRINTK(debug_eh
, DEBUG_LEAD
"ABORT sent\n", CMDINFO(CURRENT_SC
));
1538 done(shpnt
, (CURRENT_SC
->SCp
.Status
& 0xff) | ((CURRENT_SC
->SCp
.Message
& 0xff) << 8) | (DID_ABORT
<< 16));
1540 } else if(CURRENT_SC
->SCp
.phase
& resetted
) {
1541 DPRINTK(debug_eh
, DEBUG_LEAD
"BUS DEVICE RESET sent\n", CMDINFO(CURRENT_SC
));
1542 done(shpnt
, (CURRENT_SC
->SCp
.Status
& 0xff) | ((CURRENT_SC
->SCp
.Message
& 0xff) << 8) | (DID_RESET
<< 16));
1544 } else if(CURRENT_SC
->SCp
.phase
& disconnected
) {
1545 /* target sent DISCONNECT */
1546 DPRINTK(debug_selection
, DEBUG_LEAD
"target disconnected at %d/%d\n",
1547 CMDINFO(CURRENT_SC
),
1549 CURRENT_SC
->request_bufflen
);
1550 #if defined(AHA152X_STAT)
1551 HOSTDATA(shpnt
)->disconnections
++;
1553 append_SC(&DISCONNECTED_SC
, CURRENT_SC
);
1554 CURRENT_SC
->SCp
.phase
|= 1 << 16;
1558 done(shpnt
, DID_ERROR
<< 16);
1560 #if defined(AHA152X_STAT)
1562 HOSTDATA(shpnt
)->busfree_without_old_command
++;
1569 #if defined(AHA152X_STAT)
1573 if(DONE_SC
->SCp
.phase
& check_condition
) {
1574 struct scsi_cmnd
*cmd
= HOSTDATA(shpnt
)->done_SC
;
1575 struct aha152x_scdata
*sc
= SCDATA(cmd
);
1578 if(HOSTDATA(shpnt
)->debug
& debug_eh
) {
1579 printk(ERR_LEAD
"received sense: ", CMDINFO(DONE_SC
));
1580 scsi_print_sense("bh", DONE_SC
);
1584 /* restore old command */
1585 memcpy(cmd
->cmnd
, sc
->cmnd
, sizeof(sc
->cmnd
));
1586 cmd
->request_buffer
= sc
->request_buffer
;
1587 cmd
->request_bufflen
= sc
->request_bufflen
;
1588 cmd
->use_sg
= sc
->use_sg
;
1589 cmd
->cmd_len
= sc
->cmd_len
;
1591 cmd
->SCp
.Status
= 0x02;
1593 HOSTDATA(shpnt
)->commands
--;
1594 if (!HOSTDATA(shpnt
)->commands
)
1595 SETPORT(PORTA
, 0); /* turn led off */
1596 } else if(DONE_SC
->SCp
.Status
==0x02) {
1597 #if defined(AHA152X_STAT)
1598 HOSTDATA(shpnt
)->busfree_with_check_condition
++;
1601 DPRINTK(debug_eh
, ERR_LEAD
"CHECK CONDITION found\n", CMDINFO(DONE_SC
));
1604 if(!(DONE_SC
->SCp
.Status
& not_issued
)) {
1605 Scsi_Cmnd
*ptr
= DONE_SC
;
1608 DPRINTK(debug_eh
, ERR_LEAD
"requesting sense\n", CMDINFO(ptr
));
1611 ptr
->cmnd
[0] = REQUEST_SENSE
;
1615 ptr
->cmnd
[4] = sizeof(ptr
->sense_buffer
);
1619 ptr
->request_buffer
= ptr
->sense_buffer
;
1620 ptr
->request_bufflen
= sizeof(ptr
->sense_buffer
);
1623 aha152x_internal_queue(ptr
, NULL
, check_condition
, ptr
->scsi_done
);
1627 DPRINTK(debug_eh
, ERR_LEAD
"command not issued - CHECK CONDITION ignored\n", CMDINFO(DONE_SC
));
1632 if(DONE_SC
&& DONE_SC
->scsi_done
) {
1633 #if defined(AHA152X_DEBUG)
1634 int hostno
=DONE_SC
->device
->host
->host_no
;
1635 int id
=DONE_SC
->device
->id
& 0xf;
1636 int lun
=DONE_SC
->device
->lun
& 0x7;
1638 Scsi_Cmnd
*ptr
= DONE_SC
;
1641 /* turn led off, when no commands are in the driver */
1642 HOSTDATA(shpnt
)->commands
--;
1643 if (!HOSTDATA(shpnt
)->commands
)
1644 SETPORT(PORTA
, 0); /* turn led off */
1646 if(ptr
->scsi_done
!= reset_done
) {
1647 kfree(ptr
->host_scribble
);
1648 ptr
->host_scribble
=NULL
;
1652 DPRINTK(debug_done
, DEBUG_LEAD
"calling scsi_done(%p)\n", hostno
, id
, lun
, ptr
);
1653 ptr
->scsi_done(ptr
);
1654 DPRINTK(debug_done
, DEBUG_LEAD
"scsi_done(%p) returned\n", hostno
, id
, lun
, ptr
);
1659 #if defined(AHA152X_STAT)
1661 HOSTDATA(shpnt
)->busfree_without_done_command
++;
1666 CURRENT_SC
= remove_first_SC(&ISSUE_SC
);
1671 #if defined(AHA152X_STAT)
1674 CURRENT_SC
->SCp
.phase
|= selecting
;
1676 DPRINTK(debug_selection
, DEBUG_LEAD
"selecting target\n", CMDINFO(CURRENT_SC
));
1678 /* clear selection timeout */
1679 SETPORT(SSTAT1
, SELTO
);
1681 SETPORT(SCSIID
, (shpnt
->this_id
<< OID_
) | CURRENT_SC
->device
->id
);
1682 SETPORT(SXFRCTL1
, (PARITY
? ENSPCHK
: 0 ) | ENSTIMER
);
1683 SETPORT(SCSISEQ
, ENSELO
| ENAUTOATNO
| (DISCONNECTED_SC
? ENRESELI
: 0));
1685 #if defined(AHA152X_STAT)
1686 HOSTDATA(shpnt
)->busfree_without_new_command
++;
1688 SETPORT(SCSISEQ
, DISCONNECTED_SC
? ENRESELI
: 0);
1691 #if defined(AHA152X_STAT)
1693 HOSTDATA(shpnt
)->busfree_without_any_action
++;
1698 * Selection done (OUT)
1699 * - queue IDENTIFY message and SDTR to selected target for message out
1700 * (ATN asserted automagically via ENAUTOATNO in busfree())
1702 static void seldo_run(struct Scsi_Host
*shpnt
)
1704 SETPORT(SCSISIG
, 0);
1705 SETPORT(SSTAT1
, CLRBUSFREE
);
1706 SETPORT(SSTAT1
, CLRPHASECHG
);
1708 CURRENT_SC
->SCp
.phase
&= ~(selecting
|not_issued
);
1710 SETPORT(SCSISEQ
, 0);
1712 if (TESTLO(SSTAT0
, SELDO
)) {
1713 printk(ERR_LEAD
"aha152x: passing bus free condition\n", CMDINFO(CURRENT_SC
));
1714 done(shpnt
, DID_NO_CONNECT
<< 16);
1718 SETPORT(SSTAT0
, CLRSELDO
);
1720 ADDMSGO(IDENTIFY(RECONNECT
, CURRENT_SC
->device
->lun
));
1722 if (CURRENT_SC
->SCp
.phase
& aborting
) {
1724 } else if (CURRENT_SC
->SCp
.phase
& resetting
) {
1725 ADDMSGO(BUS_DEVICE_RESET
);
1726 } else if (SYNCNEG
==0 && SYNCHRONOUS
) {
1727 CURRENT_SC
->SCp
.phase
|= syncneg
;
1728 MSGOLEN
+= spi_populate_sync_msg(&MSGO(MSGOLEN
), 50, 8);
1729 SYNCNEG
=1; /* negotiation in progress */
1737 * - return command to mid-level with failure cause
1740 static void selto_run(struct Scsi_Host
*shpnt
)
1742 SETPORT(SCSISEQ
, 0);
1743 SETPORT(SSTAT1
, CLRSELTIMO
);
1745 DPRINTK(debug_selection
, DEBUG_LEAD
"selection timeout\n", CMDINFO(CURRENT_SC
));
1748 DPRINTK(debug_selection
, DEBUG_LEAD
"!CURRENT_SC\n", CMDINFO(CURRENT_SC
));
1752 CURRENT_SC
->SCp
.phase
&= ~selecting
;
1754 if (CURRENT_SC
->SCp
.phase
& aborted
) {
1755 DPRINTK(debug_selection
, DEBUG_LEAD
"aborted\n", CMDINFO(CURRENT_SC
));
1756 done(shpnt
, DID_ABORT
<< 16);
1757 } else if (TESTLO(SSTAT0
, SELINGO
)) {
1758 DPRINTK(debug_selection
, DEBUG_LEAD
"arbitration not won\n", CMDINFO(CURRENT_SC
));
1759 done(shpnt
, DID_BUS_BUSY
<< 16);
1761 /* ARBITRATION won, but SELECTION failed */
1762 DPRINTK(debug_selection
, DEBUG_LEAD
"selection failed\n", CMDINFO(CURRENT_SC
));
1763 done(shpnt
, DID_NO_CONNECT
<< 16);
1769 * - put current command back to issue queue
1770 * (reconnection of a disconnected nexus instead
1771 * of successful selection out)
1774 static void seldi_run(struct Scsi_Host
*shpnt
)
1778 unsigned long flags
;
1780 SETPORT(SCSISIG
, 0);
1781 SETPORT(SSTAT0
, CLRSELDI
);
1782 SETPORT(SSTAT1
, CLRBUSFREE
);
1783 SETPORT(SSTAT1
, CLRPHASECHG
);
1786 if(!(CURRENT_SC
->SCp
.phase
& not_issued
))
1787 printk(ERR_LEAD
"command should not have been issued yet\n", CMDINFO(CURRENT_SC
));
1789 DPRINTK(debug_selection
, ERR_LEAD
"command requeued - reselection\n", CMDINFO(CURRENT_SC
));
1792 append_SC(&ISSUE_SC
, CURRENT_SC
);
1798 if(!DISCONNECTED_SC
) {
1799 DPRINTK(debug_selection
, DEBUG_LEAD
"unexpected SELDI ", CMDINFO(CURRENT_SC
));
1805 selid
= GETPORT(SELID
) & ~(1 << shpnt
->this_id
);
1808 printk("aha152x%d: target id unknown (%02x)\n", HOSTNO
, selid
);
1812 for(target
=7; !(selid
& (1 << target
)); target
--)
1815 if(selid
& ~(1 << target
)) {
1816 printk("aha152x%d: multiple targets reconnected (%02x)\n",
1821 SETPORT(SCSIID
, (shpnt
->this_id
<< OID_
) | target
);
1822 SETPORT(SCSISEQ
, 0);
1824 SETRATE(HOSTDATA(shpnt
)->syncrate
[target
]);
1826 RECONN_TARGET
=target
;
1827 DPRINTK(debug_selection
, DEBUG_LEAD
"target %d reselected (%02x).\n", CMDINFO(CURRENT_SC
), target
, selid
);
1832 * - handle initial message after reconnection to identify
1833 * reconnecting nexus
1834 * - queue command on DISCONNECTED_SC on DISCONNECT message
1835 * - set completed flag on COMMAND COMPLETE
1836 * (other completition code moved to busfree_run)
1837 * - handle response to SDTR
1838 * - clear synchronous transfer agreements on BUS RESET
1840 * FIXME: what about SAVE POINTERS, RESTORE POINTERS?
1843 static void msgi_run(struct Scsi_Host
*shpnt
)
1846 int sstat1
= GETPORT(SSTAT1
);
1848 if(sstat1
& (PHASECHG
|PHASEMIS
|BUSFREE
) || !(sstat1
& REQINIT
))
1851 if(TESTLO(SSTAT0
,SPIORDY
)) {
1852 DPRINTK(debug_msgi
, DEBUG_LEAD
"!SPIORDY\n", CMDINFO(CURRENT_SC
));
1856 ADDMSGI(GETPORT(SCSIDAT
));
1858 #if defined(AHA152X_DEBUG)
1859 if (HOSTDATA(shpnt
)->debug
& debug_msgi
) {
1860 printk(INFO_LEAD
"inbound message %02x ", CMDINFO(CURRENT_SC
), MSGI(0));
1861 spi_print_msg(&MSGI(0));
1867 if(LASTSTATE
!=seldi
) {
1868 printk(KERN_ERR
"aha152x%d: message in w/o current command not after reselection\n", HOSTNO
);
1872 * Handle reselection
1874 if(!(MSGI(0) & IDENTIFY_BASE
)) {
1875 printk(KERN_ERR
"aha152x%d: target didn't identify after reselection\n", HOSTNO
);
1879 CURRENT_SC
= remove_lun_SC(&DISCONNECTED_SC
, RECONN_TARGET
, MSGI(0) & 0x3f);
1883 printk(KERN_ERR
"aha152x%d: no disconnected command for target %d/%d\n", HOSTNO
, RECONN_TARGET
, MSGI(0) & 0x3f);
1887 DPRINTK(debug_msgi
, DEBUG_LEAD
"target reconnected\n", CMDINFO(CURRENT_SC
));
1889 CURRENT_SC
->SCp
.Message
= MSGI(0);
1890 CURRENT_SC
->SCp
.phase
&= ~disconnected
;
1894 /* next message if any */
1898 CURRENT_SC
->SCp
.Message
= MSGI(0);
1903 printk(WARN_LEAD
"target was not allowed to disconnect\n", CMDINFO(CURRENT_SC
));
1905 CURRENT_SC
->SCp
.phase
|= disconnected
;
1908 case COMMAND_COMPLETE
:
1909 if(CURRENT_SC
->SCp
.phase
& completed
)
1910 DPRINTK(debug_msgi
, DEBUG_LEAD
"again COMMAND COMPLETE\n", CMDINFO(CURRENT_SC
));
1912 CURRENT_SC
->SCp
.phase
|= completed
;
1915 case MESSAGE_REJECT
:
1917 printk(INFO_LEAD
"Synchronous Data Transfer Request was rejected\n", CMDINFO(CURRENT_SC
));
1918 SYNCNEG
=2; /* negotiation completed */
1920 printk(INFO_LEAD
"inbound message (MESSAGE REJECT)\n", CMDINFO(CURRENT_SC
));
1926 case RESTORE_POINTERS
:
1929 case EXTENDED_MESSAGE
:
1930 if(MSGILEN
<2 || MSGILEN
<MSGI(1)+2) {
1931 /* not yet completed */
1941 printk(ERR_LEAD
"SDTR message length!=3\n", CMDINFO(CURRENT_SC
));
1945 if (!HOSTDATA(shpnt
)->synchronous
)
1948 printk(INFO_LEAD
, CMDINFO(CURRENT_SC
));
1949 spi_print_msg(&MSGI(0));
1952 ticks
= (MSGI(3) * 4 + 49) / 50;
1955 /* negotiation in progress */
1956 if (ticks
> 9 || MSGI(4) < 1 || MSGI(4) > 8) {
1957 ADDMSGO(MESSAGE_REJECT
);
1958 printk(INFO_LEAD
"received Synchronous Data Transfer Request invalid - rejected\n", CMDINFO(CURRENT_SC
));
1962 SYNCRATE
|= ((ticks
- 2) << 4) + MSGI(4);
1963 } else if (ticks
<= 9 && MSGI(4) >= 1) {
1964 ADDMSGO(EXTENDED_MESSAGE
);
1966 ADDMSGO(EXTENDED_SDTR
);
1978 SYNCRATE
|= ((ticks
- 2) << 4) + MSGI(4);
1980 /* requested SDTR is too slow, do it asynchronously */
1981 printk(INFO_LEAD
"Synchronous Data Transfer Request too slow - Rejecting\n", CMDINFO(CURRENT_SC
));
1982 ADDMSGO(MESSAGE_REJECT
);
1985 SYNCNEG
=2; /* negotiation completed */
1990 case BUS_DEVICE_RESET
:
1994 for(i
=0; i
<8; i
++) {
1995 HOSTDATA(shpnt
)->syncrate
[i
]=0;
1996 HOSTDATA(shpnt
)->syncneg
[i
]=0;
2002 case EXTENDED_MODIFY_DATA_POINTER
:
2003 case EXTENDED_EXTENDED_IDENTIFY
:
2006 ADDMSGO(MESSAGE_REJECT
);
2016 static void msgi_end(struct Scsi_Host
*shpnt
)
2019 printk(WARN_LEAD
"target left before message completed (%d)\n", CMDINFO(CURRENT_SC
), MSGILEN
);
2021 if (MSGOLEN
> 0 && !(GETPORT(SSTAT1
) & BUSFREE
)) {
2022 DPRINTK(debug_msgi
, DEBUG_LEAD
"msgo pending\n", CMDINFO(CURRENT_SC
));
2023 SETPORT(SCSISIG
, P_MSGI
| SIG_ATNO
);
2031 static void msgo_init(struct Scsi_Host
*shpnt
)
2034 if((CURRENT_SC
->SCp
.phase
& syncneg
) && SYNCNEG
==2 && SYNCRATE
==0) {
2035 ADDMSGO(IDENTIFY(RECONNECT
, CURRENT_SC
->device
->lun
));
2037 printk(INFO_LEAD
"unexpected MESSAGE OUT phase; rejecting\n", CMDINFO(CURRENT_SC
));
2038 ADDMSGO(MESSAGE_REJECT
);
2042 #if defined(AHA152X_DEBUG)
2043 if(HOSTDATA(shpnt
)->debug
& debug_msgo
) {
2046 printk(DEBUG_LEAD
"messages( ", CMDINFO(CURRENT_SC
));
2047 for (i
=0; i
<MSGOLEN
; i
+=spi_print_msg(&MSGO(i
)), printk(" "))
2058 static void msgo_run(struct Scsi_Host
*shpnt
)
2061 DPRINTK(debug_msgo
, DEBUG_LEAD
"messages all sent (%d/%d)\n", CMDINFO(CURRENT_SC
), MSGO_I
, MSGOLEN
);
2063 while(MSGO_I
<MSGOLEN
) {
2064 DPRINTK(debug_msgo
, DEBUG_LEAD
"message byte %02x (%d/%d)\n", CMDINFO(CURRENT_SC
), MSGO(MSGO_I
), MSGO_I
, MSGOLEN
);
2066 if(TESTLO(SSTAT0
, SPIORDY
)) {
2067 DPRINTK(debug_msgo
, DEBUG_LEAD
"!SPIORDY\n", CMDINFO(CURRENT_SC
));
2071 if (MSGO_I
==MSGOLEN
-1) {
2072 /* Leave MESSAGE OUT after transfer */
2073 SETPORT(SSTAT1
, CLRATNO
);
2077 if (MSGO(MSGO_I
) & IDENTIFY_BASE
)
2078 CURRENT_SC
->SCp
.phase
|= identified
;
2080 if (MSGO(MSGO_I
)==ABORT
)
2081 CURRENT_SC
->SCp
.phase
|= aborted
;
2083 if (MSGO(MSGO_I
)==BUS_DEVICE_RESET
)
2084 CURRENT_SC
->SCp
.phase
|= resetted
;
2086 SETPORT(SCSIDAT
, MSGO(MSGO_I
++));
2090 static void msgo_end(struct Scsi_Host
*shpnt
)
2092 if(MSGO_I
<MSGOLEN
) {
2093 printk(ERR_LEAD
"message sent incompletely (%d/%d)\n", CMDINFO(CURRENT_SC
), MSGO_I
, MSGOLEN
);
2095 printk(INFO_LEAD
"Synchronous Data Transfer Request was rejected\n", CMDINFO(CURRENT_SC
));
2108 static void cmd_init(struct Scsi_Host
*shpnt
)
2110 if (CURRENT_SC
->SCp
.sent_command
) {
2111 printk(ERR_LEAD
"command already sent\n", CMDINFO(CURRENT_SC
));
2112 done(shpnt
, DID_ERROR
<< 16);
2116 #if defined(AHA152X_DEBUG)
2117 if (HOSTDATA(shpnt
)->debug
& debug_cmd
) {
2118 printk(DEBUG_LEAD
"cmd_init: ", CMDINFO(CURRENT_SC
));
2119 __scsi_print_command(CURRENT_SC
->cmnd
);
2130 static void cmd_run(struct Scsi_Host
*shpnt
)
2132 if(CMD_I
==CURRENT_SC
->cmd_len
) {
2133 DPRINTK(debug_cmd
, DEBUG_LEAD
"command already completely sent (%d/%d)", CMDINFO(CURRENT_SC
), CMD_I
, CURRENT_SC
->cmd_len
);
2137 while(CMD_I
<CURRENT_SC
->cmd_len
) {
2138 DPRINTK(debug_cmd
, DEBUG_LEAD
"command byte %02x (%d/%d)\n", CMDINFO(CURRENT_SC
), CURRENT_SC
->cmnd
[CMD_I
], CMD_I
, CURRENT_SC
->cmd_len
);
2140 if(TESTLO(SSTAT0
, SPIORDY
)) {
2141 DPRINTK(debug_cmd
, DEBUG_LEAD
"!SPIORDY\n", CMDINFO(CURRENT_SC
));
2145 SETPORT(SCSIDAT
, CURRENT_SC
->cmnd
[CMD_I
++]);
2149 static void cmd_end(struct Scsi_Host
*shpnt
)
2151 if(CMD_I
<CURRENT_SC
->cmd_len
)
2152 printk(ERR_LEAD
"command sent incompletely (%d/%d)\n", CMDINFO(CURRENT_SC
), CMD_I
, CURRENT_SC
->cmd_len
);
2154 CURRENT_SC
->SCp
.sent_command
++;
2161 static void status_run(struct Scsi_Host
*shpnt
)
2163 if(TESTLO(SSTAT0
,SPIORDY
)) {
2164 DPRINTK(debug_status
, DEBUG_LEAD
"!SPIORDY\n", CMDINFO(CURRENT_SC
));
2168 CURRENT_SC
->SCp
.Status
= GETPORT(SCSIDAT
);
2170 #if defined(AHA152X_DEBUG)
2171 if (HOSTDATA(shpnt
)->debug
& debug_status
) {
2172 printk(DEBUG_LEAD
"inbound status %02x ", CMDINFO(CURRENT_SC
), CURRENT_SC
->SCp
.Status
);
2173 scsi_print_status(CURRENT_SC
->SCp
.Status
);
2183 static void datai_init(struct Scsi_Host
*shpnt
)
2185 SETPORT(DMACNTRL0
, RSTFIFO
);
2186 SETPORT(DMACNTRL0
, RSTFIFO
|ENDMA
);
2188 SETPORT(SXFRCTL0
, CH1
|CLRSTCNT
);
2189 SETPORT(SXFRCTL0
, CH1
|SCSIEN
|DMAEN
);
2191 SETPORT(SIMODE0
, 0);
2192 SETPORT(SIMODE1
, ENSCSIPERR
| ENSCSIRST
| ENPHASEMIS
| ENBUSFREE
);
2195 DPRINTK(debug_datai
,
2196 DEBUG_LEAD
"datai_init: request_bufflen=%d resid=%d\n",
2197 CMDINFO(CURRENT_SC
), CURRENT_SC
->request_bufflen
, CURRENT_SC
->resid
);
2200 static void datai_run(struct Scsi_Host
*shpnt
)
2202 unsigned long the_time
;
2203 int fifodata
, data_count
;
2206 * loop while the phase persists or the fifos are not empty
2209 while(TESTLO(DMASTAT
, INTSTAT
) || TESTLO(DMASTAT
, DFIFOEMP
) || TESTLO(SSTAT2
, SEMPTY
)) {
2210 /* FIXME: maybe this should be done by setting up
2211 * STCNT to trigger ENSWRAP interrupt, instead of
2212 * polling for DFIFOFULL
2214 the_time
=jiffies
+ 100*HZ
;
2215 while(TESTLO(DMASTAT
, DFIFOFULL
|INTSTAT
) && time_before(jiffies
,the_time
))
2218 if(TESTLO(DMASTAT
, DFIFOFULL
|INTSTAT
)) {
2219 printk(ERR_LEAD
"datai timeout", CMDINFO(CURRENT_SC
));
2224 if(TESTHI(DMASTAT
, DFIFOFULL
)) {
2227 the_time
=jiffies
+ 100*HZ
;
2228 while(TESTLO(SSTAT2
, SEMPTY
) && time_before(jiffies
,the_time
))
2231 if(TESTLO(SSTAT2
, SEMPTY
)) {
2232 printk(ERR_LEAD
"datai sempty timeout", CMDINFO(CURRENT_SC
));
2237 fifodata
= GETPORT(FIFOSTAT
);
2240 if(CURRENT_SC
->SCp
.this_residual
>0) {
2241 while(fifodata
>0 && CURRENT_SC
->SCp
.this_residual
>0) {
2242 data_count
= fifodata
>CURRENT_SC
->SCp
.this_residual
?
2243 CURRENT_SC
->SCp
.this_residual
:
2245 fifodata
-= data_count
;
2247 if(data_count
& 1) {
2248 DPRINTK(debug_datai
, DEBUG_LEAD
"8bit\n", CMDINFO(CURRENT_SC
));
2249 SETPORT(DMACNTRL0
, ENDMA
|_8BIT
);
2250 *CURRENT_SC
->SCp
.ptr
++ = GETPORT(DATAPORT
);
2251 CURRENT_SC
->SCp
.this_residual
--;
2253 SETPORT(DMACNTRL0
, ENDMA
);
2256 if(data_count
> 1) {
2257 DPRINTK(debug_datai
, DEBUG_LEAD
"16bit(%d)\n", CMDINFO(CURRENT_SC
), data_count
);
2259 insw(DATAPORT
, CURRENT_SC
->SCp
.ptr
, data_count
);
2260 CURRENT_SC
->SCp
.ptr
+= 2 * data_count
;
2261 CURRENT_SC
->SCp
.this_residual
-= 2 * data_count
;
2262 DATA_LEN
+= 2 * data_count
;
2265 if(CURRENT_SC
->SCp
.this_residual
==0 && CURRENT_SC
->SCp
.buffers_residual
>0) {
2266 /* advance to next buffer */
2267 CURRENT_SC
->SCp
.buffers_residual
--;
2268 CURRENT_SC
->SCp
.buffer
++;
2269 CURRENT_SC
->SCp
.ptr
= SG_ADDRESS(CURRENT_SC
->SCp
.buffer
);
2270 CURRENT_SC
->SCp
.this_residual
= CURRENT_SC
->SCp
.buffer
->length
;
2273 } else if(fifodata
>0) {
2274 printk(ERR_LEAD
"no buffers left for %d(%d) bytes (data overrun!?)\n", CMDINFO(CURRENT_SC
), fifodata
, GETPORT(FIFOSTAT
));
2275 SETPORT(DMACNTRL0
, ENDMA
|_8BIT
);
2278 data
=GETPORT(DATAPORT
);
2279 DPRINTK(debug_datai
, DEBUG_LEAD
"data=%02x\n", CMDINFO(CURRENT_SC
), data
);
2283 SETPORT(DMACNTRL0
, ENDMA
|_8BIT
);
2287 if(TESTLO(DMASTAT
, INTSTAT
) ||
2288 TESTLO(DMASTAT
, DFIFOEMP
) ||
2289 TESTLO(SSTAT2
, SEMPTY
) ||
2290 GETPORT(FIFOSTAT
)>0) {
2292 * something went wrong, if there's something left in the fifos
2293 * or the phase didn't change
2295 printk(ERR_LEAD
"fifos should be empty and phase should have changed\n", CMDINFO(CURRENT_SC
));
2299 if(DATA_LEN
!=GETSTCNT()) {
2301 "manual transfer count differs from automatic (count=%d;stcnt=%d;diff=%d;fifostat=%d)",
2302 CMDINFO(CURRENT_SC
), DATA_LEN
, GETSTCNT(), GETSTCNT()-DATA_LEN
, GETPORT(FIFOSTAT
));
2308 static void datai_end(struct Scsi_Host
*shpnt
)
2310 CURRENT_SC
->resid
-= GETSTCNT();
2312 DPRINTK(debug_datai
,
2313 DEBUG_LEAD
"datai_end: request_bufflen=%d resid=%d stcnt=%d\n",
2314 CMDINFO(CURRENT_SC
), CURRENT_SC
->request_bufflen
, CURRENT_SC
->resid
, GETSTCNT());
2316 SETPORT(SXFRCTL0
, CH1
|CLRSTCNT
);
2317 SETPORT(DMACNTRL0
, 0);
2324 static void datao_init(struct Scsi_Host
*shpnt
)
2326 SETPORT(DMACNTRL0
, WRITE_READ
| RSTFIFO
);
2327 SETPORT(DMACNTRL0
, WRITE_READ
| ENDMA
);
2329 SETPORT(SXFRCTL0
, CH1
|CLRSTCNT
);
2330 SETPORT(SXFRCTL0
, CH1
|SCSIEN
|DMAEN
);
2332 SETPORT(SIMODE0
, 0);
2333 SETPORT(SIMODE1
, ENSCSIPERR
| ENSCSIRST
| ENPHASEMIS
| ENBUSFREE
);
2335 DATA_LEN
= CURRENT_SC
->resid
;
2337 DPRINTK(debug_datao
,
2338 DEBUG_LEAD
"datao_init: request_bufflen=%d; resid=%d\n",
2339 CMDINFO(CURRENT_SC
), CURRENT_SC
->request_bufflen
, CURRENT_SC
->resid
);
2342 static void datao_run(struct Scsi_Host
*shpnt
)
2344 unsigned long the_time
;
2347 /* until phase changes or all data sent */
2348 while(TESTLO(DMASTAT
, INTSTAT
) && CURRENT_SC
->SCp
.this_residual
>0) {
2350 if(data_count
> CURRENT_SC
->SCp
.this_residual
)
2351 data_count
=CURRENT_SC
->SCp
.this_residual
;
2353 if(TESTLO(DMASTAT
, DFIFOEMP
)) {
2354 printk(ERR_LEAD
"datao fifo not empty (%d)", CMDINFO(CURRENT_SC
), GETPORT(FIFOSTAT
));
2359 if(data_count
& 1) {
2360 SETPORT(DMACNTRL0
,WRITE_READ
|ENDMA
|_8BIT
);
2361 SETPORT(DATAPORT
, *CURRENT_SC
->SCp
.ptr
++);
2362 CURRENT_SC
->SCp
.this_residual
--;
2363 CURRENT_SC
->resid
--;
2364 SETPORT(DMACNTRL0
,WRITE_READ
|ENDMA
);
2367 if(data_count
> 1) {
2369 outsw(DATAPORT
, CURRENT_SC
->SCp
.ptr
, data_count
);
2370 CURRENT_SC
->SCp
.ptr
+= 2 * data_count
;
2371 CURRENT_SC
->SCp
.this_residual
-= 2 * data_count
;
2372 CURRENT_SC
->resid
-= 2 * data_count
;
2375 if(CURRENT_SC
->SCp
.this_residual
==0 && CURRENT_SC
->SCp
.buffers_residual
>0) {
2376 /* advance to next buffer */
2377 CURRENT_SC
->SCp
.buffers_residual
--;
2378 CURRENT_SC
->SCp
.buffer
++;
2379 CURRENT_SC
->SCp
.ptr
= SG_ADDRESS(CURRENT_SC
->SCp
.buffer
);
2380 CURRENT_SC
->SCp
.this_residual
= CURRENT_SC
->SCp
.buffer
->length
;
2383 the_time
=jiffies
+ 100*HZ
;
2384 while(TESTLO(DMASTAT
, DFIFOEMP
|INTSTAT
) && time_before(jiffies
,the_time
))
2387 if(TESTLO(DMASTAT
, DFIFOEMP
|INTSTAT
)) {
2388 printk(ERR_LEAD
"dataout timeout", CMDINFO(CURRENT_SC
));
2395 static void datao_end(struct Scsi_Host
*shpnt
)
2397 if(TESTLO(DMASTAT
, DFIFOEMP
)) {
2398 int data_count
= (DATA_LEN
- CURRENT_SC
->resid
) - GETSTCNT();
2400 DPRINTK(debug_datao
, DEBUG_LEAD
"datao: %d bytes to resend (%d written, %d transferred)\n",
2401 CMDINFO(CURRENT_SC
),
2403 DATA_LEN
-CURRENT_SC
->resid
,
2406 CURRENT_SC
->resid
+= data_count
;
2408 if(CURRENT_SC
->use_sg
) {
2409 data_count
-= CURRENT_SC
->SCp
.ptr
- SG_ADDRESS(CURRENT_SC
->SCp
.buffer
);
2410 while(data_count
>0) {
2411 CURRENT_SC
->SCp
.buffer
--;
2412 CURRENT_SC
->SCp
.buffers_residual
++;
2413 data_count
-= CURRENT_SC
->SCp
.buffer
->length
;
2415 CURRENT_SC
->SCp
.ptr
= SG_ADDRESS(CURRENT_SC
->SCp
.buffer
) - data_count
;
2416 CURRENT_SC
->SCp
.this_residual
= CURRENT_SC
->SCp
.buffer
->length
+ data_count
;
2418 CURRENT_SC
->SCp
.ptr
-= data_count
;
2419 CURRENT_SC
->SCp
.this_residual
+= data_count
;
2423 DPRINTK(debug_datao
, DEBUG_LEAD
"datao_end: request_bufflen=%d; resid=%d; stcnt=%d\n",
2424 CMDINFO(CURRENT_SC
),
2425 CURRENT_SC
->request_bufflen
,
2429 SETPORT(SXFRCTL0
, CH1
|CLRCH1
|CLRSTCNT
);
2430 SETPORT(SXFRCTL0
, CH1
);
2432 SETPORT(DMACNTRL0
, 0);
2436 * figure out what state we're in
2439 static int update_state(struct Scsi_Host
*shpnt
)
2442 unsigned int stat0
= GETPORT(SSTAT0
);
2443 unsigned int stat1
= GETPORT(SSTAT1
);
2448 if(stat1
& SCSIRSTI
) {
2451 SETPORT(SSTAT1
,SCSIRSTI
);
2452 } else if(stat0
& SELDI
&& PREVSTATE
==busfree
) {
2454 } else if(stat0
& SELDO
&& CURRENT_SC
&& (CURRENT_SC
->SCp
.phase
& selecting
)) {
2456 } else if(stat1
& SELTO
) {
2458 } else if(stat1
& BUSFREE
) {
2460 SETPORT(SSTAT1
,BUSFREE
);
2461 } else if(stat1
& SCSIPERR
) {
2463 SETPORT(SSTAT1
,SCSIPERR
);
2464 } else if(stat1
& REQINIT
) {
2465 switch(GETPORT(SCSISIG
) & P_MASK
) {
2466 case P_MSGI
: STATE
=msgi
; break;
2467 case P_MSGO
: STATE
=msgo
; break;
2468 case P_DATAO
: STATE
=datao
; break;
2469 case P_DATAI
: STATE
=datai
; break;
2470 case P_STATUS
: STATE
=status
; break;
2471 case P_CMD
: STATE
=cmd
; break;
2476 if((stat0
& SELDI
) && STATE
!=seldi
&& !dataphase
) {
2477 printk(INFO_LEAD
"reselection missed?", CMDINFO(CURRENT_SC
));
2481 if(STATE
!=PREVSTATE
) {
2482 LASTSTATE
=PREVSTATE
;
2489 * handle parity error
2491 * FIXME: in which phase?
2494 static void parerr_run(struct Scsi_Host
*shpnt
)
2496 printk(ERR_LEAD
"parity error\n", CMDINFO(CURRENT_SC
));
2497 done(shpnt
, DID_PARITY
<< 16);
2504 static void rsti_run(struct Scsi_Host
*shpnt
)
2508 printk(KERN_NOTICE
"aha152x%d: scsi reset in\n", HOSTNO
);
2510 ptr
=DISCONNECTED_SC
;
2512 Scsi_Cmnd
*next
= SCNEXT(ptr
);
2514 if (!ptr
->device
->soft_reset
) {
2515 remove_SC(&DISCONNECTED_SC
, ptr
);
2517 kfree(ptr
->host_scribble
);
2518 ptr
->host_scribble
=NULL
;
2520 ptr
->result
= DID_RESET
<< 16;
2521 ptr
->scsi_done(ptr
);
2527 if(CURRENT_SC
&& !CURRENT_SC
->device
->soft_reset
)
2528 done(shpnt
, DID_RESET
<< 16 );
2533 * bottom-half handler
2536 static void is_complete(struct Scsi_Host
*shpnt
)
2539 unsigned long flags
;
2547 if( HOSTDATA(shpnt
)->service
==0 ) {
2552 HOSTDATA(shpnt
)->service
= 0;
2554 if(HOSTDATA(shpnt
)->in_intr
) {
2556 /* aha152x_error never returns.. */
2557 aha152x_error(shpnt
, "bottom-half already running!?");
2559 HOSTDATA(shpnt
)->in_intr
++;
2562 * loop while there are interrupt conditions pending
2566 unsigned long start
= jiffies
;
2569 dataphase
=update_state(shpnt
);
2571 DPRINTK(debug_phases
, LEAD
"start %s %s(%s)\n", CMDINFO(CURRENT_SC
), states
[STATE
].name
, states
[PREVSTATE
].name
, states
[LASTSTATE
].name
);
2574 * end previous state
2577 if(PREVSTATE
!=STATE
&& states
[PREVSTATE
].end
)
2578 states
[PREVSTATE
].end(shpnt
);
2581 * disable SPIO mode if previous phase used it
2582 * and this one doesn't
2585 if(states
[PREVSTATE
].spio
&& !states
[STATE
].spio
) {
2586 SETPORT(SXFRCTL0
, CH1
);
2587 SETPORT(DMACNTRL0
, 0);
2589 CURRENT_SC
->SCp
.phase
&= ~spiordy
;
2593 * accept current dataphase phase
2597 SETPORT(SSTAT0
, REQINIT
);
2598 SETPORT(SCSISIG
, GETPORT(SCSISIG
) & P_MASK
);
2599 SETPORT(SSTAT1
, PHASECHG
);
2603 * enable SPIO mode if previous didn't use it
2607 if(!states
[PREVSTATE
].spio
&& states
[STATE
].spio
) {
2608 SETPORT(DMACNTRL0
, 0);
2609 SETPORT(SXFRCTL0
, CH1
|SPIOEN
);
2611 CURRENT_SC
->SCp
.phase
|= spiordy
;
2615 * initialize for new state
2618 if(PREVSTATE
!=STATE
&& states
[STATE
].init
)
2619 states
[STATE
].init(shpnt
);
2622 * handle current state
2625 if(states
[STATE
].run
)
2626 states
[STATE
].run(shpnt
);
2628 printk(ERR_LEAD
"unexpected state (%x)\n", CMDINFO(CURRENT_SC
), STATE
);
2631 * setup controller to interrupt on
2632 * the next expected condition and
2633 * loop if it's already there
2637 pending
=setup_expected_interrupts(shpnt
);
2638 #if defined(AHA152X_STAT)
2639 HOSTDATA(shpnt
)->count
[STATE
]++;
2640 if(PREVSTATE
!=STATE
)
2641 HOSTDATA(shpnt
)->count_trans
[STATE
]++;
2642 HOSTDATA(shpnt
)->time
[STATE
] += jiffies
-start
;
2645 DPRINTK(debug_phases
, LEAD
"end %s %s(%s)\n", CMDINFO(CURRENT_SC
), states
[STATE
].name
, states
[PREVSTATE
].name
, states
[LASTSTATE
].name
);
2649 * enable interrupts and leave bottom-half
2652 HOSTDATA(shpnt
)->in_intr
--;
2653 SETBITS(DMACNTRL0
, INTEN
);
2659 * Dump the current driver status and panic
2661 static void aha152x_error(struct Scsi_Host
*shpnt
, char *msg
)
2663 printk(KERN_EMERG
"\naha152x%d: %s\n", HOSTNO
, msg
);
2665 panic("aha152x panic\n");
2669 * Display registers of AIC-6260
2671 static void disp_ports(struct Scsi_Host
*shpnt
)
2673 #if defined(AHA152X_DEBUG)
2676 printk("\n%s: %s(%s) ",
2677 CURRENT_SC
? "busy" : "waiting",
2679 states
[PREVSTATE
].name
);
2681 s
= GETPORT(SCSISEQ
);
2682 printk("SCSISEQ( ");
2684 printk("TARGET MODE ");
2692 printk("AUTOATNO ");
2694 printk("AUTOATNI ");
2696 printk("AUTOATNP ");
2698 printk("SCSIRSTO ");
2701 printk(" SCSISIG(");
2702 s
= GETPORT(SCSISIG
);
2703 switch (s
& P_MASK
) {
2717 printk("MESSAGE OUT");
2720 printk("MESSAGE IN");
2723 printk("*invalid*");
2729 printk("INTSTAT (%s); ", TESTHI(DMASTAT
, INTSTAT
) ? "hi" : "lo");
2732 s
= GETPORT(SSTAT0
);
2750 s
= GETPORT(SSTAT1
);
2756 printk("SCSIRSTI ");
2758 printk("PHASEMIS ");
2762 printk("SCSIPERR ");
2764 printk("PHASECHG ");
2772 s
= GETPORT(SSTAT0
) & GETPORT(SIMODE0
);
2791 s
= GETPORT(SSTAT1
) & GETPORT(SIMODE1
);
2798 printk("SCSIRSTI ");
2800 printk("PHASEMIS ");
2804 printk("SCSIPERR ");
2806 printk("PHASECHG ");
2811 printk("SXFRCTL0( ");
2813 s
= GETPORT(SXFRCTL0
);
2821 printk("CLRSTCNT ");
2830 s
= GETPORT(SCSISIG
);
2843 printk("SELID (%02x), ", GETPORT(SELID
));
2845 printk("STCNT (%d), ", GETSTCNT());
2849 s
= GETPORT(SSTAT2
);
2856 printk("); SFCNT (%d); ", s
& (SFULL
| SFCNT
));
2858 s
= GETPORT(SSTAT3
);
2859 printk("SCSICNT (%d), OFFCNT(%d), ", (s
& 0xf0) >> 4, s
& 0x0f);
2862 s
= GETPORT(SSTAT4
);
2871 printk("DMACNTRL0( ");
2872 s
= GETPORT(DMACNTRL0
);
2873 printk("%s ", s
& _8BIT
? "8BIT" : "16BIT");
2874 printk("%s ", s
& DMA
? "DMA" : "PIO");
2875 printk("%s ", s
& WRITE_READ
? "WRITE" : "READ");
2886 printk("DMASTAT( ");
2887 s
= GETPORT(DMASTAT
);
2893 printk("DFIFOFULL ");
2895 printk("DFIFOEMP ");
2901 * display enabled interrupts
2903 static void disp_enintr(struct Scsi_Host
*shpnt
)
2907 printk(KERN_DEBUG
"enabled interrupts ( ");
2909 s
= GETPORT(SIMODE0
);
2915 printk("ENSELINGO ");
2921 printk("ENSPIORDY ");
2923 printk("ENDMADONE ");
2925 s
= GETPORT(SIMODE1
);
2927 printk("ENSELTIMO ");
2929 printk("ENATNTARG ");
2931 printk("ENPHASEMIS ");
2933 printk("ENBUSFREE ");
2935 printk("ENSCSIPERR ");
2937 printk("ENPHASECHG ");
2939 printk("ENREQINIT ");
2944 * Show the command data of a command
2946 static void show_command(Scsi_Cmnd
*ptr
)
2948 scmd_printk(KERN_DEBUG
, ptr
, "%p: cmnd=(", ptr
);
2950 __scsi_print_command(ptr
->cmnd
);
2952 printk(KERN_DEBUG
"); request_bufflen=%d; resid=%d; phase |",
2953 ptr
->request_bufflen
, ptr
->resid
);
2955 if (ptr
->SCp
.phase
& not_issued
)
2956 printk("not issued|");
2957 if (ptr
->SCp
.phase
& selecting
)
2958 printk("selecting|");
2959 if (ptr
->SCp
.phase
& identified
)
2960 printk("identified|");
2961 if (ptr
->SCp
.phase
& disconnected
)
2962 printk("disconnected|");
2963 if (ptr
->SCp
.phase
& completed
)
2964 printk("completed|");
2965 if (ptr
->SCp
.phase
& spiordy
)
2967 if (ptr
->SCp
.phase
& syncneg
)
2969 if (ptr
->SCp
.phase
& aborted
)
2971 if (ptr
->SCp
.phase
& resetted
)
2972 printk("resetted|");
2974 printk("; next=0x%p\n", SCNEXT(ptr
));
2976 printk("; next=(host scribble NULL)\n");
2981 * Dump the queued data
2983 static void show_queues(struct Scsi_Host
*shpnt
)
2986 unsigned long flags
;
2989 printk(KERN_DEBUG
"\nqueue status:\nissue_SC:\n");
2990 for (ptr
= ISSUE_SC
; ptr
; ptr
= SCNEXT(ptr
))
2994 printk(KERN_DEBUG
"current_SC:\n");
2996 show_command(CURRENT_SC
);
2998 printk(KERN_DEBUG
"none\n");
3000 printk(KERN_DEBUG
"disconnected_SC:\n");
3001 for (ptr
= DISCONNECTED_SC
; ptr
; ptr
= SCDATA(ptr
) ? SCNEXT(ptr
) : NULL
)
3009 #define SPRINTF(args...) pos += sprintf(pos, ## args)
3011 static int get_command(char *pos
, Scsi_Cmnd
* ptr
)
3016 SPRINTF("0x%08x: target=%d; lun=%d; cmnd=( ",
3017 (unsigned int) ptr
, ptr
->device
->id
, ptr
->device
->lun
);
3019 for (i
= 0; i
< COMMAND_SIZE(ptr
->cmnd
[0]); i
++)
3020 SPRINTF("0x%02x ", ptr
->cmnd
[i
]);
3022 SPRINTF("); resid=%d; residual=%d; buffers=%d; phase |",
3023 ptr
->resid
, ptr
->SCp
.this_residual
, ptr
->SCp
.buffers_residual
);
3025 if (ptr
->SCp
.phase
& not_issued
)
3026 SPRINTF("not issued|");
3027 if (ptr
->SCp
.phase
& selecting
)
3028 SPRINTF("selecting|");
3029 if (ptr
->SCp
.phase
& disconnected
)
3030 SPRINTF("disconnected|");
3031 if (ptr
->SCp
.phase
& aborted
)
3032 SPRINTF("aborted|");
3033 if (ptr
->SCp
.phase
& identified
)
3034 SPRINTF("identified|");
3035 if (ptr
->SCp
.phase
& completed
)
3036 SPRINTF("completed|");
3037 if (ptr
->SCp
.phase
& spiordy
)
3038 SPRINTF("spiordy|");
3039 if (ptr
->SCp
.phase
& syncneg
)
3040 SPRINTF("syncneg|");
3041 SPRINTF("; next=0x%p\n", SCNEXT(ptr
));
3043 return (pos
- start
);
3046 static int get_ports(struct Scsi_Host
*shpnt
, char *pos
)
3051 SPRINTF("\n%s: %s(%s) ", CURRENT_SC
? "on bus" : "waiting", states
[STATE
].name
, states
[PREVSTATE
].name
);
3053 s
= GETPORT(SCSISEQ
);
3054 SPRINTF("SCSISEQ( ");
3056 SPRINTF("TARGET MODE ");
3064 SPRINTF("AUTOATNO ");
3066 SPRINTF("AUTOATNI ");
3068 SPRINTF("AUTOATNP ");
3070 SPRINTF("SCSIRSTO ");
3073 SPRINTF(" SCSISIG(");
3074 s
= GETPORT(SCSISIG
);
3075 switch (s
& P_MASK
) {
3077 SPRINTF("DATA OUT");
3089 SPRINTF("MESSAGE OUT");
3092 SPRINTF("MESSAGE IN");
3095 SPRINTF("*invalid*");
3101 SPRINTF("INTSTAT (%s); ", TESTHI(DMASTAT
, INTSTAT
) ? "hi" : "lo");
3104 s
= GETPORT(SSTAT0
);
3112 SPRINTF("SELINGO ");
3118 SPRINTF("SPIORDY ");
3120 SPRINTF("DMADONE ");
3122 s
= GETPORT(SSTAT1
);
3126 SPRINTF("ATNTARG ");
3128 SPRINTF("SCSIRSTI ");
3130 SPRINTF("PHASEMIS ");
3132 SPRINTF("BUSFREE ");
3134 SPRINTF("SCSIPERR ");
3136 SPRINTF("PHASECHG ");
3138 SPRINTF("REQINIT ");
3144 s
= GETPORT(SSTAT0
) & GETPORT(SIMODE0
);
3153 SPRINTF("SELINGO ");
3159 SPRINTF("SPIORDY ");
3161 SPRINTF("DMADONE ");
3163 s
= GETPORT(SSTAT1
) & GETPORT(SIMODE1
);
3168 SPRINTF("ATNTARG ");
3170 SPRINTF("SCSIRSTI ");
3172 SPRINTF("PHASEMIS ");
3174 SPRINTF("BUSFREE ");
3176 SPRINTF("SCSIPERR ");
3178 SPRINTF("PHASECHG ");
3180 SPRINTF("REQINIT ");
3183 SPRINTF("SXFRCTL0( ");
3185 s
= GETPORT(SXFRCTL0
);
3193 SPRINTF("CLRSTCNT ");
3200 SPRINTF("SIGNAL( ");
3202 s
= GETPORT(SCSISIG
);
3215 SPRINTF("SELID(%02x), ", GETPORT(SELID
));
3217 SPRINTF("STCNT(%d), ", GETSTCNT());
3219 SPRINTF("SSTAT2( ");
3221 s
= GETPORT(SSTAT2
);
3223 SPRINTF("SOFFSET ");
3228 SPRINTF("); SFCNT (%d); ", s
& (SFULL
| SFCNT
));
3230 s
= GETPORT(SSTAT3
);
3231 SPRINTF("SCSICNT (%d), OFFCNT(%d), ", (s
& 0xf0) >> 4, s
& 0x0f);
3233 SPRINTF("SSTAT4( ");
3234 s
= GETPORT(SSTAT4
);
3236 SPRINTF("SYNCERR ");
3243 SPRINTF("DMACNTRL0( ");
3244 s
= GETPORT(DMACNTRL0
);
3245 SPRINTF("%s ", s
& _8BIT
? "8BIT" : "16BIT");
3246 SPRINTF("%s ", s
& DMA
? "DMA" : "PIO");
3247 SPRINTF("%s ", s
& WRITE_READ
? "WRITE" : "READ");
3253 SPRINTF("RSTFIFO ");
3258 SPRINTF("DMASTAT( ");
3259 s
= GETPORT(DMASTAT
);
3263 SPRINTF("WORDRDY ");
3265 SPRINTF("DFIFOFULL ");
3267 SPRINTF("DFIFOEMP ");
3270 SPRINTF("enabled interrupts( ");
3272 s
= GETPORT(SIMODE0
);
3274 SPRINTF("ENSELDO ");
3276 SPRINTF("ENSELDI ");
3278 SPRINTF("ENSELINGO ");
3280 SPRINTF("ENSWRAP ");
3282 SPRINTF("ENSDONE ");
3284 SPRINTF("ENSPIORDY ");
3286 SPRINTF("ENDMADONE ");
3288 s
= GETPORT(SIMODE1
);
3290 SPRINTF("ENSELTIMO ");
3292 SPRINTF("ENATNTARG ");
3294 SPRINTF("ENPHASEMIS ");
3296 SPRINTF("ENBUSFREE ");
3298 SPRINTF("ENSCSIPERR ");
3300 SPRINTF("ENPHASECHG ");
3302 SPRINTF("ENREQINIT ");
3305 return (pos
- start
);
3308 static int aha152x_set_info(char *buffer
, int length
, struct Scsi_Host
*shpnt
)
3310 if(!shpnt
|| !buffer
|| length
<8 || strncmp("aha152x ", buffer
, 8)!=0)
3313 #if defined(AHA152X_DEBUG)
3314 if(length
>14 && strncmp("debug ", buffer
+8, 6)==0) {
3315 int debug
= HOSTDATA(shpnt
)->debug
;
3317 HOSTDATA(shpnt
)->debug
= simple_strtoul(buffer
+14, NULL
, 0);
3319 printk(KERN_INFO
"aha152x%d: debugging options set to 0x%04x (were 0x%04x)\n", HOSTNO
, HOSTDATA(shpnt
)->debug
, debug
);
3322 #if defined(AHA152X_STAT)
3323 if(length
>13 && strncmp("reset", buffer
+8, 5)==0) {
3326 HOSTDATA(shpnt
)->total_commands
=0;
3327 HOSTDATA(shpnt
)->disconnections
=0;
3328 HOSTDATA(shpnt
)->busfree_without_any_action
=0;
3329 HOSTDATA(shpnt
)->busfree_without_old_command
=0;
3330 HOSTDATA(shpnt
)->busfree_without_new_command
=0;
3331 HOSTDATA(shpnt
)->busfree_without_done_command
=0;
3332 HOSTDATA(shpnt
)->busfree_with_check_condition
=0;
3333 for (i
= idle
; i
<maxstate
; i
++) {
3334 HOSTDATA(shpnt
)->count
[i
]=0;
3335 HOSTDATA(shpnt
)->count_trans
[i
]=0;
3336 HOSTDATA(shpnt
)->time
[i
]=0;
3339 printk(KERN_INFO
"aha152x%d: stats reseted.\n", HOSTNO
);
3352 #define SPRINTF(args...) \
3353 do { if(pos < buffer + length) pos += sprintf(pos, ## args); } while(0)
3355 static int aha152x_proc_info(struct Scsi_Host
*shpnt
, char *buffer
, char **start
,
3356 off_t offset
, int length
, int inout
)
3361 unsigned long flags
;
3364 DPRINTK(debug_procinfo
,
3365 KERN_DEBUG
"aha152x_proc_info: buffer=%p offset=%ld length=%d hostno=%d inout=%d\n",
3366 buffer
, offset
, length
, shpnt
->host_no
, inout
);
3370 return aha152x_set_info(buffer
, length
, shpnt
);
3372 SPRINTF(AHA152X_REVID
"\n");
3374 SPRINTF("ioports 0x%04lx to 0x%04lx\n",
3375 shpnt
->io_port
, shpnt
->io_port
+ shpnt
->n_io_port
- 1);
3376 SPRINTF("interrupt 0x%02x\n", shpnt
->irq
);
3377 SPRINTF("disconnection/reconnection %s\n",
3378 RECONNECT
? "enabled" : "disabled");
3379 SPRINTF("parity checking %s\n",
3380 PARITY
? "enabled" : "disabled");
3381 SPRINTF("synchronous transfers %s\n",
3382 SYNCHRONOUS
? "enabled" : "disabled");
3383 SPRINTF("%d commands currently queued\n", HOSTDATA(shpnt
)->commands
);
3386 SPRINTF("synchronously operating targets (tick=50 ns):\n");
3387 for (i
= 0; i
< 8; i
++)
3388 if (HOSTDATA(shpnt
)->syncrate
[i
] & 0x7f)
3389 SPRINTF("target %d: period %dT/%dns; req/ack offset %d\n",
3391 (((HOSTDATA(shpnt
)->syncrate
[i
] & 0x70) >> 4) + 2),
3392 (((HOSTDATA(shpnt
)->syncrate
[i
] & 0x70) >> 4) + 2) * 50,
3393 HOSTDATA(shpnt
)->syncrate
[i
] & 0x0f);
3395 #if defined(AHA152X_DEBUG)
3396 #define PDEBUG(flags,txt) \
3397 if(HOSTDATA(shpnt)->debug & flags) SPRINTF("(%s) ", txt);
3399 SPRINTF("enabled debugging options: ");
3401 PDEBUG(debug_procinfo
, "procinfo");
3402 PDEBUG(debug_queue
, "queue");
3403 PDEBUG(debug_intr
, "interrupt");
3404 PDEBUG(debug_selection
, "selection");
3405 PDEBUG(debug_msgo
, "message out");
3406 PDEBUG(debug_msgi
, "message in");
3407 PDEBUG(debug_status
, "status");
3408 PDEBUG(debug_cmd
, "command");
3409 PDEBUG(debug_datai
, "data in");
3410 PDEBUG(debug_datao
, "data out");
3411 PDEBUG(debug_eh
, "eh");
3412 PDEBUG(debug_locks
, "locks");
3413 PDEBUG(debug_phases
, "phases");
3418 SPRINTF("\nqueue status:\n");
3421 SPRINTF("not yet issued commands:\n");
3422 for (ptr
= ISSUE_SC
; ptr
; ptr
= SCNEXT(ptr
))
3423 pos
+= get_command(pos
, ptr
);
3425 SPRINTF("no not yet issued commands\n");
3429 SPRINTF("current command:\n");
3430 pos
+= get_command(pos
, CURRENT_SC
);
3432 SPRINTF("no current command\n");
3434 if (DISCONNECTED_SC
) {
3435 SPRINTF("disconnected commands:\n");
3436 for (ptr
= DISCONNECTED_SC
; ptr
; ptr
= SCNEXT(ptr
))
3437 pos
+= get_command(pos
, ptr
);
3439 SPRINTF("no disconnected commands\n");
3441 pos
+= get_ports(shpnt
, pos
);
3443 #if defined(AHA152X_STAT)
3444 SPRINTF("statistics:\n"
3445 "total commands: %d\n"
3446 "disconnections: %d\n"
3447 "busfree with check condition: %d\n"
3448 "busfree without old command: %d\n"
3449 "busfree without new command: %d\n"
3450 "busfree without done command: %d\n"
3451 "busfree without any action: %d\n"
3456 HOSTDATA(shpnt
)->total_commands
,
3457 HOSTDATA(shpnt
)->disconnections
,
3458 HOSTDATA(shpnt
)->busfree_with_check_condition
,
3459 HOSTDATA(shpnt
)->busfree_without_old_command
,
3460 HOSTDATA(shpnt
)->busfree_without_new_command
,
3461 HOSTDATA(shpnt
)->busfree_without_done_command
,
3462 HOSTDATA(shpnt
)->busfree_without_any_action
);
3463 for(i
=0; i
<maxstate
; i
++) {
3464 SPRINTF("%-10s %-12d %-12d %-12ld\n",
3466 HOSTDATA(shpnt
)->count_trans
[i
],
3467 HOSTDATA(shpnt
)->count
[i
],
3468 HOSTDATA(shpnt
)->time
[i
]);
3472 DPRINTK(debug_procinfo
, KERN_DEBUG
"aha152x_proc_info: pos=%p\n", pos
);
3474 thislength
= pos
- (buffer
+ offset
);
3475 DPRINTK(debug_procinfo
, KERN_DEBUG
"aha152x_proc_info: length=%d thislength=%d\n", length
, thislength
);
3478 DPRINTK(debug_procinfo
, KERN_DEBUG
"aha152x_proc_info: output too short\n");
3483 thislength
= thislength
<length
? thislength
: length
;
3485 DPRINTK(debug_procinfo
, KERN_DEBUG
"aha152x_proc_info: return %d\n", thislength
);
3487 *start
= buffer
+ offset
;
3488 return thislength
< length
? thislength
: length
;
3491 static struct scsi_host_template aha152x_driver_template
= {
3492 .module
= THIS_MODULE
,
3493 .name
= AHA152X_REVID
,
3494 .proc_name
= "aha152x",
3495 .proc_info
= aha152x_proc_info
,
3496 .queuecommand
= aha152x_queue
,
3497 .eh_abort_handler
= aha152x_abort
,
3498 .eh_device_reset_handler
= aha152x_device_reset
,
3499 .eh_bus_reset_handler
= aha152x_bus_reset
,
3500 .eh_host_reset_handler
= aha152x_host_reset
,
3501 .bios_param
= aha152x_biosparam
,
3504 .sg_tablesize
= SG_ALL
,
3506 .use_clustering
= DISABLE_CLUSTERING
,
3509 #if !defined(PCMCIA)
3510 static int setup_count
;
3511 static struct aha152x_setup setup
[2];
3513 /* possible i/o addresses for the AIC-6260; default first */
3514 static unsigned short ports
[] = { 0x340, 0x140 };
3516 #if !defined(SKIP_BIOSTEST)
3517 /* possible locations for the Adaptec BIOS; defaults first */
3518 static unsigned int addresses
[] =
3520 0xdc000, /* default first */
3527 0xeb800, /* VTech Platinum SMP */
3531 /* signatures for various AIC-6[23]60 based controllers.
3532 The point in detecting signatures is to avoid useless and maybe
3533 harmful probes on ports. I'm not sure that all listed boards pass
3534 auto-configuration. For those which fail the BIOS signature is
3535 obsolete, because user intervention to supply the configuration is
3536 needed anyway. May be an information whether or not the BIOS supports
3537 extended translation could be also useful here. */
3538 static struct signature
{
3539 unsigned char *signature
;
3544 { "Adaptec AHA-1520 BIOS", 0x102e, 21 },
3546 { "Adaptec AHA-1520B", 0x000b, 17 },
3547 /* Adaptec 152x rev B */
3548 { "Adaptec AHA-1520B", 0x0026, 17 },
3549 /* Iomega Jaz Jet ISA (AIC6370Q) */
3550 { "Adaptec ASW-B626 BIOS", 0x1029, 21 },
3551 /* on-board controller */
3552 { "Adaptec BIOS: ASW-B626", 0x000f, 22 },
3553 /* on-board controller */
3554 { "Adaptec ASW-B626 S2", 0x2e6c, 19 },
3555 /* on-board controller */
3556 { "Adaptec BIOS:AIC-6360", 0x000c, 21 },
3557 /* on-board controller */
3558 { "ScsiPro SP-360 BIOS", 0x2873, 19 },
3559 /* ScsiPro-Controller */
3560 { "GA-400 LOCAL BUS SCSI BIOS", 0x102e, 26 },
3561 /* Gigabyte Local-Bus-SCSI */
3562 { "Adaptec BIOS:AVA-282X", 0x000c, 21 },
3564 { "Adaptec IBM Dock II SCSI", 0x2edd, 24 },
3565 /* IBM Thinkpad Dock II */
3566 { "Adaptec BIOS:AHA-1532P", 0x001c, 22 },
3567 /* IBM Thinkpad Dock II SCSI */
3568 { "DTC3520A Host Adapter BIOS", 0x318a, 26 },
3569 /* DTC 3520A ISA SCSI */
3571 #endif /* !SKIP_BIOSTEST */
3574 * Test, if port_base is valid.
3577 static int aha152x_porttest(int io_port
)
3581 SETPORT(io_port
+ O_DMACNTRL1
, 0); /* reset stack pointer */
3582 for (i
= 0; i
< 16; i
++)
3583 SETPORT(io_port
+ O_STACK
, i
);
3585 SETPORT(io_port
+ O_DMACNTRL1
, 0); /* reset stack pointer */
3586 for (i
= 0; i
< 16 && GETPORT(io_port
+ O_STACK
) == i
; i
++)
3592 static int tc1550_porttest(int io_port
)
3596 SETPORT(io_port
+ O_TC_DMACNTRL1
, 0); /* reset stack pointer */
3597 for (i
= 0; i
< 16; i
++)
3598 SETPORT(io_port
+ O_STACK
, i
);
3600 SETPORT(io_port
+ O_TC_DMACNTRL1
, 0); /* reset stack pointer */
3601 for (i
= 0; i
< 16 && GETPORT(io_port
+ O_TC_STACK
) == i
; i
++)
3608 static int checksetup(struct aha152x_setup
*setup
)
3611 for (i
= 0; i
< ARRAY_SIZE(ports
) && (setup
->io_port
!= ports
[i
]); i
++)
3614 if (i
== ARRAY_SIZE(ports
))
3617 if ( request_region(setup
->io_port
, IO_RANGE
, "aha152x")==0 ) {
3618 printk(KERN_ERR
"aha152x: io port 0x%x busy.\n", setup
->io_port
);
3622 if( aha152x_porttest(setup
->io_port
) ) {
3624 } else if( tc1550_porttest(setup
->io_port
) ) {
3627 release_region(setup
->io_port
, IO_RANGE
);
3631 release_region(setup
->io_port
, IO_RANGE
);
3633 if ((setup
->irq
< IRQ_MIN
) || (setup
->irq
> IRQ_MAX
))
3636 if ((setup
->scsiid
< 0) || (setup
->scsiid
> 7))
3639 if ((setup
->reconnect
< 0) || (setup
->reconnect
> 1))
3642 if ((setup
->parity
< 0) || (setup
->parity
> 1))
3645 if ((setup
->synchronous
< 0) || (setup
->synchronous
> 1))
3648 if ((setup
->ext_trans
< 0) || (setup
->ext_trans
> 1))
3656 static int __init
aha152x_init(void)
3659 #if defined(AUTOCONF)
3660 aha152x_config conf
;
3663 struct pnp_dev
*dev
=NULL
, *pnpdev
[2] = {NULL
, NULL
};
3666 if ( setup_count
) {
3667 printk(KERN_INFO
"aha152x: processing commandline: ");
3669 for (i
= 0; i
<setup_count
; i
++) {
3670 if (!checksetup(&setup
[i
])) {
3671 printk(KERN_ERR
"\naha152x: %s\n", setup
[i
].conf
);
3672 printk(KERN_ERR
"aha152x: invalid line\n");
3679 if (setup_count
< ARRAY_SIZE(setup
)) {
3680 struct aha152x_setup override
= SETUP0
;
3682 if (setup_count
== 0 || (override
.io_port
!= setup
[0].io_port
)) {
3683 if (!checksetup(&override
)) {
3684 printk(KERN_ERR
"\naha152x: invalid override SETUP0={0x%x,%d,%d,%d,%d,%d,%d,%d}\n",
3690 override
.synchronous
,
3692 override
.ext_trans
);
3694 setup
[setup_count
++] = override
;
3700 if (setup_count
< ARRAY_SIZE(setup
)) {
3701 struct aha152x_setup override
= SETUP1
;
3703 if (setup_count
== 0 || (override
.io_port
!= setup
[0].io_port
)) {
3704 if (!checksetup(&override
)) {
3705 printk(KERN_ERR
"\naha152x: invalid override SETUP1={0x%x,%d,%d,%d,%d,%d,%d,%d}\n",
3711 override
.synchronous
,
3713 override
.ext_trans
);
3715 setup
[setup_count
++] = override
;
3721 if (setup_count
<ARRAY_SIZE(setup
) && (aha152x
[0]!=0 || io
[0]!=0 || irq
[0]!=0)) {
3723 setup
[setup_count
].conf
= "";
3724 setup
[setup_count
].io_port
= aha152x
[0];
3725 setup
[setup_count
].irq
= aha152x
[1];
3726 setup
[setup_count
].scsiid
= aha152x
[2];
3727 setup
[setup_count
].reconnect
= aha152x
[3];
3728 setup
[setup_count
].parity
= aha152x
[4];
3729 setup
[setup_count
].synchronous
= aha152x
[5];
3730 setup
[setup_count
].delay
= aha152x
[6];
3731 setup
[setup_count
].ext_trans
= aha152x
[7];
3732 #if defined(AHA152X_DEBUG)
3733 setup
[setup_count
].debug
= aha152x
[8];
3735 } else if(io
[0]!=0 || irq
[0]!=0) {
3736 if(io
[0]!=0) setup
[setup_count
].io_port
= io
[0];
3737 if(irq
[0]!=0) setup
[setup_count
].irq
= irq
[0];
3739 setup
[setup_count
].scsiid
= scsiid
[0];
3740 setup
[setup_count
].reconnect
= reconnect
[0];
3741 setup
[setup_count
].parity
= parity
[0];
3742 setup
[setup_count
].synchronous
= sync
[0];
3743 setup
[setup_count
].delay
= delay
[0];
3744 setup
[setup_count
].ext_trans
= exttrans
[0];
3745 #if defined(AHA152X_DEBUG)
3746 setup
[setup_count
].debug
= debug
[0];
3750 if (checksetup(&setup
[setup_count
]))
3753 printk(KERN_ERR
"aha152x: invalid module params io=0x%x, irq=%d,scsiid=%d,reconnect=%d,parity=%d,sync=%d,delay=%d,exttrans=%d\n",
3754 setup
[setup_count
].io_port
,
3755 setup
[setup_count
].irq
,
3756 setup
[setup_count
].scsiid
,
3757 setup
[setup_count
].reconnect
,
3758 setup
[setup_count
].parity
,
3759 setup
[setup_count
].synchronous
,
3760 setup
[setup_count
].delay
,
3761 setup
[setup_count
].ext_trans
);
3764 if (setup_count
<ARRAY_SIZE(setup
) && (aha152x1
[0]!=0 || io
[1]!=0 || irq
[1]!=0)) {
3765 if(aha152x1
[0]!=0) {
3766 setup
[setup_count
].conf
= "";
3767 setup
[setup_count
].io_port
= aha152x1
[0];
3768 setup
[setup_count
].irq
= aha152x1
[1];
3769 setup
[setup_count
].scsiid
= aha152x1
[2];
3770 setup
[setup_count
].reconnect
= aha152x1
[3];
3771 setup
[setup_count
].parity
= aha152x1
[4];
3772 setup
[setup_count
].synchronous
= aha152x1
[5];
3773 setup
[setup_count
].delay
= aha152x1
[6];
3774 setup
[setup_count
].ext_trans
= aha152x1
[7];
3775 #if defined(AHA152X_DEBUG)
3776 setup
[setup_count
].debug
= aha152x1
[8];
3778 } else if(io
[1]!=0 || irq
[1]!=0) {
3779 if(io
[1]!=0) setup
[setup_count
].io_port
= io
[1];
3780 if(irq
[1]!=0) setup
[setup_count
].irq
= irq
[1];
3782 setup
[setup_count
].scsiid
= scsiid
[1];
3783 setup
[setup_count
].reconnect
= reconnect
[1];
3784 setup
[setup_count
].parity
= parity
[1];
3785 setup
[setup_count
].synchronous
= sync
[1];
3786 setup
[setup_count
].delay
= delay
[1];
3787 setup
[setup_count
].ext_trans
= exttrans
[1];
3788 #if defined(AHA152X_DEBUG)
3789 setup
[setup_count
].debug
= debug
[1];
3792 if (checksetup(&setup
[setup_count
]))
3795 printk(KERN_ERR
"aha152x: invalid module params io=0x%x, irq=%d,scsiid=%d,reconnect=%d,parity=%d,sync=%d,delay=%d,exttrans=%d\n",
3796 setup
[setup_count
].io_port
,
3797 setup
[setup_count
].irq
,
3798 setup
[setup_count
].scsiid
,
3799 setup
[setup_count
].reconnect
,
3800 setup
[setup_count
].parity
,
3801 setup
[setup_count
].synchronous
,
3802 setup
[setup_count
].delay
,
3803 setup
[setup_count
].ext_trans
);
3808 for(i
=0; setup_count
<ARRAY_SIZE(setup
) && id_table
[i
].vendor
; i
++) {
3809 while ( setup_count
<ARRAY_SIZE(setup
) &&
3810 (dev
=pnp_find_dev(NULL
, id_table
[i
].vendor
, id_table
[i
].function
, dev
)) ) {
3811 if (pnp_device_attach(dev
) < 0)
3814 if (pnp_activate_dev(dev
) < 0) {
3815 pnp_device_detach(dev
);
3819 if (!pnp_port_valid(dev
, 0)) {
3820 pnp_device_detach(dev
);
3824 if (setup_count
==1 && pnp_port_start(dev
, 0)==setup
[0].io_port
) {
3825 pnp_device_detach(dev
);
3829 setup
[setup_count
].io_port
= pnp_port_start(dev
, 0);
3830 setup
[setup_count
].irq
= pnp_irq(dev
, 0);
3831 setup
[setup_count
].scsiid
= 7;
3832 setup
[setup_count
].reconnect
= 1;
3833 setup
[setup_count
].parity
= 1;
3834 setup
[setup_count
].synchronous
= 1;
3835 setup
[setup_count
].delay
= DELAY_DEFAULT
;
3836 setup
[setup_count
].ext_trans
= 0;
3837 #if defined(AHA152X_DEBUG)
3838 setup
[setup_count
].debug
= DEBUG_DEFAULT
;
3840 #if defined(__ISAPNP__)
3841 pnpdev
[setup_count
] = dev
;
3844 "aha152x: found ISAPnP adapter at io=0x%03x, irq=%d\n",
3845 setup
[setup_count
].io_port
, setup
[setup_count
].irq
);
3851 #if defined(AUTOCONF)
3852 if (setup_count
<ARRAY_SIZE(setup
)) {
3853 #if !defined(SKIP_BIOSTEST)
3855 for (i
= 0; i
< ARRAY_SIZE(addresses
) && !ok
; i
++) {
3856 void __iomem
*p
= ioremap(addresses
[i
], 0x4000);
3859 for (j
= 0; j
<ARRAY_SIZE(signatures
) && !ok
; j
++)
3860 ok
= check_signature(p
+ signatures
[j
].sig_offset
,
3861 signatures
[j
].signature
, signatures
[j
].sig_length
);
3864 if (!ok
&& setup_count
== 0)
3867 printk(KERN_INFO
"aha152x: BIOS test: passed, ");
3869 printk(KERN_INFO
"aha152x: ");
3870 #endif /* !SKIP_BIOSTEST */
3873 for (i
= 0; i
< ARRAY_SIZE(ports
) && setup_count
< 2; i
++) {
3874 if ((setup_count
== 1) && (setup
[0].io_port
== ports
[i
]))
3877 if ( request_region(ports
[i
], IO_RANGE
, "aha152x")==0 ) {
3878 printk(KERN_ERR
"aha152x: io port 0x%x busy.\n", ports
[i
]);
3882 if (aha152x_porttest(ports
[i
])) {
3883 setup
[setup_count
].tc1550
= 0;
3886 (GETPORT(ports
[i
] + O_PORTA
) << 8) + GETPORT(ports
[i
] + O_PORTB
);
3887 } else if (tc1550_porttest(ports
[i
])) {
3888 setup
[setup_count
].tc1550
= 1;
3891 (GETPORT(ports
[i
] + O_TC_PORTA
) << 8) + GETPORT(ports
[i
] + O_TC_PORTB
);
3893 release_region(ports
[i
], IO_RANGE
);
3897 release_region(ports
[i
], IO_RANGE
);
3900 setup
[setup_count
].io_port
= ports
[i
];
3901 setup
[setup_count
].irq
= IRQ_MIN
+ conf
.cf_irq
;
3902 setup
[setup_count
].scsiid
= conf
.cf_id
;
3903 setup
[setup_count
].reconnect
= conf
.cf_tardisc
;
3904 setup
[setup_count
].parity
= !conf
.cf_parity
;
3905 setup
[setup_count
].synchronous
= conf
.cf_syncneg
;
3906 setup
[setup_count
].delay
= DELAY_DEFAULT
;
3907 setup
[setup_count
].ext_trans
= 0;
3908 #if defined(AHA152X_DEBUG)
3909 setup
[setup_count
].debug
= DEBUG_DEFAULT
;
3916 printk("auto configuration: ok, ");
3920 printk("%d controller(s) configured\n", setup_count
);
3922 for (i
=0; i
<setup_count
; i
++) {
3923 if ( request_region(setup
[i
].io_port
, IO_RANGE
, "aha152x") ) {
3924 struct Scsi_Host
*shpnt
= aha152x_probe_one(&setup
[i
]);
3927 release_region(setup
[i
].io_port
, IO_RANGE
);
3928 #if defined(__ISAPNP__)
3929 } else if( pnpdev
[i
] ) {
3930 HOSTDATA(shpnt
)->pnpdev
=pnpdev
[i
];
3935 printk(KERN_ERR
"aha152x: io port 0x%x busy.\n", setup
[i
].io_port
);
3938 #if defined(__ISAPNP__)
3940 pnp_device_detach(pnpdev
[i
]);
3947 static void __exit
aha152x_exit(void)
3949 struct aha152x_hostdata
*hd
;
3951 list_for_each_entry(hd
, &aha152x_host_list
, host_list
) {
3952 struct Scsi_Host
*shost
= container_of((void *)hd
, struct Scsi_Host
, hostdata
);
3954 aha152x_release(shost
);
3958 module_init(aha152x_init
);
3959 module_exit(aha152x_exit
);
3961 #if !defined(MODULE)
3962 static int __init
aha152x_setup(char *str
)
3964 #if defined(AHA152X_DEBUG)
3969 get_options(str
, ARRAY_SIZE(ints
), ints
);
3971 if(setup_count
>=ARRAY_SIZE(setup
)) {
3972 printk(KERN_ERR
"aha152x: you can only configure up to two controllers\n");
3976 setup
[setup_count
].conf
= str
;
3977 setup
[setup_count
].io_port
= ints
[0] >= 1 ? ints
[1] : 0x340;
3978 setup
[setup_count
].irq
= ints
[0] >= 2 ? ints
[2] : 11;
3979 setup
[setup_count
].scsiid
= ints
[0] >= 3 ? ints
[3] : 7;
3980 setup
[setup_count
].reconnect
= ints
[0] >= 4 ? ints
[4] : 1;
3981 setup
[setup_count
].parity
= ints
[0] >= 5 ? ints
[5] : 1;
3982 setup
[setup_count
].synchronous
= ints
[0] >= 6 ? ints
[6] : 1;
3983 setup
[setup_count
].delay
= ints
[0] >= 7 ? ints
[7] : DELAY_DEFAULT
;
3984 setup
[setup_count
].ext_trans
= ints
[0] >= 8 ? ints
[8] : 0;
3985 #if defined(AHA152X_DEBUG)
3986 setup
[setup_count
].debug
= ints
[0] >= 9 ? ints
[9] : DEBUG_DEFAULT
;
3988 printk(KERN_NOTICE
"aha152x: usage: aha152x=<IOBASE>[,<IRQ>[,<SCSI ID>"
3989 "[,<RECONNECT>[,<PARITY>[,<SYNCHRONOUS>[,<DELAY>[,<EXT_TRANS>[,<DEBUG>]]]]]]]]\n");
3991 if (ints
[0] > 8) { /*}*/
3992 printk(KERN_NOTICE
"aha152x: usage: aha152x=<IOBASE>[,<IRQ>[,<SCSI ID>"
3993 "[,<RECONNECT>[,<PARITY>[,<SYNCHRONOUS>[,<DELAY>[,<EXT_TRANS>]]]]]]]\n");
4002 __setup("aha152x=", aha152x_setup
);
4005 #endif /* !PCMCIA */