|
|
1.1 root 1: /*+M*************************************************************************
2: * Adaptec AIC7xxx device driver for Linux.
3: *
4: * Copyright (c) 1994 John Aycock
5: * The University of Calgary Department of Computer Science.
6: *
7: * This program is free software; you can redistribute it and/or modify
8: * it under the terms of the GNU General Public License as published by
9: * the Free Software Foundation; either version 2, or (at your option)
10: * any later version.
11: *
12: * This program is distributed in the hope that it will be useful,
13: * but WITHOUT ANY WARRANTY; without even the implied warranty of
14: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15: * GNU General Public License for more details.
16: *
17: * You should have received a copy of the GNU General Public License
18: * along with this program; see the file COPYING. If not, write to
19: * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
20: *
21: * Sources include the Adaptec 1740 driver (aha1740.c), the Ultrastor 24F
22: * driver (ultrastor.c), various Linux kernel source, the Adaptec EISA
23: * config file (!adp7771.cfg), the Adaptec AHA-2740A Series User's Guide,
24: * the Linux Kernel Hacker's Guide, Writing a SCSI Device Driver for Linux,
25: * the Adaptec 1542 driver (aha1542.c), the Adaptec EISA overlay file
26: * (adp7770.ovl), the Adaptec AHA-2740 Series Technical Reference Manual,
27: * the Adaptec AIC-7770 Data Book, the ANSI SCSI specification, the
28: * ANSI SCSI-2 specification (draft 10c), ...
29: *
30: * ----------------------------------------------------------------
31: * Modified to include support for wide and twin bus adapters,
32: * DMAing of SCBs, tagged queueing, IRQ sharing, bug fixes,
33: * and other rework of the code.
34: *
35: * Parts of this driver are based on the FreeBSD driver by Justin
36: * T. Gibbs.
37: *
38: * A Boot time option was also added for not resetting the scsi bus.
39: *
40: * Form: aic7xxx=extended,no_reset
41: *
42: * -- Daniel M. Eischen, [email protected], 04/03/95
43: *
44: * $Id: aic7xxx.c,v 1.1.1.1 1997/02/25 21:27:46 thomas Exp $
45: *-M*************************************************************************/
46:
47: #ifdef MODULE
48: #include <linux/module.h>
49: #endif
50:
51: #include <stdarg.h>
52: #include <asm/io.h>
53: #include <linux/string.h>
54: #include <linux/errno.h>
55: #include <linux/kernel.h>
56: #include <linux/ioport.h>
57: #include <linux/bios32.h>
58: #include <linux/delay.h>
59: #include <linux/sched.h>
60: #include <linux/pci.h>
61: #include <linux/proc_fs.h>
62: #include <linux/blk.h>
63: #include "sd.h"
64: #include "scsi.h"
65: #include "hosts.h"
66: #include "aic7xxx.h"
67: #include "aic7xxx_reg.h"
68: #include <linux/stat.h>
69:
70: #include <linux/config.h> /* for CONFIG_PCI */
71:
72: struct proc_dir_entry proc_scsi_aic7xxx = {
73: PROC_SCSI_AIC7XXX, 7, "aic7xxx",
74: S_IFDIR | S_IRUGO | S_IXUGO, 2
75: };
76:
77: #define AIC7XXX_C_VERSION "$Revision: 1.1.1.1 $"
78:
79: #define NUMBER(arr) (sizeof(arr) / sizeof(arr[0]))
80: #define MIN(a,b) ((a < b) ? a : b)
81: #define ALL_TARGETS -1
82: #ifndef TRUE
83: # define TRUE 1
84: #endif
85: #ifndef FALSE
86: # define FALSE 0
87: #endif
88:
89: /*
90: * Defines for PCI bus support, testing twin bus support, DMAing of
91: * SCBs, tagged queueing, commands (SCBs) per lun, and SCSI bus reset
92: * delay time.
93: *
94: * o PCI bus support - this has been implemented and working since
95: * the December 1, 1994 release of this driver. If you don't have
96: * a PCI bus, then you can configure your kernel without PCI
97: * support because all PCI dependent code is bracketed with
98: * "#ifdef CONFIG_PCI ... #endif CONFIG_PCI".
99: *
100: * o Twin bus support - this has been tested and does work.
101: *
102: * o DMAing of SCBs - thanks to Kai Makisara, this now works.
103: * This define is now taken out and DMAing of SCBs is always
104: * performed (8/12/95 - DE).
105: *
106: * o Tagged queueing - this driver is capable of tagged queueing
107: * but I am unsure as to how well the higher level driver implements
108: * tagged queueing. Therefore, the maximum commands per lun is
109: * set to 2. If you want to implement tagged queueing, ensure
110: * this define is not commented out.
111: *
112: * o Sharing IRQs - allowed for sharing of IRQs. This will allow
113: * for multiple aic7xxx host adapters sharing the same IRQ, but
114: * not for sharing IRQs with other devices. The higher level
115: * PCI code and interrupt handling needs to be modified to
116: * support this.
117: *
118: * o Commands per lun - If tagged queueing is enabled, then you
119: * may want to try increasing AIC7XXX_CMDS_PER_LUN to more
120: * than 2. By default, we limit the SCBs per lun to 2 with
121: * or without tagged queueing enabled. If tagged queueing is
122: * disabled, the sequencer will keep the 2nd SCB in the input
123: * queue until the first one completes - so it is OK to to have
124: * more than 1 SCB queued. If tagged queueing is enabled, then
125: * the sequencer will attempt to send the 2nd SCB to the device
126: * while the first SCB is executing and the device is disconnected.
127: * For adapters limited to 4 SCBs, you may want to actually
128: * decrease the commands per lun to 1, if you often have more
129: * than 2 devices active at the same time. This will allocate
130: * 1 SCB for each device and ensure that there will always be
131: * a free SCB for up to 4 devices active at the same time.
132: *
133: * o 3985 support - The 3985 adapter is much like the 3940, but
134: * has three 7870 controllers as opposed to two for the 3940.
135: * It will get probed and recognized as three different adapters,
136: * but all three controllers share the same bank of 255 SCBs
137: * instead of each controller having their own bank (like the
138: * controllers on the 3940). For this reason, it is important
139: * that all devices be resident on just one channel of the 3985.
140: * In the near future, we'll modify the driver to reserve 1/3
141: * of the SCBs for each controller.
142: *
143: * Daniel M. Eischen, [email protected], 01/11/96
144: */
145:
146: /* Uncomment this for testing twin bus support. */
147: #define AIC7XXX_TWIN_SUPPORT
148:
149: /* Uncomment this for tagged queueing. */
150: /* #define AIC7XXX_TAGGED_QUEUEING */
151:
152: /* Uncomment this for allowing sharing of IRQs. */
153: #define AIC7XXX_SHARE_IRQS
154:
155: /*
156: * You can try raising me if tagged queueing is enabled, or lowering
157: * me if you only have 4 SCBs.
158: */
159: #define AIC7XXX_CMDS_PER_LUN 2
160:
161: /* Set this to the delay in seconds after SCSI bus reset. */
162: #define AIC7XXX_RESET_DELAY 15
163:
164: /*
165: * Uncomment the following define for collection of SCSI transfer statistics
166: * for the /proc filesystem.
167: *
168: * NOTE: This does affect performance since it has to maintain statistics.
169: */
170: /* #define AIC7XXX_PROC_STATS */
171:
172: /*
173: * For debugging the abort/reset code.
174: */
175: /* #define AIC7XXX_DEBUG_ABORT */
176:
177: /*
178: * For general debug messages
179: */
180: #define AIC7XXX_DEBUG
181:
182: /*
183: * Controller type and options
184: */
185: typedef enum {
186: AIC_NONE,
187: AIC_7770, /* EISA aic7770 on motherboard */
188: AIC_7771, /* EISA aic7771 on 274x */
189: AIC_284x, /* VLB aic7770 on 284x */
190: AIC_7850, /* PCI aic7850 */
191: AIC_7870, /* PCI aic7870 on motherboard */
192: AIC_7871, /* PCI aic7871 on 294x */
193: AIC_7872, /* PCI aic7872 on 3940 */
194: AIC_7873, /* PCI aic7873 on 3985 */
195: AIC_7874, /* PCI aic7874 on 294x Differential */
196: AIC_7880, /* PCI aic7880 on motherboard */
197: AIC_7881, /* PCI aic7881 on 294x Ultra */
198: AIC_7882, /* PCI aic7882 on 3940 Ultra */
199: AIC_7883, /* PCI aic7883 on 3985 Ultra */
200: AIC_7884 /* PCI aic7884 on 294x Ultra Differential */
201: } aha_type;
202:
203: typedef enum {
204: AIC_777x, /* AIC-7770 based */
205: AIC_785x, /* AIC-7850 based */
206: AIC_787x, /* AIC-7870 based */
207: AIC_788x /* AIC-7880 based */
208: } aha_chip_type;
209:
210: typedef enum {
211: AIC_SINGLE, /* Single Channel */
212: AIC_TWIN, /* Twin Channel */
213: AIC_WIDE /* Wide Channel */
214: } aha_bus_type;
215:
216: typedef enum {
217: AIC_UNKNOWN,
218: AIC_ENABLED,
219: AIC_DISABLED
220: } aha_status_type;
221:
222: typedef enum {
223: LIST_HEAD,
224: LIST_SECOND
225: } insert_type;
226:
227: typedef enum {
228: ABORT_RESET_INACTIVE,
229: ABORT_RESET_PENDING,
230: ABORT_RESET_SUCCESS
231: } aha_abort_reset_type;
232:
233: /*
234: * Define an array of board names that can be indexed by aha_type.
235: * Don't forget to change this when changing the types!
236: */
237: static const char * board_names[] = {
238: "<AIC-7xxx Unknown>", /* AIC_NONE */
239: "AIC-7770", /* AIC_7770 */
240: "AHA-2740", /* AIC_7771 */
241: "AHA-2840", /* AIC_284x */
242: "AIC-7850", /* AIC_7850 */
243: "AIC-7870", /* AIC_7870 */
244: "AHA-2940", /* AIC_7871 */
245: "AHA-3940", /* AIC_7872 */
246: "AHA-3985", /* AIC_7873 */
247: "AHA-2940 Differential", /* AIC_7874 */
248: "AIC-7880 Ultra", /* AIC_7880 */
249: "AHA-2940 Ultra", /* AIC_7881 */
250: "AHA-3940 Ultra", /* AIC_7882 */
251: "AHA-3985 Ultra", /* AIC_7883 */
252: "AHA-2940 Ultra Differential" /* AIC_7884 */
253: };
254:
255: /*
256: * There should be a specific return value for this in scsi.h, but
257: * it seems that most drivers ignore it.
258: */
259: #define DID_UNDERFLOW DID_ERROR
260:
261: /*
262: * What we want to do is have the higher level scsi driver requeue
263: * the command to us. There is no specific driver status for this
264: * condition, but the higher level scsi driver will requeue the
265: * command on a DID_BUS_BUSY error.
266: */
267: #define DID_RETRY_COMMAND DID_BUS_BUSY
268:
269: /*
270: * EISA/VL-bus stuff
271: */
272: #define MINSLOT 1
273: #define MAXSLOT 15
274: #define SLOTBASE(x) ((x) << 12)
275: #define MAXIRQ 15
276:
277: /*
278: * Standard EISA Host ID regs (Offset from slot base)
279: */
280: #define HID0 0x80 /* 0,1: msb of ID2, 2-7: ID1 */
281: #define HID1 0x81 /* 0-4: ID3, 5-7: LSB ID2 */
282: #define HID2 0x82 /* product */
283: #define HID3 0x83 /* firmware revision */
284:
285: /*
286: * AIC-7770 I/O range to reserve for a card
287: */
288: #define MINREG 0xC00
289: #define MAXREG 0xCBF
290:
291: #define INTDEF 0x5C /* Interrupt Definition Register */
292:
293: /*
294: * Some defines for the HCNTRL register.
295: */
296: #define REQ_PAUSE IRQMS | INTEN | PAUSE
297: #define UNPAUSE_274X IRQMS | INTEN
298: #define UNPAUSE_284X INTEN
299: #define UNPAUSE_294X IRQMS | INTEN
300:
301: /*
302: * AIC-78X0 PCI registers
303: */
304: #define CLASS_PROGIF_REVID 0x08
305: #define DEVREVID 0x000000FFul
306: #define PROGINFC 0x0000FF00ul
307: #define SUBCLASS 0x00FF0000ul
308: #define BASECLASS 0xFF000000ul
309:
310: #define CSIZE_LATTIME 0x0C
311: #define CACHESIZE 0x0000003Ful /* only 5 bits */
312: #define LATTIME 0x0000FF00ul
313:
314: #define DEVCONFIG 0x40
315: #define MPORTMODE 0x00000400ul /* aic7870 only */
316: #define RAMPSM 0x00000200ul /* aic7870 only */
317: #define VOLSENSE 0x00000100ul
318: #define SCBRAMSEL 0x00000080ul
319: #define MRDCEN 0x00000040ul
320: #define EXTSCBTIME 0x00000020ul /* aic7870 only */
321: #define EXTSCBPEN 0x00000010ul /* aic7870 only */
322: #define BERREN 0x00000008ul
323: #define DACEN 0x00000004ul
324: #define STPWLEVEL 0x00000002ul
325: #define DIFACTNEGEN 0x00000001ul /* aic7870 only */
326:
327: /*
328: *
329: * Define the format of the SEEPROM registers (16 bits).
330: *
331: */
332: struct seeprom_config {
333:
334: /*
335: * SCSI ID Configuration Flags
336: */
337: #define CFXFER 0x0007 /* synchronous transfer rate */
338: #define CFSYNCH 0x0008 /* enable synchronous transfer */
339: #define CFDISC 0x0010 /* enable disconnection */
340: #define CFWIDEB 0x0020 /* wide bus device (wide card) */
341: /* UNUSED 0x00C0 */
342: #define CFSTART 0x0100 /* send start unit SCSI command */
343: #define CFINCBIOS 0x0200 /* include in BIOS scan */
344: #define CFRNFOUND 0x0400 /* report even if not found */
345: /* UNUSED 0xF800 */
346: unsigned short device_flags[16]; /* words 0-15 */
347:
348: /*
349: * BIOS Control Bits
350: */
351: #define CFSUPREM 0x0001 /* support all removeable drives */
352: #define CFSUPREMB 0x0002 /* support removeable drives for boot only */
353: #define CFBIOSEN 0x0004 /* BIOS enabled */
354: /* UNUSED 0x0008 */
355: #define CFSM2DRV 0x0010 /* support more than two drives */
356: #define CF284XEXTEND 0x0020 /* extended translation (284x cards) */
357: /* UNUSED 0x0040 */
358: #define CFEXTEND 0x0080 /* extended translation enabled */
359: /* UNUSED 0xFF00 */
360: unsigned short bios_control; /* word 16 */
361:
362: /*
363: * Host Adapter Control Bits
364: */
365: /* UNUSED 0x0001 */
366: #define CFULTRAEN 0x0002 /* Ultra SCSI speed enable (Ultra cards) */
367: #define CF284XSELTO 0x0003 /* Selection timeout (284x cards) */
368: #define CF284XFIFO 0x000C /* FIFO Threshold (284x cards) */
369: #define CFSTERM 0x0004 /* SCSI low byte termination (non-wide cards) */
370: #define CFWSTERM 0x0008 /* SCSI high byte termination (wide card) */
371: #define CFSPARITY 0x0010 /* SCSI parity */
372: #define CF284XSTERM 0x0020 /* SCSI low byte termination (284x cards) */
373: #define CFRESETB 0x0040 /* reset SCSI bus at IC initialization */
374: /* UNUSED 0xFF80 */
375: unsigned short adapter_control; /* word 17 */
376:
377: /*
378: * Bus Release, Host Adapter ID
379: */
380: #define CFSCSIID 0x000F /* host adapter SCSI ID */
381: /* UNUSED 0x00F0 */
382: #define CFBRTIME 0xFF00 /* bus release time */
383: unsigned short brtime_id; /* word 18 */
384:
385: /*
386: * Maximum targets
387: */
388: #define CFMAXTARG 0x00FF /* maximum targets */
389: /* UNUSED 0xFF00 */
390: unsigned short max_targets; /* word 19 */
391:
392: unsigned short res_1[11]; /* words 20-30 */
393: unsigned short checksum; /* word 31 */
394: };
395:
396: /*
397: * Pause the sequencer and wait for it to actually stop - this
398: * is important since the sequencer can disable pausing for critical
399: * sections.
400: */
401: #define PAUSE_SEQUENCER(p) \
402: outb(p->pause, HCNTRL + p->base); \
403: while ((inb(HCNTRL + p->base) & PAUSE) == 0) \
404: ; \
405:
406: /*
407: * Unpause the sequencer. Unremarkable, yet done often enough to
408: * warrant an easy way to do it.
409: */
410: #define UNPAUSE_SEQUENCER(p) \
411: outb(p->unpause, HCNTRL + p->base)
412:
413: /*
414: * Restart the sequencer program from address zero
415: */
416: #define RESTART_SEQUENCER(p) \
417: do { \
418: outb(SEQRESET | FASTMODE, SEQCTL + p->base); \
419: } while (inb(SEQADDR0 + p->base) != 0 && \
420: inb(SEQADDR1 + p->base) != 0); \
421: UNPAUSE_SEQUENCER(p);
422:
423: /*
424: * If an error occurs during a data transfer phase, run the comand
425: * to completion - it's easier that way - making a note of the error
426: * condition in this location. This then will modify a DID_OK status
427: * into an appropriate error for the higher-level SCSI code.
428: */
429: #define aic7xxx_error(cmd) ((cmd)->SCp.Status)
430:
431: /*
432: * Keep track of the targets returned status.
433: */
434: #define aic7xxx_status(cmd) ((cmd)->SCp.sent_command)
435:
436: /*
437: * The position of the SCSI commands scb within the scb array.
438: */
439: #define aic7xxx_position(cmd) ((cmd)->SCp.have_data_in)
440:
441: /*
442: * Since the sequencer code DMAs the scatter-gather structures
443: * directly from memory, we use this macro to assert that the
444: * kernel structure hasn't changed.
445: */
446: #define SG_STRUCT_CHECK(sg) \
447: ((char *) &(sg).address - (char *) &(sg) != 0 || \
448: (char *) &(sg).length - (char *) &(sg) != 8 || \
449: sizeof((sg).address) != 4 || \
450: sizeof((sg).length) != 4 || \
451: sizeof(sg) != 12)
452:
453: /*
454: * "Static" structures. Note that these are NOT initialized
455: * to zero inside the kernel - we have to initialize them all
456: * explicitly.
457: *
458: * We support multiple adapter cards per interrupt, but keep a
459: * linked list of Scsi_Host structures for each IRQ. On an interrupt,
460: * use the IRQ as an index into aic7xxx_boards[] to locate the card
461: * information.
462: */
463: static struct Scsi_Host *aic7xxx_boards[MAXIRQ + 1];
464:
465: /*
466: * When we detect and register the card, it is possible to
467: * have the card raise a spurious interrupt. Because we need
468: * to support multiple cards, we cannot tell which card caused
469: * the spurious interrupt. And, we might not even have added
470: * the card info to the linked list at the time the spurious
471: * interrupt gets raised. This variable is suppose to keep track
472: * of when we are registering a card and how many spurious
473: * interrupts we have encountered.
474: *
475: * 0 - do not allow spurious interrupts.
476: * 1 - allow 1 spurious interrupt
477: * 2 - have 1 spurious interrupt, do not allow any more.
478: *
479: * I've made it an integer instead of a boolean in case we
480: * want to allow more than one spurious interrupt for debugging
481: * purposes. Otherwise, it could just go from true to false to
482: * true (or something like that).
483: *
484: * When the driver detects the cards, we'll set the count to 1
485: * for each card detection and registration. After the registration
486: * of a card completes, we'll set the count back to 0. So far, it
487: * seems to be enough to allow a spurious interrupt only during
488: * card registration; if a spurious interrupt is going to occur,
489: * this is where it happens.
490: *
491: * We should be able to find a way to avoid getting the spurious
492: * interrupt. But until we do, we have to keep this ugly code.
493: */
494: static int aic7xxx_spurious_count;
495:
496: /*
497: * The driver keeps up to four scb structures per card in memory. Only the
498: * first 25 bytes of the structure are valid for the hardware, the rest used
499: * for driver level bookkeeping.
500: */
501:
502: struct aic7xxx_scb {
503: /* ------------ Begin hardware supported fields ---------------- */
504: /* 0*/ unsigned char control;
505: /* 1*/ unsigned char target_channel_lun; /* 4/1/3 bits */
506: /* 2*/ unsigned char target_status;
507: /* 3*/ unsigned char SG_segment_count;
508: /* 4*/ unsigned char SG_list_pointer[4] __attribute__ ((packed));
509: /* 8*/ unsigned char residual_SG_segment_count;
510: /* 9*/ unsigned char residual_data_count[3];
511: /*12*/ unsigned char data_pointer[4] __attribute__ ((packed));
512: /*16*/ unsigned long data_count;
513: /*20*/ unsigned char SCSI_cmd_pointer[4] __attribute__ ((packed));
514: /*24*/ unsigned char SCSI_cmd_length;
515: #define SCB_PIO_TRANSFER_SIZE 25 /*
516: * amount we need to upload/download
517: * via rep in/outsb to perform
518: * a request sense. The second
519: * RESERVED byte is initialized to
520: * 0 in getscb().
521: */
522: /*25*/ u_char next_waiting; /* Used to thread SCBs awaiting selection. */
523: /*-----------------end of hardware supported fields----------------*/
524: struct aic7xxx_scb *next; /* next ptr when in free list */
525: Scsi_Cmnd *cmd; /* Scsi_Cmnd for this scb */
526: #define SCB_FREE 0x00
527: #define SCB_ACTIVE 0x01
528: #define SCB_ABORTED 0x02
529: #define SCB_DEVICE_RESET 0x04
530: #define SCB_IMMED 0x08
531: #define SCB_SENSE 0x10
532: int state; /* current state of scb */
533: unsigned int position; /* Position in scb array */
534: struct scatterlist sg;
535: struct scatterlist sense_sg;
536: unsigned char sense_cmd[6]; /* Allocate 6 characters for sense command */
537: };
538:
539: static struct {
540: unsigned char errno;
541: const char *errmesg;
542: } hard_error[] = {
543: { ILLHADDR, "Illegal Host Access" },
544: { ILLSADDR, "Illegal Sequencer Address referrenced" },
545: { ILLOPCODE, "Illegal Opcode in sequencer program" },
546: { PARERR, "Sequencer Ram Parity Error" }
547: };
548:
549: static unsigned char
550: generic_sense[] = { REQUEST_SENSE, 0, 0, 0, 255, 0 };
551:
552: /*
553: * The maximum number of SCBs we could have for ANY type
554: * of card. DON'T FORGET TO CHANGE THE SCB MASK IN THE
555: * SEQUENCER CODE IF THIS IS MODIFIED!
556: */
557: #define AIC7XXX_MAXSCB 255
558:
559: /*
560: * Define a structure used for each host adapter, only one per IRQ.
561: */
562: struct aic7xxx_host {
563: int base; /* card base address */
564: int maxscb; /* hardware SCBs */
565: int numscb; /* current number of scbs */
566: int extended; /* extended xlate? */
567: aha_type type; /* card type */
568: aha_chip_type chip_type; /* chip base type */
569: int ultra_enabled; /* Ultra SCSI speed enabled */
570: int chan_num; /* for 3940/3985, channel number */
571: aha_bus_type bus_type; /* normal/twin/wide bus */
572: unsigned char a_scanned; /* 0 not scanned, 1 scanned */
573: unsigned char b_scanned; /* 0 not scanned, 1 scanned */
574: unsigned int isr_count; /* Interrupt count */
575: volatile unsigned char unpause; /* unpause value for HCNTRL */
576: volatile unsigned char pause; /* pause value for HCNTRL */
577: volatile unsigned short needsdtr_copy; /* default config */
578: volatile unsigned short needsdtr;
579: volatile unsigned short sdtr_pending;
580: volatile unsigned short needwdtr_copy; /* default config */
581: volatile unsigned short needwdtr;
582: volatile unsigned short wdtr_pending;
583: volatile unsigned short discenable; /* Targets allowed to disconnect */
584: struct seeprom_config seeprom;
585: int have_seeprom;
586: struct Scsi_Host *next; /* allow for multiple IRQs */
587: struct aic7xxx_scb scb_array[AIC7XXX_MAXSCB]; /* active commands */
588: struct aic7xxx_scb *free_scb; /* list of free SCBs */
589: #ifdef AIC7XXX_PROC_STATS
590: /*
591: * Statistics Kept:
592: *
593: * Total Xfers (count for each command that has a data xfer),
594: * broken down further by reads && writes.
595: *
596: * Binned sizes, writes && reads:
597: * < 512, 512, 1-2K, 2-4K, 4-8K, 8-16K, 16-32K, 32-64K, 64K-128K, > 128K
598: *
599: * Total amounts read/written above 512 bytes (amts under ignored)
600: */
601: struct aic7xxx_xferstats {
602: long xfers; /* total xfer count */
603: long w_total; /* total writes */
604: long w_total512; /* 512 byte blocks written */
605: long w_bins[10]; /* binned write */
606: long r_total; /* total reads */
607: long r_total512; /* 512 byte blocks read */
608: long r_bins[10]; /* binned reads */
609: } stats[2][16][8]; /* channel, target, lun */
610: #endif /* AIC7XXX_PROC_STATS */
611: };
612:
613: struct aic7xxx_host_config {
614: int irq; /* IRQ number */
615: int base; /* I/O base */
616: int maxscb; /* hardware SCBs */
617: int unpause; /* unpause value for HCNTRL */
618: int pause; /* pause value for HCNTRL */
619: int scsi_id; /* host SCSI ID */
620: int scsi_id_b; /* host SCSI ID B channel for twin cards */
621: int extended; /* extended xlate? */
622: int busrtime; /* bus release time */
623: int walk_scbs; /* external SCB RAM detected; walk the scb array */
624: aha_type type; /* card type */
625: aha_chip_type chip_type; /* chip base type */
626: int ultra_enabled; /* Ultra SCSI speed enabled */
627: int chan_num; /* for 3940/3985, channel number */
628: aha_bus_type bus_type; /* normal/twin/wide bus */
629: aha_status_type parity; /* bus parity enabled/disabled */
630: aha_status_type low_term; /* bus termination low byte */
631: aha_status_type high_term; /* bus termination high byte (wide cards only) */
632: };
633:
634: /*
635: * Valid SCSIRATE values. (p. 3-17)
636: * Provides a mapping of tranfer periods in ns to the proper value to
637: * stick in the scsiscfr reg to use that transfer rate.
638: */
639: static struct {
640: short period;
641: /* Rates in Ultra mode have bit 8 of sxfr set */
642: #define ULTRA_SXFR 0x100
643: short rate;
644: const char *english;
645: } aic7xxx_syncrates[] = {
646: { 50, 0x100, "20.0" },
647: { 62, 0x110, "16.0" },
648: { 75, 0x120, "13.4" },
649: { 100, 0x140, "10.0" },
650: { 100, 0x000, "10.0" },
651: { 125, 0x010, "8.0" },
652: { 150, 0x020, "6.67" },
653: { 175, 0x030, "5.7" },
654: { 200, 0x040, "5.0" },
655: { 225, 0x050, "4.4" },
656: { 250, 0x060, "4.0" },
657: { 275, 0x070, "3.6" }
658: };
659:
660: static int num_aic7xxx_syncrates =
661: sizeof(aic7xxx_syncrates) / sizeof(aic7xxx_syncrates[0]);
662:
663: #ifdef CONFIG_PCI
664: static int number_of_39xxs = 0;
665: #endif CONFIG_PCI
666:
667: #ifdef AIC7XXX_DEBUG
668: static void
669: debug(const char *fmt, ...)
670: {
671: va_list ap;
672: char buf[256];
673:
674: va_start(ap, fmt);
675: vsprintf(buf, fmt, ap);
676: printk(buf);
677: va_end(ap);
678: }
679:
680: static void
681: debug_config(struct aic7xxx_host_config *p)
682: {
683: int host_conf, scsi_conf;
684: unsigned char brelease;
685: unsigned char dfthresh;
686:
687: static int DFT[] = { 0, 50, 75, 100 };
688: static int SST[] = { 256, 128, 64, 32 };
689: static const char *BUSW[] = { "", "-TWIN", "-WIDE" };
690:
691: host_conf = inb(HOSTCONF + p->base);
692: scsi_conf = inb(SCSICONF + p->base);
693:
694: /*
695: * The 7870 gets the bus release time and data FIFO threshold
696: * from the serial EEPROM (stored in the config structure) and
697: * scsi_conf register respectively. The 7770 gets the bus
698: * release time and data FIFO threshold from the scsi_conf and
699: * host_conf registers respectively.
700: */
701: if (p->chip_type == AIC_777x)
702: {
703: dfthresh = (host_conf >> 6);
704: }
705: else
706: {
707: dfthresh = (scsi_conf >> 6);
708: }
709:
710: brelease = p->busrtime;
711: if (brelease == 0)
712: {
713: brelease = 2;
714: }
715:
716: switch (p->type)
717: {
718: case AIC_7770:
719: case AIC_7771:
720: printk("%s%s AT EISA SLOT %d:\n", board_names[p->type], BUSW[p->bus_type],
721: p->base >> 12);
722: break;
723:
724: case AIC_284x:
725: printk("%s%s AT VLB SLOT %d:\n", board_names[p->type], BUSW[p->bus_type],
726: p->base >> 12);
727: break;
728:
729: case AIC_7850:
730: case AIC_7870:
731: case AIC_7871:
732: case AIC_7872:
733: case AIC_7873:
734: case AIC_7874:
735: case AIC_7880:
736: case AIC_7881:
737: case AIC_7882:
738: case AIC_7883:
739: case AIC_7884:
740: printk("%s%s (PCI-bus):\n", board_names[p->type], BUSW[p->bus_type]);
741: break;
742:
743: default:
744: panic("aic7xxx: (debug_config) internal error.\n");
745: }
746:
747: printk(" irq %d\n"
748: " bus release time %d bclks\n"
749: " data fifo threshold %d%%\n",
750: p->irq,
751: brelease,
752: DFT[dfthresh]);
753:
754: printk(" SCSI CHANNEL A:\n"
755: " scsi id %d\n"
756: " scsi selection timeout %d ms\n"
757: " scsi bus reset at power-on %sabled\n",
758: scsi_conf & 0x07,
759: SST[(scsi_conf >> 3) & 0x03],
760: (scsi_conf & 0x40) ? "en" : "dis");
761:
762: if ((p->chip_type == AIC_777x) && (p->parity == AIC_UNKNOWN))
763: {
764: /*
765: * Set the parity for 7770 based cards.
766: */
767: p->parity = (scsi_conf & 0x20) ? AIC_ENABLED : AIC_DISABLED;
768: }
769: if (p->parity != AIC_UNKNOWN)
770: {
771: printk(" scsi bus parity %sabled\n",
772: (p->parity == AIC_ENABLED) ? "en" : "dis");
773: }
774:
775: if ((p->type == AIC_7770) || (p->type == AIC_7771))
776: {
777: p->low_term = (scsi_conf & 0x80) ? AIC_ENABLED : AIC_DISABLED;
778: }
779: if (p->low_term != AIC_UNKNOWN)
780: {
781: printk(" scsi bus termination (low byte) %sabled\n",
782: (p->low_term == AIC_ENABLED) ? "en" : "dis");
783: }
784: if ((p->bus_type == AIC_WIDE) && (p->high_term != AIC_UNKNOWN))
785: {
786: printk(" scsi bus termination (high byte) %sabled\n",
787: (p->high_term == AIC_ENABLED) ? "en" : "dis");
788: }
789: }
790:
791: #if 0
792: static void
793: debug_scb(struct aic7xxx_scb *scb)
794: {
795: printk("control 0x%x, tcl 0x%x, sg_count %d, sg_ptr 0x%x, cmdp 0x%x, cmdlen %d\n",
796: scb->control, scb->target_channel_lun, scb->SG_segment_count,
797: (scb->SG_list_pointer[3] << 24) | (scb->SG_list_pointer[2] << 16) |
798: (scb->SG_list_pointer[1] << 8) | scb->SG_list_pointer[0],
799: (scb->SCSI_cmd_pointer[3] << 24) | (scb->SCSI_cmd_pointer[2] << 16) |
800: (scb->SCSI_cmd_pointer[1] << 8) | scb->SCSI_cmd_pointer[0],
801: scb->SCSI_cmd_length);
802: printk("reserved 0x%x, target status 0x%x, resid SG count %d, resid data count %d\n",
803: (scb->RESERVED[1] << 8) | scb->RESERVED[0], scb->target_status,
804: scb->residual_SG_segment_count, scb->residual_data_count);
805: printk("data ptr 0x%x, data count %d, next waiting %d\n",
806: (scb->data_pointer[3] << 24) | (scb->data_pointer[2] << 16) |
807: (scb->data_pointer[1] << 8) | scb->data_pointer[0],
808: scb->data_count, scb->next_waiting);
809: printk("next ptr 0x%lx, Scsi Cmnd 0x%lx, state 0x%x, position %d\n",
810: (unsigned long) scb->next, (unsigned long) scb->cmd, scb->state,
811: scb->position);
812: }
813: #endif
814:
815: #else
816: # define debug(fmt, args...)
817: # define debug_config(x)
818: # define debug_scb(x)
819: #endif AIC7XXX_DEBUG
820:
821: /*
822: * XXX - these options apply unilaterally to _all_ 274x/284x/294x
823: * cards in the system. This should be fixed, but then,
824: * does anyone really have more than one in a machine?
825: */
826: static unsigned int aic7xxx_extended = 0; /* extended translation on? */
827: static unsigned int aic7xxx_no_reset = 0; /* no resetting of SCSI bus */
828:
829: /*+F*************************************************************************
830: * Function:
831: * aic7xxx_setup
832: *
833: * Description:
834: * Handle Linux boot parameters. This routine allows for assigning a value
835: * to a parameter with a ':' between the parameter and the value.
836: * ie. aic7xxx=unpause:0x0A,extended
837: *-F*************************************************************************/
838: void
839: aic7xxx_setup(char *s, int *dummy)
840: {
841: int i, n;
842: char *p;
843:
844: static struct {
845: const char *name;
846: unsigned int *flag;
847: } options[] = {
848: { "extended", &aic7xxx_extended },
849: { "no_reset", &aic7xxx_no_reset },
850: { NULL, NULL }
851: };
852:
853: for (p = strtok(s, ","); p; p = strtok(NULL, ","))
854: {
855: for (i = 0; options[i].name; i++)
856: {
857: n = strlen(options[i].name);
858: if (!strncmp(options[i].name, p, n))
859: {
860: if (p[n] == ':')
861: {
862: *(options[i].flag) = simple_strtoul(p + n + 1, NULL, 0);
863: }
864: else
865: {
866: *(options[i].flag) = !0;
867: }
868: }
869: }
870: }
871: }
872:
873: /*+F*************************************************************************
874: * Function:
875: * aic7xxx_loadseq
876: *
877: * Description:
878: * Load the sequencer code into the controller memory.
879: *-F*************************************************************************/
880: static void
881: aic7xxx_loadseq(int base)
882: {
883: static unsigned char seqprog[] = {
884: /*
885: * Each sequencer instruction is 29 bits
886: * long (fill in the excess with zeroes)
887: * and has to be loaded from least -> most
888: * significant byte, so this table has the
889: * byte ordering reversed.
890: */
891: # include "aic7xxx_seq.h"
892: };
893:
894: /*
895: * When the AIC-7770 is paused (as on chip reset), the
896: * sequencer address can be altered and a sequencer
897: * program can be loaded by writing it, byte by byte, to
898: * the sequencer RAM port - the Adaptec documentation
899: * recommends using REP OUTSB to do this, hence the inline
900: * assembly. Since the address autoincrements as we load
901: * the program, reset it back to zero afterward. Disable
902: * sequencer RAM parity error detection while loading, and
903: * make sure the LOADRAM bit is enabled for loading.
904: */
905: outb(PERRORDIS | SEQRESET | LOADRAM, SEQCTL + base);
906:
907: outsb(SEQRAM + base, seqprog, sizeof(seqprog));
908:
909: /*
910: * WARNING! This is a magic sequence! After extensive
911: * experimentation, it seems that you MUST turn off the
912: * LOADRAM bit before you play with SEQADDR again, else
913: * you will end up with parity errors being flagged on
914: * your sequencer program. (You would also think that
915: * turning off LOADRAM and setting SEQRESET to reset the
916: * address to zero would work, but you need to do it twice
917: * for it to take effect on the address. Timing problem?)
918: */
919: do {
920: /*
921: * Actually, reset it until
922: * the address shows up as
923: * zero just to be safe..
924: */
925: outb(SEQRESET | FASTMODE, SEQCTL + base);
926: } while ((inb(SEQADDR0 + base) != 0) && (inb(SEQADDR1 + base) != 0));
927: }
928:
929: /*+F*************************************************************************
930: * Function:
931: * aic7xxx_delay
932: *
933: * Description:
934: * Delay for specified amount of time.
935: *-F*************************************************************************/
936: static void
937: aic7xxx_delay(int seconds)
938: {
939: unsigned long i;
940:
941: i = jiffies + (seconds * HZ); /* compute time to stop */
942:
943: while (jiffies < i)
944: {
945: ; /* Do nothing! */
946: }
947: }
948:
949: /*+F*************************************************************************
950: * Function:
951: * rcs_version
952: *
953: * Description:
954: * Return a string containing just the RCS version number from either
955: * an Id or Revison RCS clause.
956: *-F*************************************************************************/
957: const char *
958: rcs_version(const char *version_info)
959: {
960: static char buf[10];
961: char *bp, *ep;
962:
963: bp = NULL;
964: strcpy(buf, "????");
965: if (!strncmp(version_info, "$Id: ", 5))
966: {
967: if ((bp = strchr(version_info, ' ')) != NULL)
968: {
969: bp++;
970: if ((bp = strchr(bp, ' ')) != NULL)
971: {
972: bp++;
973: }
974: }
975: }
976: else
977: {
978: if (!strncmp(version_info, "$Revision: ", 11))
979: {
980: if ((bp = strchr(version_info, ' ')) != NULL)
981: {
982: bp++;
983: }
984: }
985: }
986:
987: if (bp != NULL)
988: {
989: if ((ep = strchr(bp, ' ')) != NULL)
990: {
991: register int len = ep - bp;
992:
993: strncpy(buf, bp, len);
994: buf[len] = '\0';
995: }
996: }
997:
998: return buf;
999: }
1000:
1001: /*+F*************************************************************************
1002: * Function:
1003: * aic7xxx_info
1004: *
1005: * Description:
1006: * Return a string describing the driver.
1007: *-F*************************************************************************/
1008: const char *
1009: aic7xxx_info(struct Scsi_Host *notused)
1010: {
1011: static char buffer[128];
1012:
1013: strcpy(buffer, "Adaptec AHA274x/284x/294x (EISA/VLB/PCI-Fast SCSI) ");
1014: strcat(buffer, rcs_version(AIC7XXX_C_VERSION));
1015: strcat(buffer, "/");
1016: strcat(buffer, rcs_version(AIC7XXX_H_VERSION));
1017: strcat(buffer, "/");
1018: strcat(buffer, rcs_version(AIC7XXX_SEQ_VER));
1019:
1020: return buffer;
1021: }
1022:
1023: /*+F*************************************************************************
1024: * Function:
1025: * aic7xxx_length
1026: *
1027: * Description:
1028: * How much data should be transferred for this SCSI command? Stop
1029: * at segment sg_last if it's a scatter-gather command so we can
1030: * compute underflow easily.
1031: *-F*************************************************************************/
1032: static unsigned
1033: aic7xxx_length(Scsi_Cmnd *cmd, int sg_last)
1034: {
1035: int i, segments;
1036: unsigned length;
1037: struct scatterlist *sg;
1038:
1039: segments = cmd->use_sg - sg_last;
1040: sg = (struct scatterlist *) cmd->buffer;
1041:
1042: if (cmd->use_sg)
1043: {
1044: for (i = length = 0; (i < cmd->use_sg) && (i < segments); i++)
1045: {
1046: length += sg[i].length;
1047: }
1048: }
1049: else
1050: {
1051: length = cmd->request_bufflen;
1052: }
1053:
1054: return (length);
1055: }
1056:
1057: /*+F*************************************************************************
1058: * Function:
1059: * aic7xxx_scsirate
1060: *
1061: * Description:
1062: * Look up the valid period to SCSIRATE conversion in our table
1063: *-F*************************************************************************/
1064: static void
1065: aic7xxx_scsirate(struct aic7xxx_host *p, unsigned char *scsirate,
1066: short period, unsigned char offset,
1067: int target, char channel)
1068: {
1069: int i;
1070:
1071: for (i = 0; i < num_aic7xxx_syncrates; i++)
1072: {
1073: if ((aic7xxx_syncrates[i].period - period) >= 0)
1074: {
1075: /*
1076: * Watch out for Ultra speeds when ultra is not enabled and
1077: * vice-versa.
1078: */
1079: if (p->ultra_enabled)
1080: {
1081: if (!(aic7xxx_syncrates[i].rate & ULTRA_SXFR))
1082: {
1083: printk ("aic7xxx: Target %d, channel %c, requests %sMHz transfers, "
1084: "but adapter in Ultra mode can only sync at 10MHz or "
1085: "above.\n", target, channel, aic7xxx_syncrates[i].english);
1086: break; /* Use asynchronous transfers. */
1087: }
1088: }
1089: else
1090: {
1091: /*
1092: * Check for an Ultra device trying to negotiate an Ultra rate
1093: * on an adapter with Ultra mode disabled.
1094: */
1095: if (aic7xxx_syncrates[i].rate & ULTRA_SXFR)
1096: {
1097: /*
1098: * This should only happen if the driver is the first to negotiate
1099: * and chooses a high rate. We'll just move down the table until
1100: * we hit a non Ultra speed.
1101: */
1102: continue;
1103: }
1104: }
1105: *scsirate = (aic7xxx_syncrates[i].rate) | (offset & 0x0F);
1106: printk("aic7xxx: Target %d, channel %c, now synchronous at %sMHz, "
1107: "offset(0x%x).\n",
1108: target, channel, aic7xxx_syncrates[i].english, offset);
1109: return;
1110: }
1111: }
1112:
1113: /*
1114: * Default to asynchronous transfer
1115: */
1116: *scsirate = 0;
1117: printk("aic7xxx: Target %d, channel %c, using asynchronous transfers.\n",
1118: target, channel);
1119: }
1120:
1121: /*+F*************************************************************************
1122: * Function:
1123: * aic7xxx_putscb
1124: *
1125: * Description:
1126: * Transfer a SCB to the controller.
1127: *-F*************************************************************************/
1128: static inline void
1129: aic7xxx_putscb(struct aic7xxx_host *p, struct aic7xxx_scb *scb)
1130: {
1131: unsigned char curscb;
1132: int base = p->base;
1133:
1134: curscb = inb(SCBPTR + base);
1135: outb(scb->position, SCBPTR + base);
1136: outb(SCBAUTO, SCBCNT + base);
1137:
1138: /*
1139: * By turning on the SCB auto increment, any reference
1140: * to the SCB I/O space postincrements the SCB address
1141: * we're looking at. So turn this on and dump the relevant
1142: * portion of the SCB to the card.
1143: *
1144: * We can do 16bit transfers on all but 284x.
1145: */
1146: if (p->type == AIC_284x)
1147: {
1148: outsb(SCBARRAY + base, scb, SCB_PIO_TRANSFER_SIZE);
1149: }
1150: else
1151: {
1152: outsl(SCBARRAY + base, scb, (SCB_PIO_TRANSFER_SIZE + 3) / 4);
1153: }
1154:
1155: outb(0, SCBCNT + base);
1156: outb(curscb, SCBPTR + base);
1157: }
1158:
1159: /*+F*************************************************************************
1160: * Function:
1161: * aic7xxx_getscb
1162: *
1163: * Description:
1164: * Get a SCB from the controller.
1165: *-F*************************************************************************/
1166: static inline void
1167: aic7xxx_getscb(struct aic7xxx_host *p, struct aic7xxx_scb *scb)
1168: {
1169: int base = p->base;
1170:
1171: /*
1172: * This is almost identical to aic7xxx_putscb().
1173: */
1174: outb(SCBAUTO, SCBCNT + base);
1175: insb(SCBARRAY + base, scb, SCB_PIO_TRANSFER_SIZE);
1176: outb(0, SCBCNT + base);
1177: }
1178:
1179: /*+F*************************************************************************
1180: * Function:
1181: * aic7xxx_match_scb
1182: *
1183: * Description:
1184: * Checks to see if an scb matches the target/channel as specified.
1185: * If target is ALL_TARGETS (-1), then we're looking for any device
1186: * on the specified channel; this happens when a channel is going
1187: * to be reset and all devices on that channel must be aborted.
1188: *-F*************************************************************************/
1189: static int
1190: aic7xxx_match_scb(struct aic7xxx_scb *scb, int target, char channel)
1191: {
1192: int targ = (scb->target_channel_lun >> 4) & 0x0F;
1193: char chan = (scb->target_channel_lun & SELBUSB) ? 'B' : 'A';
1194:
1195: #ifdef AIC7XXX_DEBUG_ABORT
1196: printk ("aic7xxx: (match_scb) comparing target/channel %d/%c to scb %d/%c\n",
1197: target, channel, targ, chan);
1198: #endif
1199: if (target == ALL_TARGETS)
1200: {
1201: return (chan == channel);
1202: }
1203: else
1204: {
1205: return ((chan == channel) && (targ == target));
1206: }
1207: }
1208:
1209: /*+F*************************************************************************
1210: * Function:
1211: * aic7xxx_busy_target
1212: *
1213: * Description:
1214: * Set the specified target active.
1215: *-F*************************************************************************/
1216: static void
1217: aic7xxx_busy_target(unsigned char target, char channel, int base)
1218: {
1219: unsigned char active;
1220: unsigned long active_port = ACTIVE_A + base;
1221:
1222: if ((target > 0x07) || (channel == 'B'))
1223: {
1224: /*
1225: * targets on the Second channel or above id 7 store info in byte two
1226: * of ACTIVE
1227: */
1228: active_port++;
1229: }
1230: active = inb(active_port);
1231: active |= (0x01 << (target & 0x07));
1232: outb(active, active_port);
1233: }
1234:
1235: /*+F*************************************************************************
1236: * Function:
1237: * aic7xxx_unbusy_target
1238: *
1239: * Description:
1240: * Set the specified target inactive.
1241: *-F*************************************************************************/
1242: static void
1243: aic7xxx_unbusy_target(unsigned char target, char channel, int base)
1244: {
1245: unsigned char active;
1246: unsigned long active_port = ACTIVE_A + base;
1247:
1248: #ifdef 0
1249: printk ("aic7xxx: (unbusy_target) target/channel %d/%c\n",
1250: target, channel);
1251: #endif
1252: if ((target > 0x07) || (channel == 'B'))
1253: {
1254: /*
1255: * targets on the Second channel or above id 7 store info in byte two
1256: * of ACTIVE
1257: */
1258: active_port++;
1259: }
1260: active = inb(active_port);
1261: active &= ~(0x01 << (target & 0x07));
1262: outb(active, active_port);
1263: }
1264:
1265: /*+F*************************************************************************
1266: * Function:
1267: * aic7xxx_done
1268: *
1269: * Description:
1270: * Calls the higher level scsi done function and frees the scb.
1271: *-F*************************************************************************/
1272: static void
1273: aic7xxx_done(struct aic7xxx_host *p, struct aic7xxx_scb *scb)
1274: {
1275: long flags;
1276: Scsi_Cmnd *cmd = scb->cmd;
1277:
1278: #ifdef 0
1279: printk ("aic7xxx: (done) target/channel %d/%d\n",
1280: cmd->target, cmd->channel);
1281: #endif
1282: /*
1283: * This is a critical section, since we don't want the
1284: * queue routine mucking with the host data.
1285: */
1286: save_flags(flags);
1287: cli();
1288:
1289: /*
1290: * Process the command after marking the scb as free
1291: * and adding it to the free list.
1292: */
1293: scb->state = SCB_FREE;
1294: scb->next = p->free_scb;
1295: p->free_scb = scb;
1296: scb->cmd = NULL;
1297:
1298: restore_flags(flags);
1299:
1300: cmd->scsi_done(cmd);
1301: }
1302:
1303: /*+F*************************************************************************
1304: * Function:
1305: * aic7xxx_add_waiting_scb
1306: *
1307: * Description:
1308: * Add this SCB to the "waiting for selection" list.
1309: *-F*************************************************************************/
1310: static void
1311: aic7xxx_add_waiting_scb(u_long base,
1312: struct aic7xxx_scb *scb,
1313: insert_type where)
1314: {
1315: unsigned char head;
1316: unsigned char curscb;
1317:
1318: curscb = inb(SCBPTR + base);
1319: head = inb(WAITING_SCBH + base);
1320: if (head == SCB_LIST_NULL)
1321: {
1322: /*
1323: * List was empty
1324: */
1325: head = scb->position;
1326: }
1327: else
1328: {
1329: if (where == LIST_HEAD)
1330: {
1331: outb(scb->position, SCBPTR + base);
1332: outb(head, SCB_NEXT_WAITING + base);
1333: head = scb->position;
1334: }
1335: else
1336: {
1337: /* where == LIST_SECOND */
1338: unsigned char third_scb;
1339:
1340: outb(head, SCBPTR + base);
1341: third_scb = inb(SCB_NEXT_WAITING + base);
1342: outb(scb->position, SCB_NEXT_WAITING + base);
1343: outb(scb->position, SCBPTR + base);
1344: outb(third_scb, SCB_NEXT_WAITING + base);
1345: }
1346: }
1347: outb(head, WAITING_SCBH + base);
1348: outb(curscb, SCBPTR + base);
1349: }
1350:
1351: /*+F*************************************************************************
1352: * Function:
1353: * aic7xxx_abort_waiting_scb
1354: *
1355: * Description:
1356: * Manipulate the waiting for selection list and return the
1357: * scb that follows the one that we remove.
1358: *-F*************************************************************************/
1359: static unsigned char
1360: aic7xxx_abort_waiting_scb(struct aic7xxx_host *p, struct aic7xxx_scb *scb,
1361: unsigned char prev, unsigned char timedout_scb)
1362: {
1363: unsigned char curscb, next;
1364: int target = (scb->target_channel_lun >> 4) & 0x0F;
1365: char channel = (scb->target_channel_lun & SELBUSB) ? 'B' : 'A';
1366: int base = p->base;
1367:
1368: /*
1369: * Select the SCB we want to abort and
1370: * pull the next pointer out of it.
1371: */
1372: curscb = inb(SCBPTR + base);
1373: outb(scb->position, SCBPTR + base);
1374: next = inb(SCB_NEXT_WAITING + base);
1375:
1376: /*
1377: * Clear the necessary fields
1378: */
1379: outb(0, SCBARRAY + base);
1380: outb(SCB_LIST_NULL, SCB_NEXT_WAITING + base);
1381: aic7xxx_unbusy_target(target, channel, base);
1382:
1383: /*
1384: * Update the waiting list
1385: */
1386: if (prev == SCB_LIST_NULL)
1387: {
1388: /*
1389: * First in the list
1390: */
1391: outb(next, WAITING_SCBH + base);
1392: }
1393: else
1394: {
1395: /*
1396: * Select the scb that pointed to us and update its next pointer.
1397: */
1398: outb(prev, SCBPTR + base);
1399: outb(next, SCB_NEXT_WAITING + base);
1400: }
1401: /*
1402: * Update the tail pointer
1403: */
1404: if (inb(WAITING_SCBT + base) == scb->position)
1405: {
1406: outb(prev, WAITING_SCBT + base);
1407: }
1408:
1409: /*
1410: * Point us back at the original scb position
1411: * and inform the SCSI system that the command
1412: * has been aborted.
1413: */
1414: outb(curscb, SCBPTR + base);
1415: scb->state |= SCB_ABORTED;
1416: scb->cmd->result = (DID_RESET << 16);
1417: aic7xxx_done(p, scb);
1418:
1419: #ifdef AIC7XXX_DEBUG_ABORT
1420: printk ("aic7xxx: (abort_waiting_scb) target/channel %d/%c, prev %d, "
1421: "to_scb %d, next %d\n", target, channel, prev, timedout_scb, next);
1422: #endif
1423: return (next);
1424: }
1425:
1426: /*+F*************************************************************************
1427: * Function:
1428: * aic7xxx_reset_device
1429: *
1430: * Description:
1431: * The device at the given target/channel has been reset. Abort
1432: * all active and queued scbs for that target/channel.
1433: *-F*************************************************************************/
1434: static int
1435: aic7xxx_reset_device(struct aic7xxx_host *p, int target, char channel,
1436: unsigned char timedout_scb)
1437: {
1438: int base = p->base;
1439: struct aic7xxx_scb *scb;
1440: unsigned char active_scb;
1441: int i = 0;
1442: int found = 0;
1443:
1444: /*
1445: * Restore this when we're done
1446: */
1447: active_scb = inb(SCBPTR + base);
1448:
1449: #ifdef AIC7XXX_DEBUG_ABORT
1450: printk ("aic7xxx: (reset_device) target/channel %d/%c, to_scb %d, "
1451: "active_scb %d\n", target, channel, timedout_scb, active_scb);
1452: #endif
1453: /*
1454: * Search the QINFIFO.
1455: */
1456: {
1457: int saved_queue[AIC7XXX_MAXSCB];
1458: int queued = inb(QINCNT + base);
1459:
1460: for (i = 0; i < (queued - found); i++)
1461: {
1462: saved_queue[i] = inb(QINFIFO + base);
1463: scb = &(p->scb_array[saved_queue[i]]);
1464: if (aic7xxx_match_scb(scb, target, channel))
1465: {
1466: /*
1467: * We found an scb that needs to be aborted.
1468: */
1469: scb->state |= SCB_ABORTED;
1470: scb->cmd->result = (DID_RESET << 16);
1471: aic7xxx_done(p, scb);
1472: outb(scb->position, SCBPTR + base);
1473: outb(0, SCBARRAY + base);
1474: i--;
1475: found++;
1476: }
1477: }
1478: /*
1479: * Now put the saved scbs back.
1480: */
1481: for (queued = 0; queued < i; queued++)
1482: {
1483: outb(saved_queue[queued], QINFIFO + base);
1484: }
1485: }
1486:
1487: /*
1488: * Search waiting for selection list.
1489: */
1490: {
1491: unsigned char next, prev;
1492:
1493: next = inb(WAITING_SCBH + base); /* Start at head of list. */
1494: prev = SCB_LIST_NULL;
1495:
1496: while (next != SCB_LIST_NULL)
1497: {
1498: scb = &(p->scb_array[next]);
1499: /*
1500: * Select the SCB.
1501: */
1502: if (aic7xxx_match_scb(scb, target, channel))
1503: {
1504: next = aic7xxx_abort_waiting_scb(p, scb, prev, timedout_scb);
1505: found++;
1506: }
1507: else
1508: {
1509: outb(scb->position, SCBPTR + base);
1510: prev = next;
1511: next = inb(SCB_NEXT_WAITING + base);
1512: }
1513: }
1514: }
1515:
1516: /*
1517: * Go through the entire SCB array now and look for
1518: * commands for this target that are active. These
1519: * are other (most likely tagged) commands that
1520: * were disconnected when the reset occured.
1521: */
1522: for (i = 0; i < p->numscb; i++)
1523: {
1524: scb = &(p->scb_array[i]);
1525: if ((scb->state & SCB_ACTIVE) && aic7xxx_match_scb(scb, target, channel))
1526: {
1527: /*
1528: * Ensure the target is "free"
1529: */
1530: aic7xxx_unbusy_target(target, channel, base);
1531: outb(scb->position, SCBPTR + base);
1532: outb(0, SCBARRAY + base);
1533: scb->state |= SCB_ABORTED;
1534: scb->cmd->result = (DID_RESET << 16);
1535: aic7xxx_done(p, scb);
1536: found++;
1537: }
1538: }
1539:
1540: outb(active_scb, SCBPTR + base);
1541: return (found);
1542: }
1543:
1544: /*+F*************************************************************************
1545: * Function:
1546: * aic7xxx_reset_current_bus
1547: *
1548: * Description:
1549: * Reset the current SCSI bus.
1550: *-F*************************************************************************/
1551: static void
1552: aic7xxx_reset_current_bus(int base)
1553: {
1554: #ifdef AIC7XXX_DEBUG_ABORT
1555: printk ("aic7xxx: (reset_current_bus)\n");
1556: #endif
1557: outb(SCSIRSTO, SCSISEQ + base);
1558: udelay(1000);
1559: outb(0, SCSISEQ + base);
1560: }
1561:
1562: /*+F*************************************************************************
1563: * Function:
1564: * aic7xxx_reset_channel
1565: *
1566: * Description:
1567: * Reset the channel.
1568: *-F*************************************************************************/
1569: static int
1570: aic7xxx_reset_channel(struct aic7xxx_host *p, char channel,
1571: unsigned char timedout_scb)
1572: {
1573: int base = p->base;
1574: unsigned char sblkctl;
1575: char cur_channel;
1576: unsigned long offset, offset_max;
1577: int found;
1578:
1579: #ifdef AIC7XXX_DEBUG_ABORT
1580: printk ("aic7xxx: (reset_channel) channel %c, to_scb %d\n",
1581: channel, timedout_scb);
1582: #endif
1583: /*
1584: * Clean up all the state information for the
1585: * pending transactions on this bus.
1586: */
1587: found = aic7xxx_reset_device(p, ALL_TARGETS, channel, timedout_scb);
1588:
1589: if (channel == 'B')
1590: {
1591: p->needsdtr |= (p->needsdtr_copy & 0xFF00);
1592: p->sdtr_pending &= 0x00FF;
1593: outb(0, ACTIVE_B + base);
1594: offset = TARG_SCRATCH + base + 8;
1595: offset_max = TARG_SCRATCH + base + 16;
1596: }
1597: else
1598: {
1599: if (p->bus_type == AIC_WIDE)
1600: {
1601: p->needsdtr = p->needsdtr_copy;
1602: p->needwdtr = p->needwdtr_copy;
1603: p->sdtr_pending = 0x0;
1604: p->wdtr_pending = 0x0;
1605: outb(0, ACTIVE_A + base);
1606: outb(0, ACTIVE_B + base);
1607: offset = TARG_SCRATCH + base;
1608: offset_max = TARG_SCRATCH + base + 16;
1609: }
1610: else
1611: {
1612: p->needsdtr |= (p->needsdtr_copy & 0x00FF);
1613: p->sdtr_pending &= 0xFF00;
1614: outb(0, ACTIVE_A + base);
1615: offset = TARG_SCRATCH + base;
1616: offset_max = TARG_SCRATCH + base + 8;
1617: }
1618: }
1619: while (offset < offset_max)
1620: {
1621: /*
1622: * Revert to async/narrow transfers
1623: * until we renegotiate.
1624: */
1625: u_char targ_scratch;
1626: targ_scratch = inb(offset);
1627: targ_scratch &= SXFR;
1628: outb(targ_scratch, offset);
1629: offset++;
1630: }
1631:
1632: /*
1633: * Reset the bus and unpause/restart the controller
1634: */
1635:
1636: /*
1637: * Case 1: Command for another bus is active
1638: */
1639: sblkctl = inb(SBLKCTL + base);
1640: cur_channel = (sblkctl & SELBUSB) ? 'B' : 'A';
1641: if (cur_channel != channel)
1642: {
1643: #ifdef AIC7XXX_DEBUG_ABORT
1644: printk ("aic7xxx: (reset_channel) Stealthily resetting channel %c\n",
1645: channel);
1646: #endif
1647: /*
1648: * Stealthily reset the other bus without upsetting the current bus
1649: */
1650: outb(sblkctl ^ SELBUSB, SBLKCTL + base);
1651: aic7xxx_reset_current_bus(base);
1652: outb(sblkctl, SBLKCTL + base);
1653:
1654: UNPAUSE_SEQUENCER(p);
1655: }
1656: /*
1657: * Case 2: A command from this bus is active or we're idle
1658: */
1659: else
1660: {
1661: #ifdef AIC7XXX_DEBUG_ABORT
1662: printk ("aic7xxx: (reset_channel) Resetting current channel %c\n",
1663: channel);
1664: #endif
1665: aic7xxx_reset_current_bus(base);
1666: RESTART_SEQUENCER(p);
1667: }
1668:
1669: return found;
1670: }
1671:
1672: /*+F*************************************************************************
1673: * Function:
1674: * aic7xxx_isr
1675: *
1676: * Description:
1677: * SCSI controller interrupt handler.
1678: *
1679: * NOTE: Since we declared this using SA_INTERRUPT, interrupts should
1680: * be disabled all through this function unless we say otherwise.
1681: *-F*************************************************************************/
1682: static void
1683: aic7xxx_isr(int irq, struct pt_regs * regs)
1684: {
1685: int base, intstat;
1686: struct aic7xxx_host *p;
1687: struct aic7xxx_scb *scb;
1688: unsigned char ha_flags;
1689: short transfer;
1690: unsigned char scsi_id, bus_width;
1691: unsigned char offset, rate, scratch, scratch_offset;
1692: unsigned char max_offset, rej_byte;
1693: unsigned short target_mask;
1694: char channel;
1695: void *addr;
1696: int actual;
1697: int scb_index;
1698: Scsi_Cmnd *cmd;
1699:
1700: p = (struct aic7xxx_host *) aic7xxx_boards[irq]->hostdata;
1701:
1702: /*
1703: * Search for the host with a pending interrupt. If we can't find
1704: * one, then we've encountered a spurious interrupt.
1705: */
1706: while ((p != NULL) && !(inb(INTSTAT + p->base) & INT_PEND))
1707: {
1708: if (p->next == NULL)
1709: {
1710: p = NULL;
1711: }
1712: else
1713: {
1714: p = (struct aic7xxx_host *) p->next->hostdata;
1715: }
1716: }
1717:
1718: if (p == NULL)
1719: {
1720: if (aic7xxx_spurious_count == 1)
1721: {
1722: aic7xxx_spurious_count = 2;
1723: printk("aic7xxx: (aic7xxx_isr) Encountered spurious interrupt.\n");
1724: return;
1725: }
1726: else
1727: {
1728: /*
1729: * The best we can do is to set p back to head of list and process
1730: * the erroneous interrupt - most likely a BRKADRINT.
1731: */
1732: p = (struct aic7xxx_host *) aic7xxx_boards[irq]->hostdata;
1733: }
1734: }
1735:
1736: /*
1737: * Keep track of interrupts for /proc/scsi
1738: */
1739: p->isr_count++;
1740:
1741: if (!p->a_scanned && (p->isr_count == 1))
1742: {
1743: /*
1744: * We must only have one card at this IRQ and it must have been
1745: * added to the board data before the spurious interrupt occurred.
1746: * It is sufficient that we check isr_count and not the spurious
1747: * interrupt count.
1748: */
1749: printk("aic7xxx: (aic7xxx_isr) Encountered spurious interrupt.\n");
1750: return;
1751: }
1752:
1753: base = p->base;
1754: /*
1755: * Handle all the interrupt sources - especially for SCSI
1756: * interrupts, we won't get a second chance at them.
1757: */
1758: intstat = inb(INTSTAT + base);
1759:
1760: if (intstat & BRKADRINT)
1761: {
1762: int i;
1763: unsigned char errno = inb(ERROR + base);
1764:
1765: printk("aic7xxx: (aic7xxx_isr) BRKADRINT error(0x%x):\n", errno);
1766: for (i = 0; i < NUMBER(hard_error); i++)
1767: {
1768: if (errno & hard_error[i].errno)
1769: {
1770: printk(" %s\n", hard_error[i].errmesg);
1771: }
1772: }
1773:
1774: panic("aic7xxx: (aic7xxx_isr) BRKADRINT, error(0x%x) seqaddr(0x%x).\n",
1775: inb(ERROR + base), (inb(SEQADDR1 + base) << 8) | inb(SEQADDR0 + base));
1776: }
1777:
1778: if (intstat & SEQINT)
1779: {
1780: /*
1781: * Although the sequencer is paused immediately on
1782: * a SEQINT, an interrupt for a SCSIINT condition will
1783: * unpaused the sequencer before this point.
1784: */
1785: PAUSE_SEQUENCER(p);
1786:
1787: scsi_id = (inb(SCSIID + base) >> 4) & 0x0F;
1788: scratch_offset = scsi_id;
1789: channel = 'A';
1790: if (inb(SBLKCTL + base) & SELBUSB)
1791: {
1792: channel = 'B';
1793: scratch_offset += 8;
1794: }
1795: target_mask = (0x01 << scratch_offset);
1796:
1797: switch (intstat & SEQINT_MASK)
1798: {
1799: case BAD_PHASE:
1800: panic("aic7xxx: (aic7xxx_isr) Unknown scsi bus phase.\n");
1801: break;
1802:
1803: case SEND_REJECT:
1804: rej_byte = inb(REJBYTE + base);
1805: if ((rej_byte & 0xF0) == 0x20)
1806: {
1807: scb_index = inb(SCBPTR + base);
1808: scb = &(p->scb_array[scb_index]);
1809: printk("aic7xxx: Warning - Tagged message received without identify."
1810: "Disabling tagged commands for target %d channel %c.\n",
1811: scsi_id, channel);
1812: scb->cmd->device->tagged_supported = 0;
1813: scb->cmd->device->tagged_queue = 0;
1814: }
1815: else
1816: {
1817: debug("aic7xxx: Warning - Rejecting unknown message (0x%x) received "
1818: "from target %d channel %c.\n", rej_byte, scsi_id, channel);
1819: }
1820: break;
1821:
1822: case NO_IDENT:
1823: panic("aic7xxx: Target %d, channel %c, did not send an IDENTIFY "
1824: "message. SAVED_TCL(0x%x).\n",
1825: scsi_id, channel, inb(SAVED_TCL + base));
1826: break;
1827:
1828: case NO_MATCH:
1829: printk("aic7xxx: No active SCB for reconnecting target %d, "
1830: "channel %c - Issuing ABORT. SAVED_TCL(0x%x).\n",
1831: scsi_id, channel, inb(SAVED_TCL + base));
1832: aic7xxx_unbusy_target(scsi_id, channel, base);
1833: outb(0, SCBARRAY + base);
1834: outb(CLRSELTIMEO, CLRSINT1 + base);
1835: RESTART_SEQUENCER(p);
1836: break;
1837:
1838: case SDTR_MSG:
1839: /*
1840: * Help the sequencer to translate the negotiated
1841: * transfer rate. Transfer is 1/4 the period
1842: * in ns as is returned by the sync negotiation
1843: * message. So, we must multiply by four.
1844: */
1845: transfer = (inb(ARG_1 + base) << 2);
1846: offset = inb(ACCUM + base);
1847: scratch = inb(TARG_SCRATCH + base + scratch_offset);
1848: /*
1849: * The maximum offset for a wide device is 0x08; for a
1850: * 8-bit bus device the maximum offset is 0x0F.
1851: */
1852: if (scratch & WIDEXFER)
1853: {
1854: max_offset = 0x08;
1855: }
1856: else
1857: {
1858: max_offset = 0x0F;
1859: }
1860: aic7xxx_scsirate(p, &rate, transfer, MIN(offset, max_offset),
1861: scsi_id, channel);
1862: /*
1863: * Preserve the wide transfer flag.
1864: */
1865: scratch = rate | (scratch & WIDEXFER);
1866: outb(scratch, TARG_SCRATCH + base + scratch_offset);
1867: outb(scratch, SCSIRATE + base);
1868: if ((scratch & 0x0F) == 0)
1869: { /*
1870: * The requested rate was so low that asynchronous transfers
1871: * are faster (not to mention the controller won't support
1872: * them), so we issue a reject to ensure we go to asynchronous
1873: * transfers.
1874: */
1875: outb(SEND_REJ, RETURN_1 + base);
1876: }
1877: else
1878: {
1879: /*
1880: * See if we initiated Sync Negotiation
1881: */
1882: if (p->sdtr_pending & target_mask)
1883: {
1884: /*
1885: * Don't send an SDTR back to the target.
1886: */
1887: outb(0, RETURN_1 + base);
1888: }
1889: else
1890: {
1891: /*
1892: * Send our own SDTR in reply.
1893: */
1894: printk("aic7xxx: Sending SDTR!!\n");
1895: outb(SEND_SDTR, RETURN_1 + base);
1896: }
1897: }
1898: /*
1899: * Clear the flags.
1900: */
1901: p->needsdtr &= ~target_mask;
1902: p->sdtr_pending &= ~target_mask;
1903: break;
1904:
1905: case WDTR_MSG:
1906: {
1907: bus_width = inb(ARG_1 + base);
1908: printk("aic7xxx: Received MSG_WDTR, Target %d, channel %c "
1909: "needwdtr(0x%x).\n", scsi_id, channel, p->needwdtr);
1910: scratch = inb(TARG_SCRATCH + base + scratch_offset);
1911:
1912: if (p->wdtr_pending & target_mask)
1913: {
1914: /*
1915: * Don't send an WDTR back to the target, since we asked first.
1916: */
1917: outb(0, RETURN_1 + base);
1918: switch (bus_width)
1919: {
1920: case BUS_8_BIT:
1921: scratch &= 0x7F;
1922: break;
1923:
1924: case BUS_16_BIT:
1925: printk("aic7xxx: Target %d, channel %c, using 16 bit "
1926: "transfers.\n", scsi_id, channel);
1927: scratch |= 0x80;
1928: break;
1929:
1930: case BUS_32_BIT:
1931: outb(SEND_REJ, RETURN_1 + base);
1932: printk("aic7xxx: Target %d, channel %c, requesting 32 bit "
1933: "transfers, rejecting...\n", scsi_id, channel);
1934: break;
1935: }
1936: }
1937: else
1938: {
1939: /*
1940: * Send our own WDTR in reply.
1941: */
1942: printk("aic7xxx: Will send WDTR!!\n");
1943: switch (bus_width)
1944: {
1945: case BUS_8_BIT:
1946: scratch &= 0x7F;
1947: break;
1948:
1949: case BUS_32_BIT:
1950: /*
1951: * Negotiate 16 bits.
1952: */
1953: bus_width = BUS_16_BIT;
1954: /* Yes, we mean to fall thru here. */
1955:
1956: case BUS_16_BIT:
1957: printk("aic7xxx: Target %d, channel %c, using 16 bit "
1958: "transfers.\n", scsi_id, channel);
1959: scratch |= 0x80;
1960: break;
1961: }
1962: outb(bus_width | SEND_WDTR, RETURN_1 + base);
1963: }
1964: p->needwdtr &= ~target_mask;
1965: p->wdtr_pending &= ~target_mask;
1966: outb(scratch, TARG_SCRATCH + base + scratch_offset);
1967: outb(scratch, SCSIRATE + base);
1968: break;
1969: }
1970:
1971: case REJECT_MSG:
1972: {
1973: /*
1974: * What we care about here is if we had an
1975: * outstanding SDTR or WDTR message for this
1976: * target. If we did, this is a signal that
1977: * the target is refusing negotiation.
1978: */
1979:
1980: scratch = inb(TARG_SCRATCH + base + scratch_offset);
1981:
1982: if (p->wdtr_pending & target_mask)
1983: {
1984: /*
1985: * note 8bit xfers and clear flag
1986: */
1987: scratch &= 0x7F;
1988: p->needwdtr &= ~target_mask;
1989: p->wdtr_pending &= ~target_mask;
1990: printk("aic7xxx: Target %d, channel %c, refusing WIDE negotiation. "
1991: "Using 8 bit transfers.\n", scsi_id, channel);
1992: }
1993: else
1994: {
1995: if (p->sdtr_pending & target_mask)
1996: {
1997: /*
1998: * note asynch xfers and clear flag
1999: */
2000: scratch &= 0xF0;
2001: p->needsdtr &= ~target_mask;
2002: p->sdtr_pending &= ~target_mask;
2003: printk("aic7xxx: Target %d, channel %c, refusing synchronous "
2004: "negotiation. Using asynchronous transfers.\n",
2005: scsi_id, channel);
2006: }
2007: /*
2008: * Otherwise, we ignore it.
2009: */
2010: }
2011: outb(scratch, TARG_SCRATCH + base + scratch_offset);
2012: outb(scratch, SCSIRATE + base);
2013: break;
2014: }
2015:
2016: case BAD_STATUS:
2017: scb_index = inb(SCBPTR + base);
2018: scb = &(p->scb_array[scb_index]);
2019: outb(0, RETURN_1 + base); /* CHECK_CONDITION may change this */
2020: if (!(scb->state & SCB_ACTIVE) || (scb->cmd == NULL))
2021: {
2022: printk("aic7xxx: Referenced SCB not valid during SEQINT(0x%x) "
2023: "scb(%d) state(0x%x) cmd(0x%x).\n",
2024: intstat, scb_index, scb->state, (unsigned int) scb->cmd);
2025: }
2026: else
2027: {
2028: cmd = scb->cmd;
2029: aic7xxx_getscb(p, scb);
2030: aic7xxx_status(cmd) = scb->target_status;
2031:
2032: cmd->result |= scb->target_status;
2033:
2034: switch (status_byte(scb->target_status))
2035: {
2036: case GOOD:
2037: printk("aic7xxx: Interrupted for status of GOOD???\n");
2038: break;
2039:
2040: case CHECK_CONDITION:
2041: if ((aic7xxx_error(cmd) == 0) && !(cmd->flags & WAS_SENSE))
2042: {
2043: unsigned char tcl;
2044: unsigned char control;
2045: void *req_buf;
2046:
2047: tcl = scb->target_channel_lun;
2048:
2049: /*
2050: * Send a sense command to the requesting target.
2051: */
2052: cmd->flags |= WAS_SENSE;
2053: memcpy((void *) scb->sense_cmd, (void *) generic_sense,
2054: sizeof(generic_sense));
2055:
2056: scb->sense_cmd[1] = (cmd->lun << 5);
2057: scb->sense_cmd[4] = sizeof(cmd->sense_buffer);
2058:
2059: scb->sense_sg.address = (char *) &cmd->sense_buffer;
2060: scb->sense_sg.length = sizeof(cmd->sense_buffer);
2061: req_buf = &scb->sense_sg;
2062: cmd->cmd_len = COMMAND_SIZE(cmd->cmnd[0]);
2063: control = scb->control;
2064:
2065: memset(scb, 0, SCB_PIO_TRANSFER_SIZE);
2066: scb->control = control & DISCENB;
2067: scb->target_channel_lun = tcl;
2068: addr = scb->sense_cmd;
2069: scb->SCSI_cmd_length = COMMAND_SIZE(scb->sense_cmd[0]);
2070: memcpy(scb->SCSI_cmd_pointer, &addr,
2071: sizeof(scb->SCSI_cmd_pointer));
2072: scb->SG_segment_count = 1;
2073: memcpy(scb->SG_list_pointer, &req_buf,
2074: sizeof(scb->SG_list_pointer));
2075: scb->data_count = scb->sense_sg.length;
2076: memcpy(scb->data_pointer, &(scb->sense_sg.address), 4);
2077:
2078: aic7xxx_putscb(p, scb);
2079: outb(SCB_LIST_NULL, SCB_NEXT_WAITING + base);
2080: /*
2081: * Ensure that the target is "BUSY" so we don't get overlapping
2082: * commands if we happen to be doing tagged I/O.
2083: */
2084: aic7xxx_busy_target(scsi_id, channel, base);
2085:
2086: aic7xxx_add_waiting_scb(base, scb, LIST_HEAD);
2087: outb(SEND_SENSE, RETURN_1 + base);
2088: } /* first time sense, no errors */
2089:
2090: cmd->flags &= ~ASKED_FOR_SENSE;
2091: if (aic7xxx_error(cmd) == 0)
2092: {
2093: aic7xxx_error(cmd) = DID_RETRY_COMMAND;
2094: }
2095: break;
2096:
2097: case BUSY:
2098: printk("aic7xxx: Target busy.\n");
2099: if (!aic7xxx_error(cmd))
2100: {
2101: aic7xxx_error(cmd) = DID_BUS_BUSY;
2102: }
2103: break;
2104:
2105: case QUEUE_FULL:
2106: printk("aic7xxx: Queue full.\n");
2107: if (!aic7xxx_error(cmd))
2108: {
2109: aic7xxx_error(cmd) = DID_RETRY_COMMAND;
2110: }
2111: break;
2112:
2113: default:
2114: printk("aic7xxx: Unexpected target status(0x%x).\n",
2115: scb->target_status);
2116: if (!aic7xxx_error(cmd))
2117: {
2118: aic7xxx_error(cmd) = DID_RETRY_COMMAND;
2119: }
2120: break;
2121: } /* end switch */
2122: } /* end else of */
2123: break;
2124:
2125: case RESIDUAL:
2126: scb_index = inb(SCBPTR + base);
2127: scb = &(p->scb_array[scb_index]);
2128: if (!(scb->state & SCB_ACTIVE) || (scb->cmd == NULL))
2129: {
2130: printk("aic7xxx: Referenced SCB not valid during SEQINT(0x%x) "
2131: "scb(%d) state(0x%x) cmd(0x%x).\n",
2132: intstat, scb_index, scb->state, (unsigned int) scb->cmd);
2133: }
2134: else
2135: {
2136: cmd = scb->cmd;
2137: /*
2138: * Don't destroy valid residual information with
2139: * residual coming from a check sense operation.
2140: */
2141: if (!(cmd->flags & WAS_SENSE))
2142: {
2143: /*
2144: * We had an underflow. At this time, there's only
2145: * one other driver that bothers to check for this,
2146: * and cmd->underflow seems to be set rather half-
2147: * heartedly in the higher-level SCSI code.
2148: */
2149: actual = aic7xxx_length(cmd, scb->residual_SG_segment_count);
2150:
2151: actual -= (inb(SCB_RESID_DCNT2 + base) << 16) |
2152: (inb(SCB_RESID_DCNT1 + base) << 8) |
2153: inb(SCB_RESID_DCNT0 + base);
2154:
2155: if (actual < cmd->underflow)
2156: {
2157: printk("aic7xxx: Target %d underflow - "
2158: "Wanted (at least) (%u) got(%u) count(%d).\n",
2159: cmd->target, cmd->underflow, actual,
2160: inb(SCB_RESID_SGCNT + base));
2161: aic7xxx_error(cmd) = DID_RETRY_COMMAND;
2162: aic7xxx_status(cmd) = scb->target_status;
2163: }
2164: }
2165: }
2166: break;
2167:
2168: case ABORT_TAG:
2169: scb_index = inb(SCBPTR + base);
2170: scb = &(p->scb_array[scb_index]);
2171: if (!(scb->state & SCB_ACTIVE) || (scb->cmd == NULL))
2172: {
2173: printk("aic7xxx: Referenced SCB not valid during SEQINT(0x%x) "
2174: "scb(%d) state(0x%x) cmd(0x%x)\n",
2175: intstat, scb_index, scb->state, (unsigned int) scb->cmd);
2176: }
2177: else
2178: {
2179: cmd = scb->cmd;
2180: /*
2181: * We didn't receive a valid tag back from the target
2182: * on a reconnect.
2183: */
2184: printk("aic7xxx: Invalid tag received on target %d, channel %c, "
2185: "lun %d - Sending ABORT_TAG.\n",
2186: scsi_id, channel, cmd->lun & 0x07);
2187:
2188: cmd->result = (DID_RETRY_COMMAND << 16);
2189: aic7xxx_done(p, scb);
2190: }
2191: break;
2192:
2193: case AWAITING_MSG:
2194: scb_index = inb(SCBPTR + base);
2195: scb = &(p->scb_array[scb_index]);
2196: if (!(scb->state & SCB_ACTIVE) || (scb->cmd == NULL))
2197: {
2198: printk("aic7xxx: Referenced SCB not valid during SEQINT(0x%x) "
2199: "scb(%d) state(0x%x) cmd(0x%x).\n",
2200: intstat, scb_index, scb->state, (unsigned int) scb->cmd);
2201: }
2202: else
2203: {
2204: /*
2205: * This SCB had a zero length command, informing the sequencer
2206: * that we wanted to send a special message to this target.
2207: * We only do this for BUS_DEVICE_RESET messages currently.
2208: */
2209: if (scb->state & SCB_DEVICE_RESET)
2210: {
2211: #ifdef AIC7XXX_DEBUG_ABORT
2212: printk ("aic7xxx: (isr) sending bus device reset to target %d\n",
2213: scsi_id);
2214: #endif
2215: outb(MSG_BUS_DEVICE_RESET, MSG0 + base);
2216: outb(1, MSG_LEN + base);
2217: }
2218: else
2219: {
2220: panic("aic7xxx: AWAITING_SCB for an SCB that does "
2221: "not have a waiting message.\n");
2222: }
2223: }
2224: break;
2225:
2226: case IMMEDDONE:
2227: scb_index = inb(SCBPTR + base);
2228: scb = &(p->scb_array[scb_index]);
2229: #ifdef AIC7XXX_DEBUG_ABORT
2230: printk ("aic7xxx: (isr) received IMMEDDONE for target %d, scb %d, state %d\n",
2231: scsi_id, scb_index, scb->state);
2232: #endif
2233: if (scb->state & SCB_DEVICE_RESET)
2234: {
2235: int found;
2236:
2237: /*
2238: * Go back to async/narrow transfers and renogiate.
2239: */
2240: aic7xxx_unbusy_target(scsi_id, channel, base);
2241: p->needsdtr |= (p->needsdtr_copy & target_mask);
2242: p->needwdtr |= (p->needwdtr_copy & target_mask);
2243: p->sdtr_pending &= ~target_mask;
2244: p->wdtr_pending &= ~target_mask;
2245: scratch = inb(TARG_SCRATCH + base + scratch_offset);
2246: scratch &= SXFR;
2247: outb(scratch, TARG_SCRATCH + base + scratch_offset);
2248: found = aic7xxx_reset_device(p, (int) scsi_id, channel, SCB_LIST_NULL);
2249: }
2250: else
2251: {
2252: panic("aic7xxx: Immediate complete for unknown operation.\n");
2253: }
2254: break;
2255:
2256: #if AIC7XXX_NOT_YET
2257: /* XXX Fill these in later */
2258: case MESG_BUFFER_BUSY:
2259: break;
2260: case MSGIN_PHASEMIS:
2261: break;
2262: #endif
2263:
2264: case PARITY_ERROR:
2265: {
2266: scb_index = inb(SCBPTR + base);
2267: scb = &(p->scb_array[scb_index]);
2268: if (!(scb->state & SCB_ACTIVE) || (scb->cmd == NULL))
2269: {
2270: printk("aic7xxx: Referenced SCB not valid during SEQINT(0x%x) "
2271: "scb(%d) state(0x%x) cmd(0x%x).\n",
2272: intstat, scb_index, scb->state, (unsigned int) scb->cmd);
2273: }
2274: else
2275: {
2276: char *phase;
2277: unsigned char mesg_out = MSG_NOP;
2278: unsigned char lastphase = inb(LASTPHASE + base);
2279:
2280: cmd = scb->cmd;
2281: switch (lastphase)
2282: {
2283: case P_DATAOUT:
2284: phase = "Data-Out";
2285: break;
2286: case P_DATAIN:
2287: phase = "Data-In";
2288: mesg_out = MSG_INITIATOR_DET_ERROR;
2289: break;
2290: case P_COMMAND:
2291: phase = "Command";
2292: break;
2293: case P_MESGOUT:
2294: phase = "Message-Out";
2295: break;
2296: case P_STATUS:
2297: phase = "Status";
2298: mesg_out = MSG_INITIATOR_DET_ERROR;
2299: break;
2300: case P_MESGIN:
2301: phase = "Message-In";
2302: mesg_out = MSG_MSG_PARITY_ERROR;
2303: break;
2304: default:
2305: phase = "unknown";
2306: break;
2307: }
2308:
2309: /*
2310: * A parity error has occurred during a data
2311: * transfer phase. Flag it and continue.
2312: */
2313: printk("aic7xxx: Parity error during phase %s on target %d, "
2314: "channel %d, lun %d.\n", phase,
2315: cmd->target, cmd->channel & 0x01, cmd->lun & 0x07);
2316:
2317: /*
2318: * We've set the hardware to assert ATN if we get a parity
2319: * error on "in" phases, so all we need to do is stuff the
2320: * message buffer with the appropriate message. In phases
2321: * have set mesg_out to something other than MSG_NOP.
2322: */
2323: if (mesg_out != MSG_NOP)
2324: {
2325: outb(mesg_out, MSG0 + base);
2326: outb(1, MSG_LEN + base);
2327: aic7xxx_error(cmd) = DID_PARITY;
2328: }
2329: else
2330: {
2331: /*
2332: * Should we allow the target to make this decision for us?
2333: */
2334: aic7xxx_error(cmd) = DID_RETRY_COMMAND;
2335: }
2336: }
2337: break;
2338: }
2339: default: /* unknown */
2340: debug("aic7xxx: SEQINT, INTSTAT(0x%x) SCSISIGI(0x%x).\n",
2341: intstat, inb(SCSISIGI + base));
2342: break;
2343: }
2344:
2345: outb(CLRSEQINT, CLRINT + base);
2346: UNPAUSE_SEQUENCER(p);
2347: }
2348:
2349: if (intstat & SCSIINT)
2350: {
2351: int status = inb(SSTAT1 + base);
2352: scsi_id = (inb(SCSIID + base) >> 4) & 0x0F;
2353: channel = 'A';
2354: if (inb(SBLKCTL + base) & SELBUSB)
2355: {
2356: channel = 'B';
2357: }
2358:
2359: scb_index = inb(SCBPTR + base);
2360: scb = &(p->scb_array[scb_index]);
2361: if (!(scb->state & SCB_ACTIVE) || (scb->cmd == NULL))
2362: {
2363: printk("aic7xxx: No command for SCB (SCSIINT).\n");
2364: /*
2365: * Turn off the interrupt and set status
2366: * to zero, so that it falls through the
2367: * reset of the SCSIINT code.
2368: */
2369: outb(status, CLRSINT1 + base);
2370: UNPAUSE_SEQUENCER(p);
2371: outb(CLRSCSIINT, CLRINT + base);
2372: scb = NULL;
2373: }
2374: else
2375: {
2376: cmd = scb->cmd;
2377:
2378: /*
2379: * Only the SCSI Status 1 register has information
2380: * about exceptional conditions that we'd have a
2381: * SCSIINT about; anything in SSTAT0 will be handled
2382: * by the sequencer. Note that there can be multiple
2383: * bits set.
2384: */
2385: if (status & SELTO)
2386: {
2387: unsigned char waiting;
2388:
2389: /*
2390: * Hardware selection timer has expired. Turn
2391: * off SCSI selection sequence.
2392: */
2393: outb(ENRSELI, SCSISEQ + base);
2394: cmd->result = (DID_TIME_OUT << 16);
2395: /*
2396: * Clear an pending messages for the timed out
2397: * target and mark the target as free.
2398: */
2399: ha_flags = inb(FLAGS + base);
2400: outb(0, MSG_LEN + base);
2401: aic7xxx_unbusy_target(scsi_id, channel, base);
2402:
2403: outb(0, SCBARRAY + base);
2404:
2405: /*
2406: * Shut off the offending interrupt sources, reset
2407: * the sequencer address to zero and unpause it,
2408: * then call the high-level SCSI completion routine.
2409: *
2410: * WARNING! This is a magic sequence! After many
2411: * hours of guesswork, turning off the SCSI interrupts
2412: * in CLRSINT? does NOT clear the SCSIINT bit in
2413: * INTSTAT. By writing to the (undocumented, unused
2414: * according to the AIC-7770 manual) third bit of
2415: * CLRINT, you can clear INTSTAT. But, if you do it
2416: * while the sequencer is paused, you get a BRKADRINT
2417: * with an Illegal Host Address status, so the
2418: * sequencer has to be restarted first.
2419: */
2420: outb(CLRSELTIMEO, CLRSINT1 + base);
2421:
2422: outb(CLRSCSIINT, CLRINT + base);
2423:
2424: /*
2425: * Shift the waiting for selection queue forward
2426: */
2427: waiting = inb(WAITING_SCBH + base);
2428: outb(waiting, SCBPTR + base);
2429: waiting = inb(SCB_NEXT_WAITING + base);
2430: outb(waiting, WAITING_SCBH + base);
2431:
2432: RESTART_SEQUENCER(p);
2433: aic7xxx_done(p, scb);
2434: #if 0
2435: printk("aic7xxx: SELTO SCB(%d) state(0x%x) cmd(0x%x).\n",
2436: scb->position, scb->state, (unsigned int) scb->cmd);
2437: #endif
2438: }
2439: else
2440: {
2441: if (!(status & BUSFREE))
2442: {
2443: /*
2444: * We don't know what's going on. Turn off the
2445: * interrupt source and try to continue.
2446: */
2447: printk("aic7xxx: SSTAT1(0x%x).\n", status);
2448: outb(status, CLRSINT1 + base);
2449: UNPAUSE_SEQUENCER(p);
2450: outb(CLRSCSIINT, CLRINT + base);
2451: }
2452: }
2453: } /* else */
2454: }
2455:
2456: if (intstat & CMDCMPLT)
2457: {
2458: int complete;
2459:
2460: /*
2461: * The sequencer will continue running when it
2462: * issues this interrupt. There may be >1 commands
2463: * finished, so loop until we've processed them all.
2464: */
2465: do {
2466: complete = inb(QOUTFIFO + base);
2467:
2468: scb = &(p->scb_array[complete]);
2469: if (!(scb->state & SCB_ACTIVE) || (scb->cmd == NULL))
2470: {
2471: printk("aic7xxx: Warning - No command for SCB %d (CMDCMPLT).\n"
2472: " QOUTCNT(%d) SCB state(0x%x) cmd(0x%x) pos(%d).\n",
2473: complete, inb(QOUTFIFO + base),
2474: scb->state, (unsigned int) scb->cmd, scb->position);
2475: outb(CLRCMDINT, CLRINT + base);
2476: continue;
2477: }
2478: cmd = scb->cmd;
2479:
2480: if ((cmd->flags & WAS_SENSE) && !(cmd->flags & ASKED_FOR_SENSE))
2481: {
2482: /*
2483: * Got sense information.
2484: */
2485: cmd->flags &= ASKED_FOR_SENSE;
2486: }
2487: #if 0
2488: printk("aic7xxx: (complete) State(%d) cmd(0x%x) free(0x%x).\n",
2489: scb->state, (unsigned int) scb->cmd, (unsigned int) p->free_scb);
2490: #endif
2491:
2492: /*
2493: * Clear interrupt status before checking
2494: * the output queue again. This eliminates
2495: * a race condition whereby a command could
2496: * complete between the queue poll and the
2497: * interrupt clearing, so notification of the
2498: * command being complete never made it back
2499: * up to the kernel.
2500: */
2501: outb(CLRCMDINT, CLRINT + base);
2502: aic7xxx_done(p, scb);
2503: #if 0
2504: if (scb != &p->scb_array[scb->position])
2505: {
2506: printk("aic7xxx: (complete) Address mismatch, pos(%d).\n", scb->position);
2507: }
2508: printk("aic7xxx: (complete) State(%d) cmd(0x%x) free(0x%x).\n",
2509: scb->state, (unsigned int) scb->cmd, (unsigned int) p->free_scb);
2510: #endif
2511:
2512: #ifdef AIC7XXX_PROC_STATS
2513: /*
2514: * XXX: we should actually know how much actually transferred
2515: * XXX: for each command, but apparently that's too difficult.
2516: */
2517: actual = aic7xxx_length(cmd, 0);
2518: if (!(cmd->flags & WAS_SENSE) && (actual > 0))
2519: {
2520: struct aic7xxx_xferstats *sp;
2521: long *ptr;
2522: int x;
2523:
2524: sp = &p->stats[cmd->channel & 0x01][cmd->target & 0x0F][cmd->lun & 0x07];
2525: sp->xfers++;
2526:
2527: if (cmd->request.cmd == WRITE)
2528: {
2529: sp->w_total++;
2530: sp->w_total512 += (actual >> 9);
2531: ptr = sp->w_bins;
2532: }
2533: else
2534: {
2535: sp->r_total++;
2536: sp->r_total512 += (actual >> 9);
2537: ptr = sp->r_bins;
2538: }
2539: for (x = 9; x <= 17; x++)
2540: {
2541: if (actual < (1 << x))
2542: {
2543: ptr[x - 9]++;
2544: break;
2545: }
2546: }
2547: if (x > 17)
2548: {
2549: ptr[x - 9]++;
2550: }
2551: }
2552: #endif /* AIC7XXX_PROC_STATS */
2553:
2554: } while (inb(QOUTCNT + base));
2555: }
2556: }
2557:
2558: /*+F*************************************************************************
2559: * Function:
2560: * aic7xxx_probe
2561: *
2562: * Description:
2563: * Probing for EISA boards: it looks like the first two bytes
2564: * are a manufacturer code - three characters, five bits each:
2565: *
2566: * BYTE 0 BYTE 1 BYTE 2 BYTE 3
2567: * ?1111122 22233333 PPPPPPPP RRRRRRRR
2568: *
2569: * The characters are baselined off ASCII '@', so add that value
2570: * to each to get the real ASCII code for it. The next two bytes
2571: * appear to be a product and revision number, probably vendor-
2572: * specific. This is what is being searched for at each port,
2573: * and what should probably correspond to the ID= field in the
2574: * ECU's .cfg file for the card - if your card is not detected,
2575: * make sure your signature is listed in the array.
2576: *
2577: * The fourth byte's lowest bit seems to be an enabled/disabled
2578: * flag (rest of the bits are reserved?).
2579: *-F*************************************************************************/
2580: static aha_type
2581: aic7xxx_probe(int slot, int base)
2582: {
2583: int i;
2584: unsigned char buf[4];
2585:
2586: static struct {
2587: int n;
2588: unsigned char signature[sizeof(buf)];
2589: aha_type type;
2590: } AIC7xxx[] = {
2591: { 4, { 0x04, 0x90, 0x77, 0x71 }, AIC_7771 }, /* host adapter 274x */
2592: { 4, { 0x04, 0x90, 0x77, 0x70 }, AIC_7770 }, /* motherboard 7770 */
2593: { 4, { 0x04, 0x90, 0x77, 0x56 }, AIC_284x }, /* 284x, BIOS enabled */
2594: { 4, { 0x04, 0x90, 0x77, 0x57 }, AIC_284x } /* 284x, BIOS disabled */
2595: };
2596:
2597: /*
2598: * The VL-bus cards need to be primed by
2599: * writing before a signature check.
2600: */
2601: for (i = 0; i < sizeof(buf); i++)
2602: {
2603: outb(0x80 + i, base);
2604: buf[i] = inb(base + i);
2605: }
2606:
2607: for (i = 0; i < NUMBER(AIC7xxx); i++)
2608: {
2609: /*
2610: * Signature match on enabled card?
2611: */
2612: if (!memcmp(buf, AIC7xxx[i].signature, AIC7xxx[i].n))
2613: {
2614: if (inb(base + 4) & 1)
2615: {
2616: return (AIC7xxx[i].type);
2617: }
2618:
2619: printk("aic7xxx: Disabled at slot %d, ignored.\n", slot);
2620: }
2621: }
2622:
2623: return (AIC_NONE);
2624: }
2625:
2626: /*+F*************************************************************************
2627: * Function:
2628: * read_2840_seeprom
2629: *
2630: * Description:
2631: * Reads the 2840 serial EEPROM and returns 1 if successful and 0 if
2632: * not successful.
2633: *
2634: * See read_seeprom (for the 2940) for the instruction set of the 93C46
2635: * chip.
2636: *
2637: * The 2840 interface to the 93C46 serial EEPROM is through the
2638: * STATUS_2840 and SEECTL_2840 registers. The CS_2840, CK_2840, and
2639: * DO_2840 bits of the SEECTL_2840 register are connected to the chip
2640: * select, clock, and data out lines respectively of the serial EEPROM.
2641: * The DI_2840 bit of the STATUS_2840 is connected to the data in line
2642: * of the serial EEPROM. The EEPROM_TF bit of STATUS_2840 register is
2643: * useful in that it gives us an 800 nsec timer. After a read from the
2644: * SEECTL_2840 register the timing flag is cleard and goes high 800 nsec
2645: * later.
2646: *
2647: *-F*************************************************************************/
2648: static int
2649: read_2840_seeprom(int base, struct seeprom_config *sc)
2650: {
2651: int i = 0, k = 0;
2652: unsigned char temp;
2653: unsigned short checksum = 0;
2654: unsigned short *seeprom = (unsigned short *) sc;
2655: struct seeprom_cmd {
2656: unsigned char len;
2657: unsigned char bits[3];
2658: };
2659: struct seeprom_cmd seeprom_read = {3, {1, 1, 0}};
2660:
2661: #define CLOCK_PULSE(p) \
2662: while ((inb(STATUS_2840 + base) & EEPROM_TF) == 0) \
2663: { \
2664: ; /* Do nothing */ \
2665: } \
2666: (void) inb(SEECTL_2840 + base);
2667:
2668: /*
2669: * Read the first 32 registers of the seeprom. For the 2840,
2670: * the 93C46 SEEPROM is a 1024-bit device with 64 16-bit registers
2671: * but only the first 32 are used by Adaptec BIOS. The loop
2672: * will range from 0 to 31.
2673: */
2674: for (k = 0; k < (sizeof(*sc) / 2); k++)
2675: {
2676: /*
2677: * Send chip select for one clock cycle.
2678: */
2679: outb(CK_2840 | CS_2840, SEECTL_2840 + base);
2680: CLOCK_PULSE(base);
2681:
2682: /*
2683: * Now we're ready to send the read command followed by the
2684: * address of the 16-bit register we want to read.
2685: */
2686: for (i = 0; i < seeprom_read.len; i++)
2687: {
2688: temp = CS_2840 | seeprom_read.bits[i];
2689: outb(temp, SEECTL_2840 + base);
2690: CLOCK_PULSE(base);
2691: temp = temp ^ CK_2840;
2692: outb(temp, SEECTL_2840 + base);
2693: CLOCK_PULSE(base);
2694: }
2695: /*
2696: * Send the 6 bit address (MSB first, LSB last).
2697: */
2698: for (i = 5; i >= 0; i--)
2699: {
2700: temp = k;
2701: temp = (temp >> i) & 1; /* Mask out all but lower bit. */
2702: temp = CS_2840 | temp;
2703: outb(temp, SEECTL_2840 + base);
2704: CLOCK_PULSE(base);
2705: temp = temp ^ CK_2840;
2706: outb(temp, SEECTL_2840 + base);
2707: CLOCK_PULSE(base);
2708: }
2709:
2710: /*
2711: * Now read the 16 bit register. An initial 0 precedes the
2712: * register contents which begins with bit 15 (MSB) and ends
2713: * with bit 0 (LSB). The initial 0 will be shifted off the
2714: * top of our word as we let the loop run from 0 to 16.
2715: */
2716: for (i = 0; i <= 16; i++)
2717: {
2718: temp = CS_2840;
2719: outb(temp, SEECTL_2840 + base);
2720: CLOCK_PULSE(base);
2721: temp = temp ^ CK_2840;
2722: seeprom[k] = (seeprom[k] << 1) | (inb(STATUS_2840 + base) & DI_2840);
2723: outb(temp, SEECTL_2840 + base);
2724: CLOCK_PULSE(base);
2725: }
2726: /*
2727: * The serial EEPROM has a checksum in the last word. Keep a
2728: * running checksum for all words read except for the last
2729: * word. We'll verify the checksum after all words have been
2730: * read.
2731: */
2732: if (k < (sizeof(*sc) / 2) - 1)
2733: {
2734: checksum = checksum + seeprom[k];
2735: }
2736:
2737: /*
2738: * Reset the chip select for the next command cycle.
2739: */
2740: outb(0, SEECTL_2840 + base);
2741: CLOCK_PULSE(base);
2742: outb(CK_2840, SEECTL_2840 + base);
2743: CLOCK_PULSE(base);
2744: outb(0, SEECTL_2840 + base);
2745: CLOCK_PULSE(base);
2746: }
2747:
2748: #if 0
2749: printk("Computed checksum 0x%x, checksum read 0x%x\n", checksum, sc->checksum);
2750: printk("Serial EEPROM:");
2751: for (k = 0; k < (sizeof(*sc) / 2); k++)
2752: {
2753: if (((k % 8) == 0) && (k != 0))
2754: {
2755: printk("\n ");
2756: }
2757: printk(" 0x%x", seeprom[k]);
2758: }
2759: printk("\n");
2760: #endif
2761:
2762: if (checksum != sc->checksum)
2763: {
2764: printk("aic7xxx: SEEPROM checksum error, ignoring SEEPROM settings.\n");
2765: return (0);
2766: }
2767:
2768: return (1);
2769: #undef CLOCK_PULSE
2770: }
2771:
2772: /*+F*************************************************************************
2773: * Function:
2774: * read_seeprom
2775: *
2776: * Description:
2777: * Reads the serial EEPROM and returns 1 if successful and 0 if
2778: * not successful.
2779: *
2780: * The instruction set of the 93C46 chip is as follows:
2781: *
2782: * Start OP
2783: * Function Bit Code Address Data Description
2784: * -------------------------------------------------------------------
2785: * READ 1 10 A5 - A0 Reads data stored in memory,
2786: * starting at specified address
2787: * EWEN 1 00 11XXXX Write enable must preceed
2788: * all programming modes
2789: * ERASE 1 11 A5 - A0 Erase register A5A4A3A2A1A0
2790: * WRITE 1 01 A5 - A0 D15 - D0 Writes register
2791: * ERAL 1 00 10XXXX Erase all registers
2792: * WRAL 1 00 01XXXX D15 - D0 Writes to all registers
2793: * EWDS 1 00 00XXXX Disables all programming
2794: * instructions
2795: * *Note: A value of X for address is a don't care condition.
2796: *
2797: * The 93C46 has a four wire interface: clock, chip select, data in, and
2798: * data out. In order to perform one of the above functions, you need
2799: * to enable the chip select for a clock period (typically a minimum of
2800: * 1 usec, with the clock high and low a minimum of 750 and 250 nsec
2801: * respectively. While the chip select remains high, you can clock in
2802: * the instructions (above) starting with the start bit, followed by the
2803: * OP code, Address, and Data (if needed). For the READ instruction, the
2804: * requested 16-bit register contents is read from the data out line but
2805: * is preceded by an initial zero (leading 0, followed by 16-bits, MSB
2806: * first). The clock cycling from low to high initiates the next data
2807: * bit to be sent from the chip.
2808: *
2809: * The 7870 interface to the 93C46 serial EEPROM is through the SEECTL
2810: * register. After successful arbitration for the memory port, the
2811: * SEECS bit of the SEECTL register is connected to the chip select.
2812: * The SEECK, SEEDO, and SEEDI are connected to the clock, data out,
2813: * and data in lines respectively. The SEERDY bit of SEECTL is useful
2814: * in that it gives us an 800 nsec timer. After a write to the SEECTL
2815: * register, the SEERDY goes high 800 nsec later. The one exception
2816: * to this is when we first request access to the memory port. The
2817: * SEERDY goes high to signify that access has been granted and, for
2818: * this case, has no implied timing.
2819: *
2820: *-F*************************************************************************/
2821: static int
2822: read_seeprom(int base, int offset, struct seeprom_config *sc)
2823: {
2824: int i = 0, k;
2825: unsigned long timeout;
2826: unsigned char temp;
2827: unsigned short checksum = 0;
2828: unsigned short *seeprom = (unsigned short *) sc;
2829: struct seeprom_cmd {
2830: unsigned char len;
2831: unsigned char bits[3];
2832: };
2833: struct seeprom_cmd seeprom_read = {3, {1, 1, 0}};
2834:
2835: #define CLOCK_PULSE(p) \
2836: while ((inb(SEECTL + base) & SEERDY) == 0) \
2837: { \
2838: ; /* Do nothing */ \
2839: }
2840:
2841: /*
2842: * Request access of the memory port. When access is
2843: * granted, SEERDY will go high. We use a 1 second
2844: * timeout which should be near 1 second more than
2845: * is needed. Reason: after the 7870 chip reset, there
2846: * should be no contention.
2847: */
2848: outb(SEEMS, SEECTL + base);
2849: timeout = jiffies + 100; /* 1 second timeout */
2850: while ((jiffies < timeout) && ((inb(SEECTL + base) & SEERDY) == 0))
2851: {
2852: ; /* Do nothing! Wait for access to be granted. */
2853: }
2854: if ((inb(SEECTL + base) & SEERDY) == 0)
2855: {
2856: outb(0, SEECTL + base);
2857: return (0);
2858: }
2859:
2860: /*
2861: * Read the first 32 registers of the seeprom. For the 7870,
2862: * the 93C46 SEEPROM is a 1024-bit device with 64 16-bit registers
2863: * but only the first 32 are used by Adaptec BIOS. The loop
2864: * will range from 0 to 31.
2865: */
2866: for (k = 0; k < (sizeof(*sc) / 2); k++)
2867: {
2868: /*
2869: * Send chip select for one clock cycle.
2870: */
2871: outb(SEEMS | SEECK | SEECS, SEECTL + base);
2872: CLOCK_PULSE(base);
2873:
2874: /*
2875: * Now we're ready to send the read command followed by the
2876: * address of the 16-bit register we want to read.
2877: */
2878: for (i = 0; i < seeprom_read.len; i++)
2879: {
2880: temp = SEEMS | SEECS | (seeprom_read.bits[i] << 1);
2881: outb(temp, SEECTL + base);
2882: CLOCK_PULSE(base);
2883: temp = temp ^ SEECK;
2884: outb(temp, SEECTL + base);
2885: CLOCK_PULSE(base);
2886: }
2887: /*
2888: * Send the 6 bit address (MSB first, LSB last).
2889: */
2890: for (i = 5; i >= 0; i--)
2891: {
2892: temp = k + offset;
2893: temp = (temp >> i) & 1; /* Mask out all but lower bit. */
2894: temp = SEEMS | SEECS | (temp << 1);
2895: outb(temp, SEECTL + base);
2896: CLOCK_PULSE(base);
2897: temp = temp ^ SEECK;
2898: outb(temp, SEECTL + base);
2899: CLOCK_PULSE(base);
2900: }
2901:
2902: /*
2903: * Now read the 16 bit register. An initial 0 precedes the
2904: * register contents which begins with bit 15 (MSB) and ends
2905: * with bit 0 (LSB). The initial 0 will be shifted off the
2906: * top of our word as we let the loop run from 0 to 16.
2907: */
2908: for (i = 0; i <= 16; i++)
2909: {
2910: temp = SEEMS | SEECS;
2911: outb(temp, SEECTL + base);
2912: CLOCK_PULSE(base);
2913: temp = temp ^ SEECK;
2914: seeprom[k] = (seeprom[k] << 1) | (inb(SEECTL + base) & SEEDI);
2915: outb(temp, SEECTL + base);
2916: CLOCK_PULSE(base);
2917: }
2918:
2919: /*
2920: * The serial EEPROM has a checksum in the last word. Keep a
2921: * running checksum for all words read except for the last
2922: * word. We'll verify the checksum after all words have been
2923: * read.
2924: */
2925: if (k < (sizeof(*sc) / 2) - 1)
2926: {
2927: checksum = checksum + seeprom[k];
2928: }
2929:
2930: /*
2931: * Reset the chip select for the next command cycle.
2932: */
2933: outb(SEEMS, SEECTL + base);
2934: CLOCK_PULSE(base);
2935: outb(SEEMS | SEECK, SEECTL + base);
2936: CLOCK_PULSE(base);
2937: outb(SEEMS, SEECTL + base);
2938: CLOCK_PULSE(base);
2939: }
2940:
2941: /*
2942: * Release access to the memory port and the serial EEPROM.
2943: */
2944: outb(0, SEECTL + base);
2945:
2946: #if 0
2947: printk("Computed checksum 0x%x, checksum read 0x%x\n", checksum, sc->checksum);
2948: printk("Serial EEPROM:");
2949: for (k = 0; k < (sizeof(*sc) / 2); k++)
2950: {
2951: if (((k % 8) == 0) && (k != 0))
2952: {
2953: printk("\n ");
2954: }
2955: printk(" 0x%x", seeprom[k]);
2956: }
2957: printk("\n");
2958: #endif
2959:
2960: if (checksum != sc->checksum)
2961: {
2962: printk("aic7xxx: SEEPROM checksum error, ignoring SEEPROM settings.\n");
2963: return (0);
2964: }
2965:
2966: return (1);
2967: #undef CLOCK_PULSE
2968: }
2969:
2970: /*+F*************************************************************************
2971: * Function:
2972: * detect_maxscb
2973: *
2974: * Description:
2975: * Return the maximum number of SCB's allowed for a given controller.
2976: *-F*************************************************************************/
2977: static int
2978: detect_maxscb(aha_type type, int base, int walk_scbs)
2979: {
2980: unsigned char sblkctl_reg, scb_byte;
2981: int maxscb = 0, i;
2982:
2983: switch (type)
2984: {
2985: case AIC_7770:
2986: case AIC_7771:
2987: case AIC_284x:
2988: /*
2989: * Check for Rev C or E boards. Rev E boards can supposedly have
2990: * more than 4 SCBs, while the Rev C boards are limited to 4 SCBs.
2991: * Until we know how to access more than 4 SCBs for the Rev E chips,
2992: * we limit them, along with the Rev C chips, to 4 SCBs.
2993: *
2994: * The Rev E boards have a read/write autoflush bit in the
2995: * SBLKCTL register, while in the Rev C boards it is read only.
2996: */
2997: sblkctl_reg = inb(SBLKCTL + base) ^ AUTOFLUSHDIS;
2998: outb(sblkctl_reg, SBLKCTL + base);
2999: if (inb(SBLKCTL + base) == sblkctl_reg)
3000: {
3001: /*
3002: * We detected a Rev E board.
3003: */
3004: printk("aic7xxx: %s Rev E and subsequent.\n", board_names[type]);
3005: outb(sblkctl_reg ^ AUTOFLUSHDIS, SBLKCTL + base);
3006: maxscb = 4;
3007: }
3008: else
3009: {
3010: printk("aic7xxx: %s Rev C and previous.\n", board_names[type]);
3011: maxscb = 4;
3012: }
3013: break;
3014:
3015: case AIC_7850:
3016: maxscb = 3;
3017: break;
3018:
3019: case AIC_7870:
3020: case AIC_7871:
3021: case AIC_7874:
3022: case AIC_7880:
3023: case AIC_7881:
3024: case AIC_7884:
3025: maxscb = 16;
3026: break;
3027:
3028: case AIC_7872:
3029: case AIC_7873:
3030: case AIC_7882:
3031: case AIC_7883:
3032: /*
3033: * Is suppose to have 255 SCBs, but we'll walk the SCBs
3034: * looking for more if external RAM is detected.
3035: */
3036: maxscb = 16;
3037: break;
3038:
3039: case AIC_NONE:
3040: /*
3041: * This should never happen... But just in case.
3042: */
3043: break;
3044: }
3045:
3046: if (walk_scbs)
3047: {
3048: /*
3049: * This adapter has external SCB memory.
3050: * Walk the SCBs to determine how many there are.
3051: */
3052: i = 0;
3053: while (i < AIC7XXX_MAXSCB)
3054: {
3055: outb(i, SCBPTR + base);
3056: scb_byte = ~(inb(SCBARRAY + base)); /* complement the byte */
3057: outb(scb_byte, SCBARRAY + base); /* write it back out */
3058: if (inb(SCBARRAY + base) != scb_byte)
3059: {
3060: break;
3061: }
3062: i++;
3063: }
3064: maxscb = i;
3065:
3066: printk("aic7xxx: Using %d SCB's after checking for SCB memory.\n", maxscb);
3067: }
3068: else
3069: {
3070: printk("aic7xxx: Using %d SCB's; No SCB memory check.\n", maxscb);
3071: }
3072:
3073: return (maxscb);
3074: }
3075:
3076: /*+F*************************************************************************
3077: * Function:
3078: * aic7xxx_register
3079: *
3080: * Description:
3081: * Register a Adaptec aic7xxx chip SCSI controller with the kernel.
3082: *-F*************************************************************************/
3083: static int
3084: aic7xxx_register(Scsi_Host_Template *template,
3085: struct aic7xxx_host_config *config)
3086: {
3087: int i;
3088: unsigned char sblkctl;
3089: int max_targets;
3090: int found = 1, base;
3091: int bios_disabled = FALSE;
3092: unsigned char target_settings;
3093: unsigned char scsi_conf, host_conf;
3094: int have_seeprom = FALSE;
3095: struct Scsi_Host *host;
3096: struct aic7xxx_host *p;
3097: struct seeprom_config sc;
3098:
3099: base = config->base;
3100:
3101: /*
3102: * Lock out other contenders for our i/o space.
3103: */
3104: request_region(MINREG + base, MAXREG - MINREG, "aic7xxx");
3105:
3106: switch (config->type)
3107: {
3108: case AIC_7770:
3109: case AIC_7771:
3110: /*
3111: * For some 274x boards, we must clear the CHIPRST bit
3112: * and pause the sequencer. For some reason, this makes
3113: * the driver work. For 284x boards, we give it a
3114: * CHIPRST just like the 294x boards.
3115: *
3116: * Use the BIOS settings to determine the interrupt
3117: * trigger type (level or edge) and use this value
3118: * for pausing and unpausing the sequencer.
3119: */
3120: config->unpause = (inb(HCNTRL + base) & IRQMS) | INTEN;
3121: config->pause = config->unpause | PAUSE;
3122: config->extended = aic7xxx_extended;
3123:
3124: outb(config->pause | CHIPRST, HCNTRL + base);
3125: aic7xxx_delay(1);
3126: if (inb(HCNTRL + base) & CHIPRST)
3127: {
3128: printk("aic7xxx: Chip reset not cleared; clearing manually.\n");
3129: }
3130: outb(config->pause, HCNTRL + base);
3131:
3132: /*
3133: * Just to be on the safe side with the 274x, we will re-read the irq
3134: * since there was some issue about resetting the board.
3135: */
3136: config->irq = inb(INTDEF + base) & 0x0F;
3137: if ((inb(HA_274_BIOSCTRL + base) & BIOSMODE) == BIOSDISABLED)
3138: {
3139: bios_disabled = TRUE;
3140: }
3141: host_conf = inb(HOSTCONF + base);
3142: config->busrtime = host_conf & 0x3C;
3143: /* XXX Is this valid for motherboard based controllers? */
3144: /* Setup the FIFO threshold and the bus off time */
3145: outb(host_conf & DFTHRSH, BUSSPD + base);
3146: outb((host_conf << 2) & BOFF, BUSTIME + base);
3147:
3148: /*
3149: * A reminder until this can be detected automatically.
3150: */
3151: printk("aic7xxx: Extended translation %sabled.\n",
3152: config->extended ? "en" : "dis");
3153: break;
3154:
3155: case AIC_284x:
3156: outb(CHIPRST, HCNTRL + base);
3157: config->unpause = UNPAUSE_284X;
3158: config->pause = REQ_PAUSE; /* DWG would like to be like the rest */
3159: aic7xxx_delay(1);
3160: outb(config->pause, HCNTRL + base);
3161:
3162: config->extended = aic7xxx_extended;
3163: config->irq = inb(INTDEF + base) & 0x0F;
3164: if ((inb(HA_274_BIOSCTRL + base) & BIOSMODE) == BIOSDISABLED)
3165: {
3166: bios_disabled = TRUE;
3167: }
3168: host_conf = inb(HOSTCONF + base);
3169:
3170: printk("aic7xxx: Reading SEEPROM...");
3171: have_seeprom = read_2840_seeprom(base, &sc);
3172: if (!have_seeprom)
3173: {
3174: printk("aic7xxx: Unable to read SEEPROM.\n");
3175: config->busrtime = host_conf & 0x3C;
3176: }
3177: else
3178: {
3179: printk("done.\n");
3180: config->extended = ((sc.bios_control & CF284XEXTEND) >> 5);
3181: config->scsi_id = (sc.brtime_id & CFSCSIID);
3182: config->parity = (sc.adapter_control & CFSPARITY) ?
3183: AIC_ENABLED : AIC_DISABLED;
3184: config->low_term = (sc.adapter_control & CF284XSTERM) ?
3185: AIC_ENABLED : AIC_DISABLED;
3186: /*
3187: * XXX - Adaptec *does* make 284x wide controllers, but the
3188: * documents do not say where the high byte termination
3189: * enable bit is located. For now, we'll just assume
3190: * that it's in the same place as for the 2940 card.
3191: */
3192: config->high_term = (sc.adapter_control & CFWSTERM) ?
3193: AIC_ENABLED : AIC_DISABLED;
3194: config->busrtime = ((sc.brtime_id & CFBRTIME) >> 8);
3195: }
3196: /* XXX Is this valid for motherboard based controllers? */
3197: /* Setup the FIFO threshold and the bus off time */
3198: outb(host_conf & DFTHRSH, BUSSPD + base);
3199: outb((host_conf << 2) & BOFF, BUSTIME + base);
3200:
3201: printk("aic7xxx: Extended translation %sabled.\n",
3202: config->extended ? "en" : "dis");
3203: break;
3204:
3205: case AIC_7850:
3206: case AIC_7870:
3207: case AIC_7871:
3208: case AIC_7872:
3209: case AIC_7873:
3210: case AIC_7874:
3211: case AIC_7880:
3212: case AIC_7881:
3213: case AIC_7882:
3214: case AIC_7883:
3215: case AIC_7884:
3216: outb(CHIPRST, HCNTRL + base);
3217: config->unpause = UNPAUSE_294X;
3218: config->pause = config->unpause | PAUSE;
3219: aic7xxx_delay(1);
3220: outb(config->pause, HCNTRL + base);
3221:
3222: config->extended = aic7xxx_extended;
3223: config->scsi_id = 7;
3224:
3225: printk("aic7xxx: Reading SEEPROM...");
3226: have_seeprom = read_seeprom(base, config->chan_num * (sizeof(sc) / 2), &sc);
3227: if (!have_seeprom)
3228: {
3229: printk("aic7xxx: Unable to read SEEPROM.\n");
3230: }
3231: else
3232: {
3233: printk("done.\n");
3234: config->extended = ((sc.bios_control & CFEXTEND) >> 7);
3235: config->scsi_id = (sc.brtime_id & CFSCSIID);
3236: config->parity = (sc.adapter_control & CFSPARITY) ?
3237: AIC_ENABLED : AIC_DISABLED;
3238: config->low_term = (sc.adapter_control & CFSTERM) ?
3239: AIC_ENABLED : AIC_DISABLED;
3240: config->high_term = (sc.adapter_control & CFWSTERM) ?
3241: AIC_ENABLED : AIC_DISABLED;
3242: config->busrtime = ((sc.brtime_id & CFBRTIME) >> 8);
3243: if (((config->type == AIC_7880) || (config->type == AIC_7882) ||
3244: (config->type == AIC_7883) || (config->type == AIC_7884)) &&
3245: (sc.adapter_control & CFULTRAEN))
3246: {
3247: printk ("aic7xxx: Enabling support for Ultra SCSI speed.\n");
3248: config->ultra_enabled = TRUE;
3249: }
3250: }
3251:
3252: /*
3253: * XXX - force data fifo threshold to 100%. Why does this
3254: * need to be done?
3255: *
3256: * We don't know where this is set in the SEEPROM or by the BIOS,
3257: * so we default it to 100%.
3258: */
3259: outb(config->scsi_id | DFTHRSH_100, SCSICONF + base);
3260: outb(DFTHRSH_100, DSPCISTATUS + base);
3261:
3262: /*
3263: * In case we are a wide card, place scsi ID in second conf byte.
3264: */
3265: outb(config->scsi_id, (SCSICONF + base + 1));
3266:
3267: printk("aic7xxx: Extended translation %sabled.\n",
3268: config->extended ? "en" : "dis");
3269: break;
3270:
3271: default:
3272: panic("aic7xxx: (aic7xxx_register) Internal error.\n");
3273: }
3274:
3275: config->maxscb = detect_maxscb(config->type, base, config->walk_scbs);
3276:
3277: if (config->chip_type == AIC_777x)
3278: {
3279: if (config->pause & IRQMS)
3280: {
3281: printk("aic7xxx: Using level sensitive interrupts.\n");
3282: }
3283: else
3284: {
3285: printk("aic7xxx: Using edge triggered interrupts.\n");
3286: }
3287: }
3288:
3289: /*
3290: * Read the bus type from the SBLKCTL register. Set the FLAGS
3291: * register in the sequencer for twin and wide bus cards.
3292: */
3293: sblkctl = inb(SBLKCTL + base);
3294: switch (sblkctl & SELBUS_MASK)
3295: {
3296: case SELNARROW: /* narrow/normal bus */
3297: config->scsi_id = inb(SCSICONF + base) & 0x07;
3298: config->bus_type = AIC_SINGLE;
3299: outb(SINGLE_BUS, FLAGS + base);
3300: break;
3301:
3302: case SELWIDE: /* Wide bus */
3303: config->scsi_id = inb(SCSICONF + base + 1) & 0x0F;
3304: config->bus_type = AIC_WIDE;
3305: printk("aic7xxx: Enabling wide channel of %s-Wide.\n",
3306: board_names[config->type]);
3307: outb(WIDE_BUS, FLAGS + base);
3308: break;
3309:
3310: case SELBUSB: /* Twin bus */
3311: config->scsi_id = inb(SCSICONF + base) & 0x07;
3312: #ifdef AIC7XXX_TWIN_SUPPORT
3313: config->scsi_id_b = inb(SCSICONF + base + 1) & 0x07;
3314: config->bus_type = AIC_TWIN;
3315: printk("aic7xxx: Enabled channel B of %s-Twin.\n",
3316: board_names[config->type]);
3317: outb(TWIN_BUS, FLAGS + base);
3318: #else
3319: config->bus_type = AIC_SINGLE;
3320: printk("aic7xxx: Channel B of %s-Twin will be ignored.\n",
3321: board_names[config->type]);
3322: outb(0, FLAGS + base);
3323: #endif
3324: break;
3325:
3326: default:
3327: printk("aic7xxx: Unsupported type 0x%x, please "
3328: "mail [email protected]\n", inb(SBLKCTL + base));
3329: outb(0, FLAGS + base);
3330: return (0);
3331: }
3332:
3333: /*
3334: * For the 294x cards, clearing DIAGLEDEN and DIAGLEDON, will
3335: * take the card out of diagnostic mode and make the host adatper
3336: * LED follow bus activity (will not always be on).
3337: */
3338: outb(sblkctl & ~(DIAGLEDEN | DIAGLEDON), SBLKCTL + base);
3339:
3340: /*
3341: * The IRQ level in i/o port 4 maps directly onto the real
3342: * IRQ number. If it's ok, register it with the kernel.
3343: *
3344: * NB. the Adaptec documentation says the IRQ number is only
3345: * in the lower four bits; the ECU information shows the
3346: * high bit being used as well. Which is correct?
3347: *
3348: * The PCI cards get their interrupt from PCI BIOS.
3349: */
3350: if ((config->chip_type == AIC_777x) && ((config->irq < 9) || (config->irq > 15)))
3351: {
3352: printk("aic7xxx: Host adapter uses unsupported IRQ level, ignoring.\n");
3353: return (0);
3354: }
3355:
3356: /*
3357: * Check the IRQ to see if it is shared by another aic7xxx
3358: * controller. If it is and sharing of IRQs is not defined,
3359: * then return 0 hosts found. If sharing of IRQs is allowed
3360: * or the IRQ is not shared by another host adapter, then
3361: * proceed.
3362: */
3363: #ifndef AIC7XXX_SHARE_IRQS
3364: if (aic7xxx_boards[config->irq] != NULL)
3365: {
3366: printk("aic7xxx: Sharing of IRQ's is not configured.\n");
3367: return (0);
3368: }
3369: #endif
3370:
3371: /*
3372: * Print out debugging information before re-enabling
3373: * the card - a lot of registers on it can't be read
3374: * when the sequencer is active.
3375: */
3376: debug_config(config);
3377:
3378: /*
3379: * Before registry, make sure that the offsets of the
3380: * struct scatterlist are what the sequencer will expect,
3381: * otherwise disable scatter-gather altogether until someone
3382: * can fix it. This is important since the sequencer will
3383: * DMA elements of the SG array in while executing commands.
3384: */
3385: if (template->sg_tablesize != SG_NONE)
3386: {
3387: struct scatterlist sg;
3388:
3389: if (SG_STRUCT_CHECK(sg))
3390: {
3391: printk("aic7xxx: Warning - Kernel scatter-gather structures changed, "
3392: "disabling it.\n");
3393: template->sg_tablesize = SG_NONE;
3394: }
3395: }
3396:
3397: /*
3398: * Register each "host" and fill in the returned Scsi_Host
3399: * structure as best we can. Some of the parameters aren't
3400: * really relevant for bus types beyond ISA, and none of the
3401: * high-level SCSI code looks at it anyway. Why are the fields
3402: * there? Also save the pointer so that we can find the
3403: * information when an IRQ is triggered.
3404: */
3405: host = scsi_register(template, sizeof(struct aic7xxx_host));
3406: host->can_queue = config->maxscb;
3407: host->cmd_per_lun = AIC7XXX_CMDS_PER_LUN;
3408: host->this_id = config->scsi_id;
3409: host->irq = config->irq;
3410: if (config->bus_type == AIC_WIDE)
3411: {
3412: host->max_id = 16;
3413: }
3414: if (config->bus_type == AIC_TWIN)
3415: {
3416: host->max_channel = 1;
3417: }
3418:
3419: p = (struct aic7xxx_host *) host->hostdata;
3420:
3421: /*
3422: * Initialize the scb array by setting the state to free.
3423: */
3424: for (i = 0; i < AIC7XXX_MAXSCB; i++)
3425: {
3426: p->scb_array[i].state = SCB_FREE;
3427: p->scb_array[i].next = NULL;
3428: p->scb_array[i].cmd = NULL;
3429: }
3430:
3431: p->isr_count = 0;
3432: p->a_scanned = FALSE;
3433: p->b_scanned = FALSE;
3434: p->base = base;
3435: p->maxscb = config->maxscb;
3436: p->numscb = 0;
3437: p->extended = config->extended;
3438: p->type = config->type;
3439: p->chip_type = config->chip_type;
3440: p->ultra_enabled = config->ultra_enabled;
3441: p->chan_num = config->chan_num;
3442: p->bus_type = config->bus_type;
3443: p->have_seeprom = have_seeprom;
3444: p->seeprom = sc;
3445: p->free_scb = NULL;
3446: p->next = NULL;
3447:
3448: p->unpause = config->unpause;
3449: p->pause = config->pause;
3450:
3451: if (aic7xxx_boards[config->irq] == NULL)
3452: {
3453: /*
3454: * Warning! This must be done before requesting the irq. It is
3455: * possible for some boards to raise an interrupt as soon as
3456: * they are enabled. So when we request the irq from the Linux
3457: * kernel, an interrupt is triggered immediately. Therefore, we
3458: * must ensure the board data is correctly set before the request.
3459: */
3460: aic7xxx_boards[config->irq] = host;
3461:
3462: /*
3463: * Register IRQ with the kernel.
3464: */
3465: if (request_irq(config->irq, aic7xxx_isr, SA_INTERRUPT, "aic7xxx"))
3466: {
3467: printk("aic7xxx: Couldn't register IRQ %d, ignoring.\n", config->irq);
3468: aic7xxx_boards[config->irq] = NULL;
3469: return (0);
3470: }
3471: }
3472: else
3473: {
3474: /*
3475: * We have found a host adapter sharing an IRQ of a previously
3476: * registered host adapter. Add this host adapter's Scsi_Host
3477: * to the beginning of the linked list of hosts at the same IRQ.
3478: */
3479: p->next = aic7xxx_boards[config->irq];
3480: aic7xxx_boards[config->irq] = host;
3481: }
3482:
3483: /*
3484: * Load the sequencer program, then re-enable the board -
3485: * resetting the AIC-7770 disables it, leaving the lights
3486: * on with nobody home. On the PCI bus you *may* be home,
3487: * but then your mailing address is dynamically assigned
3488: * so no one can find you anyway :-)
3489: */
3490: printk("aic7xxx: Downloading sequencer code...");
3491: aic7xxx_loadseq(base);
3492:
3493: /*
3494: * Set Fast Mode and Enable the board
3495: */
3496: outb(FASTMODE, SEQCTL + base);
3497:
3498: if (p->chip_type == AIC_777x)
3499: {
3500: outb(ENABLE, BCTL + base);
3501: }
3502:
3503: printk("done.\n");
3504:
3505: /*
3506: * Set the SCSI Id, SXFRCTL0, SXFRCTL1, and SIMODE1, for both channels
3507: */
3508: if (p->bus_type == AIC_TWIN)
3509: {
3510: /*
3511: * Select Channel B.
3512: */
3513: outb((sblkctl & ~SELBUS_MASK) | SELBUSB, SBLKCTL + base);
3514:
3515: outb(config->scsi_id_b, SCSIID + base);
3516: scsi_conf = inb(SCSICONF + base + 1) & (ENSPCHK | STIMESEL);
3517: outb(scsi_conf | ENSTIMER | ACTNEGEN | STPWEN, SXFRCTL1 + base);
3518: outb(ENSELTIMO , SIMODE1 + base);
3519: if (p->ultra_enabled)
3520: {
3521: outb(DFON | SPIOEN | ULTRAEN, SXFRCTL0 + base);
3522: }
3523: else
3524: {
3525: outb(DFON | SPIOEN, SXFRCTL0 + base);
3526: }
3527:
3528: /*
3529: * Select Channel A
3530: */
3531: outb((sblkctl & ~SELBUS_MASK) | SELNARROW, SBLKCTL + base);
3532: }
3533: outb(config->scsi_id, SCSIID + base);
3534: scsi_conf = inb(SCSICONF + base) & (ENSPCHK | STIMESEL);
3535: outb(scsi_conf | ENSTIMER | ACTNEGEN | STPWEN, SXFRCTL1 + base);
3536: outb(ENSELTIMO , SIMODE1 + base);
3537: if (p->ultra_enabled)
3538: {
3539: outb(DFON | SPIOEN | ULTRAEN, SXFRCTL0 + base);
3540: }
3541: else
3542: {
3543: outb(DFON | SPIOEN, SXFRCTL0 + base);
3544: }
3545:
3546: /*
3547: * Look at the information that board initialization or the board
3548: * BIOS has left us. In the lower four bits of each target's
3549: * scratch space any value other than 0 indicates that we should
3550: * initiate synchronous transfers. If it's zero, the user or the
3551: * BIOS has decided to disable synchronous negotiation to that
3552: * target so we don't activate the needsdtr flag.
3553: */
3554: p->needsdtr_copy = 0x0;
3555: p->sdtr_pending = 0x0;
3556: p->needwdtr_copy = 0x0;
3557: p->wdtr_pending = 0x0;
3558: if (p->bus_type == AIC_SINGLE)
3559: {
3560: max_targets = 8;
3561: }
3562: else
3563: {
3564: max_targets = 16;
3565: }
3566:
3567: /*
3568: * Grab the disconnection disable table and invert it for our needs
3569: */
3570: if (have_seeprom)
3571: {
3572: p->discenable = 0x0;
3573: }
3574: else
3575: {
3576: if (bios_disabled)
3577: {
3578: printk("aic7xxx : Host adapter BIOS disabled. Using default SCSI "
3579: "device parameters.\n");
3580: p->discenable = 0xFFFF;
3581: }
3582: else
3583: {
3584: p->discenable = ~((inb(DISC_DSB + base + 1) << 8) |
3585: inb(DISC_DSB + base));
3586: }
3587: }
3588:
3589: for (i = 0; i < max_targets; i++)
3590: {
3591: if (have_seeprom)
3592: {
3593: target_settings = ((sc.device_flags[i] & CFXFER) << 4);
3594: if (sc.device_flags[i] & CFSYNCH)
3595: {
3596: p->needsdtr_copy |= (0x01 << i);
3597: }
3598: if (sc.device_flags[i] & CFWIDEB)
3599: {
3600: p->needwdtr_copy |= (0x01 << i);
3601: }
3602: if (sc.device_flags[i] & CFDISC)
3603: {
3604: p->discenable |= (0x01 << i);
3605: }
3606: }
3607: else
3608: {
3609: if (bios_disabled)
3610: {
3611: target_settings = 0; /* 10 MHz */
3612: p->needsdtr_copy |= (0x01 << i);
3613: p->needwdtr_copy |= (0x01 << i);
3614: }
3615: else
3616: {
3617: target_settings = inb(TARG_SCRATCH + base + i);
3618: if (target_settings & 0x0F)
3619: {
3620: p->needsdtr_copy |= (0x01 << i);
3621: /*
3622: * Default to asynchronous transfers (0 offset)
3623: */
3624: target_settings &= 0xF0;
3625: }
3626: if (target_settings & 0x80)
3627: {
3628: p->needwdtr_copy |= (0x01 << i);
3629: target_settings &= 0x7F;
3630: }
3631: }
3632: }
3633: outb(target_settings, (TARG_SCRATCH + base + i));
3634: }
3635:
3636: /*
3637: * If we are not wide, forget WDTR. This makes the driver
3638: * work on some cards that don't leave these fields cleared
3639: * when BIOS is not installed.
3640: */
3641: if (p->bus_type != AIC_WIDE)
3642: {
3643: p->needwdtr = 0;
3644: }
3645: p->needsdtr = p->needsdtr_copy;
3646: p->needwdtr = p->needwdtr_copy;
3647: #if 0
3648: printk("NeedSdtr = 0x%x, 0x%x\n", p->needsdtr_copy, p->needsdtr);
3649: printk("NeedWdtr = 0x%x, 0x%x\n", p->needwdtr_copy, p->needwdtr);
3650: #endif
3651:
3652: /*
3653: * Clear the control byte for every SCB so that the sequencer
3654: * doesn't get confused and think that one of them is valid
3655: */
3656: for (i = 0; i < config->maxscb; i++)
3657: {
3658: outb(i, SCBPTR + base);
3659: outb(0, SCBARRAY + base);
3660: }
3661:
3662: /*
3663: * For reconnecting targets, the sequencer code needs to
3664: * know how many SCBs it has to search through.
3665: */
3666: outb(config->maxscb, SCBCOUNT + base);
3667:
3668: /*
3669: * 2s compliment of SCBCOUNT
3670: */
3671: i = p->maxscb;
3672: outb(-i & 0xff, COMP_SCBCOUNT + base);
3673:
3674: /*
3675: * Clear the active flags - no targets are busy.
3676: */
3677: outb(0, ACTIVE_A + base);
3678: outb(0, ACTIVE_B + base);
3679:
3680: /*
3681: * We don't have any waiting selections
3682: */
3683: outb(SCB_LIST_NULL, WAITING_SCBH + base);
3684: outb(SCB_LIST_NULL, WAITING_SCBT + base);
3685:
3686: /*
3687: * Reset the SCSI bus. Is this necessary?
3688: * There may be problems for a warm boot without resetting
3689: * the SCSI bus. Either BIOS settings in scratch RAM
3690: * will not get reinitialized, or devices may stay at
3691: * previous negotiated settings (SDTR and WDTR) while
3692: * the driver will think that no negotiations have been
3693: * performed.
3694: *
3695: * Some devices need a long time to "settle" after a SCSI
3696: * bus reset.
3697: */
3698:
3699: if (!aic7xxx_no_reset)
3700: {
3701: printk("aic7xxx: Resetting the SCSI bus...");
3702: if (p->bus_type == AIC_TWIN)
3703: {
3704: /*
3705: * Select Channel B.
3706: */
3707: outb((sblkctl & ~SELBUS_MASK) | SELBUSB, SBLKCTL + base);
3708:
3709: outb(SCSIRSTO, SCSISEQ + base);
3710: udelay(1000);
3711: outb(0, SCSISEQ + base);
3712:
3713: /*
3714: * Select Channel A.
3715: */
3716: outb((sblkctl & ~SELBUS_MASK) | SELNARROW, SBLKCTL + base);
3717: }
3718:
3719: outb(SCSIRSTO, SCSISEQ + base);
3720: udelay(1000);
3721: outb(0, SCSISEQ + base);
3722:
3723: aic7xxx_delay(AIC7XXX_RESET_DELAY);
3724:
3725: printk("done.\n");
3726: }
3727:
3728: /*
3729: * Unpause the sequencer before returning and enable
3730: * interrupts - we shouldn't get any until the first
3731: * command is sent to us by the high-level SCSI code.
3732: */
3733: UNPAUSE_SEQUENCER(p);
3734: return (found);
3735: }
3736:
3737: /*+F*************************************************************************
3738: * Function:
3739: * aic7xxx_detect
3740: *
3741: * Description:
3742: * Try to detect and register an Adaptec 7770 or 7870 SCSI controller.
3743: *-F*************************************************************************/
3744: int
3745: aic7xxx_detect(Scsi_Host_Template *template)
3746: {
3747: int found = 0, slot, base;
3748: unsigned char irq = 0;
3749: int i;
3750: struct aic7xxx_host_config config;
3751:
3752: template->proc_dir = &proc_scsi_aic7xxx;
3753: config.chan_num = 0;
3754:
3755: /*
3756: * Since we may allow sharing of IRQs, it is imperative
3757: * that we "null-out" the aic7xxx_boards array. It is
3758: * not guaranteed to be initialized to 0 (NULL). We use
3759: * a NULL entry to indicate that no prior hosts have
3760: * been found/registered for that IRQ.
3761: */
3762: for (i = 0; i <= MAXIRQ; i++)
3763: {
3764: aic7xxx_boards[i] = NULL;
3765: }
3766:
3767: /*
3768: * Initialize the spurious count to 0.
3769: */
3770: aic7xxx_spurious_count = 0;
3771:
3772: /*
3773: * EISA/VL-bus card signature probe.
3774: */
3775: for (slot = MINSLOT; slot <= MAXSLOT; slot++)
3776: {
3777: base = SLOTBASE(slot) + MINREG;
3778:
3779: if (check_region(MINREG + base, MAXREG - MINREG))
3780: {
3781: /*
3782: * Some other driver has staked a
3783: * claim to this i/o region already.
3784: */
3785: continue;
3786: }
3787:
3788: config.type = aic7xxx_probe(slot, HID0 + base);
3789: if (config.type != AIC_NONE)
3790: {
3791: /*
3792: * We found a card, allow 1 spurious interrupt.
3793: */
3794: aic7xxx_spurious_count = 1;
3795:
3796: /*
3797: * We "find" a AIC-7770 if we locate the card
3798: * signature and we can set it up and register
3799: * it with the kernel without incident.
3800: */
3801: config.chip_type = AIC_777x;
3802: config.base = base;
3803: config.irq = irq;
3804: config.parity = AIC_UNKNOWN;
3805: config.low_term = AIC_UNKNOWN;
3806: config.high_term = AIC_UNKNOWN;
3807: config.busrtime = 0;
3808: config.walk_scbs = FALSE;
3809: config.ultra_enabled = FALSE;
3810: found += aic7xxx_register(template, &config);
3811:
3812: /*
3813: * Disallow spurious interrupts.
3814: */
3815: aic7xxx_spurious_count = 0;
3816: }
3817: }
3818:
3819: #ifdef CONFIG_PCI
3820: /*
3821: * PCI-bus probe.
3822: */
3823: if (pcibios_present())
3824: {
3825: struct
3826: {
3827: unsigned short vendor_id;
3828: unsigned short device_id;
3829: aha_type card_type;
3830: aha_chip_type chip_type;
3831: } const aic7xxx_pci_devices[] = {
3832: {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7850, AIC_7850, AIC_785x},
3833: {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7870, AIC_7870, AIC_787x},
3834: {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7871, AIC_7871, AIC_787x},
3835: {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7872, AIC_7872, AIC_787x},
3836: {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7873, AIC_7873, AIC_787x},
3837: {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7874, AIC_7874, AIC_787x},
3838: {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7880, AIC_7880, AIC_788x},
3839: {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7881, AIC_7881, AIC_788x},
3840: {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7882, AIC_7882, AIC_788x},
3841: {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7883, AIC_7883, AIC_788x},
3842: {PCI_VENDOR_ID_ADAPTEC, PCI_DEVICE_ID_ADAPTEC_7884, AIC_7884, AIC_788x}
3843: };
3844:
3845: int error;
3846: int done = 0;
3847: unsigned int io_port;
3848: unsigned short index = 0;
3849: unsigned char pci_bus, pci_device_fn;
3850: unsigned int csize_lattime;
3851: unsigned int class_revid;
3852: unsigned int devconfig;
3853: char rev_id[] = {'B', 'C', 'D'};
3854:
3855: for (i = 0; i < NUMBER(aic7xxx_pci_devices); i++)
3856: {
3857: done = FALSE;
3858: while (!done)
3859: {
3860: if (pcibios_find_device(aic7xxx_pci_devices[i].vendor_id,
3861: aic7xxx_pci_devices[i].device_id,
3862: index, &pci_bus, &pci_device_fn))
3863: {
3864: done = TRUE;
3865: }
3866: else /* Found an Adaptec PCI device. */
3867: {
3868: config.type = aic7xxx_pci_devices[i].card_type;
3869: config.chip_type = aic7xxx_pci_devices[i].chip_type;
3870: config.chan_num = 0;
3871: config.walk_scbs = FALSE;
3872: switch (config.type)
3873: {
3874: case AIC_7872: /* 3940 */
3875: case AIC_7882: /* 3940-Ultra */
3876: config.walk_scbs = TRUE;
3877: config.chan_num = number_of_39xxs & 0x1; /* Has 2 controllers */
3878: number_of_39xxs++;
3879: if (number_of_39xxs == 2)
3880: {
3881: number_of_39xxs = 0; /* To be consistent with 3985. */
3882: }
3883: break;
3884:
3885: case AIC_7873: /* 3985 */
3886: case AIC_7883: /* 3985-Ultra */
3887: config.chan_num = number_of_39xxs & 0x3; /* Has 3 controllers */
3888: number_of_39xxs++;
3889: if (number_of_39xxs == 3)
3890: {
3891: number_of_39xxs = 0;
3892: }
3893: break;
3894:
3895: default:
3896: break;
3897: }
3898:
3899: /*
3900: * Read esundry information from PCI BIOS.
3901: */
3902: error = pcibios_read_config_dword(pci_bus, pci_device_fn,
3903: PCI_BASE_ADDRESS_0, &io_port);
3904: error += pcibios_read_config_byte(pci_bus, pci_device_fn,
3905: PCI_INTERRUPT_LINE, &irq);
3906:
3907: /*
3908: * Ensure that we are using good values for the PCI burst size
3909: * and latency timer.
3910: */
3911: error += pcibios_read_config_dword(pci_bus, pci_device_fn,
3912: CSIZE_LATTIME, &csize_lattime);
3913: if ((csize_lattime & CACHESIZE) == 0)
3914: {
3915: /* Default to 8DWDs - what's the PCI define for this? */
3916: csize_lattime |= 8;
3917: }
3918: if((csize_lattime & LATTIME) == 0)
3919: {
3920: /* Default to 64 PCLKS (is this a good value?) */
3921: /* This may also be availble in the SEEPROM?? */
3922: csize_lattime |= (64 << 8);
3923: }
3924: pcibios_write_config_dword(pci_bus, pci_device_fn,
3925: CSIZE_LATTIME, csize_lattime);
3926: printk("aic7xxx: BurstLen = %d DWDs, Latency Timer = %d PCLKS\n",
3927: (int) (csize_lattime & CACHESIZE),
3928: (csize_lattime >> 8) & 0x000000ff);
3929:
3930: error += pcibios_read_config_dword(pci_bus, pci_device_fn,
3931: CLASS_PROGIF_REVID, &class_revid);
3932: if ((class_revid & DEVREVID) < 3)
3933: {
3934: printk("aic7xxx: %s Rev %c.\n", board_names[config.type],
3935: rev_id[class_revid & DEVREVID]);
3936: }
3937:
3938: error += pcibios_read_config_dword(pci_bus, pci_device_fn,
3939: DEVCONFIG, &devconfig);
3940: if (error)
3941: {
3942: panic("aic7xxx: (aic7xxx_detect) Error %d reading PCI registers.\n",
3943: error);
3944: }
3945:
3946: printk("aic7xxx: devconfig = 0x%x.\n", devconfig);
3947:
3948: /*
3949: * The first bit of PCI_BASE_ADDRESS_0 is always set, so
3950: * we mask it off.
3951: */
3952: base = io_port & 0xfffffffe;
3953:
3954: /*
3955: * I don't think we need to bother with allowing
3956: * spurious interrupts for the 787x/7850, but what
3957: * the hey.
3958: */
3959: aic7xxx_spurious_count = 1;
3960:
3961: config.base = base;
3962: config.irq = irq;
3963: config.parity = AIC_UNKNOWN;
3964: config.low_term = AIC_UNKNOWN;
3965: config.high_term = AIC_UNKNOWN;
3966: config.busrtime = 0;
3967: config.ultra_enabled = FALSE;
3968: if (devconfig & RAMPSM)
3969: {
3970: /*
3971: * External SRAM present. Have the probe walk the SCBs to see
3972: * how much SRAM we have and set the number of SCBs accordingly.
3973: * We have to turn off SCBRAMSEL to access the external SCB
3974: * SRAM.
3975: *
3976: * It seems that early versions of the aic7870 didn't use these
3977: * bits, hence the hack for the 3940 above. I would guess that
3978: * recent 3940s using later aic7870 or aic7880 chips do actually
3979: * set RAMPSM.
3980: *
3981: * The documentation isn't clear, but it sounds like the value
3982: * written to devconfig must not have RAMPSM set. The second
3983: * sixteen bits of the register are R/O anyway, so it shouldn't
3984: * affect RAMPSM either way.
3985: */
3986: printk ("aic7xxx: External RAM detected. Enabling RAM access.\n");
3987: devconfig &= ~(RAMPSM | SCBRAMSEL);
3988: pcibios_write_config_dword(pci_bus, pci_device_fn,
3989: DEVCONFIG, devconfig);
3990: config.walk_scbs = TRUE;
3991: }
3992: found += aic7xxx_register(template, &config);
3993:
3994: /*
3995: * Disable spurious interrupts.
3996: */
3997: aic7xxx_spurious_count = 0;
3998:
3999: index++;
4000: } /* Found an Adaptec PCI device. */
4001: }
4002: }
4003: }
4004: #endif CONFIG_PCI
4005:
4006: template->name = aic7xxx_info(NULL);
4007: return (found);
4008: }
4009:
4010:
4011: /*+F*************************************************************************
4012: * Function:
4013: * aic7xxx_buildscb
4014: *
4015: * Description:
4016: * Build a SCB.
4017: *-F*************************************************************************/
4018: static void
4019: aic7xxx_buildscb(struct aic7xxx_host *p,
4020: Scsi_Cmnd *cmd,
4021: struct aic7xxx_scb *scb)
4022: {
4023: void *addr;
4024: unsigned short mask;
4025: struct scatterlist *sg;
4026:
4027: /*
4028: * Setup the control byte if we need negotiation and have not
4029: * already requested it.
4030: */
4031: #ifdef AIC7XXX_TAGGED_QUEUEING
4032: if (cmd->device->tagged_supported)
4033: {
4034: if (cmd->device->tagged_queue == 0)
4035: {
4036: printk("aic7xxx: Enabling tagged queuing for target %d, "
4037: "channel %d.\n", cmd->target, cmd->channel);
4038: cmd->device->tagged_queue = 1;
4039: cmd->device->current_tag = 1; /* enable tagging */
4040: }
4041: cmd->tag = cmd->device->current_tag;
4042: cmd->device->current_tag++;
4043: scb->control |= TAG_ENB;
4044: }
4045: #endif
4046: mask = (0x01 << (cmd->target | (cmd->channel << 3)));
4047: if (p->discenable & mask)
4048: {
4049: scb->control |= DISCENB;
4050: }
4051: if ((p->needwdtr & mask) && !(p->wdtr_pending & mask))
4052: {
4053: p->wdtr_pending |= mask;
4054: scb->control |= NEEDWDTR;
4055: #if 0
4056: printk("aic7xxx: Sending WDTR request to target %d.\n", cmd->target);
4057: #endif
4058: }
4059: else
4060: {
4061: if ((p->needsdtr & mask) && !(p->sdtr_pending & mask))
4062: {
4063: p->sdtr_pending |= mask;
4064: scb->control |= NEEDSDTR;
4065: #if 0
4066: printk("aic7xxx: Sending SDTR request to target %d.\n", cmd->target);
4067: #endif
4068: }
4069: }
4070:
4071: #if 0
4072: printk("aic7xxx: (build_scb) Target %d, cmd(0x%x) size(%u) wdtr(0x%x) "
4073: "mask(0x%x).\n",
4074: cmd->target, cmd->cmnd[0], cmd->cmd_len, p->needwdtr, mask);
4075: #endif
4076: scb->target_channel_lun = ((cmd->target << 4) & 0xF0) |
4077: ((cmd->channel & 0x01) << 3) | (cmd->lun & 0x07);
4078:
4079: /*
4080: * The interpretation of request_buffer and request_bufflen
4081: * changes depending on whether or not use_sg is zero; a
4082: * non-zero use_sg indicates the number of elements in the
4083: * scatter-gather array.
4084: */
4085:
4086: /*
4087: * XXX - this relies on the host data being stored in a
4088: * little-endian format.
4089: */
4090: addr = cmd->cmnd;
4091: scb->SCSI_cmd_length = cmd->cmd_len;
4092: memcpy(scb->SCSI_cmd_pointer, &addr, sizeof(scb->SCSI_cmd_pointer));
4093:
4094: if (cmd->use_sg)
4095: {
4096: scb->SG_segment_count = cmd->use_sg;
4097: memcpy(scb->SG_list_pointer, &cmd->request_buffer,
4098: sizeof(scb->SG_list_pointer));
4099: memcpy(&sg, &cmd->request_buffer, sizeof(sg));
4100: memcpy(scb->data_pointer, &(sg[0].address), sizeof(scb->data_pointer));
4101: scb->data_count = sg[0].length;
4102: #if 0
4103: debug("aic7xxx: (build_scb) SG segs(%d), length(%u), sg[0].length(%d).\n",
4104: cmd->use_sg, aic7xxx_length(cmd, 0), scb->data_count);
4105: #endif
4106: }
4107: else
4108: {
4109: #if 0
4110: debug("aic7xxx: (build_scb) Creating scatterlist, addr(0x%lx) length(%d).\n",
4111: (unsigned long) cmd->request_buffer, cmd->request_bufflen);
4112: #endif
4113: if (cmd->request_bufflen == 0)
4114: {
4115: /*
4116: * In case the higher level SCSI code ever tries to send a zero
4117: * length command, ensure the SCB indicates no data. The driver
4118: * will interpret a zero length command as a Bus Device Reset.
4119: */
4120: scb->SG_segment_count = 0;
4121: memset(scb->SG_list_pointer, 0, sizeof(scb->SG_list_pointer));
4122: memset(scb->data_pointer, 0, sizeof(scb->data_pointer));
4123: scb->data_count = 0;
4124: }
4125: else
4126: {
4127: scb->SG_segment_count = 1;
4128: scb->sg.address = (char *) cmd->request_buffer;
4129: scb->sg.length = cmd->request_bufflen;
4130: addr = &scb->sg;
4131: memcpy(scb->SG_list_pointer, &addr, sizeof(scb->SG_list_pointer));
4132: scb->data_count = scb->sg.length;
4133: memcpy(scb->data_pointer, &cmd->request_buffer, sizeof(scb->data_pointer));
4134: }
4135: }
4136: }
4137:
4138: /*+F*************************************************************************
4139: * Function:
4140: * aic7xxx_queue
4141: *
4142: * Description:
4143: * Queue a SCB to the controller.
4144: *-F*************************************************************************/
4145: int
4146: aic7xxx_queue(Scsi_Cmnd *cmd, void (*fn)(Scsi_Cmnd *))
4147: {
4148: long flags;
4149: struct aic7xxx_host *p;
4150: struct aic7xxx_scb *scb;
4151:
4152: p = (struct aic7xxx_host *) cmd->host->hostdata;
4153:
4154: /*
4155: * Check to see if channel was scanned.
4156: */
4157: if (!p->a_scanned && (cmd->channel == 0))
4158: {
4159: printk("aic7xxx: Scanning channel A for devices.\n");
4160: p->a_scanned = TRUE;
4161: }
4162: else
4163: {
4164: if (!p->b_scanned && (cmd->channel == 1))
4165: {
4166: printk("aic7xxx: Scanning channel B for devices.\n");
4167: p->b_scanned = TRUE;
4168: }
4169: }
4170:
4171: #if 0
4172: debug("aic7xxx: (queue) cmd(0x%x) size(%u), target %d, channel %d, lun %d.\n",
4173: cmd->cmnd[0], cmd->cmd_len, cmd->target, cmd->channel,
4174: cmd->lun & 0x07);
4175: #endif
4176:
4177: /*
4178: * This is a critical section, since we don't want the
4179: * interrupt routine mucking with the host data or the
4180: * card. Since the kernel documentation is vague on
4181: * whether or not we are in a cli/sti pair already, save
4182: * the flags to be on the safe side.
4183: */
4184: save_flags(flags);
4185: cli();
4186:
4187: /*
4188: * Find a free slot in the SCB array to load this command
4189: * into. Since can_queue is set to the maximum number of
4190: * SCBs for the card, we should always find one.
4191: *
4192: * First try to find an scb in the free list. If there are
4193: * none in the free list, then check the current number of
4194: * of scbs and take an unused one from the scb array.
4195: */
4196: scb = p->free_scb;
4197: if (scb != NULL)
4198: { /* found one in the free list */
4199: p->free_scb = scb->next; /* remove and update head of list */
4200: /*
4201: * Warning! For some unknown reason, the scb at the head
4202: * of the free list is not the same address that it should
4203: * be. That's why we set the scb pointer taken by the
4204: * position in the array. The scb at the head of the list
4205: * should match this address, but it doesn't.
4206: */
4207: scb = &(p->scb_array[scb->position]);
4208: scb->control = 0;
4209: scb->state = SCB_ACTIVE;
4210: }
4211: else
4212: {
4213: if (p->numscb >= p->maxscb)
4214: {
4215: panic("aic7xxx: (aic7xxx_queue) Couldn't find a free SCB.\n");
4216: }
4217: else
4218: {
4219: /*
4220: * Initialize the scb within the scb array. The
4221: * position within the array is the position on
4222: * the board that it will be loaded.
4223: */
4224: scb = &(p->scb_array[p->numscb]);
4225: memset(scb, 0, sizeof(*scb));
4226:
4227: scb->position = p->numscb;
4228: p->numscb++;
4229: scb->state = SCB_ACTIVE;
4230: }
4231: }
4232:
4233: scb->cmd = cmd;
4234: aic7xxx_position(cmd) = scb->position;
4235: #if 0
4236: debug_scb(scb);
4237: #endif;
4238:
4239: /*
4240: * Construct the SCB beforehand, so the sequencer is
4241: * paused a minimal amount of time.
4242: */
4243: aic7xxx_buildscb(p, cmd, scb);
4244:
4245: #if 0
4246: if (scb != &p->scb_array[scb->position])
4247: {
4248: printk("aic7xxx: (queue) Address of SCB by position does not match SCB "
4249: "address.\n");
4250: }
4251: printk("aic7xxx: (queue) SCB pos(%d) cmdptr(0x%x) state(%d) freescb(0x%x)\n",
4252: scb->position, (unsigned int) scb->cmd,
4253: scb->state, (unsigned int) p->free_scb);
4254: #endif
4255: /*
4256: * Pause the sequencer so we can play with its registers -
4257: * wait for it to acknowledge the pause.
4258: *
4259: * XXX - should the interrupts be left on while doing this?
4260: */
4261: PAUSE_SEQUENCER(p);
4262:
4263: /*
4264: * Save the SCB pointer and put our own pointer in - this
4265: * selects one of the four banks of SCB registers. Load
4266: * the SCB, then write its pointer into the queue in FIFO
4267: * and restore the saved SCB pointer.
4268: */
4269: aic7xxx_putscb(p, scb);
4270: outb(scb->position, QINFIFO + p->base);
4271:
4272: /*
4273: * Make sure the Scsi_Cmnd pointer is saved, the struct it
4274: * points to is set up properly, and the parity error flag
4275: * is reset, then unpause the sequencer and watch the fun
4276: * begin.
4277: */
4278: cmd->scsi_done = fn;
4279: aic7xxx_error(cmd) = DID_OK;
4280: aic7xxx_status(cmd) = 0;
4281: cmd->result = 0;
4282: memset(&cmd->sense_buffer, 0, sizeof(cmd->sense_buffer));
4283:
4284: UNPAUSE_SEQUENCER(p);
4285: #if 0
4286: printk("aic7xxx: (queue) After - cmd(0x%lx) scb->cmd(0x%lx) pos(%d).\n",
4287: (long) cmd, (long) scb->cmd, scb->position);
4288: #endif;
4289: restore_flags(flags);
4290: return (0);
4291: }
4292:
4293: /*+F*************************************************************************
4294: * Function:
4295: * aic7xxx_abort_scb
4296: *
4297: * Description:
4298: * Abort an scb. If the scb has not previously been aborted, then
4299: * we attempt to send a BUS_DEVICE_RESET message to the target. If
4300: * the scb has previously been unsuccessfully aborted, then we will
4301: * reset the channel and have all devices renegotiate. Returns an
4302: * enumerated type that indicates the status of the operation.
4303: *-F*************************************************************************/
4304: static aha_abort_reset_type
4305: aic7xxx_abort_scb(struct aic7xxx_host *p, struct aic7xxx_scb *scb,
4306: unsigned char errcode)
4307: {
4308: int base = p->base;
4309: int found = FALSE;
4310: aha_abort_reset_type scb_status = ABORT_RESET_SUCCESS;
4311: char channel = scb->target_channel_lun & SELBUSB ? 'B': 'A';
4312:
4313: /*
4314: * Ensure that the card doesn't do anything
4315: * behind our back.
4316: */
4317: PAUSE_SEQUENCER(p);
4318:
4319: #ifdef AIC7XXX_DEBUG_ABORT
4320: printk ("aic7xxx: (abort_scb) scb %d, scb_aborted 0x%x\n",
4321: scb->position, (scb->state & SCB_ABORTED));
4322: #endif
4323: /*
4324: * First, determine if we want to do a bus reset or simply a bus device
4325: * reset. If this is the first time that a transaction has timed out,
4326: * just schedule a bus device reset. Otherwise, we reset the bus and
4327: * abort all pending I/Os on that bus.
4328: */
4329: if (scb->state & SCB_ABORTED)
4330: {
4331: /*
4332: * Been down this road before. Do a full bus reset.
4333: */
4334: found = aic7xxx_reset_channel(p, channel, scb->position);
4335: }
4336: else
4337: {
4338: unsigned char active_scb, control;
4339: struct aic7xxx_scb *active_scbp;
4340:
4341: /*
4342: * Send a Bus Device Reset Message:
4343: * The target we select to send the message to may be entirely
4344: * different than the target pointed to by the scb that timed
4345: * out. If the command is in the QINFIFO or the waiting for
4346: * selection list, its not tying up the bus and isn't responsible
4347: * for the delay so we pick off the active command which should
4348: * be the SCB selected by SCBPTR. If its disconnected or active,
4349: * we device reset the target scbp points to. Although it may
4350: * be that this target is not responsible for the delay, it may
4351: * may also be that we're timing out on a command that just takes
4352: * too much time, so we try the bus device reset there first.
4353: */
4354: active_scb = inb(SCBPTR + base);
4355: active_scbp = &(p->scb_array[active_scb]);
4356: control = inb(SCBARRAY + base);
4357:
4358: /*
4359: * Test to see if scbp is disconnected
4360: */
4361: outb(scb->position, SCBPTR + base);
4362: if (inb(SCBARRAY + base) & DISCONNECTED)
4363: {
4364: #ifdef AIC7XXX_DEBUG_ABORT
4365: printk ("aic7xxx: (abort_scb) scb %d is disconnected.\n", scb->position);
4366: #endif
4367: scb->state |= (SCB_DEVICE_RESET | SCB_ABORTED);
4368: scb->SG_segment_count = 0;
4369: memset(scb->SG_list_pointer, 0, sizeof(scb->SG_list_pointer));
4370: memset(scb->data_pointer, 0, sizeof(scb->data_pointer));
4371: scb->data_count = 0;
4372: aic7xxx_putscb(p, scb);
4373: aic7xxx_error(scb->cmd) = errcode;
4374: scb_status = ABORT_RESET_PENDING;
4375: aic7xxx_add_waiting_scb(base, scb, LIST_SECOND);
4376: UNPAUSE_SEQUENCER(p);
4377: }
4378: else
4379: {
4380: /*
4381: * Is the active SCB really active?
4382: */
4383: if (active_scbp->state & SCB_ACTIVE)
4384: {
4385: unsigned char msg_len = inb(MSG_LEN + base);
4386: if (msg_len != 0)
4387: {
4388: #ifdef AIC7XXX_DEBUG_ABORT
4389: printk ("aic7xxx: (abort_scb) scb is active, needs DMA, "
4390: "msg_len is non-zero.\n");
4391: #endif
4392: /*
4393: * If we're in a message phase, tacking on another message
4394: * may confuse the target totally. The bus is probably wedged,
4395: * so reset the channel.
4396: */
4397: channel = (active_scbp->target_channel_lun & SELBUSB) ? 'B': 'A';
4398: aic7xxx_reset_channel(p, channel, scb->position);
4399: }
4400: else
4401: {
4402: #ifdef AIC7XXX_DEBUG_ABORT
4403: printk ("aic7xxx: (abort_scb) scb is active, needs DMA, "
4404: "msg_len is zero.\n");
4405: #endif
4406: /*
4407: * Load the message buffer and assert attention.
4408: */
4409: active_scbp->state |= (SCB_DEVICE_RESET | SCB_ABORTED);
4410: outb(1, MSG_LEN + base);
4411: outb(MSG_BUS_DEVICE_RESET, MSG0 + base);
4412: if (active_scbp->target_channel_lun != scb->target_channel_lun)
4413: {
4414: /*
4415: * XXX - We would like to increment the timeout on scb, but
4416: * access to that routine is denied because it is hidden
4417: * in scsi.c. If we were able to do this, it would give
4418: * scb a new lease on life.
4419: */
4420: ;
4421: }
4422: aic7xxx_error(scb->cmd) = errcode;
4423: scb_status = ABORT_RESET_PENDING;
4424: UNPAUSE_SEQUENCER(p);
4425: }
4426: }
4427: else
4428: {
4429: #ifdef AIC7XXX_DEBUG_ABORT
4430: printk ("aic7xxx: (abort_scb) no active command.\n");
4431: #endif
4432: /*
4433: * No active command to single out, so reset
4434: * the bus for the timed out target.
4435: */
4436: aic7xxx_reset_channel(p, channel, scb->position);
4437: }
4438: }
4439: }
4440: return (scb_status);
4441: }
4442:
4443: /*+F*************************************************************************
4444: * Function:
4445: * aic7xxx_abort_reset
4446: *
4447: * Description:
4448: * Abort or reset the current SCSI command(s). Returns an enumerated
4449: * type that indicates the status of the operation.
4450: *-F*************************************************************************/
4451: static aha_abort_reset_type
4452: aic7xxx_abort_reset(Scsi_Cmnd *cmd, unsigned char errcode)
4453: {
4454: struct aic7xxx_scb *scb;
4455: struct aic7xxx_host *p;
4456: long flags;
4457: aha_abort_reset_type scb_status = ABORT_RESET_SUCCESS;
4458:
4459: p = (struct aic7xxx_host *) cmd->host->hostdata;
4460: scb = &(p->scb_array[aic7xxx_position(cmd)]);
4461:
4462: save_flags(flags);
4463: cli();
4464:
4465: #ifdef AIC7XXX_DEBUG_ABORT
4466: printk ("aic7xxx: (abort_reset) scb state 0x%x\n", scb->state);
4467: #endif
4468:
4469: if (scb->state & SCB_ACTIVE)
4470: {
4471: if (scb->state & SCB_IMMED)
4472: {
4473: /*
4474: * Don't know how set the number of retries to 0.
4475: */
4476: /* cmd->retries = 0; */
4477: aic7xxx_error(cmd) = errcode;
4478: aic7xxx_done(p, scb);
4479: }
4480: else
4481: {
4482: /*
4483: * Abort the operation.
4484: */
4485: scb_status = aic7xxx_abort_scb(p, scb, errcode);
4486: }
4487: }
4488: else
4489: {
4490: /*
4491: * The scb is not active and must have completed after the timeout
4492: * check in scsi.c and before we check the scb state above. For
4493: * this case we return SCSI_ABORT_NOT_RUNNING (if abort was called)
4494: * or SCSI_RESET_SUCCESS (if reset was called).
4495: */
4496: #ifdef AIC7XXX_DEBUG_ABORT
4497: printk ("aic7xxx: (abort_reset) called with no active scb, errcode 0x%x\n",
4498: errcode);
4499: #endif
4500: scb_status = ABORT_RESET_INACTIVE;
4501: /*
4502: * According to the comments in scsi.h and Michael Neuffer, if we do not
4503: * have an active command for abort or reset, we should not call the
4504: * command done function. Unfortunately, this hangs the system for me
4505: * unless we *do* call the done function.
4506: *
4507: * XXX - Revisit this sometime!
4508: */
4509: cmd->result = errcode << 16;
4510: cmd->scsi_done(cmd);
4511: }
4512: restore_flags(flags);
4513: return (scb_status);
4514: }
4515:
4516:
4517: /*+F*************************************************************************
4518: * Function:
4519: * aic7xxx_abort
4520: *
4521: * Description:
4522: * Abort the current SCSI command(s).
4523: *-F*************************************************************************/
4524: int
4525: aic7xxx_abort(Scsi_Cmnd *cmd)
4526: {
4527: #ifdef AIC7XXX_DEBUG_ABORT
4528: printk ("aic7xxx: (abort) target/channel %d/%d\n", cmd->target, cmd->channel);
4529: #endif
4530:
4531: switch (aic7xxx_abort_reset(cmd, DID_ABORT))
4532: {
4533: case ABORT_RESET_INACTIVE:
4534: return (SCSI_ABORT_NOT_RUNNING);
4535: break;
4536: case ABORT_RESET_PENDING:
4537: return (SCSI_ABORT_PENDING);
4538: break;
4539: case ABORT_RESET_SUCCESS:
4540: default:
4541: return (SCSI_ABORT_SUCCESS);
4542: break;
4543: }
4544: }
4545:
4546: /*+F*************************************************************************
4547: * Function:
4548: * aic7xxx_reset
4549: *
4550: * Description:
4551: * Resetting the bus always succeeds - is has to, otherwise the
4552: * kernel will panic! Try a surgical technique - sending a BUS
4553: * DEVICE RESET message - on the offending target before pulling
4554: * the SCSI bus reset line.
4555: *-F*************************************************************************/
4556: int
4557: aic7xxx_reset(Scsi_Cmnd *cmd)
4558: {
4559: #ifdef AIC7XXX_DEBUG_ABORT
4560: printk ("aic7xxx: (reset) target/channel %d/%d\n", cmd->target, cmd->channel);
4561: #endif
4562:
4563: switch (aic7xxx_abort_reset(cmd, DID_RESET))
4564: {
4565: case ABORT_RESET_PENDING:
4566: return (SCSI_RESET_PENDING);
4567: break;
4568: case ABORT_RESET_INACTIVE:
4569: case ABORT_RESET_SUCCESS:
4570: default:
4571: return (SCSI_RESET_SUCCESS);
4572: break;
4573: }
4574: }
4575:
4576: /*+F*************************************************************************
4577: * Function:
4578: * aic7xxx_biosparam
4579: *
4580: * Description:
4581: * Return the disk geometry for the given SCSI device.
4582: *-F*************************************************************************/
4583: int
4584: aic7xxx_biosparam(Disk *disk, kdev_t dev, int geom[])
4585: {
4586: int heads, sectors, cylinders;
4587: struct aic7xxx_host *p;
4588:
4589: p = (struct aic7xxx_host *) disk->device->host->hostdata;
4590:
4591: /*
4592: * XXX - if I could portably find the card's configuration
4593: * information, then this could be autodetected instead
4594: * of left to a boot-time switch.
4595: */
4596: heads = 64;
4597: sectors = 32;
4598: cylinders = disk->capacity / (heads * sectors);
4599:
4600: if (p->extended && cylinders > 1024)
4601: {
4602: heads = 255;
4603: sectors = 63;
4604: cylinders = disk->capacity / (255 * 63);
4605: }
4606:
4607: geom[0] = heads;
4608: geom[1] = sectors;
4609: geom[2] = cylinders;
4610:
4611: return (0);
4612: }
4613:
4614: #ifdef MACH
4615: #include "aic7xxx_proc.src"
4616: #else
4617: #include "aic7xxx_proc.c"
4618: #endif
4619:
4620: #ifdef MODULE
4621: /* Eventually this will go into an include file, but this will be later */
4622: Scsi_Host_Template driver_template = AIC7XXX;
4623:
4624: #include "scsi_module.c"
4625: #endif
4626:
4627: /*
4628: * Overrides for Emacs so that we almost follow Linus's tabbing style.
4629: * Emacs will notice this stuff at the end of the file and automatically
4630: * adjust the settings for this buffer only. This must remain at the end
4631: * of the file.
4632: * ---------------------------------------------------------------------------
4633: * Local variables:
4634: * c-indent-level: 2
4635: * c-brace-imaginary-offset: 0
4636: * c-brace-offset: -2
4637: * c-argdecl-indent: 2
4638: * c-label-offset: -2
4639: * c-continued-statement-offset: 2
4640: * c-continued-brace-offset: 0
4641: * indent-tabs-mode: nil
4642: * tab-width: 8
4643: * End:
4644: */
4645:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.