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