|
|
1.1 root 1: /******************************************************************************
2: ** High Performance device driver for the Symbios 53C896 controller.
3: **
4: ** Copyright (C) 1998-2000 Gerard Roudier <[email protected]>
5: **
6: ** This driver also supports all the Symbios 53C8XX controller family,
7: ** except 53C810 revisions < 16, 53C825 revisions < 16 and all
8: ** revisions of 53C815 controllers.
9: **
10: ** This driver is based on the Linux port of the FreeBSD ncr driver.
11: **
12: ** Copyright (C) 1994 Wolfgang Stanglmeier
13: **
14: **-----------------------------------------------------------------------------
15: **
16: ** This program is free software; you can redistribute it and/or modify
17: ** it under the terms of the GNU General Public License as published by
18: ** the Free Software Foundation; either version 2 of the License, or
19: ** (at your option) any later version.
20: **
21: ** This program is distributed in the hope that it will be useful,
22: ** but WITHOUT ANY WARRANTY; without even the implied warranty of
23: ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24: ** GNU General Public License for more details.
25: **
26: ** You should have received a copy of the GNU General Public License
27: ** along with this program; if not, write to the Free Software
28: ** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
29: **
30: **-----------------------------------------------------------------------------
31: **
32: ** The Linux port of the FreeBSD ncr driver has been achieved in
33: ** november 1995 by:
34: **
35: ** Gerard Roudier <[email protected]>
36: **
37: ** Being given that this driver originates from the FreeBSD version, and
38: ** in order to keep synergy on both, any suggested enhancements and corrections
39: ** received on Linux are automatically a potential candidate for the FreeBSD
40: ** version.
41: **
42: ** The original driver has been written for 386bsd and FreeBSD by
43: ** Wolfgang Stanglmeier <[email protected]>
44: ** Stefan Esser <[email protected]>
45: **
46: **-----------------------------------------------------------------------------
47: **
48: ** Major contributions:
49: ** --------------------
50: **
51: ** NVRAM detection and reading.
52: ** Copyright (C) 1997 Richard Waltham <[email protected]>
53: **
54: *******************************************************************************
55: */
56:
57: /*
58: ** Supported SCSI features:
59: ** Synchronous data transfers
60: ** Wide16 SCSI BUS
61: ** Disconnection/Reselection
62: ** Tagged command queuing
63: ** SCSI Parity checking
64: **
65: ** Supported NCR/SYMBIOS chips:
66: ** 53C810A (8 bits, Fast 10, no rom BIOS)
67: ** 53C825A (Wide, Fast 10, on-board rom BIOS)
68: ** 53C860 (8 bits, Fast 20, no rom BIOS)
69: ** 53C875 (Wide, Fast 20, on-board rom BIOS)
70: ** 53C876 (Wide, Fast 20 Dual, on-board rom BIOS)
71: ** 53C895 (Wide, Fast 40, on-board rom BIOS)
72: ** 53C895A (Wide, Fast 40, on-board rom BIOS)
73: ** 53C896 (Wide, Fast 40 Dual, on-board rom BIOS)
74: ** 53C897 (Wide, Fast 40 Dual, on-board rom BIOS)
75: ** 53C1510D (Wide, Fast 40 Dual, on-board rom BIOS)
76: ** 53C1010 (Wide, Fast 80 Dual, on-board rom BIOS)
77: ** 53C1010_66(Wide, Fast 80 Dual, on-board rom BIOS, 33/66MHz PCI)
78: **
79: ** Other features:
80: ** Memory mapped IO
81: ** Module
82: ** Shared IRQ
83: */
84:
85: /*
86: ** Name and version of the driver
87: */
88: #define SCSI_NCR_DRIVER_NAME "sym53c8xx-1.7.1-20000726"
89:
90: #define SCSI_NCR_DEBUG_FLAGS (0)
91:
92: #define NAME53C "sym53c"
93: #define NAME53C8XX "sym53c8xx"
94:
95: /*==========================================================
96: **
97: ** Include files
98: **
99: **==========================================================
100: */
101:
102: #define LinuxVersionCode(v, p, s) (((v)<<16)+((p)<<8)+(s))
103:
104: #ifdef MODULE
105: #include <linux/module.h>
106: #endif
107:
108: #include <asm/dma.h>
109: #include <asm/io.h>
110: #include <asm/system.h>
111: #if LINUX_VERSION_CODE >= LinuxVersionCode(2,3,17)
112: #include <linux/spinlock.h>
113: #elif LINUX_VERSION_CODE >= LinuxVersionCode(2,1,93)
114: #include <asm/spinlock.h>
115: #endif
116: #include <linux/delay.h>
117: #include <linux/signal.h>
118: #include <linux/sched.h>
119: #include <linux/errno.h>
120: #include <linux/pci.h>
121: #include <linux/string.h>
122: #include <linux/malloc.h>
123: #include <linux/mm.h>
124: #include <linux/ioport.h>
125: #include <linux/time.h>
126: #include <linux/timer.h>
127: #include <linux/stat.h>
128:
129: #include <linux/version.h>
130: #include <linux/blk.h>
131:
132: #ifdef CONFIG_ALL_PPC
133: #include <asm/prom.h>
134: #endif
135:
136: #if LINUX_VERSION_CODE >= LinuxVersionCode(2,1,35)
137: #include <linux/init.h>
138: #endif
139:
140: #ifndef __init
141: #define __init
142: #endif
143: #ifndef __initdata
144: #define __initdata
145: #endif
146:
147: #if LINUX_VERSION_CODE <= LinuxVersionCode(2,1,92)
148: #include <linux/bios32.h>
149: #endif
150:
151: #include "scsi.h"
152: #include "hosts.h"
153: #include "constants.h"
154: #include "sd.h"
155:
156: #include <linux/types.h>
157:
158: /*
159: ** Define BITS_PER_LONG for earlier linux versions.
160: */
161: #ifndef BITS_PER_LONG
162: #if (~0UL) == 0xffffffffUL
163: #define BITS_PER_LONG 32
164: #else
165: #define BITS_PER_LONG 64
166: #endif
167: #endif
168:
169: /*
170: ** Define the BSD style u_int32 and u_int64 type.
171: ** Are in fact u_int32_t and u_int64_t :-)
172: */
173: typedef u32 u_int32;
174: typedef u64 u_int64;
175:
176: #include "sym53c8xx.h"
177:
178: /*
179: ** Donnot compile integrity checking code for Linux-2.3.0
180: ** and above since SCSI data structures are not ready yet.
181: */
182: /* #if LINUX_VERSION_CODE < LinuxVersionCode(2,3,0) */
183: #if 0
184: #define SCSI_NCR_INTEGRITY_CHECKING
185: #endif
186:
187: #define MIN(a,b) (((a) < (b)) ? (a) : (b))
188: #define MAX(a,b) (((a) > (b)) ? (a) : (b))
189:
190: /*
191: ** Hmmm... What complex some PCI-HOST bridges actually are,
192: ** despite the fact that the PCI specifications are looking
193: ** so smart and simple! ;-)
194: */
195: #if LINUX_VERSION_CODE >= LinuxVersionCode(2,3,47)
196: #define SCSI_NCR_DYNAMIC_DMA_MAPPING
197: #endif
198:
199: /*==========================================================
200: **
201: ** A la VMS/CAM-3 queue management.
202: ** Implemented from linux list management.
203: **
204: **==========================================================
205: */
206:
207: typedef struct xpt_quehead {
208: struct xpt_quehead *flink; /* Forward pointer */
209: struct xpt_quehead *blink; /* Backward pointer */
210: } XPT_QUEHEAD;
211:
212: #define xpt_que_init(ptr) do { \
213: (ptr)->flink = (ptr); (ptr)->blink = (ptr); \
214: } while (0)
215:
216: static inline void __xpt_que_add(struct xpt_quehead * new,
217: struct xpt_quehead * blink,
218: struct xpt_quehead * flink)
219: {
220: flink->blink = new;
221: new->flink = flink;
222: new->blink = blink;
223: blink->flink = new;
224: }
225:
226: static inline void __xpt_que_del(struct xpt_quehead * blink,
227: struct xpt_quehead * flink)
228: {
229: flink->blink = blink;
230: blink->flink = flink;
231: }
232:
233: static inline int xpt_que_empty(struct xpt_quehead *head)
234: {
235: return head->flink == head;
236: }
237:
238: static inline void xpt_que_splice(struct xpt_quehead *list,
239: struct xpt_quehead *head)
240: {
241: struct xpt_quehead *first = list->flink;
242:
243: if (first != list) {
244: struct xpt_quehead *last = list->blink;
245: struct xpt_quehead *at = head->flink;
246:
247: first->blink = head;
248: head->flink = first;
249:
250: last->flink = at;
251: at->blink = last;
252: }
253: }
254:
255: #define xpt_que_entry(ptr, type, member) \
256: ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
257:
258:
259: #define xpt_insque(new, pos) __xpt_que_add(new, pos, (pos)->flink)
260:
261: #define xpt_remque(el) __xpt_que_del((el)->blink, (el)->flink)
262:
263: #define xpt_insque_head(new, head) __xpt_que_add(new, head, (head)->flink)
264:
265: static inline struct xpt_quehead *xpt_remque_head(struct xpt_quehead *head)
266: {
267: struct xpt_quehead *elem = head->flink;
268:
269: if (elem != head)
270: __xpt_que_del(head, elem->flink);
271: else
272: elem = 0;
273: return elem;
274: }
275:
276: #define xpt_insque_tail(new, head) __xpt_que_add(new, (head)->blink, head)
277:
278: static inline struct xpt_quehead *xpt_remque_tail(struct xpt_quehead *head)
279: {
280: struct xpt_quehead *elem = head->blink;
281:
282: if (elem != head)
283: __xpt_que_del(elem->blink, head);
284: else
285: elem = 0;
286: return elem;
287: }
288:
289: /*==========================================================
290: **
291: ** Configuration and Debugging
292: **
293: **==========================================================
294: */
295:
296: /*
297: ** SCSI address of this device.
298: ** The boot routines should have set it.
299: ** If not, use this.
300: */
301:
302: #ifndef SCSI_NCR_MYADDR
303: #define SCSI_NCR_MYADDR (7)
304: #endif
305:
306: /*
307: ** The maximum number of tags per logic unit.
308: ** Used only for devices that support tags.
309: */
310:
311: #ifndef SCSI_NCR_MAX_TAGS
312: #define SCSI_NCR_MAX_TAGS (8)
313: #endif
314:
315: /*
316: ** TAGS are actually unlimited (256 tags/lun).
317: ** But Linux only supports 255. :)
318: */
319: #if SCSI_NCR_MAX_TAGS > 255
320: #define MAX_TAGS 255
321: #else
322: #define MAX_TAGS SCSI_NCR_MAX_TAGS
323: #endif
324:
325: /*
326: ** Since the ncr chips only have a 8 bit ALU, we try to be clever
327: ** about offset calculation in the TASK TABLE per LUN that is an
328: ** array of DWORDS = 4 bytes.
329: */
330: #if MAX_TAGS > (512/4)
331: #define MAX_TASKS (1024/4)
332: #elif MAX_TAGS > (256/4)
333: #define MAX_TASKS (512/4)
334: #else
335: #define MAX_TASKS (256/4)
336: #endif
337:
338: /*
339: ** This one means 'NO TAG for this job'
340: */
341: #define NO_TAG (256)
342:
343: /*
344: ** Number of targets supported by the driver.
345: ** n permits target numbers 0..n-1.
346: ** Default is 16, meaning targets #0..#15.
347: ** #7 .. is myself.
348: */
349:
350: #ifdef SCSI_NCR_MAX_TARGET
351: #define MAX_TARGET (SCSI_NCR_MAX_TARGET)
352: #else
353: #define MAX_TARGET (16)
354: #endif
355:
356: /*
357: ** Number of logic units supported by the driver.
358: ** n enables logic unit numbers 0..n-1.
359: ** The common SCSI devices require only
360: ** one lun, so take 1 as the default.
361: */
362:
363: #ifdef SCSI_NCR_MAX_LUN
364: #define MAX_LUN 64
365: #else
366: #define MAX_LUN (1)
367: #endif
368:
369: /*
370: ** Asynchronous pre-scaler (ns). Shall be 40 for
371: ** the SCSI timings to be compliant.
372: */
373:
374: #ifndef SCSI_NCR_MIN_ASYNC
375: #define SCSI_NCR_MIN_ASYNC (40)
376: #endif
377:
378: /*
379: ** The maximum number of jobs scheduled for starting.
380: ** We allocate 4 entries more than the value we announce
381: ** to the SCSI upper layer. Guess why ! :-)
382: */
383:
384: #ifdef SCSI_NCR_CAN_QUEUE
385: #define MAX_START (SCSI_NCR_CAN_QUEUE + 4)
386: #else
387: #define MAX_START (MAX_TARGET + 7 * MAX_TAGS)
388: #endif
389:
390: /*
391: ** We donnot want to allocate more than 1 PAGE for the
392: ** the start queue and the done queue. We hard-code entry
393: ** size to 8 in order to let cpp do the checking.
394: ** Allows 512-4=508 pending IOs for i386 but Linux seems for
395: ** now not able to provide the driver with this amount of IOs.
396: */
397: #if MAX_START > PAGE_SIZE/8
398: #undef MAX_START
399: #define MAX_START (PAGE_SIZE/8)
400: #endif
401:
402: /*
403: ** The maximum number of segments a transfer is split into.
404: ** We support up to 127 segments for both read and write.
405: */
406:
407: #define MAX_SCATTER (SCSI_NCR_MAX_SCATTER)
408: #define SCR_SG_SIZE (2)
409:
410: /*
411: ** other
412: */
413:
414: #define NCR_SNOOP_TIMEOUT (1000000)
415:
416: /*==========================================================
417: **
418: ** Miscallaneous BSDish defines.
419: **
420: **==========================================================
421: */
422:
423: #define u_char unsigned char
424: #define u_short unsigned short
425: #define u_int unsigned int
426: #define u_long unsigned long
427:
428: #ifndef bcopy
429: #define bcopy(s, d, n) memcpy((d), (s), (n))
430: #endif
431:
432: #ifndef bzero
433: #define bzero(d, n) memset((d), 0, (n))
434: #endif
435:
436: #ifndef offsetof
437: #define offsetof(t, m) ((size_t) (&((t *)0)->m))
438: #endif
439:
440: /*
441: ** Simple Wrapper to kernel PCI bus interface.
442: **
443: ** This wrapper allows to get rid of old kernel PCI interface
444: ** and still allows to preserve linux-2.0 compatibilty.
445: ** In fact, it is mostly an incomplete emulation of the new
446: ** PCI code for pre-2.2 kernels. When kernel-2.0 support
447: ** will be dropped, we will just have to remove most of this
448: ** code.
449: */
450:
451: #if LINUX_VERSION_CODE >= LinuxVersionCode(2,2,0)
452:
453: typedef struct pci_dev *pcidev_t;
454: #define PCIDEV_NULL (0)
455: #define PciBusNumber(d) (d)->bus->number
456: #define PciDeviceFn(d) (d)->devfn
457: #define PciVendorId(d) (d)->vendor
458: #define PciDeviceId(d) (d)->device
459: #define PciIrqLine(d) (d)->irq
460:
461: #if LINUX_VERSION_CODE > LinuxVersionCode(2,3,12)
462:
463: static int __init
464: pci_get_base_address(struct pci_dev *pdev, int index, u_long *base)
465: {
466: *base = pdev->resource[index].start;
467: if ((pdev->resource[index].flags & 0x7) == 0x4)
468: ++index;
469: return ++index;
470: }
471: #else
472: static int __init
473: pci_get_base_address(struct pci_dev *pdev, int index, u_long *base)
474: {
475: *base = pdev->base_address[index++];
476: if ((*base & 0x7) == 0x4) {
477: #if BITS_PER_LONG > 32
478: *base |= (((u_long)pdev->base_address[index]) << 32);
479: #endif
480: ++index;
481: }
482: return index;
483: }
484: #endif
485:
486: #else /* Incomplete emulation of current PCI code for pre-2.2 kernels */
487:
488: typedef unsigned int pcidev_t;
489: #define PCIDEV_NULL (~0u)
490: #define PciBusNumber(d) ((d)>>8)
491: #define PciDeviceFn(d) ((d)&0xff)
492: #define __PciDev(busn, devfn) (((busn)<<8)+(devfn))
493:
494: #define pci_present pcibios_present
495:
496: #define pci_read_config_byte(d, w, v) \
497: pcibios_read_config_byte(PciBusNumber(d), PciDeviceFn(d), w, v)
498: #define pci_read_config_word(d, w, v) \
499: pcibios_read_config_word(PciBusNumber(d), PciDeviceFn(d), w, v)
500: #define pci_read_config_dword(d, w, v) \
501: pcibios_read_config_dword(PciBusNumber(d), PciDeviceFn(d), w, v)
502:
503: #define pci_write_config_byte(d, w, v) \
504: pcibios_write_config_byte(PciBusNumber(d), PciDeviceFn(d), w, v)
505: #define pci_write_config_word(d, w, v) \
506: pcibios_write_config_word(PciBusNumber(d), PciDeviceFn(d), w, v)
507: #define pci_write_config_dword(d, w, v) \
508: pcibios_write_config_dword(PciBusNumber(d), PciDeviceFn(d), w, v)
509:
510: static pcidev_t __init
511: pci_find_device(unsigned int vendor, unsigned int device, pcidev_t prev)
512: {
513: static unsigned short pci_index;
514: int retv;
515: unsigned char bus_number, device_fn;
516:
517: if (prev == PCIDEV_NULL)
518: pci_index = 0;
519: else
520: ++pci_index;
521: retv = pcibios_find_device (vendor, device, pci_index,
522: &bus_number, &device_fn);
523: return retv ? PCIDEV_NULL : __PciDev(bus_number, device_fn);
524: }
525:
526: static u_short __init PciVendorId(pcidev_t dev)
527: {
528: u_short vendor_id;
529: pci_read_config_word(dev, PCI_VENDOR_ID, &vendor_id);
530: return vendor_id;
531: }
532:
533: static u_short __init PciDeviceId(pcidev_t dev)
534: {
535: u_short device_id;
536: pci_read_config_word(dev, PCI_DEVICE_ID, &device_id);
537: return device_id;
538: }
539:
540: static u_int __init PciIrqLine(pcidev_t dev)
541: {
542: u_char irq;
543: pci_read_config_byte(dev, PCI_INTERRUPT_LINE, &irq);
544: return irq;
545: }
546:
547: static int __init
548: pci_get_base_address(pcidev_t dev, int offset, u_long *base)
549: {
550: u_int32 tmp;
551:
552: pci_read_config_dword(dev, PCI_BASE_ADDRESS_0 + offset, &tmp);
553: *base = tmp;
554: offset += sizeof(u_int32);
555: if ((tmp & 0x7) == 0x4) {
556: #if BITS_PER_LONG > 32
557: pci_read_config_dword(dev, PCI_BASE_ADDRESS_0 + offset, &tmp);
558: *base |= (((u_long)tmp) << 32);
559: #endif
560: offset += sizeof(u_int32);
561: }
562: return offset;
563: }
564:
565: #endif /* LINUX_VERSION_CODE >= LinuxVersionCode(2,2,0) */
566:
567: /*==========================================================
568: **
569: ** Debugging tags
570: **
571: **==========================================================
572: */
573:
574: #define DEBUG_ALLOC (0x0001)
575: #define DEBUG_PHASE (0x0002)
576: #define DEBUG_QUEUE (0x0008)
577: #define DEBUG_RESULT (0x0010)
578: #define DEBUG_POINTER (0x0020)
579: #define DEBUG_SCRIPT (0x0040)
580: #define DEBUG_TINY (0x0080)
581: #define DEBUG_TIMING (0x0100)
582: #define DEBUG_NEGO (0x0200)
583: #define DEBUG_TAGS (0x0400)
584: #define DEBUG_IC (0x0800)
585:
586: /*
587: ** Enable/Disable debug messages.
588: ** Can be changed at runtime too.
589: */
590:
591: #ifdef SCSI_NCR_DEBUG_INFO_SUPPORT
592: static int ncr_debug = SCSI_NCR_DEBUG_FLAGS;
593: #define DEBUG_FLAGS ncr_debug
594: #else
595: #define DEBUG_FLAGS SCSI_NCR_DEBUG_FLAGS
596: #endif
597:
598: /*
599: ** SMP threading.
600: **
601: ** Assuming that SMP systems are generally high end systems and may
602: ** use several SCSI adapters, we are using one lock per controller
603: ** instead of some global one. For the moment (linux-2.1.95), driver's
604: ** entry points are called with the 'io_request_lock' lock held, so:
605: ** - We are uselessly loosing a couple of micro-seconds to lock the
606: ** controller data structure.
607: ** - But the driver is not broken by design for SMP and so can be
608: ** more resistant to bugs or bad changes in the IO sub-system code.
609: ** - A small advantage could be that the interrupt code is grained as
610: ** wished (e.g.: threaded by controller).
611: */
612:
613: #if LINUX_VERSION_CODE >= LinuxVersionCode(2,1,93)
614:
615: spinlock_t sym53c8xx_lock = SPIN_LOCK_UNLOCKED;
616: #define NCR_LOCK_DRIVER(flags) spin_lock_irqsave(&sym53c8xx_lock, flags)
617: #define NCR_UNLOCK_DRIVER(flags) spin_unlock_irqrestore(&sym53c8xx_lock,flags)
618:
619: #define NCR_INIT_LOCK_NCB(np) spin_lock_init(&np->smp_lock);
620: #define NCR_LOCK_NCB(np, flags) spin_lock_irqsave(&np->smp_lock, flags)
621: #define NCR_UNLOCK_NCB(np, flags) spin_unlock_irqrestore(&np->smp_lock, flags)
622:
623: #define NCR_LOCK_SCSI_DONE(np, flags) \
624: spin_lock_irqsave(&io_request_lock, flags)
625: #define NCR_UNLOCK_SCSI_DONE(np, flags) \
626: spin_unlock_irqrestore(&io_request_lock, flags)
627:
628: #else
629:
630: #define NCR_LOCK_DRIVER(flags) do { save_flags(flags); cli(); } while (0)
631: #define NCR_UNLOCK_DRIVER(flags) do { restore_flags(flags); } while (0)
632:
633: #define NCR_INIT_LOCK_NCB(np) do { } while (0)
634: #define NCR_LOCK_NCB(np, flags) do { save_flags(flags); cli(); } while (0)
635: #define NCR_UNLOCK_NCB(np, flags) do { restore_flags(flags); } while (0)
636:
637: #define NCR_LOCK_SCSI_DONE(np, flags) do {;} while (0)
638: #define NCR_UNLOCK_SCSI_DONE(np, flags) do {;} while (0)
639:
640: #endif
641:
642: /*
643: ** Memory mapped IO
644: **
645: ** Since linux-2.1, we must use ioremap() to map the io memory space.
646: ** iounmap() to unmap it. That allows portability.
647: ** Linux 1.3.X and 2.0.X allow to remap physical pages addresses greater
648: ** than the highest physical memory address to kernel virtual pages with
649: ** vremap() / vfree(). That was not portable but worked with i386
650: ** architecture.
651: */
652:
653: #if LINUX_VERSION_CODE < LinuxVersionCode(2,1,0)
654: #define ioremap vremap
655: #define iounmap vfree
656: #endif
657:
658: #ifdef __sparc__
659: # include <asm/irq.h>
660: # if LINUX_VERSION_CODE < LinuxVersionCode(2,3,0)
661: /* ioremap/iounmap broken in 2.2.x on Sparc. -DaveM */
662: # define ioremap(base, size) ((u_long) __va(base))
663: # define iounmap(vaddr)
664: # endif
665: # define pcivtobus(p) bus_dvma_to_mem(p)
666: # define memcpy_to_pci(a, b, c) memcpy_toio((void *)(a), (const void *)(b), (c))
667: #elif defined(__alpha__)
668: # define pcivtobus(p) ((p) & 0xfffffffful)
669: # define memcpy_to_pci(a, b, c) memcpy_toio((a), (b), (c))
670: #else /* others */
671: # define pcivtobus(p) (p)
672: # define memcpy_to_pci(a, b, c) memcpy_toio((a), (b), (c))
673: #endif
674:
675: #ifndef SCSI_NCR_PCI_MEM_NOT_SUPPORTED
676: static u_long __init remap_pci_mem(u_long base, u_long size)
677: {
678: u_long page_base = ((u_long) base) & PAGE_MASK;
679: u_long page_offs = ((u_long) base) - page_base;
680: u_long page_remapped = (u_long) ioremap(page_base, page_offs+size);
681:
682: return page_remapped? (page_remapped + page_offs) : 0UL;
683: }
684:
685: static void __init unmap_pci_mem(u_long vaddr, u_long size)
686: {
687: if (vaddr)
688: iounmap((void *) (vaddr & PAGE_MASK));
689: }
690:
691: #endif /* not def SCSI_NCR_PCI_MEM_NOT_SUPPORTED */
692:
693: /*
694: ** Insert a delay in micro-seconds and milli-seconds.
695: ** -------------------------------------------------
696: ** Under Linux, udelay() is restricted to delay < 1 milli-second.
697: ** In fact, it generally works for up to 1 second delay.
698: ** Since 2.1.105, the mdelay() function is provided for delays
699: ** in milli-seconds.
700: ** Under 2.0 kernels, udelay() is an inline function that is very
701: ** inaccurate on Pentium processors.
702: */
703:
704: #if LINUX_VERSION_CODE >= LinuxVersionCode(2,1,105)
705: #define UDELAY udelay
706: #define MDELAY mdelay
707: #else
708: static void UDELAY(long us) { udelay(us); }
709: static void MDELAY(long ms) { while (ms--) UDELAY(1000); }
710: #endif
711:
712: /*
713: ** Simple power of two buddy-like allocator
714: ** ----------------------------------------
715: ** This simple code is not intended to be fast, but to provide
716: ** power of 2 aligned memory allocations.
717: ** Since the SCRIPTS processor only supplies 8 bit arithmetic,
718: ** this allocator allows simple and fast address calculations
719: ** from the SCRIPTS code. In addition, cache line alignment
720: ** is guaranteed for power of 2 cache line size.
721: ** Enhanced in linux-2.3.44 to provide a memory pool per pcidev
722: ** to support dynamic dma mapping. (I would have preferred a
723: ** real bus astraction, btw).
724: */
725:
726: #if LINUX_VERSION_CODE >= LinuxVersionCode(2,1,0)
727: #define __GetFreePages(flags, order) __get_free_pages(flags, order)
728: #else
729: #define __GetFreePages(flags, order) __get_free_pages(flags, order, 0)
730: #endif
731:
732: #define MEMO_SHIFT 4 /* 16 bytes minimum memory chunk */
733: #if PAGE_SIZE >= 8192
734: #define MEMO_PAGE_ORDER 0 /* 1 PAGE maximum */
735: #else
736: #define MEMO_PAGE_ORDER 1 /* 2 PAGES maximum */
737: #endif
738: #define MEMO_FREE_UNUSED /* Free unused pages immediately */
739: #define MEMO_WARN 1
740: #define MEMO_GFP_FLAGS GFP_ATOMIC
741: #define MEMO_CLUSTER_SHIFT (PAGE_SHIFT+MEMO_PAGE_ORDER)
742: #define MEMO_CLUSTER_SIZE (1UL << MEMO_CLUSTER_SHIFT)
743: #define MEMO_CLUSTER_MASK (MEMO_CLUSTER_SIZE-1)
744:
745: typedef u_long m_addr_t; /* Enough bits to bit-hack addresses */
746: typedef pcidev_t m_bush_t; /* Something that addresses DMAable */
747:
748: typedef struct m_link { /* Link between free memory chunks */
749: struct m_link *next;
750: } m_link_s;
751:
752: #ifdef SCSI_NCR_DYNAMIC_DMA_MAPPING
753: typedef struct m_vtob { /* Virtual to Bus address translation */
754: struct m_vtob *next;
755: m_addr_t vaddr;
756: m_addr_t baddr;
757: } m_vtob_s;
758: #define VTOB_HASH_SHIFT 5
759: #define VTOB_HASH_SIZE (1UL << VTOB_HASH_SHIFT)
760: #define VTOB_HASH_MASK (VTOB_HASH_SIZE-1)
761: #define VTOB_HASH_CODE(m) \
762: ((((m_addr_t) (m)) >> MEMO_CLUSTER_SHIFT) & VTOB_HASH_MASK)
763: #endif
764:
765: typedef struct m_pool { /* Memory pool of a given kind */
766: #ifdef SCSI_NCR_DYNAMIC_DMA_MAPPING
767: m_bush_t bush;
768: m_addr_t (*getp)(struct m_pool *);
769: void (*freep)(struct m_pool *, m_addr_t);
770: #define M_GETP() mp->getp(mp)
771: #define M_FREEP(p) mp->freep(mp, p)
772: #define GetPages() __GetFreePages(MEMO_GFP_FLAGS, MEMO_PAGE_ORDER)
773: #define FreePages(p) free_pages(p, MEMO_PAGE_ORDER)
774: int nump;
775: m_vtob_s *(vtob[VTOB_HASH_SIZE]);
776: struct m_pool *next;
777: #else
778: #define M_GETP() __GetFreePages(MEMO_GFP_FLAGS, MEMO_PAGE_ORDER)
779: #define M_FREEP(p) free_pages(p, MEMO_PAGE_ORDER)
780: #endif /* SCSI_NCR_DYNAMIC_DMA_MAPPING */
781: struct m_link h[PAGE_SHIFT-MEMO_SHIFT+MEMO_PAGE_ORDER+1];
782: } m_pool_s;
783:
784: static void *___m_alloc(m_pool_s *mp, int size)
785: {
786: int i = 0;
787: int s = (1 << MEMO_SHIFT);
788: int j;
789: m_addr_t a;
790: m_link_s *h = mp->h;
791:
792: if (size > (PAGE_SIZE << MEMO_PAGE_ORDER))
793: return 0;
794:
795: while (size > s) {
796: s <<= 1;
797: ++i;
798: }
799:
800: j = i;
801: while (!h[j].next) {
802: if (s == (PAGE_SIZE << MEMO_PAGE_ORDER)) {
803: h[j].next = (m_link_s *) M_GETP();
804: if (h[j].next)
805: h[j].next->next = 0;
806: break;
807: }
808: ++j;
809: s <<= 1;
810: }
811: a = (m_addr_t) h[j].next;
812: if (a) {
813: h[j].next = h[j].next->next;
814: while (j > i) {
815: j -= 1;
816: s >>= 1;
817: h[j].next = (m_link_s *) (a+s);
818: h[j].next->next = 0;
819: }
820: }
821: #ifdef DEBUG
822: printk("___m_alloc(%d) = %p\n", size, (void *) a);
823: #endif
824: return (void *) a;
825: }
826:
827: static void ___m_free(m_pool_s *mp, void *ptr, int size)
828: {
829: int i = 0;
830: int s = (1 << MEMO_SHIFT);
831: m_link_s *q;
832: m_addr_t a, b;
833: m_link_s *h = mp->h;
834:
835: #ifdef DEBUG
836: printk("___m_free(%p, %d)\n", ptr, size);
837: #endif
838:
839: if (size > (PAGE_SIZE << MEMO_PAGE_ORDER))
840: return;
841:
842: while (size > s) {
843: s <<= 1;
844: ++i;
845: }
846:
847: a = (m_addr_t) ptr;
848:
849: while (1) {
850: #ifdef MEMO_FREE_UNUSED
851: if (s == (PAGE_SIZE << MEMO_PAGE_ORDER)) {
852: M_FREEP(a);
853: break;
854: }
855: #endif
856: b = a ^ s;
857: q = &h[i];
858: while (q->next && q->next != (m_link_s *) b) {
859: q = q->next;
860: }
861: if (!q->next) {
862: ((m_link_s *) a)->next = h[i].next;
863: h[i].next = (m_link_s *) a;
864: break;
865: }
866: q->next = q->next->next;
867: a = a & b;
868: s <<= 1;
869: ++i;
870: }
871: }
872:
873: static void *__m_calloc2(m_pool_s *mp, int size, char *name, int uflags)
874: {
875: void *p;
876:
877: p = ___m_alloc(mp, size);
878:
879: if (DEBUG_FLAGS & DEBUG_ALLOC)
880: printk ("new %-10s[%4d] @%p.\n", name, size, p);
881:
882: if (p)
883: bzero(p, size);
884: else if (uflags & MEMO_WARN)
885: printk (NAME53C8XX ": failed to allocate %s[%d]\n", name, size);
886:
887: return p;
888: }
889:
890: #define __m_calloc(mp, s, n) __m_calloc2(mp, s, n, MEMO_WARN)
891:
892: static void __m_free(m_pool_s *mp, void *ptr, int size, char *name)
893: {
894: if (DEBUG_FLAGS & DEBUG_ALLOC)
895: printk ("freeing %-10s[%4d] @%p.\n", name, size, ptr);
896:
897: ___m_free(mp, ptr, size);
898:
899: }
900:
901: /*
902: * With pci bus iommu support, we use a default pool of unmapped memory
903: * for memory we donnot need to DMA from/to and one pool per pcidev for
904: * memory accessed by the PCI chip. `mp0' is the default not DMAable pool.
905: */
906:
907: #ifndef SCSI_NCR_DYNAMIC_DMA_MAPPING
908:
909: static m_pool_s mp0;
910:
911: #else
912:
913: static m_addr_t ___mp0_getp(m_pool_s *mp)
914: {
915: m_addr_t m = GetPages();
916: if (m)
917: ++mp->nump;
918: return m;
919: }
920:
921: static void ___mp0_freep(m_pool_s *mp, m_addr_t m)
922: {
923: FreePages(m);
924: --mp->nump;
925: }
926:
927: static m_pool_s mp0 = {0, ___mp0_getp, ___mp0_freep};
928:
929: #endif /* SCSI_NCR_DYNAMIC_DMA_MAPPING */
930:
931: static void *m_calloc(int size, char *name)
932: {
933: u_long flags;
934: void *m;
935: NCR_LOCK_DRIVER(flags);
936: m = __m_calloc(&mp0, size, name);
937: NCR_UNLOCK_DRIVER(flags);
938: return m;
939: }
940:
941: static void m_free(void *ptr, int size, char *name)
942: {
943: u_long flags;
944: NCR_LOCK_DRIVER(flags);
945: __m_free(&mp0, ptr, size, name);
946: NCR_UNLOCK_DRIVER(flags);
947: }
948:
949: /*
950: * DMAable pools.
951: */
952:
953: #ifndef SCSI_NCR_DYNAMIC_DMA_MAPPING
954:
955: /* Without pci bus iommu support, all the memory is assumed DMAable */
956:
957: #define __m_calloc_dma(b, s, n) m_calloc(s, n)
958: #define __m_free_dma(b, p, s, n) m_free(p, s, n)
959: #define __vtobus(b, p) virt_to_bus(p)
960:
961: #else
962:
963: /*
964: * With pci bus iommu support, we maintain one pool per pcidev and a
965: * hashed reverse table for virtual to bus physical address translations.
966: */
967: static m_addr_t ___dma_getp(m_pool_s *mp)
968: {
969: m_addr_t vp;
970: m_vtob_s *vbp;
971:
972: vbp = __m_calloc(&mp0, sizeof(*vbp), "VTOB");
973: if (vbp) {
974: dma_addr_t daddr;
975: vp = (m_addr_t) pci_alloc_consistent(mp->bush,
976: PAGE_SIZE<<MEMO_PAGE_ORDER,
977: &daddr);
978: if (vp) {
979: int hc = VTOB_HASH_CODE(vp);
980: vbp->vaddr = vp;
981: vbp->baddr = daddr;
982: vbp->next = mp->vtob[hc];
983: mp->vtob[hc] = vbp;
984: ++mp->nump;
985: return vp;
986: }
987: else
988: __m_free(&mp0, vbp, sizeof(*vbp), "VTOB");
989: }
990: return 0;
991: }
992:
993: static void ___dma_freep(m_pool_s *mp, m_addr_t m)
994: {
995: m_vtob_s **vbpp, *vbp;
996: int hc = VTOB_HASH_CODE(m);
997:
998: vbpp = &mp->vtob[hc];
999: while (*vbpp && (*vbpp)->vaddr != m)
1000: vbpp = &(*vbpp)->next;
1001: if (*vbpp) {
1002: vbp = *vbpp;
1003: *vbpp = (*vbpp)->next;
1004: pci_free_consistent(mp->bush, PAGE_SIZE<<MEMO_PAGE_ORDER,
1005: (void *)vbp->vaddr, (dma_addr_t)vbp->baddr);
1006: __m_free(&mp0, vbp, sizeof(*vbp), "VTOB");
1007: --mp->nump;
1008: }
1009: }
1010:
1011: static inline m_pool_s *___get_dma_pool(m_bush_t bush)
1012: {
1013: m_pool_s *mp;
1014: for (mp = mp0.next; mp && mp->bush != bush; mp = mp->next);
1015: return mp;
1016: }
1017:
1018: static m_pool_s *___cre_dma_pool(m_bush_t bush)
1019: {
1020: m_pool_s *mp;
1021: mp = __m_calloc(&mp0, sizeof(*mp), "MPOOL");
1022: if (mp) {
1023: bzero(mp, sizeof(*mp));
1024: mp->bush = bush;
1025: mp->getp = ___dma_getp;
1026: mp->freep = ___dma_freep;
1027: mp->next = mp0.next;
1028: mp0.next = mp;
1029: }
1030: return mp;
1031: }
1032:
1033: static void ___del_dma_pool(m_pool_s *p)
1034: {
1035: struct m_pool **pp = &mp0.next;
1036:
1037: while (*pp && *pp != p)
1038: pp = &(*pp)->next;
1039: if (*pp) {
1040: *pp = (*pp)->next;
1041: __m_free(&mp0, p, sizeof(*p), "MPOOL");
1042: }
1043: }
1044:
1045: static void *__m_calloc_dma(m_bush_t bush, int size, char *name)
1046: {
1047: u_long flags;
1048: struct m_pool *mp;
1049: void *m = 0;
1050:
1051: NCR_LOCK_DRIVER(flags);
1052: mp = ___get_dma_pool(bush);
1053: if (!mp)
1054: mp = ___cre_dma_pool(bush);
1055: if (mp)
1056: m = __m_calloc(mp, size, name);
1057: if (mp && !mp->nump)
1058: ___del_dma_pool(mp);
1059: NCR_UNLOCK_DRIVER(flags);
1060:
1061: return m;
1062: }
1063:
1064: static void __m_free_dma(m_bush_t bush, void *m, int size, char *name)
1065: {
1066: u_long flags;
1067: struct m_pool *mp;
1068:
1069: NCR_LOCK_DRIVER(flags);
1070: mp = ___get_dma_pool(bush);
1071: if (mp)
1072: __m_free(mp, m, size, name);
1073: if (mp && !mp->nump)
1074: ___del_dma_pool(mp);
1075: NCR_UNLOCK_DRIVER(flags);
1076: }
1077:
1078: static m_addr_t __vtobus(m_bush_t bush, void *m)
1079: {
1080: u_long flags;
1081: m_pool_s *mp;
1082: int hc = VTOB_HASH_CODE(m);
1083: m_vtob_s *vp = 0;
1084: m_addr_t a = ((m_addr_t) m) & ~MEMO_CLUSTER_MASK;
1085:
1086: NCR_LOCK_DRIVER(flags);
1087: mp = ___get_dma_pool(bush);
1088: if (mp) {
1089: vp = mp->vtob[hc];
1090: while (vp && (m_addr_t) vp->vaddr != a)
1091: vp = vp->next;
1092: }
1093: NCR_UNLOCK_DRIVER(flags);
1094: return vp ? vp->baddr + (((m_addr_t) m) - a) : 0;
1095: }
1096:
1097: #endif /* SCSI_NCR_DYNAMIC_DMA_MAPPING */
1098:
1099: #define _m_calloc_dma(np, s, n) __m_calloc_dma(np->pdev, s, n)
1100: #define _m_free_dma(np, p, s, n) __m_free_dma(np->pdev, p, s, n)
1101: #define m_calloc_dma(s, n) _m_calloc_dma(np, s, n)
1102: #define m_free_dma(p, s, n) _m_free_dma(np, p, s, n)
1103: #define _vtobus(np, p) __vtobus(np->pdev, p)
1104: #define vtobus(p) _vtobus(np, p)
1105:
1106: /*
1107: * Deal with DMA mapping/unmapping.
1108: */
1109:
1110: #ifndef SCSI_NCR_DYNAMIC_DMA_MAPPING
1111:
1112: /* Linux versions prior to pci bus iommu kernel interface */
1113:
1114: #define __unmap_scsi_data(pdev, cmd) do {; } while (0)
1115: #define __map_scsi_single_data(pdev, cmd) (__vtobus(pdev,(cmd)->request_buffer))
1116: #define __map_scsi_sg_data(pdev, cmd) ((cmd)->use_sg)
1117: #define __sync_scsi_data(pdev, cmd) do {; } while (0)
1118:
1119: #define scsi_sg_dma_address(sc) vtobus((sc)->address)
1120: #define scsi_sg_dma_len(sc) ((sc)->length)
1121:
1122: #else
1123:
1124: /* Linux version with pci bus iommu kernel interface */
1125:
1126: /* To keep track of the dma mapping (sg/single) that has been set */
1127: #define __data_mapped SCp.phase
1128: #define __data_mapping SCp.have_data_in
1129:
1130: static void __unmap_scsi_data(pcidev_t pdev, Scsi_Cmnd *cmd)
1131: {
1132: int dma_dir = scsi_to_pci_dma_dir(cmd->sc_data_direction);
1133:
1134: switch(cmd->__data_mapped) {
1135: case 2:
1136: pci_unmap_sg(pdev, cmd->buffer, cmd->use_sg, dma_dir);
1137: break;
1138: case 1:
1139: pci_unmap_single(pdev, cmd->__data_mapping,
1140: cmd->request_bufflen, dma_dir);
1141: break;
1142: }
1143: cmd->__data_mapped = 0;
1144: }
1145:
1146: static u_long __map_scsi_single_data(pcidev_t pdev, Scsi_Cmnd *cmd)
1147: {
1148: dma_addr_t mapping;
1149: int dma_dir = scsi_to_pci_dma_dir(cmd->sc_data_direction);
1150:
1151: if (cmd->request_bufflen == 0)
1152: return 0;
1153:
1154: mapping = pci_map_single(pdev, cmd->request_buffer,
1155: cmd->request_bufflen, dma_dir);
1156: cmd->__data_mapped = 1;
1157: cmd->__data_mapping = mapping;
1158:
1159: return mapping;
1160: }
1161:
1162: static int __map_scsi_sg_data(pcidev_t pdev, Scsi_Cmnd *cmd)
1163: {
1164: int use_sg;
1165: int dma_dir = scsi_to_pci_dma_dir(cmd->sc_data_direction);
1166:
1167: if (cmd->use_sg == 0)
1168: return 0;
1169:
1170: use_sg = pci_map_sg(pdev, cmd->buffer, cmd->use_sg, dma_dir);
1171: cmd->__data_mapped = 2;
1172: cmd->__data_mapping = use_sg;
1173:
1174: return use_sg;
1175: }
1176:
1177: static void __sync_scsi_data(pcidev_t pdev, Scsi_Cmnd *cmd)
1178: {
1179: int dma_dir = scsi_to_pci_dma_dir(cmd->sc_data_direction);
1180:
1181: switch(cmd->__data_mapped) {
1182: case 2:
1183: pci_dma_sync_sg(pdev, cmd->buffer, cmd->use_sg, dma_dir);
1184: break;
1185: case 1:
1186: pci_dma_sync_single(pdev, cmd->__data_mapping,
1187: cmd->request_bufflen, dma_dir);
1188: break;
1189: }
1190: }
1191:
1192: #define scsi_sg_dma_address(sc) sg_dma_address(sc)
1193: #define scsi_sg_dma_len(sc) sg_dma_len(sc)
1194:
1195: #endif /* SCSI_NCR_DYNAMIC_DMA_MAPPING */
1196:
1197: #define unmap_scsi_data(np, cmd) __unmap_scsi_data(np->pdev, cmd)
1198: #define map_scsi_single_data(np, cmd) __map_scsi_single_data(np->pdev, cmd)
1199: #define map_scsi_sg_data(np, cmd) __map_scsi_sg_data(np->pdev, cmd)
1200: #define sync_scsi_data(np, cmd) __sync_scsi_data(np->pdev, cmd)
1201:
1202:
1203: /*
1204: * Print out some buffer.
1205: */
1206: static void ncr_print_hex(u_char *p, int n)
1207: {
1208: while (n-- > 0)
1209: printk (" %x", *p++);
1210: }
1211:
1212: static void ncr_printl_hex(char *label, u_char *p, int n)
1213: {
1214: printk("%s", label);
1215: ncr_print_hex(p, n);
1216: printk (".\n");
1217: }
1218:
1219: /*
1220: ** Transfer direction
1221: **
1222: ** Until some linux kernel version near 2.3.40, low-level scsi
1223: ** drivers were not told about data transfer direction.
1224: ** We check the existence of this feature that has been expected
1225: ** for a _long_ time by all SCSI driver developers by just
1226: ** testing against the definition of SCSI_DATA_UNKNOWN. Indeed
1227: ** this is a hack, but testing against a kernel version would
1228: ** have been a shame. ;-)
1229: */
1230: #ifdef SCSI_DATA_UNKNOWN
1231:
1232: #define scsi_data_direction(cmd) (cmd->sc_data_direction)
1233:
1234: #else
1235:
1236: #define SCSI_DATA_UNKNOWN 0
1237: #define SCSI_DATA_WRITE 1
1238: #define SCSI_DATA_READ 2
1239: #define SCSI_DATA_NONE 3
1240:
1241: static __inline__ int scsi_data_direction(Scsi_Cmnd *cmd)
1242: {
1243: int direction;
1244:
1245: switch((int) cmd->cmnd[0]) {
1246: case 0x08: /* READ(6) 08 */
1247: case 0x28: /* READ(10) 28 */
1248: case 0xA8: /* READ(12) A8 */
1249: direction = SCSI_DATA_READ;
1250: break;
1251: case 0x0A: /* WRITE(6) 0A */
1252: case 0x2A: /* WRITE(10) 2A */
1253: case 0xAA: /* WRITE(12) AA */
1254: direction = SCSI_DATA_WRITE;
1255: break;
1256: default:
1257: direction = SCSI_DATA_UNKNOWN;
1258: break;
1259: }
1260:
1261: return direction;
1262: }
1263:
1264: #endif /* SCSI_DATA_UNKNOWN */
1265:
1266: /*
1267: ** Head of list of NCR boards
1268: **
1269: ** For kernel version < 1.3.70, host is retrieved by its irq level.
1270: ** For later kernels, the internal host control block address
1271: ** (struct ncb) is used as device id parameter of the irq stuff.
1272: */
1273:
1274: static struct Scsi_Host *first_host = NULL;
1275:
1276:
1277: /*
1278: ** /proc directory entry and proc_info function
1279: */
1280: #ifdef SCSI_NCR_PROC_INFO_SUPPORT
1281: #if LINUX_VERSION_CODE < LinuxVersionCode(2,3,27)
1282: static struct proc_dir_entry proc_scsi_sym53c8xx = {
1283: PROC_SCSI_SYM53C8XX, 9, NAME53C8XX,
1284: S_IFDIR | S_IRUGO | S_IXUGO, 2
1285: };
1286: #endif
1287: static int sym53c8xx_proc_info(char *buffer, char **start, off_t offset,
1288: int length, int hostno, int func);
1289: #endif
1290:
1291: /*
1292: ** Driver setup.
1293: **
1294: ** This structure is initialized from linux config options.
1295: ** It can be overridden at boot-up by the boot command line.
1296: */
1297: static struct ncr_driver_setup
1298: driver_setup = SCSI_NCR_DRIVER_SETUP;
1299:
1300: #ifdef SCSI_NCR_BOOT_COMMAND_LINE_SUPPORT
1301: static struct ncr_driver_setup
1302: driver_safe_setup __initdata = SCSI_NCR_DRIVER_SAFE_SETUP;
1303: # ifdef MODULE
1304: char *sym53c8xx = 0; /* command line passed by insmod */
1305: # if LINUX_VERSION_CODE >= LinuxVersionCode(2,1,30)
1306: MODULE_PARM(sym53c8xx, "s");
1307: # endif
1308: # endif
1309: #endif
1310:
1311: /*
1312: ** Other Linux definitions
1313: */
1314: #define SetScsiResult(cmd, h_sts, s_sts) \
1315: cmd->result = (((h_sts) << 16) + ((s_sts) & 0x7f))
1316:
1317: /* We may have to remind our amnesiac SCSI layer of the reason of the abort */
1318: #if 0
1319: #define SetScsiAbortResult(cmd) \
1320: SetScsiResult( \
1321: cmd, \
1322: (cmd)->abort_reason == DID_TIME_OUT ? DID_TIME_OUT : DID_ABORT, \
1323: 0xff)
1324: #else
1325: #define SetScsiAbortResult(cmd) SetScsiResult(cmd, DID_ABORT, 0xff)
1326: #endif
1327:
1328: static void sym53c8xx_select_queue_depths(
1329: struct Scsi_Host *host, struct scsi_device *devlist);
1330: static void sym53c8xx_intr(int irq, void *dev_id, struct pt_regs * regs);
1331: static void sym53c8xx_timeout(unsigned long np);
1332:
1333: #define initverbose (driver_setup.verbose)
1334: #define bootverbose (np->verbose)
1335:
1336: #ifdef SCSI_NCR_NVRAM_SUPPORT
1337: static u_char Tekram_sync[16] __initdata =
1338: {25,31,37,43, 50,62,75,125, 12,15,18,21, 6,7,9,10};
1339: #endif /* SCSI_NCR_NVRAM_SUPPORT */
1340:
1341: /*
1342: ** Structures used by sym53c8xx_detect/sym53c8xx_pci_init to
1343: ** transmit device configuration to the ncr_attach() function.
1344: */
1345: typedef struct {
1346: int bus;
1347: u_char device_fn;
1348: u_long base;
1349: u_long base_2;
1350: u_long io_port;
1351: int irq;
1352: /* port and reg fields to use INB, OUTB macros */
1353: u_long base_io;
1354: volatile struct ncr_reg *reg;
1355: } ncr_slot;
1356:
1357: typedef struct {
1358: int type;
1359: #define SCSI_NCR_SYMBIOS_NVRAM (1)
1360: #define SCSI_NCR_TEKRAM_NVRAM (2)
1361: #ifdef SCSI_NCR_NVRAM_SUPPORT
1362: union {
1363: Symbios_nvram Symbios;
1364: Tekram_nvram Tekram;
1365: } data;
1366: #endif
1367: } ncr_nvram;
1368:
1369: /*
1370: ** Structure used by sym53c8xx_detect/sym53c8xx_pci_init
1371: ** to save data on each detected board for ncr_attach().
1372: */
1373: typedef struct {
1374: pcidev_t pdev;
1375: ncr_slot slot;
1376: ncr_chip chip;
1377: ncr_nvram *nvram;
1378: u_char host_id;
1379: #ifdef SCSI_NCR_PQS_PDS_SUPPORT
1380: u_char pqs_pds;
1381: #endif
1382: int attach_done;
1383: } ncr_device;
1384:
1385: /*==========================================================
1386: **
1387: ** assert ()
1388: **
1389: **==========================================================
1390: **
1391: ** modified copy from 386bsd:/usr/include/sys/assert.h
1392: **
1393: **----------------------------------------------------------
1394: */
1395:
1396: #define assert(expression) { \
1397: if (!(expression)) { \
1398: (void)panic( \
1399: "assertion \"%s\" failed: file \"%s\", line %d\n", \
1400: #expression, \
1401: __FILE__, __LINE__); \
1402: } \
1403: }
1404:
1405: /*==========================================================
1406: **
1407: ** Command control block states.
1408: **
1409: **==========================================================
1410: */
1411:
1412: #define HS_IDLE (0)
1413: #define HS_BUSY (1)
1414: #define HS_NEGOTIATE (2) /* sync/wide data transfer*/
1415: #define HS_DISCONNECT (3) /* Disconnected by target */
1416:
1417: #define HS_DONEMASK (0x80)
1418: #define HS_COMPLETE (4|HS_DONEMASK)
1419: #define HS_SEL_TIMEOUT (5|HS_DONEMASK) /* Selection timeout */
1420: #define HS_RESET (6|HS_DONEMASK) /* SCSI reset */
1421: #define HS_ABORTED (7|HS_DONEMASK) /* Transfer aborted */
1422: #define HS_TIMEOUT (8|HS_DONEMASK) /* Software timeout */
1423: #define HS_FAIL (9|HS_DONEMASK) /* SCSI or PCI bus errors */
1424: #define HS_UNEXPECTED (10|HS_DONEMASK)/* Unexpected disconnect */
1425:
1426: #define DSA_INVALID 0xffffffff
1427:
1428: /*==========================================================
1429: **
1430: ** Software Interrupt Codes
1431: **
1432: **==========================================================
1433: */
1434:
1435: #define SIR_BAD_STATUS (1)
1436: #define SIR_SEL_ATN_NO_MSG_OUT (2)
1437: #define SIR_MSG_RECEIVED (3)
1438: #define SIR_MSG_WEIRD (4)
1439: #define SIR_NEGO_FAILED (5)
1440: #define SIR_NEGO_PROTO (6)
1441: #define SIR_SCRIPT_STOPPED (7)
1442: #define SIR_REJECT_TO_SEND (8)
1443: #define SIR_SWIDE_OVERRUN (9)
1444: #define SIR_SODL_UNDERRUN (10)
1445: #define SIR_RESEL_NO_MSG_IN (11)
1446: #define SIR_RESEL_NO_IDENTIFY (12)
1447: #define SIR_RESEL_BAD_LUN (13)
1448: #define SIR_TARGET_SELECTED (14)
1449: #define SIR_RESEL_BAD_I_T_L (15)
1450: #define SIR_RESEL_BAD_I_T_L_Q (16)
1451: #define SIR_ABORT_SENT (17)
1452: #define SIR_RESEL_ABORTED (18)
1453: #define SIR_MSG_OUT_DONE (19)
1454: #define SIR_AUTO_SENSE_DONE (20)
1455: #define SIR_DUMMY_INTERRUPT (21)
1456: #define SIR_DATA_OVERRUN (22)
1457: #define SIR_BAD_PHASE (23)
1458: #define SIR_MAX (23)
1459:
1460: /*==========================================================
1461: **
1462: ** Extended error bits.
1463: ** xerr_status field of struct ccb.
1464: **
1465: **==========================================================
1466: */
1467:
1468: #define XE_EXTRA_DATA (1) /* unexpected data phase */
1469: #define XE_BAD_PHASE (2) /* illegal phase (4/5) */
1470: #define XE_PARITY_ERR (4) /* unrecovered SCSI parity error */
1471: #define XE_SODL_UNRUN (1<<3)
1472: #define XE_SWIDE_OVRUN (1<<4)
1473:
1474: /*==========================================================
1475: **
1476: ** Negotiation status.
1477: ** nego_status field of struct ccb.
1478: **
1479: **==========================================================
1480: */
1481:
1482: #define NS_NOCHANGE (0)
1483: #define NS_SYNC (1)
1484: #define NS_WIDE (2)
1485: #define NS_PPR (4)
1486:
1487: /*==========================================================
1488: **
1489: ** "Special features" of targets.
1490: ** quirks field of struct tcb.
1491: ** actualquirks field of struct ccb.
1492: **
1493: **==========================================================
1494: */
1495:
1496: #define QUIRK_AUTOSAVE (0x01)
1497:
1498: /*==========================================================
1499: **
1500: ** Capability bits in Inquire response byte 7.
1501: **
1502: **==========================================================
1503: */
1504:
1505: #define INQ7_QUEUE (0x02)
1506: #define INQ7_SYNC (0x10)
1507: #define INQ7_WIDE16 (0x20)
1508:
1509: /*==========================================================
1510: **
1511: ** A CCB hashed table is used to retrieve CCB address
1512: ** from DSA value.
1513: **
1514: **==========================================================
1515: */
1516:
1517: #define CCB_HASH_SHIFT 8
1518: #define CCB_HASH_SIZE (1UL << CCB_HASH_SHIFT)
1519: #define CCB_HASH_MASK (CCB_HASH_SIZE-1)
1520: #define CCB_HASH_CODE(dsa) (((dsa) >> 11) & CCB_HASH_MASK)
1521:
1522: /*==========================================================
1523: **
1524: ** Declaration of structs.
1525: **
1526: **==========================================================
1527: */
1528:
1529: struct tcb;
1530: struct lcb;
1531: struct ccb;
1532: struct ncb;
1533: struct script;
1534:
1535: typedef struct ncb * ncb_p;
1536: typedef struct tcb * tcb_p;
1537: typedef struct lcb * lcb_p;
1538: typedef struct ccb * ccb_p;
1539:
1540: struct link {
1541: ncrcmd l_cmd;
1542: ncrcmd l_paddr;
1543: };
1544:
1545: struct usrcmd {
1546: u_long target;
1547: u_long lun;
1548: u_long data;
1549: u_long cmd;
1550: };
1551:
1552: #define UC_SETSYNC 10
1553: #define UC_SETTAGS 11
1554: #define UC_SETDEBUG 12
1555: #define UC_SETORDER 13
1556: #define UC_SETWIDE 14
1557: #define UC_SETFLAG 15
1558: #define UC_SETVERBOSE 17
1559: #define UC_RESETDEV 18
1560: #define UC_CLEARDEV 19
1561:
1562: #define UF_TRACE (0x01)
1563: #define UF_NODISC (0x02)
1564: #define UF_NOSCAN (0x04)
1565:
1566: /*========================================================================
1567: **
1568: ** Declaration of structs: target control block
1569: **
1570: **========================================================================
1571: */
1572: struct tcb {
1573: /*----------------------------------------------------------------
1574: ** LUN tables.
1575: ** An array of bus addresses is used on reselection by
1576: ** the SCRIPT.
1577: **----------------------------------------------------------------
1578: */
1579: u_int32 *luntbl; /* lcbs bus address table */
1580: u_int32 b_luntbl; /* bus address of this table */
1581: u_int32 b_lun0; /* bus address of lun0 */
1582: lcb_p l0p; /* lcb of LUN #0 (normal case) */
1583: #if MAX_LUN > 1
1584: lcb_p *lmp; /* Other lcb's [1..MAX_LUN] */
1585: #endif
1586: /*----------------------------------------------------------------
1587: ** Target capabilities.
1588: **----------------------------------------------------------------
1589: */
1590: u_char inq_done; /* Target capabilities received */
1591: u_char inq_byte7; /* Contains these capabilities */
1592:
1593: /*----------------------------------------------------------------
1594: ** Some flags.
1595: **----------------------------------------------------------------
1596: */
1597: u_char to_reset; /* This target is to be reset */
1598:
1599: /*----------------------------------------------------------------
1600: ** Pointer to the ccb used for negotiation.
1601: ** Prevent from starting a negotiation for all queued commands
1602: ** when tagged command queuing is enabled.
1603: **----------------------------------------------------------------
1604: */
1605: ccb_p nego_cp;
1606:
1607: /*----------------------------------------------------------------
1608: ** negotiation of wide and synch transfer and device quirks.
1609: ** sval, wval and uval are read from SCRIPTS and so have alignment
1610: ** constraints.
1611: **----------------------------------------------------------------
1612: */
1613: /*0*/ u_char minsync;
1614: /*1*/ u_char sval;
1615: /*2*/ u_short period;
1616: /*0*/ u_char maxoffs;
1617: /*1*/ u_char quirks;
1618: /*2*/ u_char widedone;
1619: /*3*/ u_char wval;
1620: /*0*/ u_char uval;
1621:
1622: #ifdef SCSI_NCR_INTEGRITY_CHECKING
1623: u_char ic_min_sync;
1624: u_char ic_max_width;
1625: u_char ic_done;
1626: #endif
1627: u_char ic_maximums_set;
1628: u_char ppr_negotiation;
1629:
1630: /*----------------------------------------------------------------
1631: ** User settable limits and options.
1632: ** These limits are read from the NVRAM if present.
1633: **----------------------------------------------------------------
1634: */
1635: u_char usrsync;
1636: u_char usrwide;
1637: u_short usrtags;
1638: u_char usrflag;
1639: };
1640:
1641: /*========================================================================
1642: **
1643: ** Declaration of structs: lun control block
1644: **
1645: **========================================================================
1646: */
1647: struct lcb {
1648: /*----------------------------------------------------------------
1649: ** On reselection, SCRIPTS use this value as a JUMP address
1650: ** after the IDENTIFY has been successfully received.
1651: ** This field is set to 'resel_tag' if TCQ is enabled and
1652: ** to 'resel_notag' if TCQ is disabled.
1653: ** (Must be at zero due to bad lun handling on reselection)
1654: **----------------------------------------------------------------
1655: */
1656: /*0*/ u_int32 resel_task;
1657:
1658: /*----------------------------------------------------------------
1659: ** Task table used by the script processor to retrieve the
1660: ** task corresponding to a reselected nexus. The TAG is used
1661: ** as offset to determine the corresponding entry.
1662: ** Each entry contains the associated CCB bus address.
1663: **----------------------------------------------------------------
1664: */
1665: u_int32 tasktbl_0; /* Used if TCQ not enabled */
1666: u_int32 *tasktbl;
1667: u_int32 b_tasktbl;
1668:
1669: /*----------------------------------------------------------------
1670: ** CCB queue management.
1671: **----------------------------------------------------------------
1672: */
1673: XPT_QUEHEAD busy_ccbq; /* Queue of busy CCBs */
1674: XPT_QUEHEAD wait_ccbq; /* Queue of waiting for IO CCBs */
1675: u_short busyccbs; /* CCBs busy for this lun */
1676: u_short queuedccbs; /* CCBs queued to the controller*/
1677: u_short queuedepth; /* Queue depth for this lun */
1678: u_short scdev_depth; /* SCSI device queue depth */
1679: u_short maxnxs; /* Max possible nexuses */
1680:
1681: /*----------------------------------------------------------------
1682: ** Control of tagged command queuing.
1683: ** Tags allocation is performed using a circular buffer.
1684: ** This avoids using a loop for tag allocation.
1685: **----------------------------------------------------------------
1686: */
1687: u_short ia_tag; /* Tag allocation index */
1688: u_short if_tag; /* Tag release index */
1689: u_char *cb_tags; /* Circular tags buffer */
1690: u_char inq_byte7; /* Store unit CmdQ capability */
1691: u_char usetags; /* Command queuing is active */
1692: u_char to_clear; /* User wants to clear all tasks*/
1693: u_short maxtags; /* Max NR of tags asked by user */
1694: u_short numtags; /* Current number of tags */
1695:
1696: /*----------------------------------------------------------------
1697: ** QUEUE FULL and ORDERED tag control.
1698: **----------------------------------------------------------------
1699: */
1700: u_short num_good; /* Nr of GOOD since QUEUE FULL */
1701: u_short tags_sum[2]; /* Tags sum counters */
1702: u_char tags_si; /* Current index to tags sum */
1703: u_long tags_stime; /* Last time we switch tags_sum */
1704: };
1705:
1706: /*========================================================================
1707: **
1708: ** Declaration of structs: actions for a task.
1709: **
1710: **========================================================================
1711: **
1712: ** It is part of the CCB and is called by the scripts processor to
1713: ** start or restart the data structure (nexus).
1714: **
1715: **------------------------------------------------------------------------
1716: */
1717: struct action {
1718: u_int32 start;
1719: u_int32 restart;
1720: };
1721:
1722: /*========================================================================
1723: **
1724: ** Declaration of structs: Phase mismatch context.
1725: **
1726: **========================================================================
1727: **
1728: ** It is part of the CCB and is used as parameters for the DATA
1729: ** pointer. We need two contexts to handle correctly the SAVED
1730: ** DATA POINTER.
1731: **
1732: **------------------------------------------------------------------------
1733: */
1734: struct pm_ctx {
1735: struct scr_tblmove sg; /* Updated interrupted SG block */
1736: u_int32 ret; /* SCRIPT return address */
1737: };
1738:
1739: /*========================================================================
1740: **
1741: ** Declaration of structs: global HEADER.
1742: **
1743: **========================================================================
1744: **
1745: ** In earlier driver versions, this substructure was copied from the
1746: ** ccb to a global address after selection (or reselection) and copied
1747: ** back before disconnect. Since we are now using LOAD/STORE DSA
1748: ** RELATIVE instructions, the script is able to access directly these
1749: ** fields, and so, this header is no more copied.
1750: **
1751: **------------------------------------------------------------------------
1752: */
1753:
1754: struct head {
1755: /*----------------------------------------------------------------
1756: ** Start and restart SCRIPTS addresses (must be at 0).
1757: **----------------------------------------------------------------
1758: */
1759: struct action go;
1760:
1761: /*----------------------------------------------------------------
1762: ** Saved data pointer.
1763: ** Points to the position in the script responsible for the
1764: ** actual transfer of data.
1765: ** It's written after reception of a SAVE_DATA_POINTER message.
1766: ** The goalpointer points after the last transfer command.
1767: **----------------------------------------------------------------
1768: */
1769: u_int32 savep;
1770: u_int32 lastp;
1771: u_int32 goalp;
1772:
1773: /*----------------------------------------------------------------
1774: ** Alternate data pointer.
1775: ** They are copied back to savep/lastp/goalp by the SCRIPTS
1776: ** when the direction is unknown and the device claims data out.
1777: **----------------------------------------------------------------
1778: */
1779: u_int32 wlastp;
1780: u_int32 wgoalp;
1781:
1782: /*----------------------------------------------------------------
1783: ** Status fields.
1784: **----------------------------------------------------------------
1785: */
1786: u_char status[4]; /* host status */
1787: };
1788:
1789: /*
1790: ** LUN control block lookup.
1791: ** We use a direct pointer for LUN #0, and a table of pointers
1792: ** which is only allocated for devices that support LUN(s) > 0.
1793: */
1794: #if MAX_LUN <= 1
1795: #define ncr_lp(np, tp, lun) (!lun) ? (tp)->l0p : 0
1796: #else
1797: #define ncr_lp(np, tp, lun) \
1798: (!lun) ? (tp)->l0p : (tp)->lmp ? (tp)->lmp[(lun)] : 0
1799: #endif
1800:
1801: /*
1802: ** The status bytes are used by the host and the script processor.
1803: **
1804: ** The four bytes (status[4]) are copied to the scratchb register
1805: ** (declared as scr0..scr3 in ncr_reg.h) just after the select/reselect,
1806: ** and copied back just after disconnecting.
1807: ** Inside the script the XX_REG are used.
1808: */
1809:
1810: /*
1811: ** Last four bytes (script)
1812: */
1813: #define QU_REG scr0
1814: #define HS_REG scr1
1815: #define HS_PRT nc_scr1
1816: #define SS_REG scr2
1817: #define SS_PRT nc_scr2
1818: #define HF_REG scr3
1819: #define HF_PRT nc_scr3
1820:
1821: /*
1822: ** Last four bytes (host)
1823: */
1824: #define actualquirks phys.header.status[0]
1825: #define host_status phys.header.status[1]
1826: #define scsi_status phys.header.status[2]
1827: #define host_flags phys.header.status[3]
1828:
1829: /*
1830: ** Host flags
1831: */
1832: #define HF_IN_PM0 1u
1833: #define HF_IN_PM1 (1u<<1)
1834: #define HF_ACT_PM (1u<<2)
1835: #define HF_DP_SAVED (1u<<3)
1836: #define HF_AUTO_SENSE (1u<<4)
1837: #define HF_DATA_IN (1u<<5)
1838: #define HF_PM_TO_C (1u<<6)
1839: #define HF_EXT_ERR (1u<<7)
1840:
1841: #ifdef SCSI_NCR_IARB_SUPPORT
1842: #define HF_HINT_IARB (1u<<7)
1843: #endif
1844:
1845: /*
1846: ** This one is stolen from QU_REG.:)
1847: */
1848: #define HF_DATA_ST (1u<<7)
1849:
1850: /*==========================================================
1851: **
1852: ** Declaration of structs: Data structure block
1853: **
1854: **==========================================================
1855: **
1856: ** During execution of a ccb by the script processor,
1857: ** the DSA (data structure address) register points
1858: ** to this substructure of the ccb.
1859: ** This substructure contains the header with
1860: ** the script-processor-changable data and
1861: ** data blocks for the indirect move commands.
1862: **
1863: **----------------------------------------------------------
1864: */
1865:
1866: struct dsb {
1867:
1868: /*
1869: ** Header.
1870: */
1871:
1872: struct head header;
1873:
1874: /*
1875: ** Table data for Script
1876: */
1877:
1878: struct scr_tblsel select;
1879: struct scr_tblmove smsg ;
1880: struct scr_tblmove smsg_ext ;
1881: struct scr_tblmove cmd ;
1882: struct scr_tblmove sense ;
1883: struct scr_tblmove wresid;
1884: struct scr_tblmove data [MAX_SCATTER];
1885:
1886: /*
1887: ** Phase mismatch contexts.
1888: ** We need two to handle correctly the
1889: ** SAVED DATA POINTER.
1890: */
1891:
1892: struct pm_ctx pm0;
1893: struct pm_ctx pm1;
1894: };
1895:
1896:
1897: /*========================================================================
1898: **
1899: ** Declaration of structs: Command control block.
1900: **
1901: **========================================================================
1902: */
1903: struct ccb {
1904: /*----------------------------------------------------------------
1905: ** This is the data structure which is pointed by the DSA
1906: ** register when it is executed by the script processor.
1907: ** It must be the first entry.
1908: **----------------------------------------------------------------
1909: */
1910: struct dsb phys;
1911:
1912: /*----------------------------------------------------------------
1913: ** The general SCSI driver provides a
1914: ** pointer to a control block.
1915: **----------------------------------------------------------------
1916: */
1917: Scsi_Cmnd *cmd; /* SCSI command */
1918: u_char cdb_buf[16]; /* Copy of CDB */
1919: u_char sense_buf[64];
1920: int data_len; /* Total data length */
1921: int segments; /* Number of SG segments */
1922:
1923: /*----------------------------------------------------------------
1924: ** Message areas.
1925: ** We prepare a message to be sent after selection.
1926: ** We may use a second one if the command is rescheduled
1927: ** due to CHECK_CONDITION or QUEUE FULL status.
1928: ** Contents are IDENTIFY and SIMPLE_TAG.
1929: ** While negotiating sync or wide transfer,
1930: ** a SDTR or WDTR message is appended.
1931: **----------------------------------------------------------------
1932: */
1933: u_char scsi_smsg [12];
1934: u_char scsi_smsg2[12];
1935:
1936: /*----------------------------------------------------------------
1937: ** Miscellaneous status'.
1938: **----------------------------------------------------------------
1939: */
1940: u_char nego_status; /* Negotiation status */
1941: u_char xerr_status; /* Extended error flags */
1942: u_int32 extra_bytes; /* Extraneous bytes transferred */
1943:
1944: /*----------------------------------------------------------------
1945: ** Saved info for auto-sense
1946: **----------------------------------------------------------------
1947: */
1948: u_char sv_scsi_status;
1949: u_char sv_xerr_status;
1950:
1951: /*----------------------------------------------------------------
1952: ** Other fields.
1953: **----------------------------------------------------------------
1954: */
1955: u_long p_ccb; /* BUS address of this CCB */
1956: u_char sensecmd[6]; /* Sense command */
1957: u_char to_abort; /* This CCB is to be aborted */
1958: u_short tag; /* Tag for this transfer */
1959: /* NO_TAG means no tag */
1960: u_char tags_si; /* Lun tags sum index (0,1) */
1961:
1962: u_char target;
1963: u_char lun;
1964: u_short queued;
1965: ccb_p link_ccb; /* Host adapter CCB chain */
1966: ccb_p link_ccbh; /* Host adapter CCB hash chain */
1967: XPT_QUEHEAD link_ccbq; /* Link to unit CCB queue */
1968: u_int32 startp; /* Initial data pointer */
1969: u_int32 lastp0; /* Initial 'lastp' */
1970: int ext_sg; /* Extreme data pointer, used */
1971: int ext_ofs; /* to calculate the residual. */
1972: int resid;
1973: };
1974:
1975: #define CCB_PHYS(cp,lbl) (cp->p_ccb + offsetof(struct ccb, lbl))
1976:
1977:
1978: /*========================================================================
1979: **
1980: ** Declaration of structs: NCR device descriptor
1981: **
1982: **========================================================================
1983: */
1984: struct ncb {
1985: /*----------------------------------------------------------------
1986: ** Idle task and invalid task actions and their bus
1987: ** addresses.
1988: **----------------------------------------------------------------
1989: */
1990: struct action idletask;
1991: struct action notask;
1992: struct action bad_i_t_l;
1993: struct action bad_i_t_l_q;
1994: u_long p_idletask;
1995: u_long p_notask;
1996: u_long p_bad_i_t_l;
1997: u_long p_bad_i_t_l_q;
1998:
1999: /*----------------------------------------------------------------
2000: ** Dummy lun table to protect us against target returning bad
2001: ** lun number on reselection.
2002: **----------------------------------------------------------------
2003: */
2004: u_int32 *badluntbl; /* Table physical address */
2005: u_int32 resel_badlun; /* SCRIPT handler BUS address */
2006:
2007: /*----------------------------------------------------------------
2008: ** Bit 32-63 of the on-chip RAM bus address in LE format.
2009: ** The START_RAM64 script loads the MMRS and MMWS from this
2010: ** field.
2011: **----------------------------------------------------------------
2012: */
2013: u_int32 scr_ram_seg;
2014:
2015: /*----------------------------------------------------------------
2016: ** CCBs management queues.
2017: **----------------------------------------------------------------
2018: */
2019: Scsi_Cmnd *waiting_list; /* Commands waiting for a CCB */
2020: /* when lcb is not allocated. */
2021: Scsi_Cmnd *done_list; /* Commands waiting for done() */
2022: /* callback to be invoked. */
2023: #if LINUX_VERSION_CODE >= LinuxVersionCode(2,1,93)
2024: spinlock_t smp_lock; /* Lock for SMP threading */
2025: #endif
2026:
2027: /*----------------------------------------------------------------
2028: ** Chip and controller indentification.
2029: **----------------------------------------------------------------
2030: */
2031: int unit; /* Unit number */
2032: char chip_name[8]; /* Chip name */
2033: char inst_name[16]; /* ncb instance name */
2034:
2035: /*----------------------------------------------------------------
2036: ** Initial value of some IO register bits.
2037: ** These values are assumed to have been set by BIOS, and may
2038: ** be used for probing adapter implementation differences.
2039: **----------------------------------------------------------------
2040: */
2041: u_char sv_scntl0, sv_scntl3, sv_dmode, sv_dcntl, sv_ctest3, sv_ctest4,
2042: sv_ctest5, sv_gpcntl, sv_stest2, sv_stest4, sv_stest1, sv_scntl4;
2043:
2044: /*----------------------------------------------------------------
2045: ** Actual initial value of IO register bits used by the
2046: ** driver. They are loaded at initialisation according to
2047: ** features that are to be enabled.
2048: **----------------------------------------------------------------
2049: */
2050: u_char rv_scntl0, rv_scntl3, rv_dmode, rv_dcntl, rv_ctest3, rv_ctest4,
2051: rv_ctest5, rv_stest2, rv_ccntl0, rv_ccntl1, rv_scntl4;
2052:
2053: /*----------------------------------------------------------------
2054: ** Target data.
2055: ** Target control block bus address array used by the SCRIPT
2056: ** on reselection.
2057: **----------------------------------------------------------------
2058: */
2059: struct tcb target[MAX_TARGET];
2060: u_int32 *targtbl;
2061:
2062: /*----------------------------------------------------------------
2063: ** Virtual and physical bus addresses of the chip.
2064: **----------------------------------------------------------------
2065: */
2066: #ifndef SCSI_NCR_PCI_MEM_NOT_SUPPORTED
2067: u_long base_va; /* MMIO base virtual address */
2068: u_long base2_va; /* On-chip RAM virtual address */
2069: #endif
2070: u_long base_ba; /* MMIO base bus address */
2071: u_long base_io; /* IO space base address */
2072: u_long base_ws; /* (MM)IO window size */
2073: u_long base2_ba; /* On-chip RAM bus address */
2074: u_long base2_ws; /* On-chip RAM window size */
2075: u_int irq; /* IRQ number */
2076: volatile /* Pointer to volatile for */
2077: struct ncr_reg *reg; /* memory mapped IO. */
2078:
2079: /*----------------------------------------------------------------
2080: ** SCRIPTS virtual and physical bus addresses.
2081: ** 'script' is loaded in the on-chip RAM if present.
2082: ** 'scripth' stays in main memory for all chips except the
2083: ** 53C895A and 53C896 that provide 8K on-chip RAM.
2084: **----------------------------------------------------------------
2085: */
2086: struct script *script0; /* Copies of script and scripth */
2087: struct scripth *scripth0; /* relocated for this ncb. */
2088: u_long p_script; /* Actual script and scripth */
2089: u_long p_scripth; /* bus addresses. */
2090: u_long p_scripth0;
2091:
2092: /*----------------------------------------------------------------
2093: ** General controller parameters and configuration.
2094: **----------------------------------------------------------------
2095: */
2096: pcidev_t pdev;
2097: u_short device_id; /* PCI device id */
2098: u_char revision_id; /* PCI device revision id */
2099: u_char bus; /* PCI BUS number */
2100: u_char device_fn; /* PCI BUS device and function */
2101: u_char myaddr; /* SCSI id of the adapter */
2102: u_char maxburst; /* log base 2 of dwords burst */
2103: u_char maxwide; /* Maximum transfer width */
2104: u_char minsync; /* Minimum sync period factor */
2105: u_char maxsync; /* Maximum sync period factor */
2106: u_char maxoffs; /* Max scsi offset */
2107: u_char multiplier; /* Clock multiplier (1,2,4) */
2108: u_char clock_divn; /* Number of clock divisors */
2109: u_long clock_khz; /* SCSI clock frequency in KHz */
2110: u_int features; /* Chip features map */
2111:
2112: /*----------------------------------------------------------------
2113: ** Range for the PCI clock frequency measurement result
2114: ** that ensures the algorithm used by the driver can be
2115: ** trusted for the SCSI clock frequency measurement.
2116: ** (Assuming a PCI clock frequency of 33 MHz).
2117: **----------------------------------------------------------------
2118: */
2119: u_int pciclock_min;
2120: u_int pciclock_max;
2121:
2122: /*----------------------------------------------------------------
2123: ** Start queue management.
2124: ** It is filled up by the host processor and accessed by the
2125: ** SCRIPTS processor in order to start SCSI commands.
2126: **----------------------------------------------------------------
2127: */
2128: u_long p_squeue; /* Start queue BUS address */
2129: u_int32 *squeue; /* Start queue virtual address */
2130: u_short squeueput; /* Next free slot of the queue */
2131: u_short actccbs; /* Number of allocated CCBs */
2132: u_short queuedepth; /* Start queue depth */
2133:
2134: /*----------------------------------------------------------------
2135: ** Command completion queue.
2136: ** It is the same size as the start queue to avoid overflow.
2137: **----------------------------------------------------------------
2138: */
2139: u_short dqueueget; /* Next position to scan */
2140: u_int32 *dqueue; /* Completion (done) queue */
2141:
2142: /*----------------------------------------------------------------
2143: ** Timeout handler.
2144: **----------------------------------------------------------------
2145: */
2146: struct timer_list timer; /* Timer handler link header */
2147: u_long lasttime;
2148: u_long settle_time; /* Resetting the SCSI BUS */
2149:
2150: /*----------------------------------------------------------------
2151: ** Debugging and profiling.
2152: **----------------------------------------------------------------
2153: */
2154: struct ncr_reg regdump; /* Register dump */
2155: u_long regtime; /* Time it has been done */
2156:
2157: /*----------------------------------------------------------------
2158: ** Miscellaneous buffers accessed by the scripts-processor.
2159: ** They shall be DWORD aligned, because they may be read or
2160: ** written with a script command.
2161: **----------------------------------------------------------------
2162: */
2163: u_char msgout[12]; /* Buffer for MESSAGE OUT */
2164: u_char msgin [12]; /* Buffer for MESSAGE IN */
2165: u_int32 lastmsg; /* Last SCSI message sent */
2166: u_char scratch; /* Scratch for SCSI receive */
2167:
2168: /*----------------------------------------------------------------
2169: ** Miscellaneous configuration and status parameters.
2170: **----------------------------------------------------------------
2171: */
2172: u_char scsi_mode; /* Current SCSI BUS mode */
2173: u_char order; /* Tag order to use */
2174: u_char verbose; /* Verbosity for this controller*/
2175: u_int32 ncr_cache; /* Used for cache test at init. */
2176: u_long p_ncb; /* BUS address of this NCB */
2177:
2178: /*----------------------------------------------------------------
2179: ** CCB lists and queue.
2180: **----------------------------------------------------------------
2181: */
2182: ccb_p ccbh[CCB_HASH_SIZE]; /* CCB hashed by DSA value */
2183: struct ccb *ccbc; /* CCB chain */
2184: XPT_QUEHEAD free_ccbq; /* Queue of available CCBs */
2185:
2186: /*----------------------------------------------------------------
2187: ** IMMEDIATE ARBITRATION (IARB) control.
2188: ** We keep track in 'last_cp' of the last CCB that has been
2189: ** queued to the SCRIPTS processor and clear 'last_cp' when
2190: ** this CCB completes. If last_cp is not zero at the moment
2191: ** we queue a new CCB, we set a flag in 'last_cp' that is
2192: ** used by the SCRIPTS as a hint for setting IARB.
2193: ** We donnot set more than 'iarb_max' consecutive hints for
2194: ** IARB in order to leave devices a chance to reselect.
2195: ** By the way, any non zero value of 'iarb_max' is unfair. :)
2196: **----------------------------------------------------------------
2197: */
2198: #ifdef SCSI_NCR_IARB_SUPPORT
2199: struct ccb *last_cp; /* Last queud CCB used for IARB */
2200: u_short iarb_max; /* Max. # consecutive IARB hints*/
2201: u_short iarb_count; /* Actual # of these hints */
2202: #endif
2203:
2204: /*----------------------------------------------------------------
2205: ** We need the LCB in order to handle disconnections and
2206: ** to count active CCBs for task management. So, we use
2207: ** a unique CCB for LUNs we donnot have the LCB yet.
2208: ** This queue normally should have at most 1 element.
2209: **----------------------------------------------------------------
2210: */
2211: XPT_QUEHEAD b0_ccbq;
2212:
2213: /*----------------------------------------------------------------
2214: ** We use a different scatter function for 896 rev 1.
2215: **----------------------------------------------------------------
2216: */
2217: int (*scatter) (ncb_p, ccb_p, Scsi_Cmnd *);
2218:
2219: /*----------------------------------------------------------------
2220: ** Command abort handling.
2221: ** We need to synchronize tightly with the SCRIPTS
2222: ** processor in order to handle things correctly.
2223: **----------------------------------------------------------------
2224: */
2225: u_char abrt_msg[4]; /* Message to send buffer */
2226: struct scr_tblmove abrt_tbl; /* Table for the MOV of it */
2227: struct scr_tblsel abrt_sel; /* Sync params for selection */
2228: u_char istat_sem; /* Tells the chip to stop (SEM) */
2229:
2230: /*----------------------------------------------------------------
2231: ** Fields that should be removed or changed.
2232: **----------------------------------------------------------------
2233: */
2234: struct usrcmd user; /* Command from user */
2235: volatile u_char release_stage; /* Synchronisation stage on release */
2236:
2237: /*----------------------------------------------------------------
2238: ** Fields that are used (primarily) for integrity check
2239: **----------------------------------------------------------------
2240: */
2241: unsigned char check_integrity; /* Enable midlayer integ. check on
2242: * bus scan. */
2243: #ifdef SCSI_NCR_INTEGRITY_CHECKING
2244: unsigned char check_integ_par; /* Set if par or Init. Det. error
2245: * used only during integ check */
2246: #endif
2247: };
2248:
2249: #define NCB_PHYS(np, lbl) (np->p_ncb + offsetof(struct ncb, lbl))
2250: #define NCB_SCRIPT_PHYS(np,lbl) (np->p_script + offsetof (struct script, lbl))
2251: #define NCB_SCRIPTH_PHYS(np,lbl) (np->p_scripth + offsetof (struct scripth,lbl))
2252: #define NCB_SCRIPTH0_PHYS(np,lbl) (np->p_scripth0+offsetof (struct scripth,lbl))
2253:
2254: /*==========================================================
2255: **
2256: **
2257: ** Script for NCR-Processor.
2258: **
2259: ** Use ncr_script_fill() to create the variable parts.
2260: ** Use ncr_script_copy_and_bind() to make a copy and
2261: ** bind to physical addresses.
2262: **
2263: **
2264: **==========================================================
2265: **
2266: ** We have to know the offsets of all labels before
2267: ** we reach them (for forward jumps).
2268: ** Therefore we declare a struct here.
2269: ** If you make changes inside the script,
2270: ** DONT FORGET TO CHANGE THE LENGTHS HERE!
2271: **
2272: **----------------------------------------------------------
2273: */
2274:
2275: /*
2276: ** Script fragments which are loaded into the on-chip RAM
2277: ** of 825A, 875, 876, 895, 895A and 896 chips.
2278: */
2279: struct script {
2280: ncrcmd start [ 14];
2281: ncrcmd getjob_begin [ 4];
2282: ncrcmd getjob_end [ 4];
2283: ncrcmd select [ 8];
2284: ncrcmd wf_sel_done [ 2];
2285: ncrcmd send_ident [ 2];
2286: #ifdef SCSI_NCR_IARB_SUPPORT
2287: ncrcmd select2 [ 8];
2288: #else
2289: ncrcmd select2 [ 2];
2290: #endif
2291: ncrcmd command [ 2];
2292: ncrcmd dispatch [ 28];
2293: ncrcmd sel_no_cmd [ 10];
2294: ncrcmd init [ 6];
2295: ncrcmd clrack [ 4];
2296: ncrcmd disp_status [ 4];
2297: ncrcmd datai_done [ 26];
2298: ncrcmd datao_done [ 12];
2299: ncrcmd ign_i_w_r_msg [ 4];
2300: ncrcmd datai_phase [ 2];
2301: ncrcmd datao_phase [ 4];
2302: ncrcmd msg_in [ 2];
2303: ncrcmd msg_in2 [ 10];
2304: #ifdef SCSI_NCR_IARB_SUPPORT
2305: ncrcmd status [ 14];
2306: #else
2307: ncrcmd status [ 10];
2308: #endif
2309: ncrcmd complete [ 8];
2310: #ifdef SCSI_NCR_PCIQ_MAY_REORDER_WRITES
2311: ncrcmd complete2 [ 12];
2312: #else
2313: ncrcmd complete2 [ 10];
2314: #endif
2315: #ifdef SCSI_NCR_PCIQ_SYNC_ON_INTR
2316: ncrcmd done [ 18];
2317: #else
2318: ncrcmd done [ 14];
2319: #endif
2320: ncrcmd done_end [ 2];
2321: ncrcmd save_dp [ 8];
2322: ncrcmd restore_dp [ 4];
2323: ncrcmd disconnect [ 20];
2324: #ifdef SCSI_NCR_IARB_SUPPORT
2325: ncrcmd idle [ 4];
2326: #else
2327: ncrcmd idle [ 2];
2328: #endif
2329: #ifdef SCSI_NCR_IARB_SUPPORT
2330: ncrcmd ungetjob [ 6];
2331: #else
2332: ncrcmd ungetjob [ 4];
2333: #endif
2334: ncrcmd reselect [ 4];
2335: ncrcmd reselected [ 20];
2336: ncrcmd resel_scntl4 [ 30];
2337: #if MAX_TASKS*4 > 512
2338: ncrcmd resel_tag [ 18];
2339: #elif MAX_TASKS*4 > 256
2340: ncrcmd resel_tag [ 12];
2341: #else
2342: ncrcmd resel_tag [ 8];
2343: #endif
2344: ncrcmd resel_go [ 6];
2345: ncrcmd resel_notag [ 2];
2346: ncrcmd resel_dsa [ 8];
2347: ncrcmd data_in [MAX_SCATTER * SCR_SG_SIZE];
2348: ncrcmd data_in2 [ 4];
2349: ncrcmd data_out [MAX_SCATTER * SCR_SG_SIZE];
2350: ncrcmd data_out2 [ 4];
2351: ncrcmd pm0_data [ 12];
2352: ncrcmd pm0_data_out [ 6];
2353: ncrcmd pm0_data_end [ 6];
2354: ncrcmd pm1_data [ 12];
2355: ncrcmd pm1_data_out [ 6];
2356: ncrcmd pm1_data_end [ 6];
2357: };
2358:
2359: /*
2360: ** Script fragments which stay in main memory for all chips
2361: ** except for the 895A and 896 that support 8K on-chip RAM.
2362: */
2363: struct scripth {
2364: ncrcmd start64 [ 2];
2365: ncrcmd no_data [ 2];
2366: ncrcmd sel_for_abort [ 18];
2367: ncrcmd sel_for_abort_1 [ 2];
2368: ncrcmd select_no_atn [ 8];
2369: ncrcmd wf_sel_done_no_atn [ 4];
2370:
2371: ncrcmd msg_in_etc [ 14];
2372: ncrcmd msg_received [ 4];
2373: ncrcmd msg_weird_seen [ 4];
2374: ncrcmd msg_extended [ 20];
2375: ncrcmd msg_bad [ 6];
2376: ncrcmd msg_weird [ 4];
2377: ncrcmd msg_weird1 [ 8];
2378:
2379: ncrcmd wdtr_resp [ 6];
2380: ncrcmd send_wdtr [ 4];
2381: ncrcmd sdtr_resp [ 6];
2382: ncrcmd send_sdtr [ 4];
2383: ncrcmd ppr_resp [ 6];
2384: ncrcmd send_ppr [ 4];
2385: ncrcmd nego_bad_phase [ 4];
2386: ncrcmd msg_out [ 4];
2387: ncrcmd msg_out_done [ 4];
2388: ncrcmd data_ovrun [ 2];
2389: ncrcmd data_ovrun1 [ 22];
2390: ncrcmd data_ovrun2 [ 8];
2391: ncrcmd abort_resel [ 16];
2392: ncrcmd resend_ident [ 4];
2393: ncrcmd ident_break [ 4];
2394: ncrcmd ident_break_atn [ 4];
2395: ncrcmd sdata_in [ 6];
2396: ncrcmd data_io [ 2];
2397: ncrcmd data_io_com [ 8];
2398: ncrcmd data_io_out [ 12];
2399: ncrcmd resel_bad_lun [ 4];
2400: ncrcmd bad_i_t_l [ 4];
2401: ncrcmd bad_i_t_l_q [ 4];
2402: ncrcmd bad_status [ 6];
2403: ncrcmd tweak_pmj [ 12];
2404: ncrcmd pm_handle [ 20];
2405: ncrcmd pm_handle1 [ 4];
2406: ncrcmd pm_save [ 4];
2407: ncrcmd pm0_save [ 14];
2408: ncrcmd pm1_save [ 14];
2409:
2410: /* WSR handling */
2411: #ifdef SYM_DEBUG_PM_WITH_WSR
2412: ncrcmd pm_wsr_handle [ 44];
2413: #else
2414: ncrcmd pm_wsr_handle [ 42];
2415: #endif
2416: ncrcmd wsr_ma_helper [ 4];
2417:
2418: /* Data area */
2419: ncrcmd zero [ 1];
2420: ncrcmd scratch [ 1];
2421: ncrcmd scratch1 [ 1];
2422: ncrcmd pm0_data_addr [ 1];
2423: ncrcmd pm1_data_addr [ 1];
2424: ncrcmd saved_dsa [ 1];
2425: ncrcmd saved_drs [ 1];
2426: ncrcmd done_pos [ 1];
2427: ncrcmd startpos [ 1];
2428: ncrcmd targtbl [ 1];
2429: /* End of data area */
2430:
2431: #ifdef SCSI_NCR_PCI_MEM_NOT_SUPPORTED
2432: ncrcmd start_ram [ 1];
2433: ncrcmd script0_ba [ 4];
2434: ncrcmd start_ram64 [ 3];
2435: ncrcmd script0_ba64 [ 3];
2436: ncrcmd scripth0_ba64 [ 6];
2437: ncrcmd ram_seg64 [ 1];
2438: #endif
2439: ncrcmd snooptest [ 6];
2440: ncrcmd snoopend [ 2];
2441: };
2442:
2443: /*==========================================================
2444: **
2445: **
2446: ** Function headers.
2447: **
2448: **
2449: **==========================================================
2450: */
2451:
2452: static ccb_p ncr_alloc_ccb (ncb_p np);
2453: static void ncr_complete (ncb_p np, ccb_p cp);
2454: static void ncr_exception (ncb_p np);
2455: static void ncr_free_ccb (ncb_p np, ccb_p cp);
2456: static ccb_p ncr_ccb_from_dsa(ncb_p np, u_long dsa);
2457: static void ncr_init_tcb (ncb_p np, u_char tn);
2458: static lcb_p ncr_alloc_lcb (ncb_p np, u_char tn, u_char ln);
2459: static lcb_p ncr_setup_lcb (ncb_p np, u_char tn, u_char ln,
2460: u_char *inq_data);
2461: static void ncr_getclock (ncb_p np, int mult);
2462: static u_int ncr_getpciclock (ncb_p np);
2463: static void ncr_selectclock (ncb_p np, u_char scntl3);
2464: static ccb_p ncr_get_ccb (ncb_p np, u_char tn, u_char ln);
2465: static void ncr_init (ncb_p np, int reset, char * msg, u_long code);
2466: static void ncr_int_sbmc (ncb_p np);
2467: static void ncr_int_par (ncb_p np, u_short sist);
2468: static void ncr_int_ma (ncb_p np);
2469: static void ncr_int_sir (ncb_p np);
2470: static void ncr_int_sto (ncb_p np);
2471: static void ncr_int_udc (ncb_p np);
2472: static void ncr_negotiate (ncb_p np, tcb_p tp);
2473: static int ncr_prepare_nego(ncb_p np, ccb_p cp, u_char *msgptr);
2474: #ifdef SCSI_NCR_INTEGRITY_CHECKING
2475: static int ncr_ic_nego(ncb_p np, ccb_p cp, Scsi_Cmnd *cmd, u_char *msgptr);
2476: #endif
2477: static void ncr_script_copy_and_bind
2478: (ncb_p np, ncrcmd *src, ncrcmd *dst, int len);
2479: static void ncr_script_fill (struct script * scr, struct scripth * scripth);
2480: static int ncr_scatter_896R1 (ncb_p np, ccb_p cp, Scsi_Cmnd *cmd);
2481: static int ncr_scatter (ncb_p np, ccb_p cp, Scsi_Cmnd *cmd);
2482: static void ncr_getsync (ncb_p np, u_char sfac, u_char *fakp, u_char *scntl3p);
2483: static void ncr_get_xfer_info(ncb_p np, tcb_p tp, u_char *factor, u_char *offset, u_char *width);
2484: static void ncr_setsync (ncb_p np, ccb_p cp, u_char scntl3, u_char sxfer, u_char scntl4);
2485: static void ncr_set_sync_wide_status (ncb_p np, u_char target);
2486: static void ncr_setup_tags (ncb_p np, u_char tn, u_char ln);
2487: static void ncr_setwide (ncb_p np, ccb_p cp, u_char wide, u_char ack);
2488: static void ncr_setsyncwide (ncb_p np, ccb_p cp, u_char scntl3, u_char sxfer, u_char scntl4, u_char wide);
2489: static int ncr_show_msg (u_char * msg);
2490: static void ncr_print_msg (ccb_p cp, char *label, u_char * msg);
2491: static int ncr_snooptest (ncb_p np);
2492: static void ncr_timeout (ncb_p np);
2493: static void ncr_wakeup (ncb_p np, u_long code);
2494: static int ncr_wakeup_done (ncb_p np);
2495: static void ncr_start_next_ccb (ncb_p np, lcb_p lp, int maxn);
2496: static void ncr_put_start_queue(ncb_p np, ccb_p cp);
2497: static void ncr_chip_reset (ncb_p np);
2498: static void ncr_soft_reset (ncb_p np);
2499: static void ncr_start_reset (ncb_p np);
2500: static int ncr_reset_scsi_bus (ncb_p np, int enab_int, int settle_delay);
2501: static int ncr_compute_residual (ncb_p np, ccb_p cp);
2502:
2503: #ifdef SCSI_NCR_USER_COMMAND_SUPPORT
2504: static void ncr_usercmd (ncb_p np);
2505: #endif
2506:
2507: static int ncr_attach (Scsi_Host_Template *tpnt, int unit, ncr_device *device);
2508: static void ncr_free_resources(ncb_p np);
2509:
2510: static void insert_into_waiting_list(ncb_p np, Scsi_Cmnd *cmd);
2511: static Scsi_Cmnd *retrieve_from_waiting_list(int to_remove, ncb_p np, Scsi_Cmnd *cmd);
2512: static void process_waiting_list(ncb_p np, int sts);
2513:
2514: #define remove_from_waiting_list(np, cmd) \
2515: retrieve_from_waiting_list(1, (np), (cmd))
2516: #define requeue_waiting_list(np) process_waiting_list((np), DID_OK)
2517: #define reset_waiting_list(np) process_waiting_list((np), DID_RESET)
2518:
2519: #ifdef SCSI_NCR_NVRAM_SUPPORT
2520: static void ncr_get_nvram (ncr_device *devp, ncr_nvram *nvp);
2521: static int sym_read_Tekram_nvram (ncr_slot *np, u_short device_id,
2522: Tekram_nvram *nvram);
2523: static int sym_read_Symbios_nvram (ncr_slot *np, Symbios_nvram *nvram);
2524: #endif
2525:
2526: /*==========================================================
2527: **
2528: **
2529: ** Global static data.
2530: **
2531: **
2532: **==========================================================
2533: */
2534:
2535: static inline char *ncr_name (ncb_p np)
2536: {
2537: return np->inst_name;
2538: }
2539:
2540:
2541: /*==========================================================
2542: **
2543: **
2544: ** Scripts for NCR-Processor.
2545: **
2546: ** Use ncr_script_bind for binding to physical addresses.
2547: **
2548: **
2549: **==========================================================
2550: **
2551: ** NADDR generates a reference to a field of the controller data.
2552: ** PADDR generates a reference to another part of the script.
2553: ** RADDR generates a reference to a script processor register.
2554: ** FADDR generates a reference to a script processor register
2555: ** with offset.
2556: **
2557: **----------------------------------------------------------
2558: */
2559:
2560: #define RELOC_SOFTC 0x40000000
2561: #define RELOC_LABEL 0x50000000
2562: #define RELOC_REGISTER 0x60000000
2563: #if 0
2564: #define RELOC_KVAR 0x70000000
2565: #endif
2566: #define RELOC_LABELH 0x80000000
2567: #define RELOC_MASK 0xf0000000
2568:
2569: #define NADDR(label) (RELOC_SOFTC | offsetof(struct ncb, label))
2570: #define PADDR(label) (RELOC_LABEL | offsetof(struct script, label))
2571: #define PADDRH(label) (RELOC_LABELH | offsetof(struct scripth, label))
2572: #define RADDR(label) (RELOC_REGISTER | REG(label))
2573: #define FADDR(label,ofs)(RELOC_REGISTER | ((REG(label))+(ofs)))
2574: #define KVAR(which) (RELOC_KVAR | (which))
2575:
2576: #define SCR_DATA_ZERO 0xf00ff00f
2577:
2578: #ifdef RELOC_KVAR
2579: #define SCRIPT_KVAR_JIFFIES (0)
2580: #define SCRIPT_KVAR_FIRST SCRIPT_KVAR_JIFFIES
2581: #define SCRIPT_KVAR_LAST SCRIPT_KVAR_JIFFIES
2582: /*
2583: * Kernel variables referenced in the scripts.
2584: * THESE MUST ALL BE ALIGNED TO A 4-BYTE BOUNDARY.
2585: */
2586: static void *script_kvars[] __initdata =
2587: { (void *)&jiffies };
2588: #endif
2589:
2590: static struct script script0 __initdata = {
2591: /*--------------------------< START >-----------------------*/ {
2592: /*
2593: ** This NOP will be patched with LED ON
2594: ** SCR_REG_REG (gpreg, SCR_AND, 0xfe)
2595: */
2596: SCR_NO_OP,
2597: 0,
2598: /*
2599: ** Clear SIGP.
2600: */
2601: SCR_FROM_REG (ctest2),
2602: 0,
2603:
2604: /*
2605: ** Stop here if the C code wants to perform
2606: ** some error recovery procedure manually.
2607: ** (Indicate this by setting SEM in ISTAT)
2608: */
2609: SCR_FROM_REG (istat),
2610: 0,
2611: /*
2612: ** Report to the C code the next position in
2613: ** the start queue the SCRIPTS will schedule.
2614: ** The C code must not change SCRATCHA.
2615: */
2616: SCR_LOAD_ABS (scratcha, 4),
2617: PADDRH (startpos),
2618: SCR_INT ^ IFTRUE (MASK (SEM, SEM)),
2619: SIR_SCRIPT_STOPPED,
2620:
2621: /*
2622: ** Start the next job.
2623: **
2624: ** @DSA = start point for this job.
2625: ** SCRATCHA = address of this job in the start queue.
2626: **
2627: ** We will restore startpos with SCRATCHA if we fails the
2628: ** arbitration or if it is the idle job.
2629: **
2630: ** The below GETJOB_BEGIN to GETJOB_END section of SCRIPTS
2631: ** is a critical path. If it is partially executed, it then
2632: ** may happen that the job address is not yet in the DSA
2633: ** and the the next queue position points to the next JOB.
2634: */
2635: SCR_LOAD_ABS (dsa, 4),
2636: PADDRH (startpos),
2637: SCR_LOAD_REL (temp, 4),
2638: 4,
2639: }/*-------------------------< GETJOB_BEGIN >------------------*/,{
2640: SCR_STORE_ABS (temp, 4),
2641: PADDRH (startpos),
2642: SCR_LOAD_REL (dsa, 4),
2643: 0,
2644: }/*-------------------------< GETJOB_END >--------------------*/,{
2645: SCR_LOAD_REL (temp, 4),
2646: 0,
2647: SCR_RETURN,
2648: 0,
2649:
2650: }/*-------------------------< SELECT >----------------------*/,{
2651: /*
2652: ** DSA contains the address of a scheduled
2653: ** data structure.
2654: **
2655: ** SCRATCHA contains the address of the start queue
2656: ** entry which points to the next job.
2657: **
2658: ** Set Initiator mode.
2659: **
2660: ** (Target mode is left as an exercise for the reader)
2661: */
2662:
2663: SCR_CLR (SCR_TRG),
2664: 0,
2665: /*
2666: ** And try to select this target.
2667: */
2668: SCR_SEL_TBL_ATN ^ offsetof (struct dsb, select),
2669: PADDR (ungetjob),
2670: /*
2671: ** Now there are 4 possibilities:
2672: **
2673: ** (1) The ncr looses arbitration.
2674: ** This is ok, because it will try again,
2675: ** when the bus becomes idle.
2676: ** (But beware of the timeout function!)
2677: **
2678: ** (2) The ncr is reselected.
2679: ** Then the script processor takes the jump
2680: ** to the RESELECT label.
2681: **
2682: ** (3) The ncr wins arbitration.
2683: ** Then it will execute SCRIPTS instruction until
2684: ** the next instruction that checks SCSI phase.
2685: ** Then will stop and wait for selection to be
2686: ** complete or selection time-out to occur.
2687: **
2688: ** After having won arbitration, the ncr SCRIPTS
2689: ** processor is able to execute instructions while
2690: ** the SCSI core is performing SCSI selection. But
2691: ** some script instruction that is not waiting for
2692: ** a valid phase (or selection timeout) to occur
2693: ** breaks the selection procedure, by probably
2694: ** affecting timing requirements.
2695: ** So we have to wait immediately for the next phase
2696: ** or the selection to complete or time-out.
2697: */
2698:
2699: /*
2700: ** load the savep (saved pointer) into
2701: ** the actual data pointer.
2702: */
2703: SCR_LOAD_REL (temp, 4),
2704: offsetof (struct ccb, phys.header.savep),
2705: /*
2706: ** Initialize the status registers
2707: */
2708: SCR_LOAD_REL (scr0, 4),
2709: offsetof (struct ccb, phys.header.status),
2710:
2711: }/*-------------------------< WF_SEL_DONE >----------------------*/,{
2712: SCR_INT ^ IFFALSE (WHEN (SCR_MSG_OUT)),
2713: SIR_SEL_ATN_NO_MSG_OUT,
2714: }/*-------------------------< SEND_IDENT >----------------------*/,{
2715: /*
2716: ** Selection complete.
2717: ** Send the IDENTIFY and SIMPLE_TAG messages
2718: ** (and the M_X_SYNC_REQ / M_X_WIDE_REQ message)
2719: */
2720: SCR_MOVE_TBL ^ SCR_MSG_OUT,
2721: offsetof (struct dsb, smsg),
2722: }/*-------------------------< SELECT2 >----------------------*/,{
2723: #ifdef SCSI_NCR_IARB_SUPPORT
2724: /*
2725: ** Set IMMEDIATE ARBITRATION if we have been given
2726: ** a hint to do so. (Some job to do after this one).
2727: */
2728: SCR_FROM_REG (HF_REG),
2729: 0,
2730: SCR_JUMPR ^ IFFALSE (MASK (HF_HINT_IARB, HF_HINT_IARB)),
2731: 8,
2732: SCR_REG_REG (scntl1, SCR_OR, IARB),
2733: 0,
2734: #endif
2735: /*
2736: ** Anticipate the COMMAND phase.
2737: ** This is the PHASE we expect at this point.
2738: */
2739: SCR_JUMP ^ IFFALSE (WHEN (SCR_COMMAND)),
2740: PADDR (sel_no_cmd),
2741:
2742: }/*-------------------------< COMMAND >--------------------*/,{
2743: /*
2744: ** ... and send the command
2745: */
2746: SCR_MOVE_TBL ^ SCR_COMMAND,
2747: offsetof (struct dsb, cmd),
2748:
2749: }/*-----------------------< DISPATCH >----------------------*/,{
2750: /*
2751: ** MSG_IN is the only phase that shall be
2752: ** entered at least once for each (re)selection.
2753: ** So we test it first.
2754: */
2755: SCR_JUMP ^ IFTRUE (WHEN (SCR_MSG_IN)),
2756: PADDR (msg_in),
2757: SCR_JUMP ^ IFTRUE (IF (SCR_DATA_OUT)),
2758: PADDR (datao_phase),
2759: SCR_JUMP ^ IFTRUE (IF (SCR_DATA_IN)),
2760: PADDR (datai_phase),
2761: SCR_JUMP ^ IFTRUE (IF (SCR_STATUS)),
2762: PADDR (status),
2763: SCR_JUMP ^ IFTRUE (IF (SCR_COMMAND)),
2764: PADDR (command),
2765: SCR_JUMP ^ IFTRUE (IF (SCR_MSG_OUT)),
2766: PADDRH (msg_out),
2767: /*
2768: * Discard as many illegal phases as
2769: * required and tell the C code about.
2770: */
2771: SCR_JUMPR ^ IFFALSE (WHEN (SCR_ILG_OUT)),
2772: 16,
2773: SCR_MOVE_ABS (1) ^ SCR_ILG_OUT,
2774: NADDR (scratch),
2775: SCR_JUMPR ^ IFTRUE (WHEN (SCR_ILG_OUT)),
2776: -16,
2777: SCR_JUMPR ^ IFFALSE (WHEN (SCR_ILG_IN)),
2778: 16,
2779: SCR_MOVE_ABS (1) ^ SCR_ILG_IN,
2780: NADDR (scratch),
2781: SCR_JUMPR ^ IFTRUE (WHEN (SCR_ILG_IN)),
2782: -16,
2783: SCR_INT,
2784: SIR_BAD_PHASE,
2785: SCR_JUMP,
2786: PADDR (dispatch),
2787: }/*---------------------< SEL_NO_CMD >----------------------*/,{
2788: /*
2789: ** The target does not switch to command
2790: ** phase after IDENTIFY has been sent.
2791: **
2792: ** If it stays in MSG OUT phase send it
2793: ** the IDENTIFY again.
2794: */
2795: SCR_JUMP ^ IFTRUE (WHEN (SCR_MSG_OUT)),
2796: PADDRH (resend_ident),
2797: /*
2798: ** If target does not switch to MSG IN phase
2799: ** and we sent a negotiation, assert the
2800: ** failure immediately.
2801: */
2802: SCR_JUMP ^ IFTRUE (WHEN (SCR_MSG_IN)),
2803: PADDR (dispatch),
2804: SCR_FROM_REG (HS_REG),
2805: 0,
2806: SCR_INT ^ IFTRUE (DATA (HS_NEGOTIATE)),
2807: SIR_NEGO_FAILED,
2808: /*
2809: ** Jump to dispatcher.
2810: */
2811: SCR_JUMP,
2812: PADDR (dispatch),
2813:
2814: }/*-------------------------< INIT >------------------------*/,{
2815: /*
2816: ** Wait for the SCSI RESET signal to be
2817: ** inactive before restarting operations,
2818: ** since the chip may hang on SEL_ATN
2819: ** if SCSI RESET is active.
2820: */
2821: SCR_FROM_REG (sstat0),
2822: 0,
2823: SCR_JUMPR ^ IFTRUE (MASK (IRST, IRST)),
2824: -16,
2825: SCR_JUMP,
2826: PADDR (start),
2827: }/*-------------------------< CLRACK >----------------------*/,{
2828: /*
2829: ** Terminate possible pending message phase.
2830: */
2831: SCR_CLR (SCR_ACK),
2832: 0,
2833: SCR_JUMP,
2834: PADDR (dispatch),
2835:
2836: }/*-------------------------< DISP_STATUS >----------------------*/,{
2837: /*
2838: ** Anticipate STATUS phase.
2839: **
2840: ** Does spare 3 SCRIPTS instructions when we have
2841: ** completed the INPUT of the data.
2842: */
2843: SCR_JUMP ^ IFTRUE (WHEN (SCR_STATUS)),
2844: PADDR (status),
2845: SCR_JUMP,
2846: PADDR (dispatch),
2847:
2848: }/*-------------------------< DATAI_DONE >-------------------*/,{
2849: /*
2850: * If the device wants us to send more data,
2851: * we must count the extra bytes.
2852: */
2853: SCR_JUMP ^ IFTRUE (WHEN (SCR_DATA_IN)),
2854: PADDRH (data_ovrun),
2855: /*
2856: ** If the SWIDE is not full, jump to dispatcher.
2857: ** We anticipate a STATUS phase.
2858: ** If we get later an IGNORE WIDE RESIDUE, we
2859: ** will alias it as a MODIFY DP (-1).
2860: */
2861: SCR_FROM_REG (scntl2),
2862: 0,
2863: SCR_JUMP ^ IFFALSE (MASK (WSR, WSR)),
2864: PADDR (disp_status),
2865: /*
2866: ** The SWIDE is full.
2867: ** Clear this condition.
2868: */
2869: SCR_REG_REG (scntl2, SCR_OR, WSR),
2870: 0,
2871: /*
2872: * We are expecting an IGNORE RESIDUE message
2873: * from the device, otherwise we are in data
2874: * overrun condition. Check against MSG_IN phase.
2875: */
2876: SCR_INT ^ IFFALSE (WHEN (SCR_MSG_IN)),
2877: SIR_SWIDE_OVERRUN,
2878: SCR_JUMP ^ IFFALSE (WHEN (SCR_MSG_IN)),
2879: PADDR (disp_status),
2880: /*
2881: * We are in MSG_IN phase,
2882: * Read the first byte of the message.
2883: * If it is not an IGNORE RESIDUE message,
2884: * signal overrun and jump to message
2885: * processing.
2886: */
2887: SCR_MOVE_ABS (1) ^ SCR_MSG_IN,
2888: NADDR (msgin[0]),
2889: SCR_INT ^ IFFALSE (DATA (M_IGN_RESIDUE)),
2890: SIR_SWIDE_OVERRUN,
2891: SCR_JUMP ^ IFFALSE (DATA (M_IGN_RESIDUE)),
2892: PADDR (msg_in2),
2893:
2894: /*
2895: * We got the message we expected.
2896: * Read the 2nd byte, and jump to dispatcher.
2897: */
2898: SCR_CLR (SCR_ACK),
2899: 0,
2900: SCR_MOVE_ABS (1) ^ SCR_MSG_IN,
2901: NADDR (msgin[1]),
2902: SCR_CLR (SCR_ACK),
2903: 0,
2904: SCR_JUMP,
2905: PADDR (disp_status),
2906:
2907: }/*-------------------------< DATAO_DONE >-------------------*/,{
2908: /*
2909: * If the device wants us to send more data,
2910: * we must count the extra bytes.
2911: */
2912: SCR_JUMP ^ IFTRUE (WHEN (SCR_DATA_OUT)),
2913: PADDRH (data_ovrun),
2914: /*
2915: ** If the SODL is not full jump to dispatcher.
2916: ** We anticipate a MSG IN phase or a STATUS phase.
2917: */
2918: SCR_FROM_REG (scntl2),
2919: 0,
2920: SCR_JUMP ^ IFFALSE (MASK (WSS, WSS)),
2921: PADDR (disp_status),
2922: /*
2923: ** The SODL is full, clear this condition.
2924: */
2925: SCR_REG_REG (scntl2, SCR_OR, WSS),
2926: 0,
2927: /*
2928: ** And signal a DATA UNDERRUN condition
2929: ** to the C code.
2930: */
2931: SCR_INT,
2932: SIR_SODL_UNDERRUN,
2933: SCR_JUMP,
2934: PADDR (dispatch),
2935:
2936: }/*-------------------------< IGN_I_W_R_MSG >--------------*/,{
2937: /*
2938: ** We jump here from the phase mismatch interrupt,
2939: ** When we have a SWIDE and the device has presented
2940: ** a IGNORE WIDE RESIDUE message on the BUS.
2941: ** We just have to throw away this message and then
2942: ** to jump to dispatcher.
2943: */
2944: SCR_MOVE_ABS (2) ^ SCR_MSG_IN,
2945: NADDR (scratch),
2946: /*
2947: ** Clear ACK and jump to dispatcher.
2948: */
2949: SCR_JUMP,
2950: PADDR (clrack),
2951:
2952: }/*-------------------------< DATAI_PHASE >------------------*/,{
2953: SCR_RETURN,
2954: 0,
2955: }/*-------------------------< DATAO_PHASE >------------------*/,{
2956: /*
2957: ** Patch for 53c1010_66 only - to allow A0 part
2958: ** to operate properly in a 33MHz PCI bus.
2959: **
2960: ** SCR_REG_REG(scntl4, SCR_OR, 0x0c),
2961: ** 0,
2962: */
2963: SCR_NO_OP,
2964: 0,
2965: SCR_RETURN,
2966: 0,
2967: }/*-------------------------< MSG_IN >--------------------*/,{
2968: /*
2969: ** Get the first byte of the message.
2970: **
2971: ** The script processor doesn't negate the
2972: ** ACK signal after this transfer.
2973: */
2974: SCR_MOVE_ABS (1) ^ SCR_MSG_IN,
2975: NADDR (msgin[0]),
2976: }/*-------------------------< MSG_IN2 >--------------------*/,{
2977: /*
2978: ** Check first against 1 byte messages
2979: ** that we handle from SCRIPTS.
2980: */
2981: SCR_JUMP ^ IFTRUE (DATA (M_COMPLETE)),
2982: PADDR (complete),
2983: SCR_JUMP ^ IFTRUE (DATA (M_DISCONNECT)),
2984: PADDR (disconnect),
2985: SCR_JUMP ^ IFTRUE (DATA (M_SAVE_DP)),
2986: PADDR (save_dp),
2987: SCR_JUMP ^ IFTRUE (DATA (M_RESTORE_DP)),
2988: PADDR (restore_dp),
2989: /*
2990: ** We handle all other messages from the
2991: ** C code, so no need to waste on-chip RAM
2992: ** for those ones.
2993: */
2994: SCR_JUMP,
2995: PADDRH (msg_in_etc),
2996:
2997: }/*-------------------------< STATUS >--------------------*/,{
2998: /*
2999: ** get the status
3000: */
3001: SCR_MOVE_ABS (1) ^ SCR_STATUS,
3002: NADDR (scratch),
3003: #ifdef SCSI_NCR_IARB_SUPPORT
3004: /*
3005: ** If STATUS is not GOOD, clear IMMEDIATE ARBITRATION,
3006: ** since we may have to tamper the start queue from
3007: ** the C code.
3008: */
3009: SCR_JUMPR ^ IFTRUE (DATA (S_GOOD)),
3010: 8,
3011: SCR_REG_REG (scntl1, SCR_AND, ~IARB),
3012: 0,
3013: #endif
3014: /*
3015: ** save status to scsi_status.
3016: ** mark as complete.
3017: */
3018: SCR_TO_REG (SS_REG),
3019: 0,
3020: SCR_LOAD_REG (HS_REG, HS_COMPLETE),
3021: 0,
3022: /*
3023: ** Anticipate the MESSAGE PHASE for
3024: ** the TASK COMPLETE message.
3025: */
3026: SCR_JUMP ^ IFTRUE (WHEN (SCR_MSG_IN)),
3027: PADDR (msg_in),
3028: SCR_JUMP,
3029: PADDR (dispatch),
3030:
3031: }/*-------------------------< COMPLETE >-----------------*/,{
3032: /*
3033: ** Complete message.
3034: **
3035: ** Copy the data pointer to LASTP in header.
3036: */
3037: SCR_STORE_REL (temp, 4),
3038: offsetof (struct ccb, phys.header.lastp),
3039: /*
3040: ** When we terminate the cycle by clearing ACK,
3041: ** the target may disconnect immediately.
3042: **
3043: ** We don't want to be told of an
3044: ** "unexpected disconnect",
3045: ** so we disable this feature.
3046: */
3047: SCR_REG_REG (scntl2, SCR_AND, 0x7f),
3048: 0,
3049: /*
3050: ** Terminate cycle ...
3051: */
3052: SCR_CLR (SCR_ACK|SCR_ATN),
3053: 0,
3054: /*
3055: ** ... and wait for the disconnect.
3056: */
3057: SCR_WAIT_DISC,
3058: 0,
3059: }/*-------------------------< COMPLETE2 >-----------------*/,{
3060: /*
3061: ** Save host status to header.
3062: */
3063: SCR_STORE_REL (scr0, 4),
3064: offsetof (struct ccb, phys.header.status),
3065:
3066: #ifdef SCSI_NCR_PCIQ_MAY_REORDER_WRITES
3067: /*
3068: ** Some bridges may reorder DMA writes to memory.
3069: ** We donnot want the CPU to deal with completions
3070: ** without all the posted write having been flushed
3071: ** to memory. This DUMMY READ should flush posted
3072: ** buffers prior to the CPU having to deal with
3073: ** completions.
3074: */
3075: SCR_LOAD_REL (scr0, 4), /* DUMMY READ */
3076: offsetof (struct ccb, phys.header.status),
3077: #endif
3078: /*
3079: ** If command resulted in not GOOD status,
3080: ** call the C code if needed.
3081: */
3082: SCR_FROM_REG (SS_REG),
3083: 0,
3084: SCR_CALL ^ IFFALSE (DATA (S_GOOD)),
3085: PADDRH (bad_status),
3086:
3087: /*
3088: ** If we performed an auto-sense, call
3089: ** the C code to synchronyze task aborts
3090: ** with UNIT ATTENTION conditions.
3091: */
3092: SCR_FROM_REG (HF_REG),
3093: 0,
3094: SCR_INT ^ IFTRUE (MASK (HF_AUTO_SENSE, HF_AUTO_SENSE)),
3095: SIR_AUTO_SENSE_DONE,
3096:
3097: }/*------------------------< DONE >-----------------*/,{
3098: #ifdef SCSI_NCR_PCIQ_SYNC_ON_INTR
3099: /*
3100: ** It seems that some bridges flush everything
3101: ** when the INTR line is raised. For these ones,
3102: ** we can just ensure that the INTR line will be
3103: ** raised before each completion. So, if it happens
3104: ** that we have been faster that the CPU, we just
3105: ** have to synchronize with it. A dummy programmed
3106: ** interrupt will do the trick.
3107: ** Note that we overlap at most 1 IO with the CPU
3108: ** in this situation and that the IRQ line must not
3109: ** be shared.
3110: */
3111: SCR_FROM_REG (istat),
3112: 0,
3113: SCR_INT ^ IFTRUE (MASK (INTF, INTF)),
3114: SIR_DUMMY_INTERRUPT,
3115: #endif
3116: /*
3117: ** Copy the DSA to the DONE QUEUE and
3118: ** signal completion to the host.
3119: ** If we are interrupted between DONE
3120: ** and DONE_END, we must reset, otherwise
3121: ** the completed CCB will be lost.
3122: */
3123: SCR_STORE_ABS (dsa, 4),
3124: PADDRH (saved_dsa),
3125: SCR_LOAD_ABS (dsa, 4),
3126: PADDRH (done_pos),
3127: SCR_LOAD_ABS (scratcha, 4),
3128: PADDRH (saved_dsa),
3129: SCR_STORE_REL (scratcha, 4),
3130: 0,
3131: /*
3132: ** The instruction below reads the DONE QUEUE next
3133: ** free position from memory.
3134: ** In addition it ensures that all PCI posted writes
3135: ** are flushed and so the DSA value of the done
3136: ** CCB is visible by the CPU before INTFLY is raised.
3137: */
3138: SCR_LOAD_REL (temp, 4),
3139: 4,
3140: SCR_INT_FLY,
3141: 0,
3142: SCR_STORE_ABS (temp, 4),
3143: PADDRH (done_pos),
3144: }/*------------------------< DONE_END >-----------------*/,{
3145: SCR_JUMP,
3146: PADDR (start),
3147:
3148: }/*-------------------------< SAVE_DP >------------------*/,{
3149: /*
3150: ** Clear ACK immediately.
3151: ** No need to delay it.
3152: */
3153: SCR_CLR (SCR_ACK),
3154: 0,
3155: /*
3156: ** Keep track we received a SAVE DP, so
3157: ** we will switch to the other PM context
3158: ** on the next PM since the DP may point
3159: ** to the current PM context.
3160: */
3161: SCR_REG_REG (HF_REG, SCR_OR, HF_DP_SAVED),
3162: 0,
3163: /*
3164: ** SAVE_DP message:
3165: ** Copy the data pointer to SAVEP in header.
3166: */
3167: SCR_STORE_REL (temp, 4),
3168: offsetof (struct ccb, phys.header.savep),
3169: SCR_JUMP,
3170: PADDR (dispatch),
3171: }/*-------------------------< RESTORE_DP >---------------*/,{
3172: /*
3173: ** RESTORE_DP message:
3174: ** Copy SAVEP in header to actual data pointer.
3175: */
3176: SCR_LOAD_REL (temp, 4),
3177: offsetof (struct ccb, phys.header.savep),
3178: SCR_JUMP,
3179: PADDR (clrack),
3180:
3181: }/*-------------------------< DISCONNECT >---------------*/,{
3182: /*
3183: ** DISCONNECTing ...
3184: **
3185: ** disable the "unexpected disconnect" feature,
3186: ** and remove the ACK signal.
3187: */
3188: SCR_REG_REG (scntl2, SCR_AND, 0x7f),
3189: 0,
3190: SCR_CLR (SCR_ACK|SCR_ATN),
3191: 0,
3192: /*
3193: ** Wait for the disconnect.
3194: */
3195: SCR_WAIT_DISC,
3196: 0,
3197: /*
3198: ** Status is: DISCONNECTED.
3199: */
3200: SCR_LOAD_REG (HS_REG, HS_DISCONNECT),
3201: 0,
3202: /*
3203: ** Save host status to header.
3204: */
3205: SCR_STORE_REL (scr0, 4),
3206: offsetof (struct ccb, phys.header.status),
3207: /*
3208: ** If QUIRK_AUTOSAVE is set,
3209: ** do an "save pointer" operation.
3210: */
3211: SCR_FROM_REG (QU_REG),
3212: 0,
3213: SCR_JUMP ^ IFFALSE (MASK (QUIRK_AUTOSAVE, QUIRK_AUTOSAVE)),
3214: PADDR (start),
3215: /*
3216: ** like SAVE_DP message:
3217: ** Remember we saved the data pointer.
3218: ** Copy data pointer to SAVEP in header.
3219: */
3220: SCR_REG_REG (HF_REG, SCR_OR, HF_DP_SAVED),
3221: 0,
3222: SCR_STORE_REL (temp, 4),
3223: offsetof (struct ccb, phys.header.savep),
3224: SCR_JUMP,
3225: PADDR (start),
3226:
3227: }/*-------------------------< IDLE >------------------------*/,{
3228: /*
3229: ** Nothing to do?
3230: ** Wait for reselect.
3231: ** This NOP will be patched with LED OFF
3232: ** SCR_REG_REG (gpreg, SCR_OR, 0x01)
3233: */
3234: SCR_NO_OP,
3235: 0,
3236: #ifdef SCSI_NCR_IARB_SUPPORT
3237: SCR_JUMPR,
3238: 8,
3239: #endif
3240: }/*-------------------------< UNGETJOB >-----------------*/,{
3241: #ifdef SCSI_NCR_IARB_SUPPORT
3242: /*
3243: ** Set IMMEDIATE ARBITRATION, for the next time.
3244: ** This will give us better chance to win arbitration
3245: ** for the job we just wanted to do.
3246: */
3247: SCR_REG_REG (scntl1, SCR_OR, IARB),
3248: 0,
3249: #endif
3250: /*
3251: ** We are not able to restart the SCRIPTS if we are
3252: ** interrupted and these instruction haven't been
3253: ** all executed. BTW, this is very unlikely to
3254: ** happen, but we check that from the C code.
3255: */
3256: SCR_LOAD_REG (dsa, 0xff),
3257: 0,
3258: SCR_STORE_ABS (scratcha, 4),
3259: PADDRH (startpos),
3260: }/*-------------------------< RESELECT >--------------------*/,{
3261: /*
3262: ** make the host status invalid.
3263: */
3264: SCR_CLR (SCR_TRG),
3265: 0,
3266: /*
3267: ** Sleep waiting for a reselection.
3268: ** If SIGP is set, special treatment.
3269: **
3270: ** Zu allem bereit ..
3271: */
3272: SCR_WAIT_RESEL,
3273: PADDR(start),
3274: }/*-------------------------< RESELECTED >------------------*/,{
3275: /*
3276: ** This NOP will be patched with LED ON
3277: ** SCR_REG_REG (gpreg, SCR_AND, 0xfe)
3278: */
3279: SCR_NO_OP,
3280: 0,
3281: /*
3282: ** load the target id into the sdid
3283: */
3284: SCR_REG_SFBR (ssid, SCR_AND, 0x8F),
3285: 0,
3286: SCR_TO_REG (sdid),
3287: 0,
3288: /*
3289: ** load the target control block address
3290: */
3291: SCR_LOAD_ABS (dsa, 4),
3292: PADDRH (targtbl),
3293: SCR_SFBR_REG (dsa, SCR_SHL, 0),
3294: 0,
3295: SCR_REG_REG (dsa, SCR_SHL, 0),
3296: 0,
3297: SCR_REG_REG (dsa, SCR_AND, 0x3c),
3298: 0,
3299: SCR_LOAD_REL (dsa, 4),
3300: 0,
3301: /*
3302: ** Load the synchronous transfer registers.
3303: */
3304: SCR_LOAD_REL (scntl3, 1),
3305: offsetof(struct tcb, wval),
3306: SCR_LOAD_REL (sxfer, 1),
3307: offsetof(struct tcb, sval),
3308: }/*-------------------------< RESEL_SCNTL4 >------------------*/,{
3309: /*
3310: ** Write with uval value. Patch if device
3311: ** does not support Ultra3.
3312: **
3313: ** SCR_LOAD_REL (scntl4, 1),
3314: ** offsetof(struct tcb, uval),
3315: */
3316:
3317: SCR_NO_OP,
3318: 0,
3319: /*
3320: * We expect MESSAGE IN phase.
3321: * If not, get help from the C code.
3322: */
3323: SCR_INT ^ IFFALSE (WHEN (SCR_MSG_IN)),
3324: SIR_RESEL_NO_MSG_IN,
3325: SCR_MOVE_ABS (1) ^ SCR_MSG_IN,
3326: NADDR (msgin),
3327:
3328: /*
3329: * If IDENTIFY LUN #0, use a faster path
3330: * to find the LCB structure.
3331: */
3332: SCR_JUMPR ^ IFTRUE (MASK (0x80, 0xbf)),
3333: 56,
3334: /*
3335: * If message isn't an IDENTIFY,
3336: * tell the C code about.
3337: */
3338: SCR_INT ^ IFFALSE (MASK (0x80, 0x80)),
3339: SIR_RESEL_NO_IDENTIFY,
3340: /*
3341: * It is an IDENTIFY message,
3342: * Load the LUN control block address.
3343: */
3344: SCR_LOAD_REL (dsa, 4),
3345: offsetof(struct tcb, b_luntbl),
3346: SCR_SFBR_REG (dsa, SCR_SHL, 0),
3347: 0,
3348: SCR_REG_REG (dsa, SCR_SHL, 0),
3349: 0,
3350: SCR_REG_REG (dsa, SCR_AND, 0xfc),
3351: 0,
3352: SCR_LOAD_REL (dsa, 4),
3353: 0,
3354: SCR_JUMPR,
3355: 8,
3356: /*
3357: ** LUN 0 special case (but usual one :))
3358: */
3359: SCR_LOAD_REL (dsa, 4),
3360: offsetof(struct tcb, b_lun0),
3361:
3362: /*
3363: ** Load the reselect task action for this LUN.
3364: ** Load the tasks DSA array for this LUN.
3365: ** Call the action.
3366: */
3367: SCR_LOAD_REL (temp, 4),
3368: offsetof(struct lcb, resel_task),
3369: SCR_LOAD_REL (dsa, 4),
3370: offsetof(struct lcb, b_tasktbl),
3371: SCR_RETURN,
3372: 0,
3373: }/*-------------------------< RESEL_TAG >-------------------*/,{
3374: /*
3375: ** ACK the IDENTIFY or TAG previously received
3376: */
3377:
3378: SCR_CLR (SCR_ACK),
3379: 0,
3380: /*
3381: ** Read IDENTIFY + SIMPLE + TAG using a single MOVE.
3382: ** Agressive optimization, is'nt it?
3383: ** No need to test the SIMPLE TAG message, since the
3384: ** driver only supports conformant devices for tags. ;-)
3385: */
3386: SCR_MOVE_ABS (2) ^ SCR_MSG_IN,
3387: NADDR (msgin),
3388: /*
3389: ** Read the TAG from the SIDL.
3390: ** Still an aggressive optimization. ;-)
3391: ** Compute the CCB indirect jump address which
3392: ** is (#TAG*2 & 0xfc) due to tag numbering using
3393: ** 1,3,5..MAXTAGS*2+1 actual values.
3394: */
3395: SCR_REG_SFBR (sidl, SCR_SHL, 0),
3396: 0,
3397: #if MAX_TASKS*4 > 512
3398: SCR_JUMPR ^ IFFALSE (CARRYSET),
3399: 8,
3400: SCR_REG_REG (dsa1, SCR_OR, 2),
3401: 0,
3402: SCR_REG_REG (sfbr, SCR_SHL, 0),
3403: 0,
3404: SCR_JUMPR ^ IFFALSE (CARRYSET),
3405: 8,
3406: SCR_REG_REG (dsa1, SCR_OR, 1),
3407: 0,
3408: #elif MAX_TASKS*4 > 256
3409: SCR_JUMPR ^ IFFALSE (CARRYSET),
3410: 8,
3411: SCR_REG_REG (dsa1, SCR_OR, 1),
3412: 0,
3413: #endif
3414: /*
3415: ** Retrieve the DSA of this task.
3416: ** JUMP indirectly to the restart point of the CCB.
3417: */
3418: SCR_SFBR_REG (dsa, SCR_AND, 0xfc),
3419: 0,
3420: }/*-------------------------< RESEL_GO >-------------------*/,{
3421: SCR_LOAD_REL (dsa, 4),
3422: 0,
3423: SCR_LOAD_REL (temp, 4),
3424: offsetof(struct ccb, phys.header.go.restart),
3425: SCR_RETURN,
3426: 0,
3427: /* In normal situations we branch to RESEL_DSA */
3428: }/*-------------------------< RESEL_NOTAG >-------------------*/,{
3429: /*
3430: ** JUMP indirectly to the restart point of the CCB.
3431: */
3432: SCR_JUMP,
3433: PADDR (resel_go),
3434:
3435: }/*-------------------------< RESEL_DSA >-------------------*/,{
3436: /*
3437: ** Ack the IDENTIFY or TAG previously received.
3438: */
3439: SCR_CLR (SCR_ACK),
3440: 0,
3441: /*
3442: ** load the savep (saved pointer) into
3443: ** the actual data pointer.
3444: */
3445: SCR_LOAD_REL (temp, 4),
3446: offsetof (struct ccb, phys.header.savep),
3447: /*
3448: ** Initialize the status registers
3449: */
3450: SCR_LOAD_REL (scr0, 4),
3451: offsetof (struct ccb, phys.header.status),
3452: /*
3453: ** Jump to dispatcher.
3454: */
3455: SCR_JUMP,
3456: PADDR (dispatch),
3457:
3458: }/*-------------------------< DATA_IN >--------------------*/,{
3459: /*
3460: ** Because the size depends on the
3461: ** #define MAX_SCATTER parameter,
3462: ** it is filled in at runtime.
3463: **
3464: ** ##===========< i=0; i<MAX_SCATTER >=========
3465: ** || SCR_CHMOV_TBL ^ SCR_DATA_IN,
3466: ** || offsetof (struct dsb, data[ i]),
3467: ** ##==========================================
3468: **
3469: **---------------------------------------------------------
3470: */
3471: 0
3472: }/*-------------------------< DATA_IN2 >-------------------*/,{
3473: SCR_CALL,
3474: PADDR (datai_done),
3475: SCR_JUMP,
3476: PADDRH (data_ovrun),
3477: }/*-------------------------< DATA_OUT >--------------------*/,{
3478: /*
3479: ** Because the size depends on the
3480: ** #define MAX_SCATTER parameter,
3481: ** it is filled in at runtime.
3482: **
3483: ** ##===========< i=0; i<MAX_SCATTER >=========
3484: ** || SCR_CHMOV_TBL ^ SCR_DATA_OUT,
3485: ** || offsetof (struct dsb, data[ i]),
3486: ** ##==========================================
3487: **
3488: **---------------------------------------------------------
3489: */
3490: 0
3491: }/*-------------------------< DATA_OUT2 >-------------------*/,{
3492: SCR_CALL,
3493: PADDR (datao_done),
3494: SCR_JUMP,
3495: PADDRH (data_ovrun),
3496:
3497: }/*-------------------------< PM0_DATA >--------------------*/,{
3498: /*
3499: ** Read our host flags to SFBR, so we will be able
3500: ** to check against the data direction we expect.
3501: */
3502: SCR_FROM_REG (HF_REG),
3503: 0,
3504: /*
3505: ** Check against actual DATA PHASE.
3506: */
3507: SCR_JUMP ^ IFFALSE (WHEN (SCR_DATA_IN)),
3508: PADDR (pm0_data_out),
3509: /*
3510: ** Actual phase is DATA IN.
3511: ** Check against expected direction.
3512: */
3513: SCR_JUMP ^ IFFALSE (MASK (HF_DATA_IN, HF_DATA_IN)),
3514: PADDRH (data_ovrun),
3515: /*
3516: ** Keep track we are moving data from the
3517: ** PM0 DATA mini-script.
3518: */
3519: SCR_REG_REG (HF_REG, SCR_OR, HF_IN_PM0),
3520: 0,
3521: /*
3522: ** Move the data to memory.
3523: */
3524: SCR_CHMOV_TBL ^ SCR_DATA_IN,
3525: offsetof (struct ccb, phys.pm0.sg),
3526: SCR_JUMP,
3527: PADDR (pm0_data_end),
3528: }/*-------------------------< PM0_DATA_OUT >----------------*/,{
3529: /*
3530: ** Actual phase is DATA OUT.
3531: ** Check against expected direction.
3532: */
3533: SCR_JUMP ^ IFTRUE (MASK (HF_DATA_IN, HF_DATA_IN)),
3534: PADDRH (data_ovrun),
3535: /*
3536: ** Keep track we are moving data from the
3537: ** PM0 DATA mini-script.
3538: */
3539: SCR_REG_REG (HF_REG, SCR_OR, HF_IN_PM0),
3540: 0,
3541: /*
3542: ** Move the data from memory.
3543: */
3544: SCR_CHMOV_TBL ^ SCR_DATA_OUT,
3545: offsetof (struct ccb, phys.pm0.sg),
3546: }/*-------------------------< PM0_DATA_END >----------------*/,{
3547: /*
3548: ** Clear the flag that told we were moving
3549: ** data from the PM0 DATA mini-script.
3550: */
3551: SCR_REG_REG (HF_REG, SCR_AND, (~HF_IN_PM0)),
3552: 0,
3553: /*
3554: ** Return to the previous DATA script which
3555: ** is guaranteed by design (if no bug) to be
3556: ** the main DATA script for this transfer.
3557: */
3558: SCR_LOAD_REL (temp, 4),
3559: offsetof (struct ccb, phys.pm0.ret),
3560: SCR_RETURN,
3561: 0,
3562: }/*-------------------------< PM1_DATA >--------------------*/,{
3563: /*
3564: ** Read our host flags to SFBR, so we will be able
3565: ** to check against the data direction we expect.
3566: */
3567: SCR_FROM_REG (HF_REG),
3568: 0,
3569: /*
3570: ** Check against actual DATA PHASE.
3571: */
3572: SCR_JUMP ^ IFFALSE (WHEN (SCR_DATA_IN)),
3573: PADDR (pm1_data_out),
3574: /*
3575: ** Actual phase is DATA IN.
3576: ** Check against expected direction.
3577: */
3578: SCR_JUMP ^ IFFALSE (MASK (HF_DATA_IN, HF_DATA_IN)),
3579: PADDRH (data_ovrun),
3580: /*
3581: ** Keep track we are moving data from the
3582: ** PM1 DATA mini-script.
3583: */
3584: SCR_REG_REG (HF_REG, SCR_OR, HF_IN_PM1),
3585: 0,
3586: /*
3587: ** Move the data to memory.
3588: */
3589: SCR_CHMOV_TBL ^ SCR_DATA_IN,
3590: offsetof (struct ccb, phys.pm1.sg),
3591: SCR_JUMP,
3592: PADDR (pm1_data_end),
3593: }/*-------------------------< PM1_DATA_OUT >----------------*/,{
3594: /*
3595: ** Actual phase is DATA OUT.
3596: ** Check against expected direction.
3597: */
3598: SCR_JUMP ^ IFTRUE (MASK (HF_DATA_IN, HF_DATA_IN)),
3599: PADDRH (data_ovrun),
3600: /*
3601: ** Keep track we are moving data from the
3602: ** PM1 DATA mini-script.
3603: */
3604: SCR_REG_REG (HF_REG, SCR_OR, HF_IN_PM1),
3605: 0,
3606: /*
3607: ** Move the data from memory.
3608: */
3609: SCR_CHMOV_TBL ^ SCR_DATA_OUT,
3610: offsetof (struct ccb, phys.pm1.sg),
3611: }/*-------------------------< PM1_DATA_END >----------------*/,{
3612: /*
3613: ** Clear the flag that told we were moving
3614: ** data from the PM1 DATA mini-script.
3615: */
3616: SCR_REG_REG (HF_REG, SCR_AND, (~HF_IN_PM1)),
3617: 0,
3618: /*
3619: ** Return to the previous DATA script which
3620: ** is guaranteed by design (if no bug) to be
3621: ** the main DATA script for this transfer.
3622: */
3623: SCR_LOAD_REL (temp, 4),
3624: offsetof (struct ccb, phys.pm1.ret),
3625: SCR_RETURN,
3626: 0,
3627: }/*---------------------------------------------------------*/
3628: };
3629:
3630:
3631: static struct scripth scripth0 __initdata = {
3632: /*------------------------< START64 >-----------------------*/{
3633: /*
3634: ** SCRIPT entry point for the 895A and the 896.
3635: ** For now, there is no specific stuff for that
3636: ** chip at this point, but this may come.
3637: */
3638: SCR_JUMP,
3639: PADDR (init),
3640: }/*-------------------------< NO_DATA >-------------------*/,{
3641: SCR_JUMP,
3642: PADDRH (data_ovrun),
3643: }/*-----------------------< SEL_FOR_ABORT >------------------*/,{
3644: /*
3645: ** We are jumped here by the C code, if we have
3646: ** some target to reset or some disconnected
3647: ** job to abort. Since error recovery is a serious
3648: ** busyness, we will really reset the SCSI BUS, if
3649: ** case of a SCSI interrupt occurring in this path.
3650: */
3651:
3652: /*
3653: ** Set initiator mode.
3654: */
3655: SCR_CLR (SCR_TRG),
3656: 0,
3657: /*
3658: ** And try to select this target.
3659: */
3660: SCR_SEL_TBL_ATN ^ offsetof (struct ncb, abrt_sel),
3661: PADDR (reselect),
3662:
3663: /*
3664: ** Wait for the selection to complete or
3665: ** the selection to time out.
3666: */
3667: SCR_JUMPR ^ IFFALSE (WHEN (SCR_MSG_OUT)),
3668: -8,
3669: /*
3670: ** Call the C code.
3671: */
3672: SCR_INT,
3673: SIR_TARGET_SELECTED,
3674: /*
3675: ** The C code should let us continue here.
3676: ** Send the 'kiss of death' message.
3677: ** We expect an immediate disconnect once
3678: ** the target has eaten the message.
3679: */
3680: SCR_REG_REG (scntl2, SCR_AND, 0x7f),
3681: 0,
3682: SCR_MOVE_TBL ^ SCR_MSG_OUT,
3683: offsetof (struct ncb, abrt_tbl),
3684: SCR_CLR (SCR_ACK|SCR_ATN),
3685: 0,
3686: SCR_WAIT_DISC,
3687: 0,
3688: /*
3689: ** Tell the C code that we are done.
3690: */
3691: SCR_INT,
3692: SIR_ABORT_SENT,
3693: }/*-----------------------< SEL_FOR_ABORT_1 >--------------*/,{
3694: /*
3695: ** Jump at scheduler.
3696: */
3697: SCR_JUMP,
3698: PADDR (start),
3699:
3700: }/*------------------------< SELECT_NO_ATN >-----------------*/,{
3701: /*
3702: ** Set Initiator mode.
3703: ** And try to select this target without ATN.
3704: */
3705:
3706: SCR_CLR (SCR_TRG),
3707: 0,
3708: SCR_SEL_TBL ^ offsetof (struct dsb, select),
3709: PADDR (ungetjob),
3710: /*
3711: ** load the savep (saved pointer) into
3712: ** the actual data pointer.
3713: */
3714: SCR_LOAD_REL (temp, 4),
3715: offsetof (struct ccb, phys.header.savep),
3716: /*
3717: ** Initialize the status registers
3718: */
3719: SCR_LOAD_REL (scr0, 4),
3720: offsetof (struct ccb, phys.header.status),
3721:
3722: }/*------------------------< WF_SEL_DONE_NO_ATN >-----------------*/,{
3723: /*
3724: ** Wait immediately for the next phase or
3725: ** the selection to complete or time-out.
3726: */
3727: SCR_JUMPR ^ IFFALSE (WHEN (SCR_MSG_OUT)),
3728: 0,
3729: SCR_JUMP,
3730: PADDR (select2),
3731:
3732: }/*-------------------------< MSG_IN_ETC >--------------------*/,{
3733: /*
3734: ** If it is an EXTENDED (variable size message)
3735: ** Handle it.
3736: */
3737: SCR_JUMP ^ IFTRUE (DATA (M_EXTENDED)),
3738: PADDRH (msg_extended),
3739: /*
3740: ** Let the C code handle any other
3741: ** 1 byte message.
3742: */
3743: SCR_JUMP ^ IFTRUE (MASK (0x00, 0xf0)),
3744: PADDRH (msg_received),
3745: SCR_JUMP ^ IFTRUE (MASK (0x10, 0xf0)),
3746: PADDRH (msg_received),
3747: /*
3748: ** We donnot handle 2 bytes messages from SCRIPTS.
3749: ** So, let the C code deal with these ones too.
3750: */
3751: SCR_JUMP ^ IFFALSE (MASK (0x20, 0xf0)),
3752: PADDRH (msg_weird_seen),
3753: SCR_CLR (SCR_ACK),
3754: 0,
3755: SCR_MOVE_ABS (1) ^ SCR_MSG_IN,
3756: NADDR (msgin[1]),
3757: SCR_JUMP,
3758: PADDRH (msg_received),
3759:
3760: }/*-------------------------< MSG_RECEIVED >--------------------*/,{
3761: SCR_LOAD_REL (scratcha, 4), /* DUMMY READ */
3762: 0,
3763: SCR_INT,
3764: SIR_MSG_RECEIVED,
3765:
3766: }/*-------------------------< MSG_WEIRD_SEEN >------------------*/,{
3767: SCR_LOAD_REL (scratcha1, 4), /* DUMMY READ */
3768: 0,
3769: SCR_INT,
3770: SIR_MSG_WEIRD,
3771:
3772: }/*-------------------------< MSG_EXTENDED >--------------------*/,{
3773: /*
3774: ** Clear ACK and get the next byte
3775: ** assumed to be the message length.
3776: */
3777: SCR_CLR (SCR_ACK),
3778: 0,
3779: SCR_MOVE_ABS (1) ^ SCR_MSG_IN,
3780: NADDR (msgin[1]),
3781: /*
3782: ** Try to catch some unlikely situations as 0 length
3783: ** or too large the length.
3784: */
3785: SCR_JUMP ^ IFTRUE (DATA (0)),
3786: PADDRH (msg_weird_seen),
3787: SCR_TO_REG (scratcha),
3788: 0,
3789: SCR_REG_REG (sfbr, SCR_ADD, (256-8)),
3790: 0,
3791: SCR_JUMP ^ IFTRUE (CARRYSET),
3792: PADDRH (msg_weird_seen),
3793: /*
3794: ** We donnot handle extended messages from SCRIPTS.
3795: ** Read the amount of data correponding to the
3796: ** message length and call the C code.
3797: */
3798: SCR_STORE_REL (scratcha, 1),
3799: offsetof (struct dsb, smsg_ext.size),
3800: SCR_CLR (SCR_ACK),
3801: 0,
3802: SCR_MOVE_TBL ^ SCR_MSG_IN,
3803: offsetof (struct dsb, smsg_ext),
3804: SCR_JUMP,
3805: PADDRH (msg_received),
3806:
3807: }/*-------------------------< MSG_BAD >------------------*/,{
3808: /*
3809: ** unimplemented message - reject it.
3810: */
3811: SCR_INT,
3812: SIR_REJECT_TO_SEND,
3813: SCR_SET (SCR_ATN),
3814: 0,
3815: SCR_JUMP,
3816: PADDR (clrack),
3817:
3818: }/*-------------------------< MSG_WEIRD >--------------------*/,{
3819: /*
3820: ** weird message received
3821: ** ignore all MSG IN phases and reject it.
3822: */
3823: SCR_INT,
3824: SIR_REJECT_TO_SEND,
3825: SCR_SET (SCR_ATN),
3826: 0,
3827: }/*-------------------------< MSG_WEIRD1 >--------------------*/,{
3828: SCR_CLR (SCR_ACK),
3829: 0,
3830: SCR_JUMP ^ IFFALSE (WHEN (SCR_MSG_IN)),
3831: PADDR (dispatch),
3832: SCR_MOVE_ABS (1) ^ SCR_MSG_IN,
3833: NADDR (scratch),
3834: SCR_JUMP,
3835: PADDRH (msg_weird1),
3836: }/*-------------------------< WDTR_RESP >----------------*/,{
3837: /*
3838: ** let the target fetch our answer.
3839: */
3840: SCR_SET (SCR_ATN),
3841: 0,
3842: SCR_CLR (SCR_ACK),
3843: 0,
3844: SCR_JUMP ^ IFFALSE (WHEN (SCR_MSG_OUT)),
3845: PADDRH (nego_bad_phase),
3846:
3847: }/*-------------------------< SEND_WDTR >----------------*/,{
3848: /*
3849: ** Send the M_X_WIDE_REQ
3850: */
3851: SCR_MOVE_ABS (4) ^ SCR_MSG_OUT,
3852: NADDR (msgout),
3853: SCR_JUMP,
3854: PADDRH (msg_out_done),
3855:
3856: }/*-------------------------< SDTR_RESP >-------------*/,{
3857: /*
3858: ** let the target fetch our answer.
3859: */
3860: SCR_SET (SCR_ATN),
3861: 0,
3862: SCR_CLR (SCR_ACK),
3863: 0,
3864: SCR_JUMP ^ IFFALSE (WHEN (SCR_MSG_OUT)),
3865: PADDRH (nego_bad_phase),
3866:
3867: }/*-------------------------< SEND_SDTR >-------------*/,{
3868: /*
3869: ** Send the M_X_SYNC_REQ
3870: */
3871: SCR_MOVE_ABS (5) ^ SCR_MSG_OUT,
3872: NADDR (msgout),
3873: SCR_JUMP,
3874: PADDRH (msg_out_done),
3875:
3876: }/*-------------------------< PPR_RESP >-------------*/,{
3877: /*
3878: ** let the target fetch our answer.
3879: */
3880: SCR_SET (SCR_ATN),
3881: 0,
3882: SCR_CLR (SCR_ACK),
3883: 0,
3884: SCR_JUMP ^ IFFALSE (WHEN (SCR_MSG_OUT)),
3885: PADDRH (nego_bad_phase),
3886:
3887: }/*-------------------------< SEND_PPR >-------------*/,{
3888: /*
3889: ** Send the M_X_PPR_REQ
3890: */
3891: SCR_MOVE_ABS (8) ^ SCR_MSG_OUT,
3892: NADDR (msgout),
3893: SCR_JUMP,
3894: PADDRH (msg_out_done),
3895:
3896: }/*-------------------------< NEGO_BAD_PHASE >------------*/,{
3897: SCR_INT,
3898: SIR_NEGO_PROTO,
3899: SCR_JUMP,
3900: PADDR (dispatch),
3901:
3902: }/*-------------------------< MSG_OUT >-------------------*/,{
3903: /*
3904: ** The target requests a message.
3905: */
3906: SCR_MOVE_ABS (1) ^ SCR_MSG_OUT,
3907: NADDR (msgout),
3908: /*
3909: ** ... wait for the next phase
3910: ** if it's a message out, send it again, ...
3911: */
3912: SCR_JUMP ^ IFTRUE (WHEN (SCR_MSG_OUT)),
3913: PADDRH (msg_out),
3914: }/*-------------------------< MSG_OUT_DONE >--------------*/,{
3915: /*
3916: ** ... else clear the message ...
3917: */
3918: SCR_INT,
3919: SIR_MSG_OUT_DONE,
3920: /*
3921: ** ... and process the next phase
3922: */
3923: SCR_JUMP,
3924: PADDR (dispatch),
3925:
3926: }/*-------------------------< DATA_OVRUN >-----------------------*/,{
3927: /*
3928: * Use scratcha to count the extra bytes.
3929: */
3930: SCR_LOAD_ABS (scratcha, 4),
3931: PADDRH (zero),
3932: }/*-------------------------< DATA_OVRUN1 >----------------------*/,{
3933: /*
3934: * The target may want to transfer too much data.
3935: *
3936: * If phase is DATA OUT write 1 byte and count it.
3937: */
3938: SCR_JUMPR ^ IFFALSE (WHEN (SCR_DATA_OUT)),
3939: 16,
3940: SCR_CHMOV_ABS (1) ^ SCR_DATA_OUT,
3941: NADDR (scratch),
3942: SCR_JUMP,
3943: PADDRH (data_ovrun2),
3944: /*
3945: * If WSR is set, clear this condition, and
3946: * count this byte.
3947: */
3948: SCR_FROM_REG (scntl2),
3949: 0,
3950: SCR_JUMPR ^ IFFALSE (MASK (WSR, WSR)),
3951: 16,
3952: SCR_REG_REG (scntl2, SCR_OR, WSR),
3953: 0,
3954: SCR_JUMP,
3955: PADDRH (data_ovrun2),
3956: /*
3957: * Finally check against DATA IN phase.
3958: * Signal data overrun to the C code
3959: * and jump to dispatcher if not so.
3960: * Read 1 byte otherwise and count it.
3961: */
3962: SCR_JUMPR ^ IFTRUE (WHEN (SCR_DATA_IN)),
3963: 16,
3964: SCR_INT,
3965: SIR_DATA_OVERRUN,
3966: SCR_JUMP,
3967: PADDR (dispatch),
3968: SCR_CHMOV_ABS (1) ^ SCR_DATA_IN,
3969: NADDR (scratch),
3970: }/*-------------------------< DATA_OVRUN2 >----------------------*/,{
3971: /*
3972: * Count this byte.
3973: * This will allow to return a negative
3974: * residual to user.
3975: */
3976: SCR_REG_REG (scratcha, SCR_ADD, 0x01),
3977: 0,
3978: SCR_REG_REG (scratcha1, SCR_ADDC, 0),
3979: 0,
3980: SCR_REG_REG (scratcha2, SCR_ADDC, 0),
3981: 0,
3982: /*
3983: * .. and repeat as required.
3984: */
3985: SCR_JUMP,
3986: PADDRH (data_ovrun1),
3987:
3988: }/*-------------------------< ABORT_RESEL >----------------*/,{
3989: SCR_SET (SCR_ATN),
3990: 0,
3991: SCR_CLR (SCR_ACK),
3992: 0,
3993: /*
3994: ** send the abort/abortag/reset message
3995: ** we expect an immediate disconnect
3996: */
3997: SCR_REG_REG (scntl2, SCR_AND, 0x7f),
3998: 0,
3999: SCR_MOVE_ABS (1) ^ SCR_MSG_OUT,
4000: NADDR (msgout),
4001: SCR_CLR (SCR_ACK|SCR_ATN),
4002: 0,
4003: SCR_WAIT_DISC,
4004: 0,
4005: SCR_INT,
4006: SIR_RESEL_ABORTED,
4007: SCR_JUMP,
4008: PADDR (start),
4009: }/*-------------------------< RESEND_IDENT >-------------------*/,{
4010: /*
4011: ** The target stays in MSG OUT phase after having acked
4012: ** Identify [+ Tag [+ Extended message ]]. Targets shall
4013: ** behave this way on parity error.
4014: ** We must send it again all the messages.
4015: */
4016: SCR_SET (SCR_ATN), /* Shall be asserted 2 deskew delays before the */
4017: 0, /* 1rst ACK = 90 ns. Hope the NCR is'nt too fast */
4018: SCR_JUMP,
4019: PADDR (send_ident),
4020: }/*-------------------------< IDENT_BREAK >-------------------*/,{
4021: SCR_CLR (SCR_ATN),
4022: 0,
4023: SCR_JUMP,
4024: PADDR (select2),
4025: }/*-------------------------< IDENT_BREAK_ATN >----------------*/,{
4026: SCR_SET (SCR_ATN),
4027: 0,
4028: SCR_JUMP,
4029: PADDR (select2),
4030: }/*-------------------------< SDATA_IN >-------------------*/,{
4031: SCR_CHMOV_TBL ^ SCR_DATA_IN,
4032: offsetof (struct dsb, sense),
4033: SCR_CALL,
4034: PADDR (datai_done),
4035: SCR_JUMP,
4036: PADDRH (data_ovrun),
4037: }/*-------------------------< DATA_IO >--------------------*/,{
4038: /*
4039: ** We jump here if the data direction was unknown at the
4040: ** time we had to queue the command to the scripts processor.
4041: ** Pointers had been set as follow in this situation:
4042: ** savep --> DATA_IO
4043: ** lastp --> start pointer when DATA_IN
4044: ** goalp --> goal pointer when DATA_IN
4045: ** wlastp --> start pointer when DATA_OUT
4046: ** wgoalp --> goal pointer when DATA_OUT
4047: ** This script sets savep/lastp/goalp according to the
4048: ** direction chosen by the target.
4049: */
4050: SCR_JUMP ^ IFTRUE (WHEN (SCR_DATA_OUT)),
4051: PADDRH(data_io_out),
4052: }/*-------------------------< DATA_IO_COM >-----------------*/,{
4053: /*
4054: ** Direction is DATA IN.
4055: ** Warning: we jump here, even when phase is DATA OUT.
4056: */
4057: SCR_LOAD_REL (scratcha, 4),
4058: offsetof (struct ccb, phys.header.lastp),
4059: SCR_STORE_REL (scratcha, 4),
4060: offsetof (struct ccb, phys.header.savep),
4061:
4062: /*
4063: ** Jump to the SCRIPTS according to actual direction.
4064: */
4065: SCR_LOAD_REL (temp, 4),
4066: offsetof (struct ccb, phys.header.savep),
4067: SCR_RETURN,
4068: 0,
4069: }/*-------------------------< DATA_IO_OUT >-----------------*/,{
4070: /*
4071: ** Direction is DATA OUT.
4072: */
4073: SCR_REG_REG (HF_REG, SCR_AND, (~HF_DATA_IN)),
4074: 0,
4075: SCR_LOAD_REL (scratcha, 4),
4076: offsetof (struct ccb, phys.header.wlastp),
4077: SCR_STORE_REL (scratcha, 4),
4078: offsetof (struct ccb, phys.header.lastp),
4079: SCR_LOAD_REL (scratcha, 4),
4080: offsetof (struct ccb, phys.header.wgoalp),
4081: SCR_STORE_REL (scratcha, 4),
4082: offsetof (struct ccb, phys.header.goalp),
4083: SCR_JUMP,
4084: PADDRH(data_io_com),
4085:
4086: }/*-------------------------< RESEL_BAD_LUN >---------------*/,{
4087: /*
4088: ** Message is an IDENTIFY, but lun is unknown.
4089: ** Signal problem to C code for logging the event.
4090: ** Send a M_ABORT to clear all pending tasks.
4091: */
4092: SCR_INT,
4093: SIR_RESEL_BAD_LUN,
4094: SCR_JUMP,
4095: PADDRH (abort_resel),
4096: }/*-------------------------< BAD_I_T_L >------------------*/,{
4097: /*
4098: ** We donnot have a task for that I_T_L.
4099: ** Signal problem to C code for logging the event.
4100: ** Send a M_ABORT message.
4101: */
4102: SCR_INT,
4103: SIR_RESEL_BAD_I_T_L,
4104: SCR_JUMP,
4105: PADDRH (abort_resel),
4106: }/*-------------------------< BAD_I_T_L_Q >----------------*/,{
4107: /*
4108: ** We donnot have a task that matches the tag.
4109: ** Signal problem to C code for logging the event.
4110: ** Send a M_ABORTTAG message.
4111: */
4112: SCR_INT,
4113: SIR_RESEL_BAD_I_T_L_Q,
4114: SCR_JUMP,
4115: PADDRH (abort_resel),
4116: }/*-------------------------< BAD_STATUS >-----------------*/,{
4117: /*
4118: ** Anything different from INTERMEDIATE
4119: ** CONDITION MET should be a bad SCSI status,
4120: ** given that GOOD status has already been tested.
4121: ** Call the C code.
4122: */
4123: SCR_LOAD_ABS (scratcha, 4),
4124: PADDRH (startpos),
4125: SCR_INT ^ IFFALSE (DATA (S_COND_MET)),
4126: SIR_BAD_STATUS,
4127: SCR_RETURN,
4128: 0,
4129:
4130: }/*-------------------------< TWEAK_PMJ >------------------*/,{
4131: /*
4132: ** Disable PM handling from SCRIPTS for the data phase
4133: ** and so force PM to be handled from C code if HF_PM_TO_C
4134: ** flag is set.
4135: */
4136: SCR_FROM_REG(HF_REG),
4137: 0,
4138: SCR_JUMPR ^ IFTRUE (MASK (HF_PM_TO_C, HF_PM_TO_C)),
4139: 16,
4140: SCR_REG_REG (ccntl0, SCR_OR, ENPMJ),
4141: 0,
4142: SCR_RETURN,
4143: 0,
4144: SCR_REG_REG (ccntl0, SCR_AND, (~ENPMJ)),
4145: 0,
4146: SCR_RETURN,
4147: 0,
4148:
4149: }/*-------------------------< PM_HANDLE >------------------*/,{
4150: /*
4151: ** Phase mismatch handling.
4152: **
4153: ** Since we have to deal with 2 SCSI data pointers
4154: ** (current and saved), we need at least 2 contexts.
4155: ** Each context (pm0 and pm1) has a saved area, a
4156: ** SAVE mini-script and a DATA phase mini-script.
4157: */
4158: /*
4159: ** Get the PM handling flags.
4160: */
4161: SCR_FROM_REG (HF_REG),
4162: 0,
4163: /*
4164: ** If no flags (1rst PM for example), avoid
4165: ** all the below heavy flags testing.
4166: ** This makes the normal case a bit faster.
4167: */
4168: SCR_JUMP ^ IFTRUE (MASK (0, (HF_IN_PM0 | HF_IN_PM1 | HF_DP_SAVED))),
4169: PADDRH (pm_handle1),
4170: /*
4171: ** If we received a SAVE DP, switch to the
4172: ** other PM context since the savep may point
4173: ** to the current PM context.
4174: */
4175: SCR_JUMPR ^ IFFALSE (MASK (HF_DP_SAVED, HF_DP_SAVED)),
4176: 8,
4177: SCR_REG_REG (sfbr, SCR_XOR, HF_ACT_PM),
4178: 0,
4179: /*
4180: ** If we have been interrupt in a PM DATA mini-script,
4181: ** we take the return address from the corresponding
4182: ** saved area.
4183: ** This ensure the return address always points to the
4184: ** main DATA script for this transfer.
4185: */
4186: SCR_JUMP ^ IFTRUE (MASK (0, (HF_IN_PM0 | HF_IN_PM1))),
4187: PADDRH (pm_handle1),
4188: SCR_JUMPR ^ IFFALSE (MASK (HF_IN_PM0, HF_IN_PM0)),
4189: 16,
4190: SCR_LOAD_REL (ia, 4),
4191: offsetof(struct ccb, phys.pm0.ret),
4192: SCR_JUMP,
4193: PADDRH (pm_save),
4194: SCR_LOAD_REL (ia, 4),
4195: offsetof(struct ccb, phys.pm1.ret),
4196: SCR_JUMP,
4197: PADDRH (pm_save),
4198: }/*-------------------------< PM_HANDLE1 >-----------------*/,{
4199: /*
4200: ** Normal case.
4201: ** Update the return address so that it
4202: ** will point after the interrupted MOVE.
4203: */
4204: SCR_REG_REG (ia, SCR_ADD, 8),
4205: 0,
4206: SCR_REG_REG (ia1, SCR_ADDC, 0),
4207: 0,
4208: }/*-------------------------< PM_SAVE >--------------------*/,{
4209: /*
4210: ** Clear all the flags that told us if we were
4211: ** interrupted in a PM DATA mini-script and/or
4212: ** we received a SAVE DP.
4213: */
4214: SCR_SFBR_REG (HF_REG, SCR_AND, (~(HF_IN_PM0|HF_IN_PM1|HF_DP_SAVED))),
4215: 0,
4216: /*
4217: ** Choose the current PM context.
4218: */
4219: SCR_JUMP ^ IFTRUE (MASK (HF_ACT_PM, HF_ACT_PM)),
4220: PADDRH (pm1_save),
4221: }/*-------------------------< PM0_SAVE >-------------------*/,{
4222: SCR_STORE_REL (ia, 4),
4223: offsetof(struct ccb, phys.pm0.ret),
4224: /*
4225: ** If WSR bit is set, either UA and RBC may
4226: ** have to be changed whatever the device wants
4227: ** to ignore this residue ot not.
4228: */
4229: SCR_FROM_REG (scntl2),
4230: 0,
4231: SCR_CALL ^ IFTRUE (MASK (WSR, WSR)),
4232: PADDRH (pm_wsr_handle),
4233: /*
4234: ** Save the remaining byte count, the updated
4235: ** address and the return address.
4236: */
4237: SCR_STORE_REL (rbc, 4),
4238: offsetof(struct ccb, phys.pm0.sg.size),
4239: SCR_STORE_REL (ua, 4),
4240: offsetof(struct ccb, phys.pm0.sg.addr),
4241: /*
4242: ** Set the current pointer at the PM0 DATA mini-script.
4243: */
4244: SCR_LOAD_ABS (temp, 4),
4245: PADDRH (pm0_data_addr),
4246: SCR_JUMP,
4247: PADDR (dispatch),
4248: }/*-------------------------< PM1_SAVE >-------------------*/,{
4249: SCR_STORE_REL (ia, 4),
4250: offsetof(struct ccb, phys.pm1.ret),
4251: /*
4252: ** If WSR bit is set, either UA and RBC may
4253: ** have been changed whatever the device wants
4254: ** to ignore this residue or not.
4255: */
4256: SCR_FROM_REG (scntl2),
4257: 0,
4258: SCR_CALL ^ IFTRUE (MASK (WSR, WSR)),
4259: PADDRH (pm_wsr_handle),
4260: /*
4261: ** Save the remaining byte count, the updated
4262: ** address and the return address.
4263: */
4264: SCR_STORE_REL (rbc, 4),
4265: offsetof(struct ccb, phys.pm1.sg.size),
4266: SCR_STORE_REL (ua, 4),
4267: offsetof(struct ccb, phys.pm1.sg.addr),
4268: /*
4269: ** Set the current pointer at the PM1 DATA mini-script.
4270: */
4271: SCR_LOAD_ABS (temp, 4),
4272: PADDRH (pm1_data_addr),
4273: SCR_JUMP,
4274: PADDR (dispatch),
4275: }/*--------------------------< PM_WSR_HANDLE >-----------------------*/,{
4276: /*
4277: * Phase mismatch handling from SCRIPT with WSR set.
4278: * Such a condition can occur if the chip wants to
4279: * execute a CHMOV(size > 1) when the WSR bit is
4280: * set and the target changes PHASE.
4281: */
4282: #ifdef SYM_DEBUG_PM_WITH_WSR
4283: /*
4284: * Some debugging may still be needed.:)
4285: */
4286: SCR_INT,
4287: SIR_PM_WITH_WSR,
4288: #endif
4289: /*
4290: * We must move the residual byte to memory.
4291: *
4292: * UA contains bit 0..31 of the address to
4293: * move the residual byte.
4294: * Move it to the table indirect.
4295: */
4296: SCR_STORE_REL (ua, 4),
4297: offsetof (struct ccb, phys.wresid.addr),
4298: /*
4299: * Increment UA (move address to next position).
4300: */
4301: SCR_REG_REG (ua, SCR_ADD, 1),
4302: 0,
4303: SCR_REG_REG (ua1, SCR_ADDC, 0),
4304: 0,
4305: SCR_REG_REG (ua2, SCR_ADDC, 0),
4306: 0,
4307: SCR_REG_REG (ua3, SCR_ADDC, 0),
4308: 0,
4309: /*
4310: * Compute SCRATCHA as:
4311: * - size to transfer = 1 byte.
4312: * - bit 24..31 = high address bit [32...39].
4313: */
4314: SCR_LOAD_ABS (scratcha, 4),
4315: PADDRH (zero),
4316: SCR_REG_REG (scratcha, SCR_OR, 1),
4317: 0,
4318: SCR_FROM_REG (rbc3),
4319: 0,
4320: SCR_TO_REG (scratcha3),
4321: 0,
4322: /*
4323: * Move this value to the table indirect.
4324: */
4325: SCR_STORE_REL (scratcha, 4),
4326: offsetof (struct ccb, phys.wresid.size),
4327: /*
4328: * Wait for a valid phase.
4329: * While testing with bogus QUANTUM drives, the C1010
4330: * sometimes raised a spurious phase mismatch with
4331: * WSR and the CHMOV(1) triggered another PM.
4332: * Waiting explicitely for the PHASE seemed to avoid
4333: * the nested phase mismatch. Btw, this didn't happen
4334: * using my IBM drives.
4335: */
4336: SCR_JUMPR ^ IFFALSE (WHEN (SCR_DATA_IN)),
4337: 0,
4338: /*
4339: * Perform the move of the residual byte.
4340: */
4341: SCR_CHMOV_TBL ^ SCR_DATA_IN,
4342: offsetof (struct ccb, phys.wresid),
4343: /*
4344: * We can now handle the phase mismatch with UA fixed.
4345: * RBC[0..23]=0 is a special case that does not require
4346: * a PM context. The C code also checks against this.
4347: */
4348: SCR_FROM_REG (rbc),
4349: 0,
4350: SCR_RETURN ^ IFFALSE (DATA (0)),
4351: 0,
4352: SCR_FROM_REG (rbc1),
4353: 0,
4354: SCR_RETURN ^ IFFALSE (DATA (0)),
4355: 0,
4356: SCR_FROM_REG (rbc2),
4357: 0,
4358: SCR_RETURN ^ IFFALSE (DATA (0)),
4359: 0,
4360: /*
4361: * RBC[0..23]=0.
4362: * Not only we donnot need a PM context, but this would
4363: * lead to a bogus CHMOV(0). This condition means that
4364: * the residual was the last byte to move from this CHMOV.
4365: * So, we just have to move the current data script pointer
4366: * (i.e. TEMP) to the SCRIPTS address following the
4367: * interrupted CHMOV and jump to dispatcher.
4368: */
4369: SCR_STORE_ABS (ia, 4),
4370: PADDRH (scratch),
4371: SCR_LOAD_ABS (temp, 4),
4372: PADDRH (scratch),
4373: SCR_JUMP,
4374: PADDR (dispatch),
4375: }/*--------------------------< WSR_MA_HELPER >-----------------------*/,{
4376: /*
4377: * Helper for the C code when WSR bit is set.
4378: * Perform the move of the residual byte.
4379: */
4380: SCR_CHMOV_TBL ^ SCR_DATA_IN,
4381: offsetof (struct ccb, phys.wresid),
4382: SCR_JUMP,
4383: PADDR (dispatch),
4384: }/*-------------------------< ZERO >------------------------*/,{
4385: SCR_DATA_ZERO,
4386: }/*-------------------------< SCRATCH >---------------------*/,{
4387: SCR_DATA_ZERO,
4388: }/*-------------------------< SCRATCH1 >--------------------*/,{
4389: SCR_DATA_ZERO,
4390: }/*-------------------------< PM0_DATA_ADDR >---------------*/,{
4391: SCR_DATA_ZERO,
4392: }/*-------------------------< PM1_DATA_ADDR >---------------*/,{
4393: SCR_DATA_ZERO,
4394: }/*-------------------------< SAVED_DSA >-------------------*/,{
4395: SCR_DATA_ZERO,
4396: }/*-------------------------< SAVED_DRS >-------------------*/,{
4397: SCR_DATA_ZERO,
4398: }/*-------------------------< DONE_POS >--------------------*/,{
4399: SCR_DATA_ZERO,
4400: }/*-------------------------< STARTPOS >--------------------*/,{
4401: SCR_DATA_ZERO,
4402: }/*-------------------------< TARGTBL >---------------------*/,{
4403: SCR_DATA_ZERO,
4404:
4405:
4406: /*
4407: ** We may use MEMORY MOVE instructions to load the on chip-RAM,
4408: ** if it happens that mapping PCI memory is not possible.
4409: ** But writing the RAM from the CPU is the preferred method,
4410: ** since PCI 2.2 seems to disallow PCI self-mastering.
4411: */
4412:
4413: #ifdef SCSI_NCR_PCI_MEM_NOT_SUPPORTED
4414:
4415: }/*-------------------------< START_RAM >-------------------*/,{
4416: /*
4417: ** Load the script into on-chip RAM,
4418: ** and jump to start point.
4419: */
4420: SCR_COPY (sizeof (struct script)),
4421: }/*-------------------------< SCRIPT0_BA >--------------------*/,{
4422: 0,
4423: PADDR (start),
4424: SCR_JUMP,
4425: PADDR (init),
4426:
4427: }/*-------------------------< START_RAM64 >--------------------*/,{
4428: /*
4429: ** Load the RAM and start for 64 bit PCI (895A,896).
4430: ** Both scripts (script and scripth) are loaded into
4431: ** the RAM which is 8K (4K for 825A/875/895).
4432: ** We also need to load some 32-63 bit segments
4433: ** address of the SCRIPTS processor.
4434: ** LOAD/STORE ABSOLUTE always refers to on-chip RAM
4435: ** in our implementation. The main memory is
4436: ** accessed using LOAD/STORE DSA RELATIVE.
4437: */
4438: SCR_LOAD_REL (mmws, 4),
4439: offsetof (struct ncb, scr_ram_seg),
4440: SCR_COPY (sizeof(struct script)),
4441: }/*-------------------------< SCRIPT0_BA64 >--------------------*/,{
4442: 0,
4443: PADDR (start),
4444: SCR_COPY (sizeof(struct scripth)),
4445: }/*-------------------------< SCRIPTH0_BA64 >--------------------*/,{
4446: 0,
4447: PADDRH (start64),
4448: SCR_LOAD_REL (mmrs, 4),
4449: offsetof (struct ncb, scr_ram_seg),
4450: SCR_JUMP64,
4451: PADDRH (start64),
4452: }/*-------------------------< RAM_SEG64 >--------------------*/,{
4453: 0,
4454:
4455: #endif /* SCSI_NCR_PCI_MEM_NOT_SUPPORTED */
4456:
4457: }/*-------------------------< SNOOPTEST >-------------------*/,{
4458: /*
4459: ** Read the variable.
4460: */
4461: SCR_LOAD_REL (scratcha, 4),
4462: offsetof(struct ncb, ncr_cache),
4463: SCR_STORE_REL (temp, 4),
4464: offsetof(struct ncb, ncr_cache),
4465: SCR_LOAD_REL (temp, 4),
4466: offsetof(struct ncb, ncr_cache),
4467: }/*-------------------------< SNOOPEND >-------------------*/,{
4468: /*
4469: ** And stop.
4470: */
4471: SCR_INT,
4472: 99,
4473: }/*--------------------------------------------------------*/
4474: };
4475:
4476: /*==========================================================
4477: **
4478: **
4479: ** Fill in #define dependent parts of the script
4480: **
4481: **
4482: **==========================================================
4483: */
4484:
4485: void __init ncr_script_fill (struct script * scr, struct scripth * scrh)
4486: {
4487: int i;
4488: ncrcmd *p;
4489:
4490: p = scr->data_in;
4491: for (i=0; i<MAX_SCATTER; i++) {
4492: *p++ =SCR_CHMOV_TBL ^ SCR_DATA_IN;
4493: *p++ =offsetof (struct dsb, data[i]);
4494: };
4495:
4496: assert ((u_long)p == (u_long)&scr->data_in + sizeof (scr->data_in));
4497:
4498: p = scr->data_out;
4499:
4500: for (i=0; i<MAX_SCATTER; i++) {
4501: *p++ =SCR_CHMOV_TBL ^ SCR_DATA_OUT;
4502: *p++ =offsetof (struct dsb, data[i]);
4503: };
4504:
4505: assert ((u_long)p == (u_long)&scr->data_out + sizeof (scr->data_out));
4506: }
4507:
4508: /*==========================================================
4509: **
4510: **
4511: ** Copy and rebind a script.
4512: **
4513: **
4514: **==========================================================
4515: */
4516:
4517: static void __init
4518: ncr_script_copy_and_bind (ncb_p np,ncrcmd *src,ncrcmd *dst,int len)
4519: {
4520: ncrcmd opcode, new, old, tmp1, tmp2;
4521: ncrcmd *start, *end;
4522: int relocs;
4523: int opchanged = 0;
4524:
4525: start = src;
4526: end = src + len/4;
4527:
4528: while (src < end) {
4529:
4530: opcode = *src++;
4531: *dst++ = cpu_to_scr(opcode);
4532:
4533: /*
4534: ** If we forget to change the length
4535: ** in struct script, a field will be
4536: ** padded with 0. This is an illegal
4537: ** command.
4538: */
4539:
4540: if (opcode == 0) {
4541: printk (KERN_INFO "%s: ERROR0 IN SCRIPT at %d.\n",
4542: ncr_name(np), (int) (src-start-1));
4543: MDELAY (10000);
4544: continue;
4545: };
4546:
4547: /*
4548: ** We use the bogus value 0xf00ff00f ;-)
4549: ** to reserve data area in SCRIPTS.
4550: */
4551: if (opcode == SCR_DATA_ZERO) {
4552: dst[-1] = 0;
4553: continue;
4554: }
4555:
4556: if (DEBUG_FLAGS & DEBUG_SCRIPT)
4557: printk (KERN_INFO "%p: <%x>\n",
4558: (src-1), (unsigned)opcode);
4559:
4560: /*
4561: ** We don't have to decode ALL commands
4562: */
4563: switch (opcode >> 28) {
4564:
4565: case 0xf:
4566: /*
4567: ** LOAD / STORE DSA relative, don't relocate.
4568: */
4569: relocs = 0;
4570: break;
4571: case 0xe:
4572: /*
4573: ** LOAD / STORE absolute.
4574: */
4575: relocs = 1;
4576: break;
4577: case 0xc:
4578: /*
4579: ** COPY has TWO arguments.
4580: */
4581: relocs = 2;
4582: tmp1 = src[0];
4583: tmp2 = src[1];
4584: #ifdef RELOC_KVAR
4585: if ((tmp1 & RELOC_MASK) == RELOC_KVAR)
4586: tmp1 = 0;
4587: if ((tmp2 & RELOC_MASK) == RELOC_KVAR)
4588: tmp2 = 0;
4589: #endif
4590: if ((tmp1 ^ tmp2) & 3) {
4591: printk (KERN_ERR"%s: ERROR1 IN SCRIPT at %d.\n",
4592: ncr_name(np), (int) (src-start-1));
4593: MDELAY (1000);
4594: }
4595: /*
4596: ** If PREFETCH feature not enabled, remove
4597: ** the NO FLUSH bit if present.
4598: */
4599: if ((opcode & SCR_NO_FLUSH) &&
4600: !(np->features & FE_PFEN)) {
4601: dst[-1] = cpu_to_scr(opcode & ~SCR_NO_FLUSH);
4602: ++opchanged;
4603: }
4604: break;
4605:
4606: case 0x0:
4607: /*
4608: ** MOVE/CHMOV (absolute address)
4609: */
4610: if (!(np->features & FE_WIDE))
4611: dst[-1] = cpu_to_scr(opcode | OPC_MOVE);
4612: relocs = 1;
4613: break;
4614:
4615: case 0x1:
4616: /*
4617: ** MOVE/CHMOV (table indirect)
4618: */
4619: if (!(np->features & FE_WIDE))
4620: dst[-1] = cpu_to_scr(opcode | OPC_MOVE);
4621: relocs = 0;
4622: break;
4623:
4624: case 0x8:
4625: /*
4626: ** JUMP / CALL
4627: ** dont't relocate if relative :-)
4628: */
4629: if (opcode & 0x00800000)
4630: relocs = 0;
4631: else if ((opcode & 0xf8400000) == 0x80400000)/*JUMP64*/
4632: relocs = 2;
4633: else
4634: relocs = 1;
4635: break;
4636:
4637: case 0x4:
4638: case 0x5:
4639: case 0x6:
4640: case 0x7:
4641: relocs = 1;
4642: break;
4643:
4644: default:
4645: relocs = 0;
4646: break;
4647: };
4648:
4649: if (!relocs) {
4650: *dst++ = cpu_to_scr(*src++);
4651: continue;
4652: }
4653: while (relocs--) {
4654: old = *src++;
4655:
4656: switch (old & RELOC_MASK) {
4657: case RELOC_REGISTER:
4658: new = (old & ~RELOC_MASK) + pcivtobus(np->base_ba);
4659: break;
4660: case RELOC_LABEL:
4661: new = (old & ~RELOC_MASK) + np->p_script;
4662: break;
4663: case RELOC_LABELH:
4664: new = (old & ~RELOC_MASK) + np->p_scripth;
4665: break;
4666: case RELOC_SOFTC:
4667: new = (old & ~RELOC_MASK) + np->p_ncb;
4668: break;
4669: #ifdef RELOC_KVAR
4670: case RELOC_KVAR:
4671: new=0;
4672: if (((old & ~RELOC_MASK) < SCRIPT_KVAR_FIRST) ||
4673: ((old & ~RELOC_MASK) > SCRIPT_KVAR_LAST))
4674: panic("ncr KVAR out of range");
4675: new = vtobus(script_kvars[old & ~RELOC_MASK]);
4676: #endif
4677: break;
4678: case 0:
4679: /* Don't relocate a 0 address. */
4680: if (old == 0) {
4681: new = old;
4682: break;
4683: }
4684: /* fall through */
4685: default:
4686: new = 0; /* For 'cc' not to complain */
4687: panic("ncr_script_copy_and_bind: "
4688: "weird relocation %x\n", old);
4689: break;
4690: }
4691:
4692: *dst++ = cpu_to_scr(new);
4693: }
4694: };
4695: }
4696:
4697: /*==========================================================
4698: **
4699: **
4700: ** Auto configuration: attach and init a host adapter.
4701: **
4702: **
4703: **==========================================================
4704: */
4705:
4706: /*
4707: ** Linux host data structure.
4708: */
4709:
4710: struct host_data {
4711: struct ncb *ncb;
4712: };
4713:
4714: /*
4715: ** Print something which allows to retrieve the controler type, unit,
4716: ** target, lun concerned by a kernel message.
4717: */
4718:
4719: static void PRINT_TARGET(ncb_p np, int target)
4720: {
4721: printk(KERN_INFO "%s-<%d,*>: ", ncr_name(np), target);
4722: }
4723:
4724: static void PRINT_LUN(ncb_p np, int target, int lun)
4725: {
4726: printk(KERN_INFO "%s-<%d,%d>: ", ncr_name(np), target, lun);
4727: }
4728:
4729: static void PRINT_ADDR(Scsi_Cmnd *cmd)
4730: {
4731: struct host_data *host_data = (struct host_data *) cmd->host->hostdata;
4732: PRINT_LUN(host_data->ncb, cmd->target, cmd->lun);
4733: }
4734:
4735: /*==========================================================
4736: **
4737: ** NCR chip clock divisor table.
4738: ** Divisors are multiplied by 10,000,000 in order to make
4739: ** calculations more simple.
4740: **
4741: **==========================================================
4742: */
4743:
4744: #define _5M 5000000
4745: static u_long div_10M[] =
4746: {2*_5M, 3*_5M, 4*_5M, 6*_5M, 8*_5M, 12*_5M, 16*_5M};
4747:
4748:
4749: /*===============================================================
4750: **
4751: ** Prepare io register values used by ncr_init() according
4752: ** to selected and supported features.
4753: **
4754: ** NCR/SYMBIOS chips allow burst lengths of 2, 4, 8, 16, 32, 64,
4755: ** 128 transfers. All chips support at least 16 transfers bursts.
4756: ** The 825A, 875 and 895 chips support bursts of up to 128
4757: ** transfers and the 895A and 896 support bursts of up to 64
4758: ** transfers. All other chips support up to 16 transfers bursts.
4759: **
4760: ** For PCI 32 bit data transfers each transfer is a DWORD (4 bytes).
4761: ** It is a QUADWORD (8 bytes) for PCI 64 bit data transfers.
4762: ** Only the 896 is able to perform 64 bit data transfers.
4763: **
4764: ** We use log base 2 (burst length) as internal code, with
4765: ** value 0 meaning "burst disabled".
4766: **
4767: **===============================================================
4768: */
4769:
4770: /*
4771: * Burst length from burst code.
4772: */
4773: #define burst_length(bc) (!(bc))? 0 : 1 << (bc)
4774:
4775: /*
4776: * Burst code from io register bits.
4777: */
4778: #define burst_code(dmode, ctest4, ctest5) \
4779: (ctest4) & 0x80? 0 : (((dmode) & 0xc0) >> 6) + ((ctest5) & 0x04) + 1
4780:
4781: /*
4782: * Set initial io register bits from burst code.
4783: */
4784: static inline void ncr_init_burst(ncb_p np, u_char bc)
4785: {
4786: np->rv_ctest4 &= ~0x80;
4787: np->rv_dmode &= ~(0x3 << 6);
4788: np->rv_ctest5 &= ~0x4;
4789:
4790: if (!bc) {
4791: np->rv_ctest4 |= 0x80;
4792: }
4793: else {
4794: --bc;
4795: np->rv_dmode |= ((bc & 0x3) << 6);
4796: np->rv_ctest5 |= (bc & 0x4);
4797: }
4798: }
4799:
4800: #ifdef SCSI_NCR_NVRAM_SUPPORT
4801:
4802: /*
4803: ** Get target set-up from Symbios format NVRAM.
4804: */
4805:
4806: static void __init
4807: ncr_Symbios_setup_target(ncb_p np, int target, Symbios_nvram *nvram)
4808: {
4809: tcb_p tp = &np->target[target];
4810: Symbios_target *tn = &nvram->target[target];
4811:
4812: tp->usrsync = tn->sync_period ? (tn->sync_period + 3) / 4 : 255;
4813: tp->usrwide = tn->bus_width == 0x10 ? 1 : 0;
4814: tp->usrtags =
4815: (tn->flags & SYMBIOS_QUEUE_TAGS_ENABLED)? MAX_TAGS : 0;
4816:
4817: if (!(tn->flags & SYMBIOS_DISCONNECT_ENABLE))
4818: tp->usrflag |= UF_NODISC;
4819: if (!(tn->flags & SYMBIOS_SCAN_AT_BOOT_TIME))
4820: tp->usrflag |= UF_NOSCAN;
4821: }
4822:
4823: /*
4824: ** Get target set-up from Tekram format NVRAM.
4825: */
4826:
4827: static void __init
4828: ncr_Tekram_setup_target(ncb_p np, int target, Tekram_nvram *nvram)
4829: {
4830: tcb_p tp = &np->target[target];
4831: struct Tekram_target *tn = &nvram->target[target];
4832: int i;
4833:
4834: if (tn->flags & TEKRAM_SYNC_NEGO) {
4835: i = tn->sync_index & 0xf;
4836: tp->usrsync = Tekram_sync[i];
4837: }
4838:
4839: tp->usrwide = (tn->flags & TEKRAM_WIDE_NEGO) ? 1 : 0;
4840:
4841: if (tn->flags & TEKRAM_TAGGED_COMMANDS) {
4842: tp->usrtags = 2 << nvram->max_tags_index;
4843: }
4844:
4845: if (!(tn->flags & TEKRAM_DISCONNECT_ENABLE))
4846: tp->usrflag = UF_NODISC;
4847:
4848: /* If any device does not support parity, we will not use this option */
4849: if (!(tn->flags & TEKRAM_PARITY_CHECK))
4850: np->rv_scntl0 &= ~0x0a; /* SCSI parity checking disabled */
4851: }
4852: #endif /* SCSI_NCR_NVRAM_SUPPORT */
4853:
4854: /*
4855: ** Save initial settings of some IO registers.
4856: ** Assumed to have been set by BIOS.
4857: */
4858: static void __init ncr_save_initial_setting(ncb_p np)
4859: {
4860: np->sv_scntl0 = INB(nc_scntl0) & 0x0a;
4861: np->sv_dmode = INB(nc_dmode) & 0xce;
4862: np->sv_dcntl = INB(nc_dcntl) & 0xa8;
4863: np->sv_ctest3 = INB(nc_ctest3) & 0x01;
4864: np->sv_ctest4 = INB(nc_ctest4) & 0x80;
4865: np->sv_gpcntl = INB(nc_gpcntl);
4866: np->sv_stest2 = INB(nc_stest2) & 0x20;
4867: np->sv_stest4 = INB(nc_stest4);
4868: np->sv_stest1 = INB(nc_stest1);
4869:
4870: np->sv_scntl3 = INB(nc_scntl3) & 0x07;
4871:
4872: if ((np->device_id == PCI_DEVICE_ID_LSI_53C1010) ||
4873: (np->device_id == PCI_DEVICE_ID_LSI_53C1010_66) ){
4874: /*
4875: ** C1010 always uses large fifo, bit 5 rsvd
4876: ** scntl4 used ONLY with C1010
4877: */
4878: np->sv_ctest5 = INB(nc_ctest5) & 0x04 ;
4879: np->sv_scntl4 = INB(nc_scntl4);
4880: }
4881: else {
4882: np->sv_ctest5 = INB(nc_ctest5) & 0x24 ;
4883: np->sv_scntl4 = 0;
4884: }
4885: }
4886:
4887: /*
4888: ** Prepare io register values used by ncr_init()
4889: ** according to selected and supported features.
4890: */
4891: static int __init ncr_prepare_setting(ncb_p np, ncr_nvram *nvram)
4892: {
4893: u_char burst_max;
4894: u_long period;
4895: int i;
4896:
4897: /*
4898: ** Wide ?
4899: */
4900:
4901: np->maxwide = (np->features & FE_WIDE)? 1 : 0;
4902:
4903: /*
4904: ** Get the frequency of the chip's clock.
4905: ** Find the right value for scntl3.
4906: */
4907:
4908: if (np->features & FE_QUAD)
4909: np->multiplier = 4;
4910: else if (np->features & FE_DBLR)
4911: np->multiplier = 2;
4912: else
4913: np->multiplier = 1;
4914:
4915: np->clock_khz = (np->features & FE_CLK80)? 80000 : 40000;
4916: np->clock_khz *= np->multiplier;
4917:
4918: if (np->clock_khz != 40000)
4919: ncr_getclock(np, np->multiplier);
4920:
4921: /*
4922: * Divisor to be used for async (timer pre-scaler).
4923: *
4924: * Note: For C1010 the async divisor is 2(8) if he
4925: * quadrupler is disabled (enabled).
4926: */
4927:
4928: if ( (np->device_id == PCI_DEVICE_ID_LSI_53C1010) ||
4929: (np->device_id == PCI_DEVICE_ID_LSI_53C1010_66)) {
4930:
4931: np->rv_scntl3 = 0;
4932: }
4933: else
4934: {
4935: i = np->clock_divn - 1;
4936: while (--i >= 0) {
4937: if (10ul * SCSI_NCR_MIN_ASYNC * np->clock_khz
4938: > div_10M[i]) {
4939: ++i;
4940: break;
4941: }
4942: }
4943: np->rv_scntl3 = i+1;
4944: }
4945:
4946:
4947: /*
4948: * Save the ultra3 register for the C1010/C1010_66
4949: */
4950:
4951: np->rv_scntl4 = np->sv_scntl4;
4952:
4953: /*
4954: * Minimum synchronous period factor supported by the chip.
4955: * Btw, 'period' is in tenths of nanoseconds.
4956: */
4957:
4958: period = (4 * div_10M[0] + np->clock_khz - 1) / np->clock_khz;
4959: if (period <= 250) np->minsync = 10;
4960: else if (period <= 303) np->minsync = 11;
4961: else if (period <= 500) np->minsync = 12;
4962: else np->minsync = (period + 40 - 1) / 40;
4963:
4964: /*
4965: * Fix up. If sync. factor is 10 (160000Khz clock) and chip
4966: * supports ultra3, then min. sync. period 12.5ns and the factor is 9
4967: */
4968:
4969: if ((np->minsync == 10) && (np->features & FE_ULTRA3))
4970: np->minsync = 9;
4971:
4972: /*
4973: * Check against chip SCSI standard support (SCSI-2,ULTRA,ULTRA2).
4974: *
4975: * Transfer period minimums: SCSI-1 200 (50); Fast 100 (25)
4976: * Ultra 50 (12); Ultra2 (6); Ultra3 (3)
4977: */
4978:
4979: if (np->minsync < 25 && !(np->features & (FE_ULTRA|FE_ULTRA2|FE_ULTRA3)))
4980: np->minsync = 25;
4981: else if (np->minsync < 12 && (np->features & FE_ULTRA))
4982: np->minsync = 12;
4983: else if (np->minsync < 10 && (np->features & FE_ULTRA2))
4984: np->minsync = 10;
4985: else if (np->minsync < 9 && (np->features & FE_ULTRA3))
4986: np->minsync = 9;
4987:
4988: /*
4989: * Maximum synchronous period factor supported by the chip.
4990: */
4991:
4992: period = (11 * div_10M[np->clock_divn - 1]) / (4 * np->clock_khz);
4993: np->maxsync = period > 2540 ? 254 : period / 10;
4994:
4995: /*
4996: ** 64 bit (53C895A or 53C896) ?
4997: */
4998: if (np->features & FE_64BIT)
4999: #ifdef SCSI_NCR_USE_64BIT_DAC
5000: np->rv_ccntl1 |= (XTIMOD | EXTIBMV);
5001: #else
5002: np->rv_ccntl1 |= (DDAC);
5003: #endif
5004:
5005: /*
5006: ** Phase mismatch handled by SCRIPTS (53C895A, 53C896 or C1010) ?
5007: */
5008: if (np->features & FE_NOPM)
5009: np->rv_ccntl0 |= (ENPMJ);
5010:
5011: /*
5012: ** Prepare initial value of other IO registers
5013: */
5014: #if defined SCSI_NCR_TRUST_BIOS_SETTING
5015: np->rv_scntl0 = np->sv_scntl0;
5016: np->rv_dmode = np->sv_dmode;
5017: np->rv_dcntl = np->sv_dcntl;
5018: np->rv_ctest3 = np->sv_ctest3;
5019: np->rv_ctest4 = np->sv_ctest4;
5020: np->rv_ctest5 = np->sv_ctest5;
5021: burst_max = burst_code(np->sv_dmode, np->sv_ctest4, np->sv_ctest5);
5022: #else
5023:
5024: /*
5025: ** Select burst length (dwords)
5026: */
5027: burst_max = driver_setup.burst_max;
5028: if (burst_max == 255)
5029: burst_max = burst_code(np->sv_dmode, np->sv_ctest4, np->sv_ctest5);
5030: if (burst_max > 7)
5031: burst_max = 7;
5032: if (burst_max > np->maxburst)
5033: burst_max = np->maxburst;
5034:
5035: /*
5036: ** DEL 352 - 53C810 Rev x11 - Part Number 609-0392140 - ITEM 2.
5037: ** This chip and the 860 Rev 1 may wrongly use PCI cache line
5038: ** based transactions on LOAD/STORE instructions. So we have
5039: ** to prevent these chips from using such PCI transactions in
5040: ** this driver. The generic sym53c8xx driver that does not use
5041: ** LOAD/STORE instructions does not need this work-around.
5042: */
5043: if ((np->device_id == PCI_DEVICE_ID_NCR_53C810 &&
5044: np->revision_id >= 0x10 && np->revision_id <= 0x11) ||
5045: (np->device_id == PCI_DEVICE_ID_NCR_53C860 &&
5046: np->revision_id <= 0x1))
5047: np->features &= ~(FE_WRIE|FE_ERL|FE_ERMP);
5048:
5049: /*
5050: ** DEL ? - 53C1010 Rev 1 - Part Number 609-0393638
5051: ** 64-bit Slave Cycles must be disabled.
5052: */
5053: if ( ((np->device_id == PCI_DEVICE_ID_LSI_53C1010) && (np->revision_id < 0x02) )
5054: || (np->device_id == PCI_DEVICE_ID_LSI_53C1010_66 ) )
5055: np->rv_ccntl1 |= 0x10;
5056:
5057: /*
5058: ** Select all supported special features.
5059: ** If we are using on-board RAM for scripts, prefetch (PFEN)
5060: ** does not help, but burst op fetch (BOF) does.
5061: ** Disabling PFEN makes sure BOF will be used.
5062: */
5063: if (np->features & FE_ERL)
5064: np->rv_dmode |= ERL; /* Enable Read Line */
5065: if (np->features & FE_BOF)
5066: np->rv_dmode |= BOF; /* Burst Opcode Fetch */
5067: if (np->features & FE_ERMP)
5068: np->rv_dmode |= ERMP; /* Enable Read Multiple */
5069: #if 1
5070: if ((np->features & FE_PFEN) && !np->base2_ba)
5071: #else
5072: if (np->features & FE_PFEN)
5073: #endif
5074: np->rv_dcntl |= PFEN; /* Prefetch Enable */
5075: if (np->features & FE_CLSE)
5076: np->rv_dcntl |= CLSE; /* Cache Line Size Enable */
5077: if (np->features & FE_WRIE)
5078: np->rv_ctest3 |= WRIE; /* Write and Invalidate */
5079:
5080:
5081: if ( (np->device_id != PCI_DEVICE_ID_LSI_53C1010) &&
5082: (np->device_id != PCI_DEVICE_ID_LSI_53C1010_66) &&
5083: (np->features & FE_DFS))
5084: np->rv_ctest5 |= DFS; /* Dma Fifo Size */
5085: /* C1010/C1010_66 always large fifo */
5086:
5087: /*
5088: ** Select some other
5089: */
5090: if (driver_setup.master_parity)
5091: np->rv_ctest4 |= MPEE; /* Master parity checking */
5092: if (driver_setup.scsi_parity)
5093: np->rv_scntl0 |= 0x0a; /* full arb., ena parity, par->ATN */
5094:
5095: #ifdef SCSI_NCR_NVRAM_SUPPORT
5096: /*
5097: ** Get parity checking, host ID and verbose mode from NVRAM
5098: **/
5099: if (nvram) {
5100: switch(nvram->type) {
5101: case SCSI_NCR_TEKRAM_NVRAM:
5102: np->myaddr = nvram->data.Tekram.host_id & 0x0f;
5103: break;
5104: case SCSI_NCR_SYMBIOS_NVRAM:
5105: if (!(nvram->data.Symbios.flags & SYMBIOS_PARITY_ENABLE))
5106: np->rv_scntl0 &= ~0x0a;
5107: np->myaddr = nvram->data.Symbios.host_id & 0x0f;
5108: if (nvram->data.Symbios.flags & SYMBIOS_VERBOSE_MSGS)
5109: np->verbose += 1;
5110: break;
5111: }
5112: }
5113: #endif
5114: /*
5115: ** Get SCSI addr of host adapter (set by bios?).
5116: */
5117: if (np->myaddr == 255) {
5118: np->myaddr = INB(nc_scid) & 0x07;
5119: if (!np->myaddr)
5120: np->myaddr = SCSI_NCR_MYADDR;
5121: }
5122:
5123: #endif /* SCSI_NCR_TRUST_BIOS_SETTING */
5124:
5125: /*
5126: * Prepare initial io register bits for burst length
5127: */
5128: ncr_init_burst(np, burst_max);
5129:
5130: /*
5131: ** Set SCSI BUS mode.
5132: **
5133: ** - ULTRA2 chips (895/895A/896)
5134: ** and ULTRA 3 chips (1010) report the current
5135: ** BUS mode through the STEST4 IO register.
5136: ** - For previous generation chips (825/825A/875),
5137: ** user has to tell us how to check against HVD,
5138: ** since a 100% safe algorithm is not possible.
5139: */
5140: np->scsi_mode = SMODE_SE;
5141: if (np->features & (FE_ULTRA2 | FE_ULTRA3))
5142: np->scsi_mode = (np->sv_stest4 & SMODE);
5143: else if (np->features & FE_DIFF) {
5144: switch(driver_setup.diff_support) {
5145: case 4: /* Trust previous settings if present, then GPIO3 */
5146: if (np->sv_scntl3) {
5147: if (np->sv_stest2 & 0x20)
5148: np->scsi_mode = SMODE_HVD;
5149: break;
5150: }
5151: case 3: /* SYMBIOS controllers report HVD through GPIO3 */
5152: if (nvram && nvram->type != SCSI_NCR_SYMBIOS_NVRAM)
5153: break;
5154: if (INB(nc_gpreg) & 0x08)
5155: break;
5156: case 2: /* Set HVD unconditionally */
5157: np->scsi_mode = SMODE_HVD;
5158: case 1: /* Trust previous settings for HVD */
5159: if (np->sv_stest2 & 0x20)
5160: np->scsi_mode = SMODE_HVD;
5161: break;
5162: default:/* Don't care about HVD */
5163: break;
5164: }
5165: }
5166: if (np->scsi_mode == SMODE_HVD)
5167: np->rv_stest2 |= 0x20;
5168:
5169: /*
5170: ** Set LED support from SCRIPTS.
5171: ** Ignore this feature for boards known to use a
5172: ** specific GPIO wiring and for the 895A or 896
5173: ** that drive the LED directly.
5174: ** Also probe initial setting of GPIO0 as output.
5175: */
5176: if ((driver_setup.led_pin ||
5177: (nvram && nvram->type == SCSI_NCR_SYMBIOS_NVRAM)) &&
5178: !(np->features & FE_LEDC) && !(np->sv_gpcntl & 0x01))
5179: np->features |= FE_LED0;
5180:
5181: /*
5182: ** Set irq mode.
5183: */
5184: switch(driver_setup.irqm & 3) {
5185: case 2:
5186: np->rv_dcntl |= IRQM;
5187: break;
5188: case 1:
5189: np->rv_dcntl |= (np->sv_dcntl & IRQM);
5190: break;
5191: default:
5192: break;
5193: }
5194:
5195: /*
5196: ** Configure targets according to driver setup.
5197: ** If NVRAM present get targets setup from NVRAM.
5198: ** Allow to override sync, wide and NOSCAN from
5199: ** boot command line.
5200: */
5201: for (i = 0 ; i < MAX_TARGET ; i++) {
5202: tcb_p tp = &np->target[i];
5203:
5204: tp->usrsync = 255;
5205: #ifdef SCSI_NCR_NVRAM_SUPPORT
5206: if (nvram) {
5207: switch(nvram->type) {
5208: case SCSI_NCR_TEKRAM_NVRAM:
5209: ncr_Tekram_setup_target(np, i, &nvram->data.Tekram);
5210: break;
5211: case SCSI_NCR_SYMBIOS_NVRAM:
5212: ncr_Symbios_setup_target(np, i, &nvram->data.Symbios);
5213: break;
5214: }
5215: if (driver_setup.use_nvram & 0x2)
5216: tp->usrsync = driver_setup.default_sync;
5217: if (driver_setup.use_nvram & 0x4)
5218: tp->usrwide = driver_setup.max_wide;
5219: if (driver_setup.use_nvram & 0x8)
5220: tp->usrflag &= ~UF_NOSCAN;
5221: }
5222: else {
5223: #else
5224: if (1) {
5225: #endif
5226: tp->usrsync = driver_setup.default_sync;
5227: tp->usrwide = driver_setup.max_wide;
5228: tp->usrtags = MAX_TAGS;
5229: if (!driver_setup.disconnection)
5230: np->target[i].usrflag = UF_NODISC;
5231: }
5232: }
5233:
5234: /*
5235: ** Announce all that stuff to user.
5236: */
5237:
5238: i = nvram ? nvram->type : 0;
5239: printk(KERN_INFO "%s: %sID %d, Fast-%d%s%s\n", ncr_name(np),
5240: i == SCSI_NCR_SYMBIOS_NVRAM ? "Symbios format NVRAM, " :
5241: (i == SCSI_NCR_TEKRAM_NVRAM ? "Tekram format NVRAM, " : ""),
5242: np->myaddr,
5243: np->minsync < 10 ? 80 :
5244: (np->minsync < 12 ? 40 : (np->minsync < 25 ? 20 : 10) ),
5245: (np->rv_scntl0 & 0xa) ? ", Parity Checking" : ", NO Parity",
5246: (np->rv_stest2 & 0x20) ? ", Differential" : "");
5247:
5248: if (bootverbose > 1) {
5249: printk (KERN_INFO "%s: initial SCNTL3/DMODE/DCNTL/CTEST3/4/5 = "
5250: "(hex) %02x/%02x/%02x/%02x/%02x/%02x\n",
5251: ncr_name(np), np->sv_scntl3, np->sv_dmode, np->sv_dcntl,
5252: np->sv_ctest3, np->sv_ctest4, np->sv_ctest5);
5253:
5254: printk (KERN_INFO "%s: final SCNTL3/DMODE/DCNTL/CTEST3/4/5 = "
5255: "(hex) %02x/%02x/%02x/%02x/%02x/%02x\n",
5256: ncr_name(np), np->rv_scntl3, np->rv_dmode, np->rv_dcntl,
5257: np->rv_ctest3, np->rv_ctest4, np->rv_ctest5);
5258: }
5259:
5260: if (bootverbose && np->base2_ba)
5261: printk (KERN_INFO "%s: on-chip RAM at 0x%lx\n",
5262: ncr_name(np), np->base2_ba);
5263:
5264: return 0;
5265: }
5266:
5267:
5268: #ifdef SCSI_NCR_DEBUG_NVRAM
5269:
5270: void __init ncr_display_Symbios_nvram(ncb_p np, Symbios_nvram *nvram)
5271: {
5272: int i;
5273:
5274: /* display Symbios nvram host data */
5275: printk(KERN_DEBUG "%s: HOST ID=%d%s%s%s%s%s\n",
5276: ncr_name(np), nvram->host_id & 0x0f,
5277: (nvram->flags & SYMBIOS_SCAM_ENABLE) ? " SCAM" :"",
5278: (nvram->flags & SYMBIOS_PARITY_ENABLE) ? " PARITY" :"",
5279: (nvram->flags & SYMBIOS_VERBOSE_MSGS) ? " VERBOSE" :"",
5280: (nvram->flags & SYMBIOS_CHS_MAPPING) ? " CHS_ALT" :"",
5281: (nvram->flags1 & SYMBIOS_SCAN_HI_LO) ? " HI_LO" :"");
5282:
5283: /* display Symbios nvram drive data */
5284: for (i = 0 ; i < 15 ; i++) {
5285: struct Symbios_target *tn = &nvram->target[i];
5286: printk(KERN_DEBUG "%s-%d:%s%s%s%s WIDTH=%d SYNC=%d TMO=%d\n",
5287: ncr_name(np), i,
5288: (tn->flags & SYMBIOS_DISCONNECT_ENABLE) ? " DISC" : "",
5289: (tn->flags & SYMBIOS_SCAN_AT_BOOT_TIME) ? " SCAN_BOOT" : "",
5290: (tn->flags & SYMBIOS_SCAN_LUNS) ? " SCAN_LUNS" : "",
5291: (tn->flags & SYMBIOS_QUEUE_TAGS_ENABLED)? " TCQ" : "",
5292: tn->bus_width,
5293: tn->sync_period / 4,
5294: tn->timeout);
5295: }
5296: }
5297:
5298: static u_char Tekram_boot_delay[7] __initdata = {3, 5, 10, 20, 30, 60, 120};
5299:
5300: void __init ncr_display_Tekram_nvram(ncb_p np, Tekram_nvram *nvram)
5301: {
5302: int i, tags, boot_delay;
5303: char *rem;
5304:
5305: /* display Tekram nvram host data */
5306: tags = 2 << nvram->max_tags_index;
5307: boot_delay = 0;
5308: if (nvram->boot_delay_index < 6)
5309: boot_delay = Tekram_boot_delay[nvram->boot_delay_index];
5310: switch((nvram->flags & TEKRAM_REMOVABLE_FLAGS) >> 6) {
5311: default:
5312: case 0: rem = ""; break;
5313: case 1: rem = " REMOVABLE=boot device"; break;
5314: case 2: rem = " REMOVABLE=all"; break;
5315: }
5316:
5317: printk(KERN_DEBUG
5318: "%s: HOST ID=%d%s%s%s%s%s%s%s%s%s BOOT DELAY=%d tags=%d\n",
5319: ncr_name(np), nvram->host_id & 0x0f,
5320: (nvram->flags1 & SYMBIOS_SCAM_ENABLE) ? " SCAM" :"",
5321: (nvram->flags & TEKRAM_MORE_THAN_2_DRIVES) ? " >2DRIVES" :"",
5322: (nvram->flags & TEKRAM_DRIVES_SUP_1GB) ? " >1GB" :"",
5323: (nvram->flags & TEKRAM_RESET_ON_POWER_ON) ? " RESET" :"",
5324: (nvram->flags & TEKRAM_ACTIVE_NEGATION) ? " ACT_NEG" :"",
5325: (nvram->flags & TEKRAM_IMMEDIATE_SEEK) ? " IMM_SEEK" :"",
5326: (nvram->flags & TEKRAM_SCAN_LUNS) ? " SCAN_LUNS" :"",
5327: (nvram->flags1 & TEKRAM_F2_F6_ENABLED) ? " F2_F6" :"",
5328: rem, boot_delay, tags);
5329:
5330: /* display Tekram nvram drive data */
5331: for (i = 0; i <= 15; i++) {
5332: int sync, j;
5333: struct Tekram_target *tn = &nvram->target[i];
5334: j = tn->sync_index & 0xf;
5335: sync = Tekram_sync[j];
5336: printk(KERN_DEBUG "%s-%d:%s%s%s%s%s%s PERIOD=%d\n",
5337: ncr_name(np), i,
5338: (tn->flags & TEKRAM_PARITY_CHECK) ? " PARITY" : "",
5339: (tn->flags & TEKRAM_SYNC_NEGO) ? " SYNC" : "",
5340: (tn->flags & TEKRAM_DISCONNECT_ENABLE) ? " DISC" : "",
5341: (tn->flags & TEKRAM_START_CMD) ? " START" : "",
5342: (tn->flags & TEKRAM_TAGGED_COMMANDS) ? " TCQ" : "",
5343: (tn->flags & TEKRAM_WIDE_NEGO) ? " WIDE" : "",
5344: sync);
5345: }
5346: }
5347: #endif /* SCSI_NCR_DEBUG_NVRAM */
5348:
5349: /*
5350: ** Host attach and initialisations.
5351: **
5352: ** Allocate host data and ncb structure.
5353: ** Request IO region and remap MMIO region.
5354: ** Do chip initialization.
5355: ** If all is OK, install interrupt handling and
5356: ** start the timer daemon.
5357: */
5358:
5359: static int __init
5360: ncr_attach (Scsi_Host_Template *tpnt, int unit, ncr_device *device)
5361: {
5362: struct host_data *host_data;
5363: ncb_p np = 0;
5364: struct Scsi_Host *instance = 0;
5365: u_long flags = 0;
5366: ncr_nvram *nvram = device->nvram;
5367: int i;
5368:
5369: printk(KERN_INFO NAME53C "%s-%d: rev 0x%x on pci bus %d device %d function %d "
5370: #ifdef __sparc__
5371: "irq %s\n",
5372: #else
5373: "irq %d\n",
5374: #endif
5375: device->chip.name, unit, device->chip.revision_id,
5376: device->slot.bus, (device->slot.device_fn & 0xf8) >> 3,
5377: device->slot.device_fn & 7,
5378: #ifdef __sparc__
5379: __irq_itoa(device->slot.irq));
5380: #else
5381: device->slot.irq);
5382: #endif
5383:
5384: /*
5385: ** Allocate host_data structure
5386: */
5387: if (!(instance = scsi_register(tpnt, sizeof(*host_data))))
5388: goto attach_error;
5389: host_data = (struct host_data *) instance->hostdata;
5390:
5391: /*
5392: ** Allocate the host control block.
5393: */
5394: np = __m_calloc_dma(device->pdev, sizeof(struct ncb), "NCB");
5395: if (!np)
5396: goto attach_error;
5397: NCR_INIT_LOCK_NCB(np);
5398: np->pdev = device->pdev;
5399: np->p_ncb = vtobus(np);
5400: host_data->ncb = np;
5401:
5402: /*
5403: ** Store input informations in the host data structure.
5404: */
5405: strncpy(np->chip_name, device->chip.name, sizeof(np->chip_name) - 1);
5406: np->unit = unit;
5407: np->verbose = driver_setup.verbose;
5408: sprintf(np->inst_name, NAME53C "%s-%d", np->chip_name, np->unit);
5409: np->device_id = device->chip.device_id;
5410: np->revision_id = device->chip.revision_id;
5411: np->bus = device->slot.bus;
5412: np->device_fn = device->slot.device_fn;
5413: np->features = device->chip.features;
5414: np->clock_divn = device->chip.nr_divisor;
5415: np->maxoffs = device->chip.offset_max;
5416: np->maxburst = device->chip.burst_max;
5417: np->myaddr = device->host_id;
5418:
5419: /*
5420: ** Allocate the start queue.
5421: */
5422: np->squeue = (ncrcmd *)
5423: m_calloc_dma(sizeof(ncrcmd)*(MAX_START*2), "SQUEUE");
5424: if (!np->squeue)
5425: goto attach_error;
5426: np->p_squeue = vtobus(np->squeue);
5427:
5428: /*
5429: ** Allocate the done queue.
5430: */
5431: np->dqueue = (ncrcmd *)
5432: m_calloc_dma(sizeof(ncrcmd)*(MAX_START*2), "DQUEUE");
5433: if (!np->dqueue)
5434: goto attach_error;
5435:
5436: /*
5437: ** Allocate the target bus address array.
5438: */
5439: np->targtbl = (u_int32 *) m_calloc_dma(256, "TARGTBL");
5440: if (!np->targtbl)
5441: goto attach_error;
5442:
5443: /*
5444: ** Allocate SCRIPTS areas
5445: */
5446: np->script0 = (struct script *)
5447: m_calloc_dma(sizeof(struct script), "SCRIPT");
5448: if (!np->script0)
5449: goto attach_error;
5450: np->scripth0 = (struct scripth *)
5451: m_calloc_dma(sizeof(struct scripth), "SCRIPTH");
5452: if (!np->scripth0)
5453: goto attach_error;
5454:
5455: /*
5456: ** Initialyze the CCB free queue and,
5457: ** allocate some CCB. We need at least ONE.
5458: */
5459: xpt_que_init(&np->free_ccbq);
5460: xpt_que_init(&np->b0_ccbq);
5461: if (!ncr_alloc_ccb(np))
5462: goto attach_error;
5463:
5464: /*
5465: ** Initialize timer structure
5466: **
5467: */
5468: init_timer(&np->timer);
5469: np->timer.data = (unsigned long) np;
5470: np->timer.function = sym53c8xx_timeout;
5471:
5472: /*
5473: ** Try to map the controller chip to
5474: ** virtual and physical memory.
5475: */
5476:
5477: np->base_ba = device->slot.base;
5478: np->base_ws = (np->features & FE_IO256)? 256 : 128;
5479: np->base2_ba = (np->features & FE_RAM)? device->slot.base_2 : 0;
5480:
5481: #ifndef SCSI_NCR_IOMAPPED
5482: np->base_va = remap_pci_mem(np->base_ba, np->base_ws);
5483: if (!np->base_va) {
5484: printk(KERN_ERR "%s: can't map PCI MMIO region\n",ncr_name(np));
5485: goto attach_error;
5486: }
5487: else if (bootverbose > 1)
5488: printk(KERN_INFO "%s: using memory mapped IO\n", ncr_name(np));
5489:
5490: /*
5491: ** Make the controller's registers available.
5492: ** Now the INB INW INL OUTB OUTW OUTL macros
5493: ** can be used safely.
5494: */
5495:
5496: np->reg = (struct ncr_reg *) np->base_va;
5497:
5498: #endif /* !defined SCSI_NCR_IOMAPPED */
5499:
5500: /*
5501: ** If on-chip RAM is used, make sure SCRIPTS isn't too large.
5502: */
5503: if (np->base2_ba && sizeof(struct script) > 4096) {
5504: printk(KERN_ERR "%s: script too large.\n", ncr_name(np));
5505: goto attach_error;
5506: }
5507:
5508: /*
5509: ** Try to map the controller chip into iospace.
5510: */
5511:
5512: if (device->slot.io_port) {
5513: request_region(device->slot.io_port, np->base_ws, NAME53C8XX);
5514: np->base_io = device->slot.io_port;
5515: }
5516:
5517: #ifdef SCSI_NCR_NVRAM_SUPPORT
5518: if (nvram) {
5519: switch(nvram->type) {
5520: case SCSI_NCR_SYMBIOS_NVRAM:
5521: #ifdef SCSI_NCR_DEBUG_NVRAM
5522: ncr_display_Symbios_nvram(np, &nvram->data.Symbios);
5523: #endif
5524: break;
5525: case SCSI_NCR_TEKRAM_NVRAM:
5526: #ifdef SCSI_NCR_DEBUG_NVRAM
5527: ncr_display_Tekram_nvram(np, &nvram->data.Tekram);
5528: #endif
5529: break;
5530: default:
5531: nvram = 0;
5532: #ifdef SCSI_NCR_DEBUG_NVRAM
5533: printk(KERN_DEBUG "%s: NVRAM: None or invalid data.\n", ncr_name(np));
5534: #endif
5535: }
5536: }
5537: #endif
5538:
5539: /*
5540: ** Save setting of some IO registers, so we will
5541: ** be able to probe specific implementations.
5542: */
5543: ncr_save_initial_setting (np);
5544:
5545: /*
5546: ** Reset the chip now, since it has been reported
5547: ** that SCSI clock calibration may not work properly
5548: ** if the chip is currently active.
5549: */
5550: ncr_chip_reset (np);
5551:
5552: /*
5553: ** Do chip dependent initialization.
5554: */
5555: (void) ncr_prepare_setting(np, nvram);
5556:
5557: /*
5558: ** Check the PCI clock frequency if needed.
5559: **
5560: ** Must be done after ncr_prepare_setting since it destroys
5561: ** STEST1 that is used to probe for the clock multiplier.
5562: **
5563: ** The range is currently [22688 - 45375 Khz], given
5564: ** the values used by ncr_getclock().
5565: ** This calibration of the frequecy measurement
5566: ** algorithm against the PCI clock frequency is only
5567: ** performed if the driver has had to measure the SCSI
5568: ** clock due to other heuristics not having been enough
5569: ** to deduce the SCSI clock frequency.
5570: **
5571: ** When the chip has been initialized correctly by the
5572: ** SCSI BIOS, the driver deduces the presence of the
5573: ** clock multiplier and the value of the SCSI clock from
5574: ** initial values of IO registers, and therefore no
5575: ** clock measurement is performed.
5576: ** Normally the driver should never have to measure any
5577: ** clock, unless the controller may use a 80 MHz clock
5578: ** or has a clock multiplier and any of the following
5579: ** condition is met:
5580: **
5581: ** - No SCSI BIOS is present.
5582: ** - SCSI BIOS did'nt enable the multiplier for some reason.
5583: ** - User has disabled the controller from the SCSI BIOS.
5584: ** - User booted the O/S from another O/S that did'nt enable
5585: ** the multiplier for some reason.
5586: **
5587: ** As a result, the driver may only have to measure some
5588: ** frequency in very unusual situations.
5589: **
5590: ** For this reality test against the PCI clock to really
5591: ** protect against flaws in the udelay() calibration or
5592: ** driver problem that affect the clock measurement
5593: ** algorithm, the actual PCI clock frequency must be 33 MHz.
5594: */
5595: i = np->pciclock_max ? ncr_getpciclock(np) : 0;
5596: if (i && (i < np->pciclock_min || i > np->pciclock_max)) {
5597: printk(KERN_ERR "%s: PCI clock (%u KHz) is out of range "
5598: "[%u KHz - %u KHz].\n",
5599: ncr_name(np), i, np->pciclock_min, np->pciclock_max);
5600: goto attach_error;
5601: }
5602:
5603: /*
5604: ** Patch script to physical addresses
5605: */
5606: ncr_script_fill (&script0, &scripth0);
5607:
5608: np->p_script = vtobus(np->script0);
5609: np->p_scripth = vtobus(np->scripth0);
5610: np->p_scripth0 = np->p_scripth;
5611:
5612: if (np->base2_ba) {
5613: np->p_script = pcivtobus(np->base2_ba);
5614: if (np->features & FE_RAM8K) {
5615: np->base2_ws = 8192;
5616: np->p_scripth = np->p_script + 4096;
5617: #if BITS_PER_LONG > 32
5618: np->scr_ram_seg = cpu_to_scr(np->base2_ba >> 32);
5619: #endif
5620: }
5621: else
5622: np->base2_ws = 4096;
5623: #ifndef SCSI_NCR_PCI_MEM_NOT_SUPPORTED
5624: np->base2_va = remap_pci_mem(np->base2_ba, np->base2_ws);
5625: if (!np->base2_va) {
5626: printk(KERN_ERR "%s: can't map PCI MEMORY region\n",
5627: ncr_name(np));
5628: goto attach_error;
5629: }
5630: #endif
5631: }
5632:
5633: ncr_script_copy_and_bind (np, (ncrcmd *) &script0, (ncrcmd *) np->script0, sizeof(struct script));
5634: ncr_script_copy_and_bind (np, (ncrcmd *) &scripth0, (ncrcmd *) np->scripth0, sizeof(struct scripth));
5635:
5636: /*
5637: ** Patch some variables in SCRIPTS
5638: */
5639: np->scripth0->pm0_data_addr[0] =
5640: cpu_to_scr(NCB_SCRIPT_PHYS(np, pm0_data));
5641: np->scripth0->pm1_data_addr[0] =
5642: cpu_to_scr(NCB_SCRIPT_PHYS(np, pm1_data));
5643:
5644: /*
5645: ** Patch if not Ultra 3 - Do not write to scntl4
5646: */
5647: if (np->features & FE_ULTRA3) {
5648: np->script0->resel_scntl4[0] = cpu_to_scr(SCR_LOAD_REL (scntl4, 1));
5649: np->script0->resel_scntl4[1] = cpu_to_scr(offsetof(struct tcb, uval));
5650: }
5651:
5652:
5653: #ifdef SCSI_NCR_PCI_MEM_NOT_SUPPORTED
5654: np->scripth0->script0_ba[0] = cpu_to_scr(vtobus(np->script0));
5655: np->scripth0->script0_ba64[0] = cpu_to_scr(vtobus(np->script0));
5656: np->scripth0->scripth0_ba64[0] = cpu_to_scr(vtobus(np->scripth0));
5657: np->scripth0->ram_seg64[0] = np->scr_ram_seg;
5658: #endif
5659: /*
5660: ** Prepare the idle and invalid task actions.
5661: */
5662: np->idletask.start = cpu_to_scr(NCB_SCRIPT_PHYS (np, idle));
5663: np->idletask.restart = cpu_to_scr(NCB_SCRIPTH_PHYS (np, bad_i_t_l));
5664: np->p_idletask = NCB_PHYS(np, idletask);
5665:
5666: np->notask.start = cpu_to_scr(NCB_SCRIPT_PHYS (np, idle));
5667: np->notask.restart = cpu_to_scr(NCB_SCRIPTH_PHYS (np, bad_i_t_l));
5668: np->p_notask = NCB_PHYS(np, notask);
5669:
5670: np->bad_i_t_l.start = cpu_to_scr(NCB_SCRIPT_PHYS (np, idle));
5671: np->bad_i_t_l.restart = cpu_to_scr(NCB_SCRIPTH_PHYS (np, bad_i_t_l));
5672: np->p_bad_i_t_l = NCB_PHYS(np, bad_i_t_l);
5673:
5674: np->bad_i_t_l_q.start = cpu_to_scr(NCB_SCRIPT_PHYS (np, idle));
5675: np->bad_i_t_l_q.restart = cpu_to_scr(NCB_SCRIPTH_PHYS (np,bad_i_t_l_q));
5676: np->p_bad_i_t_l_q = NCB_PHYS(np, bad_i_t_l_q);
5677:
5678: /*
5679: ** Allocate and prepare the bad lun table.
5680: */
5681: np->badluntbl = m_calloc_dma(256, "BADLUNTBL");
5682: if (!np->badluntbl)
5683: goto attach_error;
5684:
5685: assert (offsetof(struct lcb, resel_task) == 0);
5686: np->resel_badlun = cpu_to_scr(NCB_SCRIPTH_PHYS(np, resel_bad_lun));
5687:
5688: for (i = 0 ; i < 64 ; i++)
5689: np->badluntbl[i] = cpu_to_scr(NCB_PHYS(np, resel_badlun));
5690:
5691: /*
5692: ** Prepare the target bus address array.
5693: */
5694: np->scripth0->targtbl[0] = cpu_to_scr(vtobus(np->targtbl));
5695: for (i = 0 ; i < MAX_TARGET ; i++) {
5696: np->targtbl[i] = cpu_to_scr(NCB_PHYS(np, target[i]));
5697: np->target[i].b_luntbl = cpu_to_scr(vtobus(np->badluntbl));
5698: np->target[i].b_lun0 = cpu_to_scr(NCB_PHYS(np, resel_badlun));
5699: }
5700:
5701: /*
5702: ** Patch the script for LED support.
5703: */
5704:
5705: if (np->features & FE_LED0) {
5706: np->script0->idle[0] =
5707: cpu_to_scr(SCR_REG_REG(gpreg, SCR_OR, 0x01));
5708: np->script0->reselected[0] =
5709: cpu_to_scr(SCR_REG_REG(gpreg, SCR_AND, 0xfe));
5710: np->script0->start[0] =
5711: cpu_to_scr(SCR_REG_REG(gpreg, SCR_AND, 0xfe));
5712: }
5713:
5714: /*
5715: ** Patch the script to provide an extra clock cycle on
5716: ** data out phase - 53C1010_66MHz part only.
5717: */
5718: if (np->device_id == PCI_DEVICE_ID_LSI_53C1010_66){
5719: np->script0->datao_phase[0] =
5720: cpu_to_scr(SCR_REG_REG(scntl4, SCR_OR, 0x0c));
5721: }
5722:
5723: #ifdef SCSI_NCR_IARB_SUPPORT
5724: /*
5725: ** If user does not want to use IMMEDIATE ARBITRATION
5726: ** when we are reselected while attempting to arbitrate,
5727: ** patch the SCRIPTS accordingly with a SCRIPT NO_OP.
5728: */
5729: if (!(driver_setup.iarb & 1))
5730: np->script0->ungetjob[0] = cpu_to_scr(SCR_NO_OP);
5731: /*
5732: ** If user wants IARB to be set when we win arbitration
5733: ** and have other jobs, compute the max number of consecutive
5734: ** settings of IARB hint before we leave devices a chance to
5735: ** arbitrate for reselection.
5736: */
5737: np->iarb_max = (driver_setup.iarb >> 4);
5738: #endif
5739:
5740: /*
5741: ** DEL 472 - 53C896 Rev 1 - Part Number 609-0393055 - ITEM 5.
5742: */
5743: if (np->device_id == PCI_DEVICE_ID_NCR_53C896 &&
5744: np->revision_id <= 0x1 && (np->features & FE_NOPM)) {
5745: np->scatter = ncr_scatter_896R1;
5746: np->script0->datai_phase[0] = cpu_to_scr(SCR_JUMP);
5747: np->script0->datai_phase[1] =
5748: cpu_to_scr(NCB_SCRIPTH_PHYS (np, tweak_pmj));
5749: np->script0->datao_phase[0] = cpu_to_scr(SCR_JUMP);
5750: np->script0->datao_phase[1] =
5751: cpu_to_scr(NCB_SCRIPTH_PHYS (np, tweak_pmj));
5752: }
5753: else
5754: #ifdef DEBUG_896R1
5755: np->scatter = ncr_scatter_896R1;
5756: #else
5757: np->scatter = ncr_scatter;
5758: #endif
5759:
5760: /*
5761: ** Reset chip.
5762: ** We should use ncr_soft_reset(), but we donnot want to do
5763: ** so, since we may not be safe if ABRT interrupt occurs due
5764: ** to the BIOS or previous O/S having enable this interrupt.
5765: **
5766: ** For C1010 need to set ABRT bit prior to SRST if SCRIPTs
5767: ** are running. Not true in this case.
5768: */
5769: ncr_chip_reset(np);
5770:
5771: /*
5772: ** Now check the cache handling of the pci chipset.
5773: */
5774:
5775: if (ncr_snooptest (np)) {
5776: printk (KERN_ERR "CACHE INCORRECTLY CONFIGURED.\n");
5777: goto attach_error;
5778: };
5779:
5780: /*
5781: ** Install the interrupt handler.
5782: ** If we synchonize the C code with SCRIPTS on interrupt,
5783: ** we donnot want to share the INTR line at all.
5784: */
5785: if (request_irq(device->slot.irq, sym53c8xx_intr,
5786: #ifdef SCSI_NCR_PCIQ_SYNC_ON_INTR
5787: ((driver_setup.irqm & 0x20) ? 0 : SA_INTERRUPT),
5788: #else
5789: ((driver_setup.irqm & 0x10) ? 0 : SA_SHIRQ) |
5790:
5791: #if 0 && LINUX_VERSION_CODE < LinuxVersionCode(2,2,0)
5792: ((driver_setup.irqm & 0x20) ? 0 : SA_INTERRUPT),
5793: #else
5794: 0,
5795: #endif
5796: #endif
5797: NAME53C8XX, np)) {
5798: printk(KERN_ERR "%s: request irq %d failure\n",
5799: ncr_name(np), device->slot.irq);
5800: goto attach_error;
5801: }
5802: np->irq = device->slot.irq;
5803:
5804: /*
5805: ** After SCSI devices have been opened, we cannot
5806: ** reset the bus safely, so we do it here.
5807: ** Interrupt handler does the real work.
5808: ** Process the reset exception,
5809: ** if interrupts are not enabled yet.
5810: ** Then enable disconnects.
5811: */
5812: NCR_LOCK_NCB(np, flags);
5813: if (ncr_reset_scsi_bus(np, 0, driver_setup.settle_delay) != 0) {
5814: printk(KERN_ERR "%s: FATAL ERROR: CHECK SCSI BUS - CABLES, TERMINATION, DEVICE POWER etc.!\n", ncr_name(np));
5815:
5816: NCR_UNLOCK_NCB(np, flags);
5817: goto attach_error;
5818: }
5819: ncr_exception (np);
5820:
5821: /*
5822: ** The middle-level SCSI driver does not
5823: ** wait for devices to settle.
5824: ** Wait synchronously if more than 2 seconds.
5825: */
5826: if (driver_setup.settle_delay > 2) {
5827: printk(KERN_INFO "%s: waiting %d seconds for scsi devices to settle...\n",
5828: ncr_name(np), driver_setup.settle_delay);
5829: MDELAY (1000 * driver_setup.settle_delay);
5830: }
5831:
5832: /*
5833: ** start the timeout daemon
5834: */
5835: np->lasttime=0;
5836: ncr_timeout (np);
5837:
5838: /*
5839: ** use SIMPLE TAG messages by default
5840: */
5841: #ifdef SCSI_NCR_ALWAYS_SIMPLE_TAG
5842: np->order = M_SIMPLE_TAG;
5843: #endif
5844:
5845: /*
5846: ** Done.
5847: */
5848: if (!first_host)
5849: first_host = instance;
5850:
5851: /*
5852: ** Fill Linux host instance structure
5853: ** and return success.
5854: */
5855: instance->max_channel = 0;
5856: instance->this_id = np->myaddr;
5857: instance->max_id = np->maxwide ? 16 : 8;
5858: instance->max_lun = MAX_LUN;
5859: #ifndef SCSI_NCR_IOMAPPED
5860: #if LINUX_VERSION_CODE >= LinuxVersionCode(2,3,29)
5861: instance->base = (unsigned long) np->reg;
5862: #else
5863: instance->base = (char *) np->reg;
5864: #endif
5865: #endif
5866: instance->irq = np->irq;
5867: instance->unique_id = np->base_io;
5868: instance->io_port = np->base_io;
5869: instance->n_io_port = np->base_ws;
5870: instance->dma_channel = 0;
5871: instance->cmd_per_lun = MAX_TAGS;
5872: instance->can_queue = (MAX_START-4);
5873:
5874: np->check_integrity = 0;
5875:
5876: #ifdef SCSI_NCR_INTEGRITY_CHECKING
5877: instance->check_integrity = 0;
5878:
5879: #ifdef SCSI_NCR_ENABLE_INTEGRITY_CHECK
5880: if ( !(driver_setup.bus_check & 0x04) ) {
5881: np->check_integrity = 1;
5882: instance->check_integrity = 1;
5883: }
5884: #endif
5885: #endif
5886:
5887: instance->select_queue_depths = sym53c8xx_select_queue_depths;
5888:
5889: NCR_UNLOCK_NCB(np, flags);
5890:
5891: /*
5892: ** Now let the generic SCSI driver
5893: ** look for the SCSI devices on the bus ..
5894: */
5895: return 0;
5896:
5897: attach_error:
5898: if (!instance) return -1;
5899: printk(KERN_INFO "%s: giving up ...\n", ncr_name(np));
5900: if (np)
5901: ncr_free_resources(np);
5902: scsi_unregister(instance);
5903:
5904: return -1;
5905: }
5906:
5907:
5908: /*
5909: ** Free controller resources.
5910: */
5911: static void ncr_free_resources(ncb_p np)
5912: {
5913: ccb_p cp;
5914: tcb_p tp;
5915: lcb_p lp;
5916: int target, lun;
5917:
5918: if (np->irq)
5919: free_irq(np->irq, np);
5920: if (np->base_io)
5921: release_region(np->base_io, np->base_ws);
5922: #ifndef SCSI_NCR_PCI_MEM_NOT_SUPPORTED
5923: if (np->base_va)
5924: unmap_pci_mem(np->base_va, np->base_ws);
5925: if (np->base2_va)
5926: unmap_pci_mem(np->base2_va, np->base2_ws);
5927: #endif
5928: if (np->scripth0)
5929: m_free_dma(np->scripth0, sizeof(struct scripth), "SCRIPTH");
5930: if (np->script0)
5931: m_free_dma(np->script0, sizeof(struct script), "SCRIPT");
5932: if (np->squeue)
5933: m_free_dma(np->squeue, sizeof(ncrcmd)*(MAX_START*2), "SQUEUE");
5934: if (np->dqueue)
5935: m_free_dma(np->dqueue, sizeof(ncrcmd)*(MAX_START*2),"DQUEUE");
5936:
5937: while ((cp = np->ccbc) != NULL) {
5938: np->ccbc = cp->link_ccb;
5939: m_free_dma(cp, sizeof(*cp), "CCB");
5940: }
5941:
5942: if (np->badluntbl)
5943: m_free_dma(np->badluntbl, 256,"BADLUNTBL");
5944:
5945: for (target = 0; target < MAX_TARGET ; target++) {
5946: tp = &np->target[target];
5947: for (lun = 0 ; lun < MAX_LUN ; lun++) {
5948: lp = ncr_lp(np, tp, lun);
5949: if (!lp)
5950: continue;
5951: if (lp->tasktbl != &lp->tasktbl_0)
5952: m_free_dma(lp->tasktbl, MAX_TASKS*4, "TASKTBL");
5953: if (lp->cb_tags)
5954: m_free(lp->cb_tags, MAX_TAGS, "CB_TAGS");
5955: m_free_dma(lp, sizeof(*lp), "LCB");
5956: }
5957: #if MAX_LUN > 1
5958: if (tp->lmp)
5959: m_free(tp->lmp, MAX_LUN * sizeof(lcb_p), "LMP");
5960: if (tp->luntbl)
5961: m_free_dma(tp->luntbl, 256, "LUNTBL");
5962: #endif
5963: }
5964:
5965: if (np->targtbl)
5966: m_free_dma(np->targtbl, 256, "TARGTBL");
5967:
5968: m_free_dma(np, sizeof(*np), "NCB");
5969: }
5970:
5971:
5972: /*==========================================================
5973: **
5974: **
5975: ** Done SCSI commands list management.
5976: **
5977: ** We donnot enter the scsi_done() callback immediately
5978: ** after a command has been seen as completed but we
5979: ** insert it into a list which is flushed outside any kind
5980: ** of driver critical section.
5981: ** This allows to do minimal stuff under interrupt and
5982: ** inside critical sections and to also avoid locking up
5983: ** on recursive calls to driver entry points under SMP.
5984: ** In fact, the only kernel point which is entered by the
5985: ** driver with a driver lock set is get_free_pages(GFP_ATOMIC...)
5986: ** that shall not reenter the driver under any circumstance.
5987: **
5988: **==========================================================
5989: */
5990: static inline void ncr_queue_done_cmd(ncb_p np, Scsi_Cmnd *cmd)
5991: {
5992: unmap_scsi_data(np, cmd);
5993: cmd->host_scribble = (char *) np->done_list;
5994: np->done_list = cmd;
5995: }
5996:
5997: static inline void ncr_flush_done_cmds(Scsi_Cmnd *lcmd)
5998: {
5999: Scsi_Cmnd *cmd;
6000:
6001: while (lcmd) {
6002: cmd = lcmd;
6003: lcmd = (Scsi_Cmnd *) cmd->host_scribble;
6004: cmd->scsi_done(cmd);
6005: }
6006: }
6007:
6008: /*==========================================================
6009: **
6010: **
6011: ** Prepare the next negotiation message for integrity check,
6012: ** if needed.
6013: **
6014: ** Fill in the part of message buffer that contains the
6015: ** negotiation and the nego_status field of the CCB.
6016: ** Returns the size of the message in bytes.
6017: **
6018: ** If tp->ppr_negotiation is 1 and a M_REJECT occurs, then
6019: ** we disable ppr_negotiation. If the first ppr_negotiation is
6020: ** successful, set this flag to 2.
6021: **
6022: **==========================================================
6023: */
6024: #ifdef SCSI_NCR_INTEGRITY_CHECKING
6025: static int ncr_ic_nego(ncb_p np, ccb_p cp, Scsi_Cmnd *cmd, u_char *msgptr)
6026: {
6027: tcb_p tp = &np->target[cp->target];
6028: int msglen = 0;
6029: int nego = 0;
6030: u_char new_width, new_offset, new_period;
6031: u_char no_increase;
6032:
6033: if (tp->ppr_negotiation == 1) /* PPR message successful */
6034: tp->ppr_negotiation = 2;
6035:
6036: if (tp->inq_done) {
6037:
6038: if (!tp->ic_maximums_set) {
6039: tp->ic_maximums_set = 1;
6040:
6041: /*
6042: * Check against target, host and user limits
6043: */
6044: if ( (tp->inq_byte7 & INQ7_WIDE16) &&
6045: np->maxwide && tp->usrwide)
6046: tp->ic_max_width = 1;
6047: else
6048: tp->ic_max_width = 0;
6049:
6050:
6051: if ((tp->inq_byte7 & INQ7_SYNC) && tp->maxoffs)
6052: tp->ic_min_sync = (tp->minsync < np->minsync) ?
6053: np->minsync : tp->minsync;
6054: else
6055: tp->ic_min_sync = 255;
6056:
6057: tp->period = 1;
6058: tp->widedone = 1;
6059:
6060: /*
6061: * Enable PPR negotiation - only if Ultra3 support
6062: * is accessible.
6063: */
6064:
6065: #if 0
6066: if (tp->ic_max_width && (tp->ic_min_sync != 255 ))
6067: tp->ppr_negotiation = 1;
6068: #endif
6069: tp->ppr_negotiation = 0;
6070: if (np->features & FE_ULTRA3) {
6071: if (tp->ic_max_width && (tp->ic_min_sync == 0x09))
6072: tp->ppr_negotiation = 1;
6073: }
6074:
6075: if (!tp->ppr_negotiation)
6076: cmd->ic_nego &= ~NS_PPR;
6077: }
6078:
6079: if (DEBUG_FLAGS & DEBUG_IC) {
6080: printk("%s: cmd->ic_nego %d, 1st byte 0x%2X\n",
6081: ncr_name(np), cmd->ic_nego, cmd->cmnd[0]);
6082: }
6083:
6084: /* Previous command recorded a parity or an initiator
6085: * detected error condition. Force bus to narrow for this
6086: * target. Clear flag. Negotation on request sense.
6087: * Note: kernel forces 2 bus resets :o( but clears itself out.
6088: * Minor bug? in scsi_obsolete.c (ugly)
6089: */
6090: if (np->check_integ_par) {
6091: printk("%s: Parity Error. Target set to narrow.\n",
6092: ncr_name(np));
6093: tp->ic_max_width = 0;
6094: tp->widedone = tp->period = 0;
6095: }
6096:
6097: /* Initializing:
6098: * If ic_nego == NS_PPR, we are in the initial test for
6099: * PPR messaging support. If driver flag is clear, then
6100: * either we don't support PPR nego (narrow or async device)
6101: * or this is the second TUR and we have had a M. REJECT
6102: * or unexpected disconnect on the first PPR negotiation.
6103: * Do not negotiate, reset nego flags (in case a reset has
6104: * occurred), clear ic_nego and return.
6105: * General case: Kernel will clear flag on a fallback.
6106: * Do only SDTR or WDTR in the future.
6107: */
6108: if (!tp->ppr_negotiation && (cmd->ic_nego == NS_PPR )) {
6109: tp->ppr_negotiation = 0;
6110: cmd->ic_nego &= ~NS_PPR;
6111: tp->widedone = tp->period = 1;
6112: return msglen;
6113: }
6114: else if (( tp->ppr_negotiation && !(cmd->ic_nego & NS_PPR )) ||
6115: (!tp->ppr_negotiation && (cmd->ic_nego & NS_PPR )) ) {
6116: tp->ppr_negotiation = 0;
6117: cmd->ic_nego &= ~NS_PPR;
6118: }
6119:
6120: /*
6121: * Always check the PPR nego. flag bit if ppr_negotiation
6122: * is set. If the ic_nego PPR bit is clear,
6123: * there must have been a fallback. Do only
6124: * WDTR / SDTR in the future.
6125: */
6126: if ((tp->ppr_negotiation) && (!(cmd->ic_nego & NS_PPR)))
6127: tp->ppr_negotiation = 0;
6128:
6129: /* In case of a bus reset, ncr_negotiate will reset
6130: * the flags tp->widedone and tp->period to 0, forcing
6131: * a new negotiation. Do WDTR then SDTR. If PPR, do both.
6132: * Do NOT increase the period. It is possible for the Scsi_Cmnd
6133: * flags to be set to increase the period when a bus reset
6134: * occurs - we don't want to change anything.
6135: */
6136:
6137: no_increase = 0;
6138:
6139: if (tp->ppr_negotiation && (!tp->widedone) && (!tp->period) ) {
6140: cmd->ic_nego = NS_PPR;
6141: tp->widedone = tp->period = 1;
6142: no_increase = 1;
6143: }
6144: else if (!tp->widedone) {
6145: cmd->ic_nego = NS_WIDE;
6146: tp->widedone = 1;
6147: no_increase = 1;
6148: }
6149: else if (!tp->period) {
6150: cmd->ic_nego = NS_SYNC;
6151: tp->period = 1;
6152: no_increase = 1;
6153: }
6154:
6155: new_width = cmd->ic_nego_width & tp->ic_max_width;
6156:
6157: switch (cmd->ic_nego_sync) {
6158: case 2: /* increase the period */
6159: if (!no_increase) {
6160: if (tp->ic_min_sync <= 0x09)
6161: tp->ic_min_sync = 0x0A;
6162: else if (tp->ic_min_sync <= 0x0A)
6163: tp->ic_min_sync = 0x0C;
6164: else if (tp->ic_min_sync <= 0x0C)
6165: tp->ic_min_sync = 0x19;
6166: else if (tp->ic_min_sync <= 0x19)
6167: tp->ic_min_sync *= 2;
6168: else {
6169: tp->ic_min_sync = 255;
6170: cmd->ic_nego_sync = 0;
6171: tp->maxoffs = 0;
6172: }
6173: }
6174: new_period = tp->maxoffs?tp->ic_min_sync:0;
6175: new_offset = tp->maxoffs;
6176: break;
6177:
6178: case 1: /* nego. to maximum */
6179: new_period = tp->maxoffs?tp->ic_min_sync:0;
6180: new_offset = tp->maxoffs;
6181: break;
6182:
6183: case 0: /* nego to async */
6184: default:
6185: new_period = 0;
6186: new_offset = 0;
6187: break;
6188: };
6189:
6190:
6191: nego = NS_NOCHANGE;
6192: if (tp->ppr_negotiation) {
6193: u_char options_byte = 0;
6194:
6195: /*
6196: ** Must make sure data is consistent.
6197: ** If period is 9 and sync, must be wide and DT bit set.
6198: ** else period must be larger. If the width is 0,
6199: ** reset bus to wide but increase the period to 0x0A.
6200: ** Note: The strange else clause is due to the integrity check.
6201: ** If fails at 0x09, wide, the I.C. code will redo at the same
6202: ** speed but a narrow bus. The driver must take care of slowing
6203: ** the bus speed down.
6204: **
6205: ** The maximum offset in ST mode is 31, in DT mode 62 (1010/1010_66 only)
6206: */
6207: if ( (new_period==0x09) && new_offset) {
6208: if (new_width)
6209: options_byte = 0x02;
6210: else {
6211: tp->ic_min_sync = 0x0A;
6212: new_period = 0x0A;
6213: cmd->ic_nego_width = 1;
6214: new_width = 1;
6215: new_offset &= 0x1f;
6216: }
6217: }
6218: else if (new_period > 0x09)
6219: new_offset &= 0x1f;
6220:
6221: nego = NS_PPR;
6222:
6223: msgptr[msglen++] = M_EXTENDED;
6224: msgptr[msglen++] = 6;
6225: msgptr[msglen++] = M_X_PPR_REQ;
6226: msgptr[msglen++] = new_period;
6227: msgptr[msglen++] = 0;
6228: msgptr[msglen++] = new_offset;
6229: msgptr[msglen++] = new_width;
6230: msgptr[msglen++] = options_byte;
6231:
6232: }
6233: else {
6234: switch (cmd->ic_nego & ~NS_PPR) {
6235: case NS_WIDE:
6236: /*
6237: ** WDTR negotiation on if device supports
6238: ** wide or if wide device forced narrow
6239: ** due to a parity error.
6240: */
6241:
6242: cmd->ic_nego_width &= tp->ic_max_width;
6243:
6244: if (tp->ic_max_width | np->check_integ_par) {
6245: nego = NS_WIDE;
6246: msgptr[msglen++] = M_EXTENDED;
6247: msgptr[msglen++] = 2;
6248: msgptr[msglen++] = M_X_WIDE_REQ;
6249: msgptr[msglen++] = new_width;
6250: }
6251: break;
6252:
6253: case NS_SYNC:
6254: /*
6255: ** negotiate synchronous transfers
6256: ** Target must support sync transfers.
6257: ** Min. period = 0x0A, maximum offset of 31=0x1f.
6258: */
6259:
6260: if (tp->inq_byte7 & INQ7_SYNC) {
6261:
6262: if (new_offset && (new_period < 0x0A)) {
6263: tp->ic_min_sync = 0x0A;
6264: new_period = 0x0A;
6265: }
6266: nego = NS_SYNC;
6267: msgptr[msglen++] = M_EXTENDED;
6268: msgptr[msglen++] = 3;
6269: msgptr[msglen++] = M_X_SYNC_REQ;
6270: msgptr[msglen++] = new_period;
6271: msgptr[msglen++] = new_offset & 0x1f;
6272: }
6273: else
6274: cmd->ic_nego_sync = 0;
6275: break;
6276:
6277: case NS_NOCHANGE:
6278: break;
6279: }
6280: }
6281:
6282: };
6283:
6284: cp->nego_status = nego;
6285: np->check_integ_par = 0;
6286:
6287: if (nego) {
6288: tp->nego_cp = cp;
6289: if (DEBUG_FLAGS & DEBUG_NEGO) {
6290: ncr_print_msg(cp, nego == NS_WIDE ?
6291: "wide/narrow msgout":
6292: (nego == NS_SYNC ? "sync/async msgout" : "ppr msgout"),
6293: msgptr);
6294: };
6295: };
6296:
6297: return msglen;
6298: }
6299: #endif /* SCSI_NCR_INTEGRITY_CHECKING */
6300:
6301: /*==========================================================
6302: **
6303: **
6304: ** Prepare the next negotiation message if needed.
6305: **
6306: ** Fill in the part of message buffer that contains the
6307: ** negotiation and the nego_status field of the CCB.
6308: ** Returns the size of the message in bytes.
6309: **
6310: **
6311: **==========================================================
6312: */
6313:
6314:
6315: static int ncr_prepare_nego(ncb_p np, ccb_p cp, u_char *msgptr)
6316: {
6317: tcb_p tp = &np->target[cp->target];
6318: int msglen = 0;
6319: int nego = 0;
6320: u_char width, offset, factor, last_byte;
6321:
6322: if (!np->check_integrity) {
6323: /* If integrity checking disabled, enable PPR messaging
6324: * if device supports wide, sync and ultra 3
6325: */
6326: if (tp->ppr_negotiation == 1) /* PPR message successful */
6327: tp->ppr_negotiation = 2;
6328:
6329: if ((tp->inq_done) && (!tp->ic_maximums_set)) {
6330: tp->ic_maximums_set = 1;
6331:
6332: /*
6333: * Issue PPR only if board is capable
6334: * and set-up for Ultra3 transfers.
6335: */
6336: tp->ppr_negotiation = 0;
6337: if ( (np->features & FE_ULTRA3) &&
6338: (tp->usrwide) && (tp->maxoffs) &&
6339: (tp->minsync == 0x09) )
6340: tp->ppr_negotiation = 1;
6341: }
6342: }
6343:
6344: if (tp->inq_done) {
6345: /*
6346: * Get the current width, offset and period
6347: */
6348: ncr_get_xfer_info( np, tp, &factor,
6349: &offset, &width);
6350:
6351: /*
6352: ** negotiate wide transfers ?
6353: */
6354:
6355: if (!tp->widedone) {
6356: if (tp->inq_byte7 & INQ7_WIDE16) {
6357: if (tp->ppr_negotiation)
6358: nego = NS_PPR;
6359: else
6360: nego = NS_WIDE;
6361:
6362: width = tp->usrwide;
6363: #ifdef SCSI_NCR_INTEGRITY_CHECKING
6364: if (tp->ic_done)
6365: width &= tp->ic_max_width;
6366: #endif
6367: } else
6368: tp->widedone=1;
6369:
6370: };
6371:
6372: /*
6373: ** negotiate synchronous transfers?
6374: */
6375:
6376: if ((nego != NS_WIDE) && !tp->period) {
6377: if (tp->inq_byte7 & INQ7_SYNC) {
6378: if (tp->ppr_negotiation)
6379: nego = NS_PPR;
6380: else
6381: nego = NS_SYNC;
6382:
6383: /* Check for async flag */
6384: if (tp->maxoffs == 0) {
6385: offset = 0;
6386: factor = 0;
6387: }
6388: else {
6389: offset = tp->maxoffs;
6390: factor = tp->minsync;
6391: #ifdef SCSI_NCR_INTEGRITY_CHECKING
6392: if ((tp->ic_done) &&
6393: (factor < tp->ic_min_sync))
6394: factor = tp->ic_min_sync;
6395: #endif
6396: }
6397:
6398: } else {
6399: offset = 0;
6400: factor = 0;
6401: tp->period =0xffff;
6402: PRINT_TARGET(np, cp->target);
6403: printk ("target did not report SYNC.\n");
6404: };
6405: };
6406: };
6407:
6408: switch (nego) {
6409: case NS_PPR:
6410: /*
6411: ** Must make sure data is consistent.
6412: ** If period is 9 and sync, must be wide and DT bit set
6413: ** else period must be larger.
6414: ** Maximum offset is 31=0x1f is ST mode, 62 if DT mode
6415: */
6416: last_byte = 0;
6417: if ( (factor==9) && offset) {
6418: if (!width) {
6419: factor = 0x0A;
6420: offset &= 0x1f;
6421: }
6422: else
6423: last_byte = 0x02;
6424: }
6425: else if (factor > 0x09)
6426: offset &= 0x1f;
6427:
6428: msgptr[msglen++] = M_EXTENDED;
6429: msgptr[msglen++] = 6;
6430: msgptr[msglen++] = M_X_PPR_REQ;
6431: msgptr[msglen++] = factor;
6432: msgptr[msglen++] = 0;
6433: msgptr[msglen++] = offset;
6434: msgptr[msglen++] = width;
6435: msgptr[msglen++] = last_byte;
6436: break;
6437: case NS_SYNC:
6438: /*
6439: ** Never negotiate faster than Ultra 2 (25ns periods)
6440: */
6441: if (offset && (factor < 0x0A)) {
6442: factor = 0x0A;
6443: tp->minsync = 0x0A;
6444: }
6445:
6446: msgptr[msglen++] = M_EXTENDED;
6447: msgptr[msglen++] = 3;
6448: msgptr[msglen++] = M_X_SYNC_REQ;
6449: msgptr[msglen++] = factor;
6450: msgptr[msglen++] = offset & 0x1f;
6451: break;
6452: case NS_WIDE:
6453: msgptr[msglen++] = M_EXTENDED;
6454: msgptr[msglen++] = 2;
6455: msgptr[msglen++] = M_X_WIDE_REQ;
6456: msgptr[msglen++] = width;
6457: break;
6458: };
6459:
6460: cp->nego_status = nego;
6461:
6462: if (nego) {
6463: tp->nego_cp = cp;
6464: if (DEBUG_FLAGS & DEBUG_NEGO) {
6465: ncr_print_msg(cp, nego == NS_WIDE ?
6466: "wide msgout":
6467: (nego == NS_SYNC ? "sync msgout" : "ppr msgout"),
6468: msgptr);
6469: };
6470: };
6471:
6472: return msglen;
6473: }
6474:
6475: /*==========================================================
6476: **
6477: **
6478: ** Start execution of a SCSI command.
6479: ** This is called from the generic SCSI driver.
6480: **
6481: **
6482: **==========================================================
6483: */
6484: static int ncr_queue_command (ncb_p np, Scsi_Cmnd *cmd)
6485: {
6486: /* Scsi_Device *device = cmd->device; */
6487: tcb_p tp = &np->target[cmd->target];
6488: lcb_p lp = ncr_lp(np, tp, cmd->lun);
6489: ccb_p cp;
6490:
6491: u_char idmsg, *msgptr;
6492: u_int msglen;
6493: int direction;
6494: u_int32 lastp, goalp;
6495:
6496: /*---------------------------------------------
6497: **
6498: ** Some shortcuts ...
6499: **
6500: **---------------------------------------------
6501: */
6502: if ((cmd->target == np->myaddr ) ||
6503: (cmd->target >= MAX_TARGET) ||
6504: (cmd->lun >= MAX_LUN )) {
6505: return(DID_BAD_TARGET);
6506: }
6507:
6508: /*---------------------------------------------
6509: **
6510: ** Complete the 1st TEST UNIT READY command
6511: ** with error condition if the device is
6512: ** flagged NOSCAN, in order to speed up
6513: ** the boot.
6514: **
6515: **---------------------------------------------
6516: */
6517: if (cmd->cmnd[0] == 0 && (tp->usrflag & UF_NOSCAN)) {
6518: tp->usrflag &= ~UF_NOSCAN;
6519: return DID_BAD_TARGET;
6520: }
6521:
6522: if (DEBUG_FLAGS & DEBUG_TINY) {
6523: PRINT_ADDR(cmd);
6524: printk ("CMD=%x ", cmd->cmnd[0]);
6525: }
6526:
6527: /*---------------------------------------------------
6528: **
6529: ** Assign a ccb / bind cmd.
6530: ** If resetting, shorten settle_time if necessary
6531: ** in order to avoid spurious timeouts.
6532: ** If resetting or no free ccb,
6533: ** insert cmd into the waiting list.
6534: **
6535: **----------------------------------------------------
6536: */
6537: if (np->settle_time && cmd->timeout_per_command >= HZ) {
6538: u_long tlimit = ktime_get(cmd->timeout_per_command - HZ);
6539: if (ktime_dif(np->settle_time, tlimit) > 0)
6540: np->settle_time = tlimit;
6541: }
6542:
6543: if (np->settle_time || !(cp=ncr_get_ccb (np, cmd->target, cmd->lun))) {
6544: insert_into_waiting_list(np, cmd);
6545: return(DID_OK);
6546: }
6547: cp->cmd = cmd;
6548:
6549: /*---------------------------------------------------
6550: **
6551: ** Enable tagged queue if asked by scsi ioctl
6552: **
6553: **----------------------------------------------------
6554: */
6555: #if 0 /* This stuff was only usefull for linux-1.2.13 */
6556: if (lp && !lp->numtags && cmd->device && cmd->device->tagged_queue) {
6557: lp->numtags = tp->usrtags;
6558: ncr_setup_tags (np, cp->target, cp->lun);
6559: }
6560: #endif
6561:
6562: /*----------------------------------------------------
6563: **
6564: ** Build the identify / tag / sdtr message
6565: **
6566: **----------------------------------------------------
6567: */
6568:
6569: idmsg = M_IDENTIFY | cp->lun;
6570:
6571: if (cp ->tag != NO_TAG || (lp && !(tp->usrflag & UF_NODISC)))
6572: idmsg |= 0x40;
6573:
6574: msgptr = cp->scsi_smsg;
6575: msglen = 0;
6576: msgptr[msglen++] = idmsg;
6577:
6578: if (cp->tag != NO_TAG) {
6579: char order = np->order;
6580:
6581: /*
6582: ** Force ordered tag if necessary to avoid timeouts
6583: ** and to preserve interactivity.
6584: */
6585: if (lp && ktime_exp(lp->tags_stime)) {
6586: lp->tags_si = !(lp->tags_si);
6587: if (lp->tags_sum[lp->tags_si]) {
6588: order = M_ORDERED_TAG;
6589: if ((DEBUG_FLAGS & DEBUG_TAGS)||bootverbose>0){
6590: PRINT_ADDR(cmd);
6591: printk("ordered tag forced.\n");
6592: }
6593: }
6594: lp->tags_stime = ktime_get(3*HZ);
6595: }
6596:
6597: if (order == 0) {
6598: /*
6599: ** Ordered write ops, unordered read ops.
6600: */
6601: switch (cmd->cmnd[0]) {
6602: case 0x08: /* READ_SMALL (6) */
6603: case 0x28: /* READ_BIG (10) */
6604: case 0xa8: /* READ_HUGE (12) */
6605: order = M_SIMPLE_TAG;
6606: break;
6607: default:
6608: order = M_ORDERED_TAG;
6609: }
6610: }
6611: msgptr[msglen++] = order;
6612: /*
6613: ** For less than 128 tags, actual tags are numbered
6614: ** 1,3,5,..2*MAXTAGS+1,since we may have to deal
6615: ** with devices that have problems with #TAG 0 or too
6616: ** great #TAG numbers. For more tags (up to 256),
6617: ** we use directly our tag number.
6618: */
6619: #if MAX_TASKS > (512/4)
6620: msgptr[msglen++] = cp->tag;
6621: #else
6622: msgptr[msglen++] = (cp->tag << 1) + 1;
6623: #endif
6624: }
6625:
6626: cp->host_flags = 0;
6627:
6628: /*----------------------------------------------------
6629: **
6630: ** Build the data descriptors
6631: **
6632: **----------------------------------------------------
6633: */
6634:
6635: direction = scsi_data_direction(cmd);
6636: if (direction != SCSI_DATA_NONE) {
6637: cp->segments = np->scatter (np, cp, cp->cmd);
6638: if (cp->segments < 0) {
6639: ncr_free_ccb(np, cp);
6640: return(DID_ERROR);
6641: }
6642: }
6643: else {
6644: cp->data_len = 0;
6645: cp->segments = 0;
6646: }
6647:
6648: /*---------------------------------------------------
6649: **
6650: ** negotiation required?
6651: **
6652: ** (nego_status is filled by ncr_prepare_nego())
6653: **
6654: **---------------------------------------------------
6655: */
6656:
6657: cp->nego_status = 0;
6658:
6659: #ifdef SCSI_NCR_INTEGRITY_CHECKING
6660: if ((np->check_integrity && tp->ic_done) || !np->check_integrity) {
6661: if ((!tp->widedone || !tp->period) && !tp->nego_cp && lp) {
6662: msglen += ncr_prepare_nego (np, cp, msgptr + msglen);
6663: }
6664: }
6665: else if (np->check_integrity && (cmd->ic_in_progress)) {
6666: msglen += ncr_ic_nego (np, cp, cmd, msgptr + msglen);
6667: }
6668: else if (np->check_integrity && cmd->ic_complete) {
6669: u_long current_period;
6670: u_char current_offset, current_width, current_factor;
6671:
6672: ncr_get_xfer_info (np, tp, ¤t_factor,
6673: ¤t_offset, ¤t_width);
6674:
6675: tp->ic_max_width = current_width;
6676: tp->ic_min_sync = current_factor;
6677:
6678: if (current_factor == 9) current_period = 125;
6679: else if (current_factor == 10) current_period = 250;
6680: else if (current_factor == 11) current_period = 303;
6681: else if (current_factor == 12) current_period = 500;
6682: else current_period = current_factor * 40;
6683:
6684: /*
6685: * Negotiation for this target is complete. Update flags.
6686: */
6687: tp->period = current_period;
6688: tp->widedone = 1;
6689: tp->ic_done = 1;
6690:
6691: printk("%s: Integrity Check Complete: \n", ncr_name(np));
6692:
6693: printk("%s: %s %s SCSI", ncr_name(np),
6694: current_offset?"SYNC":"ASYNC",
6695: tp->ic_max_width?"WIDE":"NARROW");
6696: if (current_offset) {
6697: u_long mbs = 10000 * (tp->ic_max_width + 1);
6698:
6699: printk(" %d.%d MB/s",
6700: (int) (mbs / current_period), (int) (mbs % current_period));
6701:
6702: printk(" (%d ns, %d offset)\n",
6703: (int) current_period/10, current_offset);
6704: }
6705: else
6706: printk(" %d MB/s. \n ", (tp->ic_max_width+1)*5);
6707: }
6708: #else
6709: if ((!tp->widedone || !tp->period) && !tp->nego_cp && lp) {
6710: msglen += ncr_prepare_nego (np, cp, msgptr + msglen);
6711: }
6712: #endif /* SCSI_NCR_INTEGRITY_CHECKING */
6713:
6714:
6715: /*----------------------------------------------------
6716: **
6717: ** Determine xfer direction.
6718: **
6719: **----------------------------------------------------
6720: */
6721: if (!cp->data_len)
6722: direction = SCSI_DATA_NONE;
6723:
6724: /*
6725: ** If data direction is UNKNOWN, speculate DATA_READ
6726: ** but prepare alternate pointers for WRITE in case
6727: ** of our speculation will be just wrong.
6728: ** SCRIPTS will swap values if needed.
6729: */
6730: switch(direction) {
6731: case SCSI_DATA_UNKNOWN:
6732: case SCSI_DATA_WRITE:
6733: goalp = NCB_SCRIPT_PHYS (np, data_out2) + 8;
6734: lastp = goalp - 8 - (cp->segments * (SCR_SG_SIZE*4));
6735: if (direction != SCSI_DATA_UNKNOWN)
6736: break;
6737: cp->phys.header.wgoalp = cpu_to_scr(goalp);
6738: cp->phys.header.wlastp = cpu_to_scr(lastp);
6739: /* fall through */
6740: case SCSI_DATA_READ:
6741: cp->host_flags |= HF_DATA_IN;
6742: goalp = NCB_SCRIPT_PHYS (np, data_in2) + 8;
6743: lastp = goalp - 8 - (cp->segments * (SCR_SG_SIZE*4));
6744: break;
6745: default:
6746: case SCSI_DATA_NONE:
6747: lastp = goalp = NCB_SCRIPTH_PHYS (np, no_data);
6748: break;
6749: }
6750:
6751: /*
6752: ** Set all pointers values needed by SCRIPTS.
6753: ** If direction is unknown, start at data_io.
6754: */
6755: cp->phys.header.lastp = cpu_to_scr(lastp);
6756: cp->phys.header.goalp = cpu_to_scr(goalp);
6757:
6758: if (direction == SCSI_DATA_UNKNOWN)
6759: cp->phys.header.savep =
6760: cpu_to_scr(NCB_SCRIPTH_PHYS (np, data_io));
6761: else
6762: cp->phys.header.savep= cpu_to_scr(lastp);
6763:
6764: /*
6765: ** Save the initial data pointer in order to be able
6766: ** to redo the command.
6767: ** We also have to save the initial lastp, since it
6768: ** will be changed to DATA_IO if we don't know the data
6769: ** direction and the device completes the command with
6770: ** QUEUE FULL status (without entering the data phase).
6771: */
6772: cp->startp = cp->phys.header.savep;
6773: cp->lastp0 = cp->phys.header.lastp;
6774:
6775: /*----------------------------------------------------
6776: **
6777: ** fill in ccb
6778: **
6779: **----------------------------------------------------
6780: **
6781: **
6782: ** physical -> virtual backlink
6783: ** Generic SCSI command
6784: */
6785:
6786: /*
6787: ** Startqueue
6788: */
6789: cp->phys.header.go.start = cpu_to_scr(NCB_SCRIPT_PHYS (np,select));
6790: cp->phys.header.go.restart = cpu_to_scr(NCB_SCRIPT_PHYS (np,resel_dsa));
6791: /*
6792: ** select
6793: */
6794: cp->phys.select.sel_id = cp->target;
6795: cp->phys.select.sel_scntl3 = tp->wval;
6796: cp->phys.select.sel_sxfer = tp->sval;
6797: cp->phys.select.sel_scntl4 = tp->uval;
6798: /*
6799: ** message
6800: */
6801: cp->phys.smsg.addr = cpu_to_scr(CCB_PHYS (cp, scsi_smsg));
6802: cp->phys.smsg.size = cpu_to_scr(msglen);
6803:
6804: /*
6805: ** command
6806: */
6807: memcpy(cp->cdb_buf, cmd->cmnd, MIN(cmd->cmd_len, sizeof(cp->cdb_buf)));
6808: cp->phys.cmd.addr = cpu_to_scr(CCB_PHYS (cp, cdb_buf[0]));
6809: cp->phys.cmd.size = cpu_to_scr(cmd->cmd_len);
6810:
6811: /*
6812: ** status
6813: */
6814: cp->actualquirks = tp->quirks;
6815: cp->host_status = cp->nego_status ? HS_NEGOTIATE : HS_BUSY;
6816: cp->scsi_status = S_ILLEGAL;
6817: cp->xerr_status = 0;
6818: cp->extra_bytes = 0;
6819:
6820: /*
6821: ** extreme data pointer.
6822: ** shall be positive, so -1 is lower than lowest.:)
6823: */
6824: cp->ext_sg = -1;
6825: cp->ext_ofs = 0;
6826:
6827: /*----------------------------------------------------
6828: **
6829: ** Critical region: start this job.
6830: **
6831: **----------------------------------------------------
6832: */
6833:
6834: /*
6835: ** activate this job.
6836: */
6837:
6838: /*
6839: ** insert next CCBs into start queue.
6840: ** 2 max at a time is enough to flush the CCB wait queue.
6841: */
6842: if (lp)
6843: ncr_start_next_ccb(np, lp, 2);
6844: else
6845: ncr_put_start_queue(np, cp);
6846:
6847: /*
6848: ** Command is successfully queued.
6849: */
6850:
6851: return(DID_OK);
6852: }
6853:
6854:
6855: /*==========================================================
6856: **
6857: **
6858: ** Insert a CCB into the start queue and wake up the
6859: ** SCRIPTS processor.
6860: **
6861: **
6862: **==========================================================
6863: */
6864:
6865: static void ncr_start_next_ccb(ncb_p np, lcb_p lp, int maxn)
6866: {
6867: XPT_QUEHEAD *qp;
6868: ccb_p cp;
6869:
6870: while (maxn-- && lp->queuedccbs < lp->queuedepth) {
6871: qp = xpt_remque_head(&lp->wait_ccbq);
6872: if (!qp)
6873: break;
6874: ++lp->queuedccbs;
6875: cp = xpt_que_entry(qp, struct ccb, link_ccbq);
6876: xpt_insque_tail(qp, &lp->busy_ccbq);
6877: lp->tasktbl[cp->tag == NO_TAG ? 0 : cp->tag] =
6878: cpu_to_scr(cp->p_ccb);
6879: ncr_put_start_queue(np, cp);
6880: }
6881: }
6882:
6883: static void ncr_put_start_queue(ncb_p np, ccb_p cp)
6884: {
6885: u_short qidx;
6886:
6887: #ifdef SCSI_NCR_IARB_SUPPORT
6888: /*
6889: ** If the previously queued CCB is not yet done,
6890: ** set the IARB hint. The SCRIPTS will go with IARB
6891: ** for this job when starting the previous one.
6892: ** We leave devices a chance to win arbitration by
6893: ** not using more than 'iarb_max' consecutive
6894: ** immediate arbitrations.
6895: */
6896: if (np->last_cp && np->iarb_count < np->iarb_max) {
6897: np->last_cp->host_flags |= HF_HINT_IARB;
6898: ++np->iarb_count;
6899: }
6900: else
6901: np->iarb_count = 0;
6902: np->last_cp = cp;
6903: #endif
6904:
6905: /*
6906: ** insert into start queue.
6907: */
6908: qidx = np->squeueput + 2;
6909: if (qidx >= MAX_START*2) qidx = 0;
6910:
6911: np->squeue [qidx] = cpu_to_scr(np->p_idletask);
6912: MEMORY_BARRIER();
6913: np->squeue [np->squeueput] = cpu_to_scr(cp->p_ccb);
6914:
6915: np->squeueput = qidx;
6916: cp->queued = 1;
6917:
6918: if (DEBUG_FLAGS & DEBUG_QUEUE)
6919: printk ("%s: queuepos=%d.\n", ncr_name (np), np->squeueput);
6920:
6921: /*
6922: ** Script processor may be waiting for reselect.
6923: ** Wake it up.
6924: */
6925: MEMORY_BARRIER();
6926: OUTB (nc_istat, SIGP|np->istat_sem);
6927: }
6928:
6929:
6930: /*==========================================================
6931: **
6932: ** Soft reset the chip.
6933: **
6934: ** Some 896 and 876 chip revisions may hang-up if we set
6935: ** the SRST (soft reset) bit at the wrong time when SCRIPTS
6936: ** are running.
6937: ** So, we need to abort the current operation prior to
6938: ** soft resetting the chip.
6939: **
6940: **==========================================================
6941: */
6942:
6943: static void ncr_chip_reset (ncb_p np)
6944: {
6945: OUTB (nc_istat, SRST);
6946: UDELAY (10);
6947: OUTB (nc_istat, 0);
6948: }
6949:
6950: static void ncr_soft_reset(ncb_p np)
6951: {
6952: u_char istat;
6953: int i;
6954:
6955: OUTB (nc_istat, CABRT);
6956: for (i = 1000000 ; i ; --i) {
6957: istat = INB (nc_istat);
6958: if (istat & SIP) {
6959: INW (nc_sist);
6960: continue;
6961: }
6962: if (istat & DIP) {
6963: OUTB (nc_istat, 0);
6964: INB (nc_dstat);
6965: break;
6966: }
6967: }
6968: if (!i)
6969: printk("%s: unable to abort current chip operation.\n",
6970: ncr_name(np));
6971: ncr_chip_reset(np);
6972: }
6973:
6974: /*==========================================================
6975: **
6976: **
6977: ** Start reset process.
6978: ** The interrupt handler will reinitialize the chip.
6979: ** The timeout handler will wait for settle_time before
6980: ** clearing it and so resuming command processing.
6981: **
6982: **
6983: **==========================================================
6984: */
6985: static void ncr_start_reset(ncb_p np)
6986: {
6987: (void) ncr_reset_scsi_bus(np, 1, driver_setup.settle_delay);
6988: }
6989:
6990: static int ncr_reset_scsi_bus(ncb_p np, int enab_int, int settle_delay)
6991: {
6992: u_int32 term;
6993: int retv = 0;
6994:
6995: np->settle_time = ktime_get(settle_delay * HZ);
6996:
6997: if (bootverbose > 1)
6998: printk("%s: resetting, "
6999: "command processing suspended for %d seconds\n",
7000: ncr_name(np), settle_delay);
7001:
7002: ncr_soft_reset(np); /* Soft reset the chip */
7003: UDELAY (2000); /* The 895/6 need time for the bus mode to settle */
7004: if (enab_int)
7005: OUTW (nc_sien, RST);
7006: /*
7007: ** Enable Tolerant, reset IRQD if present and
7008: ** properly set IRQ mode, prior to resetting the bus.
7009: */
7010: OUTB (nc_stest3, TE);
7011: OUTB (nc_dcntl, (np->rv_dcntl & IRQM));
7012: OUTB (nc_scntl1, CRST);
7013: UDELAY (200);
7014:
7015: if (!driver_setup.bus_check)
7016: goto out;
7017: /*
7018: ** Check for no terminators or SCSI bus shorts to ground.
7019: ** Read SCSI data bus, data parity bits and control signals.
7020: ** We are expecting RESET to be TRUE and other signals to be
7021: ** FALSE.
7022: */
7023: term = INB(nc_sstat0);
7024: term = ((term & 2) << 7) + ((term & 1) << 17); /* rst sdp0 */
7025: term |= ((INB(nc_sstat2) & 0x01) << 26) | /* sdp1 */
7026: ((INW(nc_sbdl) & 0xff) << 9) | /* d7-0 */
7027: ((INW(nc_sbdl) & 0xff00) << 10) | /* d15-8 */
7028: INB(nc_sbcl); /* req ack bsy sel atn msg cd io */
7029:
7030: if (!(np->features & FE_WIDE))
7031: term &= 0x3ffff;
7032:
7033: if (term != (2<<7)) {
7034: printk("%s: suspicious SCSI data while resetting the BUS.\n",
7035: ncr_name(np));
7036: printk("%s: %sdp0,d7-0,rst,req,ack,bsy,sel,atn,msg,c/d,i/o = "
7037: "0x%lx, expecting 0x%lx\n",
7038: ncr_name(np),
7039: (np->features & FE_WIDE) ? "dp1,d15-8," : "",
7040: (u_long)term, (u_long)(2<<7));
7041: if (driver_setup.bus_check == 1)
7042: retv = 1;
7043: }
7044: out:
7045: OUTB (nc_scntl1, 0);
7046: return retv;
7047: }
7048:
7049: /*==========================================================
7050: **
7051: **
7052: ** Reset the SCSI BUS.
7053: ** This is called from the generic SCSI driver.
7054: **
7055: **
7056: **==========================================================
7057: */
7058: static int ncr_reset_bus (ncb_p np, Scsi_Cmnd *cmd, int sync_reset)
7059: {
7060: /* Scsi_Device *device = cmd->device; */
7061: ccb_p cp;
7062: int found;
7063:
7064: /*
7065: * Return immediately if reset is in progress.
7066: */
7067: if (np->settle_time) {
7068: return SCSI_RESET_PUNT;
7069: }
7070: /*
7071: * Start the reset process.
7072: * The script processor is then assumed to be stopped.
7073: * Commands will now be queued in the waiting list until a settle
7074: * delay of 2 seconds will be completed.
7075: */
7076: ncr_start_reset(np);
7077: /*
7078: * First, look in the wakeup list
7079: */
7080: for (found=0, cp=np->ccbc; cp; cp=cp->link_ccb) {
7081: /*
7082: ** look for the ccb of this command.
7083: */
7084: if (cp->host_status == HS_IDLE) continue;
7085: if (cp->cmd == cmd) {
7086: found = 1;
7087: break;
7088: }
7089: }
7090: /*
7091: * Then, look in the waiting list
7092: */
7093: if (!found && retrieve_from_waiting_list(0, np, cmd))
7094: found = 1;
7095: /*
7096: * Wake-up all awaiting commands with DID_RESET.
7097: */
7098: reset_waiting_list(np);
7099: /*
7100: * Wake-up all pending commands with HS_RESET -> DID_RESET.
7101: */
7102: ncr_wakeup(np, HS_RESET);
7103: /*
7104: * If the involved command was not in a driver queue, and the
7105: * scsi driver told us reset is synchronous, and the command is not
7106: * currently in the waiting list, complete it with DID_RESET status,
7107: * in order to keep it alive.
7108: */
7109: if (!found && sync_reset && !retrieve_from_waiting_list(0, np, cmd)) {
7110: SetScsiResult(cmd, DID_RESET, 0);
7111: ncr_queue_done_cmd(np, cmd);
7112: }
7113:
7114: return SCSI_RESET_SUCCESS;
7115: }
7116:
7117: /*==========================================================
7118: **
7119: **
7120: ** Abort an SCSI command.
7121: ** This is called from the generic SCSI driver.
7122: **
7123: **
7124: **==========================================================
7125: */
7126: static int ncr_abort_command (ncb_p np, Scsi_Cmnd *cmd)
7127: {
7128: /* Scsi_Device *device = cmd->device; */
7129: ccb_p cp;
7130:
7131: /*
7132: * First, look for the scsi command in the waiting list
7133: */
7134: if (remove_from_waiting_list(np, cmd)) {
7135: SetScsiAbortResult(cmd);
7136: ncr_queue_done_cmd(np, cmd);
7137: return SCSI_ABORT_SUCCESS;
7138: }
7139:
7140: /*
7141: * Then, look in the wakeup list
7142: */
7143: for (cp=np->ccbc; cp; cp=cp->link_ccb) {
7144: /*
7145: ** look for the ccb of this command.
7146: */
7147: if (cp->host_status == HS_IDLE) continue;
7148: if (cp->cmd == cmd)
7149: break;
7150: }
7151:
7152: if (!cp) {
7153: return SCSI_ABORT_NOT_RUNNING;
7154: }
7155:
7156: /*
7157: ** Keep track we have to abort this job.
7158: */
7159: cp->to_abort = 1;
7160:
7161: /*
7162: ** Tell the SCRIPTS processor to stop
7163: ** and synchronize with us.
7164: */
7165: np->istat_sem = SEM;
7166:
7167: /*
7168: ** If there are no requests, the script
7169: ** processor will sleep on SEL_WAIT_RESEL.
7170: ** Let's wake it up, since it may have to work.
7171: */
7172: OUTB (nc_istat, SIGP|SEM);
7173:
7174: /*
7175: ** Tell user we are working for him.
7176: */
7177: return SCSI_ABORT_PENDING;
7178: }
7179:
7180: /*==========================================================
7181: **
7182: ** Linux release module stuff.
7183: **
7184: ** Called before unloading the module
7185: ** Detach the host.
7186: ** We have to free resources and halt the NCR chip
7187: **
7188: **==========================================================
7189: */
7190:
7191: #ifdef MODULE
7192: static int ncr_detach(ncb_p np)
7193: {
7194: int i;
7195:
7196: printk("%s: detaching ...\n", ncr_name(np));
7197:
7198: /*
7199: ** Stop the ncr_timeout process
7200: ** Set release_stage to 1 and wait that ncr_timeout() set it to 2.
7201: */
7202: np->release_stage = 1;
7203: for (i = 50 ; i && np->release_stage != 2 ; i--) MDELAY (100);
7204: if (np->release_stage != 2)
7205: printk("%s: the timer seems to be already stopped\n",
7206: ncr_name(np));
7207: else np->release_stage = 2;
7208:
7209: /*
7210: ** Reset NCR chip.
7211: ** We should use ncr_soft_reset(), but we donnot want to do
7212: ** so, since we may not be safe if interrupts occur.
7213: */
7214:
7215: printk("%s: resetting chip\n", ncr_name(np));
7216: ncr_chip_reset(np);
7217:
7218: /*
7219: ** Restore bios setting for automatic clock detection.
7220: */
7221: OUTB(nc_dmode, np->sv_dmode);
7222: OUTB(nc_dcntl, np->sv_dcntl);
7223: OUTB(nc_ctest3, np->sv_ctest3);
7224: OUTB(nc_ctest4, np->sv_ctest4);
7225: OUTB(nc_ctest5, np->sv_ctest5);
7226: OUTB(nc_gpcntl, np->sv_gpcntl);
7227: OUTB(nc_stest2, np->sv_stest2);
7228:
7229: ncr_selectclock(np, np->sv_scntl3);
7230: /*
7231: ** Free host resources
7232: */
7233: ncr_free_resources(np);
7234:
7235: return 1;
7236: }
7237: #endif
7238:
7239: /*==========================================================
7240: **
7241: **
7242: ** Complete execution of a SCSI command.
7243: ** Signal completion to the generic SCSI driver.
7244: **
7245: **
7246: **==========================================================
7247: */
7248:
7249: void ncr_complete (ncb_p np, ccb_p cp)
7250: {
7251: Scsi_Cmnd *cmd;
7252: tcb_p tp;
7253: lcb_p lp;
7254:
7255: /*
7256: ** Sanity check
7257: */
7258: if (!cp || !cp->cmd)
7259: return;
7260:
7261: /*
7262: ** Print some debugging info.
7263: */
7264:
7265: if (DEBUG_FLAGS & DEBUG_TINY)
7266: printk ("CCB=%lx STAT=%x/%x\n", (unsigned long)cp,
7267: cp->host_status,cp->scsi_status);
7268:
7269: /*
7270: ** Get command, target and lun pointers.
7271: */
7272:
7273: cmd = cp->cmd;
7274: cp->cmd = NULL;
7275: tp = &np->target[cp->target];
7276: lp = ncr_lp(np, tp, cp->lun);
7277:
7278: /*
7279: ** We donnot queue more than 1 ccb per target
7280: ** with negotiation at any time. If this ccb was
7281: ** used for negotiation, clear this info in the tcb.
7282: */
7283:
7284: if (cp == tp->nego_cp)
7285: tp->nego_cp = 0;
7286:
7287: #ifdef SCSI_NCR_IARB_SUPPORT
7288: /*
7289: ** We just complete the last queued CCB.
7290: ** Clear this info that is no more relevant.
7291: */
7292: if (cp == np->last_cp)
7293: np->last_cp = 0;
7294: #endif
7295:
7296: /*
7297: ** If auto-sense performed, change scsi status,
7298: ** Otherwise, compute the residual.
7299: */
7300: if (cp->host_flags & HF_AUTO_SENSE) {
7301: cp->scsi_status = cp->sv_scsi_status;
7302: cp->xerr_status = cp->sv_xerr_status;
7303: }
7304: else {
7305: cp->resid = 0;
7306: if (cp->xerr_status ||
7307: cp->phys.header.lastp != cp->phys.header.goalp)
7308: cp->resid = ncr_compute_residual(np, cp);
7309: }
7310:
7311: /*
7312: ** Check for extended errors.
7313: */
7314:
7315: if (cp->xerr_status) {
7316: if (cp->xerr_status & XE_PARITY_ERR) {
7317: PRINT_ADDR(cmd);
7318: printk ("unrecovered SCSI parity error.\n");
7319: }
7320: if (cp->xerr_status & XE_EXTRA_DATA) {
7321: PRINT_ADDR(cmd);
7322: printk ("extraneous data discarded.\n");
7323: }
7324: if (cp->xerr_status & XE_BAD_PHASE) {
7325: PRINT_ADDR(cmd);
7326: printk ("illegal scsi phase (4/5).\n");
7327: }
7328: if (cp->xerr_status & XE_SODL_UNRUN) {
7329: PRINT_ADDR(cmd);
7330: printk ("ODD transfer in DATA OUT phase.\n");
7331: }
7332: if (cp->xerr_status & XE_SWIDE_OVRUN){
7333: PRINT_ADDR(cmd);
7334: printk ("ODD transfer in DATA IN phase.\n");
7335: }
7336:
7337: if (cp->host_status==HS_COMPLETE)
7338: cp->host_status = HS_FAIL;
7339: }
7340:
7341: /*
7342: ** Print out any error for debugging purpose.
7343: */
7344: if (DEBUG_FLAGS & (DEBUG_RESULT|DEBUG_TINY)) {
7345: if (cp->host_status!=HS_COMPLETE || cp->scsi_status!=S_GOOD ||
7346: cp->resid) {
7347: PRINT_ADDR(cmd);
7348: printk ("ERROR: cmd=%x host_status=%x scsi_status=%x "
7349: "data_len=%d residual=%d\n",
7350: cmd->cmnd[0], cp->host_status, cp->scsi_status,
7351: cp->data_len, cp->resid);
7352: }
7353: }
7354:
7355: #if LINUX_VERSION_CODE >= LinuxVersionCode(2,3,99)
7356: /*
7357: ** Move residual byte count to user structure.
7358: */
7359: cmd->resid = cp->resid;
7360: #endif
7361: /*
7362: ** Check the status.
7363: */
7364: if ( (cp->host_status == HS_COMPLETE)
7365: && (cp->scsi_status == S_GOOD ||
7366: cp->scsi_status == S_COND_MET)) {
7367: /*
7368: ** All went well (GOOD status).
7369: ** CONDITION MET status is returned on
7370: ** `Pre-Fetch' or `Search data' success.
7371: */
7372: SetScsiResult(cmd, DID_OK, cp->scsi_status);
7373:
7374: /*
7375: ** Allocate the lcb if not yet.
7376: */
7377: if (!lp)
7378: ncr_alloc_lcb (np, cp->target, cp->lun);
7379:
7380: /*
7381: ** On standard INQUIRY response (EVPD and CmDt
7382: ** not set), setup logical unit according to
7383: ** announced capabilities (we need the 1rst 7 bytes).
7384: */
7385: if (cmd->cmnd[0] == 0x12 && !(cmd->cmnd[1] & 0x3) &&
7386: cmd->cmnd[4] >= 7 && !cmd->use_sg) {
7387: sync_scsi_data(np, cmd); /* SYNC the data */
7388: ncr_setup_lcb (np, cp->target, cp->lun,
7389: (char *) cmd->request_buffer);
7390: }
7391:
7392: /*
7393: ** If tags was reduced due to queue full,
7394: ** increase tags if 1000 good status received.
7395: */
7396: if (lp && lp->usetags && lp->numtags < lp->maxtags) {
7397: ++lp->num_good;
7398: if (lp->num_good >= 1000) {
7399: lp->num_good = 0;
7400: ++lp->numtags;
7401: ncr_setup_tags (np, cp->target, cp->lun);
7402: }
7403: }
7404: } else if ((cp->host_status == HS_COMPLETE)
7405: && (cp->scsi_status == S_CHECK_COND)) {
7406: /*
7407: ** Check condition code
7408: */
7409: SetScsiResult(cmd, DID_OK, S_CHECK_COND);
7410:
7411: if (DEBUG_FLAGS & (DEBUG_RESULT|DEBUG_TINY)) {
7412: PRINT_ADDR(cmd);
7413: ncr_printl_hex("sense data:", cmd->sense_buffer, 14);
7414: }
7415: } else if ((cp->host_status == HS_COMPLETE)
7416: && (cp->scsi_status == S_CONFLICT)) {
7417: /*
7418: ** Reservation Conflict condition code
7419: */
7420: SetScsiResult(cmd, DID_OK, S_CONFLICT);
7421:
7422: } else if ((cp->host_status == HS_COMPLETE)
7423: && (cp->scsi_status == S_BUSY ||
7424: cp->scsi_status == S_QUEUE_FULL)) {
7425:
7426: /*
7427: ** Target is busy.
7428: */
7429: SetScsiResult(cmd, DID_OK, cp->scsi_status);
7430:
7431: } else if ((cp->host_status == HS_SEL_TIMEOUT)
7432: || (cp->host_status == HS_TIMEOUT)) {
7433:
7434: /*
7435: ** No response
7436: */
7437: SetScsiResult(cmd, DID_TIME_OUT, cp->scsi_status);
7438:
7439: } else if (cp->host_status == HS_RESET) {
7440:
7441: /*
7442: ** SCSI bus reset
7443: */
7444: SetScsiResult(cmd, DID_RESET, cp->scsi_status);
7445:
7446: } else if (cp->host_status == HS_ABORTED) {
7447:
7448: /*
7449: ** Transfer aborted
7450: */
7451: SetScsiAbortResult(cmd);
7452:
7453: } else {
7454: int did_status;
7455:
7456: /*
7457: ** Other protocol messes
7458: */
7459: PRINT_ADDR(cmd);
7460: printk ("COMMAND FAILED (%x %x) @%p.\n",
7461: cp->host_status, cp->scsi_status, cp);
7462:
7463: did_status = DID_ERROR;
7464: if (cp->xerr_status & XE_PARITY_ERR)
7465: did_status = DID_PARITY;
7466:
7467: SetScsiResult(cmd, did_status, cp->scsi_status);
7468: }
7469:
7470: /*
7471: ** trace output
7472: */
7473:
7474: if (tp->usrflag & UF_TRACE) {
7475: PRINT_ADDR(cmd);
7476: printk (" CMD:");
7477: ncr_print_hex(cmd->cmnd, cmd->cmd_len);
7478:
7479: if (cp->host_status==HS_COMPLETE) {
7480: switch (cp->scsi_status) {
7481: case S_GOOD:
7482: printk (" GOOD");
7483: break;
7484: case S_CHECK_COND:
7485: printk (" SENSE:");
7486: ncr_print_hex(cmd->sense_buffer, 14);
7487: break;
7488: default:
7489: printk (" STAT: %x\n", cp->scsi_status);
7490: break;
7491: }
7492: } else printk (" HOSTERROR: %x", cp->host_status);
7493: printk ("\n");
7494: }
7495:
7496: /*
7497: ** Free this ccb
7498: */
7499: ncr_free_ccb (np, cp);
7500:
7501: /*
7502: ** requeue awaiting scsi commands for this lun.
7503: */
7504: if (lp && lp->queuedccbs < lp->queuedepth &&
7505: !xpt_que_empty(&lp->wait_ccbq))
7506: ncr_start_next_ccb(np, lp, 2);
7507:
7508: /*
7509: ** requeue awaiting scsi commands for this controller.
7510: */
7511: if (np->waiting_list)
7512: requeue_waiting_list(np);
7513:
7514: /*
7515: ** signal completion to generic driver.
7516: */
7517: ncr_queue_done_cmd(np, cmd);
7518: }
7519:
7520: /*==========================================================
7521: **
7522: **
7523: ** Signal all (or one) control block done.
7524: **
7525: **
7526: **==========================================================
7527: */
7528:
7529: /*
7530: ** The NCR has completed CCBs.
7531: ** Look at the DONE QUEUE.
7532: **
7533: ** On architectures that may reorder LOAD/STORE operations,
7534: ** a memory barrier may be needed after the reading of the
7535: ** so-called `flag' and prior to dealing with the data.
7536: */
7537: int ncr_wakeup_done (ncb_p np)
7538: {
7539: ccb_p cp;
7540: int i, n;
7541: u_long dsa;
7542:
7543: n = 0;
7544: i = np->dqueueget;
7545: while (1) {
7546: dsa = scr_to_cpu(np->dqueue[i]);
7547: if (!dsa)
7548: break;
7549: np->dqueue[i] = 0;
7550: if ((i = i+2) >= MAX_START*2)
7551: i = 0;
7552:
7553: cp = ncr_ccb_from_dsa(np, dsa);
7554: if (cp) {
7555: MEMORY_BARRIER();
7556: ncr_complete (np, cp);
7557: ++n;
7558: }
7559: else
7560: printk (KERN_ERR "%s: bad DSA (%lx) in done queue.\n",
7561: ncr_name(np), dsa);
7562: }
7563: np->dqueueget = i;
7564:
7565: return n;
7566: }
7567:
7568: /*
7569: ** Complete all active CCBs.
7570: */
7571: void ncr_wakeup (ncb_p np, u_long code)
7572: {
7573: ccb_p cp = np->ccbc;
7574:
7575: while (cp) {
7576: if (cp->host_status != HS_IDLE) {
7577: cp->host_status = code;
7578: ncr_complete (np, cp);
7579: }
7580: cp = cp->link_ccb;
7581: }
7582: }
7583:
7584: /*==========================================================
7585: **
7586: **
7587: ** Start NCR chip.
7588: **
7589: **
7590: **==========================================================
7591: */
7592:
7593: void ncr_init (ncb_p np, int reset, char * msg, u_long code)
7594: {
7595: int i;
7596: u_long phys;
7597:
7598: /*
7599: ** Reset chip if asked, otherwise just clear fifos.
7600: */
7601:
7602: if (reset)
7603: ncr_soft_reset(np);
7604: else {
7605: OUTB (nc_stest3, TE|CSF);
7606: OUTONB (nc_ctest3, CLF);
7607: }
7608:
7609: /*
7610: ** Message.
7611: */
7612:
7613: if (msg) printk (KERN_INFO "%s: restart (%s).\n", ncr_name (np), msg);
7614:
7615: /*
7616: ** Clear Start Queue
7617: */
7618: phys = np->p_squeue;
7619: np->queuedepth = MAX_START - 1; /* 1 entry needed as end marker */
7620: for (i = 0; i < MAX_START*2; i += 2) {
7621: np->squeue[i] = cpu_to_scr(np->p_idletask);
7622: np->squeue[i+1] = cpu_to_scr(phys + (i+2)*4);
7623: }
7624: np->squeue[MAX_START*2-1] = cpu_to_scr(phys);
7625:
7626:
7627: /*
7628: ** Start at first entry.
7629: */
7630: np->squeueput = 0;
7631: np->scripth0->startpos[0] = cpu_to_scr(phys);
7632:
7633: /*
7634: ** Clear Done Queue
7635: */
7636: phys = vtobus(np->dqueue);
7637: for (i = 0; i < MAX_START*2; i += 2) {
7638: np->dqueue[i] = 0;
7639: np->dqueue[i+1] = cpu_to_scr(phys + (i+2)*4);
7640: }
7641: np->dqueue[MAX_START*2-1] = cpu_to_scr(phys);
7642:
7643: /*
7644: ** Start at first entry.
7645: */
7646: np->scripth0->done_pos[0] = cpu_to_scr(phys);
7647: np->dqueueget = 0;
7648:
7649: /*
7650: ** Wakeup all pending jobs.
7651: */
7652: ncr_wakeup (np, code);
7653:
7654: /*
7655: ** Init chip.
7656: */
7657:
7658: OUTB (nc_istat, 0x00 ); /* Remove Reset, abort */
7659: UDELAY (2000); /* The 895 needs time for the bus mode to settle */
7660:
7661: OUTB (nc_scntl0, np->rv_scntl0 | 0xc0);
7662: /* full arb., ena parity, par->ATN */
7663: OUTB (nc_scntl1, 0x00); /* odd parity, and remove CRST!! */
7664:
7665: ncr_selectclock(np, np->rv_scntl3); /* Select SCSI clock */
7666:
7667: OUTB (nc_scid , RRE|np->myaddr); /* Adapter SCSI address */
7668: OUTW (nc_respid, 1ul<<np->myaddr); /* Id to respond to */
7669: OUTB (nc_istat , SIGP ); /* Signal Process */
7670: OUTB (nc_dmode , np->rv_dmode); /* Burst length, dma mode */
7671: OUTB (nc_ctest5, np->rv_ctest5); /* Large fifo + large burst */
7672:
7673: OUTB (nc_dcntl , NOCOM|np->rv_dcntl); /* Protect SFBR */
7674: OUTB (nc_ctest3, np->rv_ctest3); /* Write and invalidate */
7675: OUTB (nc_ctest4, np->rv_ctest4); /* Master parity checking */
7676:
7677: if ((np->device_id != PCI_DEVICE_ID_LSI_53C1010) &&
7678: (np->device_id != PCI_DEVICE_ID_LSI_53C1010_66)){
7679: OUTB (nc_stest2, EXT|np->rv_stest2);
7680: /* Extended Sreq/Sack filtering, not supported in C1010/C1010_66 */
7681: }
7682: OUTB (nc_stest3, TE); /* TolerANT enable */
7683: OUTB (nc_stime0, 0x0c); /* HTH disabled STO 0.25 sec */
7684:
7685: /*
7686: ** DEL 441 - 53C876 Rev 5 - Part Number 609-0392787/2788 - ITEM 2.
7687: ** Disable overlapped arbitration for all dual-function
7688: ** devices, regardless revision id.
7689: ** We may consider it is a post-chip-design feature. ;-)
7690: **
7691: ** Errata applies to all 896 and 1010 parts.
7692: */
7693: if (np->device_id == PCI_DEVICE_ID_NCR_53C875)
7694: OUTB (nc_ctest0, (1<<5));
7695: else if (np->device_id == PCI_DEVICE_ID_NCR_53C896 ||
7696: np->device_id == PCI_DEVICE_ID_LSI_53C1010 ||
7697: np->device_id == PCI_DEVICE_ID_LSI_53C1010_66 )
7698: np->rv_ccntl0 |= DPR;
7699:
7700: /*
7701: ** C1010_66MHz rev 0 part requies AIPCNTL1 bit 3 to be set.
7702: */
7703: if (np->device_id == PCI_DEVICE_ID_LSI_53C1010_66)
7704: OUTB(nc_aipcntl1, (1<<3));
7705:
7706: /*
7707: ** If 64 bit (895A/896/1010/1010_66) write the CCNTL1 register to
7708: ** enable 40 bit address table indirect addressing for MOVE.
7709: ** Also write CCNTL0 if 64 bit chip, since this register seems
7710: ** to only be used by 64 bit cores.
7711: */
7712: if (np->features & FE_64BIT) {
7713: OUTB (nc_ccntl0, np->rv_ccntl0);
7714: OUTB (nc_ccntl1, np->rv_ccntl1);
7715: }
7716:
7717: /*
7718: ** If phase mismatch handled by scripts (53C895A or 53C896
7719: ** or 53C1010 or 53C1010_66), set PM jump addresses.
7720: */
7721:
7722: if (np->features & FE_NOPM) {
7723: printk(KERN_INFO "%s: handling phase mismatch from SCRIPTS.\n",
7724: ncr_name(np));
7725: OUTL (nc_pmjad1, NCB_SCRIPTH_PHYS (np, pm_handle));
7726: OUTL (nc_pmjad2, NCB_SCRIPTH_PHYS (np, pm_handle));
7727: }
7728:
7729: /*
7730: ** Enable GPIO0 pin for writing if LED support from SCRIPTS.
7731: ** Also set GPIO5 and clear GPIO6 if hardware LED control.
7732: */
7733:
7734: if (np->features & FE_LED0)
7735: OUTB(nc_gpcntl, INB(nc_gpcntl) & ~0x01);
7736: else if (np->features & FE_LEDC)
7737: OUTB(nc_gpcntl, (INB(nc_gpcntl) & ~0x41) | 0x20);
7738:
7739:
7740: /*
7741: ** enable ints
7742: */
7743:
7744: OUTW (nc_sien , STO|HTH|MA|SGE|UDC|RST|PAR);
7745: OUTB (nc_dien , MDPE|BF|SSI|SIR|IID);
7746:
7747: /*
7748: ** For 895/895A/896/c1010
7749: ** Enable SBMC interrupt and save current SCSI bus mode.
7750: */
7751: if ( (np->features & FE_ULTRA2) || (np->features & FE_ULTRA3) ) {
7752: OUTONW (nc_sien, SBMC);
7753: np->scsi_mode = INB (nc_stest4) & SMODE;
7754: }
7755:
7756: /*
7757: ** Fill in target structure.
7758: ** Reinitialize usrsync.
7759: ** Reinitialize usrwide.
7760: ** Prepare sync negotiation according to actual SCSI bus mode.
7761: */
7762:
7763: for (i=0;i<MAX_TARGET;i++) {
7764: tcb_p tp = &np->target[i];
7765:
7766: tp->to_reset = 0;
7767:
7768: tp->sval = 0;
7769: tp->wval = np->rv_scntl3;
7770: tp->uval = np->rv_scntl4;
7771:
7772: if (tp->usrsync != 255) {
7773: if (tp->usrsync <= np->maxsync) {
7774: if (tp->usrsync < np->minsync) {
7775: tp->usrsync = np->minsync;
7776: }
7777: }
7778: else
7779: tp->usrsync = 255;
7780: };
7781:
7782: if (tp->usrwide > np->maxwide)
7783: tp->usrwide = np->maxwide;
7784:
7785: ncr_negotiate (np, tp);
7786: }
7787:
7788: /*
7789: ** Download SCSI SCRIPTS to on-chip RAM if present,
7790: ** and start script processor.
7791: ** We do the download preferently from the CPU.
7792: ** For platforms that may not support PCI memory mapping,
7793: ** we use a simple SCRIPTS that performs MEMORY MOVEs.
7794: */
7795: if (np->base2_ba) {
7796: if (bootverbose)
7797: printk ("%s: Downloading SCSI SCRIPTS.\n",
7798: ncr_name(np));
7799: #ifdef SCSI_NCR_PCI_MEM_NOT_SUPPORTED
7800: if (np->base2_ws == 8192)
7801: phys = NCB_SCRIPTH0_PHYS (np, start_ram64);
7802: else
7803: phys = NCB_SCRIPTH_PHYS (np, start_ram);
7804: #else
7805: if (np->base2_ws == 8192) {
7806: memcpy_to_pci(np->base2_va + 4096,
7807: np->scripth0, sizeof(struct scripth));
7808: OUTL (nc_mmws, np->scr_ram_seg);
7809: OUTL (nc_mmrs, np->scr_ram_seg);
7810: OUTL (nc_sfs, np->scr_ram_seg);
7811: phys = NCB_SCRIPTH_PHYS (np, start64);
7812: }
7813: else
7814: phys = NCB_SCRIPT_PHYS (np, init);
7815: memcpy_to_pci(np->base2_va, np->script0, sizeof(struct script));
7816: #endif /* SCSI_NCR_PCI_MEM_NOT_SUPPORTED */
7817: }
7818: else
7819: phys = NCB_SCRIPT_PHYS (np, init);
7820:
7821: np->istat_sem = 0;
7822:
7823: OUTL (nc_dsa, np->p_ncb);
7824: OUTL_DSP (phys);
7825: }
7826:
7827: /*==========================================================
7828: **
7829: ** Prepare the negotiation values for wide and
7830: ** synchronous transfers.
7831: **
7832: **==========================================================
7833: */
7834:
7835: static void ncr_negotiate (struct ncb* np, struct tcb* tp)
7836: {
7837: /*
7838: ** minsync unit is 4ns !
7839: */
7840:
7841: u_long minsync = tp->usrsync;
7842:
7843: /*
7844: ** SCSI bus mode limit
7845: */
7846:
7847: if (np->scsi_mode && np->scsi_mode == SMODE_SE) {
7848: if (minsync < 12) minsync = 12;
7849: }
7850:
7851: /*
7852: ** our limit ..
7853: */
7854:
7855: if (minsync < np->minsync)
7856: minsync = np->minsync;
7857:
7858: /*
7859: ** divider limit
7860: */
7861:
7862: if (minsync > np->maxsync)
7863: minsync = 255;
7864:
7865: tp->minsync = minsync;
7866: tp->maxoffs = (minsync<255 ? np->maxoffs : 0);
7867:
7868: /*
7869: ** period=0: has to negotiate sync transfer
7870: */
7871:
7872: tp->period=0;
7873:
7874: /*
7875: ** widedone=0: has to negotiate wide transfer
7876: */
7877: tp->widedone=0;
7878: }
7879:
7880: /*==========================================================
7881: **
7882: ** Get clock factor and sync divisor for a given
7883: ** synchronous factor period.
7884: ** Returns the clock factor (in sxfer) and scntl3
7885: ** synchronous divisor field.
7886: **
7887: **==========================================================
7888: */
7889:
7890: static void ncr_getsync(ncb_p np, u_char sfac, u_char *fakp, u_char *scntl3p)
7891: {
7892: u_long clk = np->clock_khz; /* SCSI clock frequency in kHz */
7893: int div = np->clock_divn; /* Number of divisors supported */
7894: u_long fak; /* Sync factor in sxfer */
7895: u_long per; /* Period in tenths of ns */
7896: u_long kpc; /* (per * clk) */
7897:
7898: /*
7899: ** Compute the synchronous period in tenths of nano-seconds
7900: ** from sfac.
7901: **
7902: ** Note, if sfac == 9, DT is being used. Double the period of 125
7903: ** to 250.
7904: */
7905: if (sfac <= 10) per = 250;
7906: else if (sfac == 11) per = 303;
7907: else if (sfac == 12) per = 500;
7908: else per = 40 * sfac;
7909:
7910: /*
7911: ** Look for the greatest clock divisor that allows an
7912: ** input speed faster than the period.
7913: */
7914: kpc = per * clk;
7915: while (--div >= 0)
7916: if (kpc >= (div_10M[div] << 2)) break;
7917:
7918: /*
7919: ** Calculate the lowest clock factor that allows an output
7920: ** speed not faster than the period.
7921: */
7922: fak = (kpc - 1) / div_10M[div] + 1;
7923:
7924: #if 0 /* This optimization does not seem very usefull */
7925:
7926: per = (fak * div_10M[div]) / clk;
7927:
7928: /*
7929: ** Why not to try the immediate lower divisor and to choose
7930: ** the one that allows the fastest output speed ?
7931: ** We dont want input speed too much greater than output speed.
7932: */
7933: if (div >= 1 && fak < 8) {
7934: u_long fak2, per2;
7935: fak2 = (kpc - 1) / div_10M[div-1] + 1;
7936: per2 = (fak2 * div_10M[div-1]) / clk;
7937: if (per2 < per && fak2 <= 8) {
7938: fak = fak2;
7939: per = per2;
7940: --div;
7941: }
7942: }
7943: #endif
7944:
7945: if (fak < 4) fak = 4; /* Should never happen, too bad ... */
7946:
7947: /*
7948: ** Compute and return sync parameters for the ncr
7949: */
7950: *fakp = fak - 4;
7951:
7952: /*
7953: ** If sfac < 25, and 8xx parts, desire that the chip operate at
7954: ** least at Ultra speeds. Must set bit 7 of scntl3.
7955: ** For C1010, do not set this bit. If operating at Ultra3 speeds,
7956: ** set the U3EN bit instead.
7957: */
7958: if ((np->device_id == PCI_DEVICE_ID_LSI_53C1010) ||
7959: (np->device_id == PCI_DEVICE_ID_LSI_53C1010_66)) {
7960: *scntl3p = (div+1) << 4;
7961: *fakp = 0;
7962: }
7963: else {
7964: *scntl3p = ((div+1) << 4) + (sfac < 25 ? 0x80 : 0);
7965: *fakp = fak - 4;
7966: }
7967: }
7968:
7969: /*==========================================================
7970: **
7971: ** Utility routine to return the current bus width
7972: ** synchronous period and offset.
7973: ** Utilizes target sval, wval and uval
7974: **
7975: **==========================================================
7976: */
7977: static void ncr_get_xfer_info(ncb_p np, tcb_p tp, u_char *factor,
7978: u_char *offset, u_char *width)
7979: {
7980:
7981: u_char idiv;
7982: u_long period;
7983:
7984: *width = (tp->wval & EWS) ? 1 : 0;
7985:
7986: if ((np->device_id == PCI_DEVICE_ID_LSI_53C1010) ||
7987: (np->device_id == PCI_DEVICE_ID_LSI_53C1010_66))
7988: *offset = (tp->sval & 0x3f);
7989: else
7990: *offset = (tp->sval & 0x1f);
7991:
7992: /*
7993: * Midlayer signal to the driver that all of the scsi commands
7994: * for the integrity check have completed. Save the negotiated
7995: * parameters (extracted from sval, wval and uval).
7996: * See ncr_setsync for alg. details.
7997: */
7998:
7999: idiv = (tp->wval>>4) & 0x07;
8000:
8001: if ( *offset && idiv ) {
8002: if ((np->device_id == PCI_DEVICE_ID_LSI_53C1010) ||
8003: (np->device_id == PCI_DEVICE_ID_LSI_53C1010_66)){
8004: if (tp->uval & 0x80)
8005: period = (2*div_10M[idiv-1])/np->clock_khz;
8006: else
8007: period = (4*div_10M[idiv-1])/np->clock_khz;
8008: }
8009: else
8010: period = (((tp->sval>>5)+4)*div_10M[idiv-1])/np->clock_khz;
8011: }
8012: else
8013: period = 0xffff;
8014:
8015: if (period <= 125) *factor = 9;
8016: else if (period <= 250) *factor = 10;
8017: else if (period <= 303) *factor = 11;
8018: else if (period <= 500) *factor = 12;
8019: else *factor = (period + 40 - 1) / 40;
8020:
8021: }
8022:
8023:
8024: /*==========================================================
8025: **
8026: ** Set actual values, sync status and patch all ccbs of
8027: ** a target according to new sync/wide agreement.
8028: **
8029: **==========================================================
8030: */
8031:
8032: static void ncr_set_sync_wide_status (ncb_p np, u_char target)
8033: {
8034: ccb_p cp = np->ccbc;
8035: tcb_p tp = &np->target[target];
8036:
8037: /*
8038: ** set actual value and sync_status
8039: **
8040: ** TEMP register contains current scripts address
8041: ** which is data type/direction/dependent.
8042: */
8043: OUTB (nc_sxfer, tp->sval);
8044: OUTB (nc_scntl3, tp->wval);
8045: if ((np->device_id == PCI_DEVICE_ID_LSI_53C1010) ||
8046: (np->device_id == PCI_DEVICE_ID_LSI_53C1010_66))
8047: OUTB (nc_scntl4, tp->uval);
8048:
8049: /*
8050: ** patch ALL ccbs of this target.
8051: */
8052: for (cp = np->ccbc; cp; cp = cp->link_ccb) {
8053: if (cp->host_status == HS_IDLE)
8054: continue;
8055: if (cp->target != target)
8056: continue;
8057: cp->phys.select.sel_scntl3 = tp->wval;
8058: cp->phys.select.sel_sxfer = tp->sval;
8059: if ((np->device_id == PCI_DEVICE_ID_LSI_53C1010) ||
8060: (np->device_id == PCI_DEVICE_ID_LSI_53C1010_66))
8061: cp->phys.select.sel_scntl4 = tp->uval;
8062: };
8063: }
8064:
8065: /*==========================================================
8066: **
8067: ** Switch sync mode for current job and it's target
8068: **
8069: **==========================================================
8070: */
8071:
8072: static void ncr_setsync (ncb_p np, ccb_p cp, u_char scntl3, u_char sxfer,
8073: u_char scntl4)
8074: {
8075: tcb_p tp;
8076: u_char target = INB (nc_sdid) & 0x0f;
8077: u_char idiv;
8078: u_char offset;
8079:
8080: assert (cp);
8081: if (!cp) return;
8082:
8083: assert (target == (cp->target & 0xf));
8084:
8085: tp = &np->target[target];
8086:
8087: if ((np->device_id == PCI_DEVICE_ID_LSI_53C1010) ||
8088: (np->device_id == PCI_DEVICE_ID_LSI_53C1010_66)) {
8089: offset = sxfer & 0x3f; /* bits 5-0 */
8090: scntl3 = (scntl3 & 0xf0) | (tp->wval & EWS);
8091: scntl4 = (scntl4 & 0x80);
8092: }
8093: else {
8094: offset = sxfer & 0x1f; /* bits 4-0 */
8095: if (!scntl3 || !offset)
8096: scntl3 = np->rv_scntl3;
8097:
8098: scntl3 = (scntl3 & 0xf0) | (tp->wval & EWS) |
8099: (np->rv_scntl3 & 0x07);
8100: }
8101:
8102:
8103: /*
8104: ** Deduce the value of controller sync period from scntl3.
8105: ** period is in tenths of nano-seconds.
8106: */
8107:
8108: idiv = ((scntl3 >> 4) & 0x7);
8109: if ( offset && idiv) {
8110: if ((np->device_id == PCI_DEVICE_ID_LSI_53C1010) ||
8111: (np->device_id == PCI_DEVICE_ID_LSI_53C1010_66)) {
8112: /* Note: If extra data hold clocks are used,
8113: * the formulas below must be modified.
8114: * When scntl4 == 0, ST mode.
8115: */
8116: if (scntl4 & 0x80)
8117: tp->period = (2*div_10M[idiv-1])/np->clock_khz;
8118: else
8119: tp->period = (4*div_10M[idiv-1])/np->clock_khz;
8120: }
8121: else
8122: tp->period = (((sxfer>>5)+4)*div_10M[idiv-1])/np->clock_khz;
8123: }
8124: else
8125: tp->period = 0xffff;
8126:
8127:
8128: /*
8129: ** Stop there if sync parameters are unchanged
8130: */
8131: if (tp->sval == sxfer && tp->wval == scntl3 && tp->uval == scntl4) return;
8132: tp->sval = sxfer;
8133: tp->wval = scntl3;
8134: tp->uval = scntl4;
8135:
8136: /*
8137: ** Bells and whistles ;-)
8138: ** Donnot announce negotiations due to auto-sense,
8139: ** unless user really want us to be verbose. :)
8140: */
8141: if ( bootverbose < 2 && (cp->host_flags & HF_AUTO_SENSE))
8142: goto next;
8143: PRINT_TARGET(np, target);
8144: if (offset) {
8145: unsigned f10 = 100000 << (tp->widedone ? tp->widedone -1 : 0);
8146: unsigned mb10 = (f10 + tp->period/2) / tp->period;
8147: char *scsi;
8148:
8149: /*
8150: ** Disable extended Sreq/Sack filtering
8151: */
8152: if ((tp->period <= 2000) &&
8153: (np->device_id != PCI_DEVICE_ID_LSI_53C1010) &&
8154: (np->device_id != PCI_DEVICE_ID_LSI_53C1010_66))
8155: OUTOFFB (nc_stest2, EXT);
8156:
8157: /*
8158: ** Bells and whistles ;-)
8159: */
8160: if (tp->period < 250) scsi = "FAST-80";
8161: else if (tp->period < 500) scsi = "FAST-40";
8162: else if (tp->period < 1000) scsi = "FAST-20";
8163: else if (tp->period < 2000) scsi = "FAST-10";
8164: else scsi = "FAST-5";
8165:
8166: printk ("%s %sSCSI %d.%d MB/s (%d ns, offset %d)\n", scsi,
8167: tp->widedone > 1 ? "WIDE " : "",
8168: mb10 / 10, mb10 % 10, tp->period / 10, offset);
8169: } else
8170: printk ("%sasynchronous.\n", tp->widedone > 1 ? "wide " : "");
8171: next:
8172: /*
8173: ** set actual value and sync_status
8174: ** patch ALL ccbs of this target.
8175: */
8176: ncr_set_sync_wide_status(np, target);
8177: }
8178:
8179:
8180: /*==========================================================
8181: **
8182: ** Switch wide mode for current job and it's target
8183: ** SCSI specs say: a SCSI device that accepts a WDTR
8184: ** message shall reset the synchronous agreement to
8185: ** asynchronous mode.
8186: **
8187: **==========================================================
8188: */
8189:
8190: static void ncr_setwide (ncb_p np, ccb_p cp, u_char wide, u_char ack)
8191: {
8192: u_short target = INB (nc_sdid) & 0x0f;
8193: tcb_p tp;
8194: u_char scntl3;
8195: u_char sxfer;
8196:
8197: assert (cp);
8198: if (!cp) return;
8199:
8200: assert (target == (cp->target & 0xf));
8201:
8202: tp = &np->target[target];
8203: tp->widedone = wide+1;
8204: scntl3 = (tp->wval & (~EWS)) | (wide ? EWS : 0);
8205:
8206: sxfer = ack ? 0 : tp->sval;
8207:
8208: /*
8209: ** Stop there if sync/wide parameters are unchanged
8210: */
8211: if (tp->sval == sxfer && tp->wval == scntl3) return;
8212: tp->sval = sxfer;
8213: tp->wval = scntl3;
8214:
8215: /*
8216: ** Bells and whistles ;-)
8217: */
8218: if (bootverbose >= 2) {
8219: PRINT_TARGET(np, target);
8220: if (scntl3 & EWS)
8221: printk ("WIDE SCSI (16 bit) enabled.\n");
8222: else
8223: printk ("WIDE SCSI disabled.\n");
8224: }
8225:
8226: /*
8227: ** set actual value and sync_status
8228: ** patch ALL ccbs of this target.
8229: */
8230: ncr_set_sync_wide_status(np, target);
8231: }
8232:
8233:
8234: /*==========================================================
8235: **
8236: ** Switch sync/wide mode for current job and it's target
8237: ** PPR negotiations only
8238: **
8239: **==========================================================
8240: */
8241:
8242: static void ncr_setsyncwide (ncb_p np, ccb_p cp, u_char scntl3, u_char sxfer,
8243: u_char scntl4, u_char wide)
8244: {
8245: tcb_p tp;
8246: u_char target = INB (nc_sdid) & 0x0f;
8247: u_char idiv;
8248: u_char offset;
8249:
8250: assert (cp);
8251: if (!cp) return;
8252:
8253: assert (target == (cp->target & 0xf));
8254:
8255: tp = &np->target[target];
8256: tp->widedone = wide+1;
8257:
8258: if ((np->device_id == PCI_DEVICE_ID_LSI_53C1010) ||
8259: (np->device_id == PCI_DEVICE_ID_LSI_53C1010_66)) {
8260: offset = sxfer & 0x3f; /* bits 5-0 */
8261: scntl3 = (scntl3 & 0xf0) | (wide ? EWS : 0);
8262: scntl4 = (scntl4 & 0x80);
8263: }
8264: else {
8265: offset = sxfer & 0x1f; /* bits 4-0 */
8266: if (!scntl3 || !offset)
8267: scntl3 = np->rv_scntl3;
8268:
8269: scntl3 = (scntl3 & 0xf0) | (wide ? EWS : 0) |
8270: (np->rv_scntl3 & 0x07);
8271: }
8272:
8273:
8274: /*
8275: ** Deduce the value of controller sync period from scntl3.
8276: ** period is in tenths of nano-seconds.
8277: */
8278:
8279: idiv = ((scntl3 >> 4) & 0x7);
8280: if ( offset && idiv) {
8281: if ((np->device_id == PCI_DEVICE_ID_LSI_53C1010) ||
8282: (np->device_id == PCI_DEVICE_ID_LSI_53C1010_66)) {
8283: /* Note: If extra data hold clocks are used,
8284: * the formulas below must be modified.
8285: * When scntl4 == 0, ST mode.
8286: */
8287: if (scntl4 & 0x80)
8288: tp->period = (2*div_10M[idiv-1])/np->clock_khz;
8289: else
8290: tp->period = (4*div_10M[idiv-1])/np->clock_khz;
8291: }
8292: else
8293: tp->period = (((sxfer>>5)+4)*div_10M[idiv-1])/np->clock_khz;
8294: }
8295: else
8296: tp->period = 0xffff;
8297:
8298:
8299: /*
8300: ** Stop there if sync parameters are unchanged
8301: */
8302: if (tp->sval == sxfer && tp->wval == scntl3 && tp->uval == scntl4) return;
8303: tp->sval = sxfer;
8304: tp->wval = scntl3;
8305: tp->uval = scntl4;
8306:
8307: /*
8308: ** Bells and whistles ;-)
8309: ** Donnot announce negotiations due to auto-sense,
8310: ** unless user really want us to be verbose. :)
8311: */
8312: if ( bootverbose < 2 && (cp->host_flags & HF_AUTO_SENSE))
8313: goto next;
8314: PRINT_TARGET(np, target);
8315: if (offset) {
8316: unsigned f10 = 100000 << (tp->widedone ? tp->widedone -1 : 0);
8317: unsigned mb10 = (f10 + tp->period/2) / tp->period;
8318: char *scsi;
8319:
8320: /*
8321: ** Disable extended Sreq/Sack filtering
8322: */
8323: if ((tp->period <= 2000) &&
8324: (np->device_id != PCI_DEVICE_ID_LSI_53C1010) &&
8325: (np->device_id != PCI_DEVICE_ID_LSI_53C1010_66))
8326: OUTOFFB (nc_stest2, EXT);
8327:
8328: /*
8329: ** Bells and whistles ;-)
8330: */
8331: if (tp->period < 250) scsi = "FAST-80";
8332: else if (tp->period < 500) scsi = "FAST-40";
8333: else if (tp->period < 1000) scsi = "FAST-20";
8334: else if (tp->period < 2000) scsi = "FAST-10";
8335: else scsi = "FAST-5";
8336:
8337: printk ("%s %sSCSI %d.%d MB/s (%d ns, offset %d)\n", scsi,
8338: tp->widedone > 1 ? "WIDE " : "",
8339: mb10 / 10, mb10 % 10, tp->period / 10, offset);
8340: } else
8341: printk ("%sasynchronous.\n", tp->widedone > 1 ? "wide " : "");
8342: next:
8343: /*
8344: ** set actual value and sync_status
8345: ** patch ALL ccbs of this target.
8346: */
8347: ncr_set_sync_wide_status(np, target);
8348: }
8349:
8350:
8351:
8352:
8353: /*==========================================================
8354: **
8355: ** Switch tagged mode for a target.
8356: **
8357: **==========================================================
8358: */
8359:
8360: static void ncr_setup_tags (ncb_p np, u_char tn, u_char ln)
8361: {
8362: tcb_p tp = &np->target[tn];
8363: lcb_p lp = ncr_lp(np, tp, ln);
8364: u_short reqtags, maxdepth;
8365:
8366: /*
8367: ** Just in case ...
8368: */
8369: if ((!tp) || (!lp))
8370: return;
8371:
8372: /*
8373: ** If SCSI device queue depth is not yet set, leave here.
8374: */
8375: if (!lp->scdev_depth)
8376: return;
8377:
8378: /*
8379: ** Donnot allow more tags than the SCSI driver can queue
8380: ** for this device.
8381: ** Donnot allow more tags than we can handle.
8382: */
8383: maxdepth = lp->scdev_depth;
8384: if (maxdepth > lp->maxnxs) maxdepth = lp->maxnxs;
8385: if (lp->maxtags > maxdepth) lp->maxtags = maxdepth;
8386: if (lp->numtags > maxdepth) lp->numtags = maxdepth;
8387:
8388: /*
8389: ** only devices conformant to ANSI Version >= 2
8390: ** only devices capable of tagged commands
8391: ** only if enabled by user ..
8392: */
8393: if ((lp->inq_byte7 & INQ7_QUEUE) && lp->numtags > 1) {
8394: reqtags = lp->numtags;
8395: } else {
8396: reqtags = 1;
8397: };
8398:
8399: /*
8400: ** Update max number of tags
8401: */
8402: lp->numtags = reqtags;
8403: if (lp->numtags > lp->maxtags)
8404: lp->maxtags = lp->numtags;
8405:
8406: /*
8407: ** If we want to switch tag mode, we must wait
8408: ** for no CCB to be active.
8409: */
8410: if (reqtags > 1 && lp->usetags) { /* Stay in tagged mode */
8411: if (lp->queuedepth == reqtags) /* Already announced */
8412: return;
8413: lp->queuedepth = reqtags;
8414: }
8415: else if (reqtags <= 1 && !lp->usetags) { /* Stay in untagged mode */
8416: lp->queuedepth = reqtags;
8417: return;
8418: }
8419: else { /* Want to switch tag mode */
8420: if (lp->busyccbs) /* If not yet safe, return */
8421: return;
8422: lp->queuedepth = reqtags;
8423: lp->usetags = reqtags > 1 ? 1 : 0;
8424: }
8425:
8426: /*
8427: ** Patch the lun mini-script, according to tag mode.
8428: */
8429: lp->resel_task = lp->usetags?
8430: cpu_to_scr(NCB_SCRIPT_PHYS(np, resel_tag)) :
8431: cpu_to_scr(NCB_SCRIPT_PHYS(np, resel_notag));
8432:
8433: /*
8434: ** Announce change to user.
8435: */
8436: if (bootverbose) {
8437: PRINT_LUN(np, tn, ln);
8438: if (lp->usetags)
8439: printk("tagged command queue depth set to %d\n", reqtags);
8440: else
8441: printk("tagged command queueing disabled\n");
8442: }
8443: }
8444:
8445: /*----------------------------------------------------
8446: **
8447: ** handle user commands
8448: **
8449: **----------------------------------------------------
8450: */
8451:
8452: #ifdef SCSI_NCR_USER_COMMAND_SUPPORT
8453:
8454: static void ncr_usercmd (ncb_p np)
8455: {
8456: u_char t;
8457: tcb_p tp;
8458: int ln;
8459: u_long size;
8460:
8461: switch (np->user.cmd) {
8462: case 0: return;
8463:
8464: case UC_SETDEBUG:
8465: #ifdef SCSI_NCR_DEBUG_INFO_SUPPORT
8466: ncr_debug = np->user.data;
8467: #endif
8468: break;
8469:
8470: case UC_SETORDER:
8471: np->order = np->user.data;
8472: break;
8473:
8474: case UC_SETVERBOSE:
8475: np->verbose = np->user.data;
8476: break;
8477:
8478: default:
8479: /*
8480: ** We assume that other commands apply to targets.
8481: ** This should always be the case and avoid the below
8482: ** 4 lines to be repeated 5 times.
8483: */
8484: for (t = 0; t < MAX_TARGET; t++) {
8485: if (!((np->user.target >> t) & 1))
8486: continue;
8487: tp = &np->target[t];
8488:
8489: switch (np->user.cmd) {
8490:
8491: case UC_SETSYNC:
8492: tp->usrsync = np->user.data;
8493: ncr_negotiate (np, tp);
8494: break;
8495:
8496: case UC_SETWIDE:
8497: size = np->user.data;
8498: if (size > np->maxwide)
8499: size=np->maxwide;
8500: tp->usrwide = size;
8501: ncr_negotiate (np, tp);
8502: break;
8503:
8504: case UC_SETTAGS:
8505: tp->usrtags = np->user.data;
8506: for (ln = 0; ln < MAX_LUN; ln++) {
8507: lcb_p lp;
8508: lp = ncr_lp(np, tp, ln);
8509: if (!lp)
8510: continue;
8511: lp->numtags = np->user.data;
8512: lp->maxtags = lp->numtags;
8513: ncr_setup_tags (np, t, ln);
8514: }
8515: break;
8516:
8517: case UC_RESETDEV:
8518: tp->to_reset = 1;
8519: np->istat_sem = SEM;
8520: OUTB (nc_istat, SIGP|SEM);
8521: break;
8522:
8523: case UC_CLEARDEV:
8524: for (ln = 0; ln < MAX_LUN; ln++) {
8525: lcb_p lp;
8526: lp = ncr_lp(np, tp, ln);
8527: if (lp)
8528: lp->to_clear = 1;
8529: }
8530: np->istat_sem = SEM;
8531: OUTB (nc_istat, SIGP|SEM);
8532: break;
8533:
8534: case UC_SETFLAG:
8535: tp->usrflag = np->user.data;
8536: break;
8537: }
8538: }
8539: break;
8540: }
8541: np->user.cmd=0;
8542: }
8543: #endif
8544:
8545: /*==========================================================
8546: **
8547: **
8548: ** ncr timeout handler.
8549: **
8550: **
8551: **==========================================================
8552: **
8553: ** Misused to keep the driver running when
8554: ** interrupts are not configured correctly.
8555: **
8556: **----------------------------------------------------------
8557: */
8558:
8559: static void ncr_timeout (ncb_p np)
8560: {
8561: u_long thistime = ktime_get(0);
8562:
8563: /*
8564: ** If release process in progress, let's go
8565: ** Set the release stage from 1 to 2 to synchronize
8566: ** with the release process.
8567: */
8568:
8569: if (np->release_stage) {
8570: if (np->release_stage == 1) np->release_stage = 2;
8571: return;
8572: }
8573:
8574: #ifdef SCSI_NCR_PCIQ_BROKEN_INTR
8575: np->timer.expires = ktime_get((HZ+9)/10);
8576: #else
8577: np->timer.expires = ktime_get(SCSI_NCR_TIMER_INTERVAL);
8578: #endif
8579: add_timer(&np->timer);
8580:
8581: /*
8582: ** If we are resetting the ncr, wait for settle_time before
8583: ** clearing it. Then command processing will be resumed.
8584: */
8585: if (np->settle_time) {
8586: if (np->settle_time <= thistime) {
8587: if (bootverbose > 1)
8588: printk("%s: command processing resumed\n", ncr_name(np));
8589: np->settle_time = 0;
8590: requeue_waiting_list(np);
8591: }
8592: return;
8593: }
8594:
8595: /*
8596: ** Nothing to do for now, but that may come.
8597: */
8598: if (np->lasttime + 4*HZ < thistime) {
8599: np->lasttime = thistime;
8600: }
8601:
8602: #ifdef SCSI_NCR_PCIQ_MAY_MISS_COMPLETIONS
8603: /*
8604: ** Some way-broken PCI bridges may lead to
8605: ** completions being lost when the clearing
8606: ** of the INTFLY flag by the CPU occurs
8607: ** concurrently with the chip raising this flag.
8608: ** If this ever happen, lost completions will
8609: ** be reaped here.
8610: */
8611: ncr_wakeup_done(np);
8612: #endif
8613:
8614: #ifdef SCSI_NCR_PCIQ_BROKEN_INTR
8615: if (INB(nc_istat) & (INTF|SIP|DIP)) {
8616:
8617: /*
8618: ** Process pending interrupts.
8619: */
8620: if (DEBUG_FLAGS & DEBUG_TINY) printk ("{");
8621: ncr_exception (np);
8622: if (DEBUG_FLAGS & DEBUG_TINY) printk ("}");
8623: }
8624: #endif /* SCSI_NCR_PCIQ_BROKEN_INTR */
8625: }
8626:
8627: /*==========================================================
8628: **
8629: ** log message for real hard errors
8630: **
8631: ** "ncr0 targ 0?: ERROR (ds:si) (so-si-sd) (sxfer/scntl3) @ name (dsp:dbc)."
8632: ** " reg: r0 r1 r2 r3 r4 r5 r6 ..... rf."
8633: **
8634: ** exception register:
8635: ** ds: dstat
8636: ** si: sist
8637: **
8638: ** SCSI bus lines:
8639: ** so: control lines as driven by NCR.
8640: ** si: control lines as seen by NCR.
8641: ** sd: scsi data lines as seen by NCR.
8642: **
8643: ** wide/fastmode:
8644: ** sxfer: (see the manual)
8645: ** scntl3: (see the manual)
8646: **
8647: ** current script command:
8648: ** dsp: script address (relative to start of script).
8649: ** dbc: first word of script command.
8650: **
8651: ** First 24 register of the chip:
8652: ** r0..rf
8653: **
8654: **==========================================================
8655: */
8656:
8657: static void ncr_log_hard_error(ncb_p np, u_short sist, u_char dstat)
8658: {
8659: u_int32 dsp;
8660: int script_ofs;
8661: int script_size;
8662: char *script_name;
8663: u_char *script_base;
8664: int i;
8665:
8666: dsp = INL (nc_dsp);
8667:
8668: if (dsp > np->p_script && dsp <= np->p_script + sizeof(struct script)) {
8669: script_ofs = dsp - np->p_script;
8670: script_size = sizeof(struct script);
8671: script_base = (u_char *) np->script0;
8672: script_name = "script";
8673: }
8674: else if (np->p_scripth < dsp &&
8675: dsp <= np->p_scripth + sizeof(struct scripth)) {
8676: script_ofs = dsp - np->p_scripth;
8677: script_size = sizeof(struct scripth);
8678: script_base = (u_char *) np->scripth0;
8679: script_name = "scripth";
8680: } else {
8681: script_ofs = dsp;
8682: script_size = 0;
8683: script_base = 0;
8684: script_name = "mem";
8685: }
8686:
8687: printk ("%s:%d: ERROR (%x:%x) (%x-%x-%x) (%x/%x) @ (%s %x:%08x).\n",
8688: ncr_name (np), (unsigned)INB (nc_sdid)&0x0f, dstat, sist,
8689: (unsigned)INB (nc_socl), (unsigned)INB (nc_sbcl), (unsigned)INB (nc_sbdl),
8690: (unsigned)INB (nc_sxfer),(unsigned)INB (nc_scntl3), script_name, script_ofs,
8691: (unsigned)INL (nc_dbc));
8692:
8693: if (((script_ofs & 3) == 0) &&
8694: (unsigned)script_ofs < script_size) {
8695: printk ("%s: script cmd = %08x\n", ncr_name(np),
8696: scr_to_cpu((int) *(ncrcmd *)(script_base + script_ofs)));
8697: }
8698:
8699: printk ("%s: regdump:", ncr_name(np));
8700: for (i=0; i<24;i++)
8701: printk (" %02x", (unsigned)INB_OFF(i));
8702: printk (".\n");
8703: }
8704:
8705: /*============================================================
8706: **
8707: ** ncr chip exception handler.
8708: **
8709: **============================================================
8710: **
8711: ** In normal situations, interrupt conditions occur one at
8712: ** a time. But when something bad happens on the SCSI BUS,
8713: ** the chip may raise several interrupt flags before
8714: ** stopping and interrupting the CPU. The additionnal
8715: ** interrupt flags are stacked in some extra registers
8716: ** after the SIP and/or DIP flag has been raised in the
8717: ** ISTAT. After the CPU has read the interrupt condition
8718: ** flag from SIST or DSTAT, the chip unstacks the other
8719: ** interrupt flags and sets the corresponding bits in
8720: ** SIST or DSTAT. Since the chip starts stacking once the
8721: ** SIP or DIP flag is set, there is a small window of time
8722: ** where the stacking does not occur.
8723: **
8724: ** Typically, multiple interrupt conditions may happen in
8725: ** the following situations:
8726: **
8727: ** - SCSI parity error + Phase mismatch (PAR|MA)
8728: ** When an parity error is detected in input phase
8729: ** and the device switches to msg-in phase inside a
8730: ** block MOV.
8731: ** - SCSI parity error + Unexpected disconnect (PAR|UDC)
8732: ** When a stupid device does not want to handle the
8733: ** recovery of an SCSI parity error.
8734: ** - Some combinations of STO, PAR, UDC, ...
8735: ** When using non compliant SCSI stuff, when user is
8736: ** doing non compliant hot tampering on the BUS, when
8737: ** something really bad happens to a device, etc ...
8738: **
8739: ** The heuristic suggested by SYMBIOS to handle
8740: ** multiple interrupts is to try unstacking all
8741: ** interrupts conditions and to handle them on some
8742: ** priority based on error severity.
8743: ** This will work when the unstacking has been
8744: ** successful, but we cannot be 100 % sure of that,
8745: ** since the CPU may have been faster to unstack than
8746: ** the chip is able to stack. Hmmm ... But it seems that
8747: ** such a situation is very unlikely to happen.
8748: **
8749: ** If this happen, for example STO catched by the CPU
8750: ** then UDC happenning before the CPU have restarted
8751: ** the SCRIPTS, the driver may wrongly complete the
8752: ** same command on UDC, since the SCRIPTS didn't restart
8753: ** and the DSA still points to the same command.
8754: ** We avoid this situation by setting the DSA to an
8755: ** invalid value when the CCB is completed and before
8756: ** restarting the SCRIPTS.
8757: **
8758: ** Another issue is that we need some section of our
8759: ** recovery procedures to be somehow uninterruptible and
8760: ** that the SCRIPTS processor does not provides such a
8761: ** feature. For this reason, we handle recovery preferently
8762: ** from the C code and check against some SCRIPTS
8763: ** critical sections from the C code.
8764: **
8765: ** Hopefully, the interrupt handling of the driver is now
8766: ** able to resist to weird BUS error conditions, but donnot
8767: ** ask me for any guarantee that it will never fail. :-)
8768: ** Use at your own decision and risk.
8769: **
8770: **============================================================
8771: */
8772:
8773: void ncr_exception (ncb_p np)
8774: {
8775: u_char istat, istatc;
8776: u_char dstat;
8777: u_short sist;
8778: int i;
8779:
8780: /*
8781: ** interrupt on the fly ?
8782: **
8783: ** A `dummy read' is needed to ensure that the
8784: ** clear of the INTF flag reaches the device
8785: ** before the scanning of the DONE queue.
8786: */
8787: istat = INB (nc_istat);
8788: if (istat & INTF) {
8789: OUTB (nc_istat, (istat & SIGP) | INTF | np->istat_sem);
8790: istat = INB (nc_istat); /* DUMMY READ */
8791: if (DEBUG_FLAGS & DEBUG_TINY) printk ("F ");
8792: (void)ncr_wakeup_done (np);
8793: };
8794:
8795: if (!(istat & (SIP|DIP)))
8796: return;
8797:
8798: #if 0 /* We should never get this one */
8799: if (istat & CABRT)
8800: OUTB (nc_istat, CABRT);
8801: #endif
8802:
8803: /*
8804: ** Steinbach's Guideline for Systems Programming:
8805: ** Never test for an error condition you don't know how to handle.
8806: */
8807:
8808: /*========================================================
8809: ** PAR and MA interrupts may occur at the same time,
8810: ** and we need to know of both in order to handle
8811: ** this situation properly. We try to unstack SCSI
8812: ** interrupts for that reason. BTW, I dislike a LOT
8813: ** such a loop inside the interrupt routine.
8814: ** Even if DMA interrupt stacking is very unlikely to
8815: ** happen, we also try unstacking these ones, since
8816: ** this has no performance impact.
8817: **=========================================================
8818: */
8819: sist = 0;
8820: dstat = 0;
8821: istatc = istat;
8822: do {
8823: if (istatc & SIP)
8824: sist |= INW (nc_sist);
8825: if (istatc & DIP)
8826: dstat |= INB (nc_dstat);
8827: istatc = INB (nc_istat);
8828: istat |= istatc;
8829: } while (istatc & (SIP|DIP));
8830:
8831: if (DEBUG_FLAGS & DEBUG_TINY)
8832: printk ("<%d|%x:%x|%x:%x>",
8833: (int)INB(nc_scr0),
8834: dstat,sist,
8835: (unsigned)INL(nc_dsp),
8836: (unsigned)INL(nc_dbc));
8837:
8838: /*
8839: ** On paper, a memory barrier may be needed here.
8840: ** And since we are paranoid ... :)
8841: */
8842: MEMORY_BARRIER();
8843:
8844: /*========================================================
8845: ** First, interrupts we want to service cleanly.
8846: **
8847: ** Phase mismatch (MA) is the most frequent interrupt
8848: ** for chip earlier than the 896 and so we have to service
8849: ** it as quickly as possible.
8850: ** A SCSI parity error (PAR) may be combined with a phase
8851: ** mismatch condition (MA).
8852: ** Programmed interrupts (SIR) are used to call the C code
8853: ** from SCRIPTS.
8854: ** The single step interrupt (SSI) is not used in this
8855: ** driver.
8856: **=========================================================
8857: */
8858:
8859: if (!(sist & (STO|GEN|HTH|SGE|UDC|SBMC|RST)) &&
8860: !(dstat & (MDPE|BF|ABRT|IID))) {
8861: if (sist & PAR) ncr_int_par (np, sist);
8862: else if (sist & MA) ncr_int_ma (np);
8863: else if (dstat & SIR) ncr_int_sir (np);
8864: else if (dstat & SSI) OUTONB_STD ();
8865: else goto unknown_int;
8866: return;
8867: };
8868:
8869: /*========================================================
8870: ** Now, interrupts that donnot happen in normal
8871: ** situations and that we may need to recover from.
8872: **
8873: ** On SCSI RESET (RST), we reset everything.
8874: ** On SCSI BUS MODE CHANGE (SBMC), we complete all
8875: ** active CCBs with RESET status, prepare all devices
8876: ** for negotiating again and restart the SCRIPTS.
8877: ** On STO and UDC, we complete the CCB with the corres-
8878: ** ponding status and restart the SCRIPTS.
8879: **=========================================================
8880: */
8881:
8882: if (sist & RST) {
8883: ncr_init (np, 1, bootverbose ? "scsi reset" : NULL, HS_RESET);
8884: return;
8885: };
8886:
8887: OUTB (nc_ctest3, np->rv_ctest3 | CLF); /* clear dma fifo */
8888: OUTB (nc_stest3, TE|CSF); /* clear scsi fifo */
8889:
8890: if (!(sist & (GEN|HTH|SGE)) &&
8891: !(dstat & (MDPE|BF|ABRT|IID))) {
8892: if (sist & SBMC) ncr_int_sbmc (np);
8893: else if (sist & STO) ncr_int_sto (np);
8894: else if (sist & UDC) ncr_int_udc (np);
8895: else goto unknown_int;
8896: return;
8897: };
8898:
8899: /*=========================================================
8900: ** Now, interrupts we are not able to recover cleanly.
8901: **
8902: ** Do the register dump.
8903: ** Log message for hard errors.
8904: ** Reset everything.
8905: **=========================================================
8906: */
8907: if (ktime_exp(np->regtime)) {
8908: np->regtime = ktime_get(10*HZ);
8909: for (i = 0; i<sizeof(np->regdump); i++)
8910: ((char*)&np->regdump)[i] = INB_OFF(i);
8911: np->regdump.nc_dstat = dstat;
8912: np->regdump.nc_sist = sist;
8913: };
8914:
8915: ncr_log_hard_error(np, sist, dstat);
8916:
8917: if ((np->device_id == PCI_DEVICE_ID_LSI_53C1010) ||
8918: (np->device_id == PCI_DEVICE_ID_LSI_53C1010_66)) {
8919: u_char ctest4_o, ctest4_m;
8920: u_char shadow;
8921:
8922: /*
8923: * Get shadow register data
8924: * Write 1 to ctest4
8925: */
8926: ctest4_o = INB(nc_ctest4);
8927:
8928: OUTB(nc_ctest4, ctest4_o | 0x10);
8929:
8930: ctest4_m = INB(nc_ctest4);
8931: shadow = INW_OFF(0x42);
8932:
8933: OUTB(nc_ctest4, ctest4_o);
8934:
8935: printk("%s: ctest4/sist original 0x%x/0x%X mod: 0x%X/0x%x\n",
8936: ncr_name(np), ctest4_o, sist, ctest4_m, shadow);
8937: }
8938:
8939: if ((sist & (GEN|HTH|SGE)) ||
8940: (dstat & (MDPE|BF|ABRT|IID))) {
8941: ncr_start_reset(np);
8942: return;
8943: };
8944:
8945: unknown_int:
8946: /*=========================================================
8947: ** We just miss the cause of the interrupt. :(
8948: ** Print a message. The timeout will do the real work.
8949: **=========================================================
8950: */
8951: printk( "%s: unknown interrupt(s) ignored, "
8952: "ISTAT=0x%x DSTAT=0x%x SIST=0x%x\n",
8953: ncr_name(np), istat, dstat, sist);
8954: }
8955:
8956:
8957: /*==========================================================
8958: **
8959: ** generic recovery from scsi interrupt
8960: **
8961: **==========================================================
8962: **
8963: ** The doc says that when the chip gets an SCSI interrupt,
8964: ** it tries to stop in an orderly fashion, by completing
8965: ** an instruction fetch that had started or by flushing
8966: ** the DMA fifo for a write to memory that was executing.
8967: ** Such a fashion is not enough to know if the instruction
8968: ** that was just before the current DSP value has been
8969: ** executed or not.
8970: **
8971: ** There are 3 small SCRIPTS sections that deal with the
8972: ** start queue and the done queue that may break any
8973: ** assomption from the C code if we are interrupted
8974: ** inside, so we reset if it happens. Btw, since these
8975: ** SCRIPTS sections are executed while the SCRIPTS hasn't
8976: ** started SCSI operations, it is very unlikely to happen.
8977: **
8978: ** All the driver data structures are supposed to be
8979: ** allocated from the same 4 GB memory window, so there
8980: ** is a 1 to 1 relationship between DSA and driver data
8981: ** structures. Since we are careful :) to invalidate the
8982: ** DSA when we complete a command or when the SCRIPTS
8983: ** pushes a DSA into a queue, we can trust it when it
8984: ** points to a CCB.
8985: **
8986: **----------------------------------------------------------
8987: */
8988: static void ncr_recover_scsi_int (ncb_p np, u_char hsts)
8989: {
8990: u_int32 dsp = INL (nc_dsp);
8991: u_int32 dsa = INL (nc_dsa);
8992: ccb_p cp = ncr_ccb_from_dsa(np, dsa);
8993:
8994: /*
8995: ** If we haven't been interrupted inside the SCRIPTS
8996: ** critical pathes, we can safely restart the SCRIPTS
8997: ** and trust the DSA value if it matches a CCB.
8998: */
8999: if ((!(dsp > NCB_SCRIPT_PHYS (np, getjob_begin) &&
9000: dsp < NCB_SCRIPT_PHYS (np, getjob_end) + 1)) &&
9001: (!(dsp > NCB_SCRIPT_PHYS (np, ungetjob) &&
9002: dsp < NCB_SCRIPT_PHYS (np, reselect) + 1)) &&
9003: (!(dsp > NCB_SCRIPTH_PHYS (np, sel_for_abort) &&
9004: dsp < NCB_SCRIPTH_PHYS (np, sel_for_abort_1) + 1)) &&
9005: (!(dsp > NCB_SCRIPT_PHYS (np, done) &&
9006: dsp < NCB_SCRIPT_PHYS (np, done_end) + 1))) {
9007: if (cp) {
9008: cp->host_status = hsts;
9009: ncr_complete (np, cp);
9010: }
9011: OUTL (nc_dsa, DSA_INVALID);
9012: OUTB (nc_ctest3, np->rv_ctest3 | CLF); /* clear dma fifo */
9013: OUTB (nc_stest3, TE|CSF); /* clear scsi fifo */
9014: OUTL_DSP (NCB_SCRIPT_PHYS (np, start));
9015: }
9016: else
9017: goto reset_all;
9018:
9019: return;
9020:
9021: reset_all:
9022: ncr_start_reset(np);
9023: }
9024:
9025: /*==========================================================
9026: **
9027: ** ncr chip exception handler for selection timeout
9028: **
9029: **==========================================================
9030: **
9031: ** There seems to be a bug in the 53c810.
9032: ** Although a STO-Interrupt is pending,
9033: ** it continues executing script commands.
9034: ** But it will fail and interrupt (IID) on
9035: ** the next instruction where it's looking
9036: ** for a valid phase.
9037: **
9038: **----------------------------------------------------------
9039: */
9040:
9041: void ncr_int_sto (ncb_p np)
9042: {
9043: u_int32 dsp = INL (nc_dsp);
9044:
9045: if (DEBUG_FLAGS & DEBUG_TINY) printk ("T");
9046:
9047: if (dsp == NCB_SCRIPT_PHYS (np, wf_sel_done) + 8 ||
9048: !(driver_setup.recovery & 1))
9049: ncr_recover_scsi_int(np, HS_SEL_TIMEOUT);
9050: else
9051: ncr_start_reset(np);
9052: }
9053:
9054: /*==========================================================
9055: **
9056: ** ncr chip exception handler for unexpected disconnect
9057: **
9058: **==========================================================
9059: **
9060: **----------------------------------------------------------
9061: */
9062: void ncr_int_udc (ncb_p np)
9063: {
9064: u_int32 dsa = INL (nc_dsa);
9065: ccb_p cp = ncr_ccb_from_dsa(np, dsa);
9066: tcb_p tp = &np->target[cp->target];
9067:
9068: /*
9069: * Fix Up. Some disks respond to a PPR negotation with
9070: * a bus free instead of a message reject.
9071: * Disable ppr negotiation if this is first time
9072: * tried ppr negotiation.
9073: */
9074:
9075: if (tp->ppr_negotiation == 1)
9076: tp->ppr_negotiation = 0;
9077:
9078: printk ("%s: unexpected disconnect\n", ncr_name(np));
9079: ncr_recover_scsi_int(np, HS_UNEXPECTED);
9080: }
9081:
9082: /*==========================================================
9083: **
9084: ** ncr chip exception handler for SCSI bus mode change
9085: **
9086: **==========================================================
9087: **
9088: ** spi2-r12 11.2.3 says a transceiver mode change must
9089: ** generate a reset event and a device that detects a reset
9090: ** event shall initiate a hard reset. It says also that a
9091: ** device that detects a mode change shall set data transfer
9092: ** mode to eight bit asynchronous, etc...
9093: ** So, just resetting should be enough.
9094: **
9095: **
9096: **----------------------------------------------------------
9097: */
9098:
9099: static void ncr_int_sbmc (ncb_p np)
9100: {
9101: u_char scsi_mode = INB (nc_stest4) & SMODE;
9102:
9103: printk("%s: SCSI bus mode change from %x to %x.\n",
9104: ncr_name(np), np->scsi_mode, scsi_mode);
9105:
9106: np->scsi_mode = scsi_mode;
9107:
9108:
9109: /*
9110: ** Suspend command processing for 1 second and
9111: ** reinitialize all except the chip.
9112: */
9113: np->settle_time = ktime_get(1*HZ);
9114: ncr_init (np, 0, bootverbose ? "scsi mode change" : NULL, HS_RESET);
9115: }
9116:
9117: /*==========================================================
9118: **
9119: ** ncr chip exception handler for SCSI parity error.
9120: **
9121: **==========================================================
9122: **
9123: ** When the chip detects a SCSI parity error and is
9124: ** currently executing a (CH)MOV instruction, it does
9125: ** not interrupt immediately, but tries to finish the
9126: ** transfer of the current scatter entry before
9127: ** interrupting. The following situations may occur:
9128: **
9129: ** - The complete scatter entry has been transferred
9130: ** without the device having changed phase.
9131: ** The chip will then interrupt with the DSP pointing
9132: ** to the instruction that follows the MOV.
9133: **
9134: ** - A phase mismatch occurs before the MOV finished
9135: ** and phase errors are to be handled by the C code.
9136: ** The chip will then interrupt with both PAR and MA
9137: ** conditions set.
9138: **
9139: ** - A phase mismatch occurs before the MOV finished and
9140: ** phase errors are to be handled by SCRIPTS (895A or 896).
9141: ** The chip will load the DSP with the phase mismatch
9142: ** JUMP address and interrupt the host processor.
9143: **
9144: **----------------------------------------------------------
9145: */
9146:
9147: static void ncr_int_par (ncb_p np, u_short sist)
9148: {
9149: u_char hsts = INB (HS_PRT);
9150: u_int32 dsp = INL (nc_dsp);
9151: u_int32 dbc = INL (nc_dbc);
9152: u_int32 dsa = INL (nc_dsa);
9153: u_char sbcl = INB (nc_sbcl);
9154: u_char cmd = dbc >> 24;
9155: int phase = cmd & 7;
9156: ccb_p cp = ncr_ccb_from_dsa(np, dsa);
9157:
9158: printk("%s: SCSI parity error detected: SCR1=%d DBC=%x SBCL=%x\n",
9159: ncr_name(np), hsts, dbc, sbcl);
9160:
9161: /*
9162: ** Check that the chip is connected to the SCSI BUS.
9163: */
9164: if (!(INB (nc_scntl1) & ISCON)) {
9165: if (!(driver_setup.recovery & 1)) {
9166: ncr_recover_scsi_int(np, HS_FAIL);
9167: return;
9168: }
9169: goto reset_all;
9170: }
9171:
9172: /*
9173: ** If the nexus is not clearly identified, reset the bus.
9174: ** We will try to do better later.
9175: */
9176: if (!cp)
9177: goto reset_all;
9178:
9179: /*
9180: ** Check instruction was a MOV, direction was INPUT and
9181: ** ATN is asserted.
9182: */
9183: if ((cmd & 0xc0) || !(phase & 1) || !(sbcl & 0x8))
9184: goto reset_all;
9185:
9186: /*
9187: ** Keep track of the parity error.
9188: */
9189: OUTONB (HF_PRT, HF_EXT_ERR);
9190: cp->xerr_status |= XE_PARITY_ERR;
9191:
9192: /*
9193: ** Prepare the message to send to the device.
9194: */
9195: np->msgout[0] = (phase == 7) ? M_PARITY : M_ID_ERROR;
9196:
9197: #ifdef SCSI_NCR_INTEGRITY_CHECKING
9198: /*
9199: ** Save error message. For integrity check use only.
9200: */
9201: if (np->check_integrity)
9202: np->check_integ_par = np->msgout[0];
9203: #endif
9204:
9205: /*
9206: ** If the old phase was DATA IN or DT DATA IN phase,
9207: ** we have to deal with the 3 situations described above.
9208: ** For other input phases (MSG IN and STATUS), the device
9209: ** must resend the whole thing that failed parity checking
9210: ** or signal error. So, jumping to dispatcher should be OK.
9211: */
9212: if ((phase == 1) || (phase == 5)) {
9213: /* Phase mismatch handled by SCRIPTS */
9214: if (dsp == NCB_SCRIPTH_PHYS (np, pm_handle))
9215: OUTL_DSP (dsp);
9216: /* Phase mismatch handled by the C code */
9217: else if (sist & MA)
9218: ncr_int_ma (np);
9219: /* No phase mismatch occurred */
9220: else {
9221: OUTL (nc_temp, dsp);
9222: OUTL_DSP (NCB_SCRIPT_PHYS (np, dispatch));
9223: }
9224: }
9225: else
9226: OUTL_DSP (NCB_SCRIPT_PHYS (np, clrack));
9227: return;
9228:
9229: reset_all:
9230: ncr_start_reset(np);
9231: return;
9232: }
9233:
9234: /*==========================================================
9235: **
9236: **
9237: ** ncr chip exception handler for phase errors.
9238: **
9239: **
9240: **==========================================================
9241: **
9242: ** We have to construct a new transfer descriptor,
9243: ** to transfer the rest of the current block.
9244: **
9245: **----------------------------------------------------------
9246: */
9247:
9248: static void ncr_int_ma (ncb_p np)
9249: {
9250: u_int32 dbc;
9251: u_int32 rest;
9252: u_int32 dsp;
9253: u_int32 dsa;
9254: u_int32 nxtdsp;
9255: u_int32 *vdsp;
9256: u_int32 oadr, olen;
9257: u_int32 *tblp;
9258: u_int32 newcmd;
9259: u_int delta;
9260: u_char cmd;
9261: u_char hflags, hflags0;
9262: struct pm_ctx *pm;
9263: ccb_p cp;
9264:
9265: dsp = INL (nc_dsp);
9266: dbc = INL (nc_dbc);
9267: dsa = INL (nc_dsa);
9268:
9269: cmd = dbc >> 24;
9270: rest = dbc & 0xffffff;
9271: delta = 0;
9272:
9273: /*
9274: ** locate matching cp.
9275: */
9276: cp = ncr_ccb_from_dsa(np, dsa);
9277:
9278: if (DEBUG_FLAGS & DEBUG_PHASE)
9279: printk("CCB = %2x %2x %2x %2x %2x %2x\n",
9280: cp->cmd->cmnd[0], cp->cmd->cmnd[1], cp->cmd->cmnd[2],
9281: cp->cmd->cmnd[3], cp->cmd->cmnd[4], cp->cmd->cmnd[5]);
9282:
9283: /*
9284: ** Donnot take into account dma fifo and various buffers in
9285: ** INPUT phase since the chip flushes everything before
9286: ** raising the MA interrupt for interrupted INPUT phases.
9287: ** For DATA IN phase, we will check for the SWIDE later.
9288: */
9289: if ((cmd & 7) != 1 && (cmd & 7) != 5) {
9290: u_int32 dfifo;
9291: u_char ss0, ss2;
9292:
9293: /*
9294: ** If C1010, DFBC contains number of bytes in DMA fifo.
9295: ** else read DFIFO, CTEST[4-6] using 1 PCI bus ownership.
9296: */
9297: if ((np->device_id == PCI_DEVICE_ID_LSI_53C1010) ||
9298: (np->device_id == PCI_DEVICE_ID_LSI_53C1010_66))
9299: delta = INL(nc_dfbc) & 0xffff;
9300: else {
9301: dfifo = INL(nc_dfifo);
9302:
9303: /*
9304: ** Calculate remaining bytes in DMA fifo.
9305: ** C1010 - always large fifo, value in dfbc
9306: ** Otherwise, (CTEST5 = dfifo >> 16)
9307: */
9308: if (dfifo & (DFS << 16))
9309: delta = ((((dfifo >> 8) & 0x300) |
9310: (dfifo & 0xff)) - rest) & 0x3ff;
9311: else
9312: delta = ((dfifo & 0xff) - rest) & 0x7f;
9313:
9314: /*
9315: ** The data in the dma fifo has not been
9316: ** transferred to the target -> add the amount
9317: ** to the rest and clear the data.
9318: ** Check the sstat2 register in case of wide
9319: ** transfer.
9320: */
9321:
9322: }
9323:
9324: rest += delta;
9325: ss0 = INB (nc_sstat0);
9326: if (ss0 & OLF) rest++;
9327: if ((np->device_id != PCI_DEVICE_ID_LSI_53C1010) &&
9328: (np->device_id != PCI_DEVICE_ID_LSI_53C1010_66) && (ss0 & ORF))
9329: rest++;
9330: if (cp && (cp->phys.select.sel_scntl3 & EWS)) {
9331: ss2 = INB (nc_sstat2);
9332: if (ss2 & OLF1) rest++;
9333: if ((np->device_id != PCI_DEVICE_ID_LSI_53C1010) &&
9334: (np->device_id != PCI_DEVICE_ID_LSI_53C1010_66) && (ss2 & ORF))
9335: rest++;
9336: };
9337:
9338: /*
9339: ** Clear fifos.
9340: */
9341: OUTB (nc_ctest3, np->rv_ctest3 | CLF); /* dma fifo */
9342: OUTB (nc_stest3, TE|CSF); /* scsi fifo */
9343: }
9344:
9345: /*
9346: ** log the information
9347: */
9348:
9349: if (DEBUG_FLAGS & (DEBUG_TINY|DEBUG_PHASE))
9350: printk ("P%x%x RL=%d D=%d ", cmd&7, INB(nc_sbcl)&7,
9351: (unsigned) rest, (unsigned) delta);
9352:
9353: /*
9354: ** try to find the interrupted script command,
9355: ** and the address at which to continue.
9356: */
9357: vdsp = 0;
9358: nxtdsp = 0;
9359: if (dsp > np->p_script &&
9360: dsp <= np->p_script + sizeof(struct script)) {
9361: vdsp = (u_int32 *)((char*)np->script0 + (dsp-np->p_script-8));
9362: nxtdsp = dsp;
9363: }
9364: else if (dsp > np->p_scripth &&
9365: dsp <= np->p_scripth + sizeof(struct scripth)) {
9366: vdsp = (u_int32 *)((char*)np->scripth0 + (dsp-np->p_scripth-8));
9367: nxtdsp = dsp;
9368: }
9369:
9370: /*
9371: ** log the information
9372: */
9373: if (DEBUG_FLAGS & DEBUG_PHASE) {
9374: printk ("\nCP=%p DSP=%x NXT=%x VDSP=%p CMD=%x ",
9375: cp, (unsigned)dsp, (unsigned)nxtdsp, vdsp, cmd);
9376: };
9377:
9378: if (!vdsp) {
9379: printk ("%s: interrupted SCRIPT address not found.\n",
9380: ncr_name (np));
9381: goto reset_all;
9382: }
9383:
9384: if (!cp) {
9385: printk ("%s: SCSI phase error fixup: CCB already dequeued.\n",
9386: ncr_name (np));
9387: goto reset_all;
9388: }
9389:
9390: /*
9391: ** get old startaddress and old length.
9392: */
9393:
9394: oadr = scr_to_cpu(vdsp[1]);
9395:
9396: if (cmd & 0x10) { /* Table indirect */
9397: tblp = (u_int32 *) ((char*) &cp->phys + oadr);
9398: olen = scr_to_cpu(tblp[0]);
9399: oadr = scr_to_cpu(tblp[1]);
9400: } else {
9401: tblp = (u_int32 *) 0;
9402: olen = scr_to_cpu(vdsp[0]) & 0xffffff;
9403: };
9404:
9405: if (DEBUG_FLAGS & DEBUG_PHASE) {
9406: printk ("OCMD=%x\nTBLP=%p OLEN=%x OADR=%x\n",
9407: (unsigned) (scr_to_cpu(vdsp[0]) >> 24),
9408: tblp,
9409: (unsigned) olen,
9410: (unsigned) oadr);
9411: };
9412:
9413: /*
9414: ** check cmd against assumed interrupted script command.
9415: ** If dt data phase, the MOVE instruction hasn't bit 4 of
9416: ** the phase.
9417: */
9418:
9419: if (((cmd & 2) ? cmd : (cmd & ~4)) != (scr_to_cpu(vdsp[0]) >> 24)) {
9420: PRINT_ADDR(cp->cmd);
9421: printk ("internal error: cmd=%02x != %02x=(vdsp[0] >> 24)\n",
9422: (unsigned)cmd, (unsigned)scr_to_cpu(vdsp[0]) >> 24);
9423:
9424: goto reset_all;
9425: };
9426:
9427: /*
9428: ** if old phase not dataphase, leave here.
9429: ** C/D line is low if data.
9430: */
9431:
9432: if (cmd & 0x02) {
9433: PRINT_ADDR(cp->cmd);
9434: printk ("phase change %x-%x %d@%08x resid=%d.\n",
9435: cmd&7, INB(nc_sbcl)&7, (unsigned)olen,
9436: (unsigned)oadr, (unsigned)rest);
9437: goto unexpected_phase;
9438: };
9439:
9440: /*
9441: ** Choose the correct PM save area.
9442: **
9443: ** Look at the PM_SAVE SCRIPT if you want to understand
9444: ** this stuff. The equivalent code is implemented in
9445: ** SCRIPTS for the 895A and 896 that are able to handle
9446: ** PM from the SCRIPTS processor.
9447: */
9448:
9449: hflags0 = INB (HF_PRT);
9450: hflags = hflags0;
9451:
9452: if (hflags & (HF_IN_PM0 | HF_IN_PM1 | HF_DP_SAVED)) {
9453: if (hflags & HF_IN_PM0)
9454: nxtdsp = scr_to_cpu(cp->phys.pm0.ret);
9455: else if (hflags & HF_IN_PM1)
9456: nxtdsp = scr_to_cpu(cp->phys.pm1.ret);
9457:
9458: if (hflags & HF_DP_SAVED)
9459: hflags ^= HF_ACT_PM;
9460: }
9461:
9462: if (!(hflags & HF_ACT_PM)) {
9463: pm = &cp->phys.pm0;
9464: newcmd = NCB_SCRIPT_PHYS(np, pm0_data);
9465: }
9466: else {
9467: pm = &cp->phys.pm1;
9468: newcmd = NCB_SCRIPT_PHYS(np, pm1_data);
9469: }
9470:
9471: hflags &= ~(HF_IN_PM0 | HF_IN_PM1 | HF_DP_SAVED);
9472: if (hflags != hflags0)
9473: OUTB (HF_PRT, hflags);
9474:
9475: /*
9476: ** fillin the phase mismatch context
9477: */
9478:
9479: pm->sg.addr = cpu_to_scr(oadr + olen - rest);
9480: pm->sg.size = cpu_to_scr(rest);
9481: pm->ret = cpu_to_scr(nxtdsp);
9482:
9483: /*
9484: ** If we have a SWIDE,
9485: ** - prepare the address to write the SWIDE from SCRIPTS,
9486: ** - compute the SCRIPTS address to restart from,
9487: ** - move current data pointer context by one byte.
9488: */
9489: nxtdsp = NCB_SCRIPT_PHYS (np, dispatch);
9490: if ( ((cmd & 7) == 1 || (cmd & 7) == 5)
9491: && cp && (cp->phys.select.sel_scntl3 & EWS) &&
9492: (INB (nc_scntl2) & WSR)) {
9493: u32 tmp;
9494:
9495: #ifdef SYM_DEBUG_PM_WITH_WSR
9496: PRINT_ADDR(cp);
9497: printf ("MA interrupt with WSR set - "
9498: "pm->sg.addr=%x - pm->sg.size=%d\n",
9499: pm->sg.addr, pm->sg.size);
9500: #endif
9501: /*
9502: * Set up the table indirect for the MOVE
9503: * of the residual byte and adjust the data
9504: * pointer context.
9505: */
9506: tmp = scr_to_cpu(pm->sg.addr);
9507: cp->phys.wresid.addr = cpu_to_scr(tmp);
9508: pm->sg.addr = cpu_to_scr(tmp + 1);
9509: tmp = scr_to_cpu(pm->sg.size);
9510: cp->phys.wresid.size = cpu_to_scr((tmp&0xff000000) | 1);
9511: pm->sg.size = cpu_to_scr(tmp - 1);
9512:
9513: /*
9514: * If only the residual byte is to be moved,
9515: * no PM context is needed.
9516: */
9517: if ((tmp&0xffffff) == 1)
9518: newcmd = pm->ret;
9519:
9520: /*
9521: * Prepare the address of SCRIPTS that will
9522: * move the residual byte to memory.
9523: */
9524: nxtdsp = NCB_SCRIPTH_PHYS (np, wsr_ma_helper);
9525: }
9526:
9527: if (DEBUG_FLAGS & DEBUG_PHASE) {
9528: PRINT_ADDR(cp->cmd);
9529: printk ("PM %x %x %x / %x %x %x.\n",
9530: hflags0, hflags, newcmd,
9531: (unsigned)scr_to_cpu(pm->sg.addr),
9532: (unsigned)scr_to_cpu(pm->sg.size),
9533: (unsigned)scr_to_cpu(pm->ret));
9534: }
9535:
9536: /*
9537: ** Restart the SCRIPTS processor.
9538: */
9539:
9540: OUTL (nc_temp, newcmd);
9541: OUTL_DSP (nxtdsp);
9542: return;
9543:
9544: /*
9545: ** Unexpected phase changes that occurs when the current phase
9546: ** is not a DATA IN or DATA OUT phase are due to error conditions.
9547: ** Such event may only happen when the SCRIPTS is using a
9548: ** multibyte SCSI MOVE.
9549: **
9550: ** Phase change Some possible cause
9551: **
9552: ** COMMAND --> MSG IN SCSI parity error detected by target.
9553: ** COMMAND --> STATUS Bad command or refused by target.
9554: ** MSG OUT --> MSG IN Message rejected by target.
9555: ** MSG OUT --> COMMAND Bogus target that discards extended
9556: ** negotiation messages.
9557: **
9558: ** The code below does not care of the new phase and so
9559: ** trusts the target. Why to annoy it ?
9560: ** If the interrupted phase is COMMAND phase, we restart at
9561: ** dispatcher.
9562: ** If a target does not get all the messages after selection,
9563: ** the code assumes blindly that the target discards extended
9564: ** messages and clears the negotiation status.
9565: ** If the target does not want all our response to negotiation,
9566: ** we force a SIR_NEGO_PROTO interrupt (it is a hack that avoids
9567: ** bloat for such a should_not_happen situation).
9568: ** In all other situation, we reset the BUS.
9569: ** Are these assumptions reasonnable ? (Wait and see ...)
9570: */
9571: unexpected_phase:
9572: dsp -= 8;
9573: nxtdsp = 0;
9574:
9575: switch (cmd & 7) {
9576: case 2: /* COMMAND phase */
9577: nxtdsp = NCB_SCRIPT_PHYS (np, dispatch);
9578: break;
9579: #if 0
9580: case 3: /* STATUS phase */
9581: nxtdsp = NCB_SCRIPT_PHYS (np, dispatch);
9582: break;
9583: #endif
9584: case 6: /* MSG OUT phase */
9585: /*
9586: ** If the device may want to use untagged when we want
9587: ** tagged, we prepare an IDENTIFY without disc. granted,
9588: ** since we will not be able to handle reselect.
9589: ** Otherwise, we just don't care.
9590: */
9591: if (dsp == NCB_SCRIPT_PHYS (np, send_ident)) {
9592: if (cp->tag != NO_TAG && olen - rest <= 3) {
9593: cp->host_status = HS_BUSY;
9594: np->msgout[0] = M_IDENTIFY | cp->lun;
9595: nxtdsp = NCB_SCRIPTH_PHYS (np, ident_break_atn);
9596: }
9597: else
9598: nxtdsp = NCB_SCRIPTH_PHYS (np, ident_break);
9599: }
9600: else if (dsp == NCB_SCRIPTH_PHYS (np, send_wdtr) ||
9601: dsp == NCB_SCRIPTH_PHYS (np, send_sdtr) ||
9602: dsp == NCB_SCRIPTH_PHYS (np, send_ppr)) {
9603: nxtdsp = NCB_SCRIPTH_PHYS (np, nego_bad_phase);
9604: }
9605: break;
9606: #if 0
9607: case 7: /* MSG IN phase */
9608: nxtdsp = NCB_SCRIPT_PHYS (np, clrack);
9609: break;
9610: #endif
9611: }
9612:
9613: if (nxtdsp) {
9614: OUTL_DSP (nxtdsp);
9615: return;
9616: }
9617:
9618: reset_all:
9619: ncr_start_reset(np);
9620: }
9621:
9622: /*==========================================================
9623: **
9624: ** ncr chip handler for QUEUE FULL and CHECK CONDITION
9625: **
9626: **==========================================================
9627: **
9628: ** On QUEUE FULL status, we set the actual tagged command
9629: ** queue depth to the number of disconnected CCBs that is
9630: ** hopefully a good value to avoid further QUEUE FULL.
9631: **
9632: ** On CHECK CONDITION or COMMAND TERMINATED, we use the
9633: ** CCB of the failed command for performing a REQUEST
9634: ** SENSE SCSI command.
9635: **
9636: ** We do not want to change the order commands will be
9637: ** actually queued to the device after we received a
9638: ** QUEUE FULL status. We also want to properly deal with
9639: ** contingent allegiance condition. For these reasons,
9640: ** we remove from the start queue all commands for this
9641: ** LUN that haven't been yet queued to the device and
9642: ** put them back in the correponding LUN queue, then
9643: ** requeue the CCB that failed in front of the LUN queue.
9644: ** I just hope this not to be performed too often. :)
9645: **
9646: ** If we are using IMMEDIATE ARBITRATION, we clear the
9647: ** IARB hint for every commands we encounter in order not
9648: ** to be stuck with a won arbitration and no job to queue
9649: ** to a device.
9650: **----------------------------------------------------------
9651: */
9652:
9653: static void ncr_sir_to_redo(ncb_p np, int num, ccb_p cp)
9654: {
9655: Scsi_Cmnd *cmd = cp->cmd;
9656: tcb_p tp = &np->target[cp->target];
9657: lcb_p lp = ncr_lp(np, tp, cp->lun);
9658: ccb_p cp2;
9659: int busyccbs = 1;
9660: u_int32 startp;
9661: u_char s_status = INB (SS_PRT);
9662: int msglen;
9663: int i, j;
9664:
9665:
9666: /*
9667: ** If the LCB is not yet available, then only
9668: ** 1 IO is accepted, so we should have it.
9669: */
9670: if (!lp)
9671: goto next;
9672: /*
9673: ** Remove all CCBs queued to the chip for that LUN and put
9674: ** them back in the LUN CCB wait queue.
9675: */
9676: busyccbs = lp->queuedccbs;
9677: i = (INL (nc_scratcha) - np->p_squeue) / 4;
9678: j = i;
9679: while (i != np->squeueput) {
9680: cp2 = ncr_ccb_from_dsa(np, scr_to_cpu(np->squeue[i]));
9681: assert(cp2);
9682: #ifdef SCSI_NCR_IARB_SUPPORT
9683: /* IARB hints may not be relevant any more. Forget them. */
9684: cp2->host_flags &= ~HF_HINT_IARB;
9685: #endif
9686: if (cp2 && cp2->target == cp->target && cp2->lun == cp->lun) {
9687: xpt_remque(&cp2->link_ccbq);
9688: xpt_insque_head(&cp2->link_ccbq, &lp->wait_ccbq);
9689: --lp->queuedccbs;
9690: cp2->queued = 0;
9691: }
9692: else {
9693: if (i != j)
9694: np->squeue[j] = np->squeue[i];
9695: if ((j += 2) >= MAX_START*2) j = 0;
9696: }
9697: if ((i += 2) >= MAX_START*2) i = 0;
9698: }
9699: if (i != j) /* Copy back the idle task if needed */
9700: np->squeue[j] = np->squeue[i];
9701: np->squeueput = j; /* Update our current start queue pointer */
9702:
9703: /*
9704: ** Requeue the interrupted CCB in front of the
9705: ** LUN CCB wait queue to preserve ordering.
9706: */
9707: xpt_remque(&cp->link_ccbq);
9708: xpt_insque_head(&cp->link_ccbq, &lp->wait_ccbq);
9709: --lp->queuedccbs;
9710: cp->queued = 0;
9711:
9712: next:
9713:
9714: #ifdef SCSI_NCR_IARB_SUPPORT
9715: /* IARB hint may not be relevant any more. Forget it. */
9716: cp->host_flags &= ~HF_HINT_IARB;
9717: if (np->last_cp)
9718: np->last_cp = 0;
9719: #endif
9720:
9721: /*
9722: ** Now we can restart the SCRIPTS processor safely.
9723: */
9724: OUTL_DSP (NCB_SCRIPT_PHYS (np, start));
9725:
9726: switch(s_status) {
9727: default:
9728: case S_BUSY:
9729: ncr_complete(np, cp);
9730: break;
9731: case S_QUEUE_FULL:
9732: if (!lp || !lp->queuedccbs) {
9733: ncr_complete(np, cp);
9734: break;
9735: }
9736: if (bootverbose >= 1) {
9737: PRINT_ADDR(cmd);
9738: printk ("QUEUE FULL! %d busy, %d disconnected CCBs\n",
9739: busyccbs, lp->queuedccbs);
9740: }
9741: /*
9742: ** Decrease number of tags to the number of
9743: ** disconnected commands.
9744: */
9745: if (lp->queuedccbs < lp->numtags) {
9746: lp->numtags = lp->queuedccbs;
9747: lp->num_good = 0;
9748: ncr_setup_tags (np, cp->target, cp->lun);
9749: }
9750: /*
9751: ** Repair the offending CCB.
9752: */
9753: cp->phys.header.savep = cp->startp;
9754: cp->phys.header.lastp = cp->lastp0;
9755: cp->host_status = HS_BUSY;
9756: cp->scsi_status = S_ILLEGAL;
9757: cp->xerr_status = 0;
9758: cp->extra_bytes = 0;
9759: cp->host_flags &= (HF_PM_TO_C|HF_DATA_IN);
9760:
9761: break;
9762:
9763: case S_TERMINATED:
9764: case S_CHECK_COND:
9765: /*
9766: ** If we were requesting sense, give up.
9767: */
9768: if (cp->host_flags & HF_AUTO_SENSE) {
9769: ncr_complete(np, cp);
9770: break;
9771: }
9772:
9773: /*
9774: ** Save SCSI status and extended error.
9775: ** Compute the data residual now.
9776: */
9777: cp->sv_scsi_status = cp->scsi_status;
9778: cp->sv_xerr_status = cp->xerr_status;
9779: cp->resid = ncr_compute_residual(np, cp);
9780:
9781: /*
9782: ** Device returned CHECK CONDITION status.
9783: ** Prepare all needed data strutures for getting
9784: ** sense data.
9785: */
9786:
9787: /*
9788: ** identify message
9789: */
9790: cp->scsi_smsg2[0] = M_IDENTIFY | cp->lun;
9791: msglen = 1;
9792:
9793: /*
9794: ** If we are currently using anything different from
9795: ** async. 8 bit data transfers with that target,
9796: ** start a negotiation, since the device may want
9797: ** to report us a UNIT ATTENTION condition due to
9798: ** a cause we currently ignore, and we donnot want
9799: ** to be stuck with WIDE and/or SYNC data transfer.
9800: **
9801: ** cp->nego_status is filled by ncr_prepare_nego().
9802: **
9803: ** Do NOT negotiate if performing integrity check
9804: ** or if integrity check has completed, all check
9805: ** conditions will have been cleared.
9806: */
9807:
9808: #ifdef SCSI_NCR_INTEGRITY_CHECKING
9809: if (DEBUG_FLAGS & DEBUG_IC) {
9810: printk("%s: ncr_sir_to_redo: ic_done %2X, in_progress %2X\n",
9811: ncr_name(np), tp->ic_done, cp->cmd->ic_in_progress);
9812: }
9813:
9814: /*
9815: ** If parity error during integrity check,
9816: ** set the target width to narrow. Otherwise,
9817: ** do not negotiate on a request sense.
9818: */
9819: if ( np->check_integ_par && np->check_integrity
9820: && cp->cmd->ic_in_progress ) {
9821: cp->nego_status = 0;
9822: msglen +=
9823: ncr_ic_nego (np, cp, cmd ,&cp->scsi_smsg2[msglen]);
9824: }
9825:
9826: if (!np->check_integrity ||
9827: (np->check_integrity &&
9828: (!cp->cmd->ic_in_progress && !tp->ic_done)) ) {
9829: ncr_negotiate(np, tp);
9830: cp->nego_status = 0;
9831: {
9832: u_char sync_offset;
9833: if ((np->device_id == PCI_DEVICE_ID_LSI_53C1010) ||
9834: (np->device_id == PCI_DEVICE_ID_LSI_53C1010_66))
9835: sync_offset = tp->sval & 0x3f;
9836: else
9837: sync_offset = tp->sval & 0x1f;
9838:
9839: if ((tp->wval & EWS) || sync_offset)
9840: msglen +=
9841: ncr_prepare_nego (np, cp, &cp->scsi_smsg2[msglen]);
9842: }
9843:
9844: }
9845: #else
9846: ncr_negotiate(np, tp);
9847: cp->nego_status = 0;
9848: if ((tp->wval & EWS) || (tp->sval & 0x1f))
9849: msglen +=
9850: ncr_prepare_nego (np, cp, &cp->scsi_smsg2[msglen]);
9851: #endif /* SCSI_NCR_INTEGRITY_CHECKING */
9852:
9853: /*
9854: ** Message table indirect structure.
9855: */
9856: cp->phys.smsg.addr = cpu_to_scr(CCB_PHYS (cp, scsi_smsg2));
9857: cp->phys.smsg.size = cpu_to_scr(msglen);
9858:
9859: /*
9860: ** sense command
9861: */
9862: cp->phys.cmd.addr = cpu_to_scr(CCB_PHYS (cp, sensecmd));
9863: cp->phys.cmd.size = cpu_to_scr(6);
9864:
9865: /*
9866: ** patch requested size into sense command
9867: */
9868: cp->sensecmd[0] = 0x03;
9869: cp->sensecmd[1] = cp->lun << 5;
9870: cp->sensecmd[4] = sizeof(cp->sense_buf);
9871:
9872: /*
9873: ** sense data
9874: */
9875: bzero(cp->sense_buf, sizeof(cp->sense_buf));
9876: cp->phys.sense.addr = cpu_to_scr(CCB_PHYS(cp,sense_buf[0]));
9877: cp->phys.sense.size = cpu_to_scr(sizeof(cp->sense_buf));
9878:
9879: /*
9880: ** requeue the command.
9881: */
9882: startp = NCB_SCRIPTH_PHYS (np, sdata_in);
9883:
9884: cp->phys.header.savep = cpu_to_scr(startp);
9885: cp->phys.header.goalp = cpu_to_scr(startp + 16);
9886: cp->phys.header.lastp = cpu_to_scr(startp);
9887: cp->phys.header.wgoalp = cpu_to_scr(startp + 16);
9888: cp->phys.header.wlastp = cpu_to_scr(startp);
9889:
9890: cp->host_status = cp->nego_status ? HS_NEGOTIATE : HS_BUSY;
9891: cp->scsi_status = S_ILLEGAL;
9892: cp->host_flags = (HF_AUTO_SENSE|HF_DATA_IN);
9893:
9894: cp->phys.header.go.start =
9895: cpu_to_scr(NCB_SCRIPT_PHYS (np, select));
9896:
9897: /*
9898: ** If lp not yet allocated, requeue the command.
9899: */
9900: if (!lp)
9901: ncr_put_start_queue(np, cp);
9902: break;
9903: }
9904:
9905: /*
9906: ** requeue awaiting scsi commands for this lun.
9907: */
9908: if (lp)
9909: ncr_start_next_ccb(np, lp, 1);
9910:
9911: return;
9912: }
9913:
9914: /*----------------------------------------------------------
9915: **
9916: ** After a device has accepted some management message
9917: ** as BUS DEVICE RESET, ABORT TASK, etc ..., or when
9918: ** a device signals a UNIT ATTENTION condition, some
9919: ** tasks are thrown away by the device. We are required
9920: ** to reflect that on our tasks list since the device
9921: ** will never complete these tasks.
9922: **
9923: ** This function completes all disconnected CCBs for a
9924: ** given target that matches the following criteria:
9925: ** - lun=-1 means any logical UNIT otherwise a given one.
9926: ** - task=-1 means any task, otherwise a given one.
9927: **----------------------------------------------------------
9928: */
9929: static int ncr_clear_tasks(ncb_p np, u_char hsts,
9930: int target, int lun, int task)
9931: {
9932: int i = 0;
9933: ccb_p cp;
9934:
9935: for (cp = np->ccbc; cp; cp = cp->link_ccb) {
9936: if (cp->host_status != HS_DISCONNECT)
9937: continue;
9938: if (cp->target != target)
9939: continue;
9940: if (lun != -1 && cp->lun != lun)
9941: continue;
9942: if (task != -1 && cp->tag != NO_TAG && cp->scsi_smsg[2] != task)
9943: continue;
9944: cp->host_status = hsts;
9945: cp->scsi_status = S_ILLEGAL;
9946: ncr_complete(np, cp);
9947: ++i;
9948: }
9949: return i;
9950: }
9951:
9952: /*==========================================================
9953: **
9954: ** ncr chip handler for TASKS recovery.
9955: **
9956: **==========================================================
9957: **
9958: ** We cannot safely abort a command, while the SCRIPTS
9959: ** processor is running, since we just would be in race
9960: ** with it.
9961: **
9962: ** As long as we have tasks to abort, we keep the SEM
9963: ** bit set in the ISTAT. When this bit is set, the
9964: ** SCRIPTS processor interrupts (SIR_SCRIPT_STOPPED)
9965: ** each time it enters the scheduler.
9966: **
9967: ** If we have to reset a target, clear tasks of a unit,
9968: ** or to perform the abort of a disconnected job, we
9969: ** restart the SCRIPTS for selecting the target. Once
9970: ** selected, the SCRIPTS interrupts (SIR_TARGET_SELECTED).
9971: ** If it loses arbitration, the SCRIPTS will interrupt again
9972: ** the next time it will enter its scheduler, and so on ...
9973: **
9974: ** On SIR_TARGET_SELECTED, we scan for the more
9975: ** appropriate thing to do:
9976: **
9977: ** - If nothing, we just sent a M_ABORT message to the
9978: ** target to get rid of the useless SCSI bus ownership.
9979: ** According to the specs, no tasks shall be affected.
9980: ** - If the target is to be reset, we send it a M_RESET
9981: ** message.
9982: ** - If a logical UNIT is to be cleared , we send the
9983: ** IDENTIFY(lun) + M_ABORT.
9984: ** - If an untagged task is to be aborted, we send the
9985: ** IDENTIFY(lun) + M_ABORT.
9986: ** - If a tagged task is to be aborted, we send the
9987: ** IDENTIFY(lun) + task attributes + M_ABORT_TAG.
9988: **
9989: ** Once our 'kiss of death' :) message has been accepted
9990: ** by the target, the SCRIPTS interrupts again
9991: ** (SIR_ABORT_SENT). On this interrupt, we complete
9992: ** all the CCBs that should have been aborted by the
9993: ** target according to our message.
9994: **
9995: **----------------------------------------------------------
9996: */
9997: static void ncr_sir_task_recovery(ncb_p np, int num)
9998: {
9999: ccb_p cp;
10000: tcb_p tp;
10001: int target=-1, lun=-1, task;
10002: int i, k;
10003: u_char *p;
10004:
10005: switch(num) {
10006: /*
10007: ** The SCRIPTS processor stopped before starting
10008: ** the next command in order to allow us to perform
10009: ** some task recovery.
10010: */
10011: case SIR_SCRIPT_STOPPED:
10012:
10013: /*
10014: ** Do we have any target to reset or unit to clear ?
10015: */
10016: for (i = 0 ; i < MAX_TARGET ; i++) {
10017: tp = &np->target[i];
10018: if (tp->to_reset || (tp->l0p && tp->l0p->to_clear)) {
10019: target = i;
10020: break;
10021: }
10022: if (!tp->lmp)
10023: continue;
10024: for (k = 1 ; k < MAX_LUN ; k++) {
10025: if (tp->lmp[k] && tp->lmp[k]->to_clear) {
10026: target = i;
10027: break;
10028: }
10029: }
10030: if (target != -1)
10031: break;
10032: }
10033:
10034: /*
10035: ** If not, look at the CCB list for any
10036: ** disconnected CCB to be aborted.
10037: */
10038: if (target == -1) {
10039: for (cp = np->ccbc; cp; cp = cp->link_ccb) {
10040: if (cp->host_status != HS_DISCONNECT)
10041: continue;
10042: if (cp->to_abort) {
10043: target = cp->target;
10044: break;
10045: }
10046: }
10047: }
10048:
10049: /*
10050: ** If some target is to be selected,
10051: ** prepare and start the selection.
10052: */
10053: if (target != -1) {
10054: tp = &np->target[target];
10055: np->abrt_sel.sel_id = target;
10056: np->abrt_sel.sel_scntl3 = tp->wval;
10057: np->abrt_sel.sel_sxfer = tp->sval;
10058: np->abrt_sel.sel_scntl4 = tp->uval;
10059: OUTL(nc_dsa, np->p_ncb);
10060: OUTL_DSP (NCB_SCRIPTH_PHYS (np, sel_for_abort));
10061: return;
10062: }
10063:
10064: /*
10065: ** Nothing is to be selected, so we donnot need
10066: ** to synchronize with the SCRIPTS anymore.
10067: ** Remove the SEM flag from the ISTAT.
10068: */
10069: np->istat_sem = 0;
10070: OUTB (nc_istat, SIGP);
10071:
10072: /*
10073: ** Now look at CCBs to abort that haven't started yet.
10074: ** Remove all those CCBs from the start queue and
10075: ** complete them with appropriate status.
10076: ** Btw, the SCRIPTS processor is still stopped, so
10077: ** we are not in race.
10078: */
10079: for (cp = np->ccbc; cp; cp = cp->link_ccb) {
10080: if (cp->host_status != HS_BUSY &&
10081: cp->host_status != HS_NEGOTIATE)
10082: continue;
10083: if (!cp->to_abort)
10084: continue;
10085: #ifdef SCSI_NCR_IARB_SUPPORT
10086: /*
10087: ** If we are using IMMEDIATE ARBITRATION, we donnot
10088: ** want to cancel the last queued CCB, since the
10089: ** SCRIPTS may have anticipated the selection.
10090: */
10091: if (cp == np->last_cp) {
10092: cp->to_abort = 0;
10093: continue;
10094: }
10095: #endif
10096: /*
10097: ** Compute index of next position in the start
10098: ** queue the SCRIPTS will schedule.
10099: */
10100: i = (INL (nc_scratcha) - np->p_squeue) / 4;
10101:
10102: /*
10103: ** Remove the job from the start queue.
10104: */
10105: k = -1;
10106: while (1) {
10107: if (i == np->squeueput)
10108: break;
10109: if (k == -1) { /* Not found yet */
10110: if (cp == ncr_ccb_from_dsa(np,
10111: scr_to_cpu(np->squeue[i])))
10112: k = i; /* Found */
10113: }
10114: else {
10115: /*
10116: ** Once found, we have to move
10117: ** back all jobs by 1 position.
10118: */
10119: np->squeue[k] = np->squeue[i];
10120: k += 2;
10121: if (k >= MAX_START*2)
10122: k = 0;
10123: }
10124:
10125: i += 2;
10126: if (i >= MAX_START*2)
10127: i = 0;
10128: }
10129: if (k != -1) {
10130: np->squeue[k] = np->squeue[i]; /* Idle task */
10131: np->squeueput = k; /* Start queue pointer */
10132: }
10133: cp->host_status = HS_ABORTED;
10134: cp->scsi_status = S_ILLEGAL;
10135: ncr_complete(np, cp);
10136: }
10137: break;
10138: /*
10139: ** The SCRIPTS processor has selected a target
10140: ** we may have some manual recovery to perform for.
10141: */
10142: case SIR_TARGET_SELECTED:
10143: target = (INB (nc_sdid) & 0xf);
10144: tp = &np->target[target];
10145:
10146: np->abrt_tbl.addr = vtobus(np->abrt_msg);
10147:
10148: /*
10149: ** If the target is to be reset, prepare a
10150: ** M_RESET message and clear the to_reset flag
10151: ** since we donnot expect this operation to fail.
10152: */
10153: if (tp->to_reset) {
10154: np->abrt_msg[0] = M_RESET;
10155: np->abrt_tbl.size = 1;
10156: tp->to_reset = 0;
10157: break;
10158: }
10159:
10160: /*
10161: ** Otherwise, look for some logical unit to be cleared.
10162: */
10163: if (tp->l0p && tp->l0p->to_clear)
10164: lun = 0;
10165: else if (tp->lmp) {
10166: for (k = 1 ; k < MAX_LUN ; k++) {
10167: if (tp->lmp[k] && tp->lmp[k]->to_clear) {
10168: lun = k;
10169: break;
10170: }
10171: }
10172: }
10173:
10174: /*
10175: ** If a logical unit is to be cleared, prepare
10176: ** an IDENTIFY(lun) + ABORT MESSAGE.
10177: */
10178: if (lun != -1) {
10179: lcb_p lp = ncr_lp(np, tp, lun);
10180: lp->to_clear = 0; /* We donnot expect to fail here */
10181: np->abrt_msg[0] = M_IDENTIFY | lun;
10182: np->abrt_msg[1] = M_ABORT;
10183: np->abrt_tbl.size = 2;
10184: break;
10185: }
10186:
10187: /*
10188: ** Otherwise, look for some disconnected job to
10189: ** abort for this target.
10190: */
10191: for (cp = np->ccbc; cp; cp = cp->link_ccb) {
10192: if (cp->host_status != HS_DISCONNECT)
10193: continue;
10194: if (cp->target != target)
10195: continue;
10196: if (cp->to_abort)
10197: break;
10198: }
10199:
10200: /*
10201: ** If we have none, probably since the device has
10202: ** completed the command before we won abitration,
10203: ** send a M_ABORT message without IDENTIFY.
10204: ** According to the specs, the device must just
10205: ** disconnect the BUS and not abort any task.
10206: */
10207: if (!cp) {
10208: np->abrt_msg[0] = M_ABORT;
10209: np->abrt_tbl.size = 1;
10210: break;
10211: }
10212:
10213: /*
10214: ** We have some task to abort.
10215: ** Set the IDENTIFY(lun)
10216: */
10217: np->abrt_msg[0] = M_IDENTIFY | cp->lun;
10218:
10219: /*
10220: ** If we want to abort an untagged command, we
10221: ** will send a IDENTIFY + M_ABORT.
10222: ** Otherwise (tagged command), we will send
10223: ** a IDENTITFY + task attributes + ABORT TAG.
10224: */
10225: if (cp->tag == NO_TAG) {
10226: np->abrt_msg[1] = M_ABORT;
10227: np->abrt_tbl.size = 2;
10228: }
10229: else {
10230: np->abrt_msg[1] = cp->scsi_smsg[1];
10231: np->abrt_msg[2] = cp->scsi_smsg[2];
10232: np->abrt_msg[3] = M_ABORT_TAG;
10233: np->abrt_tbl.size = 4;
10234: }
10235: cp->to_abort = 0; /* We donnot expect to fail here */
10236: break;
10237:
10238: /*
10239: ** The target has accepted our message and switched
10240: ** to BUS FREE phase as we expected.
10241: */
10242: case SIR_ABORT_SENT:
10243: target = (INB (nc_sdid) & 0xf);
10244: tp = &np->target[target];
10245:
10246: /*
10247: ** If we didn't abort anything, leave here.
10248: */
10249: if (np->abrt_msg[0] == M_ABORT)
10250: break;
10251:
10252: /*
10253: ** If we sent a M_RESET, then a hardware reset has
10254: ** been performed by the target.
10255: ** - Reset everything to async 8 bit
10256: ** - Tell ourself to negotiate next time :-)
10257: ** - Prepare to clear all disconnected CCBs for
10258: ** this target from our task list (lun=task=-1)
10259: */
10260: lun = -1;
10261: task = -1;
10262: if (np->abrt_msg[0] == M_RESET) {
10263: tp->sval = 0;
10264: tp->wval = np->rv_scntl3;
10265: tp->uval = np->rv_scntl4;
10266: ncr_set_sync_wide_status(np, target);
10267: ncr_negotiate(np, tp);
10268: }
10269:
10270: /*
10271: ** Otherwise, check for the LUN and TASK(s)
10272: ** concerned by the cancelation.
10273: ** If it is not ABORT_TAG then it is CLEAR_QUEUE
10274: ** or an ABORT message :-)
10275: */
10276: else {
10277: lun = np->abrt_msg[0] & 0x3f;
10278: if (np->abrt_msg[1] == M_ABORT_TAG)
10279: task = np->abrt_msg[2];
10280: }
10281:
10282: /*
10283: ** Complete all the CCBs the device should have
10284: ** aborted due to our 'kiss of death' message.
10285: */
10286: (void) ncr_clear_tasks(np, HS_ABORTED, target, lun, task);
10287: break;
10288:
10289: /*
10290: ** We have performed a auto-sense that succeeded.
10291: ** If the device reports a UNIT ATTENTION condition
10292: ** due to a RESET condition, we must complete all
10293: ** disconnect CCBs for this unit since the device
10294: ** shall have thrown them away.
10295: ** Since I haven't time to guess what the specs are
10296: ** expecting for other UNIT ATTENTION conditions, I
10297: ** decided to only care about RESET conditions. :)
10298: */
10299: case SIR_AUTO_SENSE_DONE:
10300: cp = ncr_ccb_from_dsa(np, INL (nc_dsa));
10301: if (!cp)
10302: break;
10303: memcpy(cp->cmd->sense_buffer, cp->sense_buf,
10304: sizeof(cp->cmd->sense_buffer));
10305: p = &cp->cmd->sense_buffer[0];
10306:
10307: if (p[0] != 0x70 || p[2] != 0x6 || p[12] != 0x29)
10308: break;
10309: #if 0
10310: (void) ncr_clear_tasks(np, HS_RESET, cp->target, cp->lun, -1);
10311: #endif
10312: break;
10313: }
10314:
10315: /*
10316: ** Print to the log the message we intend to send.
10317: */
10318: if (num == SIR_TARGET_SELECTED) {
10319: PRINT_TARGET(np, target);
10320: ncr_printl_hex("control msgout:", np->abrt_msg,
10321: np->abrt_tbl.size);
10322: np->abrt_tbl.size = cpu_to_scr(np->abrt_tbl.size);
10323: }
10324:
10325: /*
10326: ** Let the SCRIPTS processor continue.
10327: */
10328: OUTONB_STD ();
10329: }
10330:
10331:
10332: /*==========================================================
10333: **
10334: ** G�rard's alchemy:) that deals with with the data
10335: ** pointer for both MDP and the residual calculation.
10336: **
10337: **==========================================================
10338: **
10339: ** I didn't want to bloat the code by more than 200
10340: ** lignes for the handling of both MDP and the residual.
10341: ** This has been achieved by using a data pointer
10342: ** representation consisting in an index in the data
10343: ** array (dp_sg) and a negative offset (dp_ofs) that
10344: ** have the following meaning:
10345: **
10346: ** - dp_sg = MAX_SCATTER
10347: ** we are at the end of the data script.
10348: ** - dp_sg < MAX_SCATTER
10349: ** dp_sg points to the next entry of the scatter array
10350: ** we want to transfer.
10351: ** - dp_ofs < 0
10352: ** dp_ofs represents the residual of bytes of the
10353: ** previous entry scatter entry we will send first.
10354: ** - dp_ofs = 0
10355: ** no residual to send first.
10356: **
10357: ** The function ncr_evaluate_dp() accepts an arbitray
10358: ** offset (basically from the MDP message) and returns
10359: ** the corresponding values of dp_sg and dp_ofs.
10360: **
10361: **----------------------------------------------------------
10362: */
10363:
10364: static int ncr_evaluate_dp(ncb_p np, ccb_p cp, u_int32 scr, int *ofs)
10365: {
10366: u_int32 dp_scr;
10367: int dp_ofs, dp_sg, dp_sgmin;
10368: int tmp;
10369: struct pm_ctx *pm;
10370:
10371: /*
10372: ** Compute the resulted data pointer in term of a script
10373: ** address within some DATA script and a signed byte offset.
10374: */
10375: dp_scr = scr;
10376: dp_ofs = *ofs;
10377: if (dp_scr == NCB_SCRIPT_PHYS (np, pm0_data))
10378: pm = &cp->phys.pm0;
10379: else if (dp_scr == NCB_SCRIPT_PHYS (np, pm1_data))
10380: pm = &cp->phys.pm1;
10381: else
10382: pm = 0;
10383:
10384: if (pm) {
10385: dp_scr = scr_to_cpu(pm->ret);
10386: dp_ofs -= scr_to_cpu(pm->sg.size);
10387: }
10388:
10389: /*
10390: ** Deduce the index of the sg entry.
10391: ** Keep track of the index of the first valid entry.
10392: ** If result is dp_sg = MAX_SCATTER, then we are at the
10393: ** end of the data and vice-versa.
10394: */
10395: tmp = scr_to_cpu(cp->phys.header.goalp);
10396: dp_sg = MAX_SCATTER;
10397: if (dp_scr != tmp)
10398: dp_sg -= (tmp - 8 - (int)dp_scr) / (SCR_SG_SIZE*4);
10399: dp_sgmin = MAX_SCATTER - cp->segments;
10400:
10401: /*
10402: ** Move to the sg entry the data pointer belongs to.
10403: **
10404: ** If we are inside the data area, we expect result to be:
10405: **
10406: ** Either,
10407: ** dp_ofs = 0 and dp_sg is the index of the sg entry
10408: ** the data pointer belongs to (or the end of the data)
10409: ** Or,
10410: ** dp_ofs < 0 and dp_sg is the index of the sg entry
10411: ** the data pointer belongs to + 1.
10412: */
10413: if (dp_ofs < 0) {
10414: int n;
10415: while (dp_sg > dp_sgmin) {
10416: --dp_sg;
10417: tmp = scr_to_cpu(cp->phys.data[dp_sg].size);
10418: n = dp_ofs + (tmp & 0xffffff);
10419: if (n > 0) {
10420: ++dp_sg;
10421: break;
10422: }
10423: dp_ofs = n;
10424: }
10425: }
10426: else if (dp_ofs > 0) {
10427: while (dp_sg < MAX_SCATTER) {
10428: tmp = scr_to_cpu(cp->phys.data[dp_sg].size);
10429: dp_ofs -= (tmp & 0xffffff);
10430: ++dp_sg;
10431: if (dp_ofs <= 0)
10432: break;
10433: }
10434: }
10435:
10436: /*
10437: ** Make sure the data pointer is inside the data area.
10438: ** If not, return some error.
10439: */
10440: if (dp_sg < dp_sgmin || (dp_sg == dp_sgmin && dp_ofs < 0))
10441: goto out_err;
10442: else if (dp_sg > MAX_SCATTER || (dp_sg == MAX_SCATTER && dp_ofs > 0))
10443: goto out_err;
10444:
10445: /*
10446: ** Save the extreme pointer if needed.
10447: */
10448: if (dp_sg > cp->ext_sg ||
10449: (dp_sg == cp->ext_sg && dp_ofs > cp->ext_ofs)) {
10450: cp->ext_sg = dp_sg;
10451: cp->ext_ofs = dp_ofs;
10452: }
10453:
10454: /*
10455: ** Return data.
10456: */
10457: *ofs = dp_ofs;
10458: return dp_sg;
10459:
10460: out_err:
10461: return -1;
10462: }
10463:
10464: /*==========================================================
10465: **
10466: ** ncr chip handler for MODIFY DATA POINTER MESSAGE
10467: **
10468: **==========================================================
10469: **
10470: ** We also call this function on IGNORE WIDE RESIDUE
10471: ** messages that do not match a SWIDE full condition.
10472: ** Btw, we assume in that situation that such a message
10473: ** is equivalent to a MODIFY DATA POINTER (offset=-1).
10474: **
10475: **----------------------------------------------------------
10476: */
10477:
10478: static void ncr_modify_dp(ncb_p np, tcb_p tp, ccb_p cp, int ofs)
10479: {
10480: int dp_ofs = ofs;
10481: u_int32 dp_scr = INL (nc_temp);
10482: u_int32 dp_ret;
10483: u_int32 tmp;
10484: u_char hflags;
10485: int dp_sg;
10486: struct pm_ctx *pm;
10487:
10488: /*
10489: ** Not supported for auto_sense;
10490: */
10491: if (cp->host_flags & HF_AUTO_SENSE)
10492: goto out_reject;
10493:
10494: /*
10495: ** Apply our alchemy:) (see comments in ncr_evaluate_dp()),
10496: ** to the resulted data pointer.
10497: */
10498: dp_sg = ncr_evaluate_dp(np, cp, dp_scr, &dp_ofs);
10499: if (dp_sg < 0)
10500: goto out_reject;
10501:
10502: /*
10503: ** And our alchemy:) allows to easily calculate the data
10504: ** script address we want to return for the next data phase.
10505: */
10506: dp_ret = cpu_to_scr(cp->phys.header.goalp);
10507: dp_ret = dp_ret - 8 - (MAX_SCATTER - dp_sg) * (SCR_SG_SIZE*4);
10508:
10509: /*
10510: ** If offset / scatter entry is zero we donnot need
10511: ** a context for the new current data pointer.
10512: */
10513: if (dp_ofs == 0) {
10514: dp_scr = dp_ret;
10515: goto out_ok;
10516: }
10517:
10518: /*
10519: ** Get a context for the new current data pointer.
10520: */
10521: hflags = INB (HF_PRT);
10522:
10523: if (hflags & HF_DP_SAVED)
10524: hflags ^= HF_ACT_PM;
10525:
10526: if (!(hflags & HF_ACT_PM)) {
10527: pm = &cp->phys.pm0;
10528: dp_scr = NCB_SCRIPT_PHYS (np, pm0_data);
10529: }
10530: else {
10531: pm = &cp->phys.pm1;
10532: dp_scr = NCB_SCRIPT_PHYS (np, pm1_data);
10533: }
10534:
10535: hflags &= ~(HF_DP_SAVED);
10536:
10537: OUTB (HF_PRT, hflags);
10538:
10539: /*
10540: ** Set up the new current data pointer.
10541: ** ofs < 0 there, and for the next data phase, we
10542: ** want to transfer part of the data of the sg entry
10543: ** corresponding to index dp_sg-1 prior to returning
10544: ** to the main data script.
10545: */
10546: pm->ret = cpu_to_scr(dp_ret);
10547: tmp = scr_to_cpu(cp->phys.data[dp_sg-1].addr);
10548: tmp += scr_to_cpu(cp->phys.data[dp_sg-1].size) + dp_ofs;
10549: pm->sg.addr = cpu_to_scr(tmp);
10550: pm->sg.size = cpu_to_scr(-dp_ofs);
10551:
10552: out_ok:
10553: OUTL (nc_temp, dp_scr);
10554: OUTL_DSP (NCB_SCRIPT_PHYS (np, clrack));
10555: return;
10556:
10557: out_reject:
10558: OUTL_DSP (NCB_SCRIPTH_PHYS (np, msg_bad));
10559: }
10560:
10561:
10562: /*==========================================================
10563: **
10564: ** ncr chip calculation of the data residual.
10565: **
10566: **==========================================================
10567: **
10568: ** As I used to say, the requirement of data residual
10569: ** in SCSI is broken, useless and cannot be achieved
10570: ** without huge complexity.
10571: ** But most OSes and even the official CAM require it.
10572: ** When stupidity happens to be so widely spread inside
10573: ** a community, it gets hard to convince.
10574: **
10575: ** Anyway, I don't care, since I am not going to use
10576: ** any software that considers this data residual as
10577: ** a relevant information. :)
10578: **
10579: **----------------------------------------------------------
10580: */
10581:
10582: static int ncr_compute_residual(ncb_p np, ccb_p cp)
10583: {
10584: int dp_sg, dp_sgmin, tmp;
10585: int resid=0;
10586: int dp_ofs = 0;
10587:
10588: /*
10589: * Check for some data lost or just thrown away.
10590: * We are not required to be quite accurate in this
10591: * situation. Btw, if we are odd for output and the
10592: * device claims some more data, it may well happen
10593: * than our residual be zero. :-)
10594: */
10595: if (cp->xerr_status & (XE_EXTRA_DATA|XE_SODL_UNRUN|XE_SWIDE_OVRUN)) {
10596: if (cp->xerr_status & XE_EXTRA_DATA)
10597: resid -= cp->extra_bytes;
10598: if (cp->xerr_status & XE_SODL_UNRUN)
10599: ++resid;
10600: if (cp->xerr_status & XE_SWIDE_OVRUN)
10601: --resid;
10602: }
10603:
10604:
10605: /*
10606: ** If SCRIPTS reaches its goal point, then
10607: ** there is no additionnal residual.
10608: */
10609: if (cp->phys.header.lastp == cp->phys.header.goalp)
10610: return resid;
10611:
10612: /*
10613: ** If the last data pointer is data_io (direction
10614: ** unknown), then no data transfer should have
10615: ** taken place.
10616: */
10617: if (cp->phys.header.lastp == NCB_SCRIPTH_PHYS (np, data_io))
10618: return cp->data_len;
10619:
10620: /*
10621: ** If no data transfer occurs, or if the data
10622: ** pointer is weird, return full residual.
10623: */
10624: if (cp->startp == cp->phys.header.lastp ||
10625: ncr_evaluate_dp(np, cp, scr_to_cpu(cp->phys.header.lastp),
10626: &dp_ofs) < 0) {
10627: return cp->data_len;
10628: }
10629:
10630: /*
10631: ** We are now full comfortable in the computation
10632: ** of the data residual (2's complement).
10633: */
10634: dp_sgmin = MAX_SCATTER - cp->segments;
10635: resid = -cp->ext_ofs;
10636: for (dp_sg = cp->ext_sg; dp_sg < MAX_SCATTER; ++dp_sg) {
10637: tmp = scr_to_cpu(cp->phys.data[dp_sg].size);
10638: resid += (tmp & 0xffffff);
10639: }
10640:
10641: /*
10642: ** Hopefully, the result is not too wrong.
10643: */
10644: return resid;
10645: }
10646:
10647: /*==========================================================
10648: **
10649: ** Print out the containt of a SCSI message.
10650: **
10651: **==========================================================
10652: */
10653:
10654: static int ncr_show_msg (u_char * msg)
10655: {
10656: u_char i;
10657: printk ("%x",*msg);
10658: if (*msg==M_EXTENDED) {
10659: for (i=1;i<8;i++) {
10660: if (i-1>msg[1]) break;
10661: printk ("-%x",msg[i]);
10662: };
10663: return (i+1);
10664: } else if ((*msg & 0xf0) == 0x20) {
10665: printk ("-%x",msg[1]);
10666: return (2);
10667: };
10668: return (1);
10669: }
10670:
10671: static void ncr_print_msg (ccb_p cp, char *label, u_char *msg)
10672: {
10673: if (cp)
10674: PRINT_ADDR(cp->cmd);
10675: if (label)
10676: printk ("%s: ", label);
10677:
10678: (void) ncr_show_msg (msg);
10679: printk (".\n");
10680: }
10681:
10682: /*===================================================================
10683: **
10684: ** Negotiation for WIDE and SYNCHRONOUS DATA TRANSFER.
10685: **
10686: **===================================================================
10687: **
10688: ** Was Sie schon immer ueber transfermode negotiation wissen wollten ...
10689: **
10690: ** We try to negotiate sync and wide transfer only after
10691: ** a successfull inquire command. We look at byte 7 of the
10692: ** inquire data to determine the capabilities of the target.
10693: **
10694: ** When we try to negotiate, we append the negotiation message
10695: ** to the identify and (maybe) simple tag message.
10696: ** The host status field is set to HS_NEGOTIATE to mark this
10697: ** situation.
10698: **
10699: ** If the target doesn't answer this message immediately
10700: ** (as required by the standard), the SIR_NEGO_FAILED interrupt
10701: ** will be raised eventually.
10702: ** The handler removes the HS_NEGOTIATE status, and sets the
10703: ** negotiated value to the default (async / nowide).
10704: **
10705: ** If we receive a matching answer immediately, we check it
10706: ** for validity, and set the values.
10707: **
10708: ** If we receive a Reject message immediately, we assume the
10709: ** negotiation has failed, and fall back to standard values.
10710: **
10711: ** If we receive a negotiation message while not in HS_NEGOTIATE
10712: ** state, it's a target initiated negotiation. We prepare a
10713: ** (hopefully) valid answer, set our parameters, and send back
10714: ** this answer to the target.
10715: **
10716: ** If the target doesn't fetch the answer (no message out phase),
10717: ** we assume the negotiation has failed, and fall back to default
10718: ** settings (SIR_NEGO_PROTO interrupt).
10719: **
10720: ** When we set the values, we adjust them in all ccbs belonging
10721: ** to this target, in the controller's register, and in the "phys"
10722: ** field of the controller's struct ncb.
10723: **
10724: **---------------------------------------------------------------------
10725: */
10726:
10727: /*==========================================================
10728: **
10729: ** ncr chip handler for SYNCHRONOUS DATA TRANSFER
10730: ** REQUEST (SDTR) message.
10731: **
10732: **==========================================================
10733: **
10734: ** Read comments above.
10735: **
10736: **----------------------------------------------------------
10737: */
10738: static void ncr_sync_nego(ncb_p np, tcb_p tp, ccb_p cp)
10739: {
10740: u_char scntl3, scntl4;
10741: u_char chg, ofs, per, fak;
10742:
10743: /*
10744: ** Synchronous request message received.
10745: */
10746:
10747: if (DEBUG_FLAGS & DEBUG_NEGO) {
10748: ncr_print_msg(cp, "sync msg in", np->msgin);
10749: };
10750:
10751: /*
10752: ** get requested values.
10753: */
10754:
10755: chg = 0;
10756: per = np->msgin[3];
10757: ofs = np->msgin[4];
10758: if (ofs==0) per=255;
10759:
10760: /*
10761: ** if target sends SDTR message,
10762: ** it CAN transfer synch.
10763: */
10764:
10765: if (ofs)
10766: tp->inq_byte7 |= INQ7_SYNC;
10767:
10768: /*
10769: ** check values against driver limits.
10770: */
10771:
10772: if (per < np->minsync)
10773: {chg = 1; per = np->minsync;}
10774: if (per < tp->minsync)
10775: {chg = 1; per = tp->minsync;}
10776: if (ofs > tp->maxoffs)
10777: {chg = 1; ofs = tp->maxoffs;}
10778:
10779: /*
10780: ** Check against controller limits.
10781: */
10782: fak = 7;
10783: scntl3 = 0;
10784: scntl4 = 0;
10785: if (ofs != 0) {
10786: ncr_getsync(np, per, &fak, &scntl3);
10787: if (fak > 7) {
10788: chg = 1;
10789: ofs = 0;
10790: }
10791: }
10792: if (ofs == 0) {
10793: fak = 7;
10794: per = 0;
10795: scntl3 = 0;
10796: scntl4 = 0;
10797: tp->minsync = 0;
10798: }
10799:
10800: if (DEBUG_FLAGS & DEBUG_NEGO) {
10801: PRINT_ADDR(cp->cmd);
10802: printk ("sync: per=%d scntl3=0x%x scntl4=0x%x ofs=%d fak=%d chg=%d.\n",
10803: per, scntl3, scntl4, ofs, fak, chg);
10804: }
10805:
10806: if (INB (HS_PRT) == HS_NEGOTIATE) {
10807: OUTB (HS_PRT, HS_BUSY);
10808: switch (cp->nego_status) {
10809: case NS_SYNC:
10810: /*
10811: ** This was an answer message
10812: */
10813: if (chg) {
10814: /*
10815: ** Answer wasn't acceptable.
10816: */
10817: ncr_setsync (np, cp, 0, 0xe0, 0);
10818: OUTL_DSP (NCB_SCRIPTH_PHYS (np, msg_bad));
10819: } else {
10820: /*
10821: ** Answer is ok.
10822: */
10823: if ((np->device_id != PCI_DEVICE_ID_LSI_53C1010) &&
10824: (np->device_id != PCI_DEVICE_ID_LSI_53C1010_66))
10825: ncr_setsync (np, cp, scntl3, (fak<<5)|ofs,0);
10826: else
10827: ncr_setsync (np, cp, scntl3, ofs, scntl4);
10828:
10829: OUTL_DSP (NCB_SCRIPT_PHYS (np, clrack));
10830: };
10831: return;
10832:
10833: case NS_WIDE:
10834: ncr_setwide (np, cp, 0, 0);
10835: break;
10836: };
10837: };
10838:
10839: /*
10840: ** It was a request. Set value and
10841: ** prepare an answer message
10842: */
10843:
10844: if ((np->device_id != PCI_DEVICE_ID_LSI_53C1010) &&
10845: (np->device_id != PCI_DEVICE_ID_LSI_53C1010_66))
10846: ncr_setsync (np, cp, scntl3, (fak<<5)|ofs,0);
10847: else
10848: ncr_setsync (np, cp, scntl3, ofs, scntl4);
10849:
10850: np->msgout[0] = M_EXTENDED;
10851: np->msgout[1] = 3;
10852: np->msgout[2] = M_X_SYNC_REQ;
10853: np->msgout[3] = per;
10854: np->msgout[4] = ofs;
10855:
10856: cp->nego_status = NS_SYNC;
10857:
10858: if (DEBUG_FLAGS & DEBUG_NEGO) {
10859: ncr_print_msg(cp, "sync msgout", np->msgout);
10860: }
10861:
10862: np->msgin [0] = M_NOOP;
10863:
10864: if (!ofs)
10865: OUTL_DSP (NCB_SCRIPTH_PHYS (np, msg_bad));
10866: else
10867: OUTL_DSP (NCB_SCRIPTH_PHYS (np, sdtr_resp));
10868: }
10869:
10870: /*==========================================================
10871: **
10872: ** ncr chip handler for WIDE DATA TRANSFER REQUEST
10873: ** (WDTR) message.
10874: **
10875: **==========================================================
10876: **
10877: ** Read comments above.
10878: **
10879: **----------------------------------------------------------
10880: */
10881: static void ncr_wide_nego(ncb_p np, tcb_p tp, ccb_p cp)
10882: {
10883: u_char chg, wide;
10884:
10885: /*
10886: ** Wide request message received.
10887: */
10888: if (DEBUG_FLAGS & DEBUG_NEGO) {
10889: ncr_print_msg(cp, "wide msgin", np->msgin);
10890: };
10891:
10892: /*
10893: ** get requested values.
10894: */
10895:
10896: chg = 0;
10897: wide = np->msgin[3];
10898:
10899: /*
10900: ** if target sends WDTR message,
10901: ** it CAN transfer wide.
10902: */
10903:
10904: if (wide)
10905: tp->inq_byte7 |= INQ7_WIDE16;
10906:
10907: /*
10908: ** check values against driver limits.
10909: */
10910:
10911: if (wide > tp->usrwide)
10912: {chg = 1; wide = tp->usrwide;}
10913:
10914: if (DEBUG_FLAGS & DEBUG_NEGO) {
10915: PRINT_ADDR(cp->cmd);
10916: printk ("wide: wide=%d chg=%d.\n", wide, chg);
10917: }
10918:
10919: if (INB (HS_PRT) == HS_NEGOTIATE) {
10920: OUTB (HS_PRT, HS_BUSY);
10921: switch (cp->nego_status) {
10922: case NS_WIDE:
10923: /*
10924: ** This was an answer message
10925: */
10926: if (chg) {
10927: /*
10928: ** Answer wasn't acceptable.
10929: */
10930: ncr_setwide (np, cp, 0, 1);
10931: OUTL_DSP (NCB_SCRIPTH_PHYS (np, msg_bad));
10932: } else {
10933: /*
10934: ** Answer is ok.
10935: */
10936: ncr_setwide (np, cp, wide, 1);
10937: OUTL_DSP (NCB_SCRIPT_PHYS (np, clrack));
10938: };
10939: return;
10940:
10941: case NS_SYNC:
10942: ncr_setsync (np, cp, 0, 0xe0, 0);
10943: break;
10944: };
10945: };
10946:
10947: /*
10948: ** It was a request, set value and
10949: ** prepare an answer message
10950: */
10951:
10952: ncr_setwide (np, cp, wide, 1);
10953:
10954: np->msgout[0] = M_EXTENDED;
10955: np->msgout[1] = 2;
10956: np->msgout[2] = M_X_WIDE_REQ;
10957: np->msgout[3] = wide;
10958:
10959: np->msgin [0] = M_NOOP;
10960:
10961: cp->nego_status = NS_WIDE;
10962:
10963: if (DEBUG_FLAGS & DEBUG_NEGO) {
10964: ncr_print_msg(cp, "wide msgout", np->msgout);
10965: }
10966:
10967: OUTL_DSP (NCB_SCRIPTH_PHYS (np, wdtr_resp));
10968: }
10969: /*==========================================================
10970: **
10971: ** ncr chip handler for PARALLEL PROTOCOL REQUEST
10972: ** (PPR) message.
10973: **
10974: **==========================================================
10975: **
10976: ** Read comments above.
10977: **
10978: **----------------------------------------------------------
10979: */
10980: static void ncr_ppr_nego(ncb_p np, tcb_p tp, ccb_p cp)
10981: {
10982: u_char scntl3, scntl4;
10983: u_char chg, ofs, per, fak, wth, dt;
10984:
10985: /*
10986: ** PPR message received.
10987: */
10988:
10989: if (DEBUG_FLAGS & DEBUG_NEGO) {
10990: ncr_print_msg(cp, "ppr msg in", np->msgin);
10991: };
10992:
10993: /*
10994: ** get requested values.
10995: */
10996:
10997: chg = 0;
10998: per = np->msgin[3];
10999: ofs = np->msgin[5];
11000: wth = np->msgin[6];
11001: dt = np->msgin[7];
11002: if (ofs==0) per=255;
11003:
11004: /*
11005: ** if target sends sync (wide),
11006: ** it CAN transfer synch (wide).
11007: */
11008:
11009: if (ofs)
11010: tp->inq_byte7 |= INQ7_SYNC;
11011:
11012: if (wth)
11013: tp->inq_byte7 |= INQ7_WIDE16;
11014:
11015: /*
11016: ** check values against driver limits.
11017: */
11018:
11019: if (wth > tp->usrwide)
11020: {chg = 1; wth = tp->usrwide;}
11021: if (per < np->minsync)
11022: {chg = 1; per = np->minsync;}
11023: if (per < tp->minsync)
11024: {chg = 1; per = tp->minsync;}
11025: if (ofs > tp->maxoffs)
11026: {chg = 1; ofs = tp->maxoffs;}
11027:
11028: /*
11029: ** Check against controller limits.
11030: */
11031: fak = 7;
11032: scntl3 = 0;
11033: scntl4 = 0;
11034: if (ofs != 0) {
11035: scntl4 = dt ? 0x80 : 0;
11036: ncr_getsync(np, per, &fak, &scntl3);
11037: if (fak > 7) {
11038: chg = 1;
11039: ofs = 0;
11040: }
11041: }
11042: if (ofs == 0) {
11043: fak = 7;
11044: per = 0;
11045: scntl3 = 0;
11046: scntl4 = 0;
11047: tp->minsync = 0;
11048: }
11049:
11050: /*
11051: ** If target responds with Ultra 3 speed
11052: ** but narrow or not DT, reject.
11053: ** If target responds with DT request
11054: ** but not Ultra3 speeds, reject message,
11055: ** reset min sync for target to 0x0A and
11056: ** set flags to re-negotiate.
11057: */
11058:
11059: if ((per == 0x09) && ofs && (!wth || !dt))
11060: chg = 1;
11061: else if (( (per > 0x09) && dt) )
11062: chg = 2;
11063:
11064:
11065: if (DEBUG_FLAGS & DEBUG_NEGO) {
11066: PRINT_ADDR(cp->cmd);
11067: printk ("ppr: wth=%d per=%d scntl3=0x%x scntl4=0x%x ofs=%d fak=%d chg=%d.\n",
11068: wth, per, scntl3, scntl4, ofs, fak, chg);
11069: }
11070:
11071: if (INB (HS_PRT) == HS_NEGOTIATE) {
11072: OUTB (HS_PRT, HS_BUSY);
11073: switch (cp->nego_status) {
11074: case NS_PPR:
11075: /*
11076: ** This was an answer message
11077: */
11078: if (chg) {
11079: /*
11080: ** Answer wasn't acceptable.
11081: */
11082: if (chg == 2) {
11083: /* Send message reject and reset flags for
11084: ** host to re-negotiate with min period 0x0A.
11085: */
11086: tp->minsync = 0x0A;
11087: tp->period = 0;
11088: tp->widedone = 0;
11089: }
11090: ncr_setsyncwide (np, cp, 0, 0xe0, 0, 0);
11091: OUTL_DSP (NCB_SCRIPTH_PHYS (np, msg_bad));
11092: } else {
11093: /*
11094: ** Answer is ok.
11095: */
11096:
11097: if ((np->device_id != PCI_DEVICE_ID_LSI_53C1010) &&
11098: (np->device_id != PCI_DEVICE_ID_LSI_53C1010_66))
11099: ncr_setsyncwide (np, cp, scntl3, (fak<<5)|ofs,0, wth);
11100: else
11101: ncr_setsyncwide (np, cp, scntl3, ofs, scntl4, wth);
11102:
11103: OUTL_DSP (NCB_SCRIPT_PHYS (np, clrack));
11104:
11105: };
11106: return;
11107:
11108: case NS_SYNC:
11109: ncr_setsync (np, cp, 0, 0xe0, 0);
11110: break;
11111:
11112: case NS_WIDE:
11113: ncr_setwide (np, cp, 0, 0);
11114: break;
11115: };
11116: };
11117:
11118: /*
11119: ** It was a request. Set value and
11120: ** prepare an answer message
11121: **
11122: ** If narrow or not DT and requesting Ultra3
11123: ** slow the bus down and force ST. If not
11124: ** requesting Ultra3, force ST.
11125: ** Max offset is 31=0x1f if ST mode.
11126: */
11127:
11128: if ((per == 0x09) && ofs && (!wth || !dt)) {
11129: per = 0x0A;
11130: dt = 0;
11131: ofs &= 0x1f;
11132: }
11133: else if ( (per > 0x09) && dt) {
11134: dt = 0;
11135: ofs &= 0x1f;
11136: }
11137:
11138: if ((np->device_id != PCI_DEVICE_ID_LSI_53C1010) &&
11139: (np->device_id != PCI_DEVICE_ID_LSI_53C1010_66))
11140: ncr_setsyncwide (np, cp, scntl3, (fak<<5)|ofs,0, wth);
11141: else
11142: ncr_setsyncwide (np, cp, scntl3, ofs, scntl4, wth);
11143:
11144: np->msgout[0] = M_EXTENDED;
11145: np->msgout[1] = 6;
11146: np->msgout[2] = M_X_PPR_REQ;
11147: np->msgout[3] = per;
11148: np->msgout[4] = 0;
11149: np->msgout[5] = ofs;
11150: np->msgout[6] = wth;
11151: np->msgout[7] = dt;
11152:
11153: cp->nego_status = NS_PPR;
11154:
11155: if (DEBUG_FLAGS & DEBUG_NEGO) {
11156: ncr_print_msg(cp, "ppr msgout", np->msgout);
11157: }
11158:
11159: np->msgin [0] = M_NOOP;
11160:
11161: if (!ofs)
11162: OUTL_DSP (NCB_SCRIPTH_PHYS (np, msg_bad));
11163: else
11164: OUTL_DSP (NCB_SCRIPTH_PHYS (np, ppr_resp));
11165: }
11166:
11167:
11168:
11169: /*
11170: ** Reset SYNC or WIDE to default settings.
11171: ** Called when a negotiation does not succeed either
11172: ** on rejection or on protocol error.
11173: */
11174: static void ncr_nego_default(ncb_p np, tcb_p tp, ccb_p cp)
11175: {
11176: /*
11177: ** any error in negotiation:
11178: ** fall back to default mode.
11179: */
11180: switch (cp->nego_status) {
11181:
11182: case NS_SYNC:
11183: ncr_setsync (np, cp, 0, 0xe0, 0);
11184: break;
11185:
11186: case NS_WIDE:
11187: ncr_setwide (np, cp, 0, 0);
11188: break;
11189:
11190: case NS_PPR:
11191: /*
11192: * ppr_negotiation is set to 1 on the first ppr nego command.
11193: * If ppr is successful, it is reset to 2.
11194: * If unsuccessful it is reset to 0.
11195: */
11196: if (DEBUG_FLAGS & DEBUG_NEGO) {
11197: tcb_p tp=&np->target[cp->target];
11198: u_char factor, offset, width;
11199:
11200: ncr_get_xfer_info ( np, tp, &factor, &offset, &width);
11201:
11202: printk("Current factor %d offset %d width %d\n",
11203: factor, offset, width);
11204: }
11205: if (tp->ppr_negotiation == 2)
11206: ncr_setsyncwide (np, cp, 0, 0xe0, 0, 0);
11207: else if (tp->ppr_negotiation == 1) {
11208:
11209: /* First ppr command has received a M REJECT.
11210: * Do not change the existing wide/sync parameter
11211: * values (asyn/narrow if this as the first nego;
11212: * may be different if target initiates nego.).
11213: */
11214: tp->ppr_negotiation = 0;
11215: }
11216: else
11217: {
11218: tp->ppr_negotiation = 0;
11219: ncr_setwide (np, cp, 0, 0);
11220: }
11221: break;
11222: };
11223: np->msgin [0] = M_NOOP;
11224: np->msgout[0] = M_NOOP;
11225: cp->nego_status = 0;
11226: }
11227:
11228: /*==========================================================
11229: **
11230: ** ncr chip handler for MESSAGE REJECT received for
11231: ** a WIDE or SYNCHRONOUS negotiation.
11232: **
11233: ** clear the PPR negotiation flag, all future nego.
11234: ** will be SDTR and WDTR
11235: **
11236: **==========================================================
11237: **
11238: ** Read comments above.
11239: **
11240: **----------------------------------------------------------
11241: */
11242: static void ncr_nego_rejected(ncb_p np, tcb_p tp, ccb_p cp)
11243: {
11244: ncr_nego_default(np, tp, cp);
11245: OUTB (HS_PRT, HS_BUSY);
11246: }
11247:
11248:
11249: /*==========================================================
11250: **
11251: **
11252: ** ncr chip exception handler for programmed interrupts.
11253: **
11254: **
11255: **==========================================================
11256: */
11257:
11258: void ncr_int_sir (ncb_p np)
11259: {
11260: u_char num = INB (nc_dsps);
11261: u_long dsa = INL (nc_dsa);
11262: ccb_p cp = ncr_ccb_from_dsa(np, dsa);
11263: u_char target = INB (nc_sdid) & 0x0f;
11264: tcb_p tp = &np->target[target];
11265: int tmp;
11266:
11267: if (DEBUG_FLAGS & DEBUG_TINY) printk ("I#%d", num);
11268:
11269: switch (num) {
11270: /*
11271: ** See comments in the SCRIPTS code.
11272: */
11273: #ifdef SCSI_NCR_PCIQ_SYNC_ON_INTR
11274: case SIR_DUMMY_INTERRUPT:
11275: goto out;
11276: #endif
11277:
11278: /*
11279: ** The C code is currently trying to recover from something.
11280: ** Typically, user want to abort some command.
11281: */
11282: case SIR_SCRIPT_STOPPED:
11283: case SIR_TARGET_SELECTED:
11284: case SIR_ABORT_SENT:
11285: case SIR_AUTO_SENSE_DONE:
11286: ncr_sir_task_recovery(np, num);
11287: return;
11288: /*
11289: ** The device didn't go to MSG OUT phase after having
11290: ** been selected with ATN. We donnot want to handle
11291: ** that.
11292: */
11293: case SIR_SEL_ATN_NO_MSG_OUT:
11294: printk ("%s:%d: No MSG OUT phase after selection with ATN.\n",
11295: ncr_name (np), target);
11296: goto out_stuck;
11297: /*
11298: ** The device didn't switch to MSG IN phase after
11299: ** having reseleted the initiator.
11300: */
11301: case SIR_RESEL_NO_MSG_IN:
11302: /*
11303: ** After reselection, the device sent a message that wasn't
11304: ** an IDENTIFY.
11305: */
11306: case SIR_RESEL_NO_IDENTIFY:
11307: /*
11308: ** If devices reselecting without sending an IDENTIFY
11309: ** message still exist, this should help.
11310: ** We just assume lun=0, 1 CCB, no tag.
11311: */
11312: if (tp->l0p) {
11313: OUTL (nc_dsa, scr_to_cpu(tp->l0p->tasktbl[0]));
11314: OUTL_DSP (NCB_SCRIPT_PHYS (np, resel_go));
11315: return;
11316: }
11317: /*
11318: ** The device reselected a LUN we donnot know of.
11319: */
11320: case SIR_RESEL_BAD_LUN:
11321: np->msgout[0] = M_RESET;
11322: goto out;
11323: /*
11324: ** The device reselected for an untagged nexus and we
11325: ** haven't any.
11326: */
11327: case SIR_RESEL_BAD_I_T_L:
11328: np->msgout[0] = M_ABORT;
11329: goto out;
11330: /*
11331: ** The device reselected for a tagged nexus that we donnot
11332: ** have.
11333: */
11334: case SIR_RESEL_BAD_I_T_L_Q:
11335: np->msgout[0] = M_ABORT_TAG;
11336: goto out;
11337: /*
11338: ** The SCRIPTS let us know that the device has grabbed
11339: ** our message and will abort the job.
11340: */
11341: case SIR_RESEL_ABORTED:
11342: np->lastmsg = np->msgout[0];
11343: np->msgout[0] = M_NOOP;
11344: printk ("%s:%d: message %x sent on bad reselection.\n",
11345: ncr_name (np), target, np->lastmsg);
11346: goto out;
11347: /*
11348: ** The SCRIPTS let us know that a message has been
11349: ** successfully sent to the device.
11350: */
11351: case SIR_MSG_OUT_DONE:
11352: np->lastmsg = np->msgout[0];
11353: np->msgout[0] = M_NOOP;
11354: /* Should we really care of that */
11355: if (np->lastmsg == M_PARITY || np->lastmsg == M_ID_ERROR) {
11356: if (cp) {
11357: cp->xerr_status &= ~XE_PARITY_ERR;
11358: if (!cp->xerr_status)
11359: OUTOFFB (HF_PRT, HF_EXT_ERR);
11360: }
11361: }
11362: goto out;
11363: /*
11364: ** The device didn't send a GOOD SCSI status.
11365: ** We may have some work to do prior to allow
11366: ** the SCRIPTS processor to continue.
11367: */
11368: case SIR_BAD_STATUS:
11369: if (!cp)
11370: goto out;
11371: ncr_sir_to_redo(np, num, cp);
11372: return;
11373: /*
11374: ** We are asked by the SCRIPTS to prepare a
11375: ** REJECT message.
11376: */
11377: case SIR_REJECT_TO_SEND:
11378: ncr_print_msg(cp, "M_REJECT to send for ", np->msgin);
11379: np->msgout[0] = M_REJECT;
11380: goto out;
11381: /*
11382: ** We have been ODD at the end of a DATA IN
11383: ** transfer and the device didn't send a
11384: ** IGNORE WIDE RESIDUE message.
11385: ** It is a data overrun condition.
11386: */
11387: case SIR_SWIDE_OVERRUN:
11388: if (cp) {
11389: OUTONB (HF_PRT, HF_EXT_ERR);
11390: cp->xerr_status |= XE_SWIDE_OVRUN;
11391: }
11392: goto out;
11393: /*
11394: ** We have been ODD at the end of a DATA OUT
11395: ** transfer.
11396: ** It is a data underrun condition.
11397: */
11398: case SIR_SODL_UNDERRUN:
11399: if (cp) {
11400: OUTONB (HF_PRT, HF_EXT_ERR);
11401: cp->xerr_status |= XE_SODL_UNRUN;
11402: }
11403: goto out;
11404: /*
11405: ** The device wants us to tranfer more data than
11406: ** expected or in the wrong direction.
11407: ** The number of extra bytes is in scratcha.
11408: ** It is a data overrun condition.
11409: */
11410: case SIR_DATA_OVERRUN:
11411: if (cp) {
11412: OUTONB (HF_PRT, HF_EXT_ERR);
11413: cp->xerr_status |= XE_EXTRA_DATA;
11414: cp->extra_bytes += INL (nc_scratcha);
11415: }
11416: goto out;
11417: /*
11418: ** The device switched to an illegal phase (4/5).
11419: */
11420: case SIR_BAD_PHASE:
11421: if (cp) {
11422: OUTONB (HF_PRT, HF_EXT_ERR);
11423: cp->xerr_status |= XE_BAD_PHASE;
11424: }
11425: goto out;
11426: /*
11427: ** We received a message.
11428: */
11429: case SIR_MSG_RECEIVED:
11430: if (!cp)
11431: goto out_stuck;
11432: switch (np->msgin [0]) {
11433: /*
11434: ** We received an extended message.
11435: ** We handle MODIFY DATA POINTER, SDTR, WDTR
11436: ** and reject all other extended messages.
11437: */
11438: case M_EXTENDED:
11439: switch (np->msgin [2]) {
11440: case M_X_MODIFY_DP:
11441: if (DEBUG_FLAGS & DEBUG_POINTER)
11442: ncr_print_msg(cp,"modify DP",np->msgin);
11443: tmp = (np->msgin[3]<<24) + (np->msgin[4]<<16) +
11444: (np->msgin[5]<<8) + (np->msgin[6]);
11445: ncr_modify_dp(np, tp, cp, tmp);
11446: return;
11447: case M_X_SYNC_REQ:
11448: ncr_sync_nego(np, tp, cp);
11449: return;
11450: case M_X_WIDE_REQ:
11451: ncr_wide_nego(np, tp, cp);
11452: return;
11453: case M_X_PPR_REQ:
11454: ncr_ppr_nego(np, tp, cp);
11455: return;
11456: default:
11457: goto out_reject;
11458: }
11459: break;
11460: /*
11461: ** We received a 1/2 byte message not handled from SCRIPTS.
11462: ** We are only expecting MESSAGE REJECT and IGNORE WIDE
11463: ** RESIDUE messages that haven't been anticipated by
11464: ** SCRIPTS on SWIDE full condition. Unanticipated IGNORE
11465: ** WIDE RESIDUE messages are aliased as MODIFY DP (-1).
11466: */
11467: case M_IGN_RESIDUE:
11468: if (DEBUG_FLAGS & DEBUG_POINTER)
11469: ncr_print_msg(cp,"ign wide residue", np->msgin);
11470: ncr_modify_dp(np, tp, cp, -1);
11471: return;
11472: case M_REJECT:
11473: if (INB (HS_PRT) == HS_NEGOTIATE)
11474: ncr_nego_rejected(np, tp, cp);
11475: else {
11476: PRINT_ADDR(cp->cmd);
11477: printk ("M_REJECT received (%x:%x).\n",
11478: scr_to_cpu(np->lastmsg), np->msgout[0]);
11479: }
11480: goto out_clrack;
11481: break;
11482: default:
11483: goto out_reject;
11484: }
11485: break;
11486: /*
11487: ** We received an unknown message.
11488: ** Ignore all MSG IN phases and reject it.
11489: */
11490: case SIR_MSG_WEIRD:
11491: ncr_print_msg(cp, "WEIRD message received", np->msgin);
11492: OUTL_DSP (NCB_SCRIPTH_PHYS (np, msg_weird));
11493: return;
11494: /*
11495: ** Negotiation failed.
11496: ** Target does not send us the reply.
11497: ** Remove the HS_NEGOTIATE status.
11498: */
11499: case SIR_NEGO_FAILED:
11500: OUTB (HS_PRT, HS_BUSY);
11501: /*
11502: ** Negotiation failed.
11503: ** Target does not want answer message.
11504: */
11505: case SIR_NEGO_PROTO:
11506: ncr_nego_default(np, tp, cp);
11507: goto out;
11508: };
11509:
11510: out:
11511: OUTONB_STD ();
11512: return;
11513: out_reject:
11514: OUTL_DSP (NCB_SCRIPTH_PHYS (np, msg_bad));
11515: return;
11516: out_clrack:
11517: OUTL_DSP (NCB_SCRIPT_PHYS (np, clrack));
11518: return;
11519: out_stuck:
11520: return;
11521: }
11522:
11523:
11524: /*==========================================================
11525: **
11526: **
11527: ** Aquire a control block
11528: **
11529: **
11530: **==========================================================
11531: */
11532:
11533: static ccb_p ncr_get_ccb (ncb_p np, u_char tn, u_char ln)
11534: {
11535: tcb_p tp = &np->target[tn];
11536: lcb_p lp = ncr_lp(np, tp, ln);
11537: u_short tag = NO_TAG;
11538: XPT_QUEHEAD *qp;
11539: ccb_p cp = (ccb_p) 0;
11540:
11541: /*
11542: ** Allocate a new CCB if needed.
11543: */
11544: if (xpt_que_empty(&np->free_ccbq))
11545: (void) ncr_alloc_ccb(np);
11546:
11547: /*
11548: ** Look for a free CCB
11549: */
11550: qp = xpt_remque_head(&np->free_ccbq);
11551: if (!qp)
11552: goto out;
11553: cp = xpt_que_entry(qp, struct ccb, link_ccbq);
11554:
11555: /*
11556: ** If the LCB is not yet available and we already
11557: ** have queued a CCB for a LUN without LCB,
11558: ** give up. Otherwise all is fine. :-)
11559: */
11560: if (!lp) {
11561: if (xpt_que_empty(&np->b0_ccbq))
11562: xpt_insque_head(&cp->link_ccbq, &np->b0_ccbq);
11563: else
11564: goto out_free;
11565: } else {
11566: /*
11567: ** Tune tag mode if asked by user.
11568: */
11569: if (lp->queuedepth != lp->numtags) {
11570: ncr_setup_tags(np, tn, ln);
11571: }
11572:
11573: /*
11574: ** Get a tag for this nexus if required.
11575: ** Keep from using more tags than we can handle.
11576: */
11577: if (lp->usetags) {
11578: if (lp->busyccbs < lp->maxnxs) {
11579: tag = lp->cb_tags[lp->ia_tag];
11580: ++lp->ia_tag;
11581: if (lp->ia_tag == MAX_TAGS)
11582: lp->ia_tag = 0;
11583: cp->tags_si = lp->tags_si;
11584: ++lp->tags_sum[cp->tags_si];
11585: }
11586: else
11587: goto out_free;
11588: }
11589:
11590: /*
11591: ** Put the CCB in the LUN wait queue and
11592: ** count it as busy.
11593: */
11594: xpt_insque_tail(&cp->link_ccbq, &lp->wait_ccbq);
11595: ++lp->busyccbs;
11596: }
11597:
11598: /*
11599: ** Remember all informations needed to free this CCB.
11600: */
11601: cp->to_abort = 0;
11602: cp->tag = tag;
11603: cp->target = tn;
11604: cp->lun = ln;
11605:
11606: if (DEBUG_FLAGS & DEBUG_TAGS) {
11607: PRINT_LUN(np, tn, ln);
11608: printk ("ccb @%p using tag %d.\n", cp, tag);
11609: }
11610:
11611: out:
11612: return cp;
11613: out_free:
11614: xpt_insque_head(&cp->link_ccbq, &np->free_ccbq);
11615: return (ccb_p) 0;
11616: }
11617:
11618: /*==========================================================
11619: **
11620: **
11621: ** Release one control block
11622: **
11623: **
11624: **==========================================================
11625: */
11626:
11627: static void ncr_free_ccb (ncb_p np, ccb_p cp)
11628: {
11629: tcb_p tp = &np->target[cp->target];
11630: lcb_p lp = ncr_lp(np, tp, cp->lun);
11631:
11632: if (DEBUG_FLAGS & DEBUG_TAGS) {
11633: PRINT_LUN(np, cp->target, cp->lun);
11634: printk ("ccb @%p freeing tag %d.\n", cp, cp->tag);
11635: }
11636:
11637: /*
11638: ** If lun control block available, make available
11639: ** the task slot and the tag if any.
11640: ** Decrement counters.
11641: */
11642: if (lp) {
11643: if (cp->tag != NO_TAG) {
11644: lp->cb_tags[lp->if_tag++] = cp->tag;
11645: if (lp->if_tag == MAX_TAGS)
11646: lp->if_tag = 0;
11647: --lp->tags_sum[cp->tags_si];
11648: lp->tasktbl[cp->tag] = cpu_to_scr(np->p_bad_i_t_l_q);
11649: } else {
11650: lp->tasktbl[0] = cpu_to_scr(np->p_bad_i_t_l);
11651: }
11652: --lp->busyccbs;
11653: if (cp->queued) {
11654: --lp->queuedccbs;
11655: }
11656: }
11657:
11658: /*
11659: ** Make this CCB available.
11660: */
11661: xpt_remque(&cp->link_ccbq);
11662: xpt_insque_head(&cp->link_ccbq, &np->free_ccbq);
11663: cp -> host_status = HS_IDLE;
11664: cp -> queued = 0;
11665: }
11666:
11667: /*------------------------------------------------------------------------
11668: ** Allocate a CCB and initialize its fixed part.
11669: **------------------------------------------------------------------------
11670: **------------------------------------------------------------------------
11671: */
11672: static ccb_p ncr_alloc_ccb(ncb_p np)
11673: {
11674: ccb_p cp = 0;
11675: int hcode;
11676:
11677: /*
11678: ** Allocate memory for this CCB.
11679: */
11680: cp = m_calloc_dma(sizeof(struct ccb), "CCB");
11681: if (!cp)
11682: return 0;
11683:
11684: /*
11685: ** Count it and initialyze it.
11686: */
11687: np->actccbs++;
11688:
11689: /*
11690: ** Remember virtual and bus address of this ccb.
11691: */
11692: cp->p_ccb = vtobus(cp);
11693:
11694: /*
11695: ** Insert this ccb into the hashed list.
11696: */
11697: hcode = CCB_HASH_CODE(cp->p_ccb);
11698: cp->link_ccbh = np->ccbh[hcode];
11699: np->ccbh[hcode] = cp;
11700:
11701: /*
11702: ** Initialyze the start and restart actions.
11703: */
11704: cp->phys.header.go.start = cpu_to_scr(NCB_SCRIPT_PHYS (np, idle));
11705: cp->phys.header.go.restart = cpu_to_scr(NCB_SCRIPTH_PHYS(np,bad_i_t_l));
11706:
11707: /*
11708: ** Initilialyze some other fields.
11709: */
11710: cp->phys.smsg_ext.addr = cpu_to_scr(NCB_PHYS(np, msgin[2]));
11711:
11712: /*
11713: ** Chain into wakeup list and free ccb queue.
11714: */
11715: cp->link_ccb = np->ccbc;
11716: np->ccbc = cp;
11717:
11718: xpt_insque_head(&cp->link_ccbq, &np->free_ccbq);
11719:
11720: return cp;
11721: }
11722:
11723: /*------------------------------------------------------------------------
11724: ** Look up a CCB from a DSA value.
11725: **------------------------------------------------------------------------
11726: **------------------------------------------------------------------------
11727: */
11728: static ccb_p ncr_ccb_from_dsa(ncb_p np, u_long dsa)
11729: {
11730: int hcode;
11731: ccb_p cp;
11732:
11733: hcode = CCB_HASH_CODE(dsa);
11734: cp = np->ccbh[hcode];
11735: while (cp) {
11736: if (cp->p_ccb == dsa)
11737: break;
11738: cp = cp->link_ccbh;
11739: }
11740:
11741: return cp;
11742: }
11743:
11744: /*==========================================================
11745: **
11746: **
11747: ** Allocation of resources for Targets/Luns/Tags.
11748: **
11749: **
11750: **==========================================================
11751: */
11752:
11753:
11754: /*------------------------------------------------------------------------
11755: ** Target control block initialisation.
11756: **------------------------------------------------------------------------
11757: ** This data structure is fully initialized after a SCSI command
11758: ** has been successfully completed for this target.
11759: **------------------------------------------------------------------------
11760: */
11761: static void ncr_init_tcb (ncb_p np, u_char tn)
11762: {
11763: /*
11764: ** Check some alignments required by the chip.
11765: */
11766: assert (( (offsetof(struct ncr_reg, nc_sxfer) ^
11767: offsetof(struct tcb , sval )) &3) == 0);
11768: assert (( (offsetof(struct ncr_reg, nc_scntl3) ^
11769: offsetof(struct tcb , wval )) &3) == 0);
11770: if ((np->device_id == PCI_DEVICE_ID_LSI_53C1010) ||
11771: (np->device_id == PCI_DEVICE_ID_LSI_53C1010_66)){
11772: assert (( (offsetof(struct ncr_reg, nc_scntl4) ^
11773: offsetof(struct tcb , uval )) &3) == 0);
11774: }
11775: }
11776:
11777: /*------------------------------------------------------------------------
11778: ** Lun control block allocation and initialization.
11779: **------------------------------------------------------------------------
11780: ** This data structure is allocated and initialized after a SCSI
11781: ** command has been successfully completed for this target/lun.
11782: **------------------------------------------------------------------------
11783: */
11784: static lcb_p ncr_alloc_lcb (ncb_p np, u_char tn, u_char ln)
11785: {
11786: tcb_p tp = &np->target[tn];
11787: lcb_p lp = ncr_lp(np, tp, ln);
11788:
11789: /*
11790: ** Already done, return.
11791: */
11792: if (lp)
11793: return lp;
11794:
11795: /*
11796: ** Initialize the target control block if not yet.
11797: */
11798: ncr_init_tcb(np, tn);
11799:
11800: /*
11801: ** Allocate the lcb bus address array.
11802: ** Compute the bus address of this table.
11803: */
11804: if (ln && !tp->luntbl) {
11805: int i;
11806:
11807: tp->luntbl = m_calloc_dma(256, "LUNTBL");
11808: if (!tp->luntbl)
11809: goto fail;
11810: for (i = 0 ; i < 64 ; i++)
11811: tp->luntbl[i] = cpu_to_scr(NCB_PHYS(np, resel_badlun));
11812: tp->b_luntbl = cpu_to_scr(vtobus(tp->luntbl));
11813: }
11814:
11815: /*
11816: ** Allocate the table of pointers for LUN(s) > 0, if needed.
11817: */
11818: if (ln && !tp->lmp) {
11819: tp->lmp = m_calloc(MAX_LUN * sizeof(lcb_p), "LMP");
11820: if (!tp->lmp)
11821: goto fail;
11822: }
11823:
11824: /*
11825: ** Allocate the lcb.
11826: ** Make it available to the chip.
11827: */
11828: lp = m_calloc_dma(sizeof(struct lcb), "LCB");
11829: if (!lp)
11830: goto fail;
11831: if (ln) {
11832: tp->lmp[ln] = lp;
11833: tp->luntbl[ln] = cpu_to_scr(vtobus(lp));
11834: }
11835: else {
11836: tp->l0p = lp;
11837: tp->b_lun0 = cpu_to_scr(vtobus(lp));
11838: }
11839:
11840: /*
11841: ** Initialize the CCB queue headers.
11842: */
11843: xpt_que_init(&lp->busy_ccbq);
11844: xpt_que_init(&lp->wait_ccbq);
11845:
11846: /*
11847: ** Set max CCBs to 1 and use the default task array
11848: ** by default.
11849: */
11850: lp->maxnxs = 1;
11851: lp->tasktbl = &lp->tasktbl_0;
11852: lp->b_tasktbl = cpu_to_scr(vtobus(lp->tasktbl));
11853: lp->tasktbl[0] = cpu_to_scr(np->p_notask);
11854: lp->resel_task = cpu_to_scr(NCB_SCRIPT_PHYS(np, resel_notag));
11855:
11856: /*
11857: ** Initialize command queuing control.
11858: */
11859: lp->busyccbs = 1;
11860: lp->queuedccbs = 1;
11861: lp->queuedepth = 1;
11862: fail:
11863: return lp;
11864: }
11865:
11866:
11867: /*------------------------------------------------------------------------
11868: ** Lun control block setup on INQUIRY data received.
11869: **------------------------------------------------------------------------
11870: ** We only support WIDE, SYNC for targets and CMDQ for logical units.
11871: ** This setup is done on each INQUIRY since we are expecting user
11872: ** will play with CHANGE DEFINITION commands. :-)
11873: **------------------------------------------------------------------------
11874: */
11875: static lcb_p ncr_setup_lcb (ncb_p np, u_char tn, u_char ln, u_char *inq_data)
11876: {
11877: tcb_p tp = &np->target[tn];
11878: lcb_p lp = ncr_lp(np, tp, ln);
11879: u_char inq_byte7;
11880: int i;
11881:
11882: /*
11883: ** If no lcb, try to allocate it.
11884: */
11885: if (!lp && !(lp = ncr_alloc_lcb(np, tn, ln)))
11886: goto fail;
11887:
11888: #if 0 /* No more used. Left here as provision */
11889: /*
11890: ** Get device quirks.
11891: */
11892: tp->quirks = 0;
11893: if (tp->quirks && bootverbose) {
11894: PRINT_LUN(np, tn, ln);
11895: printk ("quirks=%x.\n", tp->quirks);
11896: }
11897: #endif
11898:
11899: /*
11900: ** Evaluate trustable target/unit capabilities.
11901: ** We only believe device version >= SCSI-2 that
11902: ** use appropriate response data format (2).
11903: ** But it seems that some CCS devices also
11904: ** support SYNC and I donnot want to frustrate
11905: ** anybody. ;-)
11906: */
11907: inq_byte7 = 0;
11908: if ((inq_data[2] & 0x7) >= 2 && (inq_data[3] & 0xf) == 2)
11909: inq_byte7 = inq_data[7];
11910: else if ((inq_data[2] & 0x7) == 1 && (inq_data[3] & 0xf) == 1)
11911: inq_byte7 = INQ7_SYNC;
11912:
11913: /*
11914: ** Throw away announced LUN capabilities if we are told
11915: ** that there is no real device supported by the logical unit.
11916: */
11917: if ((inq_data[0] & 0xe0) > 0x20 || (inq_data[0] & 0x1f) == 0x1f)
11918: inq_byte7 &= (INQ7_SYNC | INQ7_WIDE16);
11919:
11920: /*
11921: ** If user is wanting SYNC, force this feature.
11922: */
11923: if (driver_setup.force_sync_nego)
11924: inq_byte7 |= INQ7_SYNC;
11925:
11926: /*
11927: ** Prepare negotiation if SIP capabilities have changed.
11928: */
11929: tp->inq_done = 1;
11930: if ((inq_byte7 ^ tp->inq_byte7) & (INQ7_SYNC | INQ7_WIDE16)) {
11931: tp->inq_byte7 = inq_byte7;
11932: ncr_negotiate(np, tp);
11933: }
11934:
11935: /*
11936: ** If unit supports tagged commands, allocate and
11937: ** initialyze the task table if not yet.
11938: */
11939: if ((inq_byte7 & INQ7_QUEUE) && lp->tasktbl == &lp->tasktbl_0) {
11940: lp->tasktbl = m_calloc_dma(MAX_TASKS*4, "TASKTBL");
11941: if (!lp->tasktbl) {
11942: lp->tasktbl = &lp->tasktbl_0;
11943: goto fail;
11944: }
11945: lp->b_tasktbl = cpu_to_scr(vtobus(lp->tasktbl));
11946: for (i = 0 ; i < MAX_TASKS ; i++)
11947: lp->tasktbl[i] = cpu_to_scr(np->p_notask);
11948:
11949: lp->cb_tags = m_calloc(MAX_TAGS, "CB_TAGS");
11950: if (!lp->cb_tags)
11951: goto fail;
11952: for (i = 0 ; i < MAX_TAGS ; i++)
11953: lp->cb_tags[i] = i;
11954:
11955: lp->maxnxs = MAX_TAGS;
11956: lp->tags_stime = ktime_get(3*HZ);
11957: }
11958:
11959: /*
11960: ** Adjust tagged queueing status if needed.
11961: */
11962: if ((inq_byte7 ^ lp->inq_byte7) & INQ7_QUEUE) {
11963: lp->inq_byte7 = inq_byte7;
11964: lp->numtags = lp->maxtags;
11965: ncr_setup_tags (np, tn, ln);
11966: }
11967:
11968: fail:
11969: return lp;
11970: }
11971:
11972: /*==========================================================
11973: **
11974: **
11975: ** Build Scatter Gather Block
11976: **
11977: **
11978: **==========================================================
11979: **
11980: ** The transfer area may be scattered among
11981: ** several non adjacent physical pages.
11982: **
11983: ** We may use MAX_SCATTER blocks.
11984: **
11985: **----------------------------------------------------------
11986: */
11987:
11988: /*
11989: ** We try to reduce the number of interrupts caused
11990: ** by unexpected phase changes due to disconnects.
11991: ** A typical harddisk may disconnect before ANY block.
11992: ** If we wanted to avoid unexpected phase changes at all
11993: ** we had to use a break point every 512 bytes.
11994: ** Of course the number of scatter/gather blocks is
11995: ** limited.
11996: ** Under Linux, the scatter/gatter blocks are provided by
11997: ** the generic driver. We just have to copy addresses and
11998: ** sizes to the data segment array.
11999: */
12000:
12001: /*
12002: ** For 64 bit systems, we use the 8 upper bits of the size field
12003: ** to provide bus address bits 32-39 to the SCRIPTS processor.
12004: ** This allows the 895A and 896 to address up to 1 TB of memory.
12005: ** For 32 bit chips on 64 bit systems, we must be provided with
12006: ** memory addresses that fit into the first 32 bit bus address
12007: ** range and so, this does not matter and we expect an error from
12008: ** the chip if this ever happen.
12009: **
12010: ** We use a separate function for the case Linux does not provide
12011: ** a scatter list in order to allow better code optimization
12012: ** for the case we have a scatter list (BTW, for now this just wastes
12013: ** about 40 bytes of code for x86, but my guess is that the scatter
12014: ** code will get more complex later).
12015: */
12016:
12017: #ifdef SCSI_NCR_USE_64BIT_DAC
12018: #define SCATTER_ONE(data, badd, len) \
12019: (data)->addr = cpu_to_scr(badd); \
12020: (data)->size = cpu_to_scr((((badd) >> 8) & 0xff000000) + len);
12021: #else
12022: #define SCATTER_ONE(data, badd, len) \
12023: (data)->addr = cpu_to_scr(badd); \
12024: (data)->size = cpu_to_scr(len);
12025: #endif
12026:
12027: #define CROSS_16MB(p, n) (((((u_long) p) + n - 1) ^ ((u_long) p)) & ~0xffffff)
12028:
12029: static int ncr_scatter_no_sglist(ncb_p np, ccb_p cp, Scsi_Cmnd *cmd)
12030: {
12031: struct scr_tblmove *data = &cp->phys.data[MAX_SCATTER-1];
12032: int segment;
12033:
12034: cp->data_len = cmd->request_bufflen;
12035:
12036: if (cmd->request_bufflen) {
12037: u_long baddr = map_scsi_single_data(np, cmd);
12038:
12039: SCATTER_ONE(data, baddr, cmd->request_bufflen);
12040: if (CROSS_16MB(baddr, cmd->request_bufflen)) {
12041: cp->host_flags |= HF_PM_TO_C;
12042: #ifdef DEBUG_896R1
12043: printk("He! we are crossing a 16 MB boundary (0x%lx, 0x%x)\n",
12044: baddr, cmd->request_bufflen);
12045: #endif
12046: }
12047: segment = 1;
12048: }
12049: else
12050: segment = 0;
12051:
12052: return segment;
12053: }
12054:
12055: /*
12056: ** DEL 472 - 53C896 Rev 1 - Part Number 609-0393055 - ITEM 5.
12057: **
12058: ** We disable data phase mismatch handling from SCRIPTS for data
12059: ** transfers that contains scatter/gather entries that cross
12060: ** a 16 MB boundary.
12061: ** We use a different scatter function for 896 rev. 1 that needs
12062: ** such a work-around. Doing so, we do not affect performance for
12063: ** other chips.
12064: ** This problem should not be triggered for disk IOs under Linux,
12065: ** since such IOs are performed using pages and buffers that are
12066: ** nicely power-of-two sized and aligned. But, since this may change
12067: ** at any time, a work-around was required.
12068: */
12069: static int ncr_scatter_896R1(ncb_p np, ccb_p cp, Scsi_Cmnd *cmd)
12070: {
12071: int segn;
12072: int use_sg = (int) cmd->use_sg;
12073:
12074: cp->data_len = 0;
12075:
12076: if (!use_sg)
12077: segn = ncr_scatter_no_sglist(np, cp, cmd);
12078: else if (use_sg > MAX_SCATTER)
12079: segn = -1;
12080: else {
12081: struct scatterlist *scatter = (struct scatterlist *)cmd->buffer;
12082: struct scr_tblmove *data;
12083:
12084: use_sg = map_scsi_sg_data(np, cmd);
12085: data = &cp->phys.data[MAX_SCATTER - use_sg];
12086:
12087: for (segn = 0; segn < use_sg; segn++) {
12088: u_long baddr = scsi_sg_dma_address(&scatter[segn]);
12089: unsigned int len = scsi_sg_dma_len(&scatter[segn]);
12090:
12091: SCATTER_ONE(&data[segn],
12092: baddr,
12093: len);
12094: if (CROSS_16MB(baddr, scatter[segn].length)) {
12095: cp->host_flags |= HF_PM_TO_C;
12096: #ifdef DEBUG_896R1
12097: printk("He! we are crossing a 16 MB boundary (0x%lx, 0x%x)\n",
12098: baddr, scatter[segn].length);
12099: #endif
12100: }
12101: cp->data_len += len;
12102: }
12103: }
12104:
12105: return segn;
12106: }
12107:
12108: static int ncr_scatter(ncb_p np, ccb_p cp, Scsi_Cmnd *cmd)
12109: {
12110: int segment;
12111: int use_sg = (int) cmd->use_sg;
12112:
12113: cp->data_len = 0;
12114:
12115: if (!use_sg)
12116: segment = ncr_scatter_no_sglist(np, cp, cmd);
12117: else if (use_sg > MAX_SCATTER)
12118: segment = -1;
12119: else {
12120: struct scatterlist *scatter = (struct scatterlist *)cmd->buffer;
12121: struct scr_tblmove *data;
12122:
12123: use_sg = map_scsi_sg_data(np, cmd);
12124: data = &cp->phys.data[MAX_SCATTER - use_sg];
12125:
12126: for (segment = 0; segment < use_sg; segment++) {
12127: u_long baddr = scsi_sg_dma_address(&scatter[segment]);
12128: unsigned int len = scsi_sg_dma_len(&scatter[segment]);
12129:
12130: SCATTER_ONE(&data[segment],
12131: baddr,
12132: len);
12133: cp->data_len += len;
12134: }
12135: }
12136:
12137: return segment;
12138: }
12139:
12140: /*==========================================================
12141: **
12142: **
12143: ** Test the pci bus snoop logic :-(
12144: **
12145: ** Has to be called with interrupts disabled.
12146: **
12147: **
12148: **==========================================================
12149: */
12150:
12151: #ifndef SCSI_NCR_IOMAPPED
12152: static int __init ncr_regtest (struct ncb* np)
12153: {
12154: register volatile u_int32 data;
12155: /*
12156: ** ncr registers may NOT be cached.
12157: ** write 0xffffffff to a read only register area,
12158: ** and try to read it back.
12159: */
12160: data = 0xffffffff;
12161: OUTL_OFF(offsetof(struct ncr_reg, nc_dstat), data);
12162: data = INL_OFF(offsetof(struct ncr_reg, nc_dstat));
12163: #if 1
12164: if (data == 0xffffffff) {
12165: #else
12166: if ((data & 0xe2f0fffd) != 0x02000080) {
12167: #endif
12168: printk ("CACHE TEST FAILED: reg dstat-sstat2 readback %x.\n",
12169: (unsigned) data);
12170: return (0x10);
12171: };
12172: return (0);
12173: }
12174: #endif
12175:
12176: static int __init ncr_snooptest (struct ncb* np)
12177: {
12178: u_int32 ncr_rd, ncr_wr, ncr_bk, host_rd, host_wr, pc;
12179: int i, err=0;
12180: #ifndef SCSI_NCR_IOMAPPED
12181: if (np->reg) {
12182: err |= ncr_regtest (np);
12183: if (err) return (err);
12184: }
12185: #endif
12186: /*
12187: ** init
12188: */
12189: pc = NCB_SCRIPTH0_PHYS (np, snooptest);
12190: host_wr = 1;
12191: ncr_wr = 2;
12192: /*
12193: ** Set memory and register.
12194: */
12195: np->ncr_cache = cpu_to_scr(host_wr);
12196: OUTL (nc_temp, ncr_wr);
12197: /*
12198: ** Start script (exchange values)
12199: */
12200: OUTL (nc_dsa, np->p_ncb);
12201: OUTL_DSP (pc);
12202: /*
12203: ** Wait 'til done (with timeout)
12204: */
12205: for (i=0; i<NCR_SNOOP_TIMEOUT; i++)
12206: if (INB(nc_istat) & (INTF|SIP|DIP))
12207: break;
12208: /*
12209: ** Save termination position.
12210: */
12211: pc = INL (nc_dsp);
12212: /*
12213: ** Read memory and register.
12214: */
12215: host_rd = scr_to_cpu(np->ncr_cache);
12216: ncr_rd = INL (nc_scratcha);
12217: ncr_bk = INL (nc_temp);
12218:
12219: /*
12220: ** check for timeout
12221: */
12222: if (i>=NCR_SNOOP_TIMEOUT) {
12223: printk ("CACHE TEST FAILED: timeout.\n");
12224: return (0x20);
12225: };
12226: /*
12227: ** Check termination position.
12228: */
12229: if (pc != NCB_SCRIPTH0_PHYS (np, snoopend)+8) {
12230: printk ("CACHE TEST FAILED: script execution failed.\n");
12231: printk ("start=%08lx, pc=%08lx, end=%08lx\n",
12232: (u_long) NCB_SCRIPTH0_PHYS (np, snooptest), (u_long) pc,
12233: (u_long) NCB_SCRIPTH0_PHYS (np, snoopend) +8);
12234: return (0x40);
12235: };
12236: /*
12237: ** Show results.
12238: */
12239: if (host_wr != ncr_rd) {
12240: printk ("CACHE TEST FAILED: host wrote %d, ncr read %d.\n",
12241: (int) host_wr, (int) ncr_rd);
12242: err |= 1;
12243: };
12244: if (host_rd != ncr_wr) {
12245: printk ("CACHE TEST FAILED: ncr wrote %d, host read %d.\n",
12246: (int) ncr_wr, (int) host_rd);
12247: err |= 2;
12248: };
12249: if (ncr_bk != ncr_wr) {
12250: printk ("CACHE TEST FAILED: ncr wrote %d, read back %d.\n",
12251: (int) ncr_wr, (int) ncr_bk);
12252: err |= 4;
12253: };
12254: return (err);
12255: }
12256:
12257: /*==========================================================
12258: **
12259: ** Determine the ncr's clock frequency.
12260: ** This is essential for the negotiation
12261: ** of the synchronous transfer rate.
12262: **
12263: **==========================================================
12264: **
12265: ** Note: we have to return the correct value.
12266: ** THERE IS NO SAFE DEFAULT VALUE.
12267: **
12268: ** Most NCR/SYMBIOS boards are delivered with a 40 Mhz clock.
12269: ** 53C860 and 53C875 rev. 1 support fast20 transfers but
12270: ** do not have a clock doubler and so are provided with a
12271: ** 80 MHz clock. All other fast20 boards incorporate a doubler
12272: ** and so should be delivered with a 40 MHz clock.
12273: ** The recent fast40 chips (895/896/895A) and the
12274: ** fast80 chip (C1010) use a 40 Mhz base clock
12275: ** and provide a clock quadrupler (160 Mhz). The code below
12276: ** tries to deal as cleverly as possible with all this stuff.
12277: **
12278: **----------------------------------------------------------
12279: */
12280:
12281: /*
12282: * Select NCR SCSI clock frequency
12283: */
12284: static void ncr_selectclock(ncb_p np, u_char scntl3)
12285: {
12286: if (np->multiplier < 2) {
12287: OUTB(nc_scntl3, scntl3);
12288: return;
12289: }
12290:
12291: if (bootverbose >= 2)
12292: printk ("%s: enabling clock multiplier\n", ncr_name(np));
12293:
12294: OUTB(nc_stest1, DBLEN); /* Enable clock multiplier */
12295:
12296: if ( (np->device_id != PCI_DEVICE_ID_LSI_53C1010) &&
12297: (np->device_id != PCI_DEVICE_ID_LSI_53C1010_66) &&
12298: (np->multiplier > 2)) {
12299: int i = 20; /* Poll bit 5 of stest4 for quadrupler */
12300: while (!(INB(nc_stest4) & LCKFRQ) && --i > 0)
12301: UDELAY (20);
12302: if (!i)
12303: printk("%s: the chip cannot lock the frequency\n",
12304: ncr_name(np));
12305:
12306: } else /* Wait 120 micro-seconds for multiplier*/
12307: UDELAY (120);
12308:
12309: OUTB(nc_stest3, HSC); /* Halt the scsi clock */
12310: OUTB(nc_scntl3, scntl3);
12311: OUTB(nc_stest1, (DBLEN|DBLSEL));/* Select clock multiplier */
12312: OUTB(nc_stest3, 0x00); /* Restart scsi clock */
12313: }
12314:
12315:
12316: /*
12317: * calculate NCR SCSI clock frequency (in KHz)
12318: */
12319: static unsigned __init ncrgetfreq (ncb_p np, int gen)
12320: {
12321: unsigned int ms = 0;
12322: unsigned int f;
12323: int count;
12324:
12325: /*
12326: * Measure GEN timer delay in order
12327: * to calculate SCSI clock frequency
12328: *
12329: * This code will never execute too
12330: * many loop iterations (if DELAY is
12331: * reasonably correct). It could get
12332: * too low a delay (too high a freq.)
12333: * if the CPU is slow executing the
12334: * loop for some reason (an NMI, for
12335: * example). For this reason we will
12336: * if multiple measurements are to be
12337: * performed trust the higher delay
12338: * (lower frequency returned).
12339: */
12340: OUTW (nc_sien , 0x0);/* mask all scsi interrupts */
12341: /* enable general purpose timer */
12342: (void) INW (nc_sist); /* clear pending scsi interrupt */
12343: OUTB (nc_dien , 0); /* mask all dma interrupts */
12344: (void) INW (nc_sist); /* another one, just to be sure :) */
12345: OUTB (nc_scntl3, 4); /* set pre-scaler to divide by 3 */
12346: OUTB (nc_stime1, 0); /* disable general purpose timer */
12347: OUTB (nc_stime1, gen); /* set to nominal delay of 1<<gen * 125us */
12348: /* Temporary fix for udelay issue with Alpha
12349: platform */
12350: while (!(INW(nc_sist) & GEN) && ms++ < 100000) {
12351: /* count 1ms */
12352: for (count = 0; count < 10; count++)
12353: UDELAY (100);
12354: }
12355: OUTB (nc_stime1, 0); /* disable general purpose timer */
12356: /*
12357: * set prescaler to divide by whatever 0 means
12358: * 0 ought to choose divide by 2, but appears
12359: * to set divide by 3.5 mode in my 53c810 ...
12360: */
12361: OUTB (nc_scntl3, 0);
12362:
12363: /*
12364: * adjust for prescaler, and convert into KHz
12365: * scale values derived empirically. C1010 uses
12366: * different dividers
12367: */
12368: #if 0
12369: if (np->device_id == PCI_DEVICE_ID_LSI_53C1010)
12370: f = ms ? ((1 << gen) * 2866 ) / ms : 0;
12371: else
12372: #endif
12373: f = ms ? ((1 << gen) * 4340) / ms : 0;
12374:
12375: if (bootverbose >= 2)
12376: printk ("%s: Delay (GEN=%d): %u msec, %u KHz\n",
12377: ncr_name(np), gen, ms, f);
12378:
12379: return f;
12380: }
12381:
12382: static unsigned __init ncr_getfreq (ncb_p np)
12383: {
12384: u_int f1, f2;
12385: int gen = 11;
12386:
12387: (void) ncrgetfreq (np, gen); /* throw away first result */
12388: f1 = ncrgetfreq (np, gen);
12389: f2 = ncrgetfreq (np, gen);
12390: if (f1 > f2) f1 = f2; /* trust lower result */
12391: return f1;
12392: }
12393:
12394: /*
12395: * Get/probe NCR SCSI clock frequency
12396: */
12397: static void __init ncr_getclock (ncb_p np, int mult)
12398: {
12399: unsigned char scntl3 = np->sv_scntl3;
12400: unsigned char stest1 = np->sv_stest1;
12401: unsigned f1;
12402:
12403: np->multiplier = 1;
12404: f1 = 40000;
12405:
12406: /*
12407: ** True with 875/895/896/895A with clock multiplier selected
12408: */
12409: if (mult > 1 && (stest1 & (DBLEN+DBLSEL)) == DBLEN+DBLSEL) {
12410: if (bootverbose >= 2)
12411: printk ("%s: clock multiplier found\n", ncr_name(np));
12412: np->multiplier = mult;
12413: }
12414:
12415: /*
12416: ** If multiplier not found but a C1010, assume a mult of 4.
12417: ** If multiplier not found or scntl3 not 7,5,3,
12418: ** reset chip and get frequency from general purpose timer.
12419: ** Otherwise trust scntl3 BIOS setting.
12420: */
12421: if ((np->device_id == PCI_DEVICE_ID_LSI_53C1010) ||
12422: (np->device_id == PCI_DEVICE_ID_LSI_53C1010_66)) {
12423: f1=40000;
12424: np->multiplier = mult;
12425: if (bootverbose >= 2)
12426: printk ("%s: clock multiplier assumed\n", ncr_name(np));
12427: }
12428: else if (np->multiplier != mult || (scntl3 & 7) < 3 || !(scntl3 & 1)) {
12429: OUTB (nc_stest1, 0); /* make sure doubler is OFF */
12430: f1 = ncr_getfreq (np);
12431:
12432: if (bootverbose)
12433: printk ("%s: NCR clock is %uKHz\n", ncr_name(np), f1);
12434:
12435: if (f1 < 55000) f1 = 40000;
12436: else f1 = 80000;
12437:
12438: /*
12439: ** Suggest to also check the PCI clock frequency
12440: ** to make sure our frequency calculation algorithm
12441: ** is not too biased.
12442: */
12443: if (np->features & FE_66MHZ) {
12444: np->pciclock_min = (66000*55+80-1)/80;
12445: np->pciclock_max = (66000*55)/40;
12446: }
12447: else {
12448: np->pciclock_min = (33000*55+80-1)/80;
12449: np->pciclock_max = (33000*55)/40;
12450: }
12451:
12452: if (f1 == 40000 && mult > 1) {
12453: if (bootverbose >= 2)
12454: printk ("%s: clock multiplier assumed\n", ncr_name(np));
12455: np->multiplier = mult;
12456: }
12457: } else {
12458: if ((scntl3 & 7) == 3) f1 = 40000;
12459: else if ((scntl3 & 7) == 5) f1 = 80000;
12460: else f1 = 160000;
12461:
12462: f1 /= np->multiplier;
12463: }
12464:
12465: /*
12466: ** Compute controller synchronous parameters.
12467: */
12468: f1 *= np->multiplier;
12469: np->clock_khz = f1;
12470: }
12471:
12472: /*
12473: * Get/probe PCI clock frequency
12474: */
12475: static u_int __init ncr_getpciclock (ncb_p np)
12476: {
12477: static u_int f;
12478:
12479: OUTB (nc_stest1, SCLK); /* Use the PCI clock as SCSI clock */
12480: f = ncr_getfreq (np);
12481: OUTB (nc_stest1, 0);
12482:
12483: return f;
12484: }
12485:
12486: /*===================== LINUX ENTRY POINTS SECTION ==========================*/
12487:
12488: #ifndef uchar
12489: #define uchar unsigned char
12490: #endif
12491:
12492: #ifndef ushort
12493: #define ushort unsigned short
12494: #endif
12495:
12496: #ifndef ulong
12497: #define ulong unsigned long
12498: #endif
12499:
12500: /* ---------------------------------------------------------------------
12501: **
12502: ** Driver setup from the boot command line
12503: **
12504: ** ---------------------------------------------------------------------
12505: */
12506:
12507: #ifdef MODULE
12508: #define ARG_SEP ' '
12509: #else
12510: #define ARG_SEP ','
12511: #endif
12512:
12513: #define OPT_TAGS 1
12514: #define OPT_MASTER_PARITY 2
12515: #define OPT_SCSI_PARITY 3
12516: #define OPT_DISCONNECTION 4
12517: #define OPT_SPECIAL_FEATURES 5
12518: #define OPT_ULTRA_SCSI 6
12519: #define OPT_FORCE_SYNC_NEGO 7
12520: #define OPT_REVERSE_PROBE 8
12521: #define OPT_DEFAULT_SYNC 9
12522: #define OPT_VERBOSE 10
12523: #define OPT_DEBUG 11
12524: #define OPT_BURST_MAX 12
12525: #define OPT_LED_PIN 13
12526: #define OPT_MAX_WIDE 14
12527: #define OPT_SETTLE_DELAY 15
12528: #define OPT_DIFF_SUPPORT 16
12529: #define OPT_IRQM 17
12530: #define OPT_PCI_FIX_UP 18
12531: #define OPT_BUS_CHECK 19
12532: #define OPT_OPTIMIZE 20
12533: #define OPT_RECOVERY 21
12534: #define OPT_SAFE_SETUP 22
12535: #define OPT_USE_NVRAM 23
12536: #define OPT_EXCLUDE 24
12537: #define OPT_HOST_ID 25
12538:
12539: #ifdef SCSI_NCR_IARB_SUPPORT
12540: #define OPT_IARB 26
12541: #endif
12542:
12543: static char setup_token[] __initdata =
12544: "tags:" "mpar:"
12545: "spar:" "disc:"
12546: "specf:" "ultra:"
12547: "fsn:" "revprob:"
12548: "sync:" "verb:"
12549: "debug:" "burst:"
12550: "led:" "wide:"
12551: "settle:" "diff:"
12552: "irqm:" "pcifix:"
12553: "buschk:" "optim:"
12554: "recovery:"
12555: "safe:" "nvram:"
12556: "excl:" "hostid:"
12557: #ifdef SCSI_NCR_IARB_SUPPORT
12558: "iarb:"
12559: #endif
12560: ; /* DONNOT REMOVE THIS ';' */
12561:
12562: #ifdef MODULE
12563: #define ARG_SEP ' '
12564: #else
12565: #define ARG_SEP ','
12566: #endif
12567:
12568: static int __init get_setup_token(char *p)
12569: {
12570: char *cur = setup_token;
12571: char *pc;
12572: int i = 0;
12573:
12574: while (cur != NULL && (pc = strchr(cur, ':')) != NULL) {
12575: ++pc;
12576: ++i;
12577: if (!strncmp(p, cur, pc - cur))
12578: return i;
12579: cur = pc;
12580: }
12581: return 0;
12582: }
12583:
12584:
12585: int __init sym53c8xx_setup(char *str)
12586: {
12587: #ifdef SCSI_NCR_BOOT_COMMAND_LINE_SUPPORT
12588: char *cur = str;
12589: char *pc, *pv;
12590: unsigned long val;
12591: int i, c;
12592: int xi = 0;
12593:
12594: while (cur != NULL && (pc = strchr(cur, ':')) != NULL) {
12595: char *pe;
12596:
12597: val = 0;
12598: pv = pc;
12599: c = *++pv;
12600:
12601: if (c == 'n')
12602: val = 0;
12603: else if (c == 'y')
12604: val = 1;
12605: else
12606: val = (int) simple_strtoul(pv, &pe, 0);
12607:
12608: switch (get_setup_token(cur)) {
12609: case OPT_TAGS:
12610: driver_setup.default_tags = val;
12611: if (pe && *pe == '/') {
12612: i = 0;
12613: while (*pe && *pe != ARG_SEP &&
12614: i < sizeof(driver_setup.tag_ctrl)-1) {
12615: driver_setup.tag_ctrl[i++] = *pe++;
12616: }
12617: driver_setup.tag_ctrl[i] = '\0';
12618: }
12619: break;
12620: case OPT_MASTER_PARITY:
12621: driver_setup.master_parity = val;
12622: break;
12623: case OPT_SCSI_PARITY:
12624: driver_setup.scsi_parity = val;
12625: break;
12626: case OPT_DISCONNECTION:
12627: driver_setup.disconnection = val;
12628: break;
12629: case OPT_SPECIAL_FEATURES:
12630: driver_setup.special_features = val;
12631: break;
12632: case OPT_ULTRA_SCSI:
12633: driver_setup.ultra_scsi = val;
12634: break;
12635: case OPT_FORCE_SYNC_NEGO:
12636: driver_setup.force_sync_nego = val;
12637: break;
12638: case OPT_REVERSE_PROBE:
12639: driver_setup.reverse_probe = val;
12640: break;
12641: case OPT_DEFAULT_SYNC:
12642: driver_setup.default_sync = val;
12643: break;
12644: case OPT_VERBOSE:
12645: driver_setup.verbose = val;
12646: break;
12647: case OPT_DEBUG:
12648: driver_setup.debug = val;
12649: break;
12650: case OPT_BURST_MAX:
12651: driver_setup.burst_max = val;
12652: break;
12653: case OPT_LED_PIN:
12654: driver_setup.led_pin = val;
12655: break;
12656: case OPT_MAX_WIDE:
12657: driver_setup.max_wide = val? 1:0;
12658: break;
12659: case OPT_SETTLE_DELAY:
12660: driver_setup.settle_delay = val;
12661: break;
12662: case OPT_DIFF_SUPPORT:
12663: driver_setup.diff_support = val;
12664: break;
12665: case OPT_IRQM:
12666: driver_setup.irqm = val;
12667: break;
12668: case OPT_PCI_FIX_UP:
12669: driver_setup.pci_fix_up = val;
12670: break;
12671: case OPT_BUS_CHECK:
12672: driver_setup.bus_check = val;
12673: break;
12674: case OPT_OPTIMIZE:
12675: driver_setup.optimize = val;
12676: break;
12677: case OPT_RECOVERY:
12678: driver_setup.recovery = val;
12679: break;
12680: case OPT_USE_NVRAM:
12681: driver_setup.use_nvram = val;
12682: break;
12683: case OPT_SAFE_SETUP:
12684: memcpy(&driver_setup, &driver_safe_setup,
12685: sizeof(driver_setup));
12686: break;
12687: case OPT_EXCLUDE:
12688: if (xi < SCSI_NCR_MAX_EXCLUDES)
12689: driver_setup.excludes[xi++] = val;
12690: break;
12691: case OPT_HOST_ID:
12692: driver_setup.host_id = val;
12693: break;
12694: #ifdef SCSI_NCR_IARB_SUPPORT
12695: case OPT_IARB:
12696: driver_setup.iarb = val;
12697: break;
12698: #endif
12699: default:
12700: printk("sym53c8xx_setup: unexpected boot option '%.*s' ignored\n", (int)(pc-cur+1), cur);
12701: break;
12702: }
12703:
12704: if ((cur = strchr(cur, ARG_SEP)) != NULL)
12705: ++cur;
12706: }
12707: #endif /* SCSI_NCR_BOOT_COMMAND_LINE_SUPPORT */
12708: return 1;
12709: }
12710:
12711: #if LINUX_VERSION_CODE >= LinuxVersionCode(2,3,13)
12712: #ifndef MODULE
12713: __setup("sym53c8xx=", sym53c8xx_setup);
12714: #endif
12715: #endif
12716:
12717: static int
12718: sym53c8xx_pci_init(Scsi_Host_Template *tpnt, pcidev_t pdev, ncr_device *device);
12719:
12720: /*
12721: ** Linux entry point for SYM53C8XX devices detection routine.
12722: **
12723: ** Called by the middle-level scsi drivers at initialization time,
12724: ** or at module installation.
12725: **
12726: ** Read the PCI configuration and try to attach each
12727: ** detected NCR board.
12728: **
12729: ** If NVRAM is present, try to attach boards according to
12730: ** the used defined boot order.
12731: **
12732: ** Returns the number of boards successfully attached.
12733: */
12734:
12735: static void __init ncr_print_driver_setup(void)
12736: {
12737: #define YesNo(y) y ? 'y' : 'n'
12738: printk (NAME53C8XX ": setup=disc:%c,specf:%d,ultra:%d,tags:%d,sync:%d,"
12739: "burst:%d,wide:%c,diff:%d,revprob:%c,buschk:0x%x\n",
12740: YesNo(driver_setup.disconnection),
12741: driver_setup.special_features,
12742: driver_setup.ultra_scsi,
12743: driver_setup.default_tags,
12744: driver_setup.default_sync,
12745: driver_setup.burst_max,
12746: YesNo(driver_setup.max_wide),
12747: driver_setup.diff_support,
12748: YesNo(driver_setup.reverse_probe),
12749: driver_setup.bus_check);
12750:
12751: printk (NAME53C8XX ": setup=mpar:%c,spar:%c,fsn=%c,verb:%d,debug:0x%x,"
12752: "led:%c,settle:%d,irqm:0x%x,nvram:0x%x,pcifix:0x%x\n",
12753: YesNo(driver_setup.master_parity),
12754: YesNo(driver_setup.scsi_parity),
12755: YesNo(driver_setup.force_sync_nego),
12756: driver_setup.verbose,
12757: driver_setup.debug,
12758: YesNo(driver_setup.led_pin),
12759: driver_setup.settle_delay,
12760: driver_setup.irqm,
12761: driver_setup.use_nvram,
12762: driver_setup.pci_fix_up);
12763: #undef YesNo
12764: }
12765:
12766: /*===================================================================
12767: ** SYM53C8XX devices description table and chip ids list.
12768: **===================================================================
12769: */
12770:
12771: static ncr_chip ncr_chip_table[] __initdata = SCSI_NCR_CHIP_TABLE;
12772: static ushort ncr_chip_ids[] __initdata = SCSI_NCR_CHIP_IDS;
12773:
12774: #ifdef SCSI_NCR_PQS_PDS_SUPPORT
12775: /*===================================================================
12776: ** Detect all NCR PQS/PDS boards and keep track of their bus nr.
12777: **
12778: ** The NCR PQS or PDS card is constructed as a DEC bridge
12779: ** behind which sit a proprietary NCR memory controller and
12780: ** four or two 53c875s as separate devices. In its usual mode
12781: ** of operation, the 875s are slaved to the memory controller
12782: ** for all transfers. We can tell if an 875 is part of a
12783: ** PQS/PDS or not since if it is, it will be on the same bus
12784: ** as the memory controller. To operate with the Linux
12785: ** driver, the memory controller is disabled and the 875s
12786: ** freed to function independently. The only wrinkle is that
12787: ** the preset SCSI ID (which may be zero) must be read in from
12788: ** a special configuration space register of the 875
12789: **===================================================================
12790: */
12791: #define SCSI_NCR_MAX_PQS_BUS 16
12792: static int pqs_bus[SCSI_NCR_MAX_PQS_BUS] __initdata = { 0 };
12793:
12794: static void __init ncr_detect_pqs_pds(void)
12795: {
12796: short index;
12797: pcidev_t dev = PCIDEV_NULL;
12798:
12799: for(index=0; index < SCSI_NCR_MAX_PQS_BUS; index++) {
12800: u_char tmp;
12801:
12802: dev = pci_find_device(0x101a, 0x0009, dev);
12803: if (dev == PCIDEV_NULL) {
12804: pqs_bus[index] = -1;
12805: break;
12806: }
12807: printk(KERN_INFO NAME53C8XX ": NCR PQS/PDS memory controller detected on bus %d\n", PciBusNumber(dev));
12808: pci_read_config_byte(dev, 0x44, &tmp);
12809: /* bit 1: allow individual 875 configuration */
12810: tmp |= 0x2;
12811: pci_write_config_byte(dev, 0x44, tmp);
12812: pci_read_config_byte(dev, 0x45, &tmp);
12813: /* bit 2: drive individual 875 interrupts to the bus */
12814: tmp |= 0x4;
12815: pci_write_config_byte(dev, 0x45, tmp);
12816:
12817: pqs_bus[index] = PciBusNumber(dev);
12818: }
12819: }
12820: #endif /* SCSI_NCR_PQS_PDS_SUPPORT */
12821:
12822: /*===================================================================
12823: ** Detect all 53c8xx hosts and then attach them.
12824: **
12825: ** If we are using NVRAM, once all hosts are detected, we need to
12826: ** check any NVRAM for boot order in case detect and boot order
12827: ** differ and attach them using the order in the NVRAM.
12828: **
12829: ** If no NVRAM is found or data appears invalid attach boards in
12830: ** the the order they are detected.
12831: **===================================================================
12832: */
12833: int __init sym53c8xx_detect(Scsi_Host_Template *tpnt)
12834: {
12835: pcidev_t pcidev;
12836: int i, j, chips, hosts, count;
12837: int attach_count = 0;
12838: ncr_device *devtbl, *devp;
12839: #ifdef SCSI_NCR_NVRAM_SUPPORT
12840: ncr_nvram nvram0, nvram, *nvp;
12841: #endif
12842:
12843: /*
12844: ** PCI is required.
12845: */
12846: if (!pci_present())
12847: return 0;
12848:
12849: /*
12850: ** Initialize driver general stuff.
12851: */
12852: #ifdef SCSI_NCR_PROC_INFO_SUPPORT
12853: #if LINUX_VERSION_CODE < LinuxVersionCode(2,3,27)
12854: tpnt->proc_dir = &proc_scsi_sym53c8xx;
12855: #else
12856: tpnt->proc_name = NAME53C8XX;
12857: #endif
12858: tpnt->proc_info = sym53c8xx_proc_info;
12859: #endif
12860:
12861: #if defined(SCSI_NCR_BOOT_COMMAND_LINE_SUPPORT) && defined(MODULE)
12862: if (sym53c8xx)
12863: sym53c8xx_setup(sym53c8xx);
12864: #endif
12865: #ifdef SCSI_NCR_DEBUG_INFO_SUPPORT
12866: ncr_debug = driver_setup.debug;
12867: #endif
12868:
12869: if (initverbose >= 2)
12870: ncr_print_driver_setup();
12871:
12872: /*
12873: ** Allocate the device table since we donnot want to
12874: ** overflow the kernel stack.
12875: ** 1 x 4K PAGE is enough for more than 40 devices for i386.
12876: */
12877: devtbl = m_calloc(PAGE_SIZE, "devtbl");
12878: if (!devtbl)
12879: return 0;
12880:
12881: /*
12882: ** Detect all NCR PQS/PDS memory controllers.
12883: */
12884: #ifdef SCSI_NCR_PQS_PDS_SUPPORT
12885: ncr_detect_pqs_pds();
12886: #endif
12887:
12888: /*
12889: ** Detect all 53c8xx hosts.
12890: ** Save the first Symbios NVRAM content if any
12891: ** for the boot order.
12892: */
12893: chips = sizeof(ncr_chip_ids) / sizeof(ncr_chip_ids[0]);
12894: hosts = PAGE_SIZE / sizeof(*devtbl);
12895: #ifdef SCSI_NCR_NVRAM_SUPPORT
12896: nvp = (driver_setup.use_nvram & 0x1) ? &nvram0 : 0;
12897: #endif
12898: j = 0;
12899: count = 0;
12900: pcidev = PCIDEV_NULL;
12901: while (1) {
12902: char *msg = "";
12903: if (count >= hosts)
12904: break;
12905: if (j >= chips)
12906: break;
12907: i = driver_setup.reverse_probe ? chips - 1 - j : j;
12908: pcidev = pci_find_device(PCI_VENDOR_ID_NCR, ncr_chip_ids[i],
12909: pcidev);
12910: if (pcidev == PCIDEV_NULL) {
12911: ++j;
12912: continue;
12913: }
12914: /* Some HW as the HP LH4 may report twice PCI devices */
12915: for (i = 0; i < count ; i++) {
12916: if (devtbl[i].slot.bus == PciBusNumber(pcidev) &&
12917: devtbl[i].slot.device_fn == PciDeviceFn(pcidev))
12918: break;
12919: }
12920: if (i != count) /* Ignore this device if we already have it */
12921: continue;
12922: devp = &devtbl[count];
12923: devp->host_id = driver_setup.host_id;
12924: devp->attach_done = 0;
12925: if (sym53c8xx_pci_init(tpnt, pcidev, devp)) {
12926: continue;
12927: }
12928: ++count;
12929: #ifdef SCSI_NCR_NVRAM_SUPPORT
12930: if (nvp) {
12931: ncr_get_nvram(devp, nvp);
12932: switch(nvp->type) {
12933: case SCSI_NCR_SYMBIOS_NVRAM:
12934: /*
12935: * Switch to the other nvram buffer, so that
12936: * nvram0 will contain the first Symbios
12937: * format NVRAM content with boot order.
12938: */
12939: nvp = &nvram;
12940: msg = "with Symbios NVRAM";
12941: break;
12942: case SCSI_NCR_TEKRAM_NVRAM:
12943: msg = "with Tekram NVRAM";
12944: break;
12945: }
12946: }
12947: #endif
12948: #ifdef SCSI_NCR_PQS_PDS_SUPPORT
12949: if (devp->pqs_pds)
12950: msg = "(NCR PQS/PDS)";
12951: #endif
12952: printk(KERN_INFO NAME53C8XX ": 53c%s detected %s\n",
12953: devp->chip.name, msg);
12954: }
12955:
12956: /*
12957: ** If we have found a SYMBIOS NVRAM, use first the NVRAM boot
12958: ** sequence as device boot order.
12959: ** check devices in the boot record against devices detected.
12960: ** attach devices if we find a match. boot table records that
12961: ** do not match any detected devices will be ignored.
12962: ** devices that do not match any boot table will not be attached
12963: ** here but will attempt to be attached during the device table
12964: ** rescan.
12965: */
12966: #ifdef SCSI_NCR_NVRAM_SUPPORT
12967: if (!nvp || nvram0.type != SCSI_NCR_SYMBIOS_NVRAM)
12968: goto next;
12969: for (i = 0; i < 4; i++) {
12970: Symbios_host *h = &nvram0.data.Symbios.host[i];
12971: for (j = 0 ; j < count ; j++) {
12972: devp = &devtbl[j];
12973: if (h->device_fn != devp->slot.device_fn ||
12974: h->bus_nr != devp->slot.bus ||
12975: h->device_id != devp->chip.device_id)
12976: continue;
12977: if (devp->attach_done)
12978: continue;
12979: if (h->flags & SYMBIOS_INIT_SCAN_AT_BOOT) {
12980: ncr_get_nvram(devp, nvp);
12981: if (!ncr_attach (tpnt, attach_count, devp))
12982: attach_count++;
12983: }
12984: else if (!(driver_setup.use_nvram & 0x80))
12985: printk(KERN_INFO NAME53C8XX
12986: ": 53c%s state OFF thus not attached\n",
12987: devp->chip.name);
12988: else
12989: continue;
12990:
12991: devp->attach_done = 1;
12992: break;
12993: }
12994: }
12995: next:
12996: #endif
12997:
12998: /*
12999: ** Rescan device list to make sure all boards attached.
13000: ** Devices without boot records will not be attached yet
13001: ** so try to attach them here.
13002: */
13003: for (i= 0; i < count; i++) {
13004: devp = &devtbl[i];
13005: if (!devp->attach_done) {
13006: #ifdef SCSI_NCR_NVRAM_SUPPORT
13007: ncr_get_nvram(devp, nvp);
13008: #endif
13009: if (!ncr_attach (tpnt, attach_count, devp))
13010: attach_count++;
13011: }
13012: }
13013:
13014: m_free(devtbl, PAGE_SIZE, "devtbl");
13015:
13016: return attach_count;
13017: }
13018:
13019: /*===================================================================
13020: ** Read and check the PCI configuration for any detected NCR
13021: ** boards and save data for attaching after all boards have
13022: ** been detected.
13023: **===================================================================
13024: */
13025: static int __init
13026: sym53c8xx_pci_init(Scsi_Host_Template *tpnt, pcidev_t pdev, ncr_device *device)
13027: {
13028: u_short vendor_id, device_id, command, status_reg;
13029: u_char cache_line_size, latency_timer;
13030: u_char suggested_cache_line_size = 0;
13031: u_char pci_fix_up = driver_setup.pci_fix_up;
13032: u_char revision;
13033: u_int irq;
13034: u_long base, base_2, io_port;
13035: int i;
13036: ncr_chip *chip;
13037:
13038: printk(KERN_INFO NAME53C8XX ": at PCI bus %d, device %d, function %d\n",
13039: PciBusNumber(pdev),
13040: (int) (PciDeviceFn(pdev) & 0xf8) >> 3,
13041: (int) (PciDeviceFn(pdev) & 7));
13042:
13043: #ifdef SCSI_NCR_DYNAMIC_DMA_MAPPING
13044: if (!pci_dma_supported(pdev, (dma_addr_t) (0xffffffffUL))) {
13045: printk(KERN_WARNING NAME53C8XX
13046: "32 BIT PCI BUS DMA ADDRESSING NOT SUPPORTED\n");
13047: return -1;
13048: }
13049: #endif
13050:
13051: /*
13052: ** Read info from the PCI config space.
13053: ** pci_read_config_xxx() functions are assumed to be used for
13054: ** successfully detected PCI devices.
13055: */
13056: vendor_id = PciVendorId(pdev);
13057: device_id = PciDeviceId(pdev);
13058: irq = PciIrqLine(pdev);
13059: i = 0;
13060: i = pci_get_base_address(pdev, i, &io_port);
13061: i = pci_get_base_address(pdev, i, &base);
13062: (void) pci_get_base_address(pdev, i, &base_2);
13063:
13064: pci_read_config_word(pdev, PCI_COMMAND, &command);
13065: pci_read_config_byte(pdev, PCI_CLASS_REVISION, &revision);
13066: pci_read_config_byte(pdev, PCI_CACHE_LINE_SIZE, &cache_line_size);
13067: pci_read_config_byte(pdev, PCI_LATENCY_TIMER, &latency_timer);
13068: pci_read_config_word(pdev, PCI_STATUS, &status_reg);
13069:
13070: #ifdef SCSI_NCR_PQS_PDS_SUPPORT
13071: /*
13072: ** Match the BUS number for PQS/PDS devices.
13073: ** Read the SCSI ID from a special register mapped
13074: ** into the configuration space of the individual
13075: ** 875s. This register is set up by the PQS bios
13076: */
13077: for(i = 0; i < SCSI_NCR_MAX_PQS_BUS && pqs_bus[i] != -1; i++) {
13078: u_char tmp;
13079: if (pqs_bus[i] == PciBusNumber(pdev)) {
13080: pci_read_config_byte(pdev, 0x84, &tmp);
13081: device->pqs_pds = 1;
13082: device->host_id = tmp;
13083: break;
13084: }
13085: }
13086: #endif /* SCSI_NCR_PQS_PDS_SUPPORT */
13087:
13088: /*
13089: ** If user excludes this chip, donnot initialize it.
13090: */
13091: for (i = 0 ; i < SCSI_NCR_MAX_EXCLUDES ; i++) {
13092: if (driver_setup.excludes[i] ==
13093: (io_port & PCI_BASE_ADDRESS_IO_MASK))
13094: return -1;
13095: }
13096: /*
13097: ** Check if the chip is supported
13098: */
13099: chip = 0;
13100: for (i = 0; i < sizeof(ncr_chip_table)/sizeof(ncr_chip_table[0]); i++) {
13101: if (device_id != ncr_chip_table[i].device_id)
13102: continue;
13103: if (revision > ncr_chip_table[i].revision_id)
13104: continue;
13105: if (!(ncr_chip_table[i].features & FE_LDSTR))
13106: break;
13107: chip = &device->chip;
13108: memcpy(chip, &ncr_chip_table[i], sizeof(*chip));
13109: chip->revision_id = revision;
13110: break;
13111: }
13112:
13113: /*
13114: ** Ignore Symbios chips controlled by SISL RAID controller.
13115: ** This controller sets value 0x52414944 at RAM end - 16.
13116: */
13117: #if defined(__i386__) && !defined(SCSI_NCR_PCI_MEM_NOT_SUPPORTED)
13118: if (chip && (base_2 & PCI_BASE_ADDRESS_MEM_MASK)) {
13119: unsigned int ram_size, ram_val;
13120: u_long ram_ptr;
13121:
13122: if (chip->features & FE_RAM8K)
13123: ram_size = 8192;
13124: else
13125: ram_size = 4096;
13126:
13127: ram_ptr = remap_pci_mem(base_2 & PCI_BASE_ADDRESS_MEM_MASK,
13128: ram_size);
13129: if (ram_ptr) {
13130: ram_val = readl_raw(ram_ptr + ram_size - 16);
13131: unmap_pci_mem(ram_ptr, ram_size);
13132: if (ram_val == 0x52414944) {
13133: printk(NAME53C8XX": not initializing, "
13134: "driven by SISL RAID controller.\n");
13135: return -1;
13136: }
13137: }
13138: }
13139: #endif /* i386 and PCI MEMORY accessible */
13140:
13141: if (!chip) {
13142: printk(NAME53C8XX ": not initializing, device not supported\n");
13143: return -1;
13144: }
13145:
13146: #ifdef __powerpc__
13147: /*
13148: ** Fix-up for power/pc.
13149: ** Should not be performed by the driver.
13150: */
13151: if ((command & (PCI_COMMAND_IO | PCI_COMMAND_MEMORY))
13152: != (PCI_COMMAND_IO | PCI_COMMAND_MEMORY)) {
13153: printk(NAME53C8XX ": setting%s%s...\n",
13154: (command & PCI_COMMAND_IO) ? "" : " PCI_COMMAND_IO",
13155: (command & PCI_COMMAND_MEMORY) ? "" : " PCI_COMMAND_MEMORY");
13156: command |= (PCI_COMMAND_IO | PCI_COMMAND_MEMORY);
13157: pci_write_config_word(pdev, PCI_COMMAND, command);
13158: }
13159:
13160: #if LINUX_VERSION_CODE < LinuxVersionCode(2,2,0)
13161: if ( is_prep ) {
13162: if (io_port >= 0x10000000) {
13163: printk(NAME53C8XX ": reallocating io_port (Wacky IBM)");
13164: io_port = (io_port & 0x00FFFFFF) | 0x01000000;
13165: pci_write_config_dword(pdev,
13166: PCI_BASE_ADDRESS_0, io_port);
13167: }
13168: if (base >= 0x10000000) {
13169: printk(NAME53C8XX ": reallocating base (Wacky IBM)");
13170: base = (base & 0x00FFFFFF) | 0x01000000;
13171: pci_write_config_dword(pdev,
13172: PCI_BASE_ADDRESS_1, base);
13173: }
13174: if (base_2 >= 0x10000000) {
13175: printk(NAME53C8XX ": reallocating base2 (Wacky IBM)");
13176: base_2 = (base_2 & 0x00FFFFFF) | 0x01000000;
13177: pci_write_config_dword(pdev,
13178: PCI_BASE_ADDRESS_2, base_2);
13179: }
13180: }
13181: #endif
13182: #endif /* __powerpc__ */
13183:
13184: #if defined(__sparc__) && (LINUX_VERSION_CODE < LinuxVersionCode(2,3,0))
13185: /*
13186: ** Fix-ups for sparc.
13187: **
13188: ** I wrote: Should not be performed by the driver,
13189: ** Guy wrote: but how can OBP know each and every PCI card,
13190: ** if they don't use Fcode?
13191: ** I replied: no need to know each and every PCI card, just
13192: ** be skilled enough to understand the PCI specs.
13193: */
13194:
13195: /*
13196: ** PCI configuration is based on configuration registers being
13197: ** coherent with hardware and software resource identifications.
13198: ** This is fairly simple, but seems still too complex for Sparc.
13199: */
13200: base = __pa(base);
13201: base_2 = __pa(base_2);
13202:
13203: if (!cache_line_size)
13204: suggested_cache_line_size = 16;
13205:
13206: driver_setup.pci_fix_up |= 0x7;
13207:
13208: #endif /* __sparc__ */
13209:
13210: #if defined(__i386__) && !defined(MODULE)
13211: if (!cache_line_size) {
13212: #if LINUX_VERSION_CODE < LinuxVersionCode(2,1,75)
13213: extern char x86;
13214: switch(x86) {
13215: #else
13216: switch(boot_cpu_data.x86) {
13217: #endif
13218: case 4: suggested_cache_line_size = 4; break;
13219: case 6:
13220: case 5: suggested_cache_line_size = 8; break;
13221: }
13222: }
13223: #endif /* __i386__ */
13224:
13225: /*
13226: ** Check availability of IO space, memory space.
13227: ** Enable master capability if not yet.
13228: **
13229: ** We shouldn't have to care about the IO region when
13230: ** we are using MMIO. But calling check_region() from
13231: ** both the ncr53c8xx and the sym53c8xx drivers prevents
13232: ** from attaching devices from the both drivers.
13233: ** If you have a better idea, let me know.
13234: */
13235: /* #ifdef SCSI_NCR_IOMAPPED */
13236: #if 1
13237: if (!(command & PCI_COMMAND_IO)) {
13238: printk(NAME53C8XX ": I/O base address (0x%lx) disabled.\n",
13239: (long) io_port);
13240: io_port = 0;
13241: }
13242: #endif
13243: if (!(command & PCI_COMMAND_MEMORY)) {
13244: printk(NAME53C8XX ": PCI_COMMAND_MEMORY not set.\n");
13245: base = 0;
13246: base_2 = 0;
13247: }
13248: io_port &= PCI_BASE_ADDRESS_IO_MASK;
13249: base &= PCI_BASE_ADDRESS_MEM_MASK;
13250: base_2 &= PCI_BASE_ADDRESS_MEM_MASK;
13251:
13252: /* #ifdef SCSI_NCR_IOMAPPED */
13253: #if 1
13254: if (io_port && check_region (io_port, 128)) {
13255: printk(NAME53C8XX ": IO region 0x%lx[0..127] is in use\n",
13256: (long) io_port);
13257: io_port = 0;
13258: }
13259: if (!io_port)
13260: return -1;
13261: #endif
13262: #ifndef SCSI_NCR_IOMAPPED
13263: if (!base) {
13264: printk(NAME53C8XX ": MMIO base address disabled.\n");
13265: return -1;
13266: }
13267: #endif
13268:
13269: /*
13270: ** Set MASTER capable and PARITY bit, if not yet.
13271: */
13272: if ((command & (PCI_COMMAND_MASTER | PCI_COMMAND_PARITY))
13273: != (PCI_COMMAND_MASTER | PCI_COMMAND_PARITY)) {
13274: printk(NAME53C8XX ": setting%s%s...(fix-up)\n",
13275: (command & PCI_COMMAND_MASTER) ? "" : " PCI_COMMAND_MASTER",
13276: (command & PCI_COMMAND_PARITY) ? "" : " PCI_COMMAND_PARITY");
13277: command |= (PCI_COMMAND_MASTER | PCI_COMMAND_PARITY);
13278: pci_write_config_word(pdev, PCI_COMMAND, command);
13279: }
13280:
13281: /*
13282: ** Fix some features according to driver setup.
13283: */
13284: if (!(driver_setup.special_features & 1))
13285: chip->features &= ~FE_SPECIAL_SET;
13286: else {
13287: if (driver_setup.special_features & 2)
13288: chip->features &= ~FE_WRIE;
13289: if (driver_setup.special_features & 4)
13290: chip->features &= ~FE_NOPM;
13291: }
13292:
13293: /*
13294: ** Work around for errant bit in 895A. The 66Mhz
13295: ** capable bit is set erroneously. Clear this bit.
13296: ** (Item 1 DEL 533)
13297: **
13298: ** Make sure Config space and Features agree.
13299: **
13300: ** Recall: writes are not normal to status register -
13301: ** write a 1 to clear and a 0 to leave unchanged.
13302: ** Can only reset bits.
13303: */
13304: if (chip->features & FE_66MHZ) {
13305: if (!(status_reg & PCI_STATUS_66MHZ))
13306: chip->features &= ~FE_66MHZ;
13307: }
13308: else {
13309: if (status_reg & PCI_STATUS_66MHZ) {
13310: status_reg = PCI_STATUS_66MHZ;
13311: pci_write_config_word(pdev, PCI_STATUS, status_reg);
13312: pci_read_config_word(pdev, PCI_STATUS, &status_reg);
13313: }
13314: }
13315:
13316: if (driver_setup.ultra_scsi < 3 && (chip->features & FE_ULTRA3)) {
13317: chip->features |= FE_ULTRA2;
13318: chip->features &= ~FE_ULTRA3;
13319: }
13320: if (driver_setup.ultra_scsi < 2 && (chip->features & FE_ULTRA2)) {
13321: chip->features |= FE_ULTRA;
13322: chip->features &= ~FE_ULTRA2;
13323: }
13324: if (driver_setup.ultra_scsi < 1)
13325: chip->features &= ~FE_ULTRA;
13326:
13327: if (!driver_setup.max_wide)
13328: chip->features &= ~FE_WIDE;
13329:
13330: /*
13331: * C1010 Ultra3 support requires 16 bit data transfers.
13332: */
13333: if (!driver_setup.max_wide && (chip->features & FE_ULTRA3)) {
13334: chip->features |= FE_ULTRA2;
13335: chip->features |= ~FE_ULTRA3;
13336: }
13337:
13338: /*
13339: ** Some features are required to be enabled in order to
13340: ** work around some chip problems. :) ;)
13341: ** (ITEM 12 of a DEL about the 896 I haven't yet).
13342: ** We must ensure the chip will use WRITE AND INVALIDATE.
13343: ** The revision number limit is for now arbitrary.
13344: */
13345: if (device_id == PCI_DEVICE_ID_NCR_53C896 && revision <= 0x10) {
13346: chip->features |= (FE_WRIE | FE_CLSE);
13347: pci_fix_up |= 3; /* Force appropriate PCI fix-up */
13348: }
13349:
13350: #ifdef SCSI_NCR_PCI_FIX_UP_SUPPORT
13351: /*
13352: ** Try to fix up PCI config according to wished features.
13353: */
13354: if ((pci_fix_up & 1) && (chip->features & FE_CLSE) &&
13355: !cache_line_size && suggested_cache_line_size) {
13356: cache_line_size = suggested_cache_line_size;
13357: pci_write_config_byte(pdev,
13358: PCI_CACHE_LINE_SIZE, cache_line_size);
13359: printk(NAME53C8XX ": PCI_CACHE_LINE_SIZE set to %d (fix-up).\n",
13360: cache_line_size);
13361: }
13362:
13363: if ((pci_fix_up & 2) && cache_line_size &&
13364: (chip->features & FE_WRIE) && !(command & PCI_COMMAND_INVALIDATE)) {
13365: printk(NAME53C8XX": setting PCI_COMMAND_INVALIDATE (fix-up)\n");
13366: command |= PCI_COMMAND_INVALIDATE;
13367: pci_write_config_word(pdev, PCI_COMMAND, command);
13368: }
13369:
13370: /*
13371: ** Tune PCI LATENCY TIMER according to burst max length transfer.
13372: ** (latency timer >= burst length + 6, we add 10 to be quite sure)
13373: */
13374:
13375: if (chip->burst_max && (latency_timer == 0 || (pci_fix_up & 4))) {
13376: uchar lt = (1 << chip->burst_max) + 6 + 10;
13377: if (latency_timer < lt) {
13378: printk(NAME53C8XX
13379: ": changing PCI_LATENCY_TIMER from %d to %d.\n",
13380: (int) latency_timer, (int) lt);
13381: latency_timer = lt;
13382: pci_write_config_byte(pdev,
13383: PCI_LATENCY_TIMER, latency_timer);
13384: }
13385: }
13386:
13387: #endif /* SCSI_NCR_PCI_FIX_UP_SUPPORT */
13388:
13389: /*
13390: ** Initialise ncr_device structure with items required by ncr_attach.
13391: */
13392: device->pdev = pdev;
13393: device->slot.bus = PciBusNumber(pdev);
13394: device->slot.device_fn = PciDeviceFn(pdev);
13395: device->slot.base = base;
13396: device->slot.base_2 = base_2;
13397: device->slot.io_port = io_port;
13398: device->slot.irq = irq;
13399: device->attach_done = 0;
13400:
13401: return 0;
13402: }
13403:
13404:
13405: /*===================================================================
13406: ** Detect and try to read SYMBIOS and TEKRAM NVRAM.
13407: **
13408: ** Data can be used to order booting of boards.
13409: **
13410: ** Data is saved in ncr_device structure if NVRAM found. This
13411: ** is then used to find drive boot order for ncr_attach().
13412: **
13413: ** NVRAM data is passed to Scsi_Host_Template later during
13414: ** ncr_attach() for any device set up.
13415: *===================================================================
13416: */
13417: #ifdef SCSI_NCR_NVRAM_SUPPORT
13418: static void __init ncr_get_nvram(ncr_device *devp, ncr_nvram *nvp)
13419: {
13420: devp->nvram = nvp;
13421: if (!nvp)
13422: return;
13423: /*
13424: ** Get access to chip IO registers
13425: */
13426: #ifdef SCSI_NCR_IOMAPPED
13427: request_region(devp->slot.io_port, 128, NAME53C8XX);
13428: devp->slot.base_io = devp->slot.io_port;
13429: #else
13430: devp->slot.reg = (struct ncr_reg *) remap_pci_mem(devp->slot.base, 128);
13431: if (!devp->slot.reg)
13432: return;
13433: #endif
13434:
13435: /*
13436: ** Try to read SYMBIOS nvram.
13437: ** Try to read TEKRAM nvram if Symbios nvram not found.
13438: */
13439: if (!sym_read_Symbios_nvram(&devp->slot, &nvp->data.Symbios))
13440: nvp->type = SCSI_NCR_SYMBIOS_NVRAM;
13441: else if (!sym_read_Tekram_nvram(&devp->slot, devp->chip.device_id,
13442: &nvp->data.Tekram))
13443: nvp->type = SCSI_NCR_TEKRAM_NVRAM;
13444: else {
13445: nvp->type = 0;
13446: devp->nvram = 0;
13447: }
13448:
13449: /*
13450: ** Release access to chip IO registers
13451: */
13452: #ifdef SCSI_NCR_IOMAPPED
13453: release_region(devp->slot.base_io, 128);
13454: #else
13455: unmap_pci_mem((u_long) devp->slot.reg, 128ul);
13456: #endif
13457:
13458: }
13459: #endif /* SCSI_NCR_NVRAM_SUPPORT */
13460:
13461: /*
13462: ** Linux select queue depths function
13463: */
13464:
13465: #define DEF_DEPTH (driver_setup.default_tags)
13466: #define ALL_TARGETS -2
13467: #define NO_TARGET -1
13468: #define ALL_LUNS -2
13469: #define NO_LUN -1
13470:
13471: static int device_queue_depth(ncb_p np, int target, int lun)
13472: {
13473: int c, h, t, u, v;
13474: char *p = driver_setup.tag_ctrl;
13475: char *ep;
13476:
13477: h = -1;
13478: t = NO_TARGET;
13479: u = NO_LUN;
13480: while ((c = *p++) != 0) {
13481: v = simple_strtoul(p, &ep, 0);
13482: switch(c) {
13483: case '/':
13484: ++h;
13485: t = ALL_TARGETS;
13486: u = ALL_LUNS;
13487: break;
13488: case 't':
13489: if (t != target)
13490: t = (target == v) ? v : NO_TARGET;
13491: u = ALL_LUNS;
13492: break;
13493: case 'u':
13494: if (u != lun)
13495: u = (lun == v) ? v : NO_LUN;
13496: break;
13497: case 'q':
13498: if (h == np->unit &&
13499: (t == ALL_TARGETS || t == target) &&
13500: (u == ALL_LUNS || u == lun))
13501: return v;
13502: break;
13503: case '-':
13504: t = ALL_TARGETS;
13505: u = ALL_LUNS;
13506: break;
13507: default:
13508: break;
13509: }
13510: p = ep;
13511: }
13512: return DEF_DEPTH;
13513: }
13514:
13515: static void sym53c8xx_select_queue_depths(struct Scsi_Host *host, struct scsi_device *devlist)
13516: {
13517: struct scsi_device *device;
13518:
13519: for (device = devlist; device; device = device->next) {
13520: ncb_p np;
13521: tcb_p tp;
13522: lcb_p lp;
13523: int numtags;
13524:
13525: if (device->host != host)
13526: continue;
13527:
13528: np = ((struct host_data *) host->hostdata)->ncb;
13529: tp = &np->target[device->id];
13530: lp = ncr_lp(np, tp, device->lun);
13531:
13532: /*
13533: ** Select queue depth from driver setup.
13534: ** Donnot use more than configured by user.
13535: ** Use at least 2.
13536: ** Donnot use more than our maximum.
13537: */
13538: numtags = device_queue_depth(np, device->id, device->lun);
13539: if (numtags > tp->usrtags)
13540: numtags = tp->usrtags;
13541: if (!device->tagged_supported)
13542: numtags = 1;
13543: device->queue_depth = numtags;
13544: if (device->queue_depth < 2)
13545: device->queue_depth = 2;
13546: if (device->queue_depth > MAX_TAGS)
13547: device->queue_depth = MAX_TAGS;
13548:
13549: /*
13550: ** Since the queue depth is not tunable under Linux,
13551: ** we need to know this value in order not to
13552: ** announce stupid things to user.
13553: */
13554: if (lp) {
13555: lp->numtags = lp->maxtags = numtags;
13556: lp->scdev_depth = device->queue_depth;
13557: }
13558: ncr_setup_tags (np, device->id, device->lun);
13559:
13560: #ifdef DEBUG_SYM53C8XX
13561: printk("sym53c8xx_select_queue_depth: host=%d, id=%d, lun=%d, depth=%d\n",
13562: np->unit, device->id, device->lun, device->queue_depth);
13563: #endif
13564: }
13565: }
13566:
13567: /*
13568: ** Linux entry point for info() function
13569: */
13570: const char *sym53c8xx_info (struct Scsi_Host *host)
13571: {
13572: return SCSI_NCR_DRIVER_NAME;
13573: }
13574:
13575: /*
13576: ** Linux entry point of queuecommand() function
13577: */
13578:
13579: int sym53c8xx_queue_command (Scsi_Cmnd *cmd, void (* done)(Scsi_Cmnd *))
13580: {
13581: ncb_p np = ((struct host_data *) cmd->host->hostdata)->ncb;
13582: unsigned long flags;
13583: int sts;
13584:
13585: #ifdef DEBUG_SYM53C8XX
13586: printk("sym53c8xx_queue_command\n");
13587: #endif
13588:
13589: cmd->scsi_done = done;
13590: cmd->host_scribble = NULL;
13591: cmd->SCp.ptr = NULL;
13592: cmd->SCp.buffer = NULL;
13593: #ifdef SCSI_NCR_DYNAMIC_DMA_MAPPING
13594: cmd->__data_mapped = 0;
13595: cmd->__data_mapping = 0;
13596: #endif
13597:
13598: NCR_LOCK_NCB(np, flags);
13599:
13600: if ((sts = ncr_queue_command(np, cmd)) != DID_OK) {
13601: SetScsiResult(cmd, sts, 0);
13602: #ifdef DEBUG_SYM53C8XX
13603: printk("sym53c8xx : command not queued - result=%d\n", sts);
13604: #endif
13605: }
13606: #ifdef DEBUG_SYM53C8XX
13607: else
13608: printk("sym53c8xx : command successfully queued\n");
13609: #endif
13610:
13611: NCR_UNLOCK_NCB(np, flags);
13612:
13613: if (sts != DID_OK) {
13614: unmap_scsi_data(np, cmd);
13615: done(cmd);
13616: }
13617:
13618: return sts;
13619: }
13620:
13621: /*
13622: ** Linux entry point of the interrupt handler.
13623: ** Since linux versions > 1.3.70, we trust the kernel for
13624: ** passing the internal host descriptor as 'dev_id'.
13625: ** Otherwise, we scan the host list and call the interrupt
13626: ** routine for each host that uses this IRQ.
13627: */
13628:
13629: static void sym53c8xx_intr(int irq, void *dev_id, struct pt_regs * regs)
13630: {
13631: unsigned long flags;
13632: ncb_p np = (ncb_p) dev_id;
13633: Scsi_Cmnd *done_list;
13634:
13635: #ifdef DEBUG_SYM53C8XX
13636: printk("sym53c8xx : interrupt received\n");
13637: #endif
13638:
13639: if (DEBUG_FLAGS & DEBUG_TINY) printk ("[");
13640:
13641: NCR_LOCK_NCB(np, flags);
13642: ncr_exception(np);
13643: done_list = np->done_list;
13644: np->done_list = 0;
13645: NCR_UNLOCK_NCB(np, flags);
13646:
13647: if (DEBUG_FLAGS & DEBUG_TINY) printk ("]\n");
13648:
13649: if (done_list) {
13650: NCR_LOCK_SCSI_DONE(np, flags);
13651: ncr_flush_done_cmds(done_list);
13652: NCR_UNLOCK_SCSI_DONE(np, flags);
13653: }
13654: }
13655:
13656: /*
13657: ** Linux entry point of the timer handler
13658: */
13659:
13660: static void sym53c8xx_timeout(unsigned long npref)
13661: {
13662: ncb_p np = (ncb_p) npref;
13663: unsigned long flags;
13664: Scsi_Cmnd *done_list;
13665:
13666: NCR_LOCK_NCB(np, flags);
13667: ncr_timeout((ncb_p) np);
13668: done_list = np->done_list;
13669: np->done_list = 0;
13670: NCR_UNLOCK_NCB(np, flags);
13671:
13672: if (done_list) {
13673: NCR_LOCK_SCSI_DONE(np, flags);
13674: ncr_flush_done_cmds(done_list);
13675: NCR_UNLOCK_SCSI_DONE(np, flags);
13676: }
13677: }
13678:
13679: /*
13680: ** Linux entry point of reset() function
13681: */
13682:
13683: #if defined SCSI_RESET_SYNCHRONOUS && defined SCSI_RESET_ASYNCHRONOUS
13684: int sym53c8xx_reset(Scsi_Cmnd *cmd, unsigned int reset_flags)
13685: #else
13686: int sym53c8xx_reset(Scsi_Cmnd *cmd)
13687: #endif
13688: {
13689: ncb_p np = ((struct host_data *) cmd->host->hostdata)->ncb;
13690: int sts;
13691: unsigned long flags;
13692: Scsi_Cmnd *done_list;
13693:
13694: #if defined SCSI_RESET_SYNCHRONOUS && defined SCSI_RESET_ASYNCHRONOUS
13695: printk("sym53c8xx_reset: pid=%lu reset_flags=%x serial_number=%ld serial_number_at_timeout=%ld\n",
13696: cmd->pid, reset_flags, cmd->serial_number, cmd->serial_number_at_timeout);
13697: #else
13698: printk("sym53c8xx_reset: command pid %lu\n", cmd->pid);
13699: #endif
13700:
13701: NCR_LOCK_NCB(np, flags);
13702:
13703: /*
13704: * We have to just ignore reset requests in some situations.
13705: */
13706: #if defined SCSI_RESET_NOT_RUNNING
13707: if (cmd->serial_number != cmd->serial_number_at_timeout) {
13708: sts = SCSI_RESET_NOT_RUNNING;
13709: goto out;
13710: }
13711: #endif
13712: /*
13713: * If the mid-level driver told us reset is synchronous, it seems
13714: * that we must call the done() callback for the involved command,
13715: * even if this command was not queued to the low-level driver,
13716: * before returning SCSI_RESET_SUCCESS.
13717: */
13718:
13719: #if defined SCSI_RESET_SYNCHRONOUS && defined SCSI_RESET_ASYNCHRONOUS
13720: sts = ncr_reset_bus(np, cmd,
13721: (reset_flags & (SCSI_RESET_SYNCHRONOUS | SCSI_RESET_ASYNCHRONOUS)) == SCSI_RESET_SYNCHRONOUS);
13722: #else
13723: sts = ncr_reset_bus(np, cmd, 0);
13724: #endif
13725:
13726: /*
13727: * Since we always reset the controller, when we return success,
13728: * we add this information to the return code.
13729: */
13730: #if defined SCSI_RESET_HOST_RESET
13731: if (sts == SCSI_RESET_SUCCESS)
13732: sts |= SCSI_RESET_HOST_RESET;
13733: #endif
13734:
13735: out:
13736: done_list = np->done_list;
13737: np->done_list = 0;
13738: NCR_UNLOCK_NCB(np, flags);
13739:
13740: ncr_flush_done_cmds(done_list);
13741:
13742: return sts;
13743: }
13744:
13745: /*
13746: ** Linux entry point of abort() function
13747: */
13748:
13749: int sym53c8xx_abort(Scsi_Cmnd *cmd)
13750: {
13751: ncb_p np = ((struct host_data *) cmd->host->hostdata)->ncb;
13752: int sts;
13753: unsigned long flags;
13754: Scsi_Cmnd *done_list;
13755:
13756: #if defined SCSI_RESET_SYNCHRONOUS && defined SCSI_RESET_ASYNCHRONOUS
13757: printk("sym53c8xx_abort: pid=%lu serial_number=%ld serial_number_at_timeout=%ld\n",
13758: cmd->pid, cmd->serial_number, cmd->serial_number_at_timeout);
13759: #else
13760: printk("sym53c8xx_abort: command pid %lu\n", cmd->pid);
13761: #endif
13762:
13763: NCR_LOCK_NCB(np, flags);
13764:
13765: #if defined SCSI_RESET_SYNCHRONOUS && defined SCSI_RESET_ASYNCHRONOUS
13766: /*
13767: * We have to just ignore abort requests in some situations.
13768: */
13769: if (cmd->serial_number != cmd->serial_number_at_timeout) {
13770: sts = SCSI_ABORT_NOT_RUNNING;
13771: goto out;
13772: }
13773: #endif
13774:
13775: sts = ncr_abort_command(np, cmd);
13776: out:
13777: done_list = np->done_list;
13778: np->done_list = 0;
13779: NCR_UNLOCK_NCB(np, flags);
13780:
13781: ncr_flush_done_cmds(done_list);
13782:
13783: return sts;
13784: }
13785:
13786:
13787: #ifdef MODULE
13788: int sym53c8xx_release(struct Scsi_Host *host)
13789: {
13790: #ifdef DEBUG_SYM53C8XX
13791: printk("sym53c8xx : release\n");
13792: #endif
13793: ncr_detach(((struct host_data *) host->hostdata)->ncb);
13794:
13795: return 1;
13796: }
13797: #endif
13798:
13799:
13800: /*
13801: ** Scsi command waiting list management.
13802: **
13803: ** It may happen that we cannot insert a scsi command into the start queue,
13804: ** in the following circumstances.
13805: ** Too few preallocated ccb(s),
13806: ** maxtags < cmd_per_lun of the Linux host control block,
13807: ** etc...
13808: ** Such scsi commands are inserted into a waiting list.
13809: ** When a scsi command complete, we try to requeue the commands of the
13810: ** waiting list.
13811: */
13812:
13813: #define next_wcmd host_scribble
13814:
13815: static void insert_into_waiting_list(ncb_p np, Scsi_Cmnd *cmd)
13816: {
13817: Scsi_Cmnd *wcmd;
13818:
13819: #ifdef DEBUG_WAITING_LIST
13820: printk("%s: cmd %lx inserted into waiting list\n", ncr_name(np), (u_long) cmd);
13821: #endif
13822: cmd->next_wcmd = 0;
13823: if (!(wcmd = np->waiting_list)) np->waiting_list = cmd;
13824: else {
13825: while ((wcmd->next_wcmd) != 0)
13826: wcmd = (Scsi_Cmnd *) wcmd->next_wcmd;
13827: wcmd->next_wcmd = (char *) cmd;
13828: }
13829: }
13830:
13831: static Scsi_Cmnd *retrieve_from_waiting_list(int to_remove, ncb_p np, Scsi_Cmnd *cmd)
13832: {
13833: Scsi_Cmnd **pcmd = &np->waiting_list;
13834:
13835: while (*pcmd) {
13836: if (cmd == *pcmd) {
13837: if (to_remove) {
13838: *pcmd = (Scsi_Cmnd *) cmd->next_wcmd;
13839: cmd->next_wcmd = 0;
13840: }
13841: #ifdef DEBUG_WAITING_LIST
13842: printk("%s: cmd %lx retrieved from waiting list\n", ncr_name(np), (u_long) cmd);
13843: #endif
13844: return cmd;
13845: }
13846: pcmd = (Scsi_Cmnd **) &(*pcmd)->next_wcmd;
13847: }
13848: return 0;
13849: }
13850:
13851: static void process_waiting_list(ncb_p np, int sts)
13852: {
13853: Scsi_Cmnd *waiting_list, *wcmd;
13854:
13855: waiting_list = np->waiting_list;
13856: np->waiting_list = 0;
13857:
13858: #ifdef DEBUG_WAITING_LIST
13859: if (waiting_list) printk("%s: waiting_list=%lx processing sts=%d\n", ncr_name(np), (u_long) waiting_list, sts);
13860: #endif
13861: while ((wcmd = waiting_list) != 0) {
13862: waiting_list = (Scsi_Cmnd *) wcmd->next_wcmd;
13863: wcmd->next_wcmd = 0;
13864: if (sts == DID_OK) {
13865: #ifdef DEBUG_WAITING_LIST
13866: printk("%s: cmd %lx trying to requeue\n", ncr_name(np), (u_long) wcmd);
13867: #endif
13868: sts = ncr_queue_command(np, wcmd);
13869: }
13870: if (sts != DID_OK) {
13871: #ifdef DEBUG_WAITING_LIST
13872: printk("%s: cmd %lx done forced sts=%d\n", ncr_name(np), (u_long) wcmd, sts);
13873: #endif
13874: SetScsiResult(wcmd, sts, 0);
13875: ncr_queue_done_cmd(np, wcmd);
13876: }
13877: }
13878: }
13879:
13880: #undef next_wcmd
13881:
13882: #ifdef SCSI_NCR_PROC_INFO_SUPPORT
13883:
13884: /*=========================================================================
13885: ** Proc file system stuff
13886: **
13887: ** A read operation returns adapter information.
13888: ** A write operation is a control command.
13889: ** The string is parsed in the driver code and the command is passed
13890: ** to the ncr_usercmd() function.
13891: **=========================================================================
13892: */
13893:
13894: #ifdef SCSI_NCR_USER_COMMAND_SUPPORT
13895:
13896: #define is_digit(c) ((c) >= '0' && (c) <= '9')
13897: #define digit_to_bin(c) ((c) - '0')
13898: #define is_space(c) ((c) == ' ' || (c) == '\t')
13899:
13900: static int skip_spaces(char *ptr, int len)
13901: {
13902: int cnt, c;
13903:
13904: for (cnt = len; cnt > 0 && (c = *ptr++) && is_space(c); cnt--);
13905:
13906: return (len - cnt);
13907: }
13908:
13909: static int get_int_arg(char *ptr, int len, u_long *pv)
13910: {
13911: int cnt, c;
13912: u_long v;
13913:
13914: for (v = 0, cnt = len; cnt > 0 && (c = *ptr++) && is_digit(c); cnt--) {
13915: v = (v * 10) + digit_to_bin(c);
13916: }
13917:
13918: if (pv)
13919: *pv = v;
13920:
13921: return (len - cnt);
13922: }
13923:
13924: static int is_keyword(char *ptr, int len, char *verb)
13925: {
13926: int verb_len = strlen(verb);
13927:
13928: if (len >= strlen(verb) && !memcmp(verb, ptr, verb_len))
13929: return verb_len;
13930: else
13931: return 0;
13932:
13933: }
13934:
13935: #define SKIP_SPACES(min_spaces) \
13936: if ((arg_len = skip_spaces(ptr, len)) < (min_spaces)) \
13937: return -EINVAL; \
13938: ptr += arg_len; len -= arg_len;
13939:
13940: #define GET_INT_ARG(v) \
13941: if (!(arg_len = get_int_arg(ptr, len, &(v)))) \
13942: return -EINVAL; \
13943: ptr += arg_len; len -= arg_len;
13944:
13945:
13946: /*
13947: ** Parse a control command
13948: */
13949:
13950: static int ncr_user_command(ncb_p np, char *buffer, int length)
13951: {
13952: char *ptr = buffer;
13953: int len = length;
13954: struct usrcmd *uc = &np->user;
13955: int arg_len;
13956: u_long target;
13957:
13958: bzero(uc, sizeof(*uc));
13959:
13960: if (len > 0 && ptr[len-1] == '\n')
13961: --len;
13962:
13963: if ((arg_len = is_keyword(ptr, len, "setsync")) != 0)
13964: uc->cmd = UC_SETSYNC;
13965: else if ((arg_len = is_keyword(ptr, len, "settags")) != 0)
13966: uc->cmd = UC_SETTAGS;
13967: else if ((arg_len = is_keyword(ptr, len, "setorder")) != 0)
13968: uc->cmd = UC_SETORDER;
13969: else if ((arg_len = is_keyword(ptr, len, "setverbose")) != 0)
13970: uc->cmd = UC_SETVERBOSE;
13971: else if ((arg_len = is_keyword(ptr, len, "setwide")) != 0)
13972: uc->cmd = UC_SETWIDE;
13973: else if ((arg_len = is_keyword(ptr, len, "setdebug")) != 0)
13974: uc->cmd = UC_SETDEBUG;
13975: else if ((arg_len = is_keyword(ptr, len, "setflag")) != 0)
13976: uc->cmd = UC_SETFLAG;
13977: else if ((arg_len = is_keyword(ptr, len, "resetdev")) != 0)
13978: uc->cmd = UC_RESETDEV;
13979: else if ((arg_len = is_keyword(ptr, len, "cleardev")) != 0)
13980: uc->cmd = UC_CLEARDEV;
13981: else
13982: arg_len = 0;
13983:
13984: #ifdef DEBUG_PROC_INFO
13985: printk("ncr_user_command: arg_len=%d, cmd=%ld\n", arg_len, uc->cmd);
13986: #endif
13987:
13988: if (!arg_len)
13989: return -EINVAL;
13990: ptr += arg_len; len -= arg_len;
13991:
13992: switch(uc->cmd) {
13993: case UC_SETSYNC:
13994: case UC_SETTAGS:
13995: case UC_SETWIDE:
13996: case UC_SETFLAG:
13997: case UC_RESETDEV:
13998: case UC_CLEARDEV:
13999: SKIP_SPACES(1);
14000: if ((arg_len = is_keyword(ptr, len, "all")) != 0) {
14001: ptr += arg_len; len -= arg_len;
14002: uc->target = ~0;
14003: } else {
14004: GET_INT_ARG(target);
14005: uc->target = (1<<target);
14006: #ifdef DEBUG_PROC_INFO
14007: printk("ncr_user_command: target=%ld\n", target);
14008: #endif
14009: }
14010: break;
14011: }
14012:
14013: switch(uc->cmd) {
14014: case UC_SETVERBOSE:
14015: case UC_SETSYNC:
14016: case UC_SETTAGS:
14017: case UC_SETWIDE:
14018: SKIP_SPACES(1);
14019: GET_INT_ARG(uc->data);
14020: #ifdef DEBUG_PROC_INFO
14021: printk("ncr_user_command: data=%ld\n", uc->data);
14022: #endif
14023: break;
14024: case UC_SETORDER:
14025: SKIP_SPACES(1);
14026: if ((arg_len = is_keyword(ptr, len, "simple")))
14027: uc->data = M_SIMPLE_TAG;
14028: else if ((arg_len = is_keyword(ptr, len, "ordered")))
14029: uc->data = M_ORDERED_TAG;
14030: else if ((arg_len = is_keyword(ptr, len, "default")))
14031: uc->data = 0;
14032: else
14033: return -EINVAL;
14034: break;
14035: case UC_SETDEBUG:
14036: while (len > 0) {
14037: SKIP_SPACES(1);
14038: if ((arg_len = is_keyword(ptr, len, "alloc")))
14039: uc->data |= DEBUG_ALLOC;
14040: else if ((arg_len = is_keyword(ptr, len, "phase")))
14041: uc->data |= DEBUG_PHASE;
14042: else if ((arg_len = is_keyword(ptr, len, "queue")))
14043: uc->data |= DEBUG_QUEUE;
14044: else if ((arg_len = is_keyword(ptr, len, "result")))
14045: uc->data |= DEBUG_RESULT;
14046: else if ((arg_len = is_keyword(ptr, len, "pointer")))
14047: uc->data |= DEBUG_POINTER;
14048: else if ((arg_len = is_keyword(ptr, len, "script")))
14049: uc->data |= DEBUG_SCRIPT;
14050: else if ((arg_len = is_keyword(ptr, len, "tiny")))
14051: uc->data |= DEBUG_TINY;
14052: else if ((arg_len = is_keyword(ptr, len, "timing")))
14053: uc->data |= DEBUG_TIMING;
14054: else if ((arg_len = is_keyword(ptr, len, "nego")))
14055: uc->data |= DEBUG_NEGO;
14056: else if ((arg_len = is_keyword(ptr, len, "tags")))
14057: uc->data |= DEBUG_TAGS;
14058: else
14059: return -EINVAL;
14060: ptr += arg_len; len -= arg_len;
14061: }
14062: #ifdef DEBUG_PROC_INFO
14063: printk("ncr_user_command: data=%ld\n", uc->data);
14064: #endif
14065: break;
14066: case UC_SETFLAG:
14067: while (len > 0) {
14068: SKIP_SPACES(1);
14069: if ((arg_len = is_keyword(ptr, len, "trace")))
14070: uc->data |= UF_TRACE;
14071: else if ((arg_len = is_keyword(ptr, len, "no_disc")))
14072: uc->data |= UF_NODISC;
14073: else
14074: return -EINVAL;
14075: ptr += arg_len; len -= arg_len;
14076: }
14077: break;
14078: default:
14079: break;
14080: }
14081:
14082: if (len)
14083: return -EINVAL;
14084: else {
14085: long flags;
14086:
14087: NCR_LOCK_NCB(np, flags);
14088: ncr_usercmd (np);
14089: NCR_UNLOCK_NCB(np, flags);
14090: }
14091: return length;
14092: }
14093:
14094: #endif /* SCSI_NCR_USER_COMMAND_SUPPORT */
14095:
14096: #ifdef SCSI_NCR_USER_INFO_SUPPORT
14097:
14098: struct info_str
14099: {
14100: char *buffer;
14101: int length;
14102: int offset;
14103: int pos;
14104: };
14105:
14106: static void copy_mem_info(struct info_str *info, char *data, int len)
14107: {
14108: if (info->pos + len > info->length)
14109: len = info->length - info->pos;
14110:
14111: if (info->pos + len < info->offset) {
14112: info->pos += len;
14113: return;
14114: }
14115: if (info->pos < info->offset) {
14116: data += (info->offset - info->pos);
14117: len -= (info->offset - info->pos);
14118: }
14119:
14120: if (len > 0) {
14121: memcpy(info->buffer + info->pos, data, len);
14122: info->pos += len;
14123: }
14124: }
14125:
14126: static int copy_info(struct info_str *info, char *fmt, ...)
14127: {
14128: va_list args;
14129: char buf[81];
14130: int len;
14131:
14132: va_start(args, fmt);
14133: len = vsprintf(buf, fmt, args);
14134: va_end(args);
14135:
14136: copy_mem_info(info, buf, len);
14137: return len;
14138: }
14139:
14140: /*
14141: ** Copy formatted information into the input buffer.
14142: */
14143:
14144: static int ncr_host_info(ncb_p np, char *ptr, off_t offset, int len)
14145: {
14146: struct info_str info;
14147: #ifdef CONFIG_ALL_PPC
14148: struct device_node* of_node;
14149: #endif
14150:
14151: info.buffer = ptr;
14152: info.length = len;
14153: info.offset = offset;
14154: info.pos = 0;
14155:
14156: copy_info(&info, "General information:\n");
14157: copy_info(&info, " Chip " NAME53C "%s, device id 0x%x, "
14158: "revision id 0x%x\n",
14159: np->chip_name, np->device_id, np->revision_id);
14160: copy_info(&info, " On PCI bus %d, device %d, function %d, "
14161: #ifdef __sparc__
14162: "IRQ %s\n",
14163: #else
14164: "IRQ %d\n",
14165: #endif
14166: np->bus, (np->device_fn & 0xf8) >> 3, np->device_fn & 7,
14167: #ifdef __sparc__
14168: __irq_itoa(np->irq));
14169: #else
14170: (int) np->irq);
14171: #endif
14172: #ifdef CONFIG_ALL_PPC
14173: of_node = find_pci_device_OFnode(np->bus, np->device_fn);
14174: if (of_node && of_node->full_name)
14175: copy_info(&info, "PPC OpenFirmware path : %s\n", of_node->full_name);
14176: #endif
14177: copy_info(&info, " Synchronous period factor %d, "
14178: "max commands per lun %d\n",
14179: (int) np->minsync, MAX_TAGS);
14180:
14181: if (driver_setup.debug || driver_setup.verbose > 1) {
14182: copy_info(&info, " Debug flags 0x%x, verbosity level %d\n",
14183: driver_setup.debug, driver_setup.verbose);
14184: }
14185:
14186: return info.pos > info.offset? info.pos - info.offset : 0;
14187: }
14188:
14189: #endif /* SCSI_NCR_USER_INFO_SUPPORT */
14190:
14191: /*
14192: ** Entry point of the scsi proc fs of the driver.
14193: ** - func = 0 means read (returns adapter infos)
14194: ** - func = 1 means write (parse user control command)
14195: */
14196:
14197: static int sym53c8xx_proc_info(char *buffer, char **start, off_t offset,
14198: int length, int hostno, int func)
14199: {
14200: struct Scsi_Host *host;
14201: struct host_data *host_data;
14202: ncb_p ncb = 0;
14203: int retv;
14204:
14205: #ifdef DEBUG_PROC_INFO
14206: printk("sym53c8xx_proc_info: hostno=%d, func=%d\n", hostno, func);
14207: #endif
14208:
14209: for (host = first_host; host; host = host->next) {
14210: if (host->hostt != first_host->hostt)
14211: continue;
14212: if (host->host_no == hostno) {
14213: host_data = (struct host_data *) host->hostdata;
14214: ncb = host_data->ncb;
14215: break;
14216: }
14217: }
14218:
14219: if (!ncb)
14220: return -EINVAL;
14221:
14222: if (func) {
14223: #ifdef SCSI_NCR_USER_COMMAND_SUPPORT
14224: retv = ncr_user_command(ncb, buffer, length);
14225: #else
14226: retv = -EINVAL;
14227: #endif
14228: }
14229: else {
14230: if (start)
14231: *start = buffer;
14232: #ifdef SCSI_NCR_USER_INFO_SUPPORT
14233: retv = ncr_host_info(ncb, buffer, offset, length);
14234: #else
14235: retv = -EINVAL;
14236: #endif
14237: }
14238:
14239: return retv;
14240: }
14241:
14242:
14243: /*=========================================================================
14244: ** End of proc file system stuff
14245: **=========================================================================
14246: */
14247: #endif
14248:
14249:
14250: #ifdef SCSI_NCR_NVRAM_SUPPORT
14251:
14252: /*
14253: * 24C16 EEPROM reading.
14254: *
14255: * GPOI0 - data in/data out
14256: * GPIO1 - clock
14257: * Symbios NVRAM wiring now also used by Tekram.
14258: */
14259:
14260: #define SET_BIT 0
14261: #define CLR_BIT 1
14262: #define SET_CLK 2
14263: #define CLR_CLK 3
14264:
14265: /*
14266: * Set/clear data/clock bit in GPIO0
14267: */
14268: static void __init
14269: S24C16_set_bit(ncr_slot *np, u_char write_bit, u_char *gpreg, int bit_mode)
14270: {
14271: UDELAY (5);
14272: switch (bit_mode){
14273: case SET_BIT:
14274: *gpreg |= write_bit;
14275: break;
14276: case CLR_BIT:
14277: *gpreg &= 0xfe;
14278: break;
14279: case SET_CLK:
14280: *gpreg |= 0x02;
14281: break;
14282: case CLR_CLK:
14283: *gpreg &= 0xfd;
14284: break;
14285:
14286: }
14287: OUTB (nc_gpreg, *gpreg);
14288: UDELAY (5);
14289: }
14290:
14291: /*
14292: * Send START condition to NVRAM to wake it up.
14293: */
14294: static void __init S24C16_start(ncr_slot *np, u_char *gpreg)
14295: {
14296: S24C16_set_bit(np, 1, gpreg, SET_BIT);
14297: S24C16_set_bit(np, 0, gpreg, SET_CLK);
14298: S24C16_set_bit(np, 0, gpreg, CLR_BIT);
14299: S24C16_set_bit(np, 0, gpreg, CLR_CLK);
14300: }
14301:
14302: /*
14303: * Send STOP condition to NVRAM - puts NVRAM to sleep... ZZzzzz!!
14304: */
14305: static void __init S24C16_stop(ncr_slot *np, u_char *gpreg)
14306: {
14307: S24C16_set_bit(np, 0, gpreg, SET_CLK);
14308: S24C16_set_bit(np, 1, gpreg, SET_BIT);
14309: }
14310:
14311: /*
14312: * Read or write a bit to the NVRAM,
14313: * read if GPIO0 input else write if GPIO0 output
14314: */
14315: static void __init
14316: S24C16_do_bit(ncr_slot *np, u_char *read_bit, u_char write_bit, u_char *gpreg)
14317: {
14318: S24C16_set_bit(np, write_bit, gpreg, SET_BIT);
14319: S24C16_set_bit(np, 0, gpreg, SET_CLK);
14320: if (read_bit)
14321: *read_bit = INB (nc_gpreg);
14322: S24C16_set_bit(np, 0, gpreg, CLR_CLK);
14323: S24C16_set_bit(np, 0, gpreg, CLR_BIT);
14324: }
14325:
14326: /*
14327: * Output an ACK to the NVRAM after reading,
14328: * change GPIO0 to output and when done back to an input
14329: */
14330: static void __init
14331: S24C16_write_ack(ncr_slot *np, u_char write_bit, u_char *gpreg, u_char *gpcntl)
14332: {
14333: OUTB (nc_gpcntl, *gpcntl & 0xfe);
14334: S24C16_do_bit(np, 0, write_bit, gpreg);
14335: OUTB (nc_gpcntl, *gpcntl);
14336: }
14337:
14338: /*
14339: * Input an ACK from NVRAM after writing,
14340: * change GPIO0 to input and when done back to an output
14341: */
14342: static void __init
14343: S24C16_read_ack(ncr_slot *np, u_char *read_bit, u_char *gpreg, u_char *gpcntl)
14344: {
14345: OUTB (nc_gpcntl, *gpcntl | 0x01);
14346: S24C16_do_bit(np, read_bit, 1, gpreg);
14347: OUTB (nc_gpcntl, *gpcntl);
14348: }
14349:
14350: /*
14351: * WRITE a byte to the NVRAM and then get an ACK to see it was accepted OK,
14352: * GPIO0 must already be set as an output
14353: */
14354: static void __init
14355: S24C16_write_byte(ncr_slot *np, u_char *ack_data, u_char write_data,
14356: u_char *gpreg, u_char *gpcntl)
14357: {
14358: int x;
14359:
14360: for (x = 0; x < 8; x++)
14361: S24C16_do_bit(np, 0, (write_data >> (7 - x)) & 0x01, gpreg);
14362:
14363: S24C16_read_ack(np, ack_data, gpreg, gpcntl);
14364: }
14365:
14366: /*
14367: * READ a byte from the NVRAM and then send an ACK to say we have got it,
14368: * GPIO0 must already be set as an input
14369: */
14370: static void __init
14371: S24C16_read_byte(ncr_slot *np, u_char *read_data, u_char ack_data,
14372: u_char *gpreg, u_char *gpcntl)
14373: {
14374: int x;
14375: u_char read_bit;
14376:
14377: *read_data = 0;
14378: for (x = 0; x < 8; x++) {
14379: S24C16_do_bit(np, &read_bit, 1, gpreg);
14380: *read_data |= ((read_bit & 0x01) << (7 - x));
14381: }
14382:
14383: S24C16_write_ack(np, ack_data, gpreg, gpcntl);
14384: }
14385:
14386: /*
14387: * Read 'len' bytes starting at 'offset'.
14388: */
14389: static int __init
14390: sym_read_S24C16_nvram (ncr_slot *np, int offset, u_char *data, int len)
14391: {
14392: u_char gpcntl, gpreg;
14393: u_char old_gpcntl, old_gpreg;
14394: u_char ack_data;
14395: int retv = 1;
14396: int x;
14397:
14398: /* save current state of GPCNTL and GPREG */
14399: old_gpreg = INB (nc_gpreg);
14400: old_gpcntl = INB (nc_gpcntl);
14401: gpcntl = old_gpcntl & 0xfc;
14402:
14403: /* set up GPREG & GPCNTL to set GPIO0 and GPIO1 in to known state */
14404: OUTB (nc_gpreg, old_gpreg);
14405: OUTB (nc_gpcntl, gpcntl);
14406:
14407: /* this is to set NVRAM into a known state with GPIO0/1 both low */
14408: gpreg = old_gpreg;
14409: S24C16_set_bit(np, 0, &gpreg, CLR_CLK);
14410: S24C16_set_bit(np, 0, &gpreg, CLR_BIT);
14411:
14412: /* now set NVRAM inactive with GPIO0/1 both high */
14413: S24C16_stop(np, &gpreg);
14414:
14415: /* activate NVRAM */
14416: S24C16_start(np, &gpreg);
14417:
14418: /* write device code and random address MSB */
14419: S24C16_write_byte(np, &ack_data,
14420: 0xa0 | ((offset >> 7) & 0x0e), &gpreg, &gpcntl);
14421: if (ack_data & 0x01)
14422: goto out;
14423:
14424: /* write random address LSB */
14425: S24C16_write_byte(np, &ack_data,
14426: offset & 0xff, &gpreg, &gpcntl);
14427: if (ack_data & 0x01)
14428: goto out;
14429:
14430: /* regenerate START state to set up for reading */
14431: S24C16_start(np, &gpreg);
14432:
14433: /* rewrite device code and address MSB with read bit set (lsb = 0x01) */
14434: S24C16_write_byte(np, &ack_data,
14435: 0xa1 | ((offset >> 7) & 0x0e), &gpreg, &gpcntl);
14436: if (ack_data & 0x01)
14437: goto out;
14438:
14439: /* now set up GPIO0 for inputting data */
14440: gpcntl |= 0x01;
14441: OUTB (nc_gpcntl, gpcntl);
14442:
14443: /* input all requested data - only part of total NVRAM */
14444: for (x = 0; x < len; x++)
14445: S24C16_read_byte(np, &data[x], (x == (len-1)), &gpreg, &gpcntl);
14446:
14447: /* finally put NVRAM back in inactive mode */
14448: gpcntl &= 0xfe;
14449: OUTB (nc_gpcntl, gpcntl);
14450: S24C16_stop(np, &gpreg);
14451: retv = 0;
14452: out:
14453: /* return GPIO0/1 to original states after having accessed NVRAM */
14454: OUTB (nc_gpcntl, old_gpcntl);
14455: OUTB (nc_gpreg, old_gpreg);
14456:
14457: return retv;
14458: }
14459:
14460: #undef SET_BIT
14461: #undef CLR_BIT
14462: #undef SET_CLK
14463: #undef CLR_CLK
14464:
14465: /*
14466: * Try reading Symbios NVRAM.
14467: * Return 0 if OK.
14468: */
14469: static int __init sym_read_Symbios_nvram (ncr_slot *np, Symbios_nvram *nvram)
14470: {
14471: static u_char Symbios_trailer[6] = {0xfe, 0xfe, 0, 0, 0, 0};
14472: u_char *data = (u_char *) nvram;
14473: int len = sizeof(*nvram);
14474: u_short csum;
14475: int x;
14476:
14477: /* probe the 24c16 and read the SYMBIOS 24c16 area */
14478: if (sym_read_S24C16_nvram (np, SYMBIOS_NVRAM_ADDRESS, data, len))
14479: return 1;
14480:
14481: /* check valid NVRAM signature, verify byte count and checksum */
14482: if (nvram->type != 0 ||
14483: memcmp(nvram->trailer, Symbios_trailer, 6) ||
14484: nvram->byte_count != len - 12)
14485: return 1;
14486:
14487: /* verify checksum */
14488: for (x = 6, csum = 0; x < len - 6; x++)
14489: csum += data[x];
14490: if (csum != nvram->checksum)
14491: return 1;
14492:
14493: return 0;
14494: }
14495:
14496: /*
14497: * 93C46 EEPROM reading.
14498: *
14499: * GPOI0 - data in
14500: * GPIO1 - data out
14501: * GPIO2 - clock
14502: * GPIO4 - chip select
14503: *
14504: * Used by Tekram.
14505: */
14506:
14507: /*
14508: * Pulse clock bit in GPIO0
14509: */
14510: static void __init T93C46_Clk(ncr_slot *np, u_char *gpreg)
14511: {
14512: OUTB (nc_gpreg, *gpreg | 0x04);
14513: UDELAY (2);
14514: OUTB (nc_gpreg, *gpreg);
14515: }
14516:
14517: /*
14518: * Read bit from NVRAM
14519: */
14520: static void __init T93C46_Read_Bit(ncr_slot *np, u_char *read_bit, u_char *gpreg)
14521: {
14522: UDELAY (2);
14523: T93C46_Clk(np, gpreg);
14524: *read_bit = INB (nc_gpreg);
14525: }
14526:
14527: /*
14528: * Write bit to GPIO0
14529: */
14530: static void __init T93C46_Write_Bit(ncr_slot *np, u_char write_bit, u_char *gpreg)
14531: {
14532: if (write_bit & 0x01)
14533: *gpreg |= 0x02;
14534: else
14535: *gpreg &= 0xfd;
14536:
14537: *gpreg |= 0x10;
14538:
14539: OUTB (nc_gpreg, *gpreg);
14540: UDELAY (2);
14541:
14542: T93C46_Clk(np, gpreg);
14543: }
14544:
14545: /*
14546: * Send STOP condition to NVRAM - puts NVRAM to sleep... ZZZzzz!!
14547: */
14548: static void __init T93C46_Stop(ncr_slot *np, u_char *gpreg)
14549: {
14550: *gpreg &= 0xef;
14551: OUTB (nc_gpreg, *gpreg);
14552: UDELAY (2);
14553:
14554: T93C46_Clk(np, gpreg);
14555: }
14556:
14557: /*
14558: * Send read command and address to NVRAM
14559: */
14560: static void __init
14561: T93C46_Send_Command(ncr_slot *np, u_short write_data,
14562: u_char *read_bit, u_char *gpreg)
14563: {
14564: int x;
14565:
14566: /* send 9 bits, start bit (1), command (2), address (6) */
14567: for (x = 0; x < 9; x++)
14568: T93C46_Write_Bit(np, (u_char) (write_data >> (8 - x)), gpreg);
14569:
14570: *read_bit = INB (nc_gpreg);
14571: }
14572:
14573: /*
14574: * READ 2 bytes from the NVRAM
14575: */
14576: static void __init
14577: T93C46_Read_Word(ncr_slot *np, u_short *nvram_data, u_char *gpreg)
14578: {
14579: int x;
14580: u_char read_bit;
14581:
14582: *nvram_data = 0;
14583: for (x = 0; x < 16; x++) {
14584: T93C46_Read_Bit(np, &read_bit, gpreg);
14585:
14586: if (read_bit & 0x01)
14587: *nvram_data |= (0x01 << (15 - x));
14588: else
14589: *nvram_data &= ~(0x01 << (15 - x));
14590: }
14591: }
14592:
14593: /*
14594: * Read Tekram NvRAM data.
14595: */
14596: static int __init
14597: T93C46_Read_Data(ncr_slot *np, u_short *data,int len,u_char *gpreg)
14598: {
14599: u_char read_bit;
14600: int x;
14601:
14602: for (x = 0; x < len; x++) {
14603:
14604: /* output read command and address */
14605: T93C46_Send_Command(np, 0x180 | x, &read_bit, gpreg);
14606: if (read_bit & 0x01)
14607: return 1; /* Bad */
14608: T93C46_Read_Word(np, &data[x], gpreg);
14609: T93C46_Stop(np, gpreg);
14610: }
14611:
14612: return 0;
14613: }
14614:
14615: /*
14616: * Try reading 93C46 Tekram NVRAM.
14617: */
14618: static int __init
14619: sym_read_T93C46_nvram (ncr_slot *np, Tekram_nvram *nvram)
14620: {
14621: u_char gpcntl, gpreg;
14622: u_char old_gpcntl, old_gpreg;
14623: int retv = 1;
14624:
14625: /* save current state of GPCNTL and GPREG */
14626: old_gpreg = INB (nc_gpreg);
14627: old_gpcntl = INB (nc_gpcntl);
14628:
14629: /* set up GPREG & GPCNTL to set GPIO0/1/2/4 in to known state, 0 in,
14630: 1/2/4 out */
14631: gpreg = old_gpreg & 0xe9;
14632: OUTB (nc_gpreg, gpreg);
14633: gpcntl = (old_gpcntl & 0xe9) | 0x09;
14634: OUTB (nc_gpcntl, gpcntl);
14635:
14636: /* input all of NVRAM, 64 words */
14637: retv = T93C46_Read_Data(np, (u_short *) nvram,
14638: sizeof(*nvram) / sizeof(short), &gpreg);
14639:
14640: /* return GPIO0/1/2/4 to original states after having accessed NVRAM */
14641: OUTB (nc_gpcntl, old_gpcntl);
14642: OUTB (nc_gpreg, old_gpreg);
14643:
14644: return retv;
14645: }
14646:
14647: /*
14648: * Try reading Tekram NVRAM.
14649: * Return 0 if OK.
14650: */
14651: static int __init
14652: sym_read_Tekram_nvram (ncr_slot *np, u_short device_id, Tekram_nvram *nvram)
14653: {
14654: u_char *data = (u_char *) nvram;
14655: int len = sizeof(*nvram);
14656: u_short csum;
14657: int x;
14658:
14659: switch (device_id) {
14660: case PCI_DEVICE_ID_NCR_53C885:
14661: case PCI_DEVICE_ID_NCR_53C895:
14662: case PCI_DEVICE_ID_NCR_53C896:
14663: x = sym_read_S24C16_nvram(np, TEKRAM_24C16_NVRAM_ADDRESS,
14664: data, len);
14665: break;
14666: case PCI_DEVICE_ID_NCR_53C875:
14667: x = sym_read_S24C16_nvram(np, TEKRAM_24C16_NVRAM_ADDRESS,
14668: data, len);
14669: if (!x)
14670: break;
14671: default:
14672: x = sym_read_T93C46_nvram(np, nvram);
14673: break;
14674: }
14675: if (x)
14676: return 1;
14677:
14678: /* verify checksum */
14679: for (x = 0, csum = 0; x < len - 1; x += 2)
14680: csum += data[x] + (data[x+1] << 8);
14681: if (csum != 0x1234)
14682: return 1;
14683:
14684: return 0;
14685: }
14686:
14687: #endif /* SCSI_NCR_NVRAM_SUPPORT */
14688:
14689: /*
14690: ** Module stuff
14691: */
14692:
14693: #ifdef MODULE
14694: Scsi_Host_Template driver_template = SYM53C8XX;
14695: #include "scsi_module.c"
14696: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.