|
|
1.1 root 1: /* aha152x.c -- Adaptec AHA-152x driver
2: * Author: J�rgen E. Fischer, [email protected]
3: * Copyright 1993, 1994, 1995, 1996 J�rgen E. Fischer
4: *
5: *
6: * This driver is based on
7: * fdomain.c -- Future Domain TMC-16x0 driver
8: * which is
9: * Copyright 1992, 1993 Rickard E. Faith ([email protected])
10: *
11: *
12: * This program is free software; you can redistribute it and/or modify it
13: * under the terms of the GNU General Public License as published by the
14: * Free Software Foundation; either version 2, or (at your option) any
15: * later version.
16: *
17: * This program is distributed in the hope that it will be useful, but
18: * WITHOUT ANY WARRANTY; without even the implied warranty of
19: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20: * General Public License for more details.
21: *
22: *
23: * $Id: aha152x.c,v 1.1 1999/04/26 05:54:09 tb Exp $
24: *
25: * $Log: aha152x.c,v $
26: * Revision 1.1 1999/04/26 05:54:09 tb
27: * 1998-11-30 OKUJI Yoshinori <[email protected]>
28: *
29: * Clean up linux emulation code to make it architecture-independent
30: * as much as possible.
31: *
32: * * linux: Renamed from linuxdev.
33: * * Makefile.in (objfiles): Add linux.o instead of linuxdev.o.
34: * (MAKE): New variable. Used for the linux.o target.
35: * * configure.in: Add AC_CHECK_TOOL(MAKE, make).
36: * * i386/i386/spl.h: Include <i386/ipl.h>, for compatibility with
37: * OSF Mach 3.0. Suggested by Elgin Lee <[email protected]>.
38: * * linux/src: Renamed from linux/linux.
39: * * linux/dev: Renamed from linux/mach.
40: * * linux/Drivers.in (AC_INIT): Use dev/include/linux/autoconf.h,
41: * instead of mach/include/linux/autoconf.h.
42: * * Makefile.in (all): Target ../linux.o instead of ../linuxdev.o.
43: * * linux/dev/drivers/block/genhd.c: Include <machine/spl.h> instead
44: * of <i386/ipl.h>.
45: * * linux/dev/drivers/net/auto_irq.c: Remove unneeded header files,
46: * <i386/ipl.h> and <i386/pic.h>.
47: * * linux/dev/init/main.c: Many i386-dependent codes moved to ...
48: * * linux/dev/arch/i386/irq.c: ... here.
49: * * linux/dev/arch/i386/setup.c: New file.
50: * * linux/dev/arch/i386/linux_emul.h: Likewise.
51: * * linux/dev/arch/i386/glue/timer.c: Merged into sched.c.
52: * * linux/dev/arch/i386/glue/sched.c: Include <machine/spl.h> instead
53: * of <i386/ipl.h>, and moved to ...
54: * * linux/dev/kernel/sched.c: ... here.
55: * * linux/dev/arch/i386/glue/block.c: Include <machine/spl.h> and
56: * <linux_emul.h>, instead of i386-dependent header files, and
57: * moved to ...
58: * * linux/dev/glue/blocl.c: ... here.
59: * * linux/dev/arch/i386/glue/net.c: Include <machine/spl.h> and
60: * <linux_emul.h>, instead of i386-dependent header files, and
61: * moved to ...
62: * * linux/dev/glue/net.c: ... here.
63: * * linux/dev/arch/i386/glue/misc.c: Remove `x86' and moved to ...
64: * * linux/dev/glue/misc.c: ... here.
65: * * linux/dev/arch/i386/glue/kmem.c: Moved to ...
66: * * linux/dev/glue/kmem.c: ... here.
67: *
68: * Revision 1.18 1996/09/07 20:10:40 fischer
69: * - fixed can_queue handling (multiple outstanding commands working again)
70: *
71: * Revision 1.17 1996/08/17 16:05:14 fischer
72: * - biosparam improved
73: * - interrupt verification
74: * - updated documentation
75: * - cleanups
76: *
77: * Revision 1.16 1996/06/09 00:04:56 root
78: * - added configuration symbols for insmod (aha152x/aha152x1)
79: *
80: * Revision 1.15 1996/04/30 14:52:06 fischer
81: * - proc info fixed
82: * - support for extended translation for >1GB disks
83: *
84: * Revision 1.14 1996/01/17 15:11:20 fischer
85: * - fixed lockup in MESSAGE IN phase after reconnection
86: *
87: * Revision 1.13 1996/01/09 02:15:53 fischer
88: * - some cleanups
89: * - moved request_irq behind controller initialization
90: * (to avoid spurious interrupts)
91: *
92: * Revision 1.12 1995/12/16 12:26:07 fischer
93: * - barrier()s added
94: * - configurable RESET delay added
95: *
96: * Revision 1.11 1995/12/06 21:18:35 fischer
97: * - some minor updates
98: *
99: * Revision 1.10 1995/07/22 19:18:45 fischer
100: * - support for 2 controllers
101: * - started synchronous data transfers (not working yet)
102: *
103: * Revision 1.9 1995/03/18 09:20:24 root
104: * - patches for PCMCIA and modules
105: *
106: * Revision 1.8 1995/01/21 22:07:19 root
107: * - snarf_region => request_region
108: * - aha152x_intr interface change
109: *
110: * Revision 1.7 1995/01/02 23:19:36 root
111: * - updated COMMAND_SIZE to cmd_len
112: * - changed sti() to restore_flags()
113: * - fixed some #ifdef which generated warnings
114: *
115: * Revision 1.6 1994/11/24 20:35:27 root
116: * - problem with odd number of bytes in fifo fixed
117: *
118: * Revision 1.5 1994/10/30 14:39:56 root
119: * - abort code fixed
120: * - debugging improved
121: *
122: * Revision 1.4 1994/09/12 11:33:01 root
123: * - irqaction to request_irq
124: * - abortion updated
125: *
126: * Revision 1.3 1994/08/04 13:53:05 root
127: * - updates for mid-level-driver changes
128: * - accept unexpected BUSFREE phase as error condition
129: * - parity check now configurable
130: *
131: * Revision 1.2 1994/07/03 12:56:36 root
132: * - cleaned up debugging code
133: * - more tweaking on reset delays
134: * - updated abort/reset code (pretty untested...)
135: *
136: * Revision 1.1 1994/05/28 21:18:49 root
137: * - update for mid-level interface change (abort-reset)
138: * - delays after resets adjusted for some slow devices
139: *
140: * Revision 1.0 1994/03/25 12:52:00 root
141: * - Fixed "more data than expected" problem
142: * - added new BIOS signatures
143: *
144: * Revision 0.102 1994/01/31 20:44:12 root
145: * - minor changes in insw/outsw handling
146: *
147: * Revision 0.101 1993/12/13 01:16:27 root
148: * - fixed STATUS phase (non-GOOD stati were dropped sometimes;
149: * fixes problems with CD-ROM sector size detection & media change)
150: *
151: * Revision 0.100 1993/12/10 16:58:47 root
152: * - fix for unsuccessful selections in case of non-continuous id assignments
153: * on the scsi bus.
154: *
155: * Revision 0.99 1993/10/24 16:19:59 root
156: * - fixed DATA IN (rare read errors gone)
157: *
158: * Revision 0.98 1993/10/17 12:54:44 root
159: * - fixed some recent fixes (shame on me)
160: * - moved initialization of scratch area to aha152x_queue
161: *
162: * Revision 0.97 1993/10/09 18:53:53 root
163: * - DATA IN fixed. Rarely left data in the fifo.
164: *
165: * Revision 0.96 1993/10/03 00:53:59 root
166: * - minor changes on DATA IN
167: *
168: * Revision 0.95 1993/09/24 10:36:01 root
169: * - change handling of MSGI after reselection
170: * - fixed sti/cli
171: * - minor changes
172: *
173: * Revision 0.94 1993/09/18 14:08:22 root
174: * - fixed bug in multiple outstanding command code
175: * - changed detection
176: * - support for kernel command line configuration
177: * - reset corrected
178: * - changed message handling
179: *
180: * Revision 0.93 1993/09/15 20:41:19 root
181: * - fixed bugs with multiple outstanding commands
182: *
183: * Revision 0.92 1993/09/13 02:46:33 root
184: * - multiple outstanding commands work (no problems with IBM drive)
185: *
186: * Revision 0.91 1993/09/12 20:51:46 root
187: * added multiple outstanding commands
188: * (some problem with this $%&? IBM device remain)
189: *
190: * Revision 0.9 1993/09/12 11:11:22 root
191: * - corrected auto-configuration
192: * - changed the auto-configuration (added some '#define's)
193: * - added support for dis-/reconnection
194: *
195: * Revision 0.8 1993/09/06 23:09:39 root
196: * - added support for the drive activity light
197: * - minor changes
198: *
199: * Revision 0.7 1993/09/05 14:30:15 root
200: * - improved phase detection
201: * - now using the new snarf_region code of 0.99pl13
202: *
203: * Revision 0.6 1993/09/02 11:01:38 root
204: * first public release; added some signatures and biosparam()
205: *
206: * Revision 0.5 1993/08/30 10:23:30 root
207: * fixed timing problems with my IBM drive
208: *
209: * Revision 0.4 1993/08/29 14:06:52 root
210: * fixed some problems with timeouts due incomplete commands
211: *
212: * Revision 0.3 1993/08/28 15:55:03 root
213: * writing data works too. mounted and worked on a dos partition
214: *
215: * Revision 0.2 1993/08/27 22:42:07 root
216: * reading data works. Mounted a msdos partition.
217: *
218: * Revision 0.1 1993/08/25 13:38:30 root
219: * first "damn thing doesn't work" version
220: *
221: * Revision 0.0 1993/08/14 19:54:25 root
222: * empty function bodies; detect() works.
223: *
224: *
225: **************************************************************************
226:
227:
228:
229: DESCRIPTION:
230:
231: This is the Linux low-level SCSI driver for Adaptec AHA-1520/1522 SCSI
232: host adapters.
233:
234:
235: CONFIGURATION ARGUMENTS:
236:
237: IOPORT base io address (0x340/0x140)
238: IRQ interrupt level (9-12; default 11)
239: SCSI_ID scsi id of controller (0-7; default 7)
240: RECONNECT allow targets to disconnect from the bus (0/1; default 1 [on])
241: PARITY enable parity checking (0/1; default 1 [on])
242: SYNCHRONOUS enable synchronous transfers (0/1; default 0 [off])
243: (NOT WORKING YET)
244: DELAY: bus reset delay (default 100)
245: EXT_TRANS: enable extended translation (0/1: default 0 [off])
246: (see NOTES below)
247:
248: COMPILE TIME CONFIGURATION (put into AHA152X in drivers/scsi/Makefile):
249:
250: -DAUTOCONF
251: use configuration the controller reports (AHA-152x only)
252:
253: -DSKIP_BIOSTEST
254: Don't test for BIOS signature (AHA-1510 or disabled BIOS)
255:
256: -DSETUP0="{ IOPORT, IRQ, SCSI_ID, RECONNECT, PARITY, SYNCHRONOUS, DELAY, EXT_TRANS }"
257: override for the first controller
258:
259: -DSETUP1="{ IOPORT, IRQ, SCSI_ID, RECONNECT, PARITY, SYNCHRONOUS, DELAY, EXT_TRANS }"
260: override for the second controller
261:
262:
263: LILO COMMAND LINE OPTIONS:
264:
265: aha152x=<IOPORT>[,<IRQ>[,<SCSI-ID>[,<RECONNECT>[,<PARITY>[,<SYNCHRONOUS>[,<DELAY> [,<EXT_TRANS]]]]]]]
266:
267: The normal configuration can be overridden by specifying a command line.
268: When you do this, the BIOS test is skipped. Entered values have to be
269: valid (known). Don't use values that aren't supported under normal
270: operation. If you think that you need other values: contact me.
271: For two controllers use the aha152x statement twice.
272:
273:
274: SYMBOLS FOR MODULE CONFIGURATION:
275:
276: aha152x=IOPORT,IRQ,SCSI_ID,RECONNECT,PARITY,SYNCHRONOUS,DELAY,EXT_TRANS
277: configuration override of first controller
278:
279:
280: aha152x1=IOPORT,IRQ,SCSI_ID,RECONNECT,PARITY,SYNCHRONOUS,DELAY,EXT_TRANS
281: configuration override of second controller
282:
283:
284: NOTES ON EXT_TRANS:
285:
286: SCSI uses block numbers to address blocks/sectors on a device.
287: The BIOS uses a cylinder/head/sector addressing scheme (C/H/S)
288: scheme instead. DOS expects a BIOS or driver that understands this
289: C/H/S addressing.
290:
291: The number of cylinders/heads/sectors is called geometry and is required
292: as base for requests in C/H/S adressing. SCSI only knows about the
293: total capacity of disks in blocks (sectors).
294:
295: Therefore the SCSI BIOS/DOS driver has to calculate a logical/virtual
296: geometry just to be able to support that addressing scheme. The geometry
297: returned by the SCSI BIOS is a pure calculation and has nothing to
298: do with the real/physical geometry of the disk (which is usually
299: irrelevant anyway).
300:
301: Basically this has no impact at all on Linux, because it also uses block
302: instead of C/H/S addressing. Unfortunately C/H/S addressing is also used
303: in the partition table and therefore every operating system has to know
304: the right geometry to be able to interpret it.
305:
306: Moreover there are certain limitations to the C/H/S addressing scheme,
307: namely the address space is limited to upto 255 heads, upto 63 sectors
308: and a maximum of 1023 cylinders.
309:
310: The AHA-1522 BIOS calculates the geometry by fixing the number of heads
311: to 64, the number of sectors to 32 and by calculating the number of
312: cylinders by dividing the capacity reported by the disk by 64*32 (1 MB).
313: This is considered to be the default translation.
314:
315: With respect to the limit of 1023 cylinders using C/H/S you can only
316: address the first GB of your disk in the partition table. Therefore
317: BIOSes of some newer controllers based on the AIC-6260/6360 support
318: extended translation. This means that the BIOS uses 255 for heads,
319: 63 for sectors and then divides the capacity of the disk by 255*63
320: (about 8 MB), as soon it sees a disk greater than 1 GB. That results
321: in a maximum of about 8 GB adressable diskspace in the partition table
322: (but there are already bigger disks out there today).
323:
324: To make it even more complicated the translation mode might/might
325: not be configurable in certain BIOS setups.
326:
327: This driver does some more or less failsafe guessing to get the
328: geometry right in most cases:
329:
330: - for disks<1GB: use default translation (C/32/64)
331: - for disks>1GB:
332: - take current geometry from the partition table
333: (using scsicam_bios_param and accept only `valid' geometries,
334: ie. either (C/32/64) or (C/63/255)). This can be extended
335: translation even if it's not enabled in the driver.
336: - if that fails, take extended translation if enabled by override,
337: kernel or module parameter, otherwise take default translation and
338: ask the user for verification. This might on not yet partitioned
339: disks or
340:
341:
342: REFERENCES USED:
343:
344: "AIC-6260 SCSI Chip Specification", Adaptec Corporation.
345:
346: "SCSI COMPUTER SYSTEM INTERFACE - 2 (SCSI-2)", X3T9.2/86-109 rev. 10h
347:
348: "Writing a SCSI device driver for Linux", Rik Faith ([email protected])
349:
350: "Kernel Hacker's Guide", Michael K. Johnson ([email protected])
351:
352: "Adaptec 1520/1522 User's Guide", Adaptec Corporation.
353:
354: Michael K. Johnson ([email protected])
355:
356: Drew Eckhardt ([email protected])
357:
358: Eric Youngdale ([email protected])
359:
360: special thanks to Eric Youngdale for the free(!) supplying the
361: documentation on the chip.
362:
363: **************************************************************************/
364:
365: #ifdef PCMCIA
366: #define MODULE
367: #endif
368:
369: #include <linux/module.h>
370:
371: #ifdef PCMCIA
372: #undef MODULE
373: #endif
374:
375: #include <linux/sched.h>
376: #include <asm/io.h>
377: #include <linux/blk.h>
378: #include "scsi.h"
379: #include "sd.h"
380: #include "hosts.h"
381: #include "constants.h"
382: #include <asm/system.h>
383: #include <linux/errno.h>
384: #include <linux/string.h>
385: #include <linux/wait.h>
386: #include <linux/ioport.h>
387: #include <linux/proc_fs.h>
388:
389: #include "aha152x.h"
390: #include <linux/stat.h>
391:
392: #include <scsi/scsicam.h>
393:
394: struct proc_dir_entry proc_scsi_aha152x = {
395: PROC_SCSI_AHA152X, 7, "aha152x",
396: S_IFDIR | S_IRUGO | S_IXUGO, 2
397: };
398:
399: /* DEFINES */
400:
401: /* For PCMCIA cards, always use AUTOCONF */
402: #if defined(PCMCIA) || defined(MODULE)
403: #if !defined(AUTOCONF)
404: #define AUTOCONF
405: #endif
406: #endif
407:
408: #if !defined(AUTOCONF) && !defined(SETUP0)
409: #error define AUTOCONF or SETUP0
410: #endif
411:
412: #if defined(DEBUG_AHA152X)
413:
414: #undef SKIP_PORTS /* don't display ports */
415:
416: #undef DEBUG_QUEUE /* debug queue() */
417: #undef DEBUG_RESET /* debug reset() */
418: #undef DEBUG_INTR /* debug intr() */
419: #undef DEBUG_SELECTION /* debug selection part in intr() */
420: #undef DEBUG_MSGO /* debug message out phase in intr() */
421: #undef DEBUG_MSGI /* debug message in phase in intr() */
422: #undef DEBUG_STATUS /* debug status phase in intr() */
423: #undef DEBUG_CMD /* debug command phase in intr() */
424: #undef DEBUG_DATAI /* debug data in phase in intr() */
425: #undef DEBUG_DATAO /* debug data out phase in intr() */
426: #undef DEBUG_ABORT /* debug abort() */
427: #undef DEBUG_DONE /* debug done() */
428: #undef DEBUG_BIOSPARAM /* debug biosparam() */
429:
430: #undef DEBUG_RACE /* debug race conditions */
431: #undef DEBUG_PHASES /* debug phases (useful to trace) */
432: #undef DEBUG_QUEUES /* debug reselection */
433:
434: /* recently used for debugging */
435: #if 0
436: #endif
437:
438: #define DEBUG_SELECTION
439: #define DEBUG_PHASES
440: #define DEBUG_RESET
441: #define DEBUG_ABORT
442:
443: #define DEBUG_DEFAULT (debug_reset|debug_abort)
444:
445: #endif
446:
447: /* END OF DEFINES */
448:
449: extern unsigned long loops_per_sec;
450:
451: #define DELAY_DEFAULT 100
452:
453: /* some additional "phases" for getphase() */
454: #define P_BUSFREE 1
455: #define P_PARITY 2
456:
457: /* possible irq range */
458: #define IRQ_MIN 9
459: #define IRQ_MAX 12
460: #define IRQS IRQ_MAX-IRQ_MIN+1
461:
462: enum {
463: not_issued = 0x0001,
464: in_selection = 0x0002,
465: disconnected = 0x0004,
466: aborted = 0x0008,
467: sent_ident = 0x0010,
468: in_other = 0x0020,
469: in_sync = 0x0040,
470: sync_ok = 0x0080,
471: };
472:
473: #if defined(MODULE)
474: #if defined(DEBUG_AHA152X)
475: int aha152x[] = { 0, 11, 7, 1, 1, 0, DELAY_DEFAULT, 0, DEBUG_DEFAULT };
476: int aha152x1[] = { 0, 11, 7, 1, 1, 0, DELAY_DEFAULT, 0, DEBUG_DEFAULT };
477: #else
478: int aha152x[] = { 0, 11, 7, 1, 1, 0, DELAY_DEFAULT, 0 };
479: int aha152x1[] = { 0, 11, 7, 1, 1, 0, DELAY_DEFAULT, 0 };
480: #endif
481: #endif
482:
483: /* set by aha152x_setup according to the command line */
484: static int setup_count=0;
485: static struct aha152x_setup {
486: int io_port;
487: int irq;
488: int scsiid;
489: int reconnect;
490: int parity;
491: int synchronous;
492: int delay;
493: int ext_trans;
494: #ifdef DEBUG_AHA152X
495: int debug;
496: #endif
497: char *conf;
498: } setup[2];
499:
500: static struct Scsi_Host *aha152x_host[IRQS];
501:
502: #define HOSTDATA(shpnt) ((struct aha152x_hostdata *) &shpnt->hostdata)
503: #define CURRENT_SC (HOSTDATA(shpnt)->current_SC)
504: #define ISSUE_SC (HOSTDATA(shpnt)->issue_SC)
505: #define DISCONNECTED_SC (HOSTDATA(shpnt)->disconnected_SC)
506: #define DELAY (HOSTDATA(shpnt)->delay)
507: #define EXT_TRANS (HOSTDATA(shpnt)->ext_trans)
508: #define SYNCRATE (HOSTDATA(shpnt)->syncrate[CURRENT_SC->target])
509: #define MSG(i) (HOSTDATA(shpnt)->message[i])
510: #define MSGLEN (HOSTDATA(shpnt)->message_len)
511: #define ADDMSG(x) (MSG(MSGLEN++)=x)
512:
513: struct aha152x_hostdata {
514: Scsi_Cmnd *issue_SC;
515: Scsi_Cmnd *current_SC;
516: Scsi_Cmnd *disconnected_SC;
517: int aborting;
518: int abortion_complete;
519: int abort_result;
520: int commands;
521:
522: int reconnect;
523: int parity;
524: int synchronous;
525: int delay;
526: int ext_trans;
527:
528: int swint;
529:
530: unsigned char syncrate[8];
531:
532: unsigned char message[256];
533: int message_len;
534:
535: #ifdef DEBUG_AHA152X
536: int debug;
537: #endif
538: };
539:
540: void aha152x_intr(int irq, void *dev_id, struct pt_regs *);
541: void aha152x_done(struct Scsi_Host *shpnt, int error);
542: void aha152x_setup(char *str, int *ints);
543: int aha152x_checksetup(struct aha152x_setup *setup);
544:
545: static void aha152x_reset_ports(struct Scsi_Host *shpnt);
546: static void aha152x_panic(struct Scsi_Host *shpnt, char *msg);
547:
548: static void disp_ports(struct Scsi_Host *shpnt);
549: static void show_command(Scsi_Cmnd *ptr);
550: static void show_queues(struct Scsi_Host *shpnt);
551: static void disp_enintr(struct Scsi_Host *shpnt);
552:
553: #if defined(DEBUG_RACE)
554: static void enter_driver(const char *);
555: static void leave_driver(const char *);
556: #endif
557:
558: /* possible i/o addresses for the AIC-6260 */
559: static unsigned short ports[] =
560: {
561: 0x340, /* default first */
562: 0x140
563: };
564: #define PORT_COUNT (sizeof(ports) / sizeof(unsigned short))
565:
566: #if !defined(SKIP_BIOSTEST)
567: /* possible locations for the Adaptec BIOS */
568: static void *addresses[] =
569: {
570: (void *) 0xdc000, /* default first */
571: (void *) 0xc8000,
572: (void *) 0xcc000,
573: (void *) 0xd0000,
574: (void *) 0xd4000,
575: (void *) 0xd8000,
576: (void *) 0xe0000,
577: (void *) 0xeb800, /* VTech Platinum SMP */
578: (void *) 0xf0000,
579: };
580: #define ADDRESS_COUNT (sizeof(addresses) / sizeof(void *))
581:
582: /* signatures for various AIC-6[23]60 based controllers.
583: The point in detecting signatures is to avoid useless and maybe
584: harmful probes on ports. I'm not sure that all listed boards pass
585: auto-configuration. For those which fail the BIOS signature is
586: obsolete, because user intervention to supply the configuration is
587: needed anyway. May be an information whether or not the BIOS supports
588: extended translation could be also useful here. */
589: static struct signature {
590: char *signature;
591: int sig_offset;
592: int sig_length;
593: } signatures[] =
594: {
595: { "Adaptec AHA-1520 BIOS", 0x102e, 21 }, /* Adaptec 152x */
596: { "Adaptec AHA-1520B", 0x0b, 17 }, /* Adaptec 152x rev B */
597: { "Adaptec AHA-1520B/1522B", 0x3e20, 23 }, /* Adaptec 1520B/1522B */
598: { "Adaptec ASW-B626 BIOS", 0x1029, 21 }, /* on-board controller */
599: { "Adaptec BIOS: ASW-B626", 0x0f, 22 }, /* on-board controller */
600: { "Adaptec ASW-B626 S2", 0x2e6c, 19 }, /* on-board controller */
601: { "Adaptec BIOS:AIC-6360", 0xc, 21 }, /* on-board controller */
602: { "ScsiPro SP-360 BIOS", 0x2873, 19 }, /* ScsiPro-Controller */
603: { "GA-400 LOCAL BUS SCSI BIOS", 0x102e, 26 }, /* Gigabyte Local-Bus-SCSI */
604: { "Adaptec BIOS:AVA-282X", 0xc, 21 }, /* Adaptec 282x */
605: { "Adaptec IBM Dock II SCSI", 0x2edd, 24 }, /* IBM Thinkpad Dock II */
606: { "Adaptec BIOS:AHA-1532P", 0x1c, 22 }, /* IBM Thinkpad Dock II SCSI */
607: };
608: #define SIGNATURE_COUNT (sizeof(signatures) / sizeof(struct signature))
609: #endif
610:
611:
612: static void do_pause(unsigned amount) /* Pause for amount*10 milliseconds */
613: {
614: unsigned long the_time = jiffies + amount; /* 0.01 seconds per jiffy */
615:
616: while (jiffies < the_time)
617: barrier();
618: }
619:
620: /*
621: * queue services:
622: */
623: static inline void append_SC(Scsi_Cmnd **SC, Scsi_Cmnd *new_SC)
624: {
625: Scsi_Cmnd *end;
626:
627: new_SC->host_scribble = (unsigned char *) NULL;
628: if(!*SC)
629: *SC=new_SC;
630: else {
631: for(end=*SC; end->host_scribble; end = (Scsi_Cmnd *) end->host_scribble)
632: ;
633: end->host_scribble = (unsigned char *) new_SC;
634: }
635: }
636:
637: static inline Scsi_Cmnd *remove_first_SC(Scsi_Cmnd **SC)
638: {
639: Scsi_Cmnd *ptr;
640:
641: ptr=*SC;
642: if(ptr)
643: *SC= (Scsi_Cmnd *) (*SC)->host_scribble;
644: return ptr;
645: }
646:
647: static inline Scsi_Cmnd *remove_SC(Scsi_Cmnd **SC, int target, int lun)
648: {
649: Scsi_Cmnd *ptr, *prev;
650:
651: for(ptr=*SC, prev=NULL;
652: ptr && ((ptr->target!=target) || (ptr->lun!=lun));
653: prev = ptr, ptr = (Scsi_Cmnd *) ptr->host_scribble)
654: ;
655:
656: if(ptr){
657: if(prev)
658: prev->host_scribble = ptr->host_scribble;
659: else
660: *SC= (Scsi_Cmnd *) ptr->host_scribble;
661: }
662:
663: return ptr;
664: }
665:
666: /*
667: * read inbound byte and wait for ACK to get low
668: */
669: static void make_acklow(struct Scsi_Host *shpnt)
670: {
671: SETPORT(SXFRCTL0, CH1|SPIOEN);
672: GETPORT(SCSIDAT);
673: SETPORT(SXFRCTL0, CH1);
674:
675: while(TESTHI(SCSISIG, ACKI))
676: barrier();
677: }
678:
679: /*
680: * detect current phase more reliable:
681: * phase is valid, when the target asserts REQ after we've deasserted ACK.
682: *
683: * return value is a valid phase or an error code.
684: *
685: * errorcodes:
686: * P_BUSFREE BUS FREE phase detected
687: * P_PARITY parity error in DATA phase
688: */
689: static int getphase(struct Scsi_Host *shpnt)
690: {
691: int phase, sstat1;
692:
693: while(1) {
694: do {
695: while(!((sstat1 = GETPORT(SSTAT1)) & (BUSFREE|SCSIRSTI|REQINIT)))
696: barrier();
697: if(sstat1 & BUSFREE)
698: return P_BUSFREE;
699: if(sstat1 & SCSIRSTI) {
700: printk("aha152x: RESET IN\n");
701: SETPORT(SSTAT1, SCSIRSTI);
702: }
703: } while(TESTHI(SCSISIG, ACKI) || TESTLO(SSTAT1, REQINIT));
704:
705: SETPORT(SSTAT1, CLRSCSIPERR);
706:
707: phase = GETPORT(SCSISIG) & P_MASK ;
708:
709: if(TESTHI(SSTAT1, SCSIPERR)) {
710: if((phase & (CDO|MSGO))==0) /* DATA phase */
711: return P_PARITY;
712:
713: make_acklow(shpnt);
714: } else
715: return phase;
716: }
717: }
718:
719: /* called from init/main.c */
720: void aha152x_setup(char *str, int *ints)
721: {
722: if(setup_count>2)
723: panic("aha152x: you can only configure up to two controllers\n");
724:
725: setup[setup_count].conf = str;
726: setup[setup_count].io_port = ints[0] >= 1 ? ints[1] : 0x340;
727: setup[setup_count].irq = ints[0] >= 2 ? ints[2] : 11;
728: setup[setup_count].scsiid = ints[0] >= 3 ? ints[3] : 7;
729: setup[setup_count].reconnect = ints[0] >= 4 ? ints[4] : 1;
730: setup[setup_count].parity = ints[0] >= 5 ? ints[5] : 1;
731: setup[setup_count].synchronous = ints[0] >= 6 ? ints[6] : 0 /* FIXME: 1 */;
732: setup[setup_count].delay = ints[0] >= 7 ? ints[7] : DELAY_DEFAULT;
733: setup[setup_count].ext_trans = ints[0] >= 8 ? ints[8] : 0;
734: #ifdef DEBUG_AHA152X
735: setup[setup_count].debug = ints[0] >= 9 ? ints[9] : DEBUG_DEFAULT;
736: if(ints[0]>9) {
737: printk("aha152x: usage: aha152x=<IOBASE>[,<IRQ>[,<SCSI ID>"
738: "[,<RECONNECT>[,<PARITY>[,<SYNCHRONOUS>[,<DELAY>[,<EXT_TRANS>[,<DEBUG>]]]]]]]]\n");
739: #else
740: if(ints[0]>8) {
741: printk("aha152x: usage: aha152x=<IOBASE>[,<IRQ>[,<SCSI ID>"
742: "[,<RECONNECT>[,<PARITY>[,<SYNCHRONOUS>[,<DELAY>[,<EXT_TRANS>]]]]]]]\n");
743: #endif
744: } else
745: setup_count++;
746: }
747:
748: /*
749: * Test, if port_base is valid.
750: */
751: static int aha152x_porttest(int io_port)
752: {
753: int i;
754:
755: if(check_region(io_port, IO_RANGE))
756: return 0;
757:
758: SETPORT(io_port+O_DMACNTRL1, 0); /* reset stack pointer */
759: for(i=0; i<16; i++)
760: SETPORT(io_port+O_STACK, i);
761:
762: SETPORT(io_port+O_DMACNTRL1, 0); /* reset stack pointer */
763: for(i=0; i<16 && GETPORT(io_port+O_STACK)==i; i++)
764: ;
765:
766: return(i==16);
767: }
768:
769: int aha152x_checksetup(struct aha152x_setup *setup)
770: {
771: int i;
772:
773: #ifndef PCMCIA
774: for(i=0; i<PORT_COUNT && (setup->io_port != ports[i]); i++)
775: ;
776:
777: if(i==PORT_COUNT)
778: return 0;
779: #endif
780:
781: if(!aha152x_porttest(setup->io_port))
782: return 0;
783:
784: if(setup->irq<IRQ_MIN && setup->irq>IRQ_MAX)
785: return 0;
786:
787: if((setup->scsiid < 0) || (setup->scsiid > 7))
788: return 0;
789:
790: if((setup->reconnect < 0) || (setup->reconnect > 1))
791: return 0;
792:
793: if((setup->parity < 0) || (setup->parity > 1))
794: return 0;
795:
796: if((setup->synchronous < 0) || (setup->synchronous > 1))
797: return 0;
798:
799: if((setup->ext_trans < 0) || (setup->ext_trans > 1))
800: return 0;
801:
802:
803: return 1;
804: }
805:
806: void aha152x_swintr(int irqno, void *dev_id, struct pt_regs * regs)
807: {
808: struct Scsi_Host *shpnt = aha152x_host[irqno-IRQ_MIN];
809:
810: if(!shpnt)
811: panic("aha152x: catched software interrupt for unknown controller.\n");
812:
813: HOSTDATA(shpnt)->swint++;
814: }
815:
816:
817: int aha152x_detect(Scsi_Host_Template * tpnt)
818: {
819: int i, j, ok;
820: #if defined(AUTOCONF)
821: aha152x_config conf;
822: #endif
823:
824: tpnt->proc_dir = &proc_scsi_aha152x;
825:
826: for(i=0; i<IRQS; i++)
827: aha152x_host[i] = (struct Scsi_Host *) NULL;
828:
829: if(setup_count) {
830: printk("aha152x: processing commandline: ");
831:
832: for(i=0; i<setup_count; i++)
833: if(!aha152x_checksetup(&setup[i])) {
834: printk("\naha152x: %s\n", setup[i].conf);
835: printk("aha152x: invalid line (controller=%d)\n", i+1);
836: }
837:
838: printk("ok\n");
839: }
840:
841: #ifdef SETUP0
842: if(setup_count<2) {
843: struct aha152x_setup override = SETUP0;
844:
845: if(setup_count==0 || (override.io_port != setup[0].io_port))
846: if(!aha152x_checksetup(&override)) {
847: printk("\naha152x: invalid override SETUP0={0x%x,%d,%d,%d,%d,%d,%d,%d}\n",
848: override.io_port,
849: override.irq,
850: override.scsiid,
851: override.reconnect,
852: override.parity,
853: override.synchronous,
854: override.delay,
855: override.ext_trans);
856: } else
857: setup[setup_count++] = override;
858: }
859: #endif
860:
861: #ifdef SETUP1
862: if(setup_count<2) {
863: struct aha152x_setup override = SETUP1;
864:
865: if(setup_count==0 || (override.io_port != setup[0].io_port))
866: if(!aha152x_checksetup(&override)) {
867: printk("\naha152x: invalid override SETUP1={0x%x,%d,%d,%d,%d,%d,%d,%d}\n",
868: override.io_port,
869: override.irq,
870: override.scsiid,
871: override.reconnect,
872: override.parity,
873: override.synchronous,
874: override.delay,
875: override.ext_trans);
876: } else
877: setup[setup_count++] = override;
878: }
879: #endif
880:
881: #if defined(MODULE)
882: if(setup_count<2 && aha152x[0]!=0) {
883: setup[setup_count].conf = "";
884: setup[setup_count].io_port = aha152x[0];
885: setup[setup_count].irq = aha152x[1];
886: setup[setup_count].scsiid = aha152x[2];
887: setup[setup_count].reconnect = aha152x[3];
888: setup[setup_count].parity = aha152x[4];
889: setup[setup_count].synchronous = aha152x[5];
890: setup[setup_count].delay = aha152x[6];
891: setup[setup_count].ext_trans = aha152x[7];
892: #ifdef DEBUG_AHA152X
893: setup[setup_count].debug = aha152x[8];
894: #endif
895: if(aha152x_checksetup(&setup[setup_count]))
896: setup_count++;
897: else
898: printk("\naha152x: invalid module argument aha152x=0x%x,%d,%d,%d,%d,%d,%d,%d\n",
899: setup[setup_count].io_port,
900: setup[setup_count].irq,
901: setup[setup_count].scsiid,
902: setup[setup_count].reconnect,
903: setup[setup_count].parity,
904: setup[setup_count].synchronous,
905: setup[setup_count].delay,
906: setup[setup_count].ext_trans);
907: }
908:
909: if(setup_count<2 && aha152x1[0]!=0) {
910: setup[setup_count].conf = "";
911: setup[setup_count].io_port = aha152x1[0];
912: setup[setup_count].irq = aha152x1[1];
913: setup[setup_count].scsiid = aha152x1[2];
914: setup[setup_count].reconnect = aha152x1[3];
915: setup[setup_count].parity = aha152x1[4];
916: setup[setup_count].synchronous = aha152x1[5];
917: setup[setup_count].delay = aha152x1[6];
918: setup[setup_count].ext_trans = aha152x1[7];
919: #ifdef DEBUG_AHA152X
920: setup[setup_count].debug = aha152x1[8];
921: #endif
922: if(aha152x_checksetup(&setup[setup_count]))
923: setup_count++;
924: else
925: printk("\naha152x: invalid module argument aha152x1=0x%x,%d,%d,%d,%d,%d,%d,%d\n",
926: setup[setup_count].io_port,
927: setup[setup_count].irq,
928: setup[setup_count].scsiid,
929: setup[setup_count].reconnect,
930: setup[setup_count].parity,
931: setup[setup_count].synchronous,
932: setup[setup_count].delay,
933: setup[setup_count].ext_trans);
934: }
935: #endif
936:
937: #if defined(AUTOCONF)
938: if(setup_count<2) {
939: #if !defined(SKIP_BIOSTEST)
940: ok=0;
941: for(i=0; i < ADDRESS_COUNT && !ok; i++)
942: for(j=0; (j < SIGNATURE_COUNT) && !ok; j++)
943: ok=!memcmp((void *) addresses[i]+signatures[j].sig_offset,
944: (void *) signatures[j].signature,
945: (int) signatures[j].sig_length);
946:
947: if(!ok && setup_count==0)
948: return 0;
949:
950: printk("aha152x: BIOS test: passed, ");
951: #else
952: printk("aha152x: ");
953: #endif /* !SKIP_BIOSTEST */
954:
955: ok=0;
956: for(i=0; i<PORT_COUNT && setup_count<2; i++) {
957: if((setup_count==1) && (setup[0].io_port == ports[i]))
958: continue;
959:
960: if(aha152x_porttest(ports[i])) {
961: ok++;
962: setup[setup_count].io_port = ports[i];
963:
964: conf.cf_port =
965: (GETPORT(ports[i]+O_PORTA)<<8) + GETPORT(ports[i]+O_PORTB);
966:
967: setup[setup_count].irq = IRQ_MIN + conf.cf_irq;
968: setup[setup_count].scsiid = conf.cf_id;
969: setup[setup_count].reconnect = conf.cf_tardisc;
970: setup[setup_count].parity = !conf.cf_parity;
971: setup[setup_count].synchronous = 0 /* FIXME: conf.cf_syncneg */;
972: setup[setup_count].delay = DELAY_DEFAULT;
973: setup[setup_count].ext_trans = 0;
974: #ifdef DEBUG_AHA152X
975: setup[setup_count].debug = DEBUG_DEFAULT;
976: #endif
977: setup_count++;
978: }
979: }
980:
981: if(ok)
982: printk("auto configuration: ok, ");
983: }
984: #endif
985:
986: printk("detected %d controller(s)\n", setup_count);
987:
988: for(i=0; i<setup_count; i++) {
989: struct Scsi_Host *shpnt;
990: unsigned long int the_time;
991:
992: shpnt = aha152x_host[setup[i].irq-IRQ_MIN] =
993: scsi_register(tpnt, sizeof(struct aha152x_hostdata));
994:
995: shpnt->io_port = setup[i].io_port;
996: shpnt->n_io_port = IO_RANGE;
997: shpnt->irq = setup[i].irq;
998:
999: ISSUE_SC = (Scsi_Cmnd *) NULL;
1000: CURRENT_SC = (Scsi_Cmnd *) NULL;
1001: DISCONNECTED_SC = (Scsi_Cmnd *) NULL;
1002:
1003: HOSTDATA(shpnt)->reconnect = setup[i].reconnect;
1004: HOSTDATA(shpnt)->parity = setup[i].parity;
1005: HOSTDATA(shpnt)->synchronous = setup[i].synchronous;
1006: HOSTDATA(shpnt)->delay = setup[i].delay;
1007: HOSTDATA(shpnt)->ext_trans = setup[i].ext_trans;
1008: #ifdef DEBUG_AHA152X
1009: HOSTDATA(shpnt)->debug = setup[i].debug;
1010: #endif
1011:
1012: HOSTDATA(shpnt)->aborting = 0;
1013: HOSTDATA(shpnt)->abortion_complete = 0;
1014: HOSTDATA(shpnt)->abort_result = 0;
1015: HOSTDATA(shpnt)->commands = 0;
1016:
1017: HOSTDATA(shpnt)->message_len = 0;
1018:
1019: for(j=0; j<8; j++)
1020: HOSTDATA(shpnt)->syncrate[j] = 0;
1021:
1022: SETPORT(SCSIID, setup[i].scsiid << 4);
1023: shpnt->this_id=setup[i].scsiid;
1024:
1025: if(setup[i].reconnect)
1026: shpnt->can_queue=AHA152X_MAXQUEUE;
1027:
1028: /* RESET OUT */
1029: SETBITS(SCSISEQ, SCSIRSTO);
1030: do_pause(30);
1031: CLRBITS(SCSISEQ, SCSIRSTO);
1032: do_pause(setup[i].delay);
1033:
1034: aha152x_reset_ports(shpnt);
1035:
1036: printk("aha152x%d: vital data: PORTBASE=0x%03x, IRQ=%d, SCSI ID=%d,"
1037: " reconnect=%s, parity=%s, synchronous=%s, delay=%d, extended translation=%s\n",
1038: i,
1039: shpnt->io_port,
1040: shpnt->irq,
1041: shpnt->this_id,
1042: HOSTDATA(shpnt)->reconnect ? "enabled" : "disabled",
1043: HOSTDATA(shpnt)->parity ? "enabled" : "disabled",
1044: HOSTDATA(shpnt)->synchronous ? "enabled" : "disabled",
1045: HOSTDATA(shpnt)->delay,
1046: HOSTDATA(shpnt)->ext_trans ? "enabled" : "disabled");
1047:
1048: request_region(shpnt->io_port, IO_RANGE, "aha152x"); /* Register */
1049:
1050: /* not expecting any interrupts */
1051: SETPORT(SIMODE0, 0);
1052: SETPORT(SIMODE1, 0);
1053:
1054: SETBITS(DMACNTRL0, INTEN);
1055:
1056: ok = request_irq(shpnt->irq, aha152x_swintr, SA_INTERRUPT, "aha152x", NULL);
1057: if(ok<0) {
1058: if(ok == -EINVAL)
1059: printk("aha152x%d: bad IRQ %d.\n", i, shpnt->irq);
1060: else if(ok == -EBUSY)
1061: printk("aha152x%d: IRQ %d already in use.\n", i, shpnt->irq);
1062: else
1063: printk("\naha152x%d: Unexpected error code %d on requesting IRQ %d.\n", i, ok, shpnt->irq);
1064: printk("aha152x: driver needs an IRQ.\n");
1065:
1066: scsi_unregister(shpnt);
1067: shpnt=aha152x_host[shpnt->irq-IRQ_MIN]=0;
1068: continue;
1069: }
1070:
1071: HOSTDATA(shpnt)->swint=0;
1072:
1073: printk("aha152x: trying software interrupt, ");
1074: SETBITS(DMACNTRL0, SWINT);
1075:
1076: the_time=jiffies+100;
1077: while(!HOSTDATA(shpnt)->swint && jiffies<the_time)
1078: barrier();
1079:
1080: free_irq(shpnt->irq,0);
1081:
1082: if(!HOSTDATA(shpnt)->swint) {
1083: if(TESTHI(DMASTAT, INTSTAT)) {
1084: printk("lost.\n");
1085: } else {
1086: printk("failed.\n");
1087: }
1088:
1089: printk("aha152x: IRQ %d possibly wrong. Please verify.\n", shpnt->irq);
1090:
1091: scsi_unregister(shpnt);
1092: shpnt=aha152x_host[shpnt->irq-IRQ_MIN]=0;
1093: continue;
1094: }
1095:
1096: printk("ok.\n");
1097:
1098: CLRBITS(DMACNTRL0, SWINT);
1099:
1100: /* clear interrupts */
1101: SETPORT(SSTAT0, 0x7f);
1102: SETPORT(SSTAT1, 0xef);
1103:
1104: if(request_irq(shpnt->irq,aha152x_intr,SA_INTERRUPT,"aha152x",NULL)<0) {
1105: printk("aha152x: failed to reassign interrupt.\n");
1106: }
1107: }
1108:
1109: return (setup_count>0);
1110: }
1111:
1112: /*
1113: * Queue a command and setup interrupts for a free bus.
1114: */
1115: int aha152x_queue(Scsi_Cmnd * SCpnt, void (*done)(Scsi_Cmnd *))
1116: {
1117: struct Scsi_Host *shpnt = SCpnt->host;
1118: unsigned long flags;
1119:
1120: #if defined(DEBUG_RACE)
1121: enter_driver("queue");
1122: #else
1123: #if defined(DEBUG_QUEUE)
1124: if(HOSTDATA(shpnt)->debug & debug_queue)
1125: printk("aha152x: queue(), ");
1126: #endif
1127: #endif
1128:
1129: #if defined(DEBUG_QUEUE)
1130: if(HOSTDATA(shpnt)->debug & debug_queue) {
1131: printk("SCpnt (target = %d lun = %d cmnd = ",
1132: SCpnt->target, SCpnt->lun);
1133: print_command(SCpnt->cmnd);
1134: printk(", cmd_len=%d, pieces = %d size = %u), ",
1135: SCpnt->cmd_len, SCpnt->use_sg, SCpnt->request_bufflen);
1136: disp_ports(shpnt);
1137: }
1138: #endif
1139:
1140: SCpnt->scsi_done = done;
1141:
1142: /* setup scratch area
1143: SCp.ptr : buffer pointer
1144: SCp.this_residual : buffer length
1145: SCp.buffer : next buffer
1146: SCp.buffers_residual : left buffers in list
1147: SCp.phase : current state of the command */
1148: SCpnt->SCp.phase = not_issued;
1149: if (SCpnt->use_sg) {
1150: SCpnt->SCp.buffer = (struct scatterlist *) SCpnt->request_buffer;
1151: SCpnt->SCp.ptr = SCpnt->SCp.buffer->address;
1152: SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length;
1153: SCpnt->SCp.buffers_residual = SCpnt->use_sg - 1;
1154: } else {
1155: SCpnt->SCp.ptr = (char *)SCpnt->request_buffer;
1156: SCpnt->SCp.this_residual = SCpnt->request_bufflen;
1157: SCpnt->SCp.buffer = NULL;
1158: SCpnt->SCp.buffers_residual = 0;
1159: }
1160:
1161: SCpnt->SCp.Status = CHECK_CONDITION;
1162: SCpnt->SCp.Message = 0;
1163: SCpnt->SCp.have_data_in = 0;
1164: SCpnt->SCp.sent_command = 0;
1165:
1166: /* Turn led on, when this is the first command. */
1167: save_flags(flags);
1168: cli();
1169: HOSTDATA(shpnt)->commands++;
1170: if(HOSTDATA(shpnt)->commands==1)
1171: SETPORT(PORTA, 1);
1172:
1173: #if defined(DEBUG_QUEUES)
1174: if(HOSTDATA(shpnt)->debug & debug_queues)
1175: printk("i+ (%d), ", HOSTDATA(shpnt)->commands);
1176: #endif
1177: append_SC(&ISSUE_SC, SCpnt);
1178:
1179: /* Enable bus free interrupt, when we aren't currently on the bus */
1180: if(!CURRENT_SC) {
1181: SETPORT(SIMODE0, DISCONNECTED_SC ? ENSELDI : 0);
1182: SETPORT(SIMODE1, ISSUE_SC ? ENBUSFREE : 0);
1183: }
1184: restore_flags(flags);
1185:
1186: #if defined(DEBUG_RACE)
1187: leave_driver("queue");
1188: #endif
1189:
1190: return 0;
1191: }
1192:
1193: /*
1194: * We only support commands in interrupt-driven fashion
1195: */
1196: int aha152x_command(Scsi_Cmnd *SCpnt)
1197: {
1198: printk("aha152x: interrupt driven driver; use aha152x_queue()\n");
1199: return -1;
1200: }
1201:
1202: /*
1203: * Abort a queued command
1204: * (commands that are on the bus can't be aborted easily)
1205: */
1206: int aha152x_abort(Scsi_Cmnd *SCpnt)
1207: {
1208: struct Scsi_Host *shpnt = SCpnt->host;
1209: unsigned long flags;
1210: Scsi_Cmnd *ptr, *prev;
1211:
1212: save_flags(flags);
1213: cli();
1214:
1215: #if defined(DEBUG_ABORT)
1216: if(HOSTDATA(shpnt)->debug & debug_abort) {
1217: printk("aha152x: abort(), SCpnt=0x%08x, ", (unsigned int) SCpnt);
1218: show_queues(shpnt);
1219: }
1220: #endif
1221:
1222: /* look for command in issue queue */
1223: for(ptr=ISSUE_SC, prev=NULL;
1224: ptr && ptr!=SCpnt;
1225: prev=ptr, ptr=(Scsi_Cmnd *) ptr->host_scribble)
1226: ;
1227:
1228: if(ptr) {
1229: /* dequeue */
1230: if(prev)
1231: prev->host_scribble = ptr->host_scribble;
1232: else
1233: ISSUE_SC = (Scsi_Cmnd *) ptr->host_scribble;
1234:
1235: HOSTDATA(shpnt)->commands--;
1236:
1237: restore_flags(flags);
1238:
1239: ptr->host_scribble = NULL;
1240: ptr->result = DID_ABORT << 16;
1241: ptr->scsi_done(ptr);
1242:
1243: return SCSI_ABORT_SUCCESS;
1244: }
1245:
1246: /* if the bus is busy or a command is currently processed,
1247: we can't do anything more */
1248: if (TESTLO(SSTAT1, BUSFREE) || (CURRENT_SC && CURRENT_SC!=SCpnt)) {
1249: /* fail abortion, if bus is busy */
1250:
1251: if(!CURRENT_SC)
1252: printk("bus busy w/o current command, ");
1253:
1254: restore_flags(flags);
1255:
1256: return SCSI_ABORT_BUSY;
1257: }
1258:
1259: /* bus is free */
1260:
1261: if(CURRENT_SC) {
1262: HOSTDATA(shpnt)->commands--;
1263:
1264: /* target entered bus free before COMMAND COMPLETE, nothing to abort */
1265: restore_flags(flags);
1266: CURRENT_SC->result = DID_ERROR << 16;
1267: CURRENT_SC->scsi_done(CURRENT_SC);
1268: CURRENT_SC = (Scsi_Cmnd *) NULL;
1269:
1270: return SCSI_ABORT_SUCCESS;
1271: }
1272:
1273: /* look for command in disconnected queue */
1274: for(ptr=DISCONNECTED_SC, prev=NULL;
1275: ptr && ptr!=SCpnt;
1276: prev=ptr, ptr=(Scsi_Cmnd *) ptr->host_scribble)
1277: ;
1278:
1279: if(!ptr) {
1280: /* command wasn't found */
1281: printk("command not found\n");
1282: restore_flags(flags);
1283:
1284: return SCSI_ABORT_NOT_RUNNING;
1285: }
1286:
1287: if(!HOSTDATA(shpnt)->aborting) {
1288: /* dequeue */
1289: if(prev)
1290: prev->host_scribble = ptr->host_scribble;
1291: else
1292: DISCONNECTED_SC = (Scsi_Cmnd *) ptr->host_scribble;
1293:
1294: HOSTDATA(shpnt)->commands--;
1295:
1296: /* set command current and initiate selection,
1297: let the interrupt routine take care of the abortion */
1298: CURRENT_SC = ptr;
1299: ptr->SCp.phase = in_selection|aborted;
1300: SETPORT(SCSIID, (shpnt->this_id << OID_) | CURRENT_SC->target);
1301:
1302: ADDMSG(ABORT);
1303:
1304: /* enable interrupts for SELECTION OUT DONE and SELECTION TIME OUT */
1305: SETPORT(SIMODE0, ENSELDO | (DISCONNECTED_SC ? ENSELDI : 0));
1306: SETPORT(SIMODE1, ENSELTIMO);
1307:
1308: /* Enable SELECTION OUT sequence */
1309: SETBITS(SCSISEQ, ENSELO | ENAUTOATNO);
1310:
1311: SETBITS(DMACNTRL0, INTEN);
1312: HOSTDATA(shpnt)->abort_result=SCSI_ABORT_SUCCESS;
1313: HOSTDATA(shpnt)->aborting++;
1314: HOSTDATA(shpnt)->abortion_complete=0;
1315:
1316: sti(); /* Hi Eric, guess what ;-) */
1317:
1318: /* sleep until the abortion is complete */
1319: while(!HOSTDATA(shpnt)->abortion_complete)
1320: barrier();
1321: HOSTDATA(shpnt)->aborting=0;
1322:
1323: return HOSTDATA(shpnt)->abort_result;
1324: } else {
1325: /* we're already aborting a command */
1326: restore_flags(flags);
1327:
1328: return SCSI_ABORT_BUSY;
1329: }
1330: }
1331:
1332: /*
1333: * Restore default values to the AIC-6260 registers and reset the fifos
1334: */
1335: static void aha152x_reset_ports(struct Scsi_Host *shpnt)
1336: {
1337: /* disable interrupts */
1338: SETPORT(DMACNTRL0, RSTFIFO);
1339:
1340: SETPORT(SCSISEQ, 0);
1341:
1342: SETPORT(SXFRCTL1, 0);
1343: SETPORT(SCSISIG, 0);
1344: SETPORT(SCSIRATE, 0);
1345:
1346: /* clear all interrupt conditions */
1347: SETPORT(SSTAT0, 0x7f);
1348: SETPORT(SSTAT1, 0xef);
1349:
1350: SETPORT(SSTAT4, SYNCERR|FWERR|FRERR);
1351:
1352: SETPORT(DMACNTRL0, 0);
1353: SETPORT(DMACNTRL1, 0);
1354:
1355: SETPORT(BRSTCNTRL, 0xf1);
1356:
1357: /* clear SCSI fifo and transfer count */
1358: SETPORT(SXFRCTL0, CH1|CLRCH1|CLRSTCNT);
1359: SETPORT(SXFRCTL0, CH1);
1360:
1361: /* enable interrupts */
1362: SETPORT(SIMODE0, DISCONNECTED_SC ? ENSELDI : 0);
1363: SETPORT(SIMODE1, ISSUE_SC ? ENBUSFREE : 0);
1364: }
1365:
1366: /*
1367: * Reset registers, reset a hanging bus and
1368: * kill active and disconnected commands for target w/o soft reset
1369: */
1370: int aha152x_reset(Scsi_Cmnd *SCpnt, unsigned int unused)
1371: {
1372: struct Scsi_Host *shpnt = SCpnt->host;
1373: unsigned long flags;
1374: Scsi_Cmnd *ptr, *prev, *next;
1375:
1376: aha152x_reset_ports(shpnt);
1377:
1378: /* Reset, if bus hangs */
1379: if(TESTLO(SSTAT1, BUSFREE)) {
1380: CLRBITS(DMACNTRL0, INTEN);
1381:
1382: #if defined(DEBUG_RESET)
1383: if(HOSTDATA(shpnt)->debug & debug_reset) {
1384: printk("aha152x: reset(), bus not free: SCSI RESET OUT\n");
1385: show_queues(shpnt);
1386: }
1387: #endif
1388:
1389: ptr=CURRENT_SC;
1390: if(ptr && !ptr->device->soft_reset) {
1391: ptr->host_scribble = NULL;
1392: ptr->result = DID_RESET << 16;
1393: ptr->scsi_done(CURRENT_SC);
1394: CURRENT_SC=NULL;
1395: }
1396:
1397: save_flags(flags);
1398: cli();
1399: prev=NULL; ptr=DISCONNECTED_SC;
1400: while(ptr) {
1401: if(!ptr->device->soft_reset) {
1402: if(prev)
1403: prev->host_scribble = ptr->host_scribble;
1404: else
1405: DISCONNECTED_SC = (Scsi_Cmnd *) ptr->host_scribble;
1406:
1407: next = (Scsi_Cmnd *) ptr->host_scribble;
1408:
1409: ptr->host_scribble = NULL;
1410: ptr->result = DID_RESET << 16;
1411: ptr->scsi_done(ptr);
1412:
1413: ptr = next;
1414: } else {
1415: prev=ptr;
1416: ptr = (Scsi_Cmnd *) ptr->host_scribble;
1417: }
1418: }
1419: restore_flags(flags);
1420:
1421: #if defined(DEBUG_RESET)
1422: if(HOSTDATA(shpnt)->debug & debug_reset) {
1423: printk("commands on targets w/ soft-resets:\n");
1424: show_queues(shpnt);
1425: }
1426: #endif
1427:
1428: /* RESET OUT */
1429: SETPORT(SCSISEQ, SCSIRSTO);
1430: do_pause(30);
1431: SETPORT(SCSISEQ, 0);
1432: do_pause(DELAY);
1433:
1434: SETPORT(SIMODE0, DISCONNECTED_SC ? ENSELDI : 0);
1435: SETPORT(SIMODE1, ISSUE_SC ? ENBUSFREE : 0);
1436:
1437: SETPORT(DMACNTRL0, INTEN);
1438: }
1439:
1440: return SCSI_RESET_SUCCESS;
1441: }
1442:
1443: /*
1444: * Return the "logical geometry"
1445: */
1446: int aha152x_biosparam(Scsi_Disk * disk, kdev_t dev, int *info_array)
1447: {
1448: struct Scsi_Host *shpnt=disk->device->host;
1449:
1450: #if defined(DEBUG_BIOSPARAM)
1451: if(HOSTDATA(shpnt)->debug & debug_biosparam)
1452: printk("aha152x_biosparam: dev=%s, size=%d, ",
1453: kdevname(dev), disk->capacity);
1454: #endif
1455:
1456: /* try default translation */
1457: info_array[0]=64;
1458: info_array[1]=32;
1459: info_array[2]=disk->capacity / (64 * 32);
1460:
1461: /* for disks >1GB do some guessing */
1462: if(info_array[2]>=1024) {
1463: int info[3];
1464:
1465: /* try to figure out the geometry from the partition table */
1466: if(scsicam_bios_param(disk, dev, info)<0 ||
1467: !((info[0]==64 && info[1]==32) || (info[0]==255 && info[1]==63))) {
1468: if(EXT_TRANS) {
1469: printk("aha152x: unable to verify geometry for disk with >1GB.\n"
1470: " using extended translation.\n");
1471: info_array[0] = 255;
1472: info_array[1] = 63;
1473: info_array[2] = disk->capacity / (255 * 63);
1474: } else {
1475: printk("aha152x: unable to verify geometry for disk with >1GB.\n"
1476: " Using default translation. Please verify yourself.\n"
1477: " Perhaps you need to enable extended translation in the driver.\n"
1478: " See /usr/src/linux/drivers/scsi/aha152x.c for details.\n");
1479: }
1480: } else {
1481: info_array[0]=info[0];
1482: info_array[1]=info[1];
1483: info_array[2]=info[2];
1484:
1485: if(info[0]==255 && !EXT_TRANS) {
1486: printk("aha152x: current partition table is using extended translation.\n"
1487: " using it also, although it's not explicty enabled.\n");
1488: }
1489: }
1490: }
1491:
1492: #if defined(DEBUG_BIOSPARAM)
1493: if(HOSTDATA(shpnt)->debug & debug_biosparam) {
1494: printk("bios geometry: head=%d, sec=%d, cyl=%d\n",
1495: info_array[0], info_array[1], info_array[2]);
1496: printk("WARNING: check, if the bios geometry is correct.\n");
1497: }
1498: #endif
1499:
1500: return 0;
1501: }
1502:
1503: /*
1504: * Internal done function
1505: */
1506: void aha152x_done(struct Scsi_Host *shpnt, int error)
1507: {
1508: unsigned long flags;
1509: Scsi_Cmnd *done_SC;
1510:
1511: #if defined(DEBUG_DONE)
1512: if(HOSTDATA(shpnt)->debug & debug_done) {
1513: printk("\naha152x: done(), ");
1514: disp_ports(shpnt);
1515: }
1516: #endif
1517:
1518: if(CURRENT_SC) {
1519: #if defined(DEBUG_DONE)
1520: if(HOSTDATA(shpnt)->debug & debug_done)
1521: printk("done(%x), ", error);
1522: #endif
1523:
1524: save_flags(flags);
1525: cli();
1526:
1527: done_SC = CURRENT_SC;
1528: CURRENT_SC = NULL;
1529:
1530: /* turn led off, when no commands are in the driver */
1531: HOSTDATA(shpnt)->commands--;
1532: if(!HOSTDATA(shpnt)->commands)
1533: SETPORT(PORTA, 0); /* turn led off */
1534:
1535: #if defined(DEBUG_QUEUES)
1536: if(HOSTDATA(shpnt)->debug & debug_queues)
1537: printk("ok (%d), ", HOSTDATA(shpnt)->commands);
1538: #endif
1539: restore_flags(flags);
1540:
1541: SETPORT(SIMODE0, DISCONNECTED_SC ? ENSELDI : 0);
1542: SETPORT(SIMODE1, ISSUE_SC ? ENBUSFREE : 0);
1543:
1544: #if 0
1545: /* Why poll for the BUS FREE phase, when we have setup the interrupt!? */
1546: #if defined(DEBUG_PHASES)
1547: if(HOSTDATA(shpnt)->debug & debug_phases)
1548: printk("BUS FREE loop, ");
1549: #endif
1550: while(TESTLO(SSTAT1, BUSFREE))
1551: barrier();
1552: #if defined(DEBUG_PHASES)
1553: if(HOSTDATA(shpnt)->debug & debug_phases)
1554: printk("BUS FREE\n");
1555: #endif
1556: #endif
1557:
1558: done_SC->result = error;
1559: if(done_SC->scsi_done) {
1560: #if defined(DEBUG_DONE)
1561: if(HOSTDATA(shpnt)->debug & debug_done)
1562: printk("calling scsi_done, ");
1563: #endif
1564: done_SC->scsi_done(done_SC);
1565: #if defined(DEBUG_DONE)
1566: if(HOSTDATA(shpnt)->debug & debug_done)
1567: printk("done returned, ");
1568: #endif
1569: } else
1570: panic("aha152x: current_SC->scsi_done() == NULL");
1571: } else
1572: aha152x_panic(shpnt, "done() called outside of command");
1573: }
1574:
1575: /*
1576: * Interrupts handler (main routine of the driver)
1577: */
1578: void aha152x_intr(int irqno, void *dev_id, struct pt_regs * regs)
1579: {
1580: struct Scsi_Host *shpnt = aha152x_host[irqno-IRQ_MIN];
1581: unsigned int flags;
1582: int done=0, phase;
1583:
1584: #if defined(DEBUG_RACE)
1585: enter_driver("intr");
1586: #else
1587: #if defined(DEBUG_INTR)
1588: if(HOSTDATA(shpnt)->debug & debug_intr)
1589: printk("\naha152x: intr(), ");
1590: #endif
1591: #endif
1592:
1593: if(!shpnt)
1594: panic("aha152x: catched interrupt for unknown controller.\n");
1595:
1596: /* no more interrupts from the controller, while we're busy.
1597: INTEN has to be restored, when we're ready to leave
1598: intr(). To avoid race conditions, we have to return
1599: immediately afterwards. */
1600: CLRBITS(DMACNTRL0, INTEN);
1601: sti(); /* Yes, sti() really needs to be here */
1602:
1603: /* disconnected target is trying to reconnect.
1604: Only possible, if we have disconnected nexuses and
1605: nothing is occupying the bus.
1606: */
1607: if(TESTHI(SSTAT0, SELDI) &&
1608: DISCONNECTED_SC &&
1609: (!CURRENT_SC || (CURRENT_SC->SCp.phase & in_selection)) ) {
1610: int identify_msg, target, i;
1611:
1612: /* Avoid conflicts when a target reconnects
1613: while we are trying to connect to another. */
1614: if(CURRENT_SC) {
1615: #if defined(DEBUG_QUEUES)
1616: if(HOSTDATA(shpnt)->debug & debug_queues)
1617: printk("i+, ");
1618: #endif
1619: save_flags(flags);
1620: cli();
1621: append_SC(&ISSUE_SC, CURRENT_SC);
1622: CURRENT_SC=NULL;
1623: restore_flags(flags);
1624: }
1625:
1626: /* disable sequences */
1627: SETPORT(SCSISEQ, 0);
1628: SETPORT(SSTAT0, CLRSELDI);
1629: SETPORT(SSTAT1, CLRBUSFREE);
1630:
1631: #if defined(DEBUG_QUEUES) || defined(DEBUG_PHASES)
1632: if(HOSTDATA(shpnt)->debug & (debug_queues|debug_phases))
1633: printk("reselected, ");
1634: #endif
1635:
1636: i = GETPORT(SELID) & ~(1 << shpnt->this_id);
1637: target=0;
1638:
1639: if(i==0)
1640: aha152x_panic(shpnt, "reconnecting target unknown");
1641:
1642: for(; (i & 1)==0; target++, i>>=1)
1643: ;
1644:
1645: #if defined(DEBUG_QUEUES)
1646: if(HOSTDATA(shpnt)->debug & debug_queues)
1647: printk("SELID=%02x, target=%d, ", GETPORT(SELID), target);
1648: #endif
1649: SETPORT(SCSIID, (shpnt->this_id << OID_) | target);
1650: SETPORT(SCSISEQ, ENRESELI);
1651:
1652: if(TESTLO(SSTAT0, SELDI))
1653: aha152x_panic(shpnt, "RESELI failed");
1654:
1655: SETPORT(SCSIRATE, HOSTDATA(shpnt)->syncrate[target]&0x7f);
1656:
1657: SETPORT(SCSISIG, P_MSGI);
1658:
1659: /* Get identify message */
1660: if((i=getphase(shpnt))!=P_MSGI) {
1661: printk("target doesn't enter MSGI to identify (phase=%02x)\n", i);
1662: aha152x_panic(shpnt, "unknown lun");
1663: }
1664: SETPORT(SCSISEQ, 0);
1665:
1666: SETPORT(SXFRCTL0, CH1);
1667:
1668: identify_msg = GETPORT(SCSIBUS);
1669:
1670: if(!(identify_msg & IDENTIFY_BASE)) {
1671: printk("target=%d, inbound message (%02x) != IDENTIFY\n",
1672: target, identify_msg);
1673: aha152x_panic(shpnt, "unknown lun");
1674: }
1675:
1676:
1677: #if defined(DEBUG_QUEUES)
1678: if(HOSTDATA(shpnt)->debug & debug_queues)
1679: printk("identify=%02x, lun=%d, ", identify_msg, identify_msg & 0x3f);
1680: #endif
1681:
1682: save_flags(flags);
1683: cli();
1684:
1685: #if defined(DEBUG_QUEUES)
1686: if(HOSTDATA(shpnt)->debug & debug_queues)
1687: printk("d-, ");
1688: #endif
1689: CURRENT_SC = remove_SC(&DISCONNECTED_SC, target, identify_msg & 0x3f);
1690:
1691: if(!CURRENT_SC) {
1692: printk("lun=%d, ", identify_msg & 0x3f);
1693: aha152x_panic(shpnt, "no disconnected command for that lun");
1694: }
1695:
1696: CURRENT_SC->SCp.phase &= ~disconnected;
1697: restore_flags(flags);
1698:
1699: make_acklow(shpnt);
1700: if(getphase(shpnt)!=P_MSGI) {
1701: SETPORT(SIMODE0, 0);
1702: SETPORT(SIMODE1, ENPHASEMIS|ENBUSFREE);
1703: #if defined(DEBUG_RACE)
1704: leave_driver("(reselected) intr");
1705: #endif
1706: SETBITS(DMACNTRL0, INTEN);
1707: return;
1708: }
1709: }
1710:
1711: /* Check, if we aren't busy with a command */
1712: if(!CURRENT_SC) {
1713: /* bus is free to issue a queued command */
1714: if(TESTHI(SSTAT1, BUSFREE) && ISSUE_SC) {
1715: save_flags(flags);
1716: cli();
1717: #if defined(DEBUG_QUEUES)
1718: if(HOSTDATA(shpnt)->debug & debug_queues)
1719: printk("i-, ");
1720: #endif
1721: CURRENT_SC = remove_first_SC(&ISSUE_SC);
1722: restore_flags(flags);
1723:
1724: #if defined(DEBUG_INTR) || defined(DEBUG_SELECTION) || defined(DEBUG_PHASES)
1725: if(HOSTDATA(shpnt)->debug & (debug_intr|debug_selection|debug_phases))
1726: printk("issuing command, ");
1727: #endif
1728: CURRENT_SC->SCp.phase = in_selection;
1729:
1730: #if defined(DEBUG_INTR) || defined(DEBUG_SELECTION) || defined(DEBUG_PHASES)
1731: if(HOSTDATA(shpnt)->debug & (debug_intr|debug_selection|debug_phases))
1732: printk("selecting %d, ", CURRENT_SC->target);
1733: #endif
1734: SETPORT(SCSIID, (shpnt->this_id << OID_) | CURRENT_SC->target);
1735:
1736: /* Enable interrupts for SELECTION OUT DONE and SELECTION OUT INITIATED */
1737: SETPORT(SXFRCTL1, HOSTDATA(shpnt)->parity ? (ENSPCHK|ENSTIMER) : ENSTIMER);
1738:
1739: /* enable interrupts for SELECTION OUT DONE and SELECTION TIME OUT */
1740: SETPORT(SIMODE0, ENSELDO | (DISCONNECTED_SC ? ENSELDI : 0));
1741: SETPORT(SIMODE1, ENSELTIMO);
1742:
1743: /* Enable SELECTION OUT sequence */
1744: SETBITS(SCSISEQ, ENSELO | ENAUTOATNO);
1745:
1746: } else {
1747: /* No command we are busy with and no new to issue */
1748: printk("aha152x: ignoring spurious interrupt, nothing to do\n");
1749: if(TESTHI(DMACNTRL0, SWINT)) {
1750: printk("aha152x: SWINT is set! Why?\n");
1751: CLRBITS(DMACNTRL0, SWINT);
1752: }
1753: show_queues(shpnt);
1754: }
1755:
1756: #if defined(DEBUG_RACE)
1757: leave_driver("(selecting) intr");
1758: #endif
1759: SETBITS(DMACNTRL0, INTEN);
1760: return;
1761: }
1762:
1763: /* the bus is busy with something */
1764:
1765: #if defined(DEBUG_INTR)
1766: if(HOSTDATA(shpnt)->debug & debug_intr)
1767: disp_ports(shpnt);
1768: #endif
1769:
1770: /* we are waiting for the result of a selection attempt */
1771: if(CURRENT_SC->SCp.phase & in_selection) {
1772: if(TESTLO(SSTAT1, SELTO)) {
1773: /* no timeout */
1774: if(TESTHI(SSTAT0, SELDO)) {
1775: /* clear BUS FREE interrupt */
1776: SETPORT(SSTAT1, CLRBUSFREE);
1777:
1778: /* Disable SELECTION OUT sequence */
1779: CLRBITS(SCSISEQ, ENSELO|ENAUTOATNO);
1780:
1781: /* Disable SELECTION OUT DONE interrupt */
1782: CLRBITS(SIMODE0, ENSELDO);
1783: CLRBITS(SIMODE1, ENSELTIMO);
1784:
1785: if(TESTLO(SSTAT0, SELDO)) {
1786: printk("aha152x: passing bus free condition\n");
1787:
1788: #if defined(DEBUG_RACE)
1789: leave_driver("(passing bus free) intr");
1790: #endif
1791: SETBITS(DMACNTRL0, INTEN);
1792:
1793: if(CURRENT_SC->SCp.phase & aborted) {
1794: HOSTDATA(shpnt)->abort_result=SCSI_ABORT_ERROR;
1795: HOSTDATA(shpnt)->abortion_complete++;
1796: }
1797:
1798: aha152x_done(shpnt, DID_NO_CONNECT << 16);
1799:
1800: return;
1801: }
1802: #if defined(DEBUG_SELECTION) || defined(DEBUG_PHASES)
1803: if(HOSTDATA(shpnt)->debug & (debug_selection|debug_phases))
1804: printk("SELDO (SELID=%x), ", GETPORT(SELID));
1805: #endif
1806:
1807: /* selection was done */
1808: SETPORT(SSTAT0, CLRSELDO);
1809:
1810: #if defined(DEBUG_ABORT)
1811: if((HOSTDATA(shpnt)->debug & debug_abort) && (CURRENT_SC->SCp.phase & aborted))
1812: printk("(ABORT) target selected, ");
1813: #endif
1814:
1815: CURRENT_SC->SCp.phase &= ~in_selection;
1816: CURRENT_SC->SCp.phase |= in_other;
1817:
1818: ADDMSG(IDENTIFY(HOSTDATA(shpnt)->reconnect,CURRENT_SC->lun));
1819:
1820: if(!(SYNCRATE&0x80) && HOSTDATA(shpnt)->synchronous) {
1821: ADDMSG(EXTENDED_MESSAGE);
1822: ADDMSG(3);
1823: ADDMSG(EXTENDED_SDTR);
1824: ADDMSG(50);
1825: ADDMSG(8);
1826:
1827: printk("outbound SDTR: ");
1828: print_msg(&MSG(MSGLEN-5));
1829:
1830: SYNCRATE=0x80;
1831: CURRENT_SC->SCp.phase |= in_sync;
1832: }
1833:
1834: #if defined(DEBUG_RACE)
1835: leave_driver("(SELDO) intr");
1836: #endif
1837: SETPORT(SCSIRATE, SYNCRATE&0x7f);
1838:
1839: SETPORT(SCSISIG, P_MSGO);
1840:
1841: SETPORT(SIMODE0, 0);
1842: SETPORT(SIMODE1, ENREQINIT|ENBUSFREE);
1843: SETBITS(DMACNTRL0, INTEN);
1844:
1845: return;
1846: } else
1847: aha152x_panic(shpnt, "neither timeout nor selection\007");
1848: } else {
1849: #if defined(DEBUG_SELECTION) || defined(DEBUG_PHASES)
1850: if(HOSTDATA(shpnt)->debug & (debug_selection|debug_phases))
1851: printk("SELTO, ");
1852: #endif
1853: /* end selection attempt */
1854: CLRBITS(SCSISEQ, ENSELO|ENAUTOATNO);
1855:
1856: /* timeout */
1857: SETPORT(SSTAT1, CLRSELTIMO);
1858:
1859: SETPORT(SIMODE0, DISCONNECTED_SC ? ENSELDI : 0);
1860: SETPORT(SIMODE1, ISSUE_SC ? ENBUSFREE : 0);
1861: SETBITS(DMACNTRL0, INTEN);
1862: #if defined(DEBUG_RACE)
1863: leave_driver("(SELTO) intr");
1864: #endif
1865:
1866: if(CURRENT_SC->SCp.phase & aborted) {
1867: #if defined(DEBUG_ABORT)
1868: if(HOSTDATA(shpnt)->debug & debug_abort)
1869: printk("(ABORT) selection timeout, ");
1870: #endif
1871: HOSTDATA(shpnt)->abort_result=SCSI_ABORT_ERROR;
1872: HOSTDATA(shpnt)->abortion_complete++;
1873: }
1874:
1875: if(TESTLO(SSTAT0, SELINGO))
1876: /* ARBITRATION not won */
1877: aha152x_done(shpnt, DID_BUS_BUSY << 16);
1878: else
1879: /* ARBITRATION won, but SELECTION failed */
1880: aha152x_done(shpnt, DID_NO_CONNECT << 16);
1881:
1882: return;
1883: }
1884: }
1885:
1886: /* enable interrupt, when target leaves current phase */
1887: phase = getphase(shpnt);
1888: if(!(phase & ~P_MASK)) /* "real" phase */
1889: SETPORT(SCSISIG, phase);
1890: SETPORT(SSTAT1, CLRPHASECHG);
1891: CURRENT_SC->SCp.phase =
1892: (CURRENT_SC->SCp.phase & ~((P_MASK|1)<<16)) | (phase << 16);
1893:
1894: /* information transfer phase */
1895: switch(phase) {
1896: case P_MSGO: /* MESSAGE OUT */
1897: {
1898: int i, identify=0, abort=0;
1899:
1900: #if defined(DEBUG_INTR) || defined(DEBUG_MSGO) || defined(DEBUG_PHASES)
1901: if(HOSTDATA(shpnt)->debug & (debug_intr|debug_msgo|debug_phases))
1902: printk("MESSAGE OUT, ");
1903: #endif
1904: if(MSGLEN==0) {
1905: ADDMSG(MESSAGE_REJECT);
1906: #if defined(DEBUG_MSGO)
1907: if(HOSTDATA(shpnt)->debug & debug_msgo)
1908: printk("unexpected MESSAGE OUT phase; rejecting, ");
1909: #endif
1910: }
1911:
1912: CLRBITS(SXFRCTL0, ENDMA);
1913:
1914: SETPORT(SIMODE0, 0);
1915: SETPORT(SIMODE1, ENPHASEMIS|ENREQINIT|ENBUSFREE);
1916:
1917: /* wait for data latch to become ready or a phase change */
1918: while(TESTLO(DMASTAT, INTSTAT))
1919: barrier();
1920:
1921: #if defined(DEBUG_MSGO)
1922: if(HOSTDATA(shpnt)->debug & debug_msgo) {
1923: int i;
1924:
1925: printk("messages (");
1926: for(i=0; i<MSGLEN; i+=print_msg(&MSG(i)), printk(" "))
1927: ;
1928: printk("), ");
1929: }
1930: #endif
1931:
1932: for(i=0; i<MSGLEN && TESTLO(SSTAT1, PHASEMIS); i++) {
1933: #if defined(DEBUG_MSGO)
1934: if(HOSTDATA(shpnt)->debug & debug_msgo)
1935: printk("%x ", MSG(i));
1936: #endif
1937: if(i==MSGLEN-1) {
1938: /* Leave MESSAGE OUT after transfer */
1939: SETPORT(SSTAT1, CLRATNO);
1940: }
1941:
1942: SETPORT(SCSIDAT, MSG(i));
1943:
1944: make_acklow(shpnt);
1945: getphase(shpnt);
1946:
1947: if(MSG(i)==IDENTIFY(HOSTDATA(shpnt)->reconnect,CURRENT_SC->lun))
1948: identify++;
1949:
1950: if(MSG(i)==ABORT)
1951: abort++;
1952:
1953: }
1954:
1955: MSGLEN=0;
1956:
1957: if(identify)
1958: CURRENT_SC->SCp.phase |= sent_ident;
1959:
1960: if(abort) {
1961: /* revive abort(); abort() enables interrupts */
1962: HOSTDATA(shpnt)->abort_result=SCSI_ABORT_SUCCESS;
1963: HOSTDATA(shpnt)->abortion_complete++;
1964:
1965: CURRENT_SC->SCp.phase &= ~(P_MASK<<16);
1966:
1967: /* exit */
1968: SETBITS(DMACNTRL0, INTEN);
1969: #if defined(DEBUG_RACE)
1970: leave_driver("(ABORT) intr");
1971: #endif
1972: aha152x_done(shpnt, DID_ABORT<<16);
1973:
1974: return;
1975: }
1976: }
1977: break;
1978:
1979: case P_CMD: /* COMMAND phase */
1980: #if defined(DEBUG_INTR) || defined(DEBUG_CMD) || defined(DEBUG_PHASES)
1981: if(HOSTDATA(shpnt)->debug & (debug_intr|debug_cmd|debug_phases))
1982: printk("COMMAND, ");
1983: #endif
1984: if(!(CURRENT_SC->SCp.sent_command)) {
1985: int i;
1986:
1987: CLRBITS(SXFRCTL0, ENDMA);
1988:
1989: SETPORT(SIMODE0, 0);
1990: SETPORT(SIMODE1, ENPHASEMIS|ENREQINIT|ENBUSFREE);
1991:
1992: /* wait for data latch to become ready or a phase change */
1993: while(TESTLO(DMASTAT, INTSTAT))
1994: barrier();
1995:
1996: for(i=0; i<CURRENT_SC->cmd_len && TESTLO(SSTAT1, PHASEMIS); i++) {
1997: SETPORT(SCSIDAT, CURRENT_SC->cmnd[i]);
1998:
1999: make_acklow(shpnt);
2000: getphase(shpnt);
2001: }
2002:
2003: if(i<CURRENT_SC->cmd_len && TESTHI(SSTAT1, PHASEMIS))
2004: aha152x_panic(shpnt, "target left COMMAND");
2005:
2006: CURRENT_SC->SCp.sent_command++;
2007: } else
2008: aha152x_panic(shpnt, "Nothing to send while in COMMAND");
2009: break;
2010:
2011: case P_MSGI: /* MESSAGE IN phase */
2012: {
2013: int start_sync=0;
2014:
2015: #if defined(DEBUG_INTR) || defined(DEBUG_MSGI) || defined(DEBUG_PHASES)
2016: if(HOSTDATA(shpnt)->debug & (debug_intr|debug_msgi|debug_phases))
2017: printk("MESSAGE IN, ");
2018: #endif
2019: SETPORT(SXFRCTL0, CH1);
2020:
2021: SETPORT(SIMODE0, 0);
2022: SETPORT(SIMODE1, ENBUSFREE);
2023:
2024: while(phase == P_MSGI) {
2025: CURRENT_SC->SCp.Message = GETPORT(SCSIDAT);
2026: switch(CURRENT_SC->SCp.Message) {
2027: case DISCONNECT:
2028: #if defined(DEBUG_MSGI) || defined(DEBUG_PHASES)
2029: if(HOSTDATA(shpnt)->debug & (debug_msgi|debug_phases))
2030: printk("target disconnected, ");
2031: #endif
2032: CURRENT_SC->SCp.Message = 0;
2033: CURRENT_SC->SCp.phase |= disconnected;
2034: if(!HOSTDATA(shpnt)->reconnect)
2035: aha152x_panic(shpnt, "target was not allowed to disconnect");
2036:
2037: break;
2038:
2039: case COMMAND_COMPLETE:
2040: #if defined(DEBUG_MSGI) || defined(DEBUG_PHASES)
2041: if(HOSTDATA(shpnt)->debug & (debug_msgi|debug_phases))
2042: printk("inbound message (COMMAND COMPLETE), ");
2043: #endif
2044: done++;
2045: break;
2046:
2047: case MESSAGE_REJECT:
2048: if(CURRENT_SC->SCp.phase & in_sync) {
2049: CURRENT_SC->SCp.phase &= ~in_sync;
2050: SYNCRATE=0x80;
2051: printk("synchronous rejected, ");
2052: } else
2053: printk("inbound message (MESSAGE REJECT), ");
2054: #if defined(DEBUG_MSGI)
2055: if(HOSTDATA(shpnt)->debug & debug_msgi)
2056: printk("inbound message (MESSAGE REJECT), ");
2057: #endif
2058: break;
2059:
2060: case SAVE_POINTERS:
2061: #if defined(DEBUG_MSGI)
2062: if(HOSTDATA(shpnt)->debug & debug_msgi)
2063: printk("inbound message (SAVE DATA POINTERS), ");
2064: #endif
2065: break;
2066:
2067: case RESTORE_POINTERS:
2068: #if defined(DEBUG_MSGI)
2069: if(HOSTDATA(shpnt)->debug & debug_msgi)
2070: printk("inbound message (RESTORE DATA POINTERS), ");
2071: #endif
2072: break;
2073:
2074: case EXTENDED_MESSAGE:
2075: {
2076: char buffer[16];
2077: int i;
2078:
2079: #if defined(DEBUG_MSGI)
2080: if(HOSTDATA(shpnt)->debug & debug_msgi)
2081: printk("inbound message (EXTENDED MESSAGE), ");
2082: #endif
2083: make_acklow(shpnt);
2084: if(getphase(shpnt)!=P_MSGI)
2085: break;
2086:
2087: buffer[0]=EXTENDED_MESSAGE;
2088: buffer[1]=GETPORT(SCSIDAT);
2089:
2090: for(i=0; i<buffer[1] &&
2091: (make_acklow(shpnt), getphase(shpnt)==P_MSGI); i++)
2092: buffer[2+i]=GETPORT(SCSIDAT);
2093:
2094: #if defined(DEBUG_MSGI)
2095: if(HOSTDATA(shpnt)->debug & debug_msgi)
2096: print_msg(buffer);
2097: #endif
2098:
2099: switch(buffer [2]) {
2100: case EXTENDED_SDTR:
2101: {
2102: long ticks;
2103:
2104: if(buffer[1]!=3)
2105: aha152x_panic(shpnt, "SDTR message length != 3");
2106:
2107: if(!HOSTDATA(shpnt)->synchronous)
2108: break;
2109:
2110: printk("inbound SDTR: "); print_msg(buffer);
2111:
2112: ticks=(buffer[3]*4+49)/50;
2113:
2114: if(CURRENT_SC->SCp.phase & in_sync) {
2115: /* we initiated SDTR */
2116: if(ticks>9 || buffer[4]<1 || buffer[4]>8)
2117: aha152x_panic(shpnt, "received SDTR invalid");
2118:
2119: SYNCRATE |= ((ticks-2)<<4) + buffer[4];
2120: } else if(ticks<=9 && buffer[4]>=1) {
2121: if(buffer[4]>8)
2122: buffer[4]=8;
2123:
2124: ADDMSG(EXTENDED_MESSAGE);
2125: ADDMSG(3);
2126: ADDMSG(EXTENDED_SDTR);
2127: if(ticks<4) {
2128: ticks=4;
2129: ADDMSG(50);
2130: } else
2131: ADDMSG(buffer[3]);
2132:
2133: ADDMSG(buffer[4]);
2134:
2135: printk("outbound SDTR: ");
2136: print_msg(&MSG(MSGLEN-5));
2137:
2138: CURRENT_SC->SCp.phase |= in_sync;
2139:
2140: SYNCRATE |= ((ticks-2)<<4) + buffer[4];
2141:
2142: start_sync++;
2143: } else {
2144: /* requested SDTR is too slow, do it asynchronously */
2145: ADDMSG(MESSAGE_REJECT);
2146: SYNCRATE = 0;
2147: }
2148:
2149: SETPORT(SCSIRATE, SYNCRATE&0x7f);
2150: }
2151: break;
2152:
2153: case EXTENDED_MODIFY_DATA_POINTER:
2154: case EXTENDED_EXTENDED_IDENTIFY:
2155: case EXTENDED_WDTR:
2156: default:
2157: ADDMSG(MESSAGE_REJECT);
2158: break;
2159: }
2160: }
2161: break;
2162:
2163: default:
2164: printk("unsupported inbound message %x, ", CURRENT_SC->SCp.Message);
2165: break;
2166:
2167: }
2168:
2169: make_acklow(shpnt);
2170: phase=getphase(shpnt);
2171: }
2172:
2173: if(start_sync)
2174: CURRENT_SC->SCp.phase |= in_sync;
2175: else
2176: CURRENT_SC->SCp.phase &= ~in_sync;
2177:
2178: if(MSGLEN>0)
2179: SETPORT(SCSISIG, P_MSGI|ATNO);
2180:
2181: /* clear SCSI fifo on BUSFREE */
2182: if(phase==P_BUSFREE)
2183: SETPORT(SXFRCTL0, CH1|CLRCH1);
2184:
2185: if(CURRENT_SC->SCp.phase & disconnected) {
2186: save_flags(flags);
2187: cli();
2188: #if defined(DEBUG_QUEUES)
2189: if(HOSTDATA(shpnt)->debug & debug_queues)
2190: printk("d+, ");
2191: #endif
2192: append_SC(&DISCONNECTED_SC, CURRENT_SC);
2193: CURRENT_SC->SCp.phase |= 1<<16;
2194: CURRENT_SC = NULL;
2195: restore_flags(flags);
2196:
2197: SETBITS(SCSISEQ, ENRESELI);
2198:
2199: SETPORT(SIMODE0, DISCONNECTED_SC ? ENSELDI : 0);
2200: SETPORT(SIMODE1, ISSUE_SC ? ENBUSFREE : 0);
2201:
2202: SETBITS(DMACNTRL0, INTEN);
2203:
2204: return;
2205: }
2206: }
2207: break;
2208:
2209: case P_STATUS: /* STATUS IN phase */
2210: #if defined(DEBUG_STATUS) || defined(DEBUG_INTR) || defined(DEBUG_PHASES)
2211: if(HOSTDATA(shpnt)->debug & (debug_status|debug_intr|debug_phases))
2212: printk("STATUS, ");
2213: #endif
2214: SETPORT(SXFRCTL0, CH1);
2215:
2216: SETPORT(SIMODE0, 0);
2217: SETPORT(SIMODE1, ENREQINIT|ENBUSFREE);
2218:
2219: if(TESTHI(SSTAT1, PHASEMIS))
2220: printk("aha152x: passing STATUS phase");
2221:
2222: CURRENT_SC->SCp.Status = GETPORT(SCSIBUS);
2223: make_acklow(shpnt);
2224: getphase(shpnt);
2225:
2226: #if defined(DEBUG_STATUS)
2227: if(HOSTDATA(shpnt)->debug & debug_status) {
2228: printk("inbound status ");
2229: print_status(CURRENT_SC->SCp.Status);
2230: printk(", ");
2231: }
2232: #endif
2233: break;
2234:
2235: case P_DATAI: /* DATA IN phase */
2236: {
2237: int fifodata, data_count, done;
2238:
2239: #if defined(DEBUG_DATAI) || defined(DEBUG_INTR) || defined(DEBUG_PHASES)
2240: if(HOSTDATA(shpnt)->debug & (debug_datai|debug_intr|debug_phases))
2241: printk("DATA IN, ");
2242: #endif
2243:
2244: #if 0
2245: if(GETPORT(FIFOSTAT) || GETPORT(SSTAT2) & (SFULL|SFCNT))
2246: printk("aha152x: P_DATAI: %d(%d) bytes left in FIFO, resetting\n",
2247: GETPORT(FIFOSTAT), GETPORT(SSTAT2) & (SFULL|SFCNT));
2248: #endif
2249:
2250: /* reset host fifo */
2251: SETPORT(DMACNTRL0, RSTFIFO);
2252: SETPORT(DMACNTRL0, RSTFIFO|ENDMA);
2253:
2254: SETPORT(SXFRCTL0, CH1|SCSIEN|DMAEN);
2255:
2256: SETPORT(SIMODE0, 0);
2257: SETPORT(SIMODE1, ENPHASEMIS|ENBUSFREE);
2258:
2259: /* done is set when the FIFO is empty after the target left DATA IN */
2260: done=0;
2261:
2262: /* while the target stays in DATA to transfer data */
2263: while (!done) {
2264: #if defined(DEBUG_DATAI)
2265: if(HOSTDATA(shpnt)->debug & debug_datai)
2266: printk("expecting data, ");
2267: #endif
2268: /* wait for PHASEMIS or full FIFO */
2269: while(TESTLO(DMASTAT, DFIFOFULL|INTSTAT))
2270: barrier();
2271:
2272: #if defined(DEBUG_DATAI)
2273: if(HOSTDATA(shpnt)->debug & debug_datai)
2274: printk("ok, ");
2275: #endif
2276:
2277: if(TESTHI(DMASTAT, DFIFOFULL))
2278: fifodata=GETPORT(FIFOSTAT);
2279: else {
2280: /* wait for SCSI fifo to get empty */
2281: while(TESTLO(SSTAT2, SEMPTY))
2282: barrier();
2283:
2284: /* rest of data in FIFO */
2285: fifodata=GETPORT(FIFOSTAT);
2286: #if defined(DEBUG_DATAI)
2287: if(HOSTDATA(shpnt)->debug & debug_datai)
2288: printk("last transfer, ");
2289: #endif
2290: done=1;
2291: }
2292:
2293: #if defined(DEBUG_DATAI)
2294: if(HOSTDATA(shpnt)->debug & debug_datai)
2295: printk("fifodata=%d, ", fifodata);
2296: #endif
2297:
2298: while(fifodata && CURRENT_SC->SCp.this_residual) {
2299: data_count=fifodata;
2300:
2301: /* limit data transfer to size of first sg buffer */
2302: if(data_count > CURRENT_SC->SCp.this_residual)
2303: data_count = CURRENT_SC->SCp.this_residual;
2304:
2305: fifodata -= data_count;
2306:
2307: #if defined(DEBUG_DATAI)
2308: if(HOSTDATA(shpnt)->debug & debug_datai)
2309: printk("data_count=%d, ", data_count);
2310: #endif
2311:
2312: if(data_count&1) {
2313: /* get a single byte in byte mode */
2314: SETBITS(DMACNTRL0, _8BIT);
2315: *CURRENT_SC->SCp.ptr++ = GETPORT(DATAPORT);
2316: CURRENT_SC->SCp.this_residual--;
2317: }
2318:
2319: if(data_count>1) {
2320: CLRBITS(DMACNTRL0, _8BIT);
2321: data_count >>= 1; /* Number of words */
2322: insw(DATAPORT, CURRENT_SC->SCp.ptr, data_count);
2323: #if defined(DEBUG_DATAI)
2324: if(HOSTDATA(shpnt)->debug & debug_datai)
2325: /* show what comes with the last transfer */
2326: if(done) {
2327: #if 0
2328: int i;
2329: unsigned char *data;
2330: #endif
2331:
2332: printk("data on last transfer (%d bytes) ",
2333: 2*data_count);
2334: #if 0
2335: printk("data on last transfer (%d bytes: ",
2336: 2*data_count);
2337: data = (unsigned char *) CURRENT_SC->SCp.ptr;
2338: for(i=0; i<2*data_count; i++)
2339: printk("%2x ", *data++);
2340: printk("), ");
2341: #endif
2342: }
2343: #endif
2344: CURRENT_SC->SCp.ptr += 2 * data_count;
2345: CURRENT_SC->SCp.this_residual -= 2 * data_count;
2346: }
2347:
2348: /* if this buffer is full and there are more buffers left */
2349: if(!CURRENT_SC->SCp.this_residual &&
2350: CURRENT_SC->SCp.buffers_residual) {
2351: /* advance to next buffer */
2352: CURRENT_SC->SCp.buffers_residual--;
2353: CURRENT_SC->SCp.buffer++;
2354: CURRENT_SC->SCp.ptr = CURRENT_SC->SCp.buffer->address;
2355: CURRENT_SC->SCp.this_residual = CURRENT_SC->SCp.buffer->length;
2356: }
2357: }
2358:
2359: /*
2360: * FIFO should be empty
2361: */
2362: if(fifodata>0) {
2363: printk("aha152x: more data than expected (%d bytes)\n",
2364: GETPORT(FIFOSTAT));
2365: SETBITS(DMACNTRL0, _8BIT);
2366: printk("aha152x: data (");
2367: while(fifodata--)
2368: printk("%2x ", GETPORT(DATAPORT));
2369: printk(")\n");
2370: }
2371:
2372: #if defined(DEBUG_DATAI)
2373: if(HOSTDATA(shpnt)->debug & debug_datai)
2374: if(!fifodata)
2375: printk("fifo empty, ");
2376: else
2377: printk("something left in fifo, ");
2378: #endif
2379: }
2380:
2381: #if defined(DEBUG_DATAI)
2382: if((HOSTDATA(shpnt)->debug & debug_datai) &&
2383: (CURRENT_SC->SCp.buffers_residual ||
2384: CURRENT_SC->SCp.this_residual))
2385: printk("left buffers (buffers=%d, bytes=%d), ",
2386: CURRENT_SC->SCp.buffers_residual, CURRENT_SC->SCp.this_residual);
2387: #endif
2388: /* transfer can be considered ended, when SCSIEN reads back zero */
2389: CLRBITS(SXFRCTL0, SCSIEN|DMAEN);
2390: while(TESTHI(SXFRCTL0, SCSIEN))
2391: barrier();
2392: CLRBITS(DMACNTRL0, ENDMA);
2393:
2394: #if defined(DEBUG_DATAI) || defined(DEBUG_INTR)
2395: if(HOSTDATA(shpnt)->debug & (debug_datai|debug_intr))
2396: printk("got %d bytes, ", GETSTCNT());
2397: #endif
2398:
2399: CURRENT_SC->SCp.have_data_in++;
2400: }
2401: break;
2402:
2403: case P_DATAO: /* DATA OUT phase */
2404: {
2405: int data_count;
2406:
2407: #if defined(DEBUG_DATAO) || defined(DEBUG_INTR) || defined(DEBUG_PHASES)
2408: if(HOSTDATA(shpnt)->debug & (debug_datao|debug_intr|debug_phases))
2409: printk("DATA OUT, ");
2410: #endif
2411: #if defined(DEBUG_DATAO)
2412: if(HOSTDATA(shpnt)->debug & debug_datao)
2413: printk("got data to send (bytes=%d, buffers=%d), ",
2414: CURRENT_SC->SCp.this_residual,
2415: CURRENT_SC->SCp.buffers_residual);
2416: #endif
2417:
2418: if(GETPORT(FIFOSTAT) || GETPORT(SSTAT2) & (SFULL|SFCNT)) {
2419: printk("%d(%d) left in FIFO, ",
2420: GETPORT(FIFOSTAT), GETPORT(SSTAT2) & (SFULL|SFCNT));
2421: aha152x_panic(shpnt, "FIFO should be empty");
2422: }
2423:
2424: SETPORT(SXFRCTL0, CH1|CLRSTCNT|CLRCH1);
2425: SETPORT(SXFRCTL0, SCSIEN|DMAEN|CH1);
2426:
2427: SETPORT(DMACNTRL0, WRITE_READ|RSTFIFO);
2428: SETPORT(DMACNTRL0, ENDMA|WRITE_READ);
2429:
2430: SETPORT(SIMODE0, 0);
2431: SETPORT(SIMODE1, ENPHASEMIS|ENBUSFREE);
2432:
2433: /* while current buffer is not empty or
2434: there are more buffers to transfer */
2435: while(TESTLO(SSTAT1, PHASEMIS) &&
2436: (CURRENT_SC->SCp.this_residual ||
2437: CURRENT_SC->SCp.buffers_residual)) {
2438: #if defined(DEBUG_DATAO)
2439: if(HOSTDATA(shpnt)->debug & debug_datao)
2440: printk("sending data (left: bytes=%d, buffers=%d), waiting, ",
2441: CURRENT_SC->SCp.this_residual,
2442: CURRENT_SC->SCp.buffers_residual);
2443: #endif
2444: /* transfer rest of buffer, but max. 128 byte */
2445: data_count =
2446: CURRENT_SC->SCp.this_residual > 128 ?
2447: 128 : CURRENT_SC->SCp.this_residual ;
2448:
2449: #if defined(DEBUG_DATAO)
2450: if(HOSTDATA(shpnt)->debug & debug_datao)
2451: printk("data_count=%d, ", data_count);
2452: #endif
2453:
2454: if(data_count&1) {
2455: /* put a single byte in byte mode */
2456: SETBITS(DMACNTRL0, _8BIT);
2457: SETPORT(DATAPORT, *CURRENT_SC->SCp.ptr++);
2458: CURRENT_SC->SCp.this_residual--;
2459: }
2460: if(data_count>1) {
2461: CLRBITS(DMACNTRL0, _8BIT);
2462: data_count >>= 1; /* number of words */
2463: outsw(DATAPORT, CURRENT_SC->SCp.ptr, data_count);
2464: CURRENT_SC->SCp.ptr += 2 * data_count;
2465: CURRENT_SC->SCp.this_residual -= 2 * data_count;
2466: }
2467:
2468: /* wait for FIFO to get empty */
2469: while(TESTLO(DMASTAT, DFIFOEMP|INTSTAT))
2470: barrier();
2471:
2472: #if defined(DEBUG_DATAO)
2473: if(HOSTDATA(shpnt)->debug & debug_datao)
2474: printk("fifo (%d bytes), transfered (%d bytes), ",
2475: GETPORT(FIFOSTAT), GETSTCNT());
2476: #endif
2477:
2478: /* if this buffer is empty and there are more buffers left */
2479: if(TESTLO(SSTAT1, PHASEMIS) &&
2480: !CURRENT_SC->SCp.this_residual &&
2481: CURRENT_SC->SCp.buffers_residual) {
2482: /* advance to next buffer */
2483: CURRENT_SC->SCp.buffers_residual--;
2484: CURRENT_SC->SCp.buffer++;
2485: CURRENT_SC->SCp.ptr = CURRENT_SC->SCp.buffer->address;
2486: CURRENT_SC->SCp.this_residual = CURRENT_SC->SCp.buffer->length;
2487: }
2488: }
2489:
2490: if(CURRENT_SC->SCp.this_residual || CURRENT_SC->SCp.buffers_residual) {
2491: /* target leaves DATA OUT for an other phase (perhaps disconnect) */
2492:
2493: /* data in fifos has to be resend */
2494: data_count = GETPORT(SSTAT2) & (SFULL|SFCNT);
2495:
2496: data_count += GETPORT(FIFOSTAT) ;
2497: CURRENT_SC->SCp.ptr -= data_count;
2498: CURRENT_SC->SCp.this_residual += data_count;
2499: #if defined(DEBUG_DATAO)
2500: if(HOSTDATA(shpnt)->debug & debug_datao)
2501: printk("left data (bytes=%d, buffers=%d), fifos (bytes=%d), "
2502: "transfer incomplete, resetting fifo, ",
2503: CURRENT_SC->SCp.this_residual,
2504: CURRENT_SC->SCp.buffers_residual,
2505: data_count);
2506: #endif
2507: SETPORT(DMACNTRL0, WRITE_READ|RSTFIFO);
2508: CLRBITS(SXFRCTL0, SCSIEN|DMAEN);
2509: CLRBITS(DMACNTRL0, ENDMA);
2510: } else {
2511: #if defined(DEBUG_DATAO)
2512: if(HOSTDATA(shpnt)->debug & debug_datao)
2513: printk("waiting for SCSI fifo to get empty, ");
2514: #endif
2515: /* wait for SCSI fifo to get empty */
2516: while(TESTLO(SSTAT2, SEMPTY))
2517: barrier();
2518: #if defined(DEBUG_DATAO)
2519: if(HOSTDATA(shpnt)->debug & debug_datao)
2520: printk("ok, left data (bytes=%d, buffers=%d) ",
2521: CURRENT_SC->SCp.this_residual,
2522: CURRENT_SC->SCp.buffers_residual);
2523: #endif
2524: CLRBITS(SXFRCTL0, SCSIEN|DMAEN);
2525:
2526: /* transfer can be considered ended, when SCSIEN reads back zero */
2527: while(TESTHI(SXFRCTL0, SCSIEN))
2528: barrier();
2529:
2530: CLRBITS(DMACNTRL0, ENDMA);
2531: }
2532:
2533: #if defined(DEBUG_DATAO) || defined(DEBUG_INTR)
2534: if(HOSTDATA(shpnt)->debug & (debug_datao|debug_intr))
2535: printk("sent %d data bytes, ", GETSTCNT());
2536: #endif
2537: }
2538: break;
2539:
2540: case P_BUSFREE: /* BUSFREE */
2541: #if defined(DEBUG_RACE)
2542: leave_driver("(BUSFREE) intr");
2543: #endif
2544: #if defined(DEBUG_PHASES)
2545: if(HOSTDATA(shpnt)->debug & debug_phases)
2546: printk("unexpected BUS FREE, ");
2547: #endif
2548: CURRENT_SC->SCp.phase &= ~(P_MASK<<16);
2549:
2550: aha152x_done(shpnt, DID_ERROR << 16); /* Don't know any better */
2551: return;
2552: break;
2553:
2554: case P_PARITY: /* parity error in DATA phase */
2555: #if defined(DEBUG_RACE)
2556: leave_driver("(DID_PARITY) intr");
2557: #endif
2558: printk("PARITY error in DATA phase, ");
2559:
2560: CURRENT_SC->SCp.phase &= ~(P_MASK<<16);
2561:
2562: SETBITS(DMACNTRL0, INTEN);
2563: aha152x_done(shpnt, DID_PARITY << 16);
2564: return;
2565: break;
2566:
2567: default:
2568: printk("aha152x: unexpected phase\n");
2569: break;
2570: }
2571:
2572: if(done) {
2573: #if defined(DEBUG_INTR)
2574: if(HOSTDATA(shpnt)->debug & debug_intr)
2575: printk("command done.\n");
2576: #endif
2577: #if defined(DEBUG_RACE)
2578: leave_driver("(done) intr");
2579: #endif
2580:
2581: SETPORT(SIMODE0, DISCONNECTED_SC ? ENSELDI : 0);
2582: SETPORT(SIMODE1, ISSUE_SC ? ENBUSFREE : 0);
2583: SETPORT(SCSISEQ, DISCONNECTED_SC ? ENRESELI : 0);
2584:
2585: SETBITS(DMACNTRL0, INTEN);
2586:
2587: aha152x_done(shpnt,
2588: (CURRENT_SC->SCp.Status & 0xff)
2589: | ((CURRENT_SC->SCp.Message & 0xff) << 8)
2590: | (DID_OK << 16));
2591:
2592: #if defined(DEBUG_RACE)
2593: printk("done returned (DID_OK: Status=%x; Message=%x).\n",
2594: CURRENT_SC->SCp.Status, CURRENT_SC->SCp.Message);
2595: #endif
2596: return;
2597: }
2598:
2599: if(CURRENT_SC)
2600: CURRENT_SC->SCp.phase |= 1<<16;
2601:
2602: SETPORT(SIMODE0, 0);
2603: SETPORT(SIMODE1, ENPHASEMIS|ENBUSFREE);
2604: #if defined(DEBUG_INTR)
2605: if(HOSTDATA(shpnt)->debug & debug_intr)
2606: disp_enintr(shpnt);
2607: #endif
2608: #if defined(DEBUG_RACE)
2609: leave_driver("(PHASEEND) intr");
2610: #endif
2611:
2612: SETBITS(DMACNTRL0, INTEN);
2613: return;
2614: }
2615:
2616: /*
2617: * Dump the current driver status and panic...
2618: */
2619: static void aha152x_panic(struct Scsi_Host *shpnt, char *msg)
2620: {
2621: printk("\naha152x: %s\n", msg);
2622: show_queues(shpnt);
2623: panic("aha152x panic");
2624: }
2625:
2626: /*
2627: * Display registers of AIC-6260
2628: */
2629: static void disp_ports(struct Scsi_Host *shpnt)
2630: {
2631: #ifdef DEBUG_AHA152X
2632: int s;
2633:
2634: #ifdef SKIP_PORTS
2635: if(HOSTDATA(shpnt)->debug & debug_skipports)
2636: return;
2637: #endif
2638:
2639: printk("\n%s: ", CURRENT_SC ? "on bus" : "waiting");
2640:
2641: s=GETPORT(SCSISEQ);
2642: printk("SCSISEQ (");
2643: if(s & TEMODEO) printk("TARGET MODE ");
2644: if(s & ENSELO) printk("SELO ");
2645: if(s & ENSELI) printk("SELI ");
2646: if(s & ENRESELI) printk("RESELI ");
2647: if(s & ENAUTOATNO) printk("AUTOATNO ");
2648: if(s & ENAUTOATNI) printk("AUTOATNI ");
2649: if(s & ENAUTOATNP) printk("AUTOATNP ");
2650: if(s & SCSIRSTO) printk("SCSIRSTO ");
2651: printk(");");
2652:
2653: printk(" SCSISIG (");
2654: s=GETPORT(SCSISIG);
2655: switch(s & P_MASK) {
2656: case P_DATAO:
2657: printk("DATA OUT");
2658: break;
2659: case P_DATAI:
2660: printk("DATA IN");
2661: break;
2662: case P_CMD:
2663: printk("COMMAND");
2664: break;
2665: case P_STATUS:
2666: printk("STATUS");
2667: break;
2668: case P_MSGO:
2669: printk("MESSAGE OUT");
2670: break;
2671: case P_MSGI:
2672: printk("MESSAGE IN");
2673: break;
2674: default:
2675: printk("*illegal*");
2676: break;
2677: }
2678:
2679: printk("); ");
2680:
2681: printk("INTSTAT (%s); ", TESTHI(DMASTAT, INTSTAT) ? "hi" : "lo");
2682:
2683: printk("SSTAT (");
2684: s=GETPORT(SSTAT0);
2685: if(s & TARGET) printk("TARGET ");
2686: if(s & SELDO) printk("SELDO ");
2687: if(s & SELDI) printk("SELDI ");
2688: if(s & SELINGO) printk("SELINGO ");
2689: if(s & SWRAP) printk("SWRAP ");
2690: if(s & SDONE) printk("SDONE ");
2691: if(s & SPIORDY) printk("SPIORDY ");
2692: if(s & DMADONE) printk("DMADONE ");
2693:
2694: s=GETPORT(SSTAT1);
2695: if(s & SELTO) printk("SELTO ");
2696: if(s & ATNTARG) printk("ATNTARG ");
2697: if(s & SCSIRSTI) printk("SCSIRSTI ");
2698: if(s & PHASEMIS) printk("PHASEMIS ");
2699: if(s & BUSFREE) printk("BUSFREE ");
2700: if(s & SCSIPERR) printk("SCSIPERR ");
2701: if(s & PHASECHG) printk("PHASECHG ");
2702: if(s & REQINIT) printk("REQINIT ");
2703: printk("); ");
2704:
2705:
2706: printk("SSTAT (");
2707:
2708: s=GETPORT(SSTAT0) & GETPORT(SIMODE0);
2709:
2710: if(s & TARGET) printk("TARGET ");
2711: if(s & SELDO) printk("SELDO ");
2712: if(s & SELDI) printk("SELDI ");
2713: if(s & SELINGO) printk("SELINGO ");
2714: if(s & SWRAP) printk("SWRAP ");
2715: if(s & SDONE) printk("SDONE ");
2716: if(s & SPIORDY) printk("SPIORDY ");
2717: if(s & DMADONE) printk("DMADONE ");
2718:
2719: s=GETPORT(SSTAT1) & GETPORT(SIMODE1);
2720:
2721: if(s & SELTO) printk("SELTO ");
2722: if(s & ATNTARG) printk("ATNTARG ");
2723: if(s & SCSIRSTI) printk("SCSIRSTI ");
2724: if(s & PHASEMIS) printk("PHASEMIS ");
2725: if(s & BUSFREE) printk("BUSFREE ");
2726: if(s & SCSIPERR) printk("SCSIPERR ");
2727: if(s & PHASECHG) printk("PHASECHG ");
2728: if(s & REQINIT) printk("REQINIT ");
2729: printk("); ");
2730:
2731: printk("SXFRCTL0 (");
2732:
2733: s=GETPORT(SXFRCTL0);
2734: if(s & SCSIEN) printk("SCSIEN ");
2735: if(s & DMAEN) printk("DMAEN ");
2736: if(s & CH1) printk("CH1 ");
2737: if(s & CLRSTCNT) printk("CLRSTCNT ");
2738: if(s & SPIOEN) printk("SPIOEN ");
2739: if(s & CLRCH1) printk("CLRCH1 ");
2740: printk("); ");
2741:
2742: printk("SIGNAL (");
2743:
2744: s=GETPORT(SCSISIG);
2745: if(s & ATNI) printk("ATNI ");
2746: if(s & SELI) printk("SELI ");
2747: if(s & BSYI) printk("BSYI ");
2748: if(s & REQI) printk("REQI ");
2749: if(s & ACKI) printk("ACKI ");
2750: printk("); ");
2751:
2752: printk("SELID (%02x), ", GETPORT(SELID));
2753:
2754: printk("SSTAT2 (");
2755:
2756: s=GETPORT(SSTAT2);
2757: if(s & SOFFSET) printk("SOFFSET ");
2758: if(s & SEMPTY) printk("SEMPTY ");
2759: if(s & SFULL) printk("SFULL ");
2760: printk("); SFCNT (%d); ", s & (SFULL|SFCNT));
2761:
2762: s=GETPORT(SSTAT3);
2763: printk("SCSICNT (%d), OFFCNT(%d), ", (s&0xf0)>>4, s&0x0f);
2764:
2765: printk("SSTAT4 (");
2766: s=GETPORT(SSTAT4);
2767: if(s & SYNCERR) printk("SYNCERR ");
2768: if(s & FWERR) printk("FWERR ");
2769: if(s & FRERR) printk("FRERR ");
2770: printk("); ");
2771:
2772: printk("DMACNTRL0 (");
2773: s=GETPORT(DMACNTRL0);
2774: printk("%s ", s & _8BIT ? "8BIT" : "16BIT");
2775: printk("%s ", s & DMA ? "DMA" : "PIO" );
2776: printk("%s ", s & WRITE_READ ? "WRITE" : "READ" );
2777: if(s & ENDMA) printk("ENDMA ");
2778: if(s & INTEN) printk("INTEN ");
2779: if(s & RSTFIFO) printk("RSTFIFO ");
2780: if(s & SWINT) printk("SWINT ");
2781: printk("); ");
2782:
2783: printk("DMASTAT (");
2784: s=GETPORT(DMASTAT);
2785: if(s & ATDONE) printk("ATDONE ");
2786: if(s & WORDRDY) printk("WORDRDY ");
2787: if(s & DFIFOFULL) printk("DFIFOFULL ");
2788: if(s & DFIFOEMP) printk("DFIFOEMP ");
2789: printk(")");
2790:
2791: printk("\n");
2792: #endif
2793: }
2794:
2795: /*
2796: * display enabled interrupts
2797: */
2798: static void disp_enintr(struct Scsi_Host *shpnt)
2799: {
2800: int s;
2801:
2802: printk("enabled interrupts (");
2803:
2804: s=GETPORT(SIMODE0);
2805: if(s & ENSELDO) printk("ENSELDO ");
2806: if(s & ENSELDI) printk("ENSELDI ");
2807: if(s & ENSELINGO) printk("ENSELINGO ");
2808: if(s & ENSWRAP) printk("ENSWRAP ");
2809: if(s & ENSDONE) printk("ENSDONE ");
2810: if(s & ENSPIORDY) printk("ENSPIORDY ");
2811: if(s & ENDMADONE) printk("ENDMADONE ");
2812:
2813: s=GETPORT(SIMODE1);
2814: if(s & ENSELTIMO) printk("ENSELTIMO ");
2815: if(s & ENATNTARG) printk("ENATNTARG ");
2816: if(s & ENPHASEMIS) printk("ENPHASEMIS ");
2817: if(s & ENBUSFREE) printk("ENBUSFREE ");
2818: if(s & ENSCSIPERR) printk("ENSCSIPERR ");
2819: if(s & ENPHASECHG) printk("ENPHASECHG ");
2820: if(s & ENREQINIT) printk("ENREQINIT ");
2821: printk(")\n");
2822: }
2823:
2824: #if defined(DEBUG_RACE)
2825:
2826: static const char *should_leave;
2827: static int in_driver=0;
2828:
2829: /*
2830: * Only one routine can be in the driver at once.
2831: */
2832: static void enter_driver(const char *func)
2833: {
2834: unsigned long flags;
2835:
2836: save_flags(flags);
2837: cli();
2838: printk("aha152x: entering %s() (%x)\n", func, jiffies);
2839: if(in_driver) {
2840: printk("%s should leave first.\n", should_leave);
2841: panic("aha152x: already in driver\n");
2842: }
2843:
2844: in_driver++;
2845: should_leave=func;
2846: restore_flags(flags);
2847: }
2848:
2849: static void leave_driver(const char *func)
2850: {
2851: unsigned long flags;
2852:
2853: save_flags(flags);
2854: cli();
2855: printk("\naha152x: leaving %s() (%x)\n", func, jiffies);
2856: if(!in_driver) {
2857: printk("aha152x: %s already left.\n", should_leave);
2858: panic("aha152x: %s already left driver.\n");
2859: }
2860:
2861: in_driver--;
2862: should_leave=func;
2863: restore_flags(flags);
2864: }
2865: #endif
2866:
2867: /*
2868: * Show the command data of a command
2869: */
2870: static void show_command(Scsi_Cmnd *ptr)
2871: {
2872: printk("0x%08x: target=%d; lun=%d; cmnd=(",
2873: (unsigned int) ptr, ptr->target, ptr->lun);
2874:
2875: print_command(ptr->cmnd);
2876:
2877: printk("); residual=%d; buffers=%d; phase |",
2878: ptr->SCp.this_residual, ptr->SCp.buffers_residual);
2879:
2880: if(ptr->SCp.phase & not_issued ) printk("not issued|");
2881: if(ptr->SCp.phase & in_selection) printk("in selection|");
2882: if(ptr->SCp.phase & disconnected) printk("disconnected|");
2883: if(ptr->SCp.phase & aborted ) printk("aborted|");
2884: if(ptr->SCp.phase & sent_ident ) printk("send_ident|");
2885: if(ptr->SCp.phase & in_other) {
2886: printk("; in other(");
2887: switch((ptr->SCp.phase >> 16) & P_MASK) {
2888: case P_DATAO:
2889: printk("DATA OUT");
2890: break;
2891: case P_DATAI:
2892: printk("DATA IN");
2893: break;
2894: case P_CMD:
2895: printk("COMMAND");
2896: break;
2897: case P_STATUS:
2898: printk("STATUS");
2899: break;
2900: case P_MSGO:
2901: printk("MESSAGE OUT");
2902: break;
2903: case P_MSGI:
2904: printk("MESSAGE IN");
2905: break;
2906: default:
2907: printk("*illegal*");
2908: break;
2909: }
2910: printk(")");
2911: if(ptr->SCp.phase & (1<<16))
2912: printk("; phaseend");
2913: }
2914: printk("; next=0x%08x\n", (unsigned int) ptr->host_scribble);
2915: }
2916:
2917: /*
2918: * Dump the queued data
2919: */
2920: static void show_queues(struct Scsi_Host *shpnt)
2921: {
2922: unsigned long flags;
2923: Scsi_Cmnd *ptr;
2924:
2925: save_flags(flags);
2926: cli();
2927: printk("QUEUE STATUS:\nissue_SC:\n");
2928: for(ptr=ISSUE_SC; ptr; ptr = (Scsi_Cmnd *) ptr->host_scribble)
2929: show_command(ptr);
2930:
2931: printk("current_SC:\n");
2932: if(CURRENT_SC)
2933: show_command(CURRENT_SC);
2934: else
2935: printk("none\n");
2936:
2937: printk("disconnected_SC:\n");
2938: for(ptr=DISCONNECTED_SC; ptr; ptr = (Scsi_Cmnd *) ptr->host_scribble)
2939: show_command(ptr);
2940:
2941: disp_ports(shpnt);
2942: disp_enintr(shpnt);
2943: restore_flags(flags);
2944: }
2945:
2946: int aha152x_set_info(char *buffer, int length, struct Scsi_Host *shpnt)
2947: {
2948: return(-ENOSYS); /* Currently this is a no-op */
2949: }
2950:
2951: #undef SPRINTF
2952: #define SPRINTF(args...) pos += sprintf(pos, ## args)
2953:
2954: static int get_command(char *pos, Scsi_Cmnd *ptr)
2955: {
2956: char *start = pos;
2957: int i;
2958:
2959: SPRINTF("0x%08x: target=%d; lun=%d; cmnd=( ",
2960: (unsigned int) ptr, ptr->target, ptr->lun);
2961:
2962: for(i=0; i<COMMAND_SIZE(ptr->cmnd[0]); i++)
2963: SPRINTF("0x%02x ", ptr->cmnd[i]);
2964:
2965: SPRINTF("); residual=%d; buffers=%d; phase |",
2966: ptr->SCp.this_residual, ptr->SCp.buffers_residual);
2967:
2968: if(ptr->SCp.phase & not_issued ) SPRINTF("not issued|");
2969: if(ptr->SCp.phase & in_selection) SPRINTF("in selection|");
2970: if(ptr->SCp.phase & disconnected) SPRINTF("disconnected|");
2971: if(ptr->SCp.phase & aborted ) SPRINTF("aborted|");
2972: if(ptr->SCp.phase & sent_ident ) SPRINTF("send_ident|");
2973: if(ptr->SCp.phase & in_other) {
2974: SPRINTF("; in other(");
2975: switch((ptr->SCp.phase >> 16) & P_MASK) {
2976: case P_DATAO:
2977: SPRINTF("DATA OUT");
2978: break;
2979: case P_DATAI:
2980: SPRINTF("DATA IN");
2981: break;
2982: case P_CMD:
2983: SPRINTF("COMMAND");
2984: break;
2985: case P_STATUS:
2986: SPRINTF("STATUS");
2987: break;
2988: case P_MSGO:
2989: SPRINTF("MESSAGE OUT");
2990: break;
2991: case P_MSGI:
2992: SPRINTF("MESSAGE IN");
2993: break;
2994: default:
2995: SPRINTF("*illegal*");
2996: break;
2997: }
2998: SPRINTF(")");
2999: if(ptr->SCp.phase & (1<<16))
3000: SPRINTF("; phaseend");
3001: }
3002: SPRINTF("; next=0x%08x\n", (unsigned int) ptr->host_scribble);
3003:
3004: return(pos-start);
3005: }
3006:
3007: static int get_ports(struct Scsi_Host *shpnt, char *pos)
3008: {
3009: char *start = pos;
3010: int s;
3011:
3012: #ifdef SKIP_PORTS
3013: if(HOSTDATA(shpnt)->debug & debug_skipports)
3014: return;
3015: #endif
3016:
3017: SPRINTF("\n%s: ", CURRENT_SC ? "on bus" : "waiting");
3018:
3019: s=GETPORT(SCSISEQ);
3020: SPRINTF("SCSISEQ (");
3021: if(s & TEMODEO) SPRINTF("TARGET MODE ");
3022: if(s & ENSELO) SPRINTF("SELO ");
3023: if(s & ENSELI) SPRINTF("SELI ");
3024: if(s & ENRESELI) SPRINTF("RESELI ");
3025: if(s & ENAUTOATNO) SPRINTF("AUTOATNO ");
3026: if(s & ENAUTOATNI) SPRINTF("AUTOATNI ");
3027: if(s & ENAUTOATNP) SPRINTF("AUTOATNP ");
3028: if(s & SCSIRSTO) SPRINTF("SCSIRSTO ");
3029: SPRINTF(");");
3030:
3031: SPRINTF(" SCSISIG (");
3032: s=GETPORT(SCSISIG);
3033: switch(s & P_MASK) {
3034: case P_DATAO:
3035: SPRINTF("DATA OUT");
3036: break;
3037: case P_DATAI:
3038: SPRINTF("DATA IN");
3039: break;
3040: case P_CMD:
3041: SPRINTF("COMMAND");
3042: break;
3043: case P_STATUS:
3044: SPRINTF("STATUS");
3045: break;
3046: case P_MSGO:
3047: SPRINTF("MESSAGE OUT");
3048: break;
3049: case P_MSGI:
3050: SPRINTF("MESSAGE IN");
3051: break;
3052: default:
3053: SPRINTF("*illegal*");
3054: break;
3055: }
3056:
3057: SPRINTF("); ");
3058:
3059: SPRINTF("INTSTAT (%s); ", TESTHI(DMASTAT, INTSTAT) ? "hi" : "lo");
3060:
3061: SPRINTF("SSTAT (");
3062: s=GETPORT(SSTAT0);
3063: if(s & TARGET) SPRINTF("TARGET ");
3064: if(s & SELDO) SPRINTF("SELDO ");
3065: if(s & SELDI) SPRINTF("SELDI ");
3066: if(s & SELINGO) SPRINTF("SELINGO ");
3067: if(s & SWRAP) SPRINTF("SWRAP ");
3068: if(s & SDONE) SPRINTF("SDONE ");
3069: if(s & SPIORDY) SPRINTF("SPIORDY ");
3070: if(s & DMADONE) SPRINTF("DMADONE ");
3071:
3072: s=GETPORT(SSTAT1);
3073: if(s & SELTO) SPRINTF("SELTO ");
3074: if(s & ATNTARG) SPRINTF("ATNTARG ");
3075: if(s & SCSIRSTI) SPRINTF("SCSIRSTI ");
3076: if(s & PHASEMIS) SPRINTF("PHASEMIS ");
3077: if(s & BUSFREE) SPRINTF("BUSFREE ");
3078: if(s & SCSIPERR) SPRINTF("SCSIPERR ");
3079: if(s & PHASECHG) SPRINTF("PHASECHG ");
3080: if(s & REQINIT) SPRINTF("REQINIT ");
3081: SPRINTF("); ");
3082:
3083:
3084: SPRINTF("SSTAT (");
3085:
3086: s=GETPORT(SSTAT0) & GETPORT(SIMODE0);
3087:
3088: if(s & TARGET) SPRINTF("TARGET ");
3089: if(s & SELDO) SPRINTF("SELDO ");
3090: if(s & SELDI) SPRINTF("SELDI ");
3091: if(s & SELINGO) SPRINTF("SELINGO ");
3092: if(s & SWRAP) SPRINTF("SWRAP ");
3093: if(s & SDONE) SPRINTF("SDONE ");
3094: if(s & SPIORDY) SPRINTF("SPIORDY ");
3095: if(s & DMADONE) SPRINTF("DMADONE ");
3096:
3097: s=GETPORT(SSTAT1) & GETPORT(SIMODE1);
3098:
3099: if(s & SELTO) SPRINTF("SELTO ");
3100: if(s & ATNTARG) SPRINTF("ATNTARG ");
3101: if(s & SCSIRSTI) SPRINTF("SCSIRSTI ");
3102: if(s & PHASEMIS) SPRINTF("PHASEMIS ");
3103: if(s & BUSFREE) SPRINTF("BUSFREE ");
3104: if(s & SCSIPERR) SPRINTF("SCSIPERR ");
3105: if(s & PHASECHG) SPRINTF("PHASECHG ");
3106: if(s & REQINIT) SPRINTF("REQINIT ");
3107: SPRINTF("); ");
3108:
3109: SPRINTF("SXFRCTL0 (");
3110:
3111: s=GETPORT(SXFRCTL0);
3112: if(s & SCSIEN) SPRINTF("SCSIEN ");
3113: if(s & DMAEN) SPRINTF("DMAEN ");
3114: if(s & CH1) SPRINTF("CH1 ");
3115: if(s & CLRSTCNT) SPRINTF("CLRSTCNT ");
3116: if(s & SPIOEN) SPRINTF("SPIOEN ");
3117: if(s & CLRCH1) SPRINTF("CLRCH1 ");
3118: SPRINTF("); ");
3119:
3120: SPRINTF("SIGNAL (");
3121:
3122: s=GETPORT(SCSISIG);
3123: if(s & ATNI) SPRINTF("ATNI ");
3124: if(s & SELI) SPRINTF("SELI ");
3125: if(s & BSYI) SPRINTF("BSYI ");
3126: if(s & REQI) SPRINTF("REQI ");
3127: if(s & ACKI) SPRINTF("ACKI ");
3128: SPRINTF("); ");
3129:
3130: SPRINTF("SELID (%02x), ", GETPORT(SELID));
3131:
3132: SPRINTF("SSTAT2 (");
3133:
3134: s=GETPORT(SSTAT2);
3135: if(s & SOFFSET) SPRINTF("SOFFSET ");
3136: if(s & SEMPTY) SPRINTF("SEMPTY ");
3137: if(s & SFULL) SPRINTF("SFULL ");
3138: SPRINTF("); SFCNT (%d); ", s & (SFULL|SFCNT));
3139:
3140: s=GETPORT(SSTAT3);
3141: SPRINTF("SCSICNT (%d), OFFCNT(%d), ", (s&0xf0)>>4, s&0x0f);
3142:
3143: SPRINTF("SSTAT4 (");
3144: s=GETPORT(SSTAT4);
3145: if(s & SYNCERR) SPRINTF("SYNCERR ");
3146: if(s & FWERR) SPRINTF("FWERR ");
3147: if(s & FRERR) SPRINTF("FRERR ");
3148: SPRINTF("); ");
3149:
3150: SPRINTF("DMACNTRL0 (");
3151: s=GETPORT(DMACNTRL0);
3152: SPRINTF("%s ", s & _8BIT ? "8BIT" : "16BIT");
3153: SPRINTF("%s ", s & DMA ? "DMA" : "PIO" );
3154: SPRINTF("%s ", s & WRITE_READ ? "WRITE" : "READ" );
3155: if(s & ENDMA) SPRINTF("ENDMA ");
3156: if(s & INTEN) SPRINTF("INTEN ");
3157: if(s & RSTFIFO) SPRINTF("RSTFIFO ");
3158: if(s & SWINT) SPRINTF("SWINT ");
3159: SPRINTF("); ");
3160:
3161: SPRINTF("DMASTAT (");
3162: s=GETPORT(DMASTAT);
3163: if(s & ATDONE) SPRINTF("ATDONE ");
3164: if(s & WORDRDY) SPRINTF("WORDRDY ");
3165: if(s & DFIFOFULL) SPRINTF("DFIFOFULL ");
3166: if(s & DFIFOEMP) SPRINTF("DFIFOEMP ");
3167: SPRINTF(")\n\n");
3168:
3169: SPRINTF("enabled interrupts (");
3170:
3171: s=GETPORT(SIMODE0);
3172: if(s & ENSELDO) SPRINTF("ENSELDO ");
3173: if(s & ENSELDI) SPRINTF("ENSELDI ");
3174: if(s & ENSELINGO) SPRINTF("ENSELINGO ");
3175: if(s & ENSWRAP) SPRINTF("ENSWRAP ");
3176: if(s & ENSDONE) SPRINTF("ENSDONE ");
3177: if(s & ENSPIORDY) SPRINTF("ENSPIORDY ");
3178: if(s & ENDMADONE) SPRINTF("ENDMADONE ");
3179:
3180: s=GETPORT(SIMODE1);
3181: if(s & ENSELTIMO) SPRINTF("ENSELTIMO ");
3182: if(s & ENATNTARG) SPRINTF("ENATNTARG ");
3183: if(s & ENPHASEMIS) SPRINTF("ENPHASEMIS ");
3184: if(s & ENBUSFREE) SPRINTF("ENBUSFREE ");
3185: if(s & ENSCSIPERR) SPRINTF("ENSCSIPERR ");
3186: if(s & ENPHASECHG) SPRINTF("ENPHASECHG ");
3187: if(s & ENREQINIT) SPRINTF("ENREQINIT ");
3188: SPRINTF(")\n");
3189:
3190: return (pos-start);
3191: }
3192:
3193: #undef SPRINTF
3194: #define SPRINTF(args...) do { if(pos < buffer + length) pos += sprintf(pos, ## args); } while(0)
3195:
3196: int aha152x_proc_info(char *buffer, char **start,
3197: off_t offset, int length, int hostno, int inout)
3198: {
3199: int i;
3200: char *pos = buffer;
3201: struct Scsi_Host *shpnt;
3202: unsigned long flags;
3203: Scsi_Cmnd *ptr;
3204:
3205: for(i=0, shpnt= (struct Scsi_Host *) NULL; i<IRQS; i++)
3206: if(aha152x_host[i] && aha152x_host[i]->host_no == hostno)
3207: shpnt=aha152x_host[i];
3208:
3209: if(!shpnt)
3210: return(-ESRCH);
3211:
3212: if(inout) /* Has data been written to the file ? */
3213: return(aha152x_set_info(buffer, length, shpnt));
3214:
3215: SPRINTF(AHA152X_REVID "\n");
3216:
3217: save_flags(flags);
3218: cli();
3219:
3220: SPRINTF("ioports 0x%04x to 0x%04x\n",
3221: shpnt->io_port, shpnt->io_port+shpnt->n_io_port-1);
3222: SPRINTF("interrupt 0x%02x\n", shpnt->irq);
3223: SPRINTF("disconnection/reconnection %s\n",
3224: HOSTDATA(shpnt)->reconnect ? "enabled" : "disabled");
3225: SPRINTF("parity checking %s\n",
3226: HOSTDATA(shpnt)->parity ? "enabled" : "disabled");
3227: SPRINTF("synchronous transfers %s\n",
3228: HOSTDATA(shpnt)->synchronous ? "enabled" : "disabled");
3229: SPRINTF("%d commands currently queued\n", HOSTDATA(shpnt)->commands);
3230:
3231: if(HOSTDATA(shpnt)->synchronous) {
3232: #if 0
3233: SPRINTF("synchronously operating targets (tick=%ld ns):\n",
3234: 250000000/loops_per_sec);
3235: for(i=0; i<8; i++)
3236: if(HOSTDATA(shpnt)->syncrate[i]&0x7f)
3237: SPRINTF("target %d: period %dT/%ldns; req/ack offset %d\n",
3238: i,
3239: (((HOSTDATA(shpnt)->syncrate[i]&0x70)>>4)+2),
3240: (((HOSTDATA(shpnt)->syncrate[i]&0x70)>>4)+2)*
3241: 250000000/loops_per_sec,
3242: HOSTDATA(shpnt)->syncrate[i]&0x0f);
3243: #else
3244: SPRINTF("synchronously operating targets (tick=50 ns):\n");
3245: for(i=0; i<8; i++)
3246: if(HOSTDATA(shpnt)->syncrate[i]&0x7f)
3247: SPRINTF("target %d: period %dT/%dns; req/ack offset %d\n",
3248: i,
3249: (((HOSTDATA(shpnt)->syncrate[i]&0x70)>>4)+2),
3250: (((HOSTDATA(shpnt)->syncrate[i]&0x70)>>4)+2)*50,
3251: HOSTDATA(shpnt)->syncrate[i]&0x0f);
3252: #endif
3253: }
3254:
3255: #ifdef DEBUG_AHA152X
3256: #define PDEBUG(flags,txt) if(HOSTDATA(shpnt)->debug & flags) SPRINTF("(%s) ", txt);
3257:
3258: SPRINTF("enabled debugging options: ");
3259:
3260: PDEBUG(debug_skipports, "skip ports");
3261: PDEBUG(debug_queue, "queue");
3262: PDEBUG(debug_intr, "interrupt");
3263: PDEBUG(debug_selection, "selection");
3264: PDEBUG(debug_msgo, "message out");
3265: PDEBUG(debug_msgi, "message in");
3266: PDEBUG(debug_status, "status");
3267: PDEBUG(debug_cmd, "command");
3268: PDEBUG(debug_datai, "data in");
3269: PDEBUG(debug_datao, "data out");
3270: PDEBUG(debug_abort, "abort");
3271: PDEBUG(debug_done, "done");
3272: PDEBUG(debug_biosparam, "bios parameters");
3273: PDEBUG(debug_phases, "phases");
3274: PDEBUG(debug_queues, "queues");
3275: PDEBUG(debug_reset, "reset");
3276:
3277: SPRINTF("\n");
3278: #endif
3279:
3280: SPRINTF("\nqueue status:\n");
3281: if(ISSUE_SC) {
3282: SPRINTF("not yet issued commands:\n");
3283: for(ptr=ISSUE_SC; ptr; ptr = (Scsi_Cmnd *) ptr->host_scribble)
3284: pos += get_command(pos, ptr);
3285: } else
3286: SPRINTF("no not yet issued commands\n");
3287:
3288: if(CURRENT_SC) {
3289: SPRINTF("current command:\n");
3290: pos += get_command(pos, CURRENT_SC);
3291: } else
3292: SPRINTF("no current command\n");
3293:
3294: if(DISCONNECTED_SC) {
3295: SPRINTF("disconnected commands:\n");
3296: for(ptr=DISCONNECTED_SC; ptr; ptr = (Scsi_Cmnd *) ptr->host_scribble)
3297: pos += get_command(pos, ptr);
3298: } else
3299: SPRINTF("no disconnected commands\n");
3300:
3301: restore_flags(flags);
3302:
3303: pos += get_ports(shpnt, pos);
3304:
3305: *start=buffer+offset;
3306: if (pos - buffer < offset)
3307: return 0;
3308: else if (pos - buffer - offset < length)
3309: return pos - buffer - offset;
3310: else
3311: return length;
3312: }
3313:
3314: #ifdef MODULE
3315: /* Eventually this will go into an include file, but this will be later */
3316: Scsi_Host_Template driver_template = AHA152X;
3317:
3318: #include "scsi_module.c"
3319: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.