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/completion.h>
244 #include <linux/errno.h>
245 #include <linux/string.h>
246 #include <linux/wait.h>
247 #include <linux/ioport.h>
248 #include <linux/delay.h>
249 #include <linux/proc_fs.h>
250 #include <linux/interrupt.h>
251 #include <linux/init.h>
252 #include <linux/kernel.h>
253 #include <linux/isapnp.h>
254 #include <linux/spinlock.h>
255 #include <linux/workqueue.h>
256 #include <linux/list.h>
257 #include <scsi/scsicam.h>
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 completion *done;/* semaphore to block on */
555 unsigned char cmd_len;
556 unsigned char cmnd[MAX_COMMAND_SIZE];
557 unsigned short use_sg;
558 unsigned request_bufflen;
559 void *request_buffer;
563 /* access macros for hostdata */
565 #define HOSTDATA(shpnt) ((struct aha152x_hostdata *) &shpnt->hostdata)
567 #define HOSTNO ((shpnt)->host_no)
569 #define CURRENT_SC (HOSTDATA(shpnt)->current_SC)
570 #define DONE_SC (HOSTDATA(shpnt)->done_SC)
571 #define ISSUE_SC (HOSTDATA(shpnt)->issue_SC)
572 #define DISCONNECTED_SC (HOSTDATA(shpnt)->disconnected_SC)
573 #define QLOCK (HOSTDATA(shpnt)->lock)
574 #define QLOCKER (HOSTDATA(shpnt)->locker)
575 #define QLOCKERL (HOSTDATA(shpnt)->lockerl)
577 #define STATE (HOSTDATA(shpnt)->state)
578 #define PREVSTATE (HOSTDATA(shpnt)->prevstate)
579 #define LASTSTATE (HOSTDATA(shpnt)->laststate)
581 #define RECONN_TARGET (HOSTDATA(shpnt)->target)
583 #define CMD_I (HOSTDATA(shpnt)->cmd_i)
585 #define MSGO(i) (HOSTDATA(shpnt)->msgo[i])
586 #define MSGO_I (HOSTDATA(shpnt)->msgo_i)
587 #define MSGOLEN (HOSTDATA(shpnt)->msgo_len)
588 #define ADDMSGO(x) (MSGOLEN<256 ? (void)(MSGO(MSGOLEN++)=x) : aha152x_error(shpnt,"MSGO overflow"))
590 #define MSGI(i) (HOSTDATA(shpnt)->msgi[i])
591 #define MSGILEN (HOSTDATA(shpnt)->msgi_len)
592 #define ADDMSGI(x) (MSGILEN<256 ? (void)(MSGI(MSGILEN++)=x) : aha152x_error(shpnt,"MSGI overflow"))
594 #define DATA_LEN (HOSTDATA(shpnt)->data_len)
596 #define SYNCRATE (HOSTDATA(shpnt)->syncrate[CURRENT_SC->device->id])
597 #define SYNCNEG (HOSTDATA(shpnt)->syncneg[CURRENT_SC->device->id])
599 #define DELAY (HOSTDATA(shpnt)->delay)
600 #define EXT_TRANS (HOSTDATA(shpnt)->ext_trans)
601 #define TC1550 (HOSTDATA(shpnt)->tc1550)
602 #define RECONNECT (HOSTDATA(shpnt)->reconnect)
603 #define PARITY (HOSTDATA(shpnt)->parity)
604 #define SYNCHRONOUS (HOSTDATA(shpnt)->synchronous)
606 #define HOSTIOPORT0 (HOSTDATA(shpnt)->io_port0)
607 #define HOSTIOPORT1 (HOSTDATA(shpnt)->io_port1)
609 #define SCDATA(SCpnt) ((struct aha152x_scdata *) (SCpnt)->host_scribble)
610 #define SCNEXT(SCpnt) SCDATA(SCpnt)->next
611 #define SCSEM(SCpnt) SCDATA(SCpnt)->done
613 #define SG_ADDRESS(buffer) ((char *) (page_address((buffer)->page)+(buffer)->offset))
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 completion *complete,
973 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;
1017 SCSEM(SCpnt) = complete;
1019 /* setup scratch area
1020 SCp.ptr : buffer pointer
1021 SCp.this_residual : buffer length
1022 SCp.buffer : next buffer
1023 SCp.buffers_residual : left buffers in list
1024 SCp.phase : current state of the command */
1025 if (SCpnt->use_sg) {
1026 SCpnt->SCp.buffer = (struct scatterlist *) SCpnt->request_buffer;
1027 SCpnt->SCp.ptr = SG_ADDRESS(SCpnt->SCp.buffer);
1028 SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length;
1029 SCpnt->SCp.buffers_residual = SCpnt->use_sg - 1;
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));
1088 complete(SCSEM(SCpnt));
1090 printk(KERN_ERR "aha152x: reset_done w/o completion\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));
1147 static int aha152x_device_reset(Scsi_Cmnd * SCpnt)
1149 struct Scsi_Host *shpnt = SCpnt->device->host;
1150 DECLARE_COMPLETION(done);
1151 int ret, issued, disconnected;
1152 unsigned char old_cmd_len = SCpnt->cmd_len;
1153 unsigned short old_use_sg = SCpnt->use_sg;
1154 void *old_buffer = SCpnt->request_buffer;
1155 unsigned old_bufflen = SCpnt->request_bufflen;
1156 unsigned long flags;
1157 unsigned long timeleft;
1159 #if defined(AHA152X_DEBUG)
1160 if(HOSTDATA(shpnt)->debug & debug_eh) {
1161 printk(INFO_LEAD "aha152x_device_reset(%p)", CMDINFO(SCpnt), SCpnt);
1166 if(CURRENT_SC==SCpnt) {
1167 printk(ERR_LEAD "cannot reset current device\n", CMDINFO(SCpnt));
1172 issued = remove_SC(&ISSUE_SC, SCpnt)==0;
1173 disconnected = issued && remove_SC(&DISCONNECTED_SC, SCpnt);
1178 SCpnt->request_buffer = NULL;
1179 SCpnt->request_bufflen = 0;
1181 aha152x_internal_queue(SCpnt, &done, resetting, reset_done);
1183 timeleft = wait_for_completion_timeout(&done, 100*HZ);
1185 /* remove command from issue queue */
1187 remove_SC(&ISSUE_SC, SCpnt);
1191 SCpnt->cmd_len = old_cmd_len;
1192 SCpnt->use_sg = old_use_sg;
1193 SCpnt->request_buffer = old_buffer;
1194 SCpnt->request_bufflen = old_bufflen;
1198 if(SCpnt->SCp.phase & resetted) {
1199 HOSTDATA(shpnt)->commands--;
1200 if (!HOSTDATA(shpnt)->commands)
1202 kfree(SCpnt->host_scribble);
1203 SCpnt->host_scribble=NULL;
1209 append_SC(&ISSUE_SC, SCpnt);
1210 } else if(disconnected) {
1211 append_SC(&DISCONNECTED_SC, SCpnt);
1221 static void free_hard_reset_SCs(struct Scsi_Host *shpnt, Scsi_Cmnd **SCs)
1232 printk(DEBUG_LEAD "queue corrupted at %p\n", CMDINFO(ptr), ptr);
1236 if (!ptr->device->soft_reset) {
1237 DPRINTK(debug_eh, DEBUG_LEAD "disconnected command %p removed\n", CMDINFO(ptr), ptr);
1238 remove_SC(SCs, ptr);
1239 HOSTDATA(shpnt)->commands--;
1240 kfree(ptr->host_scribble);
1241 ptr->host_scribble=NULL;
1252 static int aha152x_bus_reset_host(struct Scsi_Host *shpnt)
1254 unsigned long flags;
1258 #if defined(AHA152X_DEBUG)
1259 if(HOSTDATA(shpnt)->debug & debug_eh) {
1260 printk(KERN_DEBUG "scsi%d: bus reset", shpnt->host_no);
1265 free_hard_reset_SCs(shpnt, &ISSUE_SC);
1266 free_hard_reset_SCs(shpnt, &DISCONNECTED_SC);
1268 DPRINTK(debug_eh, KERN_DEBUG "scsi%d: resetting bus\n", shpnt->host_no);
1270 SETPORT(SCSISEQ, SCSIRSTO);
1272 SETPORT(SCSISEQ, 0);
1275 DPRINTK(debug_eh, KERN_DEBUG "scsi%d: bus resetted\n", shpnt->host_no);
1277 setup_expected_interrupts(shpnt);
1278 if(HOSTDATA(shpnt)->commands==0)
1290 static int aha152x_bus_reset(Scsi_Cmnd *SCpnt)
1292 return aha152x_bus_reset_host(SCpnt->device->host);
1296 * Restore default values to the AIC-6260 registers and reset the fifos
1299 static void reset_ports(struct Scsi_Host *shpnt)
1301 unsigned long flags;
1303 /* disable interrupts */
1304 SETPORT(DMACNTRL0, RSTFIFO);
1306 SETPORT(SCSISEQ, 0);
1308 SETPORT(SXFRCTL1, 0);
1309 SETPORT(SCSISIG, 0);
1312 /* clear all interrupt conditions */
1313 SETPORT(SSTAT0, 0x7f);
1314 SETPORT(SSTAT1, 0xef);
1316 SETPORT(SSTAT4, SYNCERR | FWERR | FRERR);
1318 SETPORT(DMACNTRL0, 0);
1319 SETPORT(DMACNTRL1, 0);
1321 SETPORT(BRSTCNTRL, 0xf1);
1323 /* clear SCSI fifos and transfer count */
1324 SETPORT(SXFRCTL0, CH1|CLRCH1|CLRSTCNT);
1325 SETPORT(SXFRCTL0, CH1);
1328 setup_expected_interrupts(shpnt);
1333 * Reset the host (bus and controller)
1336 int aha152x_host_reset_host(struct Scsi_Host *shpnt)
1338 DPRINTK(debug_eh, KERN_DEBUG "scsi%d: host reset\n", shpnt->host_no);
1340 aha152x_bus_reset_host(shpnt);
1342 DPRINTK(debug_eh, KERN_DEBUG "scsi%d: resetting ports\n", shpnt->host_no);
1349 * Reset the host (bus and controller)
1352 static int aha152x_host_reset(Scsi_Cmnd *SCpnt)
1354 return aha152x_host_reset_host(SCpnt->device->host);
1358 * Return the "logical geometry"
1361 static int aha152x_biosparam(struct scsi_device *sdev, struct block_device *bdev,
1362 sector_t capacity, int *info_array)
1364 struct Scsi_Host *shpnt = sdev->host;
1366 /* try default translation */
1369 info_array[2] = (unsigned long)capacity / (64 * 32);
1371 /* for disks >1GB do some guessing */
1372 if (info_array[2] >= 1024) {
1375 /* try to figure out the geometry from the partition table */
1376 if (scsicam_bios_param(bdev, capacity, info) < 0 ||
1377 !((info[0] == 64 && info[1] == 32) || (info[0] == 255 && info[1] == 63))) {
1380 "aha152x: unable to verify geometry for disk with >1GB.\n"
1381 " using extended translation.\n");
1382 info_array[0] = 255;
1384 info_array[2] = (unsigned long)capacity / (255 * 63);
1387 "aha152x: unable to verify geometry for disk with >1GB.\n"
1388 " Using default translation. Please verify yourself.\n"
1389 " Perhaps you need to enable extended translation in the driver.\n"
1390 " See Documentation/scsi/aha152x.txt for details.\n");
1393 info_array[0] = info[0];
1394 info_array[1] = info[1];
1395 info_array[2] = info[2];
1397 if (info[0] == 255 && !EXT_TRANS) {
1399 "aha152x: current partition table is using extended translation.\n"
1400 " using it also, although it's not explicitly enabled.\n");
1409 * Internal done function
1412 static void done(struct Scsi_Host *shpnt, int error)
1416 printk(ERR_LEAD "there's already a completed command %p - will cause abort\n", CMDINFO(CURRENT_SC), DONE_SC);
1418 DONE_SC = CURRENT_SC;
1420 DONE_SC->result = error;
1422 printk(KERN_ERR "aha152x: done() called outside of command\n");
1425 static struct work_struct aha152x_tq;
1428 * Run service completions on the card with interrupts enabled.
1431 static void run(struct work_struct *work)
1433 struct aha152x_hostdata *hd;
1435 list_for_each_entry(hd, &aha152x_host_list, host_list) {
1436 struct Scsi_Host *shost = container_of((void *)hd, struct Scsi_Host, hostdata);
1446 static irqreturn_t intr(int irqno, void *dev_id)
1448 struct Scsi_Host *shpnt = (struct Scsi_Host *)dev_id;
1449 unsigned long flags;
1450 unsigned char rev, dmacntrl0;
1453 printk(KERN_ERR "aha152x: catched interrupt %d for unknown controller.\n", irqno);
1458 * Read a couple of registers that are known to not be all 1's. If
1459 * we read all 1's (-1), that means that either:
1461 * a. The host adapter chip has gone bad, and we cannot control it,
1463 * b. The host adapter is a PCMCIA card that has been ejected
1465 * In either case, we cannot do anything with the host adapter at
1466 * this point in time. So just ignore the interrupt and return.
1467 * In the latter case, the interrupt might actually be meant for
1468 * someone else sharing this IRQ, and that driver will handle it.
1471 dmacntrl0 = GETPORT(DMACNTRL0);
1472 if ((rev == 0xFF) && (dmacntrl0 == 0xFF))
1475 if( TESTLO(DMASTAT, INTSTAT) )
1478 /* no more interrupts from the controller, while we're busy.
1479 INTEN is restored by the BH handler */
1480 CLRBITS(DMACNTRL0, INTEN);
1483 if( HOSTDATA(shpnt)->service==0 ) {
1484 HOSTDATA(shpnt)->service=1;
1486 /* Poke the BH handler */
1487 INIT_WORK(&aha152x_tq, run);
1488 schedule_work(&aha152x_tq);
1497 * - handle completition/disconnection/error of current command
1498 * - start selection for next command (if any)
1500 static void busfree_run(struct Scsi_Host *shpnt)
1502 unsigned long flags;
1503 #if defined(AHA152X_STAT)
1507 SETPORT(SXFRCTL0, CH1|CLRCH1|CLRSTCNT);
1508 SETPORT(SXFRCTL0, CH1);
1510 SETPORT(SSTAT1, CLRBUSFREE);
1513 #if defined(AHA152X_STAT)
1516 CURRENT_SC->SCp.phase &= ~syncneg;
1518 if(CURRENT_SC->SCp.phase & completed) {
1519 /* target sent COMMAND COMPLETE */
1520 done(shpnt, (CURRENT_SC->SCp.Status & 0xff) | ((CURRENT_SC->SCp.Message & 0xff) << 8) | (DID_OK << 16));
1522 } else if(CURRENT_SC->SCp.phase & aborted) {
1523 DPRINTK(debug_eh, DEBUG_LEAD "ABORT sent\n", CMDINFO(CURRENT_SC));
1524 done(shpnt, (CURRENT_SC->SCp.Status & 0xff) | ((CURRENT_SC->SCp.Message & 0xff) << 8) | (DID_ABORT << 16));
1526 } else if(CURRENT_SC->SCp.phase & resetted) {
1527 DPRINTK(debug_eh, DEBUG_LEAD "BUS DEVICE RESET sent\n", CMDINFO(CURRENT_SC));
1528 done(shpnt, (CURRENT_SC->SCp.Status & 0xff) | ((CURRENT_SC->SCp.Message & 0xff) << 8) | (DID_RESET << 16));
1530 } else if(CURRENT_SC->SCp.phase & disconnected) {
1531 /* target sent DISCONNECT */
1532 DPRINTK(debug_selection, DEBUG_LEAD "target disconnected at %d/%d\n",
1533 CMDINFO(CURRENT_SC),
1535 CURRENT_SC->request_bufflen);
1536 #if defined(AHA152X_STAT)
1537 HOSTDATA(shpnt)->disconnections++;
1539 append_SC(&DISCONNECTED_SC, CURRENT_SC);
1540 CURRENT_SC->SCp.phase |= 1 << 16;
1544 done(shpnt, DID_ERROR << 16);
1546 #if defined(AHA152X_STAT)
1548 HOSTDATA(shpnt)->busfree_without_old_command++;
1555 #if defined(AHA152X_STAT)
1559 if(DONE_SC->SCp.phase & check_condition) {
1560 struct scsi_cmnd *cmd = HOSTDATA(shpnt)->done_SC;
1561 struct aha152x_scdata *sc = SCDATA(cmd);
1564 if(HOSTDATA(shpnt)->debug & debug_eh) {
1565 printk(ERR_LEAD "received sense: ", CMDINFO(DONE_SC));
1566 scsi_print_sense("bh", DONE_SC);
1570 /* restore old command */
1571 memcpy(cmd->cmnd, sc->cmnd, sizeof(sc->cmnd));
1572 cmd->request_buffer = sc->request_buffer;
1573 cmd->request_bufflen = sc->request_bufflen;
1574 cmd->use_sg = sc->use_sg;
1575 cmd->cmd_len = sc->cmd_len;
1577 cmd->SCp.Status = 0x02;
1579 HOSTDATA(shpnt)->commands--;
1580 if (!HOSTDATA(shpnt)->commands)
1581 SETPORT(PORTA, 0); /* turn led off */
1582 } else if(DONE_SC->SCp.Status==0x02) {
1583 #if defined(AHA152X_STAT)
1584 HOSTDATA(shpnt)->busfree_with_check_condition++;
1587 DPRINTK(debug_eh, ERR_LEAD "CHECK CONDITION found\n", CMDINFO(DONE_SC));
1590 if(!(DONE_SC->SCp.Status & not_issued)) {
1591 Scsi_Cmnd *ptr = DONE_SC;
1594 DPRINTK(debug_eh, ERR_LEAD "requesting sense\n", CMDINFO(ptr));
1597 ptr->cmnd[0] = REQUEST_SENSE;
1601 ptr->cmnd[4] = sizeof(ptr->sense_buffer);
1605 ptr->request_buffer = ptr->sense_buffer;
1606 ptr->request_bufflen = sizeof(ptr->sense_buffer);
1609 aha152x_internal_queue(ptr, NULL, check_condition, ptr->scsi_done);
1613 DPRINTK(debug_eh, ERR_LEAD "command not issued - CHECK CONDITION ignored\n", CMDINFO(DONE_SC));
1618 if(DONE_SC && DONE_SC->scsi_done) {
1619 #if defined(AHA152X_DEBUG)
1620 int hostno=DONE_SC->device->host->host_no;
1621 int id=DONE_SC->device->id & 0xf;
1622 int lun=DONE_SC->device->lun & 0x7;
1624 Scsi_Cmnd *ptr = DONE_SC;
1627 /* turn led off, when no commands are in the driver */
1628 HOSTDATA(shpnt)->commands--;
1629 if (!HOSTDATA(shpnt)->commands)
1630 SETPORT(PORTA, 0); /* turn led off */
1632 if(ptr->scsi_done != reset_done) {
1633 kfree(ptr->host_scribble);
1634 ptr->host_scribble=NULL;
1638 DPRINTK(debug_done, DEBUG_LEAD "calling scsi_done(%p)\n", hostno, id, lun, ptr);
1639 ptr->scsi_done(ptr);
1640 DPRINTK(debug_done, DEBUG_LEAD "scsi_done(%p) returned\n", hostno, id, lun, ptr);
1645 #if defined(AHA152X_STAT)
1647 HOSTDATA(shpnt)->busfree_without_done_command++;
1652 CURRENT_SC = remove_first_SC(&ISSUE_SC);
1657 #if defined(AHA152X_STAT)
1660 CURRENT_SC->SCp.phase |= selecting;
1662 DPRINTK(debug_selection, DEBUG_LEAD "selecting target\n", CMDINFO(CURRENT_SC));
1664 /* clear selection timeout */
1665 SETPORT(SSTAT1, SELTO);
1667 SETPORT(SCSIID, (shpnt->this_id << OID_) | CURRENT_SC->device->id);
1668 SETPORT(SXFRCTL1, (PARITY ? ENSPCHK : 0 ) | ENSTIMER);
1669 SETPORT(SCSISEQ, ENSELO | ENAUTOATNO | (DISCONNECTED_SC ? ENRESELI : 0));
1671 #if defined(AHA152X_STAT)
1672 HOSTDATA(shpnt)->busfree_without_new_command++;
1674 SETPORT(SCSISEQ, DISCONNECTED_SC ? ENRESELI : 0);
1677 #if defined(AHA152X_STAT)
1679 HOSTDATA(shpnt)->busfree_without_any_action++;
1684 * Selection done (OUT)
1685 * - queue IDENTIFY message and SDTR to selected target for message out
1686 * (ATN asserted automagically via ENAUTOATNO in busfree())
1688 static void seldo_run(struct Scsi_Host *shpnt)
1690 SETPORT(SCSISIG, 0);
1691 SETPORT(SSTAT1, CLRBUSFREE);
1692 SETPORT(SSTAT1, CLRPHASECHG);
1694 CURRENT_SC->SCp.phase &= ~(selecting|not_issued);
1696 SETPORT(SCSISEQ, 0);
1698 if (TESTLO(SSTAT0, SELDO)) {
1699 printk(ERR_LEAD "aha152x: passing bus free condition\n", CMDINFO(CURRENT_SC));
1700 done(shpnt, DID_NO_CONNECT << 16);
1704 SETPORT(SSTAT0, CLRSELDO);
1706 ADDMSGO(IDENTIFY(RECONNECT, CURRENT_SC->device->lun));
1708 if (CURRENT_SC->SCp.phase & aborting) {
1710 } else if (CURRENT_SC->SCp.phase & resetting) {
1711 ADDMSGO(BUS_DEVICE_RESET);
1712 } else if (SYNCNEG==0 && SYNCHRONOUS) {
1713 CURRENT_SC->SCp.phase |= syncneg;
1714 MSGOLEN += spi_populate_sync_msg(&MSGO(MSGOLEN), 50, 8);
1715 SYNCNEG=1; /* negotiation in progress */
1723 * - return command to mid-level with failure cause
1726 static void selto_run(struct Scsi_Host *shpnt)
1728 SETPORT(SCSISEQ, 0);
1729 SETPORT(SSTAT1, CLRSELTIMO);
1731 DPRINTK(debug_selection, DEBUG_LEAD "selection timeout\n", CMDINFO(CURRENT_SC));
1734 DPRINTK(debug_selection, DEBUG_LEAD "!CURRENT_SC\n", CMDINFO(CURRENT_SC));
1738 CURRENT_SC->SCp.phase &= ~selecting;
1740 if (CURRENT_SC->SCp.phase & aborted) {
1741 DPRINTK(debug_selection, DEBUG_LEAD "aborted\n", CMDINFO(CURRENT_SC));
1742 done(shpnt, DID_ABORT << 16);
1743 } else if (TESTLO(SSTAT0, SELINGO)) {
1744 DPRINTK(debug_selection, DEBUG_LEAD "arbitration not won\n", CMDINFO(CURRENT_SC));
1745 done(shpnt, DID_BUS_BUSY << 16);
1747 /* ARBITRATION won, but SELECTION failed */
1748 DPRINTK(debug_selection, DEBUG_LEAD "selection failed\n", CMDINFO(CURRENT_SC));
1749 done(shpnt, DID_NO_CONNECT << 16);
1755 * - put current command back to issue queue
1756 * (reconnection of a disconnected nexus instead
1757 * of successful selection out)
1760 static void seldi_run(struct Scsi_Host *shpnt)
1764 unsigned long flags;
1766 SETPORT(SCSISIG, 0);
1767 SETPORT(SSTAT0, CLRSELDI);
1768 SETPORT(SSTAT1, CLRBUSFREE);
1769 SETPORT(SSTAT1, CLRPHASECHG);
1772 if(!(CURRENT_SC->SCp.phase & not_issued))
1773 printk(ERR_LEAD "command should not have been issued yet\n", CMDINFO(CURRENT_SC));
1775 DPRINTK(debug_selection, ERR_LEAD "command requeued - reselection\n", CMDINFO(CURRENT_SC));
1778 append_SC(&ISSUE_SC, CURRENT_SC);
1784 if(!DISCONNECTED_SC) {
1785 DPRINTK(debug_selection, DEBUG_LEAD "unexpected SELDI ", CMDINFO(CURRENT_SC));
1791 selid = GETPORT(SELID) & ~(1 << shpnt->this_id);
1794 printk("aha152x%d: target id unknown (%02x)\n", HOSTNO, selid);
1798 for(target=7; !(selid & (1 << target)); target--)
1801 if(selid & ~(1 << target)) {
1802 printk("aha152x%d: multiple targets reconnected (%02x)\n",
1807 SETPORT(SCSIID, (shpnt->this_id << OID_) | target);
1808 SETPORT(SCSISEQ, 0);
1810 SETRATE(HOSTDATA(shpnt)->syncrate[target]);
1812 RECONN_TARGET=target;
1813 DPRINTK(debug_selection, DEBUG_LEAD "target %d reselected (%02x).\n", CMDINFO(CURRENT_SC), target, selid);
1818 * - handle initial message after reconnection to identify
1819 * reconnecting nexus
1820 * - queue command on DISCONNECTED_SC on DISCONNECT message
1821 * - set completed flag on COMMAND COMPLETE
1822 * (other completition code moved to busfree_run)
1823 * - handle response to SDTR
1824 * - clear synchronous transfer agreements on BUS RESET
1826 * FIXME: what about SAVE POINTERS, RESTORE POINTERS?
1829 static void msgi_run(struct Scsi_Host *shpnt)
1832 int sstat1 = GETPORT(SSTAT1);
1834 if(sstat1 & (PHASECHG|PHASEMIS|BUSFREE) || !(sstat1 & REQINIT))
1837 if(TESTLO(SSTAT0,SPIORDY)) {
1838 DPRINTK(debug_msgi, DEBUG_LEAD "!SPIORDY\n", CMDINFO(CURRENT_SC));
1842 ADDMSGI(GETPORT(SCSIDAT));
1844 #if defined(AHA152X_DEBUG)
1845 if (HOSTDATA(shpnt)->debug & debug_msgi) {
1846 printk(INFO_LEAD "inbound message %02x ", CMDINFO(CURRENT_SC), MSGI(0));
1847 spi_print_msg(&MSGI(0));
1853 if(LASTSTATE!=seldi) {
1854 printk(KERN_ERR "aha152x%d: message in w/o current command not after reselection\n", HOSTNO);
1858 * Handle reselection
1860 if(!(MSGI(0) & IDENTIFY_BASE)) {
1861 printk(KERN_ERR "aha152x%d: target didn't identify after reselection\n", HOSTNO);
1865 CURRENT_SC = remove_lun_SC(&DISCONNECTED_SC, RECONN_TARGET, MSGI(0) & 0x3f);
1869 printk(KERN_ERR "aha152x%d: no disconnected command for target %d/%d\n", HOSTNO, RECONN_TARGET, MSGI(0) & 0x3f);
1873 DPRINTK(debug_msgi, DEBUG_LEAD "target reconnected\n", CMDINFO(CURRENT_SC));
1875 CURRENT_SC->SCp.Message = MSGI(0);
1876 CURRENT_SC->SCp.phase &= ~disconnected;
1880 /* next message if any */
1884 CURRENT_SC->SCp.Message = MSGI(0);
1889 printk(WARN_LEAD "target was not allowed to disconnect\n", CMDINFO(CURRENT_SC));
1891 CURRENT_SC->SCp.phase |= disconnected;
1894 case COMMAND_COMPLETE:
1895 if(CURRENT_SC->SCp.phase & completed)
1896 DPRINTK(debug_msgi, DEBUG_LEAD "again COMMAND COMPLETE\n", CMDINFO(CURRENT_SC));
1898 CURRENT_SC->SCp.phase |= completed;
1901 case MESSAGE_REJECT:
1903 printk(INFO_LEAD "Synchronous Data Transfer Request was rejected\n", CMDINFO(CURRENT_SC));
1904 SYNCNEG=2; /* negotiation completed */
1906 printk(INFO_LEAD "inbound message (MESSAGE REJECT)\n", CMDINFO(CURRENT_SC));
1912 case RESTORE_POINTERS:
1915 case EXTENDED_MESSAGE:
1916 if(MSGILEN<2 || MSGILEN<MSGI(1)+2) {
1917 /* not yet completed */
1927 printk(ERR_LEAD "SDTR message length!=3\n", CMDINFO(CURRENT_SC));
1931 if (!HOSTDATA(shpnt)->synchronous)
1934 printk(INFO_LEAD, CMDINFO(CURRENT_SC));
1935 spi_print_msg(&MSGI(0));
1938 ticks = (MSGI(3) * 4 + 49) / 50;
1941 /* negotiation in progress */
1942 if (ticks > 9 || MSGI(4) < 1 || MSGI(4) > 8) {
1943 ADDMSGO(MESSAGE_REJECT);
1944 printk(INFO_LEAD "received Synchronous Data Transfer Request invalid - rejected\n", CMDINFO(CURRENT_SC));
1948 SYNCRATE |= ((ticks - 2) << 4) + MSGI(4);
1949 } else if (ticks <= 9 && MSGI(4) >= 1) {
1950 ADDMSGO(EXTENDED_MESSAGE);
1952 ADDMSGO(EXTENDED_SDTR);
1964 SYNCRATE |= ((ticks - 2) << 4) + MSGI(4);
1966 /* requested SDTR is too slow, do it asynchronously */
1967 printk(INFO_LEAD "Synchronous Data Transfer Request too slow - Rejecting\n", CMDINFO(CURRENT_SC));
1968 ADDMSGO(MESSAGE_REJECT);
1971 SYNCNEG=2; /* negotiation completed */
1976 case BUS_DEVICE_RESET:
1980 for(i=0; i<8; i++) {
1981 HOSTDATA(shpnt)->syncrate[i]=0;
1982 HOSTDATA(shpnt)->syncneg[i]=0;
1988 case EXTENDED_MODIFY_DATA_POINTER:
1989 case EXTENDED_EXTENDED_IDENTIFY:
1992 ADDMSGO(MESSAGE_REJECT);
2002 static void msgi_end(struct Scsi_Host *shpnt)
2005 printk(WARN_LEAD "target left before message completed (%d)\n", CMDINFO(CURRENT_SC), MSGILEN);
2007 if (MSGOLEN > 0 && !(GETPORT(SSTAT1) & BUSFREE)) {
2008 DPRINTK(debug_msgi, DEBUG_LEAD "msgo pending\n", CMDINFO(CURRENT_SC));
2009 SETPORT(SCSISIG, P_MSGI | SIG_ATNO);
2017 static void msgo_init(struct Scsi_Host *shpnt)
2020 if((CURRENT_SC->SCp.phase & syncneg) && SYNCNEG==2 && SYNCRATE==0) {
2021 ADDMSGO(IDENTIFY(RECONNECT, CURRENT_SC->device->lun));
2023 printk(INFO_LEAD "unexpected MESSAGE OUT phase; rejecting\n", CMDINFO(CURRENT_SC));
2024 ADDMSGO(MESSAGE_REJECT);
2028 #if defined(AHA152X_DEBUG)
2029 if(HOSTDATA(shpnt)->debug & debug_msgo) {
2032 printk(DEBUG_LEAD "messages( ", CMDINFO(CURRENT_SC));
2033 for (i=0; i<MSGOLEN; i+=spi_print_msg(&MSGO(i)), printk(" "))
2044 static void msgo_run(struct Scsi_Host *shpnt)
2047 DPRINTK(debug_msgo, DEBUG_LEAD "messages all sent (%d/%d)\n", CMDINFO(CURRENT_SC), MSGO_I, MSGOLEN);
2049 while(MSGO_I<MSGOLEN) {
2050 DPRINTK(debug_msgo, DEBUG_LEAD "message byte %02x (%d/%d)\n", CMDINFO(CURRENT_SC), MSGO(MSGO_I), MSGO_I, MSGOLEN);
2052 if(TESTLO(SSTAT0, SPIORDY)) {
2053 DPRINTK(debug_msgo, DEBUG_LEAD "!SPIORDY\n", CMDINFO(CURRENT_SC));
2057 if (MSGO_I==MSGOLEN-1) {
2058 /* Leave MESSAGE OUT after transfer */
2059 SETPORT(SSTAT1, CLRATNO);
2063 if (MSGO(MSGO_I) & IDENTIFY_BASE)
2064 CURRENT_SC->SCp.phase |= identified;
2066 if (MSGO(MSGO_I)==ABORT)
2067 CURRENT_SC->SCp.phase |= aborted;
2069 if (MSGO(MSGO_I)==BUS_DEVICE_RESET)
2070 CURRENT_SC->SCp.phase |= resetted;
2072 SETPORT(SCSIDAT, MSGO(MSGO_I++));
2076 static void msgo_end(struct Scsi_Host *shpnt)
2078 if(MSGO_I<MSGOLEN) {
2079 printk(ERR_LEAD "message sent incompletely (%d/%d)\n", CMDINFO(CURRENT_SC), MSGO_I, MSGOLEN);
2081 printk(INFO_LEAD "Synchronous Data Transfer Request was rejected\n", CMDINFO(CURRENT_SC));
2094 static void cmd_init(struct Scsi_Host *shpnt)
2096 if (CURRENT_SC->SCp.sent_command) {
2097 printk(ERR_LEAD "command already sent\n", CMDINFO(CURRENT_SC));
2098 done(shpnt, DID_ERROR << 16);
2102 #if defined(AHA152X_DEBUG)
2103 if (HOSTDATA(shpnt)->debug & debug_cmd) {
2104 printk(DEBUG_LEAD "cmd_init: ", CMDINFO(CURRENT_SC));
2105 __scsi_print_command(CURRENT_SC->cmnd);
2116 static void cmd_run(struct Scsi_Host *shpnt)
2118 if(CMD_I==CURRENT_SC->cmd_len) {
2119 DPRINTK(debug_cmd, DEBUG_LEAD "command already completely sent (%d/%d)", CMDINFO(CURRENT_SC), CMD_I, CURRENT_SC->cmd_len);
2123 while(CMD_I<CURRENT_SC->cmd_len) {
2124 DPRINTK(debug_cmd, DEBUG_LEAD "command byte %02x (%d/%d)\n", CMDINFO(CURRENT_SC), CURRENT_SC->cmnd[CMD_I], CMD_I, CURRENT_SC->cmd_len);
2126 if(TESTLO(SSTAT0, SPIORDY)) {
2127 DPRINTK(debug_cmd, DEBUG_LEAD "!SPIORDY\n", CMDINFO(CURRENT_SC));
2131 SETPORT(SCSIDAT, CURRENT_SC->cmnd[CMD_I++]);
2135 static void cmd_end(struct Scsi_Host *shpnt)
2137 if(CMD_I<CURRENT_SC->cmd_len)
2138 printk(ERR_LEAD "command sent incompletely (%d/%d)\n", CMDINFO(CURRENT_SC), CMD_I, CURRENT_SC->cmd_len);
2140 CURRENT_SC->SCp.sent_command++;
2147 static void status_run(struct Scsi_Host *shpnt)
2149 if(TESTLO(SSTAT0,SPIORDY)) {
2150 DPRINTK(debug_status, DEBUG_LEAD "!SPIORDY\n", CMDINFO(CURRENT_SC));
2154 CURRENT_SC->SCp.Status = GETPORT(SCSIDAT);
2156 #if defined(AHA152X_DEBUG)
2157 if (HOSTDATA(shpnt)->debug & debug_status) {
2158 printk(DEBUG_LEAD "inbound status %02x ", CMDINFO(CURRENT_SC), CURRENT_SC->SCp.Status);
2159 scsi_print_status(CURRENT_SC->SCp.Status);
2169 static void datai_init(struct Scsi_Host *shpnt)
2171 SETPORT(DMACNTRL0, RSTFIFO);
2172 SETPORT(DMACNTRL0, RSTFIFO|ENDMA);
2174 SETPORT(SXFRCTL0, CH1|CLRSTCNT);
2175 SETPORT(SXFRCTL0, CH1|SCSIEN|DMAEN);
2177 SETPORT(SIMODE0, 0);
2178 SETPORT(SIMODE1, ENSCSIPERR | ENSCSIRST | ENPHASEMIS | ENBUSFREE);
2181 DPRINTK(debug_datai,
2182 DEBUG_LEAD "datai_init: request_bufflen=%d resid=%d\n",
2183 CMDINFO(CURRENT_SC), CURRENT_SC->request_bufflen, CURRENT_SC->resid);
2186 static void datai_run(struct Scsi_Host *shpnt)
2188 unsigned long the_time;
2189 int fifodata, data_count;
2192 * loop while the phase persists or the fifos are not empty
2195 while(TESTLO(DMASTAT, INTSTAT) || TESTLO(DMASTAT, DFIFOEMP) || TESTLO(SSTAT2, SEMPTY)) {
2196 /* FIXME: maybe this should be done by setting up
2197 * STCNT to trigger ENSWRAP interrupt, instead of
2198 * polling for DFIFOFULL
2200 the_time=jiffies + 100*HZ;
2201 while(TESTLO(DMASTAT, DFIFOFULL|INTSTAT) && time_before(jiffies,the_time))
2204 if(TESTLO(DMASTAT, DFIFOFULL|INTSTAT)) {
2205 printk(ERR_LEAD "datai timeout", CMDINFO(CURRENT_SC));
2210 if(TESTHI(DMASTAT, DFIFOFULL)) {
2213 the_time=jiffies + 100*HZ;
2214 while(TESTLO(SSTAT2, SEMPTY) && time_before(jiffies,the_time))
2217 if(TESTLO(SSTAT2, SEMPTY)) {
2218 printk(ERR_LEAD "datai sempty timeout", CMDINFO(CURRENT_SC));
2223 fifodata = GETPORT(FIFOSTAT);
2226 if(CURRENT_SC->SCp.this_residual>0) {
2227 while(fifodata>0 && CURRENT_SC->SCp.this_residual>0) {
2228 data_count = fifodata>CURRENT_SC->SCp.this_residual ?
2229 CURRENT_SC->SCp.this_residual :
2231 fifodata -= data_count;
2233 if(data_count & 1) {
2234 DPRINTK(debug_datai, DEBUG_LEAD "8bit\n", CMDINFO(CURRENT_SC));
2235 SETPORT(DMACNTRL0, ENDMA|_8BIT);
2236 *CURRENT_SC->SCp.ptr++ = GETPORT(DATAPORT);
2237 CURRENT_SC->SCp.this_residual--;
2239 SETPORT(DMACNTRL0, ENDMA);
2242 if(data_count > 1) {
2243 DPRINTK(debug_datai, DEBUG_LEAD "16bit(%d)\n", CMDINFO(CURRENT_SC), data_count);
2245 insw(DATAPORT, CURRENT_SC->SCp.ptr, data_count);
2246 CURRENT_SC->SCp.ptr += 2 * data_count;
2247 CURRENT_SC->SCp.this_residual -= 2 * data_count;
2248 DATA_LEN += 2 * data_count;
2251 if(CURRENT_SC->SCp.this_residual==0 && CURRENT_SC->SCp.buffers_residual>0) {
2252 /* advance to next buffer */
2253 CURRENT_SC->SCp.buffers_residual--;
2254 CURRENT_SC->SCp.buffer++;
2255 CURRENT_SC->SCp.ptr = SG_ADDRESS(CURRENT_SC->SCp.buffer);
2256 CURRENT_SC->SCp.this_residual = CURRENT_SC->SCp.buffer->length;
2259 } else if(fifodata>0) {
2260 printk(ERR_LEAD "no buffers left for %d(%d) bytes (data overrun!?)\n", CMDINFO(CURRENT_SC), fifodata, GETPORT(FIFOSTAT));
2261 SETPORT(DMACNTRL0, ENDMA|_8BIT);
2264 data=GETPORT(DATAPORT);
2265 DPRINTK(debug_datai, DEBUG_LEAD "data=%02x\n", CMDINFO(CURRENT_SC), data);
2269 SETPORT(DMACNTRL0, ENDMA|_8BIT);
2273 if(TESTLO(DMASTAT, INTSTAT) ||
2274 TESTLO(DMASTAT, DFIFOEMP) ||
2275 TESTLO(SSTAT2, SEMPTY) ||
2276 GETPORT(FIFOSTAT)>0) {
2278 * something went wrong, if there's something left in the fifos
2279 * or the phase didn't change
2281 printk(ERR_LEAD "fifos should be empty and phase should have changed\n", CMDINFO(CURRENT_SC));
2285 if(DATA_LEN!=GETSTCNT()) {
2287 "manual transfer count differs from automatic (count=%d;stcnt=%d;diff=%d;fifostat=%d)",
2288 CMDINFO(CURRENT_SC), DATA_LEN, GETSTCNT(), GETSTCNT()-DATA_LEN, GETPORT(FIFOSTAT));
2294 static void datai_end(struct Scsi_Host *shpnt)
2296 CURRENT_SC->resid -= GETSTCNT();
2298 DPRINTK(debug_datai,
2299 DEBUG_LEAD "datai_end: request_bufflen=%d resid=%d stcnt=%d\n",
2300 CMDINFO(CURRENT_SC), CURRENT_SC->request_bufflen, CURRENT_SC->resid, GETSTCNT());
2302 SETPORT(SXFRCTL0, CH1|CLRSTCNT);
2303 SETPORT(DMACNTRL0, 0);
2310 static void datao_init(struct Scsi_Host *shpnt)
2312 SETPORT(DMACNTRL0, WRITE_READ | RSTFIFO);
2313 SETPORT(DMACNTRL0, WRITE_READ | ENDMA);
2315 SETPORT(SXFRCTL0, CH1|CLRSTCNT);
2316 SETPORT(SXFRCTL0, CH1|SCSIEN|DMAEN);
2318 SETPORT(SIMODE0, 0);
2319 SETPORT(SIMODE1, ENSCSIPERR | ENSCSIRST | ENPHASEMIS | ENBUSFREE );
2321 DATA_LEN = CURRENT_SC->resid;
2323 DPRINTK(debug_datao,
2324 DEBUG_LEAD "datao_init: request_bufflen=%d; resid=%d\n",
2325 CMDINFO(CURRENT_SC), CURRENT_SC->request_bufflen, CURRENT_SC->resid);
2328 static void datao_run(struct Scsi_Host *shpnt)
2330 unsigned long the_time;
2333 /* until phase changes or all data sent */
2334 while(TESTLO(DMASTAT, INTSTAT) && CURRENT_SC->SCp.this_residual>0) {
2336 if(data_count > CURRENT_SC->SCp.this_residual)
2337 data_count=CURRENT_SC->SCp.this_residual;
2339 if(TESTLO(DMASTAT, DFIFOEMP)) {
2340 printk(ERR_LEAD "datao fifo not empty (%d)", CMDINFO(CURRENT_SC), GETPORT(FIFOSTAT));
2345 if(data_count & 1) {
2346 SETPORT(DMACNTRL0,WRITE_READ|ENDMA|_8BIT);
2347 SETPORT(DATAPORT, *CURRENT_SC->SCp.ptr++);
2348 CURRENT_SC->SCp.this_residual--;
2349 CURRENT_SC->resid--;
2350 SETPORT(DMACNTRL0,WRITE_READ|ENDMA);
2353 if(data_count > 1) {
2355 outsw(DATAPORT, CURRENT_SC->SCp.ptr, data_count);
2356 CURRENT_SC->SCp.ptr += 2 * data_count;
2357 CURRENT_SC->SCp.this_residual -= 2 * data_count;
2358 CURRENT_SC->resid -= 2 * data_count;
2361 if(CURRENT_SC->SCp.this_residual==0 && CURRENT_SC->SCp.buffers_residual>0) {
2362 /* advance to next buffer */
2363 CURRENT_SC->SCp.buffers_residual--;
2364 CURRENT_SC->SCp.buffer++;
2365 CURRENT_SC->SCp.ptr = SG_ADDRESS(CURRENT_SC->SCp.buffer);
2366 CURRENT_SC->SCp.this_residual = CURRENT_SC->SCp.buffer->length;
2369 the_time=jiffies + 100*HZ;
2370 while(TESTLO(DMASTAT, DFIFOEMP|INTSTAT) && time_before(jiffies,the_time))
2373 if(TESTLO(DMASTAT, DFIFOEMP|INTSTAT)) {
2374 printk(ERR_LEAD "dataout timeout", CMDINFO(CURRENT_SC));
2381 static void datao_end(struct Scsi_Host *shpnt)
2383 if(TESTLO(DMASTAT, DFIFOEMP)) {
2384 int data_count = (DATA_LEN - CURRENT_SC->resid) - GETSTCNT();
2386 DPRINTK(debug_datao, DEBUG_LEAD "datao: %d bytes to resend (%d written, %d transferred)\n",
2387 CMDINFO(CURRENT_SC),
2389 DATA_LEN-CURRENT_SC->resid,
2392 CURRENT_SC->resid += data_count;
2394 if(CURRENT_SC->use_sg) {
2395 data_count -= CURRENT_SC->SCp.ptr - SG_ADDRESS(CURRENT_SC->SCp.buffer);
2396 while(data_count>0) {
2397 CURRENT_SC->SCp.buffer--;
2398 CURRENT_SC->SCp.buffers_residual++;
2399 data_count -= CURRENT_SC->SCp.buffer->length;
2401 CURRENT_SC->SCp.ptr = SG_ADDRESS(CURRENT_SC->SCp.buffer) - data_count;
2402 CURRENT_SC->SCp.this_residual = CURRENT_SC->SCp.buffer->length + data_count;
2404 CURRENT_SC->SCp.ptr -= data_count;
2405 CURRENT_SC->SCp.this_residual += data_count;
2409 DPRINTK(debug_datao, DEBUG_LEAD "datao_end: request_bufflen=%d; resid=%d; stcnt=%d\n",
2410 CMDINFO(CURRENT_SC),
2411 CURRENT_SC->request_bufflen,
2415 SETPORT(SXFRCTL0, CH1|CLRCH1|CLRSTCNT);
2416 SETPORT(SXFRCTL0, CH1);
2418 SETPORT(DMACNTRL0, 0);
2422 * figure out what state we're in
2425 static int update_state(struct Scsi_Host *shpnt)
2428 unsigned int stat0 = GETPORT(SSTAT0);
2429 unsigned int stat1 = GETPORT(SSTAT1);
2434 if(stat1 & SCSIRSTI) {
2437 SETPORT(SSTAT1,SCSIRSTI);
2438 } else if(stat0 & SELDI && PREVSTATE==busfree) {
2440 } else if(stat0 & SELDO && CURRENT_SC && (CURRENT_SC->SCp.phase & selecting)) {
2442 } else if(stat1 & SELTO) {
2444 } else if(stat1 & BUSFREE) {
2446 SETPORT(SSTAT1,BUSFREE);
2447 } else if(stat1 & SCSIPERR) {
2449 SETPORT(SSTAT1,SCSIPERR);
2450 } else if(stat1 & REQINIT) {
2451 switch(GETPORT(SCSISIG) & P_MASK) {
2452 case P_MSGI: STATE=msgi; break;
2453 case P_MSGO: STATE=msgo; break;
2454 case P_DATAO: STATE=datao; break;
2455 case P_DATAI: STATE=datai; break;
2456 case P_STATUS: STATE=status; break;
2457 case P_CMD: STATE=cmd; break;
2462 if((stat0 & SELDI) && STATE!=seldi && !dataphase) {
2463 printk(INFO_LEAD "reselection missed?", CMDINFO(CURRENT_SC));
2467 if(STATE!=PREVSTATE) {
2468 LASTSTATE=PREVSTATE;
2475 * handle parity error
2477 * FIXME: in which phase?
2480 static void parerr_run(struct Scsi_Host *shpnt)
2482 printk(ERR_LEAD "parity error\n", CMDINFO(CURRENT_SC));
2483 done(shpnt, DID_PARITY << 16);
2490 static void rsti_run(struct Scsi_Host *shpnt)
2494 printk(KERN_NOTICE "aha152x%d: scsi reset in\n", HOSTNO);
2496 ptr=DISCONNECTED_SC;
2498 Scsi_Cmnd *next = SCNEXT(ptr);
2500 if (!ptr->device->soft_reset) {
2501 remove_SC(&DISCONNECTED_SC, ptr);
2503 kfree(ptr->host_scribble);
2504 ptr->host_scribble=NULL;
2506 ptr->result = DID_RESET << 16;
2507 ptr->scsi_done(ptr);
2513 if(CURRENT_SC && !CURRENT_SC->device->soft_reset)
2514 done(shpnt, DID_RESET << 16 );
2519 * bottom-half handler
2522 static void is_complete(struct Scsi_Host *shpnt)
2525 unsigned long flags;
2533 if( HOSTDATA(shpnt)->service==0 ) {
2538 HOSTDATA(shpnt)->service = 0;
2540 if(HOSTDATA(shpnt)->in_intr) {
2542 /* aha152x_error never returns.. */
2543 aha152x_error(shpnt, "bottom-half already running!?");
2545 HOSTDATA(shpnt)->in_intr++;
2548 * loop while there are interrupt conditions pending
2552 unsigned long start = jiffies;
2555 dataphase=update_state(shpnt);
2557 DPRINTK(debug_phases, LEAD "start %s %s(%s)\n", CMDINFO(CURRENT_SC), states[STATE].name, states[PREVSTATE].name, states[LASTSTATE].name);
2560 * end previous state
2563 if(PREVSTATE!=STATE && states[PREVSTATE].end)
2564 states[PREVSTATE].end(shpnt);
2567 * disable SPIO mode if previous phase used it
2568 * and this one doesn't
2571 if(states[PREVSTATE].spio && !states[STATE].spio) {
2572 SETPORT(SXFRCTL0, CH1);
2573 SETPORT(DMACNTRL0, 0);
2575 CURRENT_SC->SCp.phase &= ~spiordy;
2579 * accept current dataphase phase
2583 SETPORT(SSTAT0, REQINIT);
2584 SETPORT(SCSISIG, GETPORT(SCSISIG) & P_MASK);
2585 SETPORT(SSTAT1, PHASECHG);
2589 * enable SPIO mode if previous didn't use it
2593 if(!states[PREVSTATE].spio && states[STATE].spio) {
2594 SETPORT(DMACNTRL0, 0);
2595 SETPORT(SXFRCTL0, CH1|SPIOEN);
2597 CURRENT_SC->SCp.phase |= spiordy;
2601 * initialize for new state
2604 if(PREVSTATE!=STATE && states[STATE].init)
2605 states[STATE].init(shpnt);
2608 * handle current state
2611 if(states[STATE].run)
2612 states[STATE].run(shpnt);
2614 printk(ERR_LEAD "unexpected state (%x)\n", CMDINFO(CURRENT_SC), STATE);
2617 * setup controller to interrupt on
2618 * the next expected condition and
2619 * loop if it's already there
2623 pending=setup_expected_interrupts(shpnt);
2624 #if defined(AHA152X_STAT)
2625 HOSTDATA(shpnt)->count[STATE]++;
2626 if(PREVSTATE!=STATE)
2627 HOSTDATA(shpnt)->count_trans[STATE]++;
2628 HOSTDATA(shpnt)->time[STATE] += jiffies-start;
2631 DPRINTK(debug_phases, LEAD "end %s %s(%s)\n", CMDINFO(CURRENT_SC), states[STATE].name, states[PREVSTATE].name, states[LASTSTATE].name);
2635 * enable interrupts and leave bottom-half
2638 HOSTDATA(shpnt)->in_intr--;
2639 SETBITS(DMACNTRL0, INTEN);
2645 * Dump the current driver status and panic
2647 static void aha152x_error(struct Scsi_Host *shpnt, char *msg)
2649 printk(KERN_EMERG "\naha152x%d: %s\n", HOSTNO, msg);
2651 panic("aha152x panic\n");
2655 * Display registers of AIC-6260
2657 static void disp_ports(struct Scsi_Host *shpnt)
2659 #if defined(AHA152X_DEBUG)
2662 printk("\n%s: %s(%s) ",
2663 CURRENT_SC ? "busy" : "waiting",
2665 states[PREVSTATE].name);
2667 s = GETPORT(SCSISEQ);
2668 printk("SCSISEQ( ");
2670 printk("TARGET MODE ");
2678 printk("AUTOATNO ");
2680 printk("AUTOATNI ");
2682 printk("AUTOATNP ");
2684 printk("SCSIRSTO ");
2687 printk(" SCSISIG(");
2688 s = GETPORT(SCSISIG);
2689 switch (s & P_MASK) {
2703 printk("MESSAGE OUT");
2706 printk("MESSAGE IN");
2709 printk("*invalid*");
2715 printk("INTSTAT (%s); ", TESTHI(DMASTAT, INTSTAT) ? "hi" : "lo");
2718 s = GETPORT(SSTAT0);
2736 s = GETPORT(SSTAT1);
2742 printk("SCSIRSTI ");
2744 printk("PHASEMIS ");
2748 printk("SCSIPERR ");
2750 printk("PHASECHG ");
2758 s = GETPORT(SSTAT0) & GETPORT(SIMODE0);
2777 s = GETPORT(SSTAT1) & GETPORT(SIMODE1);
2784 printk("SCSIRSTI ");
2786 printk("PHASEMIS ");
2790 printk("SCSIPERR ");
2792 printk("PHASECHG ");
2797 printk("SXFRCTL0( ");
2799 s = GETPORT(SXFRCTL0);
2807 printk("CLRSTCNT ");
2816 s = GETPORT(SCSISIG);
2829 printk("SELID (%02x), ", GETPORT(SELID));
2831 printk("STCNT (%d), ", GETSTCNT());
2835 s = GETPORT(SSTAT2);
2842 printk("); SFCNT (%d); ", s & (SFULL | SFCNT));
2844 s = GETPORT(SSTAT3);
2845 printk("SCSICNT (%d), OFFCNT(%d), ", (s & 0xf0) >> 4, s & 0x0f);
2848 s = GETPORT(SSTAT4);
2857 printk("DMACNTRL0( ");
2858 s = GETPORT(DMACNTRL0);
2859 printk("%s ", s & _8BIT ? "8BIT" : "16BIT");
2860 printk("%s ", s & DMA ? "DMA" : "PIO");
2861 printk("%s ", s & WRITE_READ ? "WRITE" : "READ");
2872 printk("DMASTAT( ");
2873 s = GETPORT(DMASTAT);
2879 printk("DFIFOFULL ");
2881 printk("DFIFOEMP ");
2887 * display enabled interrupts
2889 static void disp_enintr(struct Scsi_Host *shpnt)
2893 printk(KERN_DEBUG "enabled interrupts ( ");
2895 s = GETPORT(SIMODE0);
2901 printk("ENSELINGO ");
2907 printk("ENSPIORDY ");
2909 printk("ENDMADONE ");
2911 s = GETPORT(SIMODE1);
2913 printk("ENSELTIMO ");
2915 printk("ENATNTARG ");
2917 printk("ENPHASEMIS ");
2919 printk("ENBUSFREE ");
2921 printk("ENSCSIPERR ");
2923 printk("ENPHASECHG ");
2925 printk("ENREQINIT ");
2930 * Show the command data of a command
2932 static void show_command(Scsi_Cmnd *ptr)
2934 scmd_printk(KERN_DEBUG, ptr, "%p: cmnd=(", ptr);
2936 __scsi_print_command(ptr->cmnd);
2938 printk(KERN_DEBUG "); request_bufflen=%d; resid=%d; phase |",
2939 ptr->request_bufflen, ptr->resid);
2941 if (ptr->SCp.phase & not_issued)
2942 printk("not issued|");
2943 if (ptr->SCp.phase & selecting)
2944 printk("selecting|");
2945 if (ptr->SCp.phase & identified)
2946 printk("identified|");
2947 if (ptr->SCp.phase & disconnected)
2948 printk("disconnected|");
2949 if (ptr->SCp.phase & completed)
2950 printk("completed|");
2951 if (ptr->SCp.phase & spiordy)
2953 if (ptr->SCp.phase & syncneg)
2955 if (ptr->SCp.phase & aborted)
2957 if (ptr->SCp.phase & resetted)
2958 printk("resetted|");
2960 printk("; next=0x%p\n", SCNEXT(ptr));
2962 printk("; next=(host scribble NULL)\n");
2967 * Dump the queued data
2969 static void show_queues(struct Scsi_Host *shpnt)
2972 unsigned long flags;
2975 printk(KERN_DEBUG "\nqueue status:\nissue_SC:\n");
2976 for (ptr = ISSUE_SC; ptr; ptr = SCNEXT(ptr))
2980 printk(KERN_DEBUG "current_SC:\n");
2982 show_command(CURRENT_SC);
2984 printk(KERN_DEBUG "none\n");
2986 printk(KERN_DEBUG "disconnected_SC:\n");
2987 for (ptr = DISCONNECTED_SC; ptr; ptr = SCDATA(ptr) ? SCNEXT(ptr) : NULL)
2995 #define SPRINTF(args...) pos += sprintf(pos, ## args)
2997 static int get_command(char *pos, Scsi_Cmnd * ptr)
3002 SPRINTF("0x%08x: target=%d; lun=%d; cmnd=( ",
3003 (unsigned int) ptr, ptr->device->id, ptr->device->lun);
3005 for (i = 0; i < COMMAND_SIZE(ptr->cmnd[0]); i++)
3006 SPRINTF("0x%02x ", ptr->cmnd[i]);
3008 SPRINTF("); resid=%d; residual=%d; buffers=%d; phase |",
3009 ptr->resid, ptr->SCp.this_residual, ptr->SCp.buffers_residual);
3011 if (ptr->SCp.phase & not_issued)
3012 SPRINTF("not issued|");
3013 if (ptr->SCp.phase & selecting)
3014 SPRINTF("selecting|");
3015 if (ptr->SCp.phase & disconnected)
3016 SPRINTF("disconnected|");
3017 if (ptr->SCp.phase & aborted)
3018 SPRINTF("aborted|");
3019 if (ptr->SCp.phase & identified)
3020 SPRINTF("identified|");
3021 if (ptr->SCp.phase & completed)
3022 SPRINTF("completed|");
3023 if (ptr->SCp.phase & spiordy)
3024 SPRINTF("spiordy|");
3025 if (ptr->SCp.phase & syncneg)
3026 SPRINTF("syncneg|");
3027 SPRINTF("; next=0x%p\n", SCNEXT(ptr));
3029 return (pos - start);
3032 static int get_ports(struct Scsi_Host *shpnt, char *pos)
3037 SPRINTF("\n%s: %s(%s) ", CURRENT_SC ? "on bus" : "waiting", states[STATE].name, states[PREVSTATE].name);
3039 s = GETPORT(SCSISEQ);
3040 SPRINTF("SCSISEQ( ");
3042 SPRINTF("TARGET MODE ");
3050 SPRINTF("AUTOATNO ");
3052 SPRINTF("AUTOATNI ");
3054 SPRINTF("AUTOATNP ");
3056 SPRINTF("SCSIRSTO ");
3059 SPRINTF(" SCSISIG(");
3060 s = GETPORT(SCSISIG);
3061 switch (s & P_MASK) {
3063 SPRINTF("DATA OUT");
3075 SPRINTF("MESSAGE OUT");
3078 SPRINTF("MESSAGE IN");
3081 SPRINTF("*invalid*");
3087 SPRINTF("INTSTAT (%s); ", TESTHI(DMASTAT, INTSTAT) ? "hi" : "lo");
3090 s = GETPORT(SSTAT0);
3098 SPRINTF("SELINGO ");
3104 SPRINTF("SPIORDY ");
3106 SPRINTF("DMADONE ");
3108 s = GETPORT(SSTAT1);
3112 SPRINTF("ATNTARG ");
3114 SPRINTF("SCSIRSTI ");
3116 SPRINTF("PHASEMIS ");
3118 SPRINTF("BUSFREE ");
3120 SPRINTF("SCSIPERR ");
3122 SPRINTF("PHASECHG ");
3124 SPRINTF("REQINIT ");
3130 s = GETPORT(SSTAT0) & GETPORT(SIMODE0);
3139 SPRINTF("SELINGO ");
3145 SPRINTF("SPIORDY ");
3147 SPRINTF("DMADONE ");
3149 s = GETPORT(SSTAT1) & GETPORT(SIMODE1);
3154 SPRINTF("ATNTARG ");
3156 SPRINTF("SCSIRSTI ");
3158 SPRINTF("PHASEMIS ");
3160 SPRINTF("BUSFREE ");
3162 SPRINTF("SCSIPERR ");
3164 SPRINTF("PHASECHG ");
3166 SPRINTF("REQINIT ");
3169 SPRINTF("SXFRCTL0( ");
3171 s = GETPORT(SXFRCTL0);
3179 SPRINTF("CLRSTCNT ");
3186 SPRINTF("SIGNAL( ");
3188 s = GETPORT(SCSISIG);
3201 SPRINTF("SELID(%02x), ", GETPORT(SELID));
3203 SPRINTF("STCNT(%d), ", GETSTCNT());
3205 SPRINTF("SSTAT2( ");
3207 s = GETPORT(SSTAT2);
3209 SPRINTF("SOFFSET ");
3214 SPRINTF("); SFCNT (%d); ", s & (SFULL | SFCNT));
3216 s = GETPORT(SSTAT3);
3217 SPRINTF("SCSICNT (%d), OFFCNT(%d), ", (s & 0xf0) >> 4, s & 0x0f);
3219 SPRINTF("SSTAT4( ");
3220 s = GETPORT(SSTAT4);
3222 SPRINTF("SYNCERR ");
3229 SPRINTF("DMACNTRL0( ");
3230 s = GETPORT(DMACNTRL0);
3231 SPRINTF("%s ", s & _8BIT ? "8BIT" : "16BIT");
3232 SPRINTF("%s ", s & DMA ? "DMA" : "PIO");
3233 SPRINTF("%s ", s & WRITE_READ ? "WRITE" : "READ");
3239 SPRINTF("RSTFIFO ");
3244 SPRINTF("DMASTAT( ");
3245 s = GETPORT(DMASTAT);
3249 SPRINTF("WORDRDY ");
3251 SPRINTF("DFIFOFULL ");
3253 SPRINTF("DFIFOEMP ");
3256 SPRINTF("enabled interrupts( ");
3258 s = GETPORT(SIMODE0);
3260 SPRINTF("ENSELDO ");
3262 SPRINTF("ENSELDI ");
3264 SPRINTF("ENSELINGO ");
3266 SPRINTF("ENSWRAP ");
3268 SPRINTF("ENSDONE ");
3270 SPRINTF("ENSPIORDY ");
3272 SPRINTF("ENDMADONE ");
3274 s = GETPORT(SIMODE1);
3276 SPRINTF("ENSELTIMO ");
3278 SPRINTF("ENATNTARG ");
3280 SPRINTF("ENPHASEMIS ");
3282 SPRINTF("ENBUSFREE ");
3284 SPRINTF("ENSCSIPERR ");
3286 SPRINTF("ENPHASECHG ");
3288 SPRINTF("ENREQINIT ");
3291 return (pos - start);
3294 static int aha152x_set_info(char *buffer, int length, struct Scsi_Host *shpnt)
3296 if(!shpnt || !buffer || length<8 || strncmp("aha152x ", buffer, 8)!=0)
3299 #if defined(AHA152X_DEBUG)
3300 if(length>14 && strncmp("debug ", buffer+8, 6)==0) {
3301 int debug = HOSTDATA(shpnt)->debug;
3303 HOSTDATA(shpnt)->debug = simple_strtoul(buffer+14, NULL, 0);
3305 printk(KERN_INFO "aha152x%d: debugging options set to 0x%04x (were 0x%04x)\n", HOSTNO, HOSTDATA(shpnt)->debug, debug);
3308 #if defined(AHA152X_STAT)
3309 if(length>13 && strncmp("reset", buffer+8, 5)==0) {
3312 HOSTDATA(shpnt)->total_commands=0;
3313 HOSTDATA(shpnt)->disconnections=0;
3314 HOSTDATA(shpnt)->busfree_without_any_action=0;
3315 HOSTDATA(shpnt)->busfree_without_old_command=0;
3316 HOSTDATA(shpnt)->busfree_without_new_command=0;
3317 HOSTDATA(shpnt)->busfree_without_done_command=0;
3318 HOSTDATA(shpnt)->busfree_with_check_condition=0;
3319 for (i = idle; i<maxstate; i++) {
3320 HOSTDATA(shpnt)->count[i]=0;
3321 HOSTDATA(shpnt)->count_trans[i]=0;
3322 HOSTDATA(shpnt)->time[i]=0;
3325 printk(KERN_INFO "aha152x%d: stats reseted.\n", HOSTNO);
3338 #define SPRINTF(args...) \
3339 do { if(pos < buffer + length) pos += sprintf(pos, ## args); } while(0)
3341 static int aha152x_proc_info(struct Scsi_Host *shpnt, char *buffer, char **start,
3342 off_t offset, int length, int inout)
3347 unsigned long flags;
3350 DPRINTK(debug_procinfo,
3351 KERN_DEBUG "aha152x_proc_info: buffer=%p offset=%ld length=%d hostno=%d inout=%d\n",
3352 buffer, offset, length, shpnt->host_no, inout);
3356 return aha152x_set_info(buffer, length, shpnt);
3358 SPRINTF(AHA152X_REVID "\n");
3360 SPRINTF("ioports 0x%04lx to 0x%04lx\n",
3361 shpnt->io_port, shpnt->io_port + shpnt->n_io_port - 1);
3362 SPRINTF("interrupt 0x%02x\n", shpnt->irq);
3363 SPRINTF("disconnection/reconnection %s\n",
3364 RECONNECT ? "enabled" : "disabled");
3365 SPRINTF("parity checking %s\n",
3366 PARITY ? "enabled" : "disabled");
3367 SPRINTF("synchronous transfers %s\n",
3368 SYNCHRONOUS ? "enabled" : "disabled");
3369 SPRINTF("%d commands currently queued\n", HOSTDATA(shpnt)->commands);
3372 SPRINTF("synchronously operating targets (tick=50 ns):\n");
3373 for (i = 0; i < 8; i++)
3374 if (HOSTDATA(shpnt)->syncrate[i] & 0x7f)
3375 SPRINTF("target %d: period %dT/%dns; req/ack offset %d\n",
3377 (((HOSTDATA(shpnt)->syncrate[i] & 0x70) >> 4) + 2),
3378 (((HOSTDATA(shpnt)->syncrate[i] & 0x70) >> 4) + 2) * 50,
3379 HOSTDATA(shpnt)->syncrate[i] & 0x0f);
3381 #if defined(AHA152X_DEBUG)
3382 #define PDEBUG(flags,txt) \
3383 if(HOSTDATA(shpnt)->debug & flags) SPRINTF("(%s) ", txt);
3385 SPRINTF("enabled debugging options: ");
3387 PDEBUG(debug_procinfo, "procinfo");
3388 PDEBUG(debug_queue, "queue");
3389 PDEBUG(debug_intr, "interrupt");
3390 PDEBUG(debug_selection, "selection");
3391 PDEBUG(debug_msgo, "message out");
3392 PDEBUG(debug_msgi, "message in");
3393 PDEBUG(debug_status, "status");
3394 PDEBUG(debug_cmd, "command");
3395 PDEBUG(debug_datai, "data in");
3396 PDEBUG(debug_datao, "data out");
3397 PDEBUG(debug_eh, "eh");
3398 PDEBUG(debug_locks, "locks");
3399 PDEBUG(debug_phases, "phases");
3404 SPRINTF("\nqueue status:\n");
3407 SPRINTF("not yet issued commands:\n");
3408 for (ptr = ISSUE_SC; ptr; ptr = SCNEXT(ptr))
3409 pos += get_command(pos, ptr);
3411 SPRINTF("no not yet issued commands\n");
3415 SPRINTF("current command:\n");
3416 pos += get_command(pos, CURRENT_SC);
3418 SPRINTF("no current command\n");
3420 if (DISCONNECTED_SC) {
3421 SPRINTF("disconnected commands:\n");
3422 for (ptr = DISCONNECTED_SC; ptr; ptr = SCNEXT(ptr))
3423 pos += get_command(pos, ptr);
3425 SPRINTF("no disconnected commands\n");
3427 pos += get_ports(shpnt, pos);
3429 #if defined(AHA152X_STAT)
3430 SPRINTF("statistics:\n"
3431 "total commands: %d\n"
3432 "disconnections: %d\n"
3433 "busfree with check condition: %d\n"
3434 "busfree without old command: %d\n"
3435 "busfree without new command: %d\n"
3436 "busfree without done command: %d\n"
3437 "busfree without any action: %d\n"
3442 HOSTDATA(shpnt)->total_commands,
3443 HOSTDATA(shpnt)->disconnections,
3444 HOSTDATA(shpnt)->busfree_with_check_condition,
3445 HOSTDATA(shpnt)->busfree_without_old_command,
3446 HOSTDATA(shpnt)->busfree_without_new_command,
3447 HOSTDATA(shpnt)->busfree_without_done_command,
3448 HOSTDATA(shpnt)->busfree_without_any_action);
3449 for(i=0; i<maxstate; i++) {
3450 SPRINTF("%-10s %-12d %-12d %-12ld\n",
3452 HOSTDATA(shpnt)->count_trans[i],
3453 HOSTDATA(shpnt)->count[i],
3454 HOSTDATA(shpnt)->time[i]);
3458 DPRINTK(debug_procinfo, KERN_DEBUG "aha152x_proc_info: pos=%p\n", pos);
3460 thislength = pos - (buffer + offset);
3461 DPRINTK(debug_procinfo, KERN_DEBUG "aha152x_proc_info: length=%d thislength=%d\n", length, thislength);
3464 DPRINTK(debug_procinfo, KERN_DEBUG "aha152x_proc_info: output too short\n");
3469 thislength = thislength<length ? thislength : length;
3471 DPRINTK(debug_procinfo, KERN_DEBUG "aha152x_proc_info: return %d\n", thislength);
3473 *start = buffer + offset;
3474 return thislength < length ? thislength : length;
3477 static struct scsi_host_template aha152x_driver_template = {
3478 .module = THIS_MODULE,
3479 .name = AHA152X_REVID,
3480 .proc_name = "aha152x",
3481 .proc_info = aha152x_proc_info,
3482 .queuecommand = aha152x_queue,
3483 .eh_abort_handler = aha152x_abort,
3484 .eh_device_reset_handler = aha152x_device_reset,
3485 .eh_bus_reset_handler = aha152x_bus_reset,
3486 .eh_host_reset_handler = aha152x_host_reset,
3487 .bios_param = aha152x_biosparam,
3490 .sg_tablesize = SG_ALL,
3492 .use_clustering = DISABLE_CLUSTERING,
3495 #if !defined(PCMCIA)
3496 static int setup_count;
3497 static struct aha152x_setup setup[2];
3499 /* possible i/o addresses for the AIC-6260; default first */
3500 static unsigned short ports[] = { 0x340, 0x140 };
3502 #if !defined(SKIP_BIOSTEST)
3503 /* possible locations for the Adaptec BIOS; defaults first */
3504 static unsigned int addresses[] =
3506 0xdc000, /* default first */
3513 0xeb800, /* VTech Platinum SMP */
3517 /* signatures for various AIC-6[23]60 based controllers.
3518 The point in detecting signatures is to avoid useless and maybe
3519 harmful probes on ports. I'm not sure that all listed boards pass
3520 auto-configuration. For those which fail the BIOS signature is
3521 obsolete, because user intervention to supply the configuration is
3522 needed anyway. May be an information whether or not the BIOS supports
3523 extended translation could be also useful here. */
3524 static struct signature {
3525 unsigned char *signature;
3530 { "Adaptec AHA-1520 BIOS", 0x102e, 21 },
3532 { "Adaptec AHA-1520B", 0x000b, 17 },
3533 /* Adaptec 152x rev B */
3534 { "Adaptec AHA-1520B", 0x0026, 17 },
3535 /* Iomega Jaz Jet ISA (AIC6370Q) */
3536 { "Adaptec ASW-B626 BIOS", 0x1029, 21 },
3537 /* on-board controller */
3538 { "Adaptec BIOS: ASW-B626", 0x000f, 22 },
3539 /* on-board controller */
3540 { "Adaptec ASW-B626 S2", 0x2e6c, 19 },
3541 /* on-board controller */
3542 { "Adaptec BIOS:AIC-6360", 0x000c, 21 },
3543 /* on-board controller */
3544 { "ScsiPro SP-360 BIOS", 0x2873, 19 },
3545 /* ScsiPro-Controller */
3546 { "GA-400 LOCAL BUS SCSI BIOS", 0x102e, 26 },
3547 /* Gigabyte Local-Bus-SCSI */
3548 { "Adaptec BIOS:AVA-282X", 0x000c, 21 },
3550 { "Adaptec IBM Dock II SCSI", 0x2edd, 24 },
3551 /* IBM Thinkpad Dock II */
3552 { "Adaptec BIOS:AHA-1532P", 0x001c, 22 },
3553 /* IBM Thinkpad Dock II SCSI */
3554 { "DTC3520A Host Adapter BIOS", 0x318a, 26 },
3555 /* DTC 3520A ISA SCSI */
3557 #endif /* !SKIP_BIOSTEST */
3560 * Test, if port_base is valid.
3563 static int aha152x_porttest(int io_port)
3567 SETPORT(io_port + O_DMACNTRL1, 0); /* reset stack pointer */
3568 for (i = 0; i < 16; i++)
3569 SETPORT(io_port + O_STACK, i);
3571 SETPORT(io_port + O_DMACNTRL1, 0); /* reset stack pointer */
3572 for (i = 0; i < 16 && GETPORT(io_port + O_STACK) == i; i++)
3578 static int tc1550_porttest(int io_port)
3582 SETPORT(io_port + O_TC_DMACNTRL1, 0); /* reset stack pointer */
3583 for (i = 0; i < 16; i++)
3584 SETPORT(io_port + O_STACK, i);
3586 SETPORT(io_port + O_TC_DMACNTRL1, 0); /* reset stack pointer */
3587 for (i = 0; i < 16 && GETPORT(io_port + O_TC_STACK) == i; i++)
3594 static int checksetup(struct aha152x_setup *setup)
3597 for (i = 0; i < ARRAY_SIZE(ports) && (setup->io_port != ports[i]); i++)
3600 if (i == ARRAY_SIZE(ports))
3603 if ( request_region(setup->io_port, IO_RANGE, "aha152x")==0 ) {
3604 printk(KERN_ERR "aha152x: io port 0x%x busy.\n", setup->io_port);
3608 if( aha152x_porttest(setup->io_port) ) {
3610 } else if( tc1550_porttest(setup->io_port) ) {
3613 release_region(setup->io_port, IO_RANGE);
3617 release_region(setup->io_port, IO_RANGE);
3619 if ((setup->irq < IRQ_MIN) || (setup->irq > IRQ_MAX))
3622 if ((setup->scsiid < 0) || (setup->scsiid > 7))
3625 if ((setup->reconnect < 0) || (setup->reconnect > 1))
3628 if ((setup->parity < 0) || (setup->parity > 1))
3631 if ((setup->synchronous < 0) || (setup->synchronous > 1))
3634 if ((setup->ext_trans < 0) || (setup->ext_trans > 1))
3642 static int __init aha152x_init(void)
3645 #if defined(AUTOCONF)
3646 aha152x_config conf;
3649 struct pnp_dev *dev=NULL, *pnpdev[2] = {NULL, NULL};
3652 if ( setup_count ) {
3653 printk(KERN_INFO "aha152x: processing commandline: ");
3655 for (i = 0; i<setup_count; i++) {
3656 if (!checksetup(&setup[i])) {
3657 printk(KERN_ERR "\naha152x: %s\n", setup[i].conf);
3658 printk(KERN_ERR "aha152x: invalid line\n");
3665 if (setup_count < ARRAY_SIZE(setup)) {
3666 struct aha152x_setup override = SETUP0;
3668 if (setup_count == 0 || (override.io_port != setup[0].io_port)) {
3669 if (!checksetup(&override)) {
3670 printk(KERN_ERR "\naha152x: invalid override SETUP0={0x%x,%d,%d,%d,%d,%d,%d,%d}\n",
3676 override.synchronous,
3678 override.ext_trans);
3680 setup[setup_count++] = override;
3686 if (setup_count < ARRAY_SIZE(setup)) {
3687 struct aha152x_setup override = SETUP1;
3689 if (setup_count == 0 || (override.io_port != setup[0].io_port)) {
3690 if (!checksetup(&override)) {
3691 printk(KERN_ERR "\naha152x: invalid override SETUP1={0x%x,%d,%d,%d,%d,%d,%d,%d}\n",
3697 override.synchronous,
3699 override.ext_trans);
3701 setup[setup_count++] = override;
3707 if (setup_count<ARRAY_SIZE(setup) && (aha152x[0]!=0 || io[0]!=0 || irq[0]!=0)) {
3709 setup[setup_count].conf = "";
3710 setup[setup_count].io_port = aha152x[0];
3711 setup[setup_count].irq = aha152x[1];
3712 setup[setup_count].scsiid = aha152x[2];
3713 setup[setup_count].reconnect = aha152x[3];
3714 setup[setup_count].parity = aha152x[4];
3715 setup[setup_count].synchronous = aha152x[5];
3716 setup[setup_count].delay = aha152x[6];
3717 setup[setup_count].ext_trans = aha152x[7];
3718 #if defined(AHA152X_DEBUG)
3719 setup[setup_count].debug = aha152x[8];
3721 } else if(io[0]!=0 || irq[0]!=0) {
3722 if(io[0]!=0) setup[setup_count].io_port = io[0];
3723 if(irq[0]!=0) setup[setup_count].irq = irq[0];
3725 setup[setup_count].scsiid = scsiid[0];
3726 setup[setup_count].reconnect = reconnect[0];
3727 setup[setup_count].parity = parity[0];
3728 setup[setup_count].synchronous = sync[0];
3729 setup[setup_count].delay = delay[0];
3730 setup[setup_count].ext_trans = exttrans[0];
3731 #if defined(AHA152X_DEBUG)
3732 setup[setup_count].debug = debug[0];
3736 if (checksetup(&setup[setup_count]))
3739 printk(KERN_ERR "aha152x: invalid module params io=0x%x, irq=%d,scsiid=%d,reconnect=%d,parity=%d,sync=%d,delay=%d,exttrans=%d\n",
3740 setup[setup_count].io_port,
3741 setup[setup_count].irq,
3742 setup[setup_count].scsiid,
3743 setup[setup_count].reconnect,
3744 setup[setup_count].parity,
3745 setup[setup_count].synchronous,
3746 setup[setup_count].delay,
3747 setup[setup_count].ext_trans);
3750 if (setup_count<ARRAY_SIZE(setup) && (aha152x1[0]!=0 || io[1]!=0 || irq[1]!=0)) {
3751 if(aha152x1[0]!=0) {
3752 setup[setup_count].conf = "";
3753 setup[setup_count].io_port = aha152x1[0];
3754 setup[setup_count].irq = aha152x1[1];
3755 setup[setup_count].scsiid = aha152x1[2];
3756 setup[setup_count].reconnect = aha152x1[3];
3757 setup[setup_count].parity = aha152x1[4];
3758 setup[setup_count].synchronous = aha152x1[5];
3759 setup[setup_count].delay = aha152x1[6];
3760 setup[setup_count].ext_trans = aha152x1[7];
3761 #if defined(AHA152X_DEBUG)
3762 setup[setup_count].debug = aha152x1[8];
3764 } else if(io[1]!=0 || irq[1]!=0) {
3765 if(io[1]!=0) setup[setup_count].io_port = io[1];
3766 if(irq[1]!=0) setup[setup_count].irq = irq[1];
3768 setup[setup_count].scsiid = scsiid[1];
3769 setup[setup_count].reconnect = reconnect[1];
3770 setup[setup_count].parity = parity[1];
3771 setup[setup_count].synchronous = sync[1];
3772 setup[setup_count].delay = delay[1];
3773 setup[setup_count].ext_trans = exttrans[1];
3774 #if defined(AHA152X_DEBUG)
3775 setup[setup_count].debug = debug[1];
3778 if (checksetup(&setup[setup_count]))
3781 printk(KERN_ERR "aha152x: invalid module params io=0x%x, irq=%d,scsiid=%d,reconnect=%d,parity=%d,sync=%d,delay=%d,exttrans=%d\n",
3782 setup[setup_count].io_port,
3783 setup[setup_count].irq,
3784 setup[setup_count].scsiid,
3785 setup[setup_count].reconnect,
3786 setup[setup_count].parity,
3787 setup[setup_count].synchronous,
3788 setup[setup_count].delay,
3789 setup[setup_count].ext_trans);
3794 for(i=0; setup_count<ARRAY_SIZE(setup) && id_table[i].vendor; i++) {
3795 while ( setup_count<ARRAY_SIZE(setup) &&
3796 (dev=pnp_find_dev(NULL, id_table[i].vendor, id_table[i].function, dev)) ) {
3797 if (pnp_device_attach(dev) < 0)
3800 if (pnp_activate_dev(dev) < 0) {
3801 pnp_device_detach(dev);
3805 if (!pnp_port_valid(dev, 0)) {
3806 pnp_device_detach(dev);
3810 if (setup_count==1 && pnp_port_start(dev, 0)==setup[0].io_port) {
3811 pnp_device_detach(dev);
3815 setup[setup_count].io_port = pnp_port_start(dev, 0);
3816 setup[setup_count].irq = pnp_irq(dev, 0);
3817 setup[setup_count].scsiid = 7;
3818 setup[setup_count].reconnect = 1;
3819 setup[setup_count].parity = 1;
3820 setup[setup_count].synchronous = 1;
3821 setup[setup_count].delay = DELAY_DEFAULT;
3822 setup[setup_count].ext_trans = 0;
3823 #if defined(AHA152X_DEBUG)
3824 setup[setup_count].debug = DEBUG_DEFAULT;
3826 #if defined(__ISAPNP__)
3827 pnpdev[setup_count] = dev;
3830 "aha152x: found ISAPnP adapter at io=0x%03x, irq=%d\n",
3831 setup[setup_count].io_port, setup[setup_count].irq);
3837 #if defined(AUTOCONF)
3838 if (setup_count<ARRAY_SIZE(setup)) {
3839 #if !defined(SKIP_BIOSTEST)
3841 for (i = 0; i < ARRAY_SIZE(addresses) && !ok; i++) {
3842 void __iomem *p = ioremap(addresses[i], 0x4000);
3845 for (j = 0; j<ARRAY_SIZE(signatures) && !ok; j++)
3846 ok = check_signature(p + signatures[j].sig_offset,
3847 signatures[j].signature, signatures[j].sig_length);
3850 if (!ok && setup_count == 0)
3853 printk(KERN_INFO "aha152x: BIOS test: passed, ");
3855 printk(KERN_INFO "aha152x: ");
3856 #endif /* !SKIP_BIOSTEST */
3859 for (i = 0; i < ARRAY_SIZE(ports) && setup_count < 2; i++) {
3860 if ((setup_count == 1) && (setup[0].io_port == ports[i]))
3863 if ( request_region(ports[i], IO_RANGE, "aha152x")==0 ) {
3864 printk(KERN_ERR "aha152x: io port 0x%x busy.\n", ports[i]);
3868 if (aha152x_porttest(ports[i])) {
3869 setup[setup_count].tc1550 = 0;
3872 (GETPORT(ports[i] + O_PORTA) << 8) + GETPORT(ports[i] + O_PORTB);
3873 } else if (tc1550_porttest(ports[i])) {
3874 setup[setup_count].tc1550 = 1;
3877 (GETPORT(ports[i] + O_TC_PORTA) << 8) + GETPORT(ports[i] + O_TC_PORTB);
3879 release_region(ports[i], IO_RANGE);
3883 release_region(ports[i], IO_RANGE);
3886 setup[setup_count].io_port = ports[i];
3887 setup[setup_count].irq = IRQ_MIN + conf.cf_irq;
3888 setup[setup_count].scsiid = conf.cf_id;
3889 setup[setup_count].reconnect = conf.cf_tardisc;
3890 setup[setup_count].parity = !conf.cf_parity;
3891 setup[setup_count].synchronous = conf.cf_syncneg;
3892 setup[setup_count].delay = DELAY_DEFAULT;
3893 setup[setup_count].ext_trans = 0;
3894 #if defined(AHA152X_DEBUG)
3895 setup[setup_count].debug = DEBUG_DEFAULT;
3902 printk("auto configuration: ok, ");
3906 printk("%d controller(s) configured\n", setup_count);
3908 for (i=0; i<setup_count; i++) {
3909 if ( request_region(setup[i].io_port, IO_RANGE, "aha152x") ) {
3910 struct Scsi_Host *shpnt = aha152x_probe_one(&setup[i]);
3913 release_region(setup[i].io_port, IO_RANGE);
3914 #if defined(__ISAPNP__)
3915 } else if( pnpdev[i] ) {
3916 HOSTDATA(shpnt)->pnpdev=pnpdev[i];
3921 printk(KERN_ERR "aha152x: io port 0x%x busy.\n", setup[i].io_port);
3924 #if defined(__ISAPNP__)
3926 pnp_device_detach(pnpdev[i]);
3933 static void __exit aha152x_exit(void)
3935 struct aha152x_hostdata *hd;
3937 list_for_each_entry(hd, &aha152x_host_list, host_list) {
3938 struct Scsi_Host *shost = container_of((void *)hd, struct Scsi_Host, hostdata);
3940 aha152x_release(shost);
3944 module_init(aha152x_init);
3945 module_exit(aha152x_exit);
3947 #if !defined(MODULE)
3948 static int __init aha152x_setup(char *str)
3950 #if defined(AHA152X_DEBUG)
3955 get_options(str, ARRAY_SIZE(ints), ints);
3957 if(setup_count>=ARRAY_SIZE(setup)) {
3958 printk(KERN_ERR "aha152x: you can only configure up to two controllers\n");
3962 setup[setup_count].conf = str;
3963 setup[setup_count].io_port = ints[0] >= 1 ? ints[1] : 0x340;
3964 setup[setup_count].irq = ints[0] >= 2 ? ints[2] : 11;
3965 setup[setup_count].scsiid = ints[0] >= 3 ? ints[3] : 7;
3966 setup[setup_count].reconnect = ints[0] >= 4 ? ints[4] : 1;
3967 setup[setup_count].parity = ints[0] >= 5 ? ints[5] : 1;
3968 setup[setup_count].synchronous = ints[0] >= 6 ? ints[6] : 1;
3969 setup[setup_count].delay = ints[0] >= 7 ? ints[7] : DELAY_DEFAULT;
3970 setup[setup_count].ext_trans = ints[0] >= 8 ? ints[8] : 0;
3971 #if defined(AHA152X_DEBUG)
3972 setup[setup_count].debug = ints[0] >= 9 ? ints[9] : DEBUG_DEFAULT;
3974 printk(KERN_NOTICE "aha152x: usage: aha152x=<IOBASE>[,<IRQ>[,<SCSI ID>"
3975 "[,<RECONNECT>[,<PARITY>[,<SYNCHRONOUS>[,<DELAY>[,<EXT_TRANS>[,<DEBUG>]]]]]]]]\n");
3977 if (ints[0] > 8) { /*}*/
3978 printk(KERN_NOTICE "aha152x: usage: aha152x=<IOBASE>[,<IRQ>[,<SCSI ID>"
3979 "[,<RECONNECT>[,<PARITY>[,<SYNCHRONOUS>[,<DELAY>[,<EXT_TRANS>]]]]]]]\n");
3988 __setup("aha152x=", aha152x_setup);
3991 #endif /* !PCMCIA */