Bug Summary

File:obj-scan-build/../linux/src/drivers/scsi/sym53c8xx.c
Location:line 10634, column 2
Description:Value stored to 'dp_sgmin' is never read

Annotated Source Code

1/******************************************************************************
2** High Performance device driver for the Symbios 53C896 controller.
3**
4** Copyright (C) 1998-2000 Gerard Roudier <groudier@club-internet.fr>
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 <groudier@club-internet.fr>
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 <wolf@cologne.de>
44** Stefan Esser <se@mi.Uni-Koeln.de>
45**
46**-----------------------------------------------------------------------------
47**
48** Major contributions:
49** --------------------
50**
51** NVRAM detection and reading.
52** Copyright (C) 1997 Richard Waltham <dormouse@farsrobt.demon.co.uk>
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" "sym53c8xx-1.7.1-20000726"
89
90#define SCSI_NCR_DEBUG_FLAGS(0) (0)
91
92#define NAME53C"sym53c" "sym53c"
93#define NAME53C8XX"sym53c8xx" "sym53c8xx"
94
95/*==========================================================
96**
97** Include files
98**
99**==========================================================
100*/
101
102#define LinuxVersionCode(v, p, s)(((v)<<16)+((p)<<8)+(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_CODE131108 >= LinuxVersionCode(2,3,17)(((2)<<16)+((3)<<8)+(17))
112#include <linux/spinlock.h>
113#elif LINUX_VERSION_CODE131108 >= LinuxVersionCode(2,1,93)(((2)<<16)+((1)<<8)+(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_CODE131108 >= LinuxVersionCode(2,1,35)(((2)<<16)+((1)<<8)+(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_CODE131108 <= LinuxVersionCode(2,1,92)(((2)<<16)+((1)<<8)+(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_LONG32
162#if (~0UL) == 0xffffffffUL
163#define BITS_PER_LONG32 32
164#else
165#define BITS_PER_LONG32 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*/
173typedef u32 u_int32;
174typedef 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)) (((a) < (b)) ? (a) : (b))
188#define MAX(a,b)(((a) > (b)) ? (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_CODE131108 >= LinuxVersionCode(2,3,47)(((2)<<16)+((3)<<8)+(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
207typedef 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 { (ptr)->flink = (ptr); (ptr)->blink = (ptr); } while
(0)
do { \
213 (ptr)->flink = (ptr); (ptr)->blink = (ptr); \
214} while (0)
215
216static inlineinline __attribute__((always_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
226static inlineinline __attribute__((always_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
233static inlineinline __attribute__((always_inline)) int xpt_que_empty(struct xpt_quehead *head)
234{
235 return head->flink == head;
236}
237
238static inlineinline __attribute__((always_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)((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->
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) __xpt_que_add(new, pos, (pos)->flink)
260
261#define xpt_remque(el)__xpt_que_del((el)->blink, (el)->flink) __xpt_que_del((el)->blink, (el)->flink)
262
263#define xpt_insque_head(new, head)__xpt_que_add(new, head, (head)->flink) __xpt_que_add(new, head, (head)->flink)
264
265static inlineinline __attribute__((always_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) __xpt_que_add(new, (head)->blink, head)
277
278static inlineinline __attribute__((always_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(7)
303#define SCSI_NCR_MYADDR(7) (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(8)
312#define SCSI_NCR_MAX_TAGS(8) (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(8) > 255
320#define MAX_TAGS(8) 255
321#else
322#define MAX_TAGS(8) SCSI_NCR_MAX_TAGS(8)
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(8) > (512/4)
331#define MAX_TASKS(256/4) (1024/4)
332#elif MAX_TAGS(8) > (256/4)
333#define MAX_TASKS(256/4) (512/4)
334#else
335#define MAX_TASKS(256/4) (256/4)
336#endif
337
338/*
339** This one means 'NO TAG for this job'
340*/
341#define NO_TAG(256) (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(16)
351#define MAX_TARGET((16)) (SCSI_NCR_MAX_TARGET(16))
352#else
353#define MAX_TARGET((16)) (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(16)
364#define MAX_LUN64 64
365#else
366#define MAX_LUN64 (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(40)
375#define SCSI_NCR_MIN_ASYNC(40) (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(8*(8) + 2*(16))
385#define MAX_START((8*(8) + 2*(16)) + 4) (SCSI_NCR_CAN_QUEUE(8*(8) + 2*(16)) + 4)
386#else
387#define MAX_START((8*(8) + 2*(16)) + 4) (MAX_TARGET((16)) + 7 * MAX_TAGS(8))
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((8*(8) + 2*(16)) + 4) > PAGE_SIZE(1 << 12)/8
398#undef MAX_START((8*(8) + 2*(16)) + 4)
399#define MAX_START((8*(8) + 2*(16)) + 4) (PAGE_SIZE(1 << 12)/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((127)) (SCSI_NCR_MAX_SCATTER(127))
408#define SCR_SG_SIZE(2) (2)
409
410/*
411** other
412*/
413
414#define NCR_SNOOP_TIMEOUT(1000000) (1000000)
415
416/*==========================================================
417**
418** Miscallaneous BSDish defines.
419**
420**==========================================================
421*/
422
423#define u_charunsigned char unsigned char
424#define u_shortunsigned short unsigned short
425#define u_intunsigned int unsigned int
426#define u_longunsigned long unsigned long
427
428#ifndef bcopy
429#define bcopy(s, d, n)(__builtin_constant_p((n)) ? __constant_memcpy(((d)),((s)),((
n))) : __memcpy(((d)),((s)),((n))))
memcpy((d), (s), (n))(__builtin_constant_p((n)) ? __constant_memcpy(((d)),((s)),((
n))) : __memcpy(((d)),((s)),((n))))
430#endif
431
432#ifndef bzero
433#define bzero(d, n)(__builtin_constant_p(0) ? (__builtin_constant_p(((n))) ? __constant_c_and_count_memset
((((d))),((0x01010101UL*(unsigned char)(0))),(((n)))) : __constant_c_memset
((((d))),((0x01010101UL*(unsigned char)(0))),(((n))))) : (__builtin_constant_p
(((n))) ? __memset_generic(((((d)))),(((0))),((((n))))) : __memset_generic
((((d))),((0)),(((n))))))
memset((d), 0, (n))(__builtin_constant_p(0) ? (__builtin_constant_p(((n))) ? __constant_c_and_count_memset
((((d))),((0x01010101UL*(unsigned char)(0))),(((n)))) : __constant_c_memset
((((d))),((0x01010101UL*(unsigned char)(0))),(((n))))) : (__builtin_constant_p
(((n))) ? __memset_generic(((((d)))),(((0))),((((n))))) : __memset_generic
((((d))),((0)),(((n))))))
434#endif
435
436#ifndef offsetof
437#define offsetof(t, m)((size_t) (&((t *)0)->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_CODE131108 >= LinuxVersionCode(2,2,0)(((2)<<16)+((2)<<8)+(0))
452
453typedef struct pci_dev *pcidev_t;
454#define PCIDEV_NULL(~0u) (0)
455#define PciBusNumber(d)((d)>>8) (d)->bus->number
456#define PciDeviceFn(d)((d)&0xff) (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_CODE131108 > LinuxVersionCode(2,3,12)(((2)<<16)+((3)<<8)+(12))
462
463static int __init
464pci_get_base_address(struct pci_dev *pdev, int index, u_longunsigned 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
472static int __init
473pci_get_base_address(struct pci_dev *pdev, int index, u_longunsigned long *base)
474{
475 *base = pdev->base_address[index++];
476 if ((*base & 0x7) == 0x4) {
477#if BITS_PER_LONG32 > 32
478 *base |= (((u_longunsigned 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
488typedef unsigned int pcidev_t;
489#define PCIDEV_NULL(~0u) (~0u)
490#define PciBusNumber(d)((d)>>8) ((d)>>8)
491#define PciDeviceFn(d)((d)&0xff) ((d)&0xff)
492#define __PciDev(busn, devfn)(((busn)<<8)+(devfn)) (((busn)<<8)+(devfn))
493
494#define pci_presentpcibios_present pcibios_present
495
496#define pci_read_config_byte(d, w, v)pcibios_read_config_byte(((d)>>8), ((d)&0xff), w, v
)
\
497 pcibios_read_config_byte(PciBusNumber(d)((d)>>8), PciDeviceFn(d)((d)&0xff), w, v)
498#define pci_read_config_word(d, w, v)pcibios_read_config_word(((d)>>8), ((d)&0xff), w, v
)
\
499 pcibios_read_config_word(PciBusNumber(d)((d)>>8), PciDeviceFn(d)((d)&0xff), w, v)
500#define pci_read_config_dword(d, w, v)pcibios_read_config_dword(((d)>>8), ((d)&0xff), w, v
)
\
501 pcibios_read_config_dword(PciBusNumber(d)((d)>>8), PciDeviceFn(d)((d)&0xff), w, v)
502
503#define pci_write_config_byte(d, w, v)pcibios_write_config_byte(((d)>>8), ((d)&0xff), w, v
)
\
504 pcibios_write_config_byte(PciBusNumber(d)((d)>>8), PciDeviceFn(d)((d)&0xff), w, v)
505#define pci_write_config_word(d, w, v)pcibios_write_config_word(((d)>>8), ((d)&0xff), w, v
)
\
506 pcibios_write_config_word(PciBusNumber(d)((d)>>8), PciDeviceFn(d)((d)&0xff), w, v)
507#define pci_write_config_dword(d, w, v)pcibios_write_config_dword(((d)>>8), ((d)&0xff), w,
v)
\
508 pcibios_write_config_dword(PciBusNumber(d)((d)>>8), PciDeviceFn(d)((d)&0xff), w, v)
509
510static pcidev_t __init
511pci_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(~0u))
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(~0u) : __PciDev(bus_number, device_fn)(((bus_number)<<8)+(device_fn));
524}
525
526static u_shortunsigned short __init PciVendorId(pcidev_t dev)
527{
528 u_shortunsigned short vendor_id;
529 pci_read_config_word(dev, PCI_VENDOR_ID, &vendor_id)pcibios_read_config_word(((dev)>>8), ((dev)&0xff), 0x00
, &vendor_id)
;
530 return vendor_id;
531}
532
533static u_shortunsigned short __init PciDeviceId(pcidev_t dev)
534{
535 u_shortunsigned short device_id;
536 pci_read_config_word(dev, PCI_DEVICE_ID, &device_id)pcibios_read_config_word(((dev)>>8), ((dev)&0xff), 0x02
, &device_id)
;
537 return device_id;
538}
539
540static u_intunsigned int __init PciIrqLine(pcidev_t dev)
541{
542 u_charunsigned char irq;
543 pci_read_config_byte(dev, PCI_INTERRUPT_LINE, &irq)pcibios_read_config_byte(((dev)>>8), ((dev)&0xff), 0x3c
, &irq)
;
544 return irq;
545}
546
547static int __init
548pci_get_base_address(pcidev_t dev, int offset, u_longunsigned long *base)
549{
550 u_int32 tmp;
551
552 pci_read_config_dword(dev, PCI_BASE_ADDRESS_0 + offset, &tmp)pcibios_read_config_dword(((dev)>>8), ((dev)&0xff),
0x10 + offset, &tmp)
;
553 *base = tmp;
554 offset += sizeof(u_int32);
555 if ((tmp & 0x7) == 0x4) {
556#if BITS_PER_LONG32 > 32
557 pci_read_config_dword(dev, PCI_BASE_ADDRESS_0 + offset, &tmp)pcibios_read_config_dword(((dev)>>8), ((dev)&0xff),
0x10 + offset, &tmp)
;
558 *base |= (((u_longunsigned 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) (0x0001)
575#define DEBUG_PHASE(0x0002) (0x0002)
576#define DEBUG_QUEUE(0x0008) (0x0008)
577#define DEBUG_RESULT(0x0010) (0x0010)
578#define DEBUG_POINTER(0x0020) (0x0020)
579#define DEBUG_SCRIPT(0x0040) (0x0040)
580#define DEBUG_TINY(0x0080) (0x0080)
581#define DEBUG_TIMING(0x0100) (0x0100)
582#define DEBUG_NEGO(0x0200) (0x0200)
583#define DEBUG_TAGS(0x0400) (0x0400)
584#define DEBUG_IC(0x0800) (0x0800)
585
586/*
587** Enable/Disable debug messages.
588** Can be changed at runtime too.
589*/
590
591#ifdef SCSI_NCR_DEBUG_INFO_SUPPORT
592static int ncr_debug = SCSI_NCR_DEBUG_FLAGS(0);
593 #define DEBUG_FLAGSncr_debug ncr_debug
594#else
595 #define DEBUG_FLAGSncr_debug SCSI_NCR_DEBUG_FLAGS(0)
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_CODE131108 >= LinuxVersionCode(2,1,93)(((2)<<16)+((1)<<8)+(93))
614
615spinlock_t sym53c8xx_lock = SPIN_LOCK_UNLOCKED;
616#define NCR_LOCK_DRIVER(flags)do { __asm__ __volatile__("pushf ; pop %0" : "=r" (flags): :"memory"
); __asm__ __volatile__ ("cli": : :"memory"); } while (0)
spin_lock_irqsave(&sym53c8xx_lock, flags)
617#define NCR_UNLOCK_DRIVER(flags)do { __asm__ __volatile__("push %0 ; popf": :"g" (flags):"memory"
); } while (0)
spin_unlock_irqrestore(&sym53c8xx_lock,flags)
618
619#define NCR_INIT_LOCK_NCB(np)do { } while (0) spin_lock_init(&np->smp_lock);
620#define NCR_LOCK_NCB(np, flags)do { __asm__ __volatile__("pushf ; pop %0" : "=r" (flags): :"memory"
); __asm__ __volatile__ ("cli": : :"memory"); } while (0)
spin_lock_irqsave(&np->smp_lock, flags)
621#define NCR_UNLOCK_NCB(np, flags)do { __asm__ __volatile__("push %0 ; popf": :"g" (flags):"memory"
); } while (0)
spin_unlock_irqrestore(&np->smp_lock, flags)
622
623#define NCR_LOCK_SCSI_DONE(np, flags)do {;} while (0) \
624 spin_lock_irqsave(&io_request_lock, flags)
625#define NCR_UNLOCK_SCSI_DONE(np, flags)do {;} while (0) \
626 spin_unlock_irqrestore(&io_request_lock, flags)
627
628#else
629
630#define NCR_LOCK_DRIVER(flags)do { __asm__ __volatile__("pushf ; pop %0" : "=r" (flags): :"memory"
); __asm__ __volatile__ ("cli": : :"memory"); } while (0)
do { save_flags(flags)__asm__ __volatile__("pushf ; pop %0" : "=r" (flags): :"memory"
)
; cli()__asm__ __volatile__ ("cli": : :"memory"); } while (0)
631#define NCR_UNLOCK_DRIVER(flags)do { __asm__ __volatile__("push %0 ; popf": :"g" (flags):"memory"
); } while (0)
do { restore_flags(flags)__asm__ __volatile__("push %0 ; popf": :"g" (flags):"memory"); } while (0)
632
633#define NCR_INIT_LOCK_NCB(np)do { } while (0) do { } while (0)
634#define NCR_LOCK_NCB(np, flags)do { __asm__ __volatile__("pushf ; pop %0" : "=r" (flags): :"memory"
); __asm__ __volatile__ ("cli": : :"memory"); } while (0)
do { save_flags(flags)__asm__ __volatile__("pushf ; pop %0" : "=r" (flags): :"memory"
)
; cli()__asm__ __volatile__ ("cli": : :"memory"); } while (0)
635#define NCR_UNLOCK_NCB(np, flags)do { __asm__ __volatile__("push %0 ; popf": :"g" (flags):"memory"
); } while (0)
do { restore_flags(flags)__asm__ __volatile__("push %0 ; popf": :"g" (flags):"memory"); } while (0)
636
637#define NCR_LOCK_SCSI_DONE(np, flags)do {;} while (0) do {;} while (0)
638#define NCR_UNLOCK_SCSI_DONE(np, flags)do {;} while (0) 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_CODE131108 < LinuxVersionCode(2,1,0)(((2)<<16)+((1)<<8)+(0))
654#define ioremapvremap vremap
655#define iounmapvfree vfree
656#endif
657
658#ifdef __sparc__
659# include <asm/irq.h>
660# if LINUX_VERSION_CODE131108 < LinuxVersionCode(2,3,0)(((2)<<16)+((3)<<8)+(0))
661 /* ioremap/iounmap broken in 2.2.x on Sparc. -DaveM */
662# define ioremapvremap(base, size) ((u_longunsigned long) __va(base))
663# define iounmapvfree(vaddr)
664# endif
665# define pcivtobus(p)(p) bus_dvma_to_mem(p)
666# define memcpy_to_pci(a, b, c)(__builtin_constant_p(((c))) ? __constant_memcpy(((void *)((a
))),(((b))),(((c)))) : __memcpy(((void *)((a))),(((b))),(((c)
))))
memcpy_toio((void *)(a), (const void *)(b), (c))(__builtin_constant_p(((c))) ? __constant_memcpy(((void *)((void
*)(a))),(((const void *)(b))),(((c)))) : __memcpy(((void *)(
(void *)(a))),(((const void *)(b))),(((c)))))
667#elif defined(__alpha__)
668# define pcivtobus(p)(p) ((p) & 0xfffffffful)
669# define memcpy_to_pci(a, b, c)(__builtin_constant_p(((c))) ? __constant_memcpy(((void *)((a
))),(((b))),(((c)))) : __memcpy(((void *)((a))),(((b))),(((c)
))))
memcpy_toio((a), (b), (c))(__builtin_constant_p(((c))) ? __constant_memcpy(((void *)((a
))),(((b))),(((c)))) : __memcpy(((void *)((a))),(((b))),(((c)
))))
670#else /* others */
671# define pcivtobus(p)(p) (p)
672# define memcpy_to_pci(a, b, c)(__builtin_constant_p(((c))) ? __constant_memcpy(((void *)((a
))),(((b))),(((c)))) : __memcpy(((void *)((a))),(((b))),(((c)
))))
memcpy_toio((a), (b), (c))(__builtin_constant_p(((c))) ? __constant_memcpy(((void *)((a
))),(((b))),(((c)))) : __memcpy(((void *)((a))),(((b))),(((c)
))))
673#endif
674
675#ifndef SCSI_NCR_PCI_MEM_NOT_SUPPORTED
676static u_longunsigned long __init remap_pci_mem(u_longunsigned long base, u_longunsigned long size)
677{
678 u_longunsigned long page_base = ((u_longunsigned long) base) & PAGE_MASK((1 << 12)-1);
679 u_longunsigned long page_offs = ((u_longunsigned long) base) - page_base;
680 u_longunsigned long page_remapped = (u_longunsigned long) ioremapvremap(page_base, page_offs+size);
681
682 return page_remapped? (page_remapped + page_offs) : 0UL;
683}
684
685static void __init unmap_pci_mem(u_longunsigned long vaddr, u_longunsigned long size)
686{
687 if (vaddr)
688 iounmapvfree((void *) (vaddr & PAGE_MASK((1 << 12)-1)));
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_CODE131108 >= LinuxVersionCode(2,1,105)(((2)<<16)+((1)<<8)+(105))
705#define UDELAY udelay
706#define MDELAY mdelay
707#else
708static void UDELAY(long us) { udelay(us)(__builtin_constant_p(us) ? __const_udelay((us) * 0x10c6ul) :
__udelay(us))
; }
709static 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_CODE131108 >= LinuxVersionCode(2,1,0)(((2)<<16)+((1)<<8)+(0))
727#define __GetFreePages(flags, order)__get_free_pages(flags, order, 0) __get_free_pages(flags, order)
728#else
729#define __GetFreePages(flags, order)__get_free_pages(flags, order, 0) __get_free_pages(flags, order, 0)
730#endif
731
732#define MEMO_SHIFT4 4 /* 16 bytes minimum memory chunk */
733#if PAGE_SIZE(1 << 12) >= 8192
734#define MEMO_PAGE_ORDER1 0 /* 1 PAGE maximum */
735#else
736#define MEMO_PAGE_ORDER1 1 /* 2 PAGES maximum */
737#endif
738#define MEMO_FREE_UNUSED /* Free unused pages immediately */
739#define MEMO_WARN1 1
740#define MEMO_GFP_FLAGS0x01 GFP_ATOMIC0x01
741#define MEMO_CLUSTER_SHIFT(12 +1) (PAGE_SHIFT12+MEMO_PAGE_ORDER1)
742#define MEMO_CLUSTER_SIZE(1UL << (12 +1)) (1UL << MEMO_CLUSTER_SHIFT(12 +1))
743#define MEMO_CLUSTER_MASK((1UL << (12 +1))-1) (MEMO_CLUSTER_SIZE(1UL << (12 +1))-1)
744
745typedef u_longunsigned long m_addr_t; /* Enough bits to bit-hack addresses */
746typedef pcidev_t m_bush_t; /* Something that addresses DMAable */
747
748typedef 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
753typedef 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(12 +1)) & VTOB_HASH_MASK)
763#endif
764
765typedef 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()__get_free_pages(0x01, 1, 0) mp->getp(mp)
771#define M_FREEP(p)free_pages(p, 1) mp->freep(mp, p)
772#define GetPages() __GetFreePages(MEMO_GFP_FLAGS, MEMO_PAGE_ORDER)__get_free_pages(0x01, 1, 0)
773#define FreePages(p) free_pages(p, MEMO_PAGE_ORDER1)
774 int nump;
775 m_vtob_s *(vtob[VTOB_HASH_SIZE]);
776 struct m_pool *next;
777#else
778#define M_GETP()__get_free_pages(0x01, 1, 0) __GetFreePages(MEMO_GFP_FLAGS, MEMO_PAGE_ORDER)__get_free_pages(0x01, 1, 0)
779#define M_FREEP(p)free_pages(p, 1) free_pages(p, MEMO_PAGE_ORDER1)
780#endif /* SCSI_NCR_DYNAMIC_DMA_MAPPING */
781 struct m_link h[PAGE_SHIFT12-MEMO_SHIFT4+MEMO_PAGE_ORDER1+1];
782} m_pool_s;
783
784static void *___m_alloc(m_pool_s *mp, int size)
785{
786 int i = 0;
787 int s = (1 << MEMO_SHIFT4);
788 int j;
789 m_addr_t a;
790 m_link_s *h = mp->h;
791
792 if (size > (PAGE_SIZE(1 << 12) << MEMO_PAGE_ORDER1))
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(1 << 12) << MEMO_PAGE_ORDER1)) {
803 h[j].next = (m_link_s *) M_GETP()__get_free_pages(0x01, 1, 0);
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
827static void ___m_free(m_pool_s *mp, void *ptr, int size)
828{
829 int i = 0;
830 int s = (1 << MEMO_SHIFT4);
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(1 << 12) << MEMO_PAGE_ORDER1))
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(1 << 12) << MEMO_PAGE_ORDER1)) {
852 M_FREEP(a)free_pages(a, 1);
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
873static 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_FLAGSncr_debug & DEBUG_ALLOC(0x0001))
880 printk ("new %-10s[%4d] @%p.\n", name, size, p);
881
882 if (p)
883 bzero(p, size)(__builtin_constant_p(0) ? (__builtin_constant_p(((size))) ? __constant_c_and_count_memset
((((p))),((0x01010101UL*(unsigned char)(0))),(((size)))) : __constant_c_memset
((((p))),((0x01010101UL*(unsigned char)(0))),(((size))))) : (
__builtin_constant_p(((size))) ? __memset_generic(((((p)))),(
((0))),((((size))))) : __memset_generic((((p))),((0)),(((size
))))))
;
884 else if (uflags & MEMO_WARN1)
885 printk (NAME53C8XX"sym53c8xx" ": 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, 1) __m_calloc2(mp, s, n, MEMO_WARN1)
891
892static void __m_free(m_pool_s *mp, void *ptr, int size, char *name)
893{
894 if (DEBUG_FLAGSncr_debug & DEBUG_ALLOC(0x0001))
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
909static m_pool_s mp0;
910
911#else
912
913static 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
921static void ___mp0_freep(m_pool_s *mp, m_addr_t m)
922{
923 FreePages(m);
924 --mp->nump;
925}
926
927static m_pool_s mp0 = {0, ___mp0_getp, ___mp0_freep};
928
929#endif /* SCSI_NCR_DYNAMIC_DMA_MAPPING */
930
931static void *m_calloc(int size, char *name)
932{
933 u_longunsigned long flags;
934 void *m;
935 NCR_LOCK_DRIVER(flags)do { __asm__ __volatile__("pushf ; pop %0" : "=r" (flags): :"memory"
); __asm__ __volatile__ ("cli": : :"memory"); } while (0)
;
936 m = __m_calloc(&mp0, size, name)__m_calloc2(&mp0, size, name, 1);
937 NCR_UNLOCK_DRIVER(flags)do { __asm__ __volatile__("push %0 ; popf": :"g" (flags):"memory"
); } while (0)
;
938 return m;
939}
940
941static void m_free(void *ptr, int size, char *name)
942{
943 u_longunsigned long flags;
944 NCR_LOCK_DRIVER(flags)do { __asm__ __volatile__("pushf ; pop %0" : "=r" (flags): :"memory"
); __asm__ __volatile__ ("cli": : :"memory"); } while (0)
;
945 __m_free(&mp0, ptr, size, name);
946 NCR_UNLOCK_DRIVER(flags)do { __asm__ __volatile__("push %0 ; popf": :"g" (flags):"memory"
); } while (0)
;
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) m_calloc(s, n)
958#define __m_free_dma(b, p, s, n)m_free(p, s, n) m_free(p, s, n)
959#define __vtobus(b, p)virt_to_phys(p) virt_to_busvirt_to_phys(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 */
967static 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")__m_calloc2(&mp0, sizeof(*vbp), "VTOB", 1);
973 if (vbp) {
974 dma_addr_t daddr;
975 vp = (m_addr_t) pci_alloc_consistent(mp->bush,
976 PAGE_SIZE(1 << 12)<<MEMO_PAGE_ORDER1,
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
993static 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(1 << 12)<<MEMO_PAGE_ORDER1,
1005 (void *)vbp->vaddr, (dma_addr_t)vbp->baddr);
1006 __m_free(&mp0, vbp, sizeof(*vbp), "VTOB");
1007 --mp->nump;
1008 }
1009}
1010
1011static inlineinline __attribute__((always_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
1018static m_pool_s *___cre_dma_pool(m_bush_t bush)
1019{
1020 m_pool_s *mp;
1021 mp = __m_calloc(&mp0, sizeof(*mp), "MPOOL")__m_calloc2(&mp0, sizeof(*mp), "MPOOL", 1);
1022 if (mp) {
1023 bzero(mp, sizeof(*mp))(__builtin_constant_p(0) ? (__builtin_constant_p(((sizeof(*mp
)))) ? __constant_c_and_count_memset((((mp))),((0x01010101UL*
(unsigned char)(0))),(((sizeof(*mp))))) : __constant_c_memset
((((mp))),((0x01010101UL*(unsigned char)(0))),(((sizeof(*mp))
)))) : (__builtin_constant_p(((sizeof(*mp)))) ? __memset_generic
(((((mp)))),(((0))),((((sizeof(*mp)))))) : __memset_generic((
((mp))),((0)),(((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
1033static 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
1045static void *__m_calloc_dma(m_bush_t bush, int size, char *name)m_calloc(int size, char *name)
1046{
1047 u_longunsigned long flags;
1048 struct m_pool *mp;
1049 void *m = 0;
1050
1051 NCR_LOCK_DRIVER(flags)do { __asm__ __volatile__("pushf ; pop %0" : "=r" (flags): :"memory"
); __asm__ __volatile__ ("cli": : :"memory"); } while (0)
;
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)__m_calloc2(mp, size, name, 1);
1057 if (mp && !mp->nump)
1058 ___del_dma_pool(mp);
1059 NCR_UNLOCK_DRIVER(flags)do { __asm__ __volatile__("push %0 ; popf": :"g" (flags):"memory"
); } while (0)
;
1060
1061 return m;
1062}
1063
1064static void __m_free_dma(m_bush_t bush, void *m, int size, char *name)m_free(void *m, int size, char *name)
1065{
1066 u_longunsigned long flags;
1067 struct m_pool *mp;
1068
1069 NCR_LOCK_DRIVER(flags)do { __asm__ __volatile__("pushf ; pop %0" : "=r" (flags): :"memory"
); __asm__ __volatile__ ("cli": : :"memory"); } while (0)
;
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)do { __asm__ __volatile__("push %0 ; popf": :"g" (flags):"memory"
); } while (0)
;
1076}
1077
1078static m_addr_t __vtobus(m_bush_t bush, void *m)virt_to_phys(void *m)
1079{
1080 u_longunsigned 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((1UL << (12 +1))-1);
1085
1086 NCR_LOCK_DRIVER(flags)do { __asm__ __volatile__("pushf ; pop %0" : "=r" (flags): :"memory"
); __asm__ __volatile__ ("cli": : :"memory"); } while (0)
;
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)do { __asm__ __volatile__("push %0 ; popf": :"g" (flags):"memory"
); } while (0)
;
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(s, n) __m_calloc_dma(np->pdev, s, n)m_calloc(s, n)
1100#define _m_free_dma(np, p, s, n)m_free(p, s, n) __m_free_dma(np->pdev, p, s, n)m_free(p, s, n)
1101#define m_calloc_dma(s, n)m_calloc(s, n) _m_calloc_dma(np, s, n)m_calloc(s, n)
1102#define m_free_dma(p, s, n)m_free(p, s, n) _m_free_dma(np, p, s, n)m_free(p, s, n)
1103#define _vtobus(np, p)virt_to_phys(p) __vtobus(np->pdev, p)virt_to_phys(p)
1104#define vtobus(p)virt_to_phys(p) _vtobus(np, p)virt_to_phys(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) do {; } while (0)
1115#define __map_scsi_single_data(pdev, cmd)(virt_to_phys((cmd)->request_buffer)) (__vtobus(pdev,(cmd)->request_buffer)virt_to_phys((cmd)->request_buffer))
1116#define __map_scsi_sg_data(pdev, cmd)((cmd)->use_sg) ((cmd)->use_sg)
1117#define __sync_scsi_data(pdev, cmd)do {; } while (0) do {; } while (0)
1118
1119#define scsi_sg_dma_address(sc)virt_to_phys((sc)->address) vtobus((sc)->address)virt_to_phys((sc)->address)
1120#define scsi_sg_dma_len(sc)((sc)->length) ((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
1130static void __unmap_scsi_data(pcidev_t pdev, Scsi_Cmnd *cmd)do {; } while (0)
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
1146static u_longunsigned long __map_scsi_single_data(pcidev_t pdev, Scsi_Cmnd *cmd)(virt_to_phys((Scsi_Cmnd *cmd)->request_buffer))
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
1162static int __map_scsi_sg_data(pcidev_t pdev, Scsi_Cmnd *cmd)((Scsi_Cmnd *cmd)->use_sg)
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
1177static void __sync_scsi_data(pcidev_t pdev, Scsi_Cmnd *cmd)do {; } while (0)
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)virt_to_phys((sc)->address) sg_dma_address(sc)
1193#define scsi_sg_dma_len(sc)((sc)->length) sg_dma_len(sc)
1194
1195#endif /* SCSI_NCR_DYNAMIC_DMA_MAPPING */
1196
1197#define unmap_scsi_data(np, cmd)do {; } while (0) __unmap_scsi_data(np->pdev, cmd)do {; } while (0)
1198#define map_scsi_single_data(np, cmd)(virt_to_phys((cmd)->request_buffer)) __map_scsi_single_data(np->pdev, cmd)(virt_to_phys((cmd)->request_buffer))
1199#define map_scsi_sg_data(np, cmd)((cmd)->use_sg) __map_scsi_sg_data(np->pdev, cmd)((cmd)->use_sg)
1200#define sync_scsi_data(np, cmd)do {; } while (0) __sync_scsi_data(np->pdev, cmd)do {; } while (0)
1201
1202
1203/*
1204 * Print out some buffer.
1205 */
1206static void ncr_print_hex(u_charunsigned char *p, int n)
1207{
1208 while (n-- > 0)
1209 printk (" %x", *p++);
1210}
1211
1212static void ncr_printl_hex(char *label, u_charunsigned 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_UNKNOWN0
1231
1232#define scsi_data_direction(cmd) (cmd->sc_data_direction)
1233
1234#else
1235
1236#define SCSI_DATA_UNKNOWN0 0
1237#define SCSI_DATA_WRITE1 1
1238#define SCSI_DATA_READ2 2
1239#define SCSI_DATA_NONE3 3
1240
1241static __inline____inline__ __attribute__((always_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_READ2;
1250 break;
1251 case 0x0A: /* WRITE(6) 0A */
1252 case 0x2A: /* WRITE(10) 2A */
1253 case 0xAA: /* WRITE(12) AA */
1254 direction = SCSI_DATA_WRITE1;
1255 break;
1256 default:
1257 direction = SCSI_DATA_UNKNOWN0;
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
1274static struct Scsi_Host *first_host = NULL((void *) 0);
1275
1276
1277/*
1278** /proc directory entry and proc_info function
1279*/
1280#ifdef SCSI_NCR_PROC_INFO_SUPPORT
1281#if LINUX_VERSION_CODE131108 < LinuxVersionCode(2,3,27)(((2)<<16)+((3)<<8)+(27))
1282static struct proc_dir_entry proc_scsi_sym53c8xx = {
1283 PROC_SCSI_SYM53C8XX, 9, NAME53C8XX"sym53c8xx",
1284 S_IFDIR0040000 | S_IRUGO(00400|00040|00004) | S_IXUGO(00100|00010|00001), 2
1285};
1286#endif
1287static 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*/
1297static struct ncr_driver_setup
1298 driver_setup = SCSI_NCR_DRIVER_SETUP{ (1), (1), (1), (3), (3), (0), 0, 0, 1, 0, (0), (250/((20)))
, 0x00, 7, (0), 1, (2), (0), 0, 1, 0, 0, 255, 0x00 }
;
1299
1300#ifdef SCSI_NCR_BOOT_COMMAND_LINE_SUPPORT
1301static struct ncr_driver_setup
1302 driver_safe_setup __initdata = SCSI_NCR_DRIVER_SAFE_SETUP{ 0, 1, 0, 0, 0, 0, 0, 0, 1, 2, 0, 255, 0x00, 255, 0, 0, 10, 1
, 1, 1, 0, 0, 255 }
;
1303# ifdef MODULE
1304char *sym53c8xx = 0; /* command line passed by insmod */
1305# if LINUX_VERSION_CODE131108 >= LinuxVersionCode(2,1,30)(((2)<<16)+((1)<<8)+(30))
1306MODULE_PARM(sym53c8xx, "s");
1307# endif
1308# endif
1309#endif
1310
1311/*
1312** Other Linux definitions
1313*/
1314#define SetScsiResult(cmd, h_sts, s_sts)cmd->result = (((h_sts) << 16) + ((s_sts) & 0x7f
))
\
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)cmd->result = (((0x05) << 16) + ((0xff) & 0x7f)) \
1320 SetScsiResult( \cmd->result = ((((cmd)->abort_reason == 0x03 ? 0x03 : 0x05
) << 16) + ((0xff) & 0x7f))
1321 cmd, \cmd->result = ((((cmd)->abort_reason == 0x03 ? 0x03 : 0x05
) << 16) + ((0xff) & 0x7f))
1322 (cmd)->abort_reason == DID_TIME_OUT ? DID_TIME_OUT : DID_ABORT, \cmd->result = ((((cmd)->abort_reason == 0x03 ? 0x03 : 0x05
) << 16) + ((0xff) & 0x7f))
1323 0xff)cmd->result = ((((cmd)->abort_reason == 0x03 ? 0x03 : 0x05
) << 16) + ((0xff) & 0x7f))
1324#else
1325#define SetScsiAbortResult(cmd)cmd->result = (((0x05) << 16) + ((0xff) & 0x7f)) SetScsiResult(cmd, DID_ABORT, 0xff)cmd->result = (((0x05) << 16) + ((0xff) & 0x7f))
1326#endif
1327
1328static void sym53c8xx_select_queue_depths(
1329 struct Scsi_Host *host, struct scsi_device *devlist);
1330static void sym53c8xx_intr(int irq, void *dev_id, struct pt_regs * regs);
1331static void sym53c8xx_timeout(unsigned long np);
1332
1333#define initverbose(driver_setup.verbose) (driver_setup.verbose)
1334#define bootverbose(np->verbose) (np->verbose)
1335
1336#ifdef SCSI_NCR_NVRAM_SUPPORT
1337static u_charunsigned 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*/
1345typedef struct {
1346 int bus;
1347 u_charunsigned char device_fn;
1348 u_longunsigned long base;
1349 u_longunsigned long base_2;
1350 u_longunsigned long io_port;
1351 int irq;
1352/* port and reg fields to use INB, OUTB macros */
1353 u_longunsigned long base_io;
1354 volatile struct ncr_reg *reg;
1355} ncr_slot;
1356
1357typedef struct {
1358 int type;
1359#define SCSI_NCR_SYMBIOS_NVRAM(1) (1)
1360#define SCSI_NCR_TEKRAM_NVRAM(2) (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*/
1373typedef struct {
1374 pcidev_t pdev;
1375 ncr_slot slot;
1376 ncr_chip chip;
1377 ncr_nvram *nvram;
1378 u_charunsigned char host_id;
1379#ifdef SCSI_NCR_PQS_PDS_SUPPORT
1380 u_charunsigned 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){ if (!(expression)) { (void)panic( "assertion \"%s\" failed: file \"%s\", line %d\n"
, "expression", "../linux/src/drivers/scsi/sym53c8xx.c", 1396
); } }
{ \
1397 if (!(expression)) { \
1398 (void)panic( \
1399 "assertion \"%s\" failed: file \"%s\", line %d\n", \
1400 #expression, \
1401 __FILE__"../linux/src/drivers/scsi/sym53c8xx.c", __LINE__1401); \
1402 } \
1403}
1404
1405/*==========================================================
1406**
1407** Command control block states.
1408**
1409**==========================================================
1410*/
1411
1412#define HS_IDLE(0) (0)
1413#define HS_BUSY(1) (1)
1414#define HS_NEGOTIATE(2) (2) /* sync/wide data transfer*/
1415#define HS_DISCONNECT(3) (3) /* Disconnected by target */
1416
1417#define HS_DONEMASK(0x80) (0x80)
1418#define HS_COMPLETE(4|(0x80)) (4|HS_DONEMASK(0x80))
1419#define HS_SEL_TIMEOUT(5|(0x80)) (5|HS_DONEMASK(0x80)) /* Selection timeout */
1420#define HS_RESET(6|(0x80)) (6|HS_DONEMASK(0x80)) /* SCSI reset */
1421#define HS_ABORTED(7|(0x80)) (7|HS_DONEMASK(0x80)) /* Transfer aborted */
1422#define HS_TIMEOUT(8|(0x80)) (8|HS_DONEMASK(0x80)) /* Software timeout */
1423#define HS_FAIL(9|(0x80)) (9|HS_DONEMASK(0x80)) /* SCSI or PCI bus errors */
1424#define HS_UNEXPECTED(10|(0x80)) (10|HS_DONEMASK(0x80))/* Unexpected disconnect */
1425
1426#define DSA_INVALID0xffffffff 0xffffffff
1427
1428/*==========================================================
1429**
1430** Software Interrupt Codes
1431**
1432**==========================================================
1433*/
1434
1435#define SIR_BAD_STATUS(1) (1)
1436#define SIR_SEL_ATN_NO_MSG_OUT(2) (2)
1437#define SIR_MSG_RECEIVED(3) (3)
1438#define SIR_MSG_WEIRD(4) (4)
1439#define SIR_NEGO_FAILED(5) (5)
1440#define SIR_NEGO_PROTO(6) (6)
1441#define SIR_SCRIPT_STOPPED(7) (7)
1442#define SIR_REJECT_TO_SEND(8) (8)
1443#define SIR_SWIDE_OVERRUN(9) (9)
1444#define SIR_SODL_UNDERRUN(10) (10)
1445#define SIR_RESEL_NO_MSG_IN(11) (11)
1446#define SIR_RESEL_NO_IDENTIFY(12) (12)
1447#define SIR_RESEL_BAD_LUN(13) (13)
1448#define SIR_TARGET_SELECTED(14) (14)
1449#define SIR_RESEL_BAD_I_T_L(15) (15)
1450#define SIR_RESEL_BAD_I_T_L_Q(16) (16)
1451#define SIR_ABORT_SENT(17) (17)
1452#define SIR_RESEL_ABORTED(18) (18)
1453#define SIR_MSG_OUT_DONE(19) (19)
1454#define SIR_AUTO_SENSE_DONE(20) (20)
1455#define SIR_DUMMY_INTERRUPT(21) (21)
1456#define SIR_DATA_OVERRUN(22) (22)
1457#define SIR_BAD_PHASE(23) (23)
1458#define SIR_MAX(23) (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) (1) /* unexpected data phase */
1469#define XE_BAD_PHASE(2) (2) /* illegal phase (4/5) */
1470#define XE_PARITY_ERR(4) (4) /* unrecovered SCSI parity error */
1471#define XE_SODL_UNRUN(1<<3) (1<<3)
1472#define XE_SWIDE_OVRUN(1<<4) (1<<4)
1473
1474/*==========================================================
1475**
1476** Negotiation status.
1477** nego_status field of struct ccb.
1478**
1479**==========================================================
1480*/
1481
1482#define NS_NOCHANGE(0) (0)
1483#define NS_SYNC(1) (1)
1484#define NS_WIDE(2) (2)
1485#define NS_PPR(4) (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) (0x01)
1497
1498/*==========================================================
1499**
1500** Capability bits in Inquire response byte 7.
1501**
1502**==========================================================
1503*/
1504
1505#define INQ7_QUEUE(0x02) (0x02)
1506#define INQ7_SYNC(0x10) (0x10)
1507#define INQ7_WIDE16(0x20) (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_SHIFT8 8
1518#define CCB_HASH_SIZE(1UL << 8) (1UL << CCB_HASH_SHIFT8)
1519#define CCB_HASH_MASK((1UL << 8)-1) (CCB_HASH_SIZE(1UL << 8)-1)
1520#define CCB_HASH_CODE(dsa)(((dsa) >> 11) & ((1UL << 8)-1)) (((dsa) >> 11) & CCB_HASH_MASK((1UL << 8)-1))
1521
1522/*==========================================================
1523**
1524** Declaration of structs.
1525**
1526**==========================================================
1527*/
1528
1529struct tcb;
1530struct lcb;
1531struct ccb;
1532struct ncb;
1533struct script;
1534
1535typedef struct ncb * ncb_p;
1536typedef struct tcb * tcb_p;
1537typedef struct lcb * lcb_p;
1538typedef struct ccb * ccb_p;
1539
1540struct link {
1541 ncrcmd l_cmd;
1542 ncrcmd l_paddr;
1543};
1544
1545struct usrcmd {
1546 u_longunsigned long target;
1547 u_longunsigned long lun;
1548 u_longunsigned long data;
1549 u_longunsigned long cmd;
1550};
1551
1552#define UC_SETSYNC10 10
1553#define UC_SETTAGS11 11
1554#define UC_SETDEBUG12 12
1555#define UC_SETORDER13 13
1556#define UC_SETWIDE14 14
1557#define UC_SETFLAG15 15
1558#define UC_SETVERBOSE17 17
1559#define UC_RESETDEV18 18
1560#define UC_CLEARDEV19 19
1561
1562#define UF_TRACE(0x01) (0x01)
1563#define UF_NODISC(0x02) (0x02)
1564#define UF_NOSCAN(0x04) (0x04)
1565
1566/*========================================================================
1567**
1568** Declaration of structs: target control block
1569**
1570**========================================================================
1571*/
1572struct 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_LUN64 > 1
1584 lcb_p *lmp; /* Other lcb's [1..MAX_LUN] */
1585#endif
1586 /*----------------------------------------------------------------
1587 ** Target capabilities.
1588 **----------------------------------------------------------------
1589 */
1590 u_charunsigned char inq_done; /* Target capabilities received */
1591 u_charunsigned char inq_byte7; /* Contains these capabilities */
1592
1593 /*----------------------------------------------------------------
1594 ** Some flags.
1595 **----------------------------------------------------------------
1596 */
1597 u_charunsigned 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_charunsigned char minsync;
1614/*1*/ u_charunsigned char sval;
1615/*2*/ u_shortunsigned short period;
1616/*0*/ u_charunsigned char maxoffs;
1617/*1*/ u_charunsigned char quirks;
1618/*2*/ u_charunsigned char widedone;
1619/*3*/ u_charunsigned char wval;
1620/*0*/ u_charunsigned char uval;
1621
1622#ifdef SCSI_NCR_INTEGRITY_CHECKING
1623 u_charunsigned char ic_min_sync;
1624 u_charunsigned char ic_max_width;
1625 u_charunsigned char ic_done;
1626#endif
1627 u_charunsigned char ic_maximums_set;
1628 u_charunsigned 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_charunsigned char usrsync;
1636 u_charunsigned char usrwide;
1637 u_shortunsigned short usrtags;
1638 u_charunsigned char usrflag;
1639};
1640
1641/*========================================================================
1642**
1643** Declaration of structs: lun control block
1644**
1645**========================================================================
1646*/
1647struct 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_shortunsigned short busyccbs; /* CCBs busy for this lun */
1676 u_shortunsigned short queuedccbs; /* CCBs queued to the controller*/
1677 u_shortunsigned short queuedepth; /* Queue depth for this lun */
1678 u_shortunsigned short scdev_depth; /* SCSI device queue depth */
1679 u_shortunsigned 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_shortunsigned short ia_tag; /* Tag allocation index */
1688 u_shortunsigned short if_tag; /* Tag release index */
1689 u_charunsigned char *cb_tags; /* Circular tags buffer */
1690 u_charunsigned char inq_byte7; /* Store unit CmdQ capability */
1691 u_charunsigned char usetags; /* Command queuing is active */
1692 u_charunsigned char to_clear; /* User wants to clear all tasks*/
1693 u_shortunsigned short maxtags; /* Max NR of tags asked by user */
1694 u_shortunsigned short numtags; /* Current number of tags */
1695
1696 /*----------------------------------------------------------------
1697 ** QUEUE FULL and ORDERED tag control.
1698 **----------------------------------------------------------------
1699 */
1700 u_shortunsigned short num_good; /* Nr of GOOD since QUEUE FULL */
1701 u_shortunsigned short tags_sum[2]; /* Tags sum counters */
1702 u_charunsigned char tags_si; /* Current index to tags sum */
1703 u_longunsigned 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*/
1717struct 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*/
1734struct 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
1754struct 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_charunsigned 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_LUN64 <= 1
1795#define ncr_lp(np, tp, lun)(!lun) ? (tp)->l0p : (tp)->lmp ? (tp)->lmp[(lun)] : 0 (!lun) ? (tp)->l0p : 0
1796#else
1797#define ncr_lp(np, tp, lun)(!lun) ? (tp)->l0p : (tp)->lmp ? (tp)->lmp[(lun)] : 0 \
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_REGscr0 scr0
1814#define HS_REGscr1 scr1
1815#define HS_PRTnc_scr1 nc_scr1
1816#define SS_REGscr2 scr2
1817#define SS_PRTnc_scr2 nc_scr2
1818#define HF_REGscr3 scr3
1819#define HF_PRTnc_scr3 nc_scr3
1820
1821/*
1822** Last four bytes (host)
1823*/
1824#define actualquirksphys.header.status[0] phys.header.status[0]
1825#define host_statusphys.header.status[1] phys.header.status[1]
1826#define scsi_statusphys.header.status[2] phys.header.status[2]
1827#define host_flagsphys.header.status[3] phys.header.status[3]
1828
1829/*
1830** Host flags
1831*/
1832#define HF_IN_PM01u 1u
1833#define HF_IN_PM1(1u<<1) (1u<<1)
1834#define HF_ACT_PM(1u<<2) (1u<<2)
1835#define HF_DP_SAVED(1u<<3) (1u<<3)
1836#define HF_AUTO_SENSE(1u<<4) (1u<<4)
1837#define HF_DATA_IN(1u<<5) (1u<<5)
1838#define HF_PM_TO_C(1u<<6) (1u<<6)
1839#define HF_EXT_ERR(1u<<7) (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) (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
1866struct 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((127))];
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*/
1903struct 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_charunsigned char cdb_buf[16]; /* Copy of CDB */
1919 u_charunsigned 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_charunsigned char scsi_smsg [12];
1934 u_charunsigned char scsi_smsg2[12];
1935
1936 /*----------------------------------------------------------------
1937 ** Miscellaneous status'.
1938 **----------------------------------------------------------------
1939 */
1940 u_charunsigned char nego_status; /* Negotiation status */
1941 u_charunsigned 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_charunsigned char sv_scsi_status;
1949 u_charunsigned char sv_xerr_status;
1950
1951 /*----------------------------------------------------------------
1952 ** Other fields.
1953 **----------------------------------------------------------------
1954 */
1955 u_longunsigned long p_ccb; /* BUS address of this CCB */
1956 u_charunsigned char sensecmd[6]; /* Sense command */
1957 u_charunsigned char to_abort; /* This CCB is to be aborted */
1958 u_shortunsigned short tag; /* Tag for this transfer */
1959 /* NO_TAG means no tag */
1960 u_charunsigned char tags_si; /* Lun tags sum index (0,1) */
1961
1962 u_charunsigned char target;
1963 u_charunsigned char lun;
1964 u_shortunsigned 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 + ((size_t) (&((struct ccb *)0)->lbl))) (cp->p_ccb + offsetof(struct ccb, lbl)((size_t) (&((struct ccb *)0)->lbl)))
1976
1977
1978/*========================================================================
1979**
1980** Declaration of structs: NCR device descriptor
1981**
1982**========================================================================
1983*/
1984struct 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_longunsigned long p_idletask;
1995 u_longunsigned long p_notask;
1996 u_longunsigned long p_bad_i_t_l;
1997 u_longunsigned 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_CODE131108 >= LinuxVersionCode(2,1,93)(((2)<<16)+((1)<<8)+(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_charunsigned 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_charunsigned 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((16))];
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_longunsigned long base_va; /* MMIO base virtual address */
2068 u_longunsigned long base2_va; /* On-chip RAM virtual address */
2069#endif
2070 u_longunsigned long base_ba; /* MMIO base bus address */
2071 u_longunsigned long base_io; /* IO space base address */
2072 u_longunsigned long base_ws; /* (MM)IO window size */
2073 u_longunsigned long base2_ba; /* On-chip RAM bus address */
2074 u_longunsigned long base2_ws; /* On-chip RAM window size */
2075 u_intunsigned 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_longunsigned long p_script; /* Actual script and scripth */
2089 u_longunsigned long p_scripth; /* bus addresses. */
2090 u_longunsigned long p_scripth0;
2091
2092 /*----------------------------------------------------------------
2093 ** General controller parameters and configuration.
2094 **----------------------------------------------------------------
2095 */
2096 pcidev_t pdev;
2097 u_shortunsigned short device_id; /* PCI device id */
2098 u_charunsigned char revision_id; /* PCI device revision id */
2099 u_charunsigned char bus; /* PCI BUS number */
2100 u_charunsigned char device_fn; /* PCI BUS device and function */
2101 u_charunsigned char myaddr; /* SCSI id of the adapter */
2102 u_charunsigned char maxburst; /* log base 2 of dwords burst */
2103 u_charunsigned char maxwide; /* Maximum transfer width */
2104 u_charunsigned char minsync; /* Minimum sync period factor */
2105 u_charunsigned char maxsync; /* Maximum sync period factor */
2106 u_charunsigned char maxoffs; /* Max scsi offset */
2107 u_charunsigned char multiplier; /* Clock multiplier (1,2,4) */
2108 u_charunsigned char clock_divn; /* Number of clock divisors */
2109 u_longunsigned long clock_khz; /* SCSI clock frequency in KHz */
2110 u_intunsigned 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_intunsigned int pciclock_min;
2120 u_intunsigned 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_longunsigned long p_squeue; /* Start queue BUS address */
2129 u_int32 *squeue; /* Start queue virtual address */
2130 u_shortunsigned short squeueput; /* Next free slot of the queue */
2131 u_shortunsigned short actccbs; /* Number of allocated CCBs */
2132 u_shortunsigned 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_shortunsigned 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_longunsigned long lasttime;
2148 u_longunsigned long settle_time; /* Resetting the SCSI BUS */
2149
2150 /*----------------------------------------------------------------
2151 ** Debugging and profiling.
2152 **----------------------------------------------------------------
2153 */
2154 struct ncr_reg regdump; /* Register dump */
2155 u_longunsigned 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_charunsigned char msgout[12]; /* Buffer for MESSAGE OUT */
2164 u_charunsigned char msgin [12]; /* Buffer for MESSAGE IN */
2165 u_int32 lastmsg; /* Last SCSI message sent */
2166 u_charunsigned char scratch; /* Scratch for SCSI receive */
2167
2168 /*----------------------------------------------------------------
2169 ** Miscellaneous configuration and status parameters.
2170 **----------------------------------------------------------------
2171 */
2172 u_charunsigned char scsi_mode; /* Current SCSI BUS mode */
2173 u_charunsigned char order; /* Tag order to use */
2174 u_charunsigned char verbose; /* Verbosity for this controller*/
2175 u_int32 ncr_cache; /* Used for cache test at init. */
2176 u_longunsigned long p_ncb; /* BUS address of this NCB */
2177
2178 /*----------------------------------------------------------------
2179 ** CCB lists and queue.
2180 **----------------------------------------------------------------
2181 */
2182 ccb_p ccbh[CCB_HASH_SIZE(1UL << 8)]; /* 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_shortunsigned short iarb_max; /* Max. # consecutive IARB hints*/
2201 u_shortunsigned 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_charunsigned 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_charunsigned 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_charunsigned 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 + ((size_t) (&((struct ncb *)0)->lbl))) (np->p_ncb + offsetof(struct ncb, lbl)((size_t) (&((struct ncb *)0)->lbl)))
2250#define NCB_SCRIPT_PHYS(np,lbl)(np->p_script + ((size_t) (&((struct script *)0)->lbl
)))
(np->p_script + offsetof (struct script, lbl)((size_t) (&((struct script *)0)->lbl)))
2251#define NCB_SCRIPTH_PHYS(np,lbl)(np->p_scripth + ((size_t) (&((struct scripth *)0)->
lbl)))
(np->p_scripth + offsetof (struct scripth,lbl)((size_t) (&((struct scripth *)0)->lbl)))
2252#define NCB_SCRIPTH0_PHYS(np,lbl)(np->p_scripth0+((size_t) (&((struct scripth *)0)->
lbl)))
(np->p_scripth0+offsetof (struct scripth,lbl)((size_t) (&((struct scripth *)0)->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*/
2279struct 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(256/4)*4 > 512
2338 ncrcmd resel_tag [ 18];
2339#elif MAX_TASKS(256/4)*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((127)) * SCR_SG_SIZE(2)];
2348 ncrcmd data_in2 [ 4];
2349 ncrcmd data_out [MAX_SCATTER((127)) * SCR_SG_SIZE(2)];
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*/
2363struct 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
2452static ccb_p ncr_alloc_ccb (ncb_p np);
2453static void ncr_complete (ncb_p np, ccb_p cp);
2454static void ncr_exception (ncb_p np);
2455static void ncr_free_ccb (ncb_p np, ccb_p cp);
2456static ccb_p ncr_ccb_from_dsa(ncb_p np, u_longunsigned long dsa);
2457static void ncr_init_tcb (ncb_p np, u_charunsigned char tn);
2458static lcb_p ncr_alloc_lcb (ncb_p np, u_charunsigned char tn, u_charunsigned char ln);
2459static lcb_p ncr_setup_lcb (ncb_p np, u_charunsigned char tn, u_charunsigned char ln,
2460 u_charunsigned char *inq_data);
2461static void ncr_getclock (ncb_p np, int mult);
2462static u_intunsigned int ncr_getpciclock (ncb_p np);
2463static void ncr_selectclock (ncb_p np, u_charunsigned char scntl3);
2464static ccb_p ncr_get_ccb (ncb_p np, u_charunsigned char tn, u_charunsigned char ln);
2465static void ncr_init (ncb_p np, int reset, char * msg, u_longunsigned long code);
2466static void ncr_int_sbmc (ncb_p np);
2467static void ncr_int_par (ncb_p np, u_shortunsigned short sist);
2468static void ncr_int_ma (ncb_p np);
2469static void ncr_int_sir (ncb_p np);
2470static void ncr_int_sto (ncb_p np);
2471static void ncr_int_udc (ncb_p np);
2472static void ncr_negotiate (ncb_p np, tcb_p tp);
2473static int ncr_prepare_nego(ncb_p np, ccb_p cp, u_charunsigned char *msgptr);
2474#ifdef SCSI_NCR_INTEGRITY_CHECKING
2475static int ncr_ic_nego(ncb_p np, ccb_p cp, Scsi_Cmnd *cmd, u_charunsigned char *msgptr);
2476#endif
2477static void ncr_script_copy_and_bind
2478 (ncb_p np, ncrcmd *src, ncrcmd *dst, int len);
2479static void ncr_script_fill (struct script * scr, struct scripth * scripth);
2480static int ncr_scatter_896R1 (ncb_p np, ccb_p cp, Scsi_Cmnd *cmd);
2481static int ncr_scatter (ncb_p np, ccb_p cp, Scsi_Cmnd *cmd);
2482static void ncr_getsync (ncb_p np, u_charunsigned char sfac, u_charunsigned char *fakp, u_charunsigned char *scntl3p);
2483static void ncr_get_xfer_info(ncb_p np, tcb_p tp, u_charunsigned char *factor, u_charunsigned char *offset, u_charunsigned char *width);
2484static void ncr_setsync (ncb_p np, ccb_p cp, u_charunsigned char scntl3, u_charunsigned char sxfer, u_charunsigned char scntl4);
2485static void ncr_set_sync_wide_status (ncb_p np, u_charunsigned char target);
2486static void ncr_setup_tags (ncb_p np, u_charunsigned char tn, u_charunsigned char ln);
2487static void ncr_setwide (ncb_p np, ccb_p cp, u_charunsigned char wide, u_charunsigned char ack);
2488static void ncr_setsyncwide (ncb_p np, ccb_p cp, u_charunsigned char scntl3, u_charunsigned char sxfer, u_charunsigned char scntl4, u_charunsigned char wide);
2489static int ncr_show_msg (u_charunsigned char * msg);
2490static void ncr_print_msg (ccb_p cp, char *label, u_charunsigned char * msg);
2491static int ncr_snooptest (ncb_p np);
2492static void ncr_timeout (ncb_p np);
2493static void ncr_wakeup (ncb_p np, u_longunsigned long code);
2494static int ncr_wakeup_done (ncb_p np);
2495static void ncr_start_next_ccb (ncb_p np, lcb_p lp, int maxn);
2496static void ncr_put_start_queue(ncb_p np, ccb_p cp);
2497static void ncr_chip_reset (ncb_p np);
2498static void ncr_soft_reset (ncb_p np);
2499static void ncr_start_reset (ncb_p np);
2500static int ncr_reset_scsi_bus (ncb_p np, int enab_int, int settle_delay);
2501static int ncr_compute_residual (ncb_p np, ccb_p cp);
2502
2503#ifdef SCSI_NCR_USER_COMMAND_SUPPORT
2504static void ncr_usercmd (ncb_p np);
2505#endif
2506
2507static int ncr_attach (Scsi_Host_Template *tpnt, int unit, ncr_device *device);
2508static void ncr_free_resources(ncb_p np);
2509
2510static void insert_into_waiting_list(ncb_p np, Scsi_Cmnd *cmd);
2511static Scsi_Cmnd *retrieve_from_waiting_list(int to_remove, ncb_p np, Scsi_Cmnd *cmd);
2512static void process_waiting_list(ncb_p np, int sts);
2513
2514#define remove_from_waiting_list(np, cmd)retrieve_from_waiting_list(1, (np), (cmd)) \
2515 retrieve_from_waiting_list(1, (np), (cmd))
2516#define requeue_waiting_list(np)process_waiting_list((np), 0x00) process_waiting_list((np), DID_OK0x00)
2517#define reset_waiting_list(np)process_waiting_list((np), 0x08) process_waiting_list((np), DID_RESET0x08)
2518
2519#ifdef SCSI_NCR_NVRAM_SUPPORT
2520static void ncr_get_nvram (ncr_device *devp, ncr_nvram *nvp);
2521static int sym_read_Tekram_nvram (ncr_slot *np, u_shortunsigned short device_id,
2522 Tekram_nvram *nvram);
2523static 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
2535static inlineinline __attribute__((always_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_SOFTC0x40000000 0x40000000
2561#define RELOC_LABEL0x50000000 0x50000000
2562#define RELOC_REGISTER0x60000000 0x60000000
2563#if 0
2564#define RELOC_KVAR 0x70000000
2565#endif
2566#define RELOC_LABELH0x80000000 0x80000000
2567#define RELOC_MASK0xf0000000 0xf0000000
2568
2569#define NADDR(label)(0x40000000 | ((size_t) (&((struct ncb *)0)->label))) (RELOC_SOFTC0x40000000 | offsetof(struct ncb, label)((size_t) (&((struct ncb *)0)->label)))
2570#define PADDR(label)(0x50000000 | ((size_t) (&((struct script *)0)->label)
))
(RELOC_LABEL0x50000000 | offsetof(struct script, label)((size_t) (&((struct script *)0)->label)))
2571#define PADDRH(label)(0x80000000 | ((size_t) (&((struct scripth *)0)->label
)))
(RELOC_LABELH0x80000000 | offsetof(struct scripth, label)((size_t) (&((struct scripth *)0)->label)))
2572#define RADDR(label)(0x60000000 | (((size_t) (&((struct ncr_reg *)0)->nc_label
))))
(RELOC_REGISTER0x60000000 | REG(label)(((size_t) (&((struct ncr_reg *)0)->nc_label))))
2573#define FADDR(label,ofs)(0x60000000 | (((((size_t) (&((struct ncr_reg *)0)->nc_label
))))+(ofs)))
(RELOC_REGISTER0x60000000 | ((REG(label)(((size_t) (&((struct ncr_reg *)0)->nc_label))))+(ofs)))
2574#define KVAR(which)(RELOC_KVAR | (which)) (RELOC_KVAR | (which))
2575
2576#define SCR_DATA_ZERO0xf00ff00f 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 */
2586static void *script_kvars[] __initdata =
2587 { (void *)&jiffies };
2588#endif
2589
2590static 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_OP0x80000000,
2597 0,
2598 /*
2599 ** Clear SIGP.
2600 */
2601 SCR_FROM_REG (ctest2)(0x70000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_ctest2)))) & 0x7f) << 16ul) + (((((size_t) (&
((struct ncr_reg *)0)->nc_ctest2)))) & 0x80))) | (0x02000000
) | (((0)&0xff)<<8ul))
,
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)(0x70000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_istat)))) & 0x7f) << 16ul) + (((((size_t) (&
((struct ncr_reg *)0)->nc_istat)))) & 0x80))) | (0x02000000
) | (((0)&0xff)<<8ul))
,
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)(0xe1000000 | 0x02000000 | (((((((size_t) (&((struct ncr_reg
*)0)->nc_scratcha)))) & 0xff) << 16ul)) | (4))
,
2617 PADDRH (startpos)(0x80000000 | ((size_t) (&((struct scripth *)0)->startpos
)))
,
2618 SCR_INT0x98080000 ^ IFTRUE (MASK (SEM, SEM))(0x00000000 | ((0x00040000 | (((0x10 ^ 0xff) & 0xff) <<
8ul)|((0x10) & 0xff))))
,
2619 SIR_SCRIPT_STOPPED(7),
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)(0xe1000000 | 0x02000000 | (((((((size_t) (&((struct ncr_reg
*)0)->nc_dsa)))) & 0xff) << 16ul)) | (4))
,
2636 PADDRH (startpos)(0x80000000 | ((size_t) (&((struct scripth *)0)->startpos
)))
,
2637 SCR_LOAD_REL (temp, 4)(0xe1000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_temp)))) & 0xff) << 16ul
)) | (4))
,
2638 4,
2639}/*-------------------------< GETJOB_BEGIN >------------------*/,{
2640 SCR_STORE_ABS (temp, 4)(0xe0000000 | 0x02000000 | (((((((size_t) (&((struct ncr_reg
*)0)->nc_temp)))) & 0xff) << 16ul)) | (4))
,
2641 PADDRH (startpos)(0x80000000 | ((size_t) (&((struct scripth *)0)->startpos
)))
,
2642 SCR_LOAD_REL (dsa, 4)(0xe1000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_dsa)))) & 0xff) << 16ul)
) | (4))
,
2643 0,
2644}/*-------------------------< GETJOB_END >--------------------*/,{
2645 SCR_LOAD_REL (temp, 4)(0xe1000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_temp)))) & 0xff) << 16ul
)) | (4))
,
2646 0,
2647 SCR_RETURN0x90080000,
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)(0x60000000 | (0x00000200)),
2664 0,
2665 /*
2666 ** And try to select this target.
2667 */
2668 SCR_SEL_TBL_ATN0x43000000 ^ offsetof (struct dsb, select)((size_t) (&((struct dsb *)0)->select)),
2669 PADDR (ungetjob)(0x50000000 | ((size_t) (&((struct script *)0)->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)(0xe1000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_temp)))) & 0xff) << 16ul
)) | (4))
,
2704 offsetof (struct ccb, phys.header.savep)((size_t) (&((struct ccb *)0)->phys.header.savep)),
2705 /*
2706 ** Initialize the status registers
2707 */
2708 SCR_LOAD_REL (scr0, 4)(0xe1000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_scr0)))) & 0xff) << 16ul
)) | (4))
,
2709 offsetof (struct ccb, phys.header.status)((size_t) (&((struct ccb *)0)->phys.header.status)),
2710
2711}/*-------------------------< WF_SEL_DONE >----------------------*/,{
2712 SCR_INT0x98080000 ^ IFFALSE (WHEN (SCR_MSG_OUT))(0x00080000 | ((0x00030000 | (0x06000000)))),
2713 SIR_SEL_ATN_NO_MSG_OUT(2),
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(0x10000000 | 0x08000000) ^ SCR_MSG_OUT0x06000000,
2721 offsetof (struct dsb, smsg)((size_t) (&((struct dsb *)0)->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)(0x70000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_scr3)))) & 0x7f) << 16ul) + (((((size_t) (&(
(struct ncr_reg *)0)->nc_scr3)))) & 0x80))) | (0x02000000
) | (((0)&0xff)<<8ul))
,
2729 0,
2730 SCR_JUMPR0x80880000 ^ IFFALSE (MASK (HF_HINT_IARB, HF_HINT_IARB))(0x00080000 | ((0x00040000 | (((HF_HINT_IARB ^ 0xff) & 0xff
) << 8ul)|((HF_HINT_IARB) & 0xff))))
,
2731 8,
2732 SCR_REG_REG (scntl1, SCR_OR, IARB)(0x78000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_scntl1)))) & 0x7f) << 16ul) + (((((size_t) (&
((struct ncr_reg *)0)->nc_scntl1)))) & 0x80))) | (0x02000000
) | (((0x02)&0xff)<<8ul))
,
2733 0,
2734#endif
2735 /*
2736 ** Anticipate the COMMAND phase.
2737 ** This is the PHASE we expect at this point.
2738 */
2739 SCR_JUMP0x80080000 ^ IFFALSE (WHEN (SCR_COMMAND))(0x00080000 | ((0x00030000 | (0x02000000)))),
2740 PADDR (sel_no_cmd)(0x50000000 | ((size_t) (&((struct script *)0)->sel_no_cmd
)))
,
2741
2742}/*-------------------------< COMMAND >--------------------*/,{
2743 /*
2744 ** ... and send the command
2745 */
2746 SCR_MOVE_TBL(0x10000000 | 0x08000000) ^ SCR_COMMAND0x02000000,
2747 offsetof (struct dsb, cmd)((size_t) (&((struct dsb *)0)->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_JUMP0x80080000 ^ IFTRUE (WHEN (SCR_MSG_IN))(0x00000000 | ((0x00030000 | (0x07000000)))),
2756 PADDR (msg_in)(0x50000000 | ((size_t) (&((struct script *)0)->msg_in
)))
,
2757 SCR_JUMP0x80080000 ^ IFTRUE (IF (SCR_DATA_OUT))(0x00000000 | ((0x00020000 | (0x00000000)))),
2758 PADDR (datao_phase)(0x50000000 | ((size_t) (&((struct script *)0)->datao_phase
)))
,
2759 SCR_JUMP0x80080000 ^ IFTRUE (IF (SCR_DATA_IN))(0x00000000 | ((0x00020000 | (0x01000000)))),
2760 PADDR (datai_phase)(0x50000000 | ((size_t) (&((struct script *)0)->datai_phase
)))
,
2761 SCR_JUMP0x80080000 ^ IFTRUE (IF (SCR_STATUS))(0x00000000 | ((0x00020000 | (0x03000000)))),
2762 PADDR (status)(0x50000000 | ((size_t) (&((struct script *)0)->status
)))
,
2763 SCR_JUMP0x80080000 ^ IFTRUE (IF (SCR_COMMAND))(0x00000000 | ((0x00020000 | (0x02000000)))),
2764 PADDR (command)(0x50000000 | ((size_t) (&((struct script *)0)->command
)))
,
2765 SCR_JUMP0x80080000 ^ IFTRUE (IF (SCR_MSG_OUT))(0x00000000 | ((0x00020000 | (0x06000000)))),
2766 PADDRH (msg_out)(0x80000000 | ((size_t) (&((struct scripth *)0)->msg_out
)))
,
2767 /*
2768 * Discard as many illegal phases as
2769 * required and tell the C code about.
2770 */
2771 SCR_JUMPR0x80880000 ^ IFFALSE (WHEN (SCR_ILG_OUT))(0x00080000 | ((0x00030000 | (0x04000000)))),
2772 16,
2773 SCR_MOVE_ABS (1)((0x00000000 | 0x08000000) | (1)) ^ SCR_ILG_OUT0x04000000,
2774 NADDR (scratch)(0x40000000 | ((size_t) (&((struct ncb *)0)->scratch))
)
,
2775 SCR_JUMPR0x80880000 ^ IFTRUE (WHEN (SCR_ILG_OUT))(0x00000000 | ((0x00030000 | (0x04000000)))),
2776 -16,
2777 SCR_JUMPR0x80880000 ^ IFFALSE (WHEN (SCR_ILG_IN))(0x00080000 | ((0x00030000 | (0x05000000)))),
2778 16,
2779 SCR_MOVE_ABS (1)((0x00000000 | 0x08000000) | (1)) ^ SCR_ILG_IN0x05000000,
2780 NADDR (scratch)(0x40000000 | ((size_t) (&((struct ncb *)0)->scratch))
)
,
2781 SCR_JUMPR0x80880000 ^ IFTRUE (WHEN (SCR_ILG_IN))(0x00000000 | ((0x00030000 | (0x05000000)))),
2782 -16,
2783 SCR_INT0x98080000,
2784 SIR_BAD_PHASE(23),
2785 SCR_JUMP0x80080000,
2786 PADDR (dispatch)(0x50000000 | ((size_t) (&((struct script *)0)->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_JUMP0x80080000 ^ IFTRUE (WHEN (SCR_MSG_OUT))(0x00000000 | ((0x00030000 | (0x06000000)))),
2796 PADDRH (resend_ident)(0x80000000 | ((size_t) (&((struct scripth *)0)->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_JUMP0x80080000 ^ IFTRUE (WHEN (SCR_MSG_IN))(0x00000000 | ((0x00030000 | (0x07000000)))),
2803 PADDR (dispatch)(0x50000000 | ((size_t) (&((struct script *)0)->dispatch
)))
,
2804 SCR_FROM_REG (HS_REG)(0x70000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_scr1)))) & 0x7f) << 16ul) + (((((size_t) (&(
(struct ncr_reg *)0)->nc_scr1)))) & 0x80))) | (0x02000000
) | (((0)&0xff)<<8ul))
,
2805 0,
2806 SCR_INT0x98080000 ^ IFTRUE (DATA (HS_NEGOTIATE))(0x00000000 | ((0x00040000 | (((2)) & 0xff)))),
2807 SIR_NEGO_FAILED(5),
2808 /*
2809 ** Jump to dispatcher.
2810 */
2811 SCR_JUMP0x80080000,
2812 PADDR (dispatch)(0x50000000 | ((size_t) (&((struct script *)0)->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)(0x70000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_sstat0)))) & 0x7f) << 16ul) + (((((size_t) (&
((struct ncr_reg *)0)->nc_sstat0)))) & 0x80))) | (0x02000000
) | (((0)&0xff)<<8ul))
,
2822 0,
2823 SCR_JUMPR0x80880000 ^ IFTRUE (MASK (IRST, IRST))(0x00000000 | ((0x00040000 | (((0x02 ^ 0xff) & 0xff) <<
8ul)|((0x02) & 0xff))))
,
2824 -16,
2825 SCR_JUMP0x80080000,
2826 PADDR (start)(0x50000000 | ((size_t) (&((struct script *)0)->start)
))
,
2827}/*-------------------------< CLRACK >----------------------*/,{
2828 /*
2829 ** Terminate possible pending message phase.
2830 */
2831 SCR_CLR (SCR_ACK)(0x60000000 | (0x00000040)),
2832 0,
2833 SCR_JUMP0x80080000,
2834 PADDR (dispatch)(0x50000000 | ((size_t) (&((struct script *)0)->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_JUMP0x80080000 ^ IFTRUE (WHEN (SCR_STATUS))(0x00000000 | ((0x00030000 | (0x03000000)))),
2844 PADDR (status)(0x50000000 | ((size_t) (&((struct script *)0)->status
)))
,
2845 SCR_JUMP0x80080000,
2846 PADDR (dispatch)(0x50000000 | ((size_t) (&((struct script *)0)->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_JUMP0x80080000 ^ IFTRUE (WHEN (SCR_DATA_IN))(0x00000000 | ((0x00030000 | (0x01000000)))),
2854 PADDRH (data_ovrun)(0x80000000 | ((size_t) (&((struct scripth *)0)->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)(0x70000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_scntl2)))) & 0x7f) << 16ul) + (((((size_t) (&
((struct ncr_reg *)0)->nc_scntl2)))) & 0x80))) | (0x02000000
) | (((0)&0xff)<<8ul))
,
2862 0,
2863 SCR_JUMP0x80080000 ^ IFFALSE (MASK (WSR, WSR))(0x00080000 | ((0x00040000 | (((0x01 ^ 0xff) & 0xff) <<
8ul)|((0x01) & 0xff))))
,
2864 PADDR (disp_status)(0x50000000 | ((size_t) (&((struct script *)0)->disp_status
)))
,
2865 /*
2866 ** The SWIDE is full.
2867 ** Clear this condition.
2868 */
2869 SCR_REG_REG (scntl2, SCR_OR, WSR)(0x78000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_scntl2)))) & 0x7f) << 16ul) + (((((size_t) (&
((struct ncr_reg *)0)->nc_scntl2)))) & 0x80))) | (0x02000000
) | (((0x01)&0xff)<<8ul))
,
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_INT0x98080000 ^ IFFALSE (WHEN (SCR_MSG_IN))(0x00080000 | ((0x00030000 | (0x07000000)))),
2877 SIR_SWIDE_OVERRUN(9),
2878 SCR_JUMP0x80080000 ^ IFFALSE (WHEN (SCR_MSG_IN))(0x00080000 | ((0x00030000 | (0x07000000)))),
2879 PADDR (disp_status)(0x50000000 | ((size_t) (&((struct script *)0)->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)((0x00000000 | 0x08000000) | (1)) ^ SCR_MSG_IN0x07000000,
2888 NADDR (msgin[0])(0x40000000 | ((size_t) (&((struct ncb *)0)->msgin[0])
))
,
2889 SCR_INT0x98080000 ^ IFFALSE (DATA (M_IGN_RESIDUE))(0x00080000 | ((0x00040000 | (((0x23)) & 0xff)))),
2890 SIR_SWIDE_OVERRUN(9),
2891 SCR_JUMP0x80080000 ^ IFFALSE (DATA (M_IGN_RESIDUE))(0x00080000 | ((0x00040000 | (((0x23)) & 0xff)))),
2892 PADDR (msg_in2)(0x50000000 | ((size_t) (&((struct script *)0)->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)(0x60000000 | (0x00000040)),
2899 0,
2900 SCR_MOVE_ABS (1)((0x00000000 | 0x08000000) | (1)) ^ SCR_MSG_IN0x07000000,
2901 NADDR (msgin[1])(0x40000000 | ((size_t) (&((struct ncb *)0)->msgin[1])
))
,
2902 SCR_CLR (SCR_ACK)(0x60000000 | (0x00000040)),
2903 0,
2904 SCR_JUMP0x80080000,
2905 PADDR (disp_status)(0x50000000 | ((size_t) (&((struct script *)0)->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_JUMP0x80080000 ^ IFTRUE (WHEN (SCR_DATA_OUT))(0x00000000 | ((0x00030000 | (0x00000000)))),
2913 PADDRH (data_ovrun)(0x80000000 | ((size_t) (&((struct scripth *)0)->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)(0x70000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_scntl2)))) & 0x7f) << 16ul) + (((((size_t) (&
((struct ncr_reg *)0)->nc_scntl2)))) & 0x80))) | (0x02000000
) | (((0)&0xff)<<8ul))
,
2919 0,
2920 SCR_JUMP0x80080000 ^ IFFALSE (MASK (WSS, WSS))(0x00080000 | ((0x00040000 | (((0x08 ^ 0xff) & 0xff) <<
8ul)|((0x08) & 0xff))))
,
2921 PADDR (disp_status)(0x50000000 | ((size_t) (&((struct script *)0)->disp_status
)))
,
2922 /*
2923 ** The SODL is full, clear this condition.
2924 */
2925 SCR_REG_REG (scntl2, SCR_OR, WSS)(0x78000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_scntl2)))) & 0x7f) << 16ul) + (((((size_t) (&
((struct ncr_reg *)0)->nc_scntl2)))) & 0x80))) | (0x02000000
) | (((0x08)&0xff)<<8ul))
,
2926 0,
2927 /*
2928 ** And signal a DATA UNDERRUN condition
2929 ** to the C code.
2930 */
2931 SCR_INT0x98080000,
2932 SIR_SODL_UNDERRUN(10),
2933 SCR_JUMP0x80080000,
2934 PADDR (dispatch)(0x50000000 | ((size_t) (&((struct script *)0)->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)((0x00000000 | 0x08000000) | (2)) ^ SCR_MSG_IN0x07000000,
2945 NADDR (scratch)(0x40000000 | ((size_t) (&((struct ncb *)0)->scratch))
)
,
2946 /*
2947 ** Clear ACK and jump to dispatcher.
2948 */
2949 SCR_JUMP0x80080000,
2950 PADDR (clrack)(0x50000000 | ((size_t) (&((struct script *)0)->clrack
)))
,
2951
2952}/*-------------------------< DATAI_PHASE >------------------*/,{
2953 SCR_RETURN0x90080000,
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_OP0x80000000,
2964 0,
2965 SCR_RETURN0x90080000,
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)((0x00000000 | 0x08000000) | (1)) ^ SCR_MSG_IN0x07000000,
2975 NADDR (msgin[0])(0x40000000 | ((size_t) (&((struct ncb *)0)->msgin[0])
))
,
2976}/*-------------------------< MSG_IN2 >--------------------*/,{
2977 /*
2978 ** Check first against 1 byte messages
2979 ** that we handle from SCRIPTS.
2980 */
2981 SCR_JUMP0x80080000 ^ IFTRUE (DATA (M_COMPLETE))(0x00000000 | ((0x00040000 | (((0x00)) & 0xff)))),
2982 PADDR (complete)(0x50000000 | ((size_t) (&((struct script *)0)->complete
)))
,
2983 SCR_JUMP0x80080000 ^ IFTRUE (DATA (M_DISCONNECT))(0x00000000 | ((0x00040000 | (((0x04)) & 0xff)))),
2984 PADDR (disconnect)(0x50000000 | ((size_t) (&((struct script *)0)->disconnect
)))
,
2985 SCR_JUMP0x80080000 ^ IFTRUE (DATA (M_SAVE_DP))(0x00000000 | ((0x00040000 | (((0x02)) & 0xff)))),
2986 PADDR (save_dp)(0x50000000 | ((size_t) (&((struct script *)0)->save_dp
)))
,
2987 SCR_JUMP0x80080000 ^ IFTRUE (DATA (M_RESTORE_DP))(0x00000000 | ((0x00040000 | (((0x03)) & 0xff)))),
2988 PADDR (restore_dp)(0x50000000 | ((size_t) (&((struct script *)0)->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_JUMP0x80080000,
2995 PADDRH (msg_in_etc)(0x80000000 | ((size_t) (&((struct scripth *)0)->msg_in_etc
)))
,
2996
2997}/*-------------------------< STATUS >--------------------*/,{
2998 /*
2999 ** get the status
3000 */
3001 SCR_MOVE_ABS (1)((0x00000000 | 0x08000000) | (1)) ^ SCR_STATUS0x03000000,
3002 NADDR (scratch)(0x40000000 | ((size_t) (&((struct ncb *)0)->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_JUMPR0x80880000 ^ IFTRUE (DATA (S_GOOD))(0x00000000 | ((0x00040000 | (((0x00)) & 0xff)))),
3010 8,
3011 SCR_REG_REG (scntl1, SCR_AND, ~IARB)(0x78000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_scntl1)))) & 0x7f) << 16ul) + (((((size_t) (&
((struct ncr_reg *)0)->nc_scntl1)))) & 0x80))) | (0x04000000
) | (((~0x02)&0xff)<<8ul))
,
3012 0,
3013#endif
3014 /*
3015 ** save status to scsi_status.
3016 ** mark as complete.
3017 */
3018 SCR_TO_REG (SS_REG)(0x68000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_scr2)))) & 0x7f) << 16ul) + (((((size_t) (&(
(struct ncr_reg *)0)->nc_scr2)))) & 0x80))) | (0x02000000
) | (((0)&0xff)<<8ul))
,
3019 0,
3020 SCR_LOAD_REG (HS_REG, HS_COMPLETE)(0x78000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_scr1)))) & 0x7f) << 16ul) + (((((size_t) (&(
(struct ncr_reg *)0)->nc_scr1)))) & 0x80))) | (0x00000000
) | ((((4|(0x80)))&0xff)<<8ul))
,
3021 0,
3022 /*
3023 ** Anticipate the MESSAGE PHASE for
3024 ** the TASK COMPLETE message.
3025 */
3026 SCR_JUMP0x80080000 ^ IFTRUE (WHEN (SCR_MSG_IN))(0x00000000 | ((0x00030000 | (0x07000000)))),
3027 PADDR (msg_in)(0x50000000 | ((size_t) (&((struct script *)0)->msg_in
)))
,
3028 SCR_JUMP0x80080000,
3029 PADDR (dispatch)(0x50000000 | ((size_t) (&((struct script *)0)->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)(0xe0000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_temp)))) & 0xff) << 16ul
)) | (4))
,
3038 offsetof (struct ccb, phys.header.lastp)((size_t) (&((struct ccb *)0)->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)(0x78000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_scntl2)))) & 0x7f) << 16ul) + (((((size_t) (&
((struct ncr_reg *)0)->nc_scntl2)))) & 0x80))) | (0x04000000
) | (((0x7f)&0xff)<<8ul))
,
3048 0,
3049 /*
3050 ** Terminate cycle ...
3051 */
3052 SCR_CLR (SCR_ACK|SCR_ATN)(0x60000000 | (0x00000040|0x00000008)),
3053 0,
3054 /*
3055 ** ... and wait for the disconnect.
3056 */
3057 SCR_WAIT_DISC0x48000000,
3058 0,
3059}/*-------------------------< COMPLETE2 >-----------------*/,{
3060 /*
3061 ** Save host status to header.
3062 */
3063 SCR_STORE_REL (scr0, 4)(0xe0000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_scr0)))) & 0xff) << 16ul
)) | (4))
,
3064 offsetof (struct ccb, phys.header.status)((size_t) (&((struct ccb *)0)->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)(0xe1000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_scr0)))) & 0xff) << 16ul
)) | (4))
, /* DUMMY READ */
3076 offsetof (struct ccb, phys.header.status)((size_t) (&((struct ccb *)0)->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)(0x70000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_scr2)))) & 0x7f) << 16ul) + (((((size_t) (&(
(struct ncr_reg *)0)->nc_scr2)))) & 0x80))) | (0x02000000
) | (((0)&0xff)<<8ul))
,
3083 0,
3084 SCR_CALL0x88080000 ^ IFFALSE (DATA (S_GOOD))(0x00080000 | ((0x00040000 | (((0x00)) & 0xff)))),
3085 PADDRH (bad_status)(0x80000000 | ((size_t) (&((struct scripth *)0)->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)(0x70000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_scr3)))) & 0x7f) << 16ul) + (((((size_t) (&(
(struct ncr_reg *)0)->nc_scr3)))) & 0x80))) | (0x02000000
) | (((0)&0xff)<<8ul))
,
3093 0,
3094 SCR_INT0x98080000 ^ IFTRUE (MASK (HF_AUTO_SENSE, HF_AUTO_SENSE))(0x00000000 | ((0x00040000 | ((((1u<<4) ^ 0xff) & 0xff
) << 8ul)|(((1u<<4)) & 0xff))))
,
3095 SIR_AUTO_SENSE_DONE(20),
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)(0x70000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_istat)))) & 0x7f) << 16ul) + (((((size_t) (&
((struct ncr_reg *)0)->nc_istat)))) & 0x80))) | (0x02000000
) | (((0)&0xff)<<8ul))
,
3112 0,
3113 SCR_INT0x98080000 ^ IFTRUE (MASK (INTF, INTF))(0x00000000 | ((0x00040000 | (((0x04 ^ 0xff) & 0xff) <<
8ul)|((0x04) & 0xff))))
,
3114 SIR_DUMMY_INTERRUPT(21),
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)(0xe0000000 | 0x02000000 | (((((((size_t) (&((struct ncr_reg
*)0)->nc_dsa)))) & 0xff) << 16ul)) | (4))
,
3124 PADDRH (saved_dsa)(0x80000000 | ((size_t) (&((struct scripth *)0)->saved_dsa
)))
,
3125 SCR_LOAD_ABS (dsa, 4)(0xe1000000 | 0x02000000 | (((((((size_t) (&((struct ncr_reg
*)0)->nc_dsa)))) & 0xff) << 16ul)) | (4))
,
3126 PADDRH (done_pos)(0x80000000 | ((size_t) (&((struct scripth *)0)->done_pos
)))
,
3127 SCR_LOAD_ABS (scratcha, 4)(0xe1000000 | 0x02000000 | (((((((size_t) (&((struct ncr_reg
*)0)->nc_scratcha)))) & 0xff) << 16ul)) | (4))
,
3128 PADDRH (saved_dsa)(0x80000000 | ((size_t) (&((struct scripth *)0)->saved_dsa
)))
,
3129 SCR_STORE_REL (scratcha, 4)(0xe0000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_scratcha)))) & 0xff) << 16ul
)) | (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)(0xe1000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_temp)))) & 0xff) << 16ul
)) | (4))
,
3139 4,
3140 SCR_INT_FLY0x98180000,
3141 0,
3142 SCR_STORE_ABS (temp, 4)(0xe0000000 | 0x02000000 | (((((((size_t) (&((struct ncr_reg
*)0)->nc_temp)))) & 0xff) << 16ul)) | (4))
,
3143 PADDRH (done_pos)(0x80000000 | ((size_t) (&((struct scripth *)0)->done_pos
)))
,
3144}/*------------------------< DONE_END >-----------------*/,{
3145 SCR_JUMP0x80080000,
3146 PADDR (start)(0x50000000 | ((size_t) (&((struct script *)0)->start)
))
,
3147
3148}/*-------------------------< SAVE_DP >------------------*/,{
3149 /*
3150 ** Clear ACK immediately.
3151 ** No need to delay it.
3152 */
3153 SCR_CLR (SCR_ACK)(0x60000000 | (0x00000040)),
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)(0x78000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_scr3)))) & 0x7f) << 16ul) + (((((size_t) (&(
(struct ncr_reg *)0)->nc_scr3)))) & 0x80))) | (0x02000000
) | ((((1u<<3))&0xff)<<8ul))
,
3162 0,
3163 /*
3164 ** SAVE_DP message:
3165 ** Copy the data pointer to SAVEP in header.
3166 */
3167 SCR_STORE_REL (temp, 4)(0xe0000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_temp)))) & 0xff) << 16ul
)) | (4))
,
3168 offsetof (struct ccb, phys.header.savep)((size_t) (&((struct ccb *)0)->phys.header.savep)),
3169 SCR_JUMP0x80080000,
3170 PADDR (dispatch)(0x50000000 | ((size_t) (&((struct script *)0)->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)(0xe1000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_temp)))) & 0xff) << 16ul
)) | (4))
,
3177 offsetof (struct ccb, phys.header.savep)((size_t) (&((struct ccb *)0)->phys.header.savep)),
3178 SCR_JUMP0x80080000,
3179 PADDR (clrack)(0x50000000 | ((size_t) (&((struct script *)0)->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)(0x78000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_scntl2)))) & 0x7f) << 16ul) + (((((size_t) (&
((struct ncr_reg *)0)->nc_scntl2)))) & 0x80))) | (0x04000000
) | (((0x7f)&0xff)<<8ul))
,
3189 0,
3190 SCR_CLR (SCR_ACK|SCR_ATN)(0x60000000 | (0x00000040|0x00000008)),
3191 0,
3192 /*
3193 ** Wait for the disconnect.
3194 */
3195 SCR_WAIT_DISC0x48000000,
3196 0,
3197 /*
3198 ** Status is: DISCONNECTED.
3199 */
3200 SCR_LOAD_REG (HS_REG, HS_DISCONNECT)(0x78000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_scr1)))) & 0x7f) << 16ul) + (((((size_t) (&(
(struct ncr_reg *)0)->nc_scr1)))) & 0x80))) | (0x00000000
) | ((((3))&0xff)<<8ul))
,
3201 0,
3202 /*
3203 ** Save host status to header.
3204 */
3205 SCR_STORE_REL (scr0, 4)(0xe0000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_scr0)))) & 0xff) << 16ul
)) | (4))
,
3206 offsetof (struct ccb, phys.header.status)((size_t) (&((struct ccb *)0)->phys.header.status)),
3207 /*
3208 ** If QUIRK_AUTOSAVE is set,
3209 ** do an "save pointer" operation.
3210 */
3211 SCR_FROM_REG (QU_REG)(0x70000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_scr0)))) & 0x7f) << 16ul) + (((((size_t) (&(
(struct ncr_reg *)0)->nc_scr0)))) & 0x80))) | (0x02000000
) | (((0)&0xff)<<8ul))
,
3212 0,
3213 SCR_JUMP0x80080000 ^ IFFALSE (MASK (QUIRK_AUTOSAVE, QUIRK_AUTOSAVE))(0x00080000 | ((0x00040000 | ((((0x01) ^ 0xff) & 0xff) <<
8ul)|(((0x01)) & 0xff))))
,
3214 PADDR (start)(0x50000000 | ((size_t) (&((struct script *)0)->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)(0x78000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_scr3)))) & 0x7f) << 16ul) + (((((size_t) (&(
(struct ncr_reg *)0)->nc_scr3)))) & 0x80))) | (0x02000000
) | ((((1u<<3))&0xff)<<8ul))
,
3221 0,
3222 SCR_STORE_REL (temp, 4)(0xe0000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_temp)))) & 0xff) << 16ul
)) | (4))
,
3223 offsetof (struct ccb, phys.header.savep)((size_t) (&((struct ccb *)0)->phys.header.savep)),
3224 SCR_JUMP0x80080000,
3225 PADDR (start)(0x50000000 | ((size_t) (&((struct script *)0)->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_OP0x80000000,
3235 0,
3236#ifdef SCSI_NCR_IARB_SUPPORT
3237 SCR_JUMPR0x80880000,
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)(0x78000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_scntl1)))) & 0x7f) << 16ul) + (((((size_t) (&
((struct ncr_reg *)0)->nc_scntl1)))) & 0x80))) | (0x02000000
) | (((0x02)&0xff)<<8ul))
,
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)(0x78000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_dsa)))) & 0x7f) << 16ul) + (((((size_t) (&((
struct ncr_reg *)0)->nc_dsa)))) & 0x80))) | (0x00000000
) | (((0xff)&0xff)<<8ul))
,
3257 0,
3258 SCR_STORE_ABS (scratcha, 4)(0xe0000000 | 0x02000000 | (((((((size_t) (&((struct ncr_reg
*)0)->nc_scratcha)))) & 0xff) << 16ul)) | (4))
,
3259 PADDRH (startpos)(0x80000000 | ((size_t) (&((struct scripth *)0)->startpos
)))
,
3260}/*-------------------------< RESELECT >--------------------*/,{
3261 /*
3262 ** make the host status invalid.
3263 */
3264 SCR_CLR (SCR_TRG)(0x60000000 | (0x00000200)),
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_RESEL0x50000000,
3273 PADDR(start)(0x50000000 | ((size_t) (&((struct script *)0)->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_OP0x80000000,
3280 0,
3281 /*
3282 ** load the target id into the sdid
3283 */
3284 SCR_REG_SFBR (ssid, SCR_AND, 0x8F)(0x70000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_ssid)))) & 0x7f) << 16ul) + (((((size_t) (&(
(struct ncr_reg *)0)->nc_ssid)))) & 0x80))) | (0x04000000
) | (((0x8F)&0xff)<<8ul))
,
3285 0,
3286 SCR_TO_REG (sdid)(0x68000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_sdid)))) & 0x7f) << 16ul) + (((((size_t) (&(
(struct ncr_reg *)0)->nc_sdid)))) & 0x80))) | (0x02000000
) | (((0)&0xff)<<8ul))
,
3287 0,
3288 /*
3289 ** load the target control block address
3290 */
3291 SCR_LOAD_ABS (dsa, 4)(0xe1000000 | 0x02000000 | (((((((size_t) (&((struct ncr_reg
*)0)->nc_dsa)))) & 0xff) << 16ul)) | (4))
,
3292 PADDRH (targtbl)(0x80000000 | ((size_t) (&((struct scripth *)0)->targtbl
)))
,
3293 SCR_SFBR_REG (dsa, SCR_SHL, 0)(0x68000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_dsa)))) & 0x7f) << 16ul) + (((((size_t) (&((
struct ncr_reg *)0)->nc_dsa)))) & 0x80))) | (0x01000000
) | (((0)&0xff)<<8ul))
,
3294 0,
3295 SCR_REG_REG (dsa, SCR_SHL, 0)(0x78000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_dsa)))) & 0x7f) << 16ul) + (((((size_t) (&((
struct ncr_reg *)0)->nc_dsa)))) & 0x80))) | (0x01000000
) | (((0)&0xff)<<8ul))
,
3296 0,
3297 SCR_REG_REG (dsa, SCR_AND, 0x3c)(0x78000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_dsa)))) & 0x7f) << 16ul) + (((((size_t) (&((
struct ncr_reg *)0)->nc_dsa)))) & 0x80))) | (0x04000000
) | (((0x3c)&0xff)<<8ul))
,
3298 0,
3299 SCR_LOAD_REL (dsa, 4)(0xe1000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_dsa)))) & 0xff) << 16ul)
) | (4))
,
3300 0,
3301 /*
3302 ** Load the synchronous transfer registers.
3303 */
3304 SCR_LOAD_REL (scntl3, 1)(0xe1000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_scntl3)))) & 0xff) << 16ul
)) | (1))
,
3305 offsetof(struct tcb, wval)((size_t) (&((struct tcb *)0)->wval)),
3306 SCR_LOAD_REL (sxfer, 1)(0xe1000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_sxfer)))) & 0xff) << 16ul
)) | (1))
,
3307 offsetof(struct tcb, sval)((size_t) (&((struct tcb *)0)->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_OP0x80000000,
3318 0,
3319 /*
3320 * We expect MESSAGE IN phase.
3321 * If not, get help from the C code.
3322 */
3323 SCR_INT0x98080000 ^ IFFALSE (WHEN (SCR_MSG_IN))(0x00080000 | ((0x00030000 | (0x07000000)))),
3324 SIR_RESEL_NO_MSG_IN(11),
3325 SCR_MOVE_ABS (1)((0x00000000 | 0x08000000) | (1)) ^ SCR_MSG_IN0x07000000,
3326 NADDR (msgin)(0x40000000 | ((size_t) (&((struct ncb *)0)->msgin))),
3327
3328 /*
3329 * If IDENTIFY LUN #0, use a faster path
3330 * to find the LCB structure.
3331 */
3332 SCR_JUMPR0x80880000 ^ IFTRUE (MASK (0x80, 0xbf))(0x00000000 | ((0x00040000 | (((0xbf ^ 0xff) & 0xff) <<
8ul)|((0x80) & 0xff))))
,
3333 56,
3334 /*
3335 * If message isn't an IDENTIFY,
3336 * tell the C code about.
3337 */
3338 SCR_INT0x98080000 ^ IFFALSE (MASK (0x80, 0x80))(0x00080000 | ((0x00040000 | (((0x80 ^ 0xff) & 0xff) <<
8ul)|((0x80) & 0xff))))
,
3339 SIR_RESEL_NO_IDENTIFY(12),
3340 /*
3341 * It is an IDENTIFY message,
3342 * Load the LUN control block address.
3343 */
3344 SCR_LOAD_REL (dsa, 4)(0xe1000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_dsa)))) & 0xff) << 16ul)
) | (4))
,
3345 offsetof(struct tcb, b_luntbl)((size_t) (&((struct tcb *)0)->b_luntbl)),
3346 SCR_SFBR_REG (dsa, SCR_SHL, 0)(0x68000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_dsa)))) & 0x7f) << 16ul) + (((((size_t) (&((
struct ncr_reg *)0)->nc_dsa)))) & 0x80))) | (0x01000000
) | (((0)&0xff)<<8ul))
,
3347 0,
3348 SCR_REG_REG (dsa, SCR_SHL, 0)(0x78000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_dsa)))) & 0x7f) << 16ul) + (((((size_t) (&((
struct ncr_reg *)0)->nc_dsa)))) & 0x80))) | (0x01000000
) | (((0)&0xff)<<8ul))
,
3349 0,
3350 SCR_REG_REG (dsa, SCR_AND, 0xfc)(0x78000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_dsa)))) & 0x7f) << 16ul) + (((((size_t) (&((
struct ncr_reg *)0)->nc_dsa)))) & 0x80))) | (0x04000000
) | (((0xfc)&0xff)<<8ul))
,
3351 0,
3352 SCR_LOAD_REL (dsa, 4)(0xe1000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_dsa)))) & 0xff) << 16ul)
) | (4))
,
3353 0,
3354 SCR_JUMPR0x80880000,
3355 8,
3356 /*
3357 ** LUN 0 special case (but usual one :))
3358 */
3359 SCR_LOAD_REL (dsa, 4)(0xe1000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_dsa)))) & 0xff) << 16ul)
) | (4))
,
3360 offsetof(struct tcb, b_lun0)((size_t) (&((struct tcb *)0)->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)(0xe1000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_temp)))) & 0xff) << 16ul
)) | (4))
,
3368 offsetof(struct lcb, resel_task)((size_t) (&((struct lcb *)0)->resel_task)),
3369 SCR_LOAD_REL (dsa, 4)(0xe1000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_dsa)))) & 0xff) << 16ul)
) | (4))
,
3370 offsetof(struct lcb, b_tasktbl)((size_t) (&((struct lcb *)0)->b_tasktbl)),
3371 SCR_RETURN0x90080000,
3372 0,
3373}/*-------------------------< RESEL_TAG >-------------------*/,{
3374 /*
3375 ** ACK the IDENTIFY or TAG previously received
3376 */
3377
3378 SCR_CLR (SCR_ACK)(0x60000000 | (0x00000040)),
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)((0x00000000 | 0x08000000) | (2)) ^ SCR_MSG_IN0x07000000,
3387 NADDR (msgin)(0x40000000 | ((size_t) (&((struct ncb *)0)->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)(0x70000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_sidl)))) & 0x7f) << 16ul) + (((((size_t) (&(
(struct ncr_reg *)0)->nc_sidl)))) & 0x80))) | (0x01000000
) | (((0)&0xff)<<8ul))
,
3396 0,
3397#if MAX_TASKS(256/4)*4 > 512
3398 SCR_JUMPR0x80880000 ^ IFFALSE (CARRYSET)(0x00080000 | ((0x00200000))),
3399 8,
3400 SCR_REG_REG (dsa1, SCR_OR, 2)(0x78000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_dsa1)))) & 0x7f) << 16ul) + (((((size_t) (&(
(struct ncr_reg *)0)->nc_dsa1)))) & 0x80))) | (0x02000000
) | (((2)&0xff)<<8ul))
,
3401 0,
3402 SCR_REG_REG (sfbr, SCR_SHL, 0)(0x78000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_sfbr)))) & 0x7f) << 16ul) + (((((size_t) (&(
(struct ncr_reg *)0)->nc_sfbr)))) & 0x80))) | (0x01000000
) | (((0)&0xff)<<8ul))
,
3403 0,
3404 SCR_JUMPR0x80880000 ^ IFFALSE (CARRYSET)(0x00080000 | ((0x00200000))),
3405 8,
3406 SCR_REG_REG (dsa1, SCR_OR, 1)(0x78000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_dsa1)))) & 0x7f) << 16ul) + (((((size_t) (&(
(struct ncr_reg *)0)->nc_dsa1)))) & 0x80))) | (0x02000000
) | (((1)&0xff)<<8ul))
,
3407 0,
3408#elif MAX_TASKS(256/4)*4 > 256
3409 SCR_JUMPR0x80880000 ^ IFFALSE (CARRYSET)(0x00080000 | ((0x00200000))),
3410 8,
3411 SCR_REG_REG (dsa1, SCR_OR, 1)(0x78000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_dsa1)))) & 0x7f) << 16ul) + (((((size_t) (&(
(struct ncr_reg *)0)->nc_dsa1)))) & 0x80))) | (0x02000000
) | (((1)&0xff)<<8ul))
,
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)(0x68000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_dsa)))) & 0x7f) << 16ul) + (((((size_t) (&((
struct ncr_reg *)0)->nc_dsa)))) & 0x80))) | (0x04000000
) | (((0xfc)&0xff)<<8ul))
,
3419 0,
3420}/*-------------------------< RESEL_GO >-------------------*/,{
3421 SCR_LOAD_REL (dsa, 4)(0xe1000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_dsa)))) & 0xff) << 16ul)
) | (4))
,
3422 0,
3423 SCR_LOAD_REL (temp, 4)(0xe1000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_temp)))) & 0xff) << 16ul
)) | (4))
,
3424 offsetof(struct ccb, phys.header.go.restart)((size_t) (&((struct ccb *)0)->phys.header.go.restart)
)
,
3425 SCR_RETURN0x90080000,
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_JUMP0x80080000,
3433 PADDR (resel_go)(0x50000000 | ((size_t) (&((struct script *)0)->resel_go
)))
,
3434
3435}/*-------------------------< RESEL_DSA >-------------------*/,{
3436 /*
3437 ** Ack the IDENTIFY or TAG previously received.
3438 */
3439 SCR_CLR (SCR_ACK)(0x60000000 | (0x00000040)),
3440 0,
3441 /*
3442 ** load the savep (saved pointer) into
3443 ** the actual data pointer.
3444 */
3445 SCR_LOAD_REL (temp, 4)(0xe1000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_temp)))) & 0xff) << 16ul
)) | (4))
,
3446 offsetof (struct ccb, phys.header.savep)((size_t) (&((struct ccb *)0)->phys.header.savep)),
3447 /*
3448 ** Initialize the status registers
3449 */
3450 SCR_LOAD_REL (scr0, 4)(0xe1000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_scr0)))) & 0xff) << 16ul
)) | (4))
,
3451 offsetof (struct ccb, phys.header.status)((size_t) (&((struct ccb *)0)->phys.header.status)),
3452 /*
3453 ** Jump to dispatcher.
3454 */
3455 SCR_JUMP0x80080000,
3456 PADDR (dispatch)(0x50000000 | ((size_t) (&((struct script *)0)->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*/
34710
3472}/*-------------------------< DATA_IN2 >-------------------*/,{
3473 SCR_CALL0x88080000,
3474 PADDR (datai_done)(0x50000000 | ((size_t) (&((struct script *)0)->datai_done
)))
,
3475 SCR_JUMP0x80080000,
3476 PADDRH (data_ovrun)(0x80000000 | ((size_t) (&((struct scripth *)0)->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*/
34900
3491}/*-------------------------< DATA_OUT2 >-------------------*/,{
3492 SCR_CALL0x88080000,
3493 PADDR (datao_done)(0x50000000 | ((size_t) (&((struct script *)0)->datao_done
)))
,
3494 SCR_JUMP0x80080000,
3495 PADDRH (data_ovrun)(0x80000000 | ((size_t) (&((struct scripth *)0)->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)(0x70000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_scr3)))) & 0x7f) << 16ul) + (((((size_t) (&(
(struct ncr_reg *)0)->nc_scr3)))) & 0x80))) | (0x02000000
) | (((0)&0xff)<<8ul))
,
3503 0,
3504 /*
3505 ** Check against actual DATA PHASE.
3506 */
3507 SCR_JUMP0x80080000 ^ IFFALSE (WHEN (SCR_DATA_IN))(0x00080000 | ((0x00030000 | (0x01000000)))),
3508 PADDR (pm0_data_out)(0x50000000 | ((size_t) (&((struct script *)0)->pm0_data_out
)))
,
3509 /*
3510 ** Actual phase is DATA IN.
3511 ** Check against expected direction.
3512 */
3513 SCR_JUMP0x80080000 ^ IFFALSE (MASK (HF_DATA_IN, HF_DATA_IN))(0x00080000 | ((0x00040000 | ((((1u<<5) ^ 0xff) & 0xff
) << 8ul)|(((1u<<5)) & 0xff))))
,
3514 PADDRH (data_ovrun)(0x80000000 | ((size_t) (&((struct scripth *)0)->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)(0x78000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_scr3)))) & 0x7f) << 16ul) + (((((size_t) (&(
(struct ncr_reg *)0)->nc_scr3)))) & 0x80))) | (0x02000000
) | (((1u)&0xff)<<8ul))
,
3520 0,
3521 /*
3522 ** Move the data to memory.
3523 */
3524 SCR_CHMOV_TBL(0x10000000) ^ SCR_DATA_IN0x01000000,
3525 offsetof (struct ccb, phys.pm0.sg)((size_t) (&((struct ccb *)0)->phys.pm0.sg)),
3526 SCR_JUMP0x80080000,
3527 PADDR (pm0_data_end)(0x50000000 | ((size_t) (&((struct script *)0)->pm0_data_end
)))
,
3528}/*-------------------------< PM0_DATA_OUT >----------------*/,{
3529 /*
3530 ** Actual phase is DATA OUT.
3531 ** Check against expected direction.
3532 */
3533 SCR_JUMP0x80080000 ^ IFTRUE (MASK (HF_DATA_IN, HF_DATA_IN))(0x00000000 | ((0x00040000 | ((((1u<<5) ^ 0xff) & 0xff
) << 8ul)|(((1u<<5)) & 0xff))))
,
3534 PADDRH (data_ovrun)(0x80000000 | ((size_t) (&((struct scripth *)0)->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)(0x78000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_scr3)))) & 0x7f) << 16ul) + (((((size_t) (&(
(struct ncr_reg *)0)->nc_scr3)))) & 0x80))) | (0x02000000
) | (((1u)&0xff)<<8ul))
,
3540 0,
3541 /*
3542 ** Move the data from memory.
3543 */
3544 SCR_CHMOV_TBL(0x10000000) ^ SCR_DATA_OUT0x00000000,
3545 offsetof (struct ccb, phys.pm0.sg)((size_t) (&((struct ccb *)0)->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))(0x78000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_scr3)))) & 0x7f) << 16ul) + (((((size_t) (&(
(struct ncr_reg *)0)->nc_scr3)))) & 0x80))) | (0x04000000
) | ((((~1u))&0xff)<<8ul))
,
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)(0xe1000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_temp)))) & 0xff) << 16ul
)) | (4))
,
3559 offsetof (struct ccb, phys.pm0.ret)((size_t) (&((struct ccb *)0)->phys.pm0.ret)),
3560 SCR_RETURN0x90080000,
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)(0x70000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_scr3)))) & 0x7f) << 16ul) + (((((size_t) (&(
(struct ncr_reg *)0)->nc_scr3)))) & 0x80))) | (0x02000000
) | (((0)&0xff)<<8ul))
,
3568 0,
3569 /*
3570 ** Check against actual DATA PHASE.
3571 */
3572 SCR_JUMP0x80080000 ^ IFFALSE (WHEN (SCR_DATA_IN))(0x00080000 | ((0x00030000 | (0x01000000)))),
3573 PADDR (pm1_data_out)(0x50000000 | ((size_t) (&((struct script *)0)->pm1_data_out
)))
,
3574 /*
3575 ** Actual phase is DATA IN.
3576 ** Check against expected direction.
3577 */
3578 SCR_JUMP0x80080000 ^ IFFALSE (MASK (HF_DATA_IN, HF_DATA_IN))(0x00080000 | ((0x00040000 | ((((1u<<5) ^ 0xff) & 0xff
) << 8ul)|(((1u<<5)) & 0xff))))
,
3579 PADDRH (data_ovrun)(0x80000000 | ((size_t) (&((struct scripth *)0)->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)(0x78000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_scr3)))) & 0x7f) << 16ul) + (((((size_t) (&(
(struct ncr_reg *)0)->nc_scr3)))) & 0x80))) | (0x02000000
) | ((((1u<<1))&0xff)<<8ul))
,
3585 0,
3586 /*
3587 ** Move the data to memory.
3588 */
3589 SCR_CHMOV_TBL(0x10000000) ^ SCR_DATA_IN0x01000000,
3590 offsetof (struct ccb, phys.pm1.sg)((size_t) (&((struct ccb *)0)->phys.pm1.sg)),
3591 SCR_JUMP0x80080000,
3592 PADDR (pm1_data_end)(0x50000000 | ((size_t) (&((struct script *)0)->pm1_data_end
)))
,
3593}/*-------------------------< PM1_DATA_OUT >----------------*/,{
3594 /*
3595 ** Actual phase is DATA OUT.
3596 ** Check against expected direction.
3597 */
3598 SCR_JUMP0x80080000 ^ IFTRUE (MASK (HF_DATA_IN, HF_DATA_IN))(0x00000000 | ((0x00040000 | ((((1u<<5) ^ 0xff) & 0xff
) << 8ul)|(((1u<<5)) & 0xff))))
,
3599 PADDRH (data_ovrun)(0x80000000 | ((size_t) (&((struct scripth *)0)->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)(0x78000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_scr3)))) & 0x7f) << 16ul) + (((((size_t) (&(
(struct ncr_reg *)0)->nc_scr3)))) & 0x80))) | (0x02000000
) | ((((1u<<1))&0xff)<<8ul))
,
3605 0,
3606 /*
3607 ** Move the data from memory.
3608 */
3609 SCR_CHMOV_TBL(0x10000000) ^ SCR_DATA_OUT0x00000000,
3610 offsetof (struct ccb, phys.pm1.sg)((size_t) (&((struct ccb *)0)->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))(0x78000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_scr3)))) & 0x7f) << 16ul) + (((((size_t) (&(
(struct ncr_reg *)0)->nc_scr3)))) & 0x80))) | (0x04000000
) | ((((~(1u<<1)))&0xff)<<8ul))
,
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)(0xe1000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_temp)))) & 0xff) << 16ul
)) | (4))
,
3624 offsetof (struct ccb, phys.pm1.ret)((size_t) (&((struct ccb *)0)->phys.pm1.ret)),
3625 SCR_RETURN0x90080000,
3626 0,
3627}/*---------------------------------------------------------*/
3628};
3629
3630
3631static 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_JUMP0x80080000,
3639 PADDR (init)(0x50000000 | ((size_t) (&((struct script *)0)->init))
)
,
3640}/*-------------------------< NO_DATA >-------------------*/,{
3641 SCR_JUMP0x80080000,
3642 PADDRH (data_ovrun)(0x80000000 | ((size_t) (&((struct scripth *)0)->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)(0x60000000 | (0x00000200)),
3656 0,
3657 /*
3658 ** And try to select this target.
3659 */
3660 SCR_SEL_TBL_ATN0x43000000 ^ offsetof (struct ncb, abrt_sel)((size_t) (&((struct ncb *)0)->abrt_sel)),
3661 PADDR (reselect)(0x50000000 | ((size_t) (&((struct script *)0)->reselect
)))
,
3662
3663 /*
3664 ** Wait for the selection to complete or
3665 ** the selection to time out.
3666 */
3667 SCR_JUMPR0x80880000 ^ IFFALSE (WHEN (SCR_MSG_OUT))(0x00080000 | ((0x00030000 | (0x06000000)))),
3668 -8,
3669 /*
3670 ** Call the C code.
3671 */
3672 SCR_INT0x98080000,
3673 SIR_TARGET_SELECTED(14),
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)(0x78000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_scntl2)))) & 0x7f) << 16ul) + (((((size_t) (&
((struct ncr_reg *)0)->nc_scntl2)))) & 0x80))) | (0x04000000
) | (((0x7f)&0xff)<<8ul))
,
3681 0,
3682 SCR_MOVE_TBL(0x10000000 | 0x08000000) ^ SCR_MSG_OUT0x06000000,
3683 offsetof (struct ncb, abrt_tbl)((size_t) (&((struct ncb *)0)->abrt_tbl)),
3684 SCR_CLR (SCR_ACK|SCR_ATN)(0x60000000 | (0x00000040|0x00000008)),
3685 0,
3686 SCR_WAIT_DISC0x48000000,
3687 0,
3688 /*
3689 ** Tell the C code that we are done.
3690 */
3691 SCR_INT0x98080000,
3692 SIR_ABORT_SENT(17),
3693}/*-----------------------< SEL_FOR_ABORT_1 >--------------*/,{
3694 /*
3695 ** Jump at scheduler.
3696 */
3697 SCR_JUMP0x80080000,
3698 PADDR (start)(0x50000000 | ((size_t) (&((struct script *)0)->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)(0x60000000 | (0x00000200)),
3707 0,
3708 SCR_SEL_TBL0x42000000 ^ offsetof (struct dsb, select)((size_t) (&((struct dsb *)0)->select)),
3709 PADDR (ungetjob)(0x50000000 | ((size_t) (&((struct script *)0)->ungetjob
)))
,
3710 /*
3711 ** load the savep (saved pointer) into
3712 ** the actual data pointer.
3713 */
3714 SCR_LOAD_REL (temp, 4)(0xe1000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_temp)))) & 0xff) << 16ul
)) | (4))
,
3715 offsetof (struct ccb, phys.header.savep)((size_t) (&((struct ccb *)0)->phys.header.savep)),
3716 /*
3717 ** Initialize the status registers
3718 */
3719 SCR_LOAD_REL (scr0, 4)(0xe1000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_scr0)))) & 0xff) << 16ul
)) | (4))
,
3720 offsetof (struct ccb, phys.header.status)((size_t) (&((struct ccb *)0)->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_JUMPR0x80880000 ^ IFFALSE (WHEN (SCR_MSG_OUT))(0x00080000 | ((0x00030000 | (0x06000000)))),
3728 0,
3729 SCR_JUMP0x80080000,
3730 PADDR (select2)(0x50000000 | ((size_t) (&((struct script *)0)->select2
)))
,
3731
3732}/*-------------------------< MSG_IN_ETC >--------------------*/,{
3733 /*
3734 ** If it is an EXTENDED (variable size message)
3735 ** Handle it.
3736 */
3737 SCR_JUMP0x80080000 ^ IFTRUE (DATA (M_EXTENDED))(0x00000000 | ((0x00040000 | (((0x01)) & 0xff)))),
3738 PADDRH (msg_extended)(0x80000000 | ((size_t) (&((struct scripth *)0)->msg_extended
)))
,
3739 /*
3740 ** Let the C code handle any other
3741 ** 1 byte message.
3742 */
3743 SCR_JUMP0x80080000 ^ IFTRUE (MASK (0x00, 0xf0))(0x00000000 | ((0x00040000 | (((0xf0 ^ 0xff) & 0xff) <<
8ul)|((0x00) & 0xff))))
,
3744 PADDRH (msg_received)(0x80000000 | ((size_t) (&((struct scripth *)0)->msg_received
)))
,
3745 SCR_JUMP0x80080000 ^ IFTRUE (MASK (0x10, 0xf0))(0x00000000 | ((0x00040000 | (((0xf0 ^ 0xff) & 0xff) <<
8ul)|((0x10) & 0xff))))
,
3746 PADDRH (msg_received)(0x80000000 | ((size_t) (&((struct scripth *)0)->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_JUMP0x80080000 ^ IFFALSE (MASK (0x20, 0xf0))(0x00080000 | ((0x00040000 | (((0xf0 ^ 0xff) & 0xff) <<
8ul)|((0x20) & 0xff))))
,
3752 PADDRH (msg_weird_seen)(0x80000000 | ((size_t) (&((struct scripth *)0)->msg_weird_seen
)))
,
3753 SCR_CLR (SCR_ACK)(0x60000000 | (0x00000040)),
3754 0,
3755 SCR_MOVE_ABS (1)((0x00000000 | 0x08000000) | (1)) ^ SCR_MSG_IN0x07000000,
3756 NADDR (msgin[1])(0x40000000 | ((size_t) (&((struct ncb *)0)->msgin[1])
))
,
3757 SCR_JUMP0x80080000,
3758 PADDRH (msg_received)(0x80000000 | ((size_t) (&((struct scripth *)0)->msg_received
)))
,
3759
3760}/*-------------------------< MSG_RECEIVED >--------------------*/,{
3761 SCR_LOAD_REL (scratcha, 4)(0xe1000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_scratcha)))) & 0xff) << 16ul
)) | (4))
, /* DUMMY READ */
3762 0,
3763 SCR_INT0x98080000,
3764 SIR_MSG_RECEIVED(3),
3765
3766}/*-------------------------< MSG_WEIRD_SEEN >------------------*/,{
3767 SCR_LOAD_REL (scratcha1, 4)(0xe1000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_scratcha1)))) & 0xff) <<
16ul)) | (4))
, /* DUMMY READ */
3768 0,
3769 SCR_INT0x98080000,
3770 SIR_MSG_WEIRD(4),
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)(0x60000000 | (0x00000040)),
3778 0,
3779 SCR_MOVE_ABS (1)((0x00000000 | 0x08000000) | (1)) ^ SCR_MSG_IN0x07000000,
3780 NADDR (msgin[1])(0x40000000 | ((size_t) (&((struct ncb *)0)->msgin[1])
))
,
3781 /*
3782 ** Try to catch some unlikely situations as 0 length
3783 ** or too large the length.
3784 */
3785 SCR_JUMP0x80080000 ^ IFTRUE (DATA (0))(0x00000000 | ((0x00040000 | ((0) & 0xff)))),
3786 PADDRH (msg_weird_seen)(0x80000000 | ((size_t) (&((struct scripth *)0)->msg_weird_seen
)))
,
3787 SCR_TO_REG (scratcha)(0x68000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_scratcha)))) & 0x7f) << 16ul) + (((((size_t) (&
((struct ncr_reg *)0)->nc_scratcha)))) & 0x80))) | (0x02000000
) | (((0)&0xff)<<8ul))
,
3788 0,
3789 SCR_REG_REG (sfbr, SCR_ADD, (256-8))(0x78000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_sfbr)))) & 0x7f) << 16ul) + (((((size_t) (&(
(struct ncr_reg *)0)->nc_sfbr)))) & 0x80))) | (0x06000000
) | ((((256 -8))&0xff)<<8ul))
,
3790 0,
3791 SCR_JUMP0x80080000 ^ IFTRUE (CARRYSET)(0x00000000 | ((0x00200000))),
3792 PADDRH (msg_weird_seen)(0x80000000 | ((size_t) (&((struct scripth *)0)->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)(0xe0000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_scratcha)))) & 0xff) << 16ul
)) | (1))
,
3799 offsetof (struct dsb, smsg_ext.size)((size_t) (&((struct dsb *)0)->smsg_ext.size)),
3800 SCR_CLR (SCR_ACK)(0x60000000 | (0x00000040)),
3801 0,
3802 SCR_MOVE_TBL(0x10000000 | 0x08000000) ^ SCR_MSG_IN0x07000000,
3803 offsetof (struct dsb, smsg_ext)((size_t) (&((struct dsb *)0)->smsg_ext)),
3804 SCR_JUMP0x80080000,
3805 PADDRH (msg_received)(0x80000000 | ((size_t) (&((struct scripth *)0)->msg_received
)))
,
3806
3807}/*-------------------------< MSG_BAD >------------------*/,{
3808 /*
3809 ** unimplemented message - reject it.
3810 */
3811 SCR_INT0x98080000,
3812 SIR_REJECT_TO_SEND(8),
3813 SCR_SET (SCR_ATN)(0x58000000 | (0x00000008)),
3814 0,
3815 SCR_JUMP0x80080000,
3816 PADDR (clrack)(0x50000000 | ((size_t) (&((struct script *)0)->clrack
)))
,
3817
3818}/*-------------------------< MSG_WEIRD >--------------------*/,{
3819 /*
3820 ** weird message received
3821 ** ignore all MSG IN phases and reject it.
3822 */
3823 SCR_INT0x98080000,
3824 SIR_REJECT_TO_SEND(8),
3825 SCR_SET (SCR_ATN)(0x58000000 | (0x00000008)),
3826 0,
3827}/*-------------------------< MSG_WEIRD1 >--------------------*/,{
3828 SCR_CLR (SCR_ACK)(0x60000000 | (0x00000040)),
3829 0,
3830 SCR_JUMP0x80080000 ^ IFFALSE (WHEN (SCR_MSG_IN))(0x00080000 | ((0x00030000 | (0x07000000)))),
3831 PADDR (dispatch)(0x50000000 | ((size_t) (&((struct script *)0)->dispatch
)))
,
3832 SCR_MOVE_ABS (1)((0x00000000 | 0x08000000) | (1)) ^ SCR_MSG_IN0x07000000,
3833 NADDR (scratch)(0x40000000 | ((size_t) (&((struct ncb *)0)->scratch))
)
,
3834 SCR_JUMP0x80080000,
3835 PADDRH (msg_weird1)(0x80000000 | ((size_t) (&((struct scripth *)0)->msg_weird1
)))
,
3836}/*-------------------------< WDTR_RESP >----------------*/,{
3837 /*
3838 ** let the target fetch our answer.
3839 */
3840 SCR_SET (SCR_ATN)(0x58000000 | (0x00000008)),
3841 0,
3842 SCR_CLR (SCR_ACK)(0x60000000 | (0x00000040)),
3843 0,
3844 SCR_JUMP0x80080000 ^ IFFALSE (WHEN (SCR_MSG_OUT))(0x00080000 | ((0x00030000 | (0x06000000)))),
3845 PADDRH (nego_bad_phase)(0x80000000 | ((size_t) (&((struct scripth *)0)->nego_bad_phase
)))
,
3846
3847}/*-------------------------< SEND_WDTR >----------------*/,{
3848 /*
3849 ** Send the M_X_WIDE_REQ
3850 */
3851 SCR_MOVE_ABS (4)((0x00000000 | 0x08000000) | (4)) ^ SCR_MSG_OUT0x06000000,
3852 NADDR (msgout)(0x40000000 | ((size_t) (&((struct ncb *)0)->msgout))),
3853 SCR_JUMP0x80080000,
3854 PADDRH (msg_out_done)(0x80000000 | ((size_t) (&((struct scripth *)0)->msg_out_done
)))
,
3855
3856}/*-------------------------< SDTR_RESP >-------------*/,{
3857 /*
3858 ** let the target fetch our answer.
3859 */
3860 SCR_SET (SCR_ATN)(0x58000000 | (0x00000008)),
3861 0,
3862 SCR_CLR (SCR_ACK)(0x60000000 | (0x00000040)),
3863 0,
3864 SCR_JUMP0x80080000 ^ IFFALSE (WHEN (SCR_MSG_OUT))(0x00080000 | ((0x00030000 | (0x06000000)))),
3865 PADDRH (nego_bad_phase)(0x80000000 | ((size_t) (&((struct scripth *)0)->nego_bad_phase
)))
,
3866
3867}/*-------------------------< SEND_SDTR >-------------*/,{
3868 /*
3869 ** Send the M_X_SYNC_REQ
3870 */
3871 SCR_MOVE_ABS (5)((0x00000000 | 0x08000000) | (5)) ^ SCR_MSG_OUT0x06000000,
3872 NADDR (msgout)(0x40000000 | ((size_t) (&((struct ncb *)0)->msgout))),
3873 SCR_JUMP0x80080000,
3874 PADDRH (msg_out_done)(0x80000000 | ((size_t) (&((struct scripth *)0)->msg_out_done
)))
,
3875
3876}/*-------------------------< PPR_RESP >-------------*/,{
3877 /*
3878 ** let the target fetch our answer.
3879 */
3880 SCR_SET (SCR_ATN)(0x58000000 | (0x00000008)),
3881 0,
3882 SCR_CLR (SCR_ACK)(0x60000000 | (0x00000040)),
3883 0,
3884 SCR_JUMP0x80080000 ^ IFFALSE (WHEN (SCR_MSG_OUT))(0x00080000 | ((0x00030000 | (0x06000000)))),
3885 PADDRH (nego_bad_phase)(0x80000000 | ((size_t) (&((struct scripth *)0)->nego_bad_phase
)))
,
3886
3887}/*-------------------------< SEND_PPR >-------------*/,{
3888 /*
3889 ** Send the M_X_PPR_REQ
3890 */
3891 SCR_MOVE_ABS (8)((0x00000000 | 0x08000000) | (8)) ^ SCR_MSG_OUT0x06000000,
3892 NADDR (msgout)(0x40000000 | ((size_t) (&((struct ncb *)0)->msgout))),
3893 SCR_JUMP0x80080000,
3894 PADDRH (msg_out_done)(0x80000000 | ((size_t) (&((struct scripth *)0)->msg_out_done
)))
,
3895
3896}/*-------------------------< NEGO_BAD_PHASE >------------*/,{
3897 SCR_INT0x98080000,
3898 SIR_NEGO_PROTO(6),
3899 SCR_JUMP0x80080000,
3900 PADDR (dispatch)(0x50000000 | ((size_t) (&((struct script *)0)->dispatch
)))
,
3901
3902}/*-------------------------< MSG_OUT >-------------------*/,{
3903 /*
3904 ** The target requests a message.
3905 */
3906 SCR_MOVE_ABS (1)((0x00000000 | 0x08000000) | (1)) ^ SCR_MSG_OUT0x06000000,
3907 NADDR (msgout)(0x40000000 | ((size_t) (&((struct ncb *)0)->msgout))),
3908 /*
3909 ** ... wait for the next phase
3910 ** if it's a message out, send it again, ...
3911 */
3912 SCR_JUMP0x80080000 ^ IFTRUE (WHEN (SCR_MSG_OUT))(0x00000000 | ((0x00030000 | (0x06000000)))),
3913 PADDRH (msg_out)(0x80000000 | ((size_t) (&((struct scripth *)0)->msg_out
)))
,
3914}/*-------------------------< MSG_OUT_DONE >--------------*/,{
3915 /*
3916 ** ... else clear the message ...
3917 */
3918 SCR_INT0x98080000,
3919 SIR_MSG_OUT_DONE(19),
3920 /*
3921 ** ... and process the next phase
3922 */
3923 SCR_JUMP0x80080000,
3924 PADDR (dispatch)(0x50000000 | ((size_t) (&((struct script *)0)->dispatch
)))
,
3925
3926}/*-------------------------< DATA_OVRUN >-----------------------*/,{
3927 /*
3928 * Use scratcha to count the extra bytes.
3929 */
3930 SCR_LOAD_ABS (scratcha, 4)(0xe1000000 | 0x02000000 | (((((((size_t) (&((struct ncr_reg
*)0)->nc_scratcha)))) & 0xff) << 16ul)) | (4))
,
3931 PADDRH (zero)(0x80000000 | ((size_t) (&((struct scripth *)0)->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_JUMPR0x80880000 ^ IFFALSE (WHEN (SCR_DATA_OUT))(0x00080000 | ((0x00030000 | (0x00000000)))),
3939 16,
3940 SCR_CHMOV_ABS (1)((0x00000000) | (1)) ^ SCR_DATA_OUT0x00000000,
3941 NADDR (scratch)(0x40000000 | ((size_t) (&((struct ncb *)0)->scratch))
)
,
3942 SCR_JUMP0x80080000,
3943 PADDRH (data_ovrun2)(0x80000000 | ((size_t) (&((struct scripth *)0)->data_ovrun2
)))
,
3944 /*
3945 * If WSR is set, clear this condition, and
3946 * count this byte.
3947 */
3948 SCR_FROM_REG (scntl2)(0x70000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_scntl2)))) & 0x7f) << 16ul) + (((((size_t) (&
((struct ncr_reg *)0)->nc_scntl2)))) & 0x80))) | (0x02000000
) | (((0)&0xff)<<8ul))
,
3949 0,
3950 SCR_JUMPR0x80880000 ^ IFFALSE (MASK (WSR, WSR))(0x00080000 | ((0x00040000 | (((0x01 ^ 0xff) & 0xff) <<
8ul)|((0x01) & 0xff))))
,
3951 16,
3952 SCR_REG_REG (scntl2, SCR_OR, WSR)(0x78000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_scntl2)))) & 0x7f) << 16ul) + (((((size_t) (&
((struct ncr_reg *)0)->nc_scntl2)))) & 0x80))) | (0x02000000
) | (((0x01)&0xff)<<8ul))
,
3953 0,
3954 SCR_JUMP0x80080000,
3955 PADDRH (data_ovrun2)(0x80000000 | ((size_t) (&((struct scripth *)0)->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_JUMPR0x80880000 ^ IFTRUE (WHEN (SCR_DATA_IN))(0x00000000 | ((0x00030000 | (0x01000000)))),
3963 16,
3964 SCR_INT0x98080000,
3965 SIR_DATA_OVERRUN(22),
3966 SCR_JUMP0x80080000,
3967 PADDR (dispatch)(0x50000000 | ((size_t) (&((struct script *)0)->dispatch
)))
,
3968 SCR_CHMOV_ABS (1)((0x00000000) | (1)) ^ SCR_DATA_IN0x01000000,
3969 NADDR (scratch)(0x40000000 | ((size_t) (&((struct ncb *)0)->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)(0x78000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_scratcha)))) & 0x7f) << 16ul) + (((((size_t) (&
((struct ncr_reg *)0)->nc_scratcha)))) & 0x80))) | (0x06000000
) | (((0x01)&0xff)<<8ul))
,
3977 0,
3978 SCR_REG_REG (scratcha1, SCR_ADDC, 0)(0x78000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_scratcha1)))) & 0x7f) << 16ul) + (((((size_t) (&
((struct ncr_reg *)0)->nc_scratcha1)))) & 0x80))) | (0x07000000
) | (((0)&0xff)<<8ul))
,
3979 0,
3980 SCR_REG_REG (scratcha2, SCR_ADDC, 0)(0x78000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_scratcha2)))) & 0x7f) << 16ul) + (((((size_t) (&
((struct ncr_reg *)0)->nc_scratcha2)))) & 0x80))) | (0x07000000
) | (((0)&0xff)<<8ul))
,
3981 0,
3982 /*
3983 * .. and repeat as required.
3984 */
3985 SCR_JUMP0x80080000,
3986 PADDRH (data_ovrun1)(0x80000000 | ((size_t) (&((struct scripth *)0)->data_ovrun1
)))
,
3987
3988}/*-------------------------< ABORT_RESEL >----------------*/,{
3989 SCR_SET (SCR_ATN)(0x58000000 | (0x00000008)),
3990 0,
3991 SCR_CLR (SCR_ACK)(0x60000000 | (0x00000040)),
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)(0x78000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_scntl2)))) & 0x7f) << 16ul) + (((((size_t) (&
((struct ncr_reg *)0)->nc_scntl2)))) & 0x80))) | (0x04000000
) | (((0x7f)&0xff)<<8ul))
,
3998 0,
3999 SCR_MOVE_ABS (1)((0x00000000 | 0x08000000) | (1)) ^ SCR_MSG_OUT0x06000000,
4000 NADDR (msgout)(0x40000000 | ((size_t) (&((struct ncb *)0)->msgout))),
4001 SCR_CLR (SCR_ACK|SCR_ATN)(0x60000000 | (0x00000040|0x00000008)),
4002 0,
4003 SCR_WAIT_DISC0x48000000,
4004 0,
4005 SCR_INT0x98080000,
4006 SIR_RESEL_ABORTED(18),
4007 SCR_JUMP0x80080000,
4008 PADDR (start)(0x50000000 | ((size_t) (&((struct script *)0)->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)(0x58000000 | (0x00000008)), /* Shall be asserted 2 deskew delays before the */
4017 0, /* 1rst ACK = 90 ns. Hope the NCR is'nt too fast */
4018 SCR_JUMP0x80080000,
4019 PADDR (send_ident)(0x50000000 | ((size_t) (&((struct script *)0)->send_ident
)))
,
4020}/*-------------------------< IDENT_BREAK >-------------------*/,{
4021 SCR_CLR (SCR_ATN)(0x60000000 | (0x00000008)),
4022 0,
4023 SCR_JUMP0x80080000,
4024 PADDR (select2)(0x50000000 | ((size_t) (&((struct script *)0)->select2
)))
,
4025}/*-------------------------< IDENT_BREAK_ATN >----------------*/,{
4026 SCR_SET (SCR_ATN)(0x58000000 | (0x00000008)),
4027 0,
4028 SCR_JUMP0x80080000,
4029 PADDR (select2)(0x50000000 | ((size_t) (&((struct script *)0)->select2
)))
,
4030}/*-------------------------< SDATA_IN >-------------------*/,{
4031 SCR_CHMOV_TBL(0x10000000) ^ SCR_DATA_IN0x01000000,
4032 offsetof (struct dsb, sense)((size_t) (&((struct dsb *)0)->sense)),
4033 SCR_CALL0x88080000,
4034 PADDR (datai_done)(0x50000000 | ((size_t) (&((struct script *)0)->datai_done
)))
,
4035 SCR_JUMP0x80080000,
4036 PADDRH (data_ovrun)(0x80000000 | ((size_t) (&((struct scripth *)0)->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_JUMP0x80080000 ^ IFTRUE (WHEN (SCR_DATA_OUT))(0x00000000 | ((0x00030000 | (0x00000000)))),
4051 PADDRH(data_io_out)(0x80000000 | ((size_t) (&((struct scripth *)0)->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)(0xe1000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_scratcha)))) & 0xff) << 16ul
)) | (4))
,
4058 offsetof (struct ccb, phys.header.lastp)((size_t) (&((struct ccb *)0)->phys.header.lastp)),
4059 SCR_STORE_REL (scratcha, 4)(0xe0000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_scratcha)))) & 0xff) << 16ul
)) | (4))
,
4060 offsetof (struct ccb, phys.header.savep)((size_t) (&((struct ccb *)0)->phys.header.savep)),
4061
4062 /*
4063 ** Jump to the SCRIPTS according to actual direction.
4064 */
4065 SCR_LOAD_REL (temp, 4)(0xe1000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_temp)))) & 0xff) << 16ul
)) | (4))
,
4066 offsetof (struct ccb, phys.header.savep)((size_t) (&((struct ccb *)0)->phys.header.savep)),
4067 SCR_RETURN0x90080000,
4068 0,
4069}/*-------------------------< DATA_IO_OUT >-----------------*/,{
4070 /*
4071 ** Direction is DATA OUT.
4072 */
4073 SCR_REG_REG (HF_REG, SCR_AND, (~HF_DATA_IN))(0x78000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_scr3)))) & 0x7f) << 16ul) + (((((size_t) (&(
(struct ncr_reg *)0)->nc_scr3)))) & 0x80))) | (0x04000000
) | ((((~(1u<<5)))&0xff)<<8ul))
,
4074 0,
4075 SCR_LOAD_REL (scratcha, 4)(0xe1000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_scratcha)))) & 0xff) << 16ul
)) | (4))
,
4076 offsetof (struct ccb, phys.header.wlastp)((size_t) (&((struct ccb *)0)->phys.header.wlastp)),
4077 SCR_STORE_REL (scratcha, 4)(0xe0000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_scratcha)))) & 0xff) << 16ul
)) | (4))
,
4078 offsetof (struct ccb, phys.header.lastp)((size_t) (&((struct ccb *)0)->phys.header.lastp)),
4079 SCR_LOAD_REL (scratcha, 4)(0xe1000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_scratcha)))) & 0xff) << 16ul
)) | (4))
,
4080 offsetof (struct ccb, phys.header.wgoalp)((size_t) (&((struct ccb *)0)->phys.header.wgoalp)),
4081 SCR_STORE_REL (scratcha, 4)(0xe0000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_scratcha)))) & 0xff) << 16ul
)) | (4))
,
4082 offsetof (struct ccb, phys.header.goalp)((size_t) (&((struct ccb *)0)->phys.header.goalp)),
4083 SCR_JUMP0x80080000,
4084 PADDRH(data_io_com)(0x80000000 | ((size_t) (&((struct scripth *)0)->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_INT0x98080000,
4093 SIR_RESEL_BAD_LUN(13),
4094 SCR_JUMP0x80080000,
4095 PADDRH (abort_resel)(0x80000000 | ((size_t) (&((struct scripth *)0)->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_INT0x98080000,
4103 SIR_RESEL_BAD_I_T_L(15),
4104 SCR_JUMP0x80080000,
4105 PADDRH (abort_resel)(0x80000000 | ((size_t) (&((struct scripth *)0)->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_INT0x98080000,
4113 SIR_RESEL_BAD_I_T_L_Q(16),
4114 SCR_JUMP0x80080000,
4115 PADDRH (abort_resel)(0x80000000 | ((size_t) (&((struct scripth *)0)->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)(0xe1000000 | 0x02000000 | (((((((size_t) (&((struct ncr_reg
*)0)->nc_scratcha)))) & 0xff) << 16ul)) | (4))
,
4124 PADDRH (startpos)(0x80000000 | ((size_t) (&((struct scripth *)0)->startpos
)))
,
4125 SCR_INT0x98080000 ^ IFFALSE (DATA (S_COND_MET))(0x00080000 | ((0x00040000 | (((0x04)) & 0xff)))),
4126 SIR_BAD_STATUS(1),
4127 SCR_RETURN0x90080000,
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)(0x70000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_scr3)))) & 0x7f) << 16ul) + (((((size_t) (&(
(struct ncr_reg *)0)->nc_scr3)))) & 0x80))) | (0x02000000
) | (((0)&0xff)<<8ul))
,
4137 0,
4138 SCR_JUMPR0x80880000 ^ IFTRUE (MASK (HF_PM_TO_C, HF_PM_TO_C))(0x00000000 | ((0x00040000 | ((((1u<<6) ^ 0xff) & 0xff
) << 8ul)|(((1u<<6)) & 0xff))))
,
4139 16,
4140 SCR_REG_REG (ccntl0, SCR_OR, ENPMJ)(0x78000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_ccntl0)))) & 0x7f) << 16ul) + (((((size_t) (&
((struct ncr_reg *)0)->nc_ccntl0)))) & 0x80))) | (0x02000000
) | (((0x80)&0xff)<<8ul))
,
4141 0,
4142 SCR_RETURN0x90080000,
4143 0,
4144 SCR_REG_REG (ccntl0, SCR_AND, (~ENPMJ))(0x78000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_ccntl0)))) & 0x7f) << 16ul) + (((((size_t) (&
((struct ncr_reg *)0)->nc_ccntl0)))) & 0x80))) | (0x04000000
) | ((((~0x80))&0xff)<<8ul))
,
4145 0,
4146 SCR_RETURN0x90080000,
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)(0x70000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_scr3)))) & 0x7f) << 16ul) + (((((size_t) (&(
(struct ncr_reg *)0)->nc_scr3)))) & 0x80))) | (0x02000000
) | (((0)&0xff)<<8ul))
,
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_JUMP0x80080000 ^ IFTRUE (MASK (0, (HF_IN_PM0 | HF_IN_PM1 | HF_DP_SAVED)))(0x00000000 | ((0x00040000 | ((((1u | (1u<<1) | (1u<<
3)) ^ 0xff) & 0xff) << 8ul)|((0) & 0xff))))
,
4169 PADDRH (pm_handle1)(0x80000000 | ((size_t) (&((struct scripth *)0)->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_JUMPR0x80880000 ^ IFFALSE (MASK (HF_DP_SAVED, HF_DP_SAVED))(0x00080000 | ((0x00040000 | ((((1u<<3) ^ 0xff) & 0xff
) << 8ul)|(((1u<<3)) & 0xff))))
,
4176 8,
4177 SCR_REG_REG (sfbr, SCR_XOR, HF_ACT_PM)(0x78000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_sfbr)))) & 0x7f) << 16ul) + (((((size_t) (&(
(struct ncr_reg *)0)->nc_sfbr)))) & 0x80))) | (0x03000000
) | ((((1u<<2))&0xff)<<8ul))
,
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_JUMP0x80080000 ^ IFTRUE (MASK (0, (HF_IN_PM0 | HF_IN_PM1)))(0x00000000 | ((0x00040000 | ((((1u | (1u<<1)) ^ 0xff) &
0xff) << 8ul)|((0) & 0xff))))
,
4187 PADDRH (pm_handle1)(0x80000000 | ((size_t) (&((struct scripth *)0)->pm_handle1
)))
,
4188 SCR_JUMPR0x80880000 ^ IFFALSE (MASK (HF_IN_PM0, HF_IN_PM0))(0x00080000 | ((0x00040000 | (((1u ^ 0xff) & 0xff) <<
8ul)|((1u) & 0xff))))
,
4189 16,
4190 SCR_LOAD_REL (ia, 4)(0xe1000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_ia)))) & 0xff) << 16ul))
| (4))
,
4191 offsetof(struct ccb, phys.pm0.ret)((size_t) (&((struct ccb *)0)->phys.pm0.ret)),
4192 SCR_JUMP0x80080000,
4193 PADDRH (pm_save)(0x80000000 | ((size_t) (&((struct scripth *)0)->pm_save
)))
,
4194 SCR_LOAD_REL (ia, 4)(0xe1000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_ia)))) & 0xff) << 16ul))
| (4))
,
4195 offsetof(struct ccb, phys.pm1.ret)((size_t) (&((struct ccb *)0)->phys.pm1.ret)),
4196 SCR_JUMP0x80080000,
4197 PADDRH (pm_save)(0x80000000 | ((size_t) (&((struct scripth *)0)->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)(0x78000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_ia)))) & 0x7f) << 16ul) + (((((size_t) (&((struct
ncr_reg *)0)->nc_ia)))) & 0x80))) | (0x06000000) | ((
(8)&0xff)<<8ul))
,
4205 0,
4206 SCR_REG_REG (ia1, SCR_ADDC, 0)(0x78000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_ia1)))) & 0x7f) << 16ul) + (((((size_t) (&((
struct ncr_reg *)0)->nc_ia1)))) & 0x80))) | (0x07000000
) | (((0)&0xff)<<8ul))
,
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)))(0x68000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_scr3)))) & 0x7f) << 16ul) + (((((size_t) (&(
(struct ncr_reg *)0)->nc_scr3)))) & 0x80))) | (0x04000000
) | ((((~(1u|(1u<<1)|(1u<<3))))&0xff)<<
8ul))
,
4215 0,
4216 /*
4217 ** Choose the current PM context.
4218 */
4219 SCR_JUMP0x80080000 ^ IFTRUE (MASK (HF_ACT_PM, HF_ACT_PM))(0x00000000 | ((0x00040000 | ((((1u<<2) ^ 0xff) & 0xff
) << 8ul)|(((1u<<2)) & 0xff))))
,
4220 PADDRH (pm1_save)(0x80000000 | ((size_t) (&((struct scripth *)0)->pm1_save
)))
,
4221}/*-------------------------< PM0_SAVE >-------------------*/,{
4222 SCR_STORE_REL (ia, 4)(0xe0000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_ia)))) & 0xff) << 16ul))
| (4))
,
4223 offsetof(struct ccb, phys.pm0.ret)((size_t) (&((struct ccb *)0)->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)(0x70000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_scntl2)))) & 0x7f) << 16ul) + (((((size_t) (&
((struct ncr_reg *)0)->nc_scntl2)))) & 0x80))) | (0x02000000
) | (((0)&0xff)<<8ul))
,
4230 0,
4231 SCR_CALL0x88080000 ^ IFTRUE (MASK (WSR, WSR))(0x00000000 | ((0x00040000 | (((0x01 ^ 0xff) & 0xff) <<
8ul)|((0x01) & 0xff))))
,
4232 PADDRH (pm_wsr_handle)(0x80000000 | ((size_t) (&((struct scripth *)0)->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)(0xe0000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_rbc)))) & 0xff) << 16ul)
) | (4))
,
4238 offsetof(struct ccb, phys.pm0.sg.size)((size_t) (&((struct ccb *)0)->phys.pm0.sg.size)),
4239 SCR_STORE_REL (ua, 4)(0xe0000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_ua)))) & 0xff) << 16ul))
| (4))
,
4240 offsetof(struct ccb, phys.pm0.sg.addr)((size_t) (&((struct ccb *)0)->phys.pm0.sg.addr)),
4241 /*
4242 ** Set the current pointer at the PM0 DATA mini-script.
4243 */
4244 SCR_LOAD_ABS (temp, 4)(0xe1000000 | 0x02000000 | (((((((size_t) (&((struct ncr_reg
*)0)->nc_temp)))) & 0xff) << 16ul)) | (4))
,
4245 PADDRH (pm0_data_addr)(0x80000000 | ((size_t) (&((struct scripth *)0)->pm0_data_addr
)))
,
4246 SCR_JUMP0x80080000,
4247 PADDR (dispatch)(0x50000000 | ((size_t) (&((struct script *)0)->dispatch
)))
,
4248}/*-------------------------< PM1_SAVE >-------------------*/,{
4249 SCR_STORE_REL (ia, 4)(0xe0000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_ia)))) & 0xff) << 16ul))
| (4))
,
4250 offsetof(struct ccb, phys.pm1.ret)((size_t) (&((struct ccb *)0)->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)(0x70000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_scntl2)))) & 0x7f) << 16ul) + (((((size_t) (&
((struct ncr_reg *)0)->nc_scntl2)))) & 0x80))) | (0x02000000
) | (((0)&0xff)<<8ul))
,
4257 0,
4258 SCR_CALL0x88080000 ^ IFTRUE (MASK (WSR, WSR))(0x00000000 | ((0x00040000 | (((0x01 ^ 0xff) & 0xff) <<
8ul)|((0x01) & 0xff))))
,
4259 PADDRH (pm_wsr_handle)(0x80000000 | ((size_t) (&((struct scripth *)0)->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)(0xe0000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_rbc)))) & 0xff) << 16ul)
) | (4))
,
4265 offsetof(struct ccb, phys.pm1.sg.size)((size_t) (&((struct ccb *)0)->phys.pm1.sg.size)),
4266 SCR_STORE_REL (ua, 4)(0xe0000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_ua)))) & 0xff) << 16ul))
| (4))
,
4267 offsetof(struct ccb, phys.pm1.sg.addr)((size_t) (&((struct ccb *)0)->phys.pm1.sg.addr)),
4268 /*
4269 ** Set the current pointer at the PM1 DATA mini-script.
4270 */
4271 SCR_LOAD_ABS (temp, 4)(0xe1000000 | 0x02000000 | (((((((size_t) (&((struct ncr_reg
*)0)->nc_temp)))) & 0xff) << 16ul)) | (4))
,
4272 PADDRH (pm1_data_addr)(0x80000000 | ((size_t) (&((struct scripth *)0)->pm1_data_addr
)))
,
4273 SCR_JUMP0x80080000,
4274 PADDR (dispatch)(0x50000000 | ((size_t) (&((struct script *)0)->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_INT0x98080000,
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)(0xe0000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_ua)))) & 0xff) << 16ul))
| (4))
,
4297 offsetof (struct ccb, phys.wresid.addr)((size_t) (&((struct ccb *)0)->phys.wresid.addr)),
4298 /*
4299 * Increment UA (move address to next position).
4300 */
4301 SCR_REG_REG (ua, SCR_ADD, 1)(0x78000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_ua)))) & 0x7f) << 16ul) + (((((size_t) (&((struct
ncr_reg *)0)->nc_ua)))) & 0x80))) | (0x06000000) | ((
(1)&0xff)<<8ul))
,
4302 0,
4303 SCR_REG_REG (ua1, SCR_ADDC, 0)(0x78000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_ua1)))) & 0x7f) << 16ul) + (((((size_t) (&((
struct ncr_reg *)0)->nc_ua1)))) & 0x80))) | (0x07000000
) | (((0)&0xff)<<8ul))
,
4304 0,
4305 SCR_REG_REG (ua2, SCR_ADDC, 0)(0x78000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_ua2)))) & 0x7f) << 16ul) + (((((size_t) (&((
struct ncr_reg *)0)->nc_ua2)))) & 0x80))) | (0x07000000
) | (((0)&0xff)<<8ul))
,
4306 0,
4307 SCR_REG_REG (ua3, SCR_ADDC, 0)(0x78000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_ua3)))) & 0x7f) << 16ul) + (((((size_t) (&((
struct ncr_reg *)0)->nc_ua3)))) & 0x80))) | (0x07000000
) | (((0)&0xff)<<8ul))
,
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)(0xe1000000 | 0x02000000 | (((((((size_t) (&((struct ncr_reg
*)0)->nc_scratcha)))) & 0xff) << 16ul)) | (4))
,
4315 PADDRH (zero)(0x80000000 | ((size_t) (&((struct scripth *)0)->zero)
))
,
4316 SCR_REG_REG (scratcha, SCR_OR, 1)(0x78000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_scratcha)))) & 0x7f) << 16ul) + (((((size_t) (&
((struct ncr_reg *)0)->nc_scratcha)))) & 0x80))) | (0x02000000
) | (((1)&0xff)<<8ul))
,
4317 0,
4318 SCR_FROM_REG (rbc3)(0x70000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_rbc3)))) & 0x7f) << 16ul) + (((((size_t) (&(
(struct ncr_reg *)0)->nc_rbc3)))) & 0x80))) | (0x02000000
) | (((0)&0xff)<<8ul))
,
4319 0,
4320 SCR_TO_REG (scratcha3)(0x68000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_scratcha3)))) & 0x7f) << 16ul) + (((((size_t) (&
((struct ncr_reg *)0)->nc_scratcha3)))) & 0x80))) | (0x02000000
) | (((0)&0xff)<<8ul))
,
4321 0,
4322 /*
4323 * Move this value to the table indirect.
4324 */
4325 SCR_STORE_REL (scratcha, 4)(0xe0000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_scratcha)))) & 0xff) << 16ul
)) | (4))
,
4326 offsetof (struct ccb, phys.wresid.size)((size_t) (&((struct ccb *)0)->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_JUMPR0x80880000 ^ IFFALSE (WHEN (SCR_DATA_IN))(0x00080000 | ((0x00030000 | (0x01000000)))),
4337 0,
4338 /*
4339 * Perform the move of the residual byte.
4340 */
4341 SCR_CHMOV_TBL(0x10000000) ^ SCR_DATA_IN0x01000000,
4342 offsetof (struct ccb, phys.wresid)((size_t) (&((struct ccb *)0)->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)(0x70000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_rbc)))) & 0x7f) << 16ul) + (((((size_t) (&((
struct ncr_reg *)0)->nc_rbc)))) & 0x80))) | (0x02000000
) | (((0)&0xff)<<8ul))
,
4349 0,
4350 SCR_RETURN0x90080000 ^ IFFALSE (DATA (0))(0x00080000 | ((0x00040000 | ((0) & 0xff)))),
4351 0,
4352 SCR_FROM_REG (rbc1)(0x70000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_rbc1)))) & 0x7f) << 16ul) + (((((size_t) (&(
(struct ncr_reg *)0)->nc_rbc1)))) & 0x80))) | (0x02000000
) | (((0)&0xff)<<8ul))
,
4353 0,
4354 SCR_RETURN0x90080000 ^ IFFALSE (DATA (0))(0x00080000 | ((0x00040000 | ((0) & 0xff)))),
4355 0,
4356 SCR_FROM_REG (rbc2)(0x70000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_rbc2)))) & 0x7f) << 16ul) + (((((size_t) (&(
(struct ncr_reg *)0)->nc_rbc2)))) & 0x80))) | (0x02000000
) | (((0)&0xff)<<8ul))
,
4357 0,
4358 SCR_RETURN0x90080000 ^ IFFALSE (DATA (0))(0x00080000 | ((0x00040000 | ((0) & 0xff)))),
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)(0xe0000000 | 0x02000000 | (((((((size_t) (&((struct ncr_reg
*)0)->nc_ia)))) & 0xff) << 16ul)) | (4))
,
4370 PADDRH (scratch)(0x80000000 | ((size_t) (&((struct scripth *)0)->scratch
)))
,
4371 SCR_LOAD_ABS (temp, 4)(0xe1000000 | 0x02000000 | (((((((size_t) (&((struct ncr_reg
*)0)->nc_temp)))) & 0xff) << 16ul)) | (4))
,
4372 PADDRH (scratch)(0x80000000 | ((size_t) (&((struct scripth *)0)->scratch
)))
,
4373 SCR_JUMP0x80080000,
4374 PADDR (dispatch)(0x50000000 | ((size_t) (&((struct script *)0)->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(0x10000000) ^ SCR_DATA_IN0x01000000,
4381 offsetof (struct ccb, phys.wresid)((size_t) (&((struct ccb *)0)->phys.wresid)),
4382 SCR_JUMP0x80080000,
4383 PADDR (dispatch)(0x50000000 | ((size_t) (&((struct script *)0)->dispatch
)))
,
4384}/*-------------------------< ZERO >------------------------*/,{
4385 SCR_DATA_ZERO0xf00ff00f,
4386}/*-------------------------< SCRATCH >---------------------*/,{
4387 SCR_DATA_ZERO0xf00ff00f,
4388}/*-------------------------< SCRATCH1 >--------------------*/,{
4389 SCR_DATA_ZERO0xf00ff00f,
4390}/*-------------------------< PM0_DATA_ADDR >---------------*/,{
4391 SCR_DATA_ZERO0xf00ff00f,
4392}/*-------------------------< PM1_DATA_ADDR >---------------*/,{
4393 SCR_DATA_ZERO0xf00ff00f,
4394}/*-------------------------< SAVED_DSA >-------------------*/,{
4395 SCR_DATA_ZERO0xf00ff00f,
4396}/*-------------------------< SAVED_DRS >-------------------*/,{
4397 SCR_DATA_ZERO0xf00ff00f,
4398}/*-------------------------< DONE_POS >--------------------*/,{
4399 SCR_DATA_ZERO0xf00ff00f,
4400}/*-------------------------< STARTPOS >--------------------*/,{
4401 SCR_DATA_ZERO0xf00ff00f,
4402}/*-------------------------< TARGTBL >---------------------*/,{
4403 SCR_DATA_ZERO0xf00ff00f,
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))(0xc0000000 | 0x01000000 | (sizeof (struct script))),
4421}/*-------------------------< SCRIPT0_BA >--------------------*/,{
4422 0,
4423 PADDR (start)(0x50000000 | ((size_t) (&((struct script *)0)->start)
))
,
4424 SCR_JUMP0x80080000,
4425 PADDR (init)(0x50000000 | ((size_t) (&((struct script *)0)->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)(0xe1000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_mmws)))) & 0xff) << 16ul
)) | (4))
,
4439 offsetof (struct ncb, scr_ram_seg)((size_t) (&((struct ncb *)0)->scr_ram_seg)),
4440 SCR_COPY (sizeof(struct script))(0xc0000000 | 0x01000000 | (sizeof(struct script))),
4441}/*-------------------------< SCRIPT0_BA64 >--------------------*/,{
4442 0,
4443 PADDR (start)(0x50000000 | ((size_t) (&((struct script *)0)->start)
))
,
4444 SCR_COPY (sizeof(struct scripth))(0xc0000000 | 0x01000000 | (sizeof(struct scripth))),
4445}/*-------------------------< SCRIPTH0_BA64 >--------------------*/,{
4446 0,
4447 PADDRH (start64)(0x80000000 | ((size_t) (&((struct scripth *)0)->start64
)))
,
4448 SCR_LOAD_REL (mmrs, 4)(0xe1000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_mmrs)))) & 0xff) << 16ul
)) | (4))
,
4449 offsetof (struct ncb, scr_ram_seg)((size_t) (&((struct ncb *)0)->scr_ram_seg)),
4450 SCR_JUMP640x80480000,
4451 PADDRH (start64)(0x80000000 | ((size_t) (&((struct scripth *)0)->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)(0xe1000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_scratcha)))) & 0xff) << 16ul
)) | (4))
,
4462 offsetof(struct ncb, ncr_cache)((size_t) (&((struct ncb *)0)->ncr_cache)),
4463 SCR_STORE_REL (temp, 4)(0xe0000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_temp)))) & 0xff) << 16ul
)) | (4))
,
4464 offsetof(struct ncb, ncr_cache)((size_t) (&((struct ncb *)0)->ncr_cache)),
4465 SCR_LOAD_REL (temp, 4)(0xe1000000 | 0x02000000|0x10000000 | (((((((size_t) (&((
struct ncr_reg *)0)->nc_temp)))) & 0xff) << 16ul
)) | (4))
,
4466 offsetof(struct ncb, ncr_cache)((size_t) (&((struct ncb *)0)->ncr_cache)),
4467}/*-------------------------< SNOOPEND >-------------------*/,{
4468 /*
4469 ** And stop.
4470 */
4471 SCR_INT0x98080000,
4472 99,
4473}/*--------------------------------------------------------*/
4474};
4475
4476/*==========================================================
4477**
4478**
4479** Fill in #define dependent parts of the script
4480**
4481**
4482**==========================================================
4483*/
4484
4485void __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((127)); i++) {
4492 *p++ =SCR_CHMOV_TBL(0x10000000) ^ SCR_DATA_IN0x01000000;
4493 *p++ =offsetof (struct dsb, data[i])((size_t) (&((struct dsb *)0)->data[i]));
4494 };
4495
4496 assert ((u_long)p == (u_long)&scr->data_in + sizeof (scr->data_in)){ if (!((unsigned long)p == (unsigned long)&scr->data_in
+ sizeof (scr->data_in))) { (void)panic( "assertion \"%s\" failed: file \"%s\", line %d\n"
, "(u_long)p == (u_long)&scr->data_in + sizeof (scr->data_in)"
, "../linux/src/drivers/scsi/sym53c8xx.c", 4496); } }
;
4497
4498 p = scr->data_out;
4499
4500 for (i=0; i<MAX_SCATTER((127)); i++) {
4501 *p++ =SCR_CHMOV_TBL(0x10000000) ^ SCR_DATA_OUT0x00000000;
4502 *p++ =offsetof (struct dsb, data[i])((size_t) (&((struct dsb *)0)->data[i]));
4503 };
4504
4505 assert ((u_long)p == (u_long)&scr->data_out + sizeof (scr->data_out)){ if (!((unsigned long)p == (unsigned long)&scr->data_out
+ sizeof (scr->data_out))) { (void)panic( "assertion \"%s\" failed: file \"%s\", line %d\n"
, "(u_long)p == (u_long)&scr->data_out + sizeof (scr->data_out)"
, "../linux/src/drivers/scsi/sym53c8xx.c", 4505); } }
;
4506}
4507
4508/*==========================================================
4509**
4510**
4511** Copy and rebind a script.
4512**
4513**
4514**==========================================================
4515*/
4516
4517static void __init
4518ncr_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)(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"<6>" "%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_ZERO0xf00ff00f) {
4552 dst[-1] = 0;
4553 continue;
4554 }
4555
4556 if (DEBUG_FLAGSncr_debug & DEBUG_SCRIPT(0x0040))
4557 printk (KERN_INFO"<6>" "%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_MASK0xf0000000) == RELOC_KVAR)
4586 tmp1 = 0;
4587 if ((tmp2 & RELOC_MASK0xf0000000) == RELOC_KVAR)
4588 tmp2 = 0;
4589#endif
4590 if ((tmp1 ^ tmp2) & 3) {
4591 printk (KERN_ERR"<3>""%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_FLUSH0x01000000) &&
4600 !(np->features & FE_PFEN(1<<12))) {
4601 dst[-1] = cpu_to_scr(opcode & ~SCR_NO_FLUSH)(opcode & ~0x01000000);
4602 ++opchanged;
4603 }
4604 break;
4605
4606 case 0x0:
4607 /*
4608 ** MOVE/CHMOV (absolute address)
4609 */
4610 if (!(np->features & FE_WIDE(1<<1)))
4611 dst[-1] = cpu_to_scr(opcode | OPC_MOVE)(opcode | 0x08000000);
4612 relocs = 1;
4613 break;
4614
4615 case 0x1:
4616 /*
4617 ** MOVE/CHMOV (table indirect)
4618 */
4619 if (!(np->features & FE_WIDE(1<<1)))
4620 dst[-1] = cpu_to_scr(opcode | OPC_MOVE)(opcode | 0x08000000);
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++)(*src++);
4651 continue;
4652 }
4653 while (relocs--) {
4654 old = *src++;
4655
4656 switch (old & RELOC_MASK0xf0000000) {
4657 case RELOC_REGISTER0x60000000:
4658 new = (old & ~RELOC_MASK0xf0000000) + pcivtobus(np->base_ba)(np->base_ba);
4659 break;
4660 case RELOC_LABEL0x50000000:
4661 new = (old & ~RELOC_MASK0xf0000000) + np->p_script;
4662 break;
4663 case RELOC_LABELH0x80000000:
4664 new = (old & ~RELOC_MASK0xf0000000) + np->p_scripth;
4665 break;
4666 case RELOC_SOFTC0x40000000:
4667 new = (old & ~RELOC_MASK0xf0000000) + np->p_ncb;
4668 break;
4669#ifdef RELOC_KVAR
4670 case RELOC_KVAR:
4671 new=0;
4672 if (((old & ~RELOC_MASK0xf0000000) < SCRIPT_KVAR_FIRST) ||
4673 ((old & ~RELOC_MASK0xf0000000) > SCRIPT_KVAR_LAST))
4674 panic("ncr KVAR out of range");
4675 new = vtobus(script_kvars[old & ~RELOC_MASK])virt_to_phys(script_kvars[old & ~0xf0000000]);
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)(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
4710struct 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
4719static void PRINT_TARGET(ncb_p np, int target)
4720{
4721 printk(KERN_INFO"<6>" "%s-<%d,*>: ", ncr_name(np), target);
4722}
4723
4724static void PRINT_LUN(ncb_p np, int target, int lun)
4725{
4726 printk(KERN_INFO"<6>" "%s-<%d,%d>: ", ncr_name(np), target, lun);
4727}
4728
4729static 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 _5M5000000 5000000
4745static u_longunsigned long div_10M[] =
4746 {2*_5M5000000, 3*_5M5000000, 4*_5M5000000, 6*_5M5000000, 8*_5M5000000, 12*_5M5000000, 16*_5M5000000};
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) (!(bc))? 0 : 1 << (bc)
4774
4775/*
4776 * Burst code from io register bits.
4777 */
4778#define burst_code(dmode, ctest4, ctest5)(ctest4) & 0x80? 0 : (((dmode) & 0xc0) >> 6) + (
(ctest5) & 0x04) + 1
\
4779 (ctest4) & 0x80? 0 : (((dmode) & 0xc0) >> 6) + ((ctest5) & 0x04) + 1
4780
4781/*
4782 * Set initial io register bits from burst code.
4783 */
4784static inlineinline __attribute__((always_inline)) void ncr_init_burst(ncb_p np, u_charunsigned 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
4806static void __init
4807ncr_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(1<<3))? MAX_TAGS(8) : 0;
4816
4817 if (!(tn->flags & SYMBIOS_DISCONNECT_ENABLE(1)))
4818 tp->usrflag |= UF_NODISC(0x02);
4819 if (!(tn->flags & SYMBIOS_SCAN_AT_BOOT_TIME(1<<1)))
4820 tp->usrflag |= UF_NOSCAN(0x04);
4821}
4822
4823/*
4824** Get target set-up from Tekram format NVRAM.
4825*/
4826
4827static void __init
4828ncr_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(1<<1)) {
4835 i = tn->sync_index & 0xf;
4836 tp->usrsync = Tekram_sync[i];
4837 }
4838
4839 tp->usrwide = (tn->flags & TEKRAM_WIDE_NEGO(1<<5)) ? 1 : 0;
4840
4841 if (tn->flags & TEKRAM_TAGGED_COMMANDS(1<<4)) {
4842 tp->usrtags = 2 << nvram->max_tags_index;
4843 }
4844
4845 if (!(tn->flags & TEKRAM_DISCONNECT_ENABLE(1<<2)))
4846 tp->usrflag = UF_NODISC(0x02);
4847
4848 /* If any device does not support parity, we will not use this option */
4849 if (!(tn->flags & TEKRAM_PARITY_CHECK(1)))
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*/
4858static void __init ncr_save_initial_setting(ncb_p np)
4859{
4860 np->sv_scntl0 = INB(nc_scntl0)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_scntl0)))))
& 0x0a;
4861 np->sv_dmode = INB(nc_dmode)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_dmode)))))
& 0xce;
4862 np->sv_dcntl = INB(nc_dcntl)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_dcntl)))))
& 0xa8;
4863 np->sv_ctest3 = INB(nc_ctest3)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_ctest3)))))
& 0x01;
4864 np->sv_ctest4 = INB(nc_ctest4)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_ctest4)))))
& 0x80;
4865 np->sv_gpcntl = INB(nc_gpcntl)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_gpcntl)))))
;
4866 np->sv_stest2 = INB(nc_stest2)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_stest2)))))
& 0x20;
4867 np->sv_stest4 = INB(nc_stest4)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_stest4)))))
;
4868 np->sv_stest1 = INB(nc_stest1)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_stest1)))))
;
4869
4870 np->sv_scntl3 = INB(nc_scntl3)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_scntl3)))))
& 0x07;
4871
4872 if ((np->device_id == PCI_DEVICE_ID_LSI_53C10100x20) ||
4873 (np->device_id == PCI_DEVICE_ID_LSI_53C1010_660x21) ){
4874 /*
4875 ** C1010 always uses large fifo, bit 5 rsvd
4876 ** scntl4 used ONLY with C1010
4877 */
4878 np->sv_ctest5 = INB(nc_ctest5)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_ctest5)))))
& 0x04 ;
4879 np->sv_scntl4 = INB(nc_scntl4)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_scntl4)))))
;
4880 }
4881 else {
4882 np->sv_ctest5 = INB(nc_ctest5)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->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*/
4891static int __init ncr_prepare_setting(ncb_p np, ncr_nvram *nvram)
4892{
4893 u_charunsigned char burst_max;
4894 u_longunsigned long period;
4895 int i;
4896
4897 /*
4898 ** Wide ?
4899 */
4900
4901 np->maxwide = (np->features & FE_WIDE(1<<1))? 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(1<<5))
4909 np->multiplier = 4;
4910 else if (np->features & FE_DBLR(1<<4))
4911 np->multiplier = 2;
4912 else
4913 np->multiplier = 1;
4914
4915 np->clock_khz = (np->features & FE_CLK80(1<<15))? 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_53C10100x20) ||
4929 (np->device_id == PCI_DEVICE_ID_LSI_53C1010_660x21)) {
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(40) * 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(1<<22)))
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(1<<2)|FE_ULTRA2(1<<3)|FE_ULTRA3(1<<22))))
4980 np->minsync = 25;
4981 else if (np->minsync < 12 && (np->features & FE_ULTRA(1<<2)))
4982 np->minsync = 12;
4983 else if (np->minsync < 10 && (np->features & FE_ULTRA2(1<<3)))
4984 np->minsync = 10;
4985 else if (np->minsync < 9 && (np->features & FE_ULTRA3(1<<22)))
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(1<<17))
4999#ifdef SCSI_NCR_USE_64BIT_DAC
5000 np->rv_ccntl1 |= (XTIMOD0x04 | EXTIBMV0x02);
5001#else
5002 np->rv_ccntl1 |= (DDAC0x08);
5003#endif
5004
5005 /*
5006 ** Phase mismatch handled by SCRIPTS (53C895A, 53C896 or C1010) ?
5007 */
5008 if (np->features & FE_NOPM(1<<19))
5009 np->rv_ccntl0 |= (ENPMJ0x80);
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)(np->sv_ctest4) & 0x80? 0 : (((np->sv_dmode) & 0xc0
) >> 6) + ((np->sv_ctest5) & 0x04) + 1
;
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)(np->sv_ctest4) & 0x80? 0 : (((np->sv_dmode) & 0xc0
) >> 6) + ((np->sv_ctest5) & 0x04) + 1
;
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_53C8100x0001 &&
5044 np->revision_id >= 0x10 && np->revision_id <= 0x11) ||
5045 (np->device_id == PCI_DEVICE_ID_NCR_53C8600x0006 &&
5046 np->revision_id <= 0x1))
5047 np->features &= ~(FE_WRIE(1<<8)|FE_ERL(1<<6)|FE_ERMP(1<<9));
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_53C10100x20) && (np->revision_id < 0x02) )
5054 || (np->device_id == PCI_DEVICE_ID_LSI_53C1010_660x21 ) )
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(1<<6))
5064 np->rv_dmode |= ERL0x08; /* Enable Read Line */
5065 if (np->features & FE_BOF(1<<10))
5066 np->rv_dmode |= BOF0x02; /* Burst Opcode Fetch */
5067 if (np->features & FE_ERMP(1<<9))
5068 np->rv_dmode |= ERMP0x04; /* Enable Read Multiple */
5069#if 1
5070 if ((np->features & FE_PFEN(1<<12)) && !np->base2_ba)
5071#else
5072 if (np->features & FE_PFEN(1<<12))
5073#endif
5074 np->rv_dcntl |= PFEN0x20; /* Prefetch Enable */
5075 if (np->features & FE_CLSE(1<<7))
5076 np->rv_dcntl |= CLSE0x80; /* Cache Line Size Enable */
5077 if (np->features & FE_WRIE(1<<8))
5078 np->rv_ctest3 |= WRIE0x01; /* Write and Invalidate */
5079
5080
5081 if ( (np->device_id != PCI_DEVICE_ID_LSI_53C10100x20) &&
5082 (np->device_id != PCI_DEVICE_ID_LSI_53C1010_660x21) &&
5083 (np->features & FE_DFS(1<<11)))
5084 np->rv_ctest5 |= DFS0x20; /* 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 |= MPEE0x08; /* 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(2):
5102 np->myaddr = nvram->data.Tekram.host_id & 0x0f;
5103 break;
5104 case SCSI_NCR_SYMBIOS_NVRAM(1):
5105 if (!(nvram->data.Symbios.flags & SYMBIOS_PARITY_ENABLE(1<<1)))
5106 np->rv_scntl0 &= ~0x0a;
5107 np->myaddr = nvram->data.Symbios.host_id & 0x0f;
5108 if (nvram->data.Symbios.flags & SYMBIOS_VERBOSE_MSGS(1<<2))
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)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_scid)))))
& 0x07;
5119 if (!np->myaddr)
5120 np->myaddr = SCSI_NCR_MYADDR(7);
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_SE0x80;
5141 if (np->features & (FE_ULTRA2(1<<3) | FE_ULTRA3(1<<22)))
5142 np->scsi_mode = (np->sv_stest4 & SMODE0xc0);
5143 else if (np->features & FE_DIFF(1<<21)) {
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_HVD0x40;
5149 break;
5150 }
5151 case 3: /* SYMBIOS controllers report HVD through GPIO3 */
5152 if (nvram && nvram->type != SCSI_NCR_SYMBIOS_NVRAM(1))
5153 break;
5154 if (INB(nc_gpreg)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_gpreg)))))
& 0x08)
5155 break;
5156 case 2: /* Set HVD unconditionally */
5157 np->scsi_mode = SMODE_HVD0x40;
5158 case 1: /* Trust previous settings for HVD */
5159 if (np->sv_stest2 & 0x20)
5160 np->scsi_mode = SMODE_HVD0x40;
5161 break;
5162 default:/* Don't care about HVD */
5163 break;
5164 }
5165 }
5166 if (np->scsi_mode == SMODE_HVD0x40)
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(1))) &&
5178 !(np->features & FE_LEDC(1<<20)) && !(np->sv_gpcntl & 0x01))
5179 np->features |= FE_LED0(1<<0);
5180
5181 /*
5182 ** Set irq mode.
5183 */
5184 switch(driver_setup.irqm & 3) {
5185 case 2:
5186 np->rv_dcntl |= IRQM0x08;
5187 break;
5188 case 1:
5189 np->rv_dcntl |= (np->sv_dcntl & IRQM0x08);
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((16)) ; 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(2):
5209 ncr_Tekram_setup_target(np, i, &nvram->data.Tekram);
5210 break;
5211 case SCSI_NCR_SYMBIOS_NVRAM(1):
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(0x04);
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(8);
5229 if (!driver_setup.disconnection)
5230 np->target[i].usrflag = UF_NODISC(0x02);
5231 }
5232 }
5233
5234 /*
5235 ** Announce all that stuff to user.
5236 */
5237
5238 i = nvram ? nvram->type : 0;
5239 printk(KERN_INFO"<6>" "%s: %sID %d, Fast-%d%s%s\n", ncr_name(np),
5240 i == SCSI_NCR_SYMBIOS_NVRAM(1) ? "Symbios format NVRAM, " :
5241 (i == SCSI_NCR_TEKRAM_NVRAM(2) ? "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(np->verbose) > 1) {
5249 printk (KERN_INFO"<6>" "%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"<6>" "%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->verbose) && np->base2_ba)
5261 printk (KERN_INFO"<6>" "%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
5270void __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"<7>" "%s: HOST ID=%d%s%s%s%s%s\n",
5276 ncr_name(np), nvram->host_id & 0x0f,
5277 (nvram->flags & SYMBIOS_SCAM_ENABLE(1)) ? " SCAM" :"",
5278 (nvram->flags & SYMBIOS_PARITY_ENABLE(1<<1)) ? " PARITY" :"",
5279 (nvram->flags & SYMBIOS_VERBOSE_MSGS(1<<2)) ? " VERBOSE" :"",
5280 (nvram->flags & SYMBIOS_CHS_MAPPING(1<<3)) ? " CHS_ALT" :"",
5281 (nvram->flags1 & SYMBIOS_SCAN_HI_LO(1)) ? " 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"<7>" "%s-%d:%s%s%s%s WIDTH=%d SYNC=%d TMO=%d\n",
5287 ncr_name(np), i,
5288 (tn->flags & SYMBIOS_DISCONNECT_ENABLE(1)) ? " DISC" : "",
5289 (tn->flags & SYMBIOS_SCAN_AT_BOOT_TIME(1<<1)) ? " SCAN_BOOT" : "",
5290 (tn->flags & SYMBIOS_SCAN_LUNS(1<<2)) ? " SCAN_LUNS" : "",
5291 (tn->flags & SYMBIOS_QUEUE_TAGS_ENABLED(1<<3))? " TCQ" : "",
5292 tn->bus_width,
5293 tn->sync_period / 4,
5294 tn->timeout);
5295 }
5296}
5297
5298static u_charunsigned char Tekram_boot_delay[7] __initdata = {3, 5, 10, 20, 30, 60, 120};
5299
5300void __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(3<<6)) >> 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"<7>"
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(1)) ? " SCAM" :"",
5321 (nvram->flags & TEKRAM_MORE_THAN_2_DRIVES(1)) ? " >2DRIVES" :"",
5322 (nvram->flags & TEKRAM_DRIVES_SUP_1GB(1<<1)) ? " >1GB" :"",
5323 (nvram->flags & TEKRAM_RESET_ON_POWER_ON(1<<2)) ? " RESET" :"",
5324 (nvram->flags & TEKRAM_ACTIVE_NEGATION(1<<3)) ? " ACT_NEG" :"",
5325 (nvram->flags & TEKRAM_IMMEDIATE_SEEK(1<<4)) ? " IMM_SEEK" :"",
5326 (nvram->flags & TEKRAM_SCAN_LUNS(1<<5)) ? " SCAN_LUNS" :"",
5327 (nvram->flags1 & TEKRAM_F2_F6_ENABLED(1)) ? " 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"<7>" "%s-%d:%s%s%s%s%s%s PERIOD=%d\n",
5337 ncr_name(np), i,
5338 (tn->flags & TEKRAM_PARITY_CHECK(1)) ? " PARITY" : "",
5339 (tn->flags & TEKRAM_SYNC_NEGO(1<<1)) ? " SYNC" : "",
5340 (tn->flags & TEKRAM_DISCONNECT_ENABLE(1<<2)) ? " DISC" : "",
5341 (tn->flags & TEKRAM_START_CMD(1<<3)) ? " START" : "",
5342 (tn->flags & TEKRAM_TAGGED_COMMANDS(1<<4)) ? " TCQ" : "",
5343 (tn->flags & TEKRAM_WIDE_NEGO(1<<5)) ? " 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
5359static int __init
5360ncr_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_longunsigned long flags = 0;
5366 ncr_nvram *nvram = device->nvram;
5367 int i;
5368
5369 printk(KERN_INFO"<6>" NAME53C"sym53c" "%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")m_calloc(sizeof(struct ncb), "NCB");
5395 if (!np)
5396 goto attach_error;
5397 NCR_INIT_LOCK_NCB(np)do { } while (0);
5398 np->pdev = device->pdev;
5399 np->p_ncb = vtobus(np)virt_to_phys(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 sprintflinux_sprintf(np->inst_name, NAME53C"sym53c" "%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")m_calloc(sizeof(ncrcmd)*(((8*(8) + 2*(16)) + 4)*2), "SQUEUE");
5424 if (!np->squeue)
5425 goto attach_error;
5426 np->p_squeue = vtobus(np->squeue)virt_to_phys(np->squeue);
5427
5428 /*
5429 ** Allocate the done queue.
5430 */
5431 np->dqueue = (ncrcmd *)
5432 m_calloc_dma(sizeof(ncrcmd)*(MAX_START*2), "DQUEUE")m_calloc(sizeof(ncrcmd)*(((8*(8) + 2*(16)) + 4)*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")m_calloc(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")m_calloc(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")m_calloc(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)do { (&np->free_ccbq)->flink = (&np->free_ccbq
); (&np->free_ccbq)->blink = (&np->free_ccbq
); } while (0)
;
5460 xpt_que_init(&np->b0_ccbq)do { (&np->b0_ccbq)->flink = (&np->b0_ccbq);
(&np->b0_ccbq)->blink = (&np->b0_ccbq); } while
(0)
;
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(1<<18))? 256 : 128;
5479 np->base2_ba = (np->features & FE_RAM(1<<14))? 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"<3>" "%s: can't map PCI MMIO region\n",ncr_name(np));
5485 goto attach_error;
5486 }
5487 else if (bootverbose(np->verbose) > 1)
5488 printk(KERN_INFO"<6>" "%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"<3>" "%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"sym53c8xx");
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(1):
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(2):
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"<7>" "%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"<3>" "%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)virt_to_phys(np->script0);
5609 np->p_scripth = vtobus(np->scripth0)virt_to_phys(np->scripth0);
5610 np->p_scripth0 = np->p_scripth;
5611
5612 if (np->base2_ba) {
5613 np->p_script = pcivtobus(np->base2_ba)(np->base2_ba);
5614 if (np->features & FE_RAM8K(1<<16)) {
5615 np->base2_ws = 8192;
5616 np->p_scripth = np->p_script + 4096;
5617#if BITS_PER_LONG32 > 32
5618 np->scr_ram_seg = cpu_to_scr(np->base2_ba >> 32)(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"<3>" "%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))((np->p_script + ((size_t) (&((struct script *)0)->
pm0_data))))
;
5641 np->scripth0->pm1_data_addr[0] =
5642 cpu_to_scr(NCB_SCRIPT_PHYS(np, pm1_data))((np->p_script + ((size_t) (&((struct script *)0)->
pm1_data))))
;
5643
5644 /*
5645 ** Patch if not Ultra 3 - Do not write to scntl4
5646 */
5647 if (np->features & FE_ULTRA3(1<<22)) {
5648 np->script0->resel_scntl4[0] = cpu_to_scr(SCR_LOAD_REL (scntl4, 1))((0xe1000000 | 0x02000000|0x10000000 | (((((((size_t) (&(
(struct ncr_reg *)0)->nc_scntl4)))) & 0xff) << 16ul
)) | (1)))
;
5649 np->script0->resel_scntl4[1] = cpu_to_scr(offsetof(struct tcb, uval))(((size_t) (&((struct tcb *)0)->uval)));
5650 }
5651
5652
5653#ifdef SCSI_NCR_PCI_MEM_NOT_SUPPORTED
5654 np->scripth0->script0_ba[0] = cpu_to_scr(vtobus(np->script0))(virt_to_phys(np->script0));
5655 np->scripth0->script0_ba64[0] = cpu_to_scr(vtobus(np->script0))(virt_to_phys(np->script0));
5656 np->scripth0->scripth0_ba64[0] = cpu_to_scr(vtobus(np->scripth0))(virt_to_phys(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))((np->p_script + ((size_t) (&((struct script *)0)->
idle))))
;
5663 np->idletask.restart = cpu_to_scr(NCB_SCRIPTH_PHYS (np, bad_i_t_l))((np->p_scripth + ((size_t) (&((struct scripth *)0)->
bad_i_t_l))))
;
5664 np->p_idletask = NCB_PHYS(np, idletask)(np->p_ncb + ((size_t) (&((struct ncb *)0)->idletask
)))
;
5665
5666 np->notask.start = cpu_to_scr(NCB_SCRIPT_PHYS (np, idle))((np->p_script + ((size_t) (&((struct script *)0)->
idle))))
;
5667 np->notask.restart = cpu_to_scr(NCB_SCRIPTH_PHYS (np, bad_i_t_l))((np->p_scripth + ((size_t) (&((struct scripth *)0)->
bad_i_t_l))))
;
5668 np->p_notask = NCB_PHYS(np, notask)(np->p_ncb + ((size_t) (&((struct ncb *)0)->notask)
))
;
5669
5670 np->bad_i_t_l.start = cpu_to_scr(NCB_SCRIPT_PHYS (np, idle))((np->p_script + ((size_t) (&((struct script *)0)->
idle))))
;
5671 np->bad_i_t_l.restart = cpu_to_scr(NCB_SCRIPTH_PHYS (np, bad_i_t_l))((np->p_scripth + ((size_t) (&((struct scripth *)0)->
bad_i_t_l))))
;
5672 np->p_bad_i_t_l = NCB_PHYS(np, bad_i_t_l)(np->p_ncb + ((size_t) (&((struct ncb *)0)->bad_i_t_l
)))
;
5673
5674 np->bad_i_t_l_q.start = cpu_to_scr(NCB_SCRIPT_PHYS (np, idle))((np->p_script + ((size_t) (&((struct script *)0)->
idle))))
;
5675 np->bad_i_t_l_q.restart = cpu_to_scr(NCB_SCRIPTH_PHYS (np,bad_i_t_l_q))((np->p_scripth + ((size_t) (&((struct scripth *)0)->
bad_i_t_l_q))))
;
5676 np->p_bad_i_t_l_q = NCB_PHYS(np, bad_i_t_l_q)(np->p_ncb + ((size_t) (&((struct ncb *)0)->bad_i_t_l_q
)))
;
5677
5678 /*
5679 ** Allocate and prepare the bad lun table.
5680 */
5681 np->badluntbl = m_calloc_dma(256, "BADLUNTBL")m_calloc(256, "BADLUNTBL");
5682 if (!np->badluntbl)
5683 goto attach_error;
5684
5685 assert (offsetof(struct lcb, resel_task) == 0){ if (!(((size_t) (&((struct lcb *)0)->resel_task)) ==
0)) { (void)panic( "assertion \"%s\" failed: file \"%s\", line %d\n"
, "offsetof(struct lcb, resel_task) == 0", "../linux/src/drivers/scsi/sym53c8xx.c"
, 5685); } }
;
5686 np->resel_badlun = cpu_to_scr(NCB_SCRIPTH_PHYS(np, resel_bad_lun))((np->p_scripth + ((size_t) (&((struct scripth *)0)->
resel_bad_lun))))
;
5687
5688 for (i = 0 ; i < 64 ; i++)
5689 np->badluntbl[i] = cpu_to_scr(NCB_PHYS(np, resel_badlun))((np->p_ncb + ((size_t) (&((struct ncb *)0)->resel_badlun
))))
;
5690
5691 /*
5692 ** Prepare the target bus address array.
5693 */
5694 np->scripth0->targtbl[0] = cpu_to_scr(vtobus(np->targtbl))(virt_to_phys(np->targtbl));
5695 for (i = 0 ; i < MAX_TARGET((16)) ; i++) {
5696 np->targtbl[i] = cpu_to_scr(NCB_PHYS(np, target[i]))((np->p_ncb + ((size_t) (&((struct ncb *)0)->target
[i]))))
;
5697 np->target[i].b_luntbl = cpu_to_scr(vtobus(np->badluntbl))(virt_to_phys(np->badluntbl));
5698 np->target[i].b_lun0 = cpu_to_scr(NCB_PHYS(np, resel_badlun))((np->p_ncb + ((size_t) (&((struct ncb *)0)->resel_badlun
))))
;
5699 }
5700
5701 /*
5702 ** Patch the script for LED support.
5703 */
5704
5705 if (np->features & FE_LED0(1<<0)) {
5706 np->script0->idle[0] =
5707 cpu_to_scr(SCR_REG_REG(gpreg, SCR_OR, 0x01))((0x78000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_gpreg)))) & 0x7f) << 16ul) + (((((size_t) (&
((struct ncr_reg *)0)->nc_gpreg)))) & 0x80))) | (0x02000000
) | (((0x01)&0xff)<<8ul)))
;
5708 np->script0->reselected[0] =
5709 cpu_to_scr(SCR_REG_REG(gpreg, SCR_AND, 0xfe))((0x78000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_gpreg)))) & 0x7f) << 16ul) + (((((size_t) (&
((struct ncr_reg *)0)->nc_gpreg)))) & 0x80))) | (0x04000000
) | (((0xfe)&0xff)<<8ul)))
;
5710 np->script0->start[0] =
5711 cpu_to_scr(SCR_REG_REG(gpreg, SCR_AND, 0xfe))((0x78000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_gpreg)))) & 0x7f) << 16ul) + (((((size_t) (&
((struct ncr_reg *)0)->nc_gpreg)))) & 0x80))) | (0x04000000
) | (((0xfe)&0xff)<<8ul)))
;
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_660x21){
5719 np->script0->datao_phase[0] =
5720 cpu_to_scr(SCR_REG_REG(scntl4, SCR_OR, 0x0c))((0x78000000 | ((((((((size_t) (&((struct ncr_reg *)0)->
nc_scntl4)))) & 0x7f) << 16ul) + (((((size_t) (&
((struct ncr_reg *)0)->nc_scntl4)))) & 0x80))) | (0x02000000
) | (((0x0c)&0xff)<<8ul)))
;
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)(0x80000000);
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_53C8960x000b &&
5744 np->revision_id <= 0x1 && (np->features & FE_NOPM(1<<19))) {
5745 np->scatter = ncr_scatter_896R1;
5746 np->script0->datai_phase[0] = cpu_to_scr(SCR_JUMP)(0x80080000);
5747 np->script0->datai_phase[1] =
5748 cpu_to_scr(NCB_SCRIPTH_PHYS (np, tweak_pmj))((np->p_scripth + ((size_t) (&((struct scripth *)0)->
tweak_pmj))))
;
5749 np->script0->datao_phase[0] = cpu_to_scr(SCR_JUMP)(0x80080000);
5750 np->script0->datao_phase[1] =
5751 cpu_to_scr(NCB_SCRIPTH_PHYS (np, tweak_pmj))((np->p_scripth + ((size_t) (&((struct scripth *)0)->
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"<3>" "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_INTERRUPT0x20000000),
5788#else
5789 ((driver_setup.irqm & 0x10) ? 0 : SA_SHIRQ0x04000000) |
5790
5791#if 0 && LINUX_VERSION_CODE131108 < LinuxVersionCode(2,2,0)(((2)<<16)+((2)<<8)+(0))
5792 ((driver_setup.irqm & 0x20) ? 0 : SA_INTERRUPT0x20000000),
5793#else
5794 0,
5795#endif
5796#endif
5797 NAME53C8XX"sym53c8xx", np)) {
5798 printk(KERN_ERR"<3>" "%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)do { __asm__ __volatile__("pushf ; pop %0" : "=r" (flags): :"memory"
); __asm__ __volatile__ ("cli": : :"memory"); } while (0)
;
5813 if (ncr_reset_scsi_bus(np, 0, driver_setup.settle_delay) != 0) {
5814 printk(KERN_ERR"<3>" "%s: FATAL ERROR: CHECK SCSI BUS - CABLES, TERMINATION, DEVICE POWER etc.!\n", ncr_name(np));
5815
5816 NCR_UNLOCK_NCB(np, flags)do { __asm__ __volatile__("push %0 ; popf": :"g" (flags):"memory"
); } while (0)
;
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"<6>" "%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(0x20);
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_LUN64;
5859#ifndef SCSI_NCR_IOMAPPED
5860#if LINUX_VERSION_CODE131108 >= LinuxVersionCode(2,3,29)(((2)<<16)+((3)<<8)+(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(8);
5872 instance->can_queue = (MAX_START((8*(8) + 2*(16)) + 4)-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)do { __asm__ __volatile__("push %0 ; popf": :"g" (flags):"memory"
); } while (0)
;
5890
5891 /*
5892 ** Now let the generic SCSI driver
5893 ** look for the SCSI devices on the bus ..
5894 */
5895 return 0;
5896
5897attach_error:
5898 if (!instance) return -1;
5899 printk(KERN_INFO"<6>" "%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*/
5911static 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")m_free(np->scripth0, sizeof(struct scripth), "SCRIPTH");
5930 if (np->script0)
5931 m_free_dma(np->script0, sizeof(struct script), "SCRIPT")m_free(np->script0, sizeof(struct script), "SCRIPT");
5932 if (np->squeue)
5933 m_free_dma(np->squeue, sizeof(ncrcmd)*(MAX_START*2), "SQUEUE")m_free(np->squeue, sizeof(ncrcmd)*(((8*(8) + 2*(16)) + 4)*
2), "SQUEUE")
;
5934 if (np->dqueue)
5935 m_free_dma(np->dqueue, sizeof(ncrcmd)*(MAX_START*2),"DQUEUE")m_free(np->dqueue, sizeof(ncrcmd)*(((8*(8) + 2*(16)) + 4)*
2), "DQUEUE")
;
5936
5937 while ((cp = np->ccbc) != NULL((void *) 0)) {
5938 np->ccbc = cp->link_ccb;
5939 m_free_dma(cp, sizeof(*cp), "CCB")m_free(cp, sizeof(*cp), "CCB");
5940 }
5941
5942 if (np->badluntbl)
5943 m_free_dma(np->badluntbl, 256,"BADLUNTBL")m_free(np->badluntbl, 256, "BADLUNTBL");
5944
5945 for (target = 0; target < MAX_TARGET((16)) ; target++) {
5946 tp = &np->target[target];
5947 for (lun = 0 ; lun < MAX_LUN64 ; lun++) {
5948 lp = ncr_lp(np, tp, lun)(!lun) ? (tp)->l0p : (tp)->lmp ? (tp)->lmp[(lun)] : 0;
5949 if (!lp)
5950 continue;
5951 if (lp->tasktbl != &lp->tasktbl_0)
5952 m_free_dma(lp->tasktbl, MAX_TASKS*4, "TASKTBL")m_free(lp->tasktbl, (256/4)*4, "TASKTBL");
5953 if (lp->cb_tags)
5954 m_free(lp->cb_tags, MAX_TAGS(8), "CB_TAGS");
5955 m_free_dma(lp, sizeof(*lp), "LCB")m_free(lp, sizeof(*lp), "LCB");
5956 }
5957#if MAX_LUN64 > 1
5958 if (tp->lmp)
5959 m_free(tp->lmp, MAX_LUN64 * sizeof(lcb_p), "LMP");
5960 if (tp->luntbl)
5961 m_free_dma(tp->luntbl, 256, "LUNTBL")m_free(tp->luntbl, 256, "LUNTBL");
5962#endif
5963 }
5964
5965 if (np->targtbl)
5966 m_free_dma(np->targtbl, 256, "TARGTBL")m_free(np->targtbl, 256, "TARGTBL");
5967
5968 m_free_dma(np, sizeof(*np), "NCB")m_free(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*/
5990static inlineinline __attribute__((always_inline)) void ncr_queue_done_cmd(ncb_p np, Scsi_Cmnd *cmd)
5991{
5992 unmap_scsi_data(np, cmd)do {; } while (0);
5993 cmd->host_scribble = (char *) np->done_list;
5994 np->done_list = cmd;
5995}
5996
5997static inlineinline __attribute__((always_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
6025static int ncr_ic_nego(ncb_p np, ccb_p cp, Scsi_Cmnd *cmd, u_charunsigned char *msgptr)
6026{
6027 tcb_p tp = &np->target[cp->target];
6028 int msglen = 0;
6029 int nego = 0;
6030 u_charunsigned char new_width, new_offset, new_period;
6031 u_charunsigned 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(0x20)) &&
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(0x10)) && 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(1<<22)) {
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(4);
6077 }
6078
6079 if (DEBUG_FLAGSncr_debug & DEBUG_IC(0x0800)) {
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(4) )) {
6109 tp->ppr_negotiation = 0;
6110 cmd->ic_nego &= ~NS_PPR(4);
6111 tp->widedone = tp->period = 1;
6112 return msglen;
6113 }
6114 else if (( tp->ppr_negotiation && !(cmd->ic_nego & NS_PPR(4) )) ||
6115 (!tp->ppr_negotiation && (cmd->ic_nego & NS_PPR(4) )) ) {
6116 tp->ppr_negotiation = 0;
6117 cmd->ic_nego &= ~NS_PPR(4);
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(4))))
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(4);
6141 tp->widedone = tp->period = 1;
6142 no_increase = 1;
6143 }
6144 else if (!tp->widedone) {
6145 cmd->ic_nego = NS_WIDE(2);
6146 tp->widedone = 1;
6147 no_increase = 1;
6148 }
6149 else if (!tp->period) {
6150 cmd->ic_nego = NS_SYNC(1);
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(0);
6192 if (tp->ppr_negotiation) {
6193 u_charunsigned 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(4);
6222
6223 msgptr[msglen++] = M_EXTENDED(0x01);
6224 msgptr[msglen++] = 6;
6225 msgptr[msglen++] = M_X_PPR_REQ(0x04);
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(4)) {
6235 case NS_WIDE(2):
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(2);
6246 msgptr[msglen++] = M_EXTENDED(0x01);
6247 msgptr[msglen++] = 2;
6248 msgptr[msglen++] = M_X_WIDE_REQ(0x03);
6249 msgptr[msglen++] = new_width;
6250 }
6251 break;
6252
6253 case NS_SYNC(1):
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(0x10)) {
6261
6262 if (new_offset && (new_period < 0x0A)) {
6263 tp->ic_min_sync = 0x0A;
6264 new_period = 0x0A;
6265 }
6266 nego = NS_SYNC(1);
6267 msgptr[msglen++] = M_EXTENDED(0x01);
6268 msgptr[msglen++] = 3;
6269 msgptr[msglen++] = M_X_SYNC_REQ(0x01);
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(0):
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_FLAGSncr_debug & DEBUG_NEGO(0x0200)) {
6290 ncr_print_msg(cp, nego == NS_WIDE(2) ?
6291 "wide/narrow msgout":
6292 (nego == NS_SYNC(1) ? "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
6315static int ncr_prepare_nego(ncb_p np, ccb_p cp, u_charunsigned char *msgptr)
6316{
6317 tcb_p tp = &np->target[cp->target];
6318 int msglen = 0;
6319 int nego = 0;
6320 u_charunsigned 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(1<<22)) &&
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(0x20)) {
6357 if (tp->ppr_negotiation)
6358 nego = NS_PPR(4);
6359 else
6360 nego = NS_WIDE(2);
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(2)) && !tp->period) {
6377 if (tp->inq_byte7 & INQ7_SYNC(0x10)) {
6378 if (tp->ppr_negotiation)
6379 nego = NS_PPR(4);
6380 else
6381 nego = NS_SYNC(1);
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(4):
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(0x01);
6429 msgptr[msglen++] = 6;
6430 msgptr[msglen++] = M_X_PPR_REQ(0x04);
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(1):
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(0x01);
6447 msgptr[msglen++] = 3;
6448 msgptr[msglen++] = M_X_SYNC_REQ(0x01);
6449 msgptr[msglen++] = factor;
6450 msgptr[msglen++] = offset & 0x1f;
6451 break;
6452 case NS_WIDE(2):
6453 msgptr[msglen++] = M_EXTENDED(0x01);
6454 msgptr[msglen++] = 2;
6455 msgptr[msglen++] = M_X_WIDE_REQ(0x03);
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_FLAGSncr_debug & DEBUG_NEGO(0x0200)) {
6465 ncr_print_msg(cp, nego == NS_WIDE(2) ?
6466 "wide msgout":
6467 (nego == NS_SYNC(1) ? "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*/
6484static 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)(!cmd->lun) ? (tp)->l0p : (tp)->lmp ? (tp)->lmp[(
cmd->lun)] : 0
;
6489 ccb_p cp;
6490
6491 u_charunsigned char idmsg, *msgptr;
6492 u_intunsigned 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((16))) ||
6504 (cmd->lun >= MAX_LUN64 )) {
6505 return(DID_BAD_TARGET0x04);
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(0x04))) {
6518 tp->usrflag &= ~UF_NOSCAN(0x04);
6519 return DID_BAD_TARGET0x04;
6520 }
6521
6522 if (DEBUG_FLAGSncr_debug & DEBUG_TINY(0x0080)) {
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 >= HZ100) {
6538 u_longunsigned long tlimit = ktime_get(cmd->timeout_per_command - HZ)(jiffies + (unsigned long) cmd->timeout_per_command - 100);
6539 if (ktime_dif(np->settle_time, tlimit)((long)(np->settle_time) - (long)(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_OK0x00);
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(0x80) | cp->lun;
6570
6571 if (cp ->tag != NO_TAG(256) || (lp && !(tp->usrflag & UF_NODISC(0x02))))
6572 idmsg |= 0x40;
6573
6574 msgptr = cp->scsi_smsg;
6575 msglen = 0;
6576 msgptr[msglen++] = idmsg;
6577
6578 if (cp->tag != NO_TAG(256)) {
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)((long)(jiffies) - (long)(lp->tags_stime) >= 0)) {
6586 lp->tags_si = !(lp->tags_si);
6587 if (lp->tags_sum[lp->tags_si]) {
6588 order = M_ORDERED_TAG(0x22);
6589 if ((DEBUG_FLAGSncr_debug & DEBUG_TAGS(0x0400))||bootverbose(np->verbose)>0){
6590 PRINT_ADDR(cmd);
6591 printk("ordered tag forced.\n");
6592 }
6593 }
6594 lp->tags_stime = ktime_get(3*HZ)(jiffies + (unsigned long) 3*100);
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(0x20);
6606 break;
6607 default:
6608 order = M_ORDERED_TAG(0x22);
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(256/4) > (512/4)
6620 msgptr[msglen++] = cp->tag;
6621#else
6622 msgptr[msglen++] = (cp->tag << 1) + 1;
6623#endif
6624 }
6625
6626 cp->host_flagsphys.header.status[3] = 0;
6627
6628 /*----------------------------------------------------
6629 **
6630 ** Build the data descriptors
6631 **
6632 **----------------------------------------------------
6633 */
6634
6635 direction = scsi_data_direction(cmd);
6636 if (direction != SCSI_DATA_NONE3) {
6637 cp->segments = np->scatter (np, cp, cp->cmd);
6638 if (cp->segments < 0) {
6639 ncr_free_ccb(np, cp);
6640 return(DID_ERROR0x07);
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_longunsigned long current_period;
6670 u_charunsigned char current_offset, current_width, current_factor;
6671
6672 ncr_get_xfer_info (np, tp, &current_factor,
6673 &current_offset, &current_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_longunsigned 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_NONE3;
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_UNKNOWN0:
6732 case SCSI_DATA_WRITE1:
6733 goalp = NCB_SCRIPT_PHYS (np, data_out2)(np->p_script + ((size_t) (&((struct script *)0)->data_out2
)))
+ 8;
6734 lastp = goalp - 8 - (cp->segments * (SCR_SG_SIZE(2)*4));
6735 if (direction != SCSI_DATA_UNKNOWN0)
6736 break;
6737 cp->phys.header.wgoalp = cpu_to_scr(goalp)(goalp);
6738 cp->phys.header.wlastp = cpu_to_scr(lastp)(lastp);
6739 /* fall through */
6740 case SCSI_DATA_READ2:
6741 cp->host_flagsphys.header.status[3] |= HF_DATA_IN(1u<<5);
6742 goalp = NCB_SCRIPT_PHYS (np, data_in2)(np->p_script + ((size_t) (&((struct script *)0)->data_in2
)))
+ 8;
6743 lastp = goalp - 8 - (cp->segments * (SCR_SG_SIZE(2)*4));
6744 break;
6745 default:
6746 case SCSI_DATA_NONE3:
6747 lastp = goalp = NCB_SCRIPTH_PHYS (np, no_data)(np->p_scripth + ((size_t) (&((struct scripth *)0)->
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)(lastp);
6756 cp->phys.header.goalp = cpu_to_scr(goalp)(goalp);
6757
6758 if (direction == SCSI_DATA_UNKNOWN0)
6759 cp->phys.header.savep =
6760 cpu_to_scr(NCB_SCRIPTH_PHYS (np, data_io))((np->p_scripth + ((size_t) (&((struct scripth *)0)->
data_io))))
;
6761 else
6762 cp->phys.header.savep= cpu_to_scr(lastp)(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))((np->p_script + ((size_t) (&((struct script *)0)->
select))))
;
6790 cp->phys.header.go.restart = cpu_to_scr(NCB_SCRIPT_PHYS (np,resel_dsa))((np->p_script + ((size_t) (&((struct script *)0)->
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))((cp->p_ccb + ((size_t) (&((struct ccb *)0)->scsi_smsg
))))
;
6802 cp->phys.smsg.size = cpu_to_scr(msglen)(msglen);
6803
6804 /*
6805 ** command
6806 */
6807 memcpy(cp->cdb_buf, cmd->cmnd, MIN(cmd->cmd_len, sizeof(cp->cdb_buf)))(__builtin_constant_p((((cmd->cmd_len) < (sizeof(cp->
cdb_buf))) ? (cmd->cmd_len) : (sizeof(cp->cdb_buf)))) ?
__constant_memcpy((cp->cdb_buf),(cmd->cmnd),((((cmd->
cmd_len) < (sizeof(cp->cdb_buf))) ? (cmd->cmd_len) :
(sizeof(cp->cdb_buf))))) : __memcpy((cp->cdb_buf),(cmd
->cmnd),((((cmd->cmd_len) < (sizeof(cp->cdb_buf))
) ? (cmd->cmd_len) : (sizeof(cp->cdb_buf))))))
;
6808 cp->phys.cmd.addr = cpu_to_scr(CCB_PHYS (cp, cdb_buf[0]))((cp->p_ccb + ((size_t) (&((struct ccb *)0)->cdb_buf
[0]))))
;
6809 cp->phys.cmd.size = cpu_to_scr(cmd->cmd_len)(cmd->cmd_len);
6810
6811 /*
6812 ** status
6813 */
6814 cp->actualquirksphys.header.status[0] = tp->quirks;
6815 cp->host_statusphys.header.status[1] = cp->nego_status ? HS_NEGOTIATE(2) : HS_BUSY(1);
6816 cp->scsi_statusphys.header.status[2] = S_ILLEGAL(0xff);
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_OK0x00);
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
6865static 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)((struct ccb *)((char *)(qp)-(unsigned long)(&((struct ccb
*)0)->link_ccbq)))
;
6876 xpt_insque_tail(qp, &lp->busy_ccbq)__xpt_que_add(qp, (&lp->busy_ccbq)->blink, &lp->
busy_ccbq)
;
6877 lp->tasktbl[cp->tag == NO_TAG(256) ? 0 : cp->tag] =
6878 cpu_to_scr(cp->p_ccb)(cp->p_ccb);
6879 ncr_put_start_queue(np, cp);
6880 }
6881}
6882
6883static void ncr_put_start_queue(ncb_p np, ccb_p cp)
6884{
6885 u_shortunsigned 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_flagsphys.header.status[3] |= 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((8*(8) + 2*(16)) + 4)*2) qidx = 0;
6910
6911 np->squeue [qidx] = cpu_to_scr(np->p_idletask)(np->p_idletask);
6912 MEMORY_BARRIER()do { ; } while(0);
6913 np->squeue [np->squeueput] = cpu_to_scr(cp->p_ccb)(cp->p_ccb);
6914
6915 np->squeueput = qidx;
6916 cp->queued = 1;
6917
6918 if (DEBUG_FLAGSncr_debug & DEBUG_QUEUE(0x0008))
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()do { ; } while(0);
6926 OUTB (nc_istat, SIGP|np->istat_sem)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_istat))))) = (((0x20|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
6943static void ncr_chip_reset (ncb_p np)
6944{
6945 OUTB (nc_istat, SRST)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_istat))))) = (((0x40))))
;
6946 UDELAY (10);
6947 OUTB (nc_istat, 0)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_istat))))) = (((0))))
;
6948}
6949
6950static void ncr_soft_reset(ncb_p np)
6951{
6952 u_charunsigned char istat;
6953 int i;
6954
6955 OUTB (nc_istat, CABRT)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_istat))))) = (((0x80))))
;
6956 for (i = 1000000 ; i ; --i) {
6957 istat = INB (nc_istat)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_istat)))))
;
6958 if (istat & SIP0x02) {
6959 INW (nc_sist)(*(volatile unsigned short *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_sist)))))
;
6960 continue;
6961 }
6962 if (istat & DIP0x01) {
6963 OUTB (nc_istat, 0)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_istat))))) = (((0))))
;
6964 INB (nc_dstat)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->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*/
6985static void ncr_start_reset(ncb_p np)
6986{
6987 (void) ncr_reset_scsi_bus(np, 1, driver_setup.settle_delay);
6988}
6989
6990static 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)(jiffies + (unsigned long) settle_delay * 100);
6996
6997 if (bootverbose(np->verbose) > 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)((*(volatile unsigned short *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_sien))))) = (((0x02))))
;
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)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_stest3))))) = (((0x80)))
)
;
7011 OUTB (nc_dcntl, (np->rv_dcntl & IRQM))((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_dcntl))))) = ((((np->
rv_dcntl & 0x08)))))
;
7012 OUTB (nc_scntl1, CRST)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_scntl1))))) = (((0x08)))
)
;
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)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_sstat0)))))
;
7024 term = ((term & 2) << 7) + ((term & 1) << 17); /* rst sdp0 */
7025 term |= ((INB(nc_sstat2)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_sstat2)))))
& 0x01) << 26) | /* sdp1 */
7026 ((INW(nc_sbdl)(*(volatile unsigned short *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_sbdl)))))
& 0xff) << 9) | /* d7-0 */
7027 ((INW(nc_sbdl)(*(volatile unsigned short *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_sbdl)))))
& 0xff00) << 10) | /* d15-8 */
7028 INB(nc_sbcl)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_sbcl)))))
; /* req ack bsy sel atn msg cd io */
7029
7030 if (!(np->features & FE_WIDE(1<<1)))
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(1<<1)) ? "dp1,d15-8," : "",
7040 (u_longunsigned long)term, (u_longunsigned long)(2<<7));
7041 if (driver_setup.bus_check == 1)
7042 retv = 1;
7043 }
7044out:
7045 OUTB (nc_scntl1, 0)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->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*/
7058static 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_PUNT1;
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_statusphys.header.status[1] == HS_IDLE(0)) 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)process_waiting_list((np), 0x08);
7099/*
7100 * Wake-up all pending commands with HS_RESET -> DID_RESET.
7101 */
7102 ncr_wakeup(np, HS_RESET(6|(0x80)));
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)cmd->result = (((0x08) << 16) + ((0) & 0x7f));
7111 ncr_queue_done_cmd(np, cmd);
7112 }
7113
7114 return SCSI_RESET_SUCCESS2;
7115}
7116
7117/*==========================================================
7118**
7119**
7120** Abort an SCSI command.
7121** This is called from the generic SCSI driver.
7122**
7123**
7124**==========================================================
7125*/
7126static 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)retrieve_from_waiting_list(1, (np), (cmd))) {
7135 SetScsiAbortResult(cmd)cmd->result = (((0x05) << 16) + ((0xff) & 0x7f));
7136 ncr_queue_done_cmd(np, cmd);
7137 return SCSI_ABORT_SUCCESS1;
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_statusphys.header.status[1] == HS_IDLE(0)) continue;
7148 if (cp->cmd == cmd)
7149 break;
7150 }
7151
7152 if (!cp) {
7153 return SCSI_ABORT_NOT_RUNNING4;
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 = SEM0x10;
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)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_istat))))) = (((0x20|0x10
))))
;
7173
7174 /*
7175 ** Tell user we are working for him.
7176 */
7177 return SCSI_ABORT_PENDING2;
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
7192static 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)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_dmode))))) = (((np->sv_dmode
))))
;
7222 OUTB(nc_dcntl, np->sv_dcntl)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_dcntl))))) = (((np->sv_dcntl
))))
;
7223 OUTB(nc_ctest3, np->sv_ctest3)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_ctest3))))) = (((np->
sv_ctest3))))
;
7224 OUTB(nc_ctest4, np->sv_ctest4)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_ctest4))))) = (((np->
sv_ctest4))))
;
7225 OUTB(nc_ctest5, np->sv_ctest5)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_ctest5))))) = (((np->
sv_ctest5))))
;
7226 OUTB(nc_gpcntl, np->sv_gpcntl)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_gpcntl))))) = (((np->
sv_gpcntl))))
;
7227 OUTB(nc_stest2, np->sv_stest2)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->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
7249void 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_FLAGSncr_debug & DEBUG_TINY(0x0080))
7266 printk ("CCB=%lx STAT=%x/%x\n", (unsigned long)cp,
7267 cp->host_statusphys.header.status[1],cp->scsi_statusphys.header.status[2]);
7268
7269 /*
7270 ** Get command, target and lun pointers.
7271 */
7272
7273 cmd = cp->cmd;
7274 cp->cmd = NULL((void *) 0);
7275 tp = &np->target[cp->target];
7276 lp = ncr_lp(np, tp, cp->lun)(!cp->lun) ? (tp)->l0p : (tp)->lmp ? (tp)->lmp[(cp
->lun)] : 0
;
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_flagsphys.header.status[3] & HF_AUTO_SENSE(1u<<4)) {
7301 cp->scsi_statusphys.header.status[2] = 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(4)) {
7317 PRINT_ADDR(cmd);
7318 printk ("unrecovered SCSI parity error.\n");
7319 }
7320 if (cp->xerr_status & XE_EXTRA_DATA(1)) {
7321 PRINT_ADDR(cmd);
7322 printk ("extraneous data discarded.\n");
7323 }
7324 if (cp->xerr_status & XE_BAD_PHASE(2)) {
7325 PRINT_ADDR(cmd);
7326 printk ("illegal scsi phase (4/5).\n");
7327 }
7328 if (cp->xerr_status & XE_SODL_UNRUN(1<<3)) {
7329 PRINT_ADDR(cmd);
7330 printk ("ODD transfer in DATA OUT phase.\n");
7331 }
7332 if (cp->xerr_status & XE_SWIDE_OVRUN(1<<4)){
7333 PRINT_ADDR(cmd);
7334 printk ("ODD transfer in DATA IN phase.\n");
7335 }
7336
7337 if (cp->host_statusphys.header.status[1]==HS_COMPLETE(4|(0x80)))
7338 cp->host_statusphys.header.status[1] = HS_FAIL(9|(0x80));
7339 }
7340
7341 /*
7342 ** Print out any error for debugging purpose.
7343 */
7344 if (DEBUG_FLAGSncr_debug & (DEBUG_RESULT(0x0010)|DEBUG_TINY(0x0080))) {
7345 if (cp->host_statusphys.header.status[1]!=HS_COMPLETE(4|(0x80)) || cp->scsi_statusphys.header.status[2]!=S_GOOD(0x00) ||
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_statusphys.header.status[1], cp->scsi_statusphys.header.status[2],
7351 cp->data_len, cp->resid);
7352 }
7353 }
7354
7355#if LINUX_VERSION_CODE131108 >= LinuxVersionCode(2,3,99)(((2)<<16)+((3)<<8)+(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_statusphys.header.status[1] == HS_COMPLETE(4|(0x80)))
7365 && (cp->scsi_statusphys.header.status[2] == S_GOOD(0x00) ||
7366 cp->scsi_statusphys.header.status[2] == S_COND_MET(0x04))) {
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)cmd->result = (((0x00) << 16) + ((cp->phys.header
.status[2]) & 0x7f))
;
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)do {; } while (0); /* 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_statusphys.header.status[1] == HS_COMPLETE(4|(0x80)))
7405 && (cp->scsi_statusphys.header.status[2] == S_CHECK_COND(0x02))) {
7406 /*
7407 ** Check condition code
7408 */
7409 SetScsiResult(cmd, DID_OK, S_CHECK_COND)cmd->result = (((0x00) << 16) + (((0x02)) & 0x7f
))
;
7410
7411 if (DEBUG_FLAGSncr_debug & (DEBUG_RESULT(0x0010)|DEBUG_TINY(0x0080))) {
7412 PRINT_ADDR(cmd);
7413 ncr_printl_hex("sense data:", cmd->sense_buffer, 14);
7414 }
7415 } else if ((cp->host_statusphys.header.status[1] == HS_COMPLETE(4|(0x80)))
7416 && (cp->scsi_statusphys.header.status[2] == S_CONFLICT(0x18))) {
7417 /*
7418 ** Reservation Conflict condition code
7419 */
7420 SetScsiResult(cmd, DID_OK, S_CONFLICT)cmd->result = (((0x00) << 16) + (((0x18)) & 0x7f
))
;
7421
7422 } else if ((cp->host_statusphys.header.status[1] == HS_COMPLETE(4|(0x80)))
7423 && (cp->scsi_statusphys.header.status[2] == S_BUSY(0x08) ||
7424 cp->scsi_statusphys.header.status[2] == S_QUEUE_FULL(0x28))) {
7425
7426 /*
7427 ** Target is busy.
7428 */
7429 SetScsiResult(cmd, DID_OK, cp->scsi_status)cmd->result = (((0x00) << 16) + ((cp->phys.header
.status[2]) & 0x7f))
;
7430
7431 } else if ((cp->host_statusphys.header.status[1] == HS_SEL_TIMEOUT(5|(0x80)))
7432 || (cp->host_statusphys.header.status[1] == HS_TIMEOUT(8|(0x80)))) {
7433
7434 /*
7435 ** No response
7436 */
7437 SetScsiResult(cmd, DID_TIME_OUT, cp->scsi_status)cmd->result = (((0x03) << 16) + ((cp->phys.header
.status[2]) & 0x7f))
;
7438
7439 } else if (cp->host_statusphys.header.status[1] == HS_RESET(6|(0x80))) {
7440
7441 /*
7442 ** SCSI bus reset
7443 */
7444 SetScsiResult(cmd, DID_RESET, cp->scsi_status)cmd->result = (((0x08) << 16) + ((cp->phys.header
.status[2]) & 0x7f))
;
7445
7446 } else if (cp->host_statusphys.header.status[1] == HS_ABORTED(7|(0x80))) {
7447
7448 /*
7449 ** Transfer aborted
7450 */
7451 SetScsiAbortResult(cmd)cmd->result = (((0x05) << 16) + ((0xff) & 0x7f));
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_statusphys.header.status[1], cp->scsi_statusphys.header.status[2], cp);
7462
7463 did_status = DID_ERROR0x07;
7464 if (cp->xerr_status & XE_PARITY_ERR(4))
7465 did_status = DID_PARITY0x06;
7466
7467 SetScsiResult(cmd, did_status, cp->scsi_status)cmd->result = (((did_status) << 16) + ((cp->phys.
header.status[2]) & 0x7f))
;
7468 }
7469
7470 /*
7471 ** trace output
7472 */
7473
7474 if (tp->usrflag & UF_TRACE(0x01)) {
7475 PRINT_ADDR(cmd);
7476 printk (" CMD:");
7477 ncr_print_hex(cmd->cmnd, cmd->cmd_len);
7478
7479 if (cp->host_statusphys.header.status[1]==HS_COMPLETE(4|(0x80))) {
7480 switch (cp->scsi_statusphys.header.status[2]) {
7481 case S_GOOD(0x00):
7482 printk (" GOOD");
7483 break;
7484 case S_CHECK_COND(0x02):
7485 printk (" SENSE:");
7486 ncr_print_hex(cmd->sense_buffer, 14);
7487 break;
7488 default:
7489 printk (" STAT: %x\n", cp->scsi_statusphys.header.status[2]);
7490 break;
7491 }
7492 } else printk (" HOSTERROR: %x", cp->host_statusphys.header.status[1]);
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)process_waiting_list((np), 0x00);
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*/
7537int ncr_wakeup_done (ncb_p np)
7538{
7539 ccb_p cp;
7540 int i, n;
7541 u_longunsigned long dsa;
7542
7543 n = 0;
7544 i = np->dqueueget;
7545 while (1) {
7546 dsa = scr_to_cpu(np->dqueue[i])(np->dqueue[i]);
7547 if (!dsa)
7548 break;
7549 np->dqueue[i] = 0;
7550 if ((i = i+2) >= MAX_START((8*(8) + 2*(16)) + 4)*2)
7551 i = 0;
7552
7553 cp = ncr_ccb_from_dsa(np, dsa);
7554 if (cp) {
7555 MEMORY_BARRIER()do { ; } while(0);
7556 ncr_complete (np, cp);
7557 ++n;
7558 }
7559 else
7560 printk (KERN_ERR"<3>" "%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*/
7571void ncr_wakeup (ncb_p np, u_longunsigned long code)
7572{
7573 ccb_p cp = np->ccbc;
7574
7575 while (cp) {
7576 if (cp->host_statusphys.header.status[1] != HS_IDLE(0)) {
7577 cp->host_statusphys.header.status[1] = 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
7593void ncr_init (ncb_p np, int reset, char * msg, u_longunsigned long code)
7594{
7595 int i;
7596 u_longunsigned 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)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_stest3))))) = (((0x80|0x02
))))
;
7606 OUTONB (nc_ctest3, CLF)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_ctest3))))) = ((((*(volatile
unsigned char *) ((char *)np->reg + (((size_t) (&((struct
ncr_reg *)0)->nc_ctest3))))) | (0x04)))))
;
7607 }
7608
7609 /*
7610 ** Message.
7611 */
7612
7613 if (msg) printk (KERN_INFO"<6>" "%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((8*(8) + 2*(16)) + 4) - 1; /* 1 entry needed as end marker */
7620 for (i = 0; i < MAX_START((8*(8) + 2*(16)) + 4)*2; i += 2) {
7621 np->squeue[i] = cpu_to_scr(np->p_idletask)(np->p_idletask);
7622 np->squeue[i+1] = cpu_to_scr(phys + (i+2)*4)(phys + (i+2)*4);
7623 }
7624 np->squeue[MAX_START((8*(8) + 2*(16)) + 4)*2-1] = cpu_to_scr(phys)(phys);
7625
7626
7627 /*
7628 ** Start at first entry.
7629 */
7630 np->squeueput = 0;
7631 np->scripth0->startpos[0] = cpu_to_scr(phys)(phys);
7632
7633 /*
7634 ** Clear Done Queue
7635 */
7636 phys = vtobus(np->dqueue)virt_to_phys(np->dqueue);
7637 for (i = 0; i < MAX_START((8*(8) + 2*(16)) + 4)*2; i += 2) {
7638 np->dqueue[i] = 0;
7639 np->dqueue[i+1] = cpu_to_scr(phys + (i+2)*4)(phys + (i+2)*4);
7640 }
7641 np->dqueue[MAX_START((8*(8) + 2*(16)) + 4)*2-1] = cpu_to_scr(phys)(phys);
7642
7643 /*
7644 ** Start at first entry.
7645 */
7646 np->scripth0->done_pos[0] = cpu_to_scr(phys)(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 )((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->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)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_scntl0))))) = (((np->
rv_scntl0 | 0xc0))))
;
7662 /* full arb., ena parity, par->ATN */
7663 OUTB (nc_scntl1, 0x00)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->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)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_scid))))) = (((0x40|np->
myaddr))))
; /* Adapter SCSI address */
7668 OUTW (nc_respid, 1ul<<np->myaddr)((*(volatile unsigned short *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_respid))))) = (((1ul<<
np->myaddr))))
; /* Id to respond to */
7669 OUTB (nc_istat , SIGP )((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_istat))))) = (((0x20))))
; /* Signal Process */
7670 OUTB (nc_dmode , np->rv_dmode)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_dmode))))) = (((np->rv_dmode
))))
; /* Burst length, dma mode */
7671 OUTB (nc_ctest5, np->rv_ctest5)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_ctest5))))) = (((np->
rv_ctest5))))
; /* Large fifo + large burst */
7672
7673 OUTB (nc_dcntl , NOCOM|np->rv_dcntl)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_dcntl))))) = (((0x01|np->
rv_dcntl))))
; /* Protect SFBR */
7674 OUTB (nc_ctest3, np->rv_ctest3)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_ctest3))))) = (((np->
rv_ctest3))))
; /* Write and invalidate */
7675 OUTB (nc_ctest4, np->rv_ctest4)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_ctest4))))) = (((np->
rv_ctest4))))
; /* Master parity checking */
7676
7677 if ((np->device_id != PCI_DEVICE_ID_LSI_53C10100x20) &&
7678 (np->device_id != PCI_DEVICE_ID_LSI_53C1010_660x21)){
7679 OUTB (nc_stest2, EXT|np->rv_stest2)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_stest2))))) = (((0x02|np
->rv_stest2))))
;
7680 /* Extended Sreq/Sack filtering, not supported in C1010/C1010_66 */
7681 }
7682 OUTB (nc_stest3, TE)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_stest3))))) = (((0x80)))
)
; /* TolerANT enable */
7683 OUTB (nc_stime0, 0x0c)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->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_53C8750x000f)
7694 OUTB (nc_ctest0, (1<<5))((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_ctest0))))) = ((((1<<
5)))))
;
7695 else if (np->device_id == PCI_DEVICE_ID_NCR_53C8960x000b ||
7696 np->device_id == PCI_DEVICE_ID_LSI_53C10100x20 ||
7697 np->device_id == PCI_DEVICE_ID_LSI_53C1010_660x21 )
7698 np->rv_ccntl0 |= DPR0x01;
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_660x21)
7704 OUTB(nc_aipcntl1, (1<<3))((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->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(1<<17)) {
7713 OUTB (nc_ccntl0, np->rv_ccntl0)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_ccntl0))))) = (((np->
rv_ccntl0))))
;
7714 OUTB (nc_ccntl1, np->rv_ccntl1)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->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(1<<19)) {
7723 printk(KERN_INFO"<6>" "%s: handling phase mismatch from SCRIPTS.\n",
7724 ncr_name(np));
7725 OUTL (nc_pmjad1, NCB_SCRIPTH_PHYS (np, pm_handle))((*(volatile unsigned int *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_pmjad1))))) = ((((np->
p_scripth + ((size_t) (&((struct scripth *)0)->pm_handle
)))))))
;
7726 OUTL (nc_pmjad2, NCB_SCRIPTH_PHYS (np, pm_handle))((*(volatile unsigned int *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_pmjad2))))) = ((((np->
p_scripth + ((size_t) (&((struct scripth *)0)->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(1<<0))
7735 OUTB(nc_gpcntl, INB(nc_gpcntl) & ~0x01)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_gpcntl))))) = ((((*(volatile
unsigned char *) ((char *)np->reg + (((size_t) (&((struct
ncr_reg *)0)->nc_gpcntl))))) & ~0x01))))
;
7736 else if (np->features & FE_LEDC(1<<20))
7737 OUTB(nc_gpcntl, (INB(nc_gpcntl) & ~0x41) | 0x20)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_gpcntl))))) = (((((*(volatile
unsigned char *) ((char *)np->reg + (((size_t) (&((struct
ncr_reg *)0)->nc_gpcntl))))) & ~0x41) | 0x20))))
;
7738
7739
7740 /*
7741 ** enable ints
7742 */
7743
7744 OUTW (nc_sien , STO|HTH|MA|SGE|UDC|RST|PAR)((*(volatile unsigned short *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_sien))))) = (((0x0400|0x0100
|0x80|0x08|0x04|0x02|0x01))))
;
7745 OUTB (nc_dien , MDPE|BF|SSI|SIR|IID)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_dien))))) = (((0x40|0x20
|0x08|0x04|0x01))))
;
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(1<<3)) || (np->features & FE_ULTRA3(1<<22)) ) {
7752 OUTONW (nc_sien, SBMC)((*(volatile unsigned short *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_sien))))) = ((((*(volatile
unsigned short *) ((char *)np->reg + (((size_t) (&((struct
ncr_reg *)0)->nc_sien))))) | (0x1000)))))
;
7753 np->scsi_mode = INB (nc_stest4)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_stest4)))))
& SMODE0xc0;
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((16));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(np->verbose))
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)(np->p_scripth0+((size_t) (&((struct scripth *)0)->
start_ram64)))
;
7802 else
7803 phys = NCB_SCRIPTH_PHYS (np, start_ram)(np->p_scripth + ((size_t) (&((struct scripth *)0)->
start_ram)))
;
7804#else
7805 if (np->base2_ws == 8192) {
7806 memcpy_to_pci(np->base2_va + 4096,(__builtin_constant_p(((sizeof(struct scripth)))) ? __constant_memcpy
(((void *)((np->base2_va + 4096))),(((np->scripth0))),(
((sizeof(struct scripth))))) : __memcpy(((void *)((np->base2_va
+ 4096))),(((np->scripth0))),(((sizeof(struct scripth))))
))
7807 np->scripth0, sizeof(struct scripth))(__builtin_constant_p(((sizeof(struct scripth)))) ? __constant_memcpy
(((void *)((np->base2_va + 4096))),(((np->scripth0))),(
((sizeof(struct scripth))))) : __memcpy(((void *)((np->base2_va
+ 4096))),(((np->scripth0))),(((sizeof(struct scripth))))
))
;
7808 OUTL (nc_mmws, np->scr_ram_seg)((*(volatile unsigned int *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_mmws))))) = (((np->scr_ram_seg
))))
;
7809 OUTL (nc_mmrs, np->scr_ram_seg)((*(volatile unsigned int *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_mmrs))))) = (((np->scr_ram_seg
))))
;
7810 OUTL (nc_sfs, np->scr_ram_seg)((*(volatile unsigned int *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_sfs))))) = (((np->scr_ram_seg
))))
;
7811 phys = NCB_SCRIPTH_PHYS (np, start64)(np->p_scripth + ((size_t) (&((struct scripth *)0)->
start64)))
;
7812 }
7813 else
7814 phys = NCB_SCRIPT_PHYS (np, init)(np->p_script + ((size_t) (&((struct script *)0)->init
)))
;
7815 memcpy_to_pci(np->base2_va, np->script0, sizeof(struct script))(__builtin_constant_p(((sizeof(struct script)))) ? __constant_memcpy
(((void *)((np->base2_va))),(((np->script0))),(((sizeof
(struct script))))) : __memcpy(((void *)((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)(np->p_script + ((size_t) (&((struct script *)0)->init
)))
;
7820
7821 np->istat_sem = 0;
7822
7823 OUTL (nc_dsa, np->p_ncb)((*(volatile unsigned int *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_dsa))))) = (((np->p_ncb
))))
;
7824 OUTL_DSP (phys)do { do { ; } while(0); ((*(volatile unsigned int *) ((char *
)np->reg + (((size_t) (&((struct ncr_reg *)0)->nc_dsp
))))) = ((((phys))))); } while (0)
;
7825}
7826
7827/*==========================================================
7828**
7829** Prepare the negotiation values for wide and
7830** synchronous transfers.
7831**
7832**==========================================================
7833*/
7834
7835static void ncr_negotiate (struct ncb* np, struct tcb* tp)
7836{
7837 /*
7838 ** minsync unit is 4ns !
7839 */
7840
7841 u_longunsigned long minsync = tp->usrsync;
7842
7843 /*
7844 ** SCSI bus mode limit
7845 */
7846
7847 if (np->scsi_mode && np->scsi_mode == SMODE_SE0x80) {
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
7890static void ncr_getsync(ncb_p np, u_charunsigned char sfac, u_charunsigned char *fakp, u_charunsigned char *scntl3p)
7891{
7892 u_longunsigned long clk = np->clock_khz; /* SCSI clock frequency in kHz */
7893 int div = np->clock_divn; /* Number of divisors supported */
7894 u_longunsigned long fak; /* Sync factor in sxfer */
7895 u_longunsigned long per; /* Period in tenths of ns */
7896 u_longunsigned 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_longunsigned 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_53C10100x20) ||
7959 (np->device_id == PCI_DEVICE_ID_LSI_53C1010_660x21)) {
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*/
7977static void ncr_get_xfer_info(ncb_p np, tcb_p tp, u_charunsigned char *factor,
7978 u_charunsigned char *offset, u_charunsigned char *width)
7979{
7980
7981 u_charunsigned char idiv;
7982 u_longunsigned long period;
7983
7984 *width = (tp->wval & EWS0x08) ? 1 : 0;
7985
7986 if ((np->device_id == PCI_DEVICE_ID_LSI_53C10100x20) ||
7987 (np->device_id == PCI_DEVICE_ID_LSI_53C1010_660x21))
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_53C10100x20) ||
8003 (np->device_id == PCI_DEVICE_ID_LSI_53C1010_660x21)){
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
8032static void ncr_set_sync_wide_status (ncb_p np, u_charunsigned 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)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_sxfer))))) = (((tp->sval
))))
;
8044 OUTB (nc_scntl3, tp->wval)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_scntl3))))) = (((tp->
wval))))
;
8045 if ((np->device_id == PCI_DEVICE_ID_LSI_53C10100x20) ||
8046 (np->device_id == PCI_DEVICE_ID_LSI_53C1010_660x21))
8047 OUTB (nc_scntl4, tp->uval)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->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_statusphys.header.status[1] == HS_IDLE(0))
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_53C10100x20) ||
8060 (np->device_id == PCI_DEVICE_ID_LSI_53C1010_660x21))
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
8072static void ncr_setsync (ncb_p np, ccb_p cp, u_charunsigned char scntl3, u_charunsigned char sxfer,
8073 u_charunsigned char scntl4)
8074{
8075 tcb_p tp;
8076 u_charunsigned char target = INB (nc_sdid)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_sdid)))))
& 0x0f;
8077 u_charunsigned char idiv;
8078 u_charunsigned char offset;
8079
8080 assert (cp){ if (!(cp)) { (void)panic( "assertion \"%s\" failed: file \"%s\", line %d\n"
, "cp", "../linux/src/drivers/scsi/sym53c8xx.c", 8080); } }
;
8081 if (!cp) return;
8082
8083 assert (target == (cp->target & 0xf)){ if (!(target == (cp->target & 0xf))) { (void)panic( "assertion \"%s\" failed: file \"%s\", line %d\n"
, "target == (cp->target & 0xf)", "../linux/src/drivers/scsi/sym53c8xx.c"
, 8083); } }
;
8084
8085 tp = &np->target[target];
8086
8087 if ((np->device_id == PCI_DEVICE_ID_LSI_53C10100x20) ||
8088 (np->device_id == PCI_DEVICE_ID_LSI_53C1010_660x21)) {
8089 offset = sxfer & 0x3f; /* bits 5-0 */
8090 scntl3 = (scntl3 & 0xf0) | (tp->wval & EWS0x08);
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 & EWS0x08) |
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_53C10100x20) ||
8111 (np->device_id == PCI_DEVICE_ID_LSI_53C1010_660x21)) {
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(np->verbose) < 2 && (cp->host_flagsphys.header.status[3] & HF_AUTO_SENSE(1u<<4)))
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_53C10100x20) &&
8154 (np->device_id != PCI_DEVICE_ID_LSI_53C1010_660x21))
8155 OUTOFFB (nc_stest2, EXT)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_stest2))))) = ((((*(volatile
unsigned char *) ((char *)np->reg + (((size_t) (&((struct
ncr_reg *)0)->nc_stest2))))) & ~(0x02)))))
;
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 " : "");
8171next:
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
8190static void ncr_setwide (ncb_p np, ccb_p cp, u_charunsigned char wide, u_charunsigned char ack)
8191{
8192 u_shortunsigned short target = INB (nc_sdid)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_sdid)))))
& 0x0f;
8193 tcb_p tp;
8194 u_charunsigned char scntl3;
8195 u_charunsigned char sxfer;
8196
8197 assert (cp){ if (!(cp)) { (void)panic( "assertion \"%s\" failed: file \"%s\", line %d\n"
, "cp", "../linux/src/drivers/scsi/sym53c8xx.c", 8197); } }
;
8198 if (!cp) return;
8199
8200 assert (target == (cp->target & 0xf)){ if (!(target == (cp->target & 0xf))) { (void)panic( "assertion \"%s\" failed: file \"%s\", line %d\n"
, "target == (cp->target & 0xf)", "../linux/src/drivers/scsi/sym53c8xx.c"
, 8200); } }
;
8201
8202 tp = &np->target[target];
8203 tp->widedone = wide+1;
8204 scntl3 = (tp->wval & (~EWS0x08)) | (wide ? EWS0x08 : 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(np->verbose) >= 2) {
8219 PRINT_TARGET(np, target);
8220 if (scntl3 & EWS0x08)
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
8242static void ncr_setsyncwide (ncb_p np, ccb_p cp, u_charunsigned char scntl3, u_charunsigned char sxfer,
8243 u_charunsigned char scntl4, u_charunsigned char wide)
8244{
8245 tcb_p tp;
8246 u_charunsigned char target = INB (nc_sdid)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_sdid)))))
& 0x0f;
8247 u_charunsigned char idiv;
8248 u_charunsigned char offset;
8249
8250 assert (cp){ if (!(cp)) { (void)panic( "assertion \"%s\" failed: file \"%s\", line %d\n"
, "cp", "../linux/src/drivers/scsi/sym53c8xx.c", 8250); } }
;
8251 if (!cp) return;
8252
8253 assert (target == (cp->target & 0xf)){ if (!(target == (cp->target & 0xf))) { (void)panic( "assertion \"%s\" failed: file \"%s\", line %d\n"
, "target == (cp->target & 0xf)", "../linux/src/drivers/scsi/sym53c8xx.c"
, 8253); } }
;
8254
8255 tp = &np->target[target];
8256 tp->widedone = wide+1;
8257
8258 if ((np->device_id == PCI_DEVICE_ID_LSI_53C10100x20) ||
8259 (np->device_id == PCI_DEVICE_ID_LSI_53C1010_660x21)) {
8260 offset = sxfer & 0x3f; /* bits 5-0 */
8261 scntl3 = (scntl3 & 0xf0) | (wide ? EWS0x08 : 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 ? EWS0x08 : 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_53C10100x20) ||
8282 (np->device_id == PCI_DEVICE_ID_LSI_53C1010_660x21)) {
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(np->verbose) < 2 && (cp->host_flagsphys.header.status[3] & HF_AUTO_SENSE(1u<<4)))
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_53C10100x20) &&
8325 (np->device_id != PCI_DEVICE_ID_LSI_53C1010_660x21))
8326 OUTOFFB (nc_stest2, EXT)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_stest2))))) = ((((*(volatile
unsigned char *) ((char *)np->reg + (((size_t) (&((struct
ncr_reg *)0)->nc_stest2))))) & ~(0x02)))))
;
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 " : "");
8342next:
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
8360static void ncr_setup_tags (ncb_p np, u_charunsigned char tn, u_charunsigned char ln)
8361{
8362 tcb_p tp = &np->target[tn];
8363 lcb_p lp = ncr_lp(np, tp, ln)(!ln) ? (tp)->l0p : (tp)->lmp ? (tp)->lmp[(ln)] : 0;
8364 u_shortunsigned 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(0x02)) && 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))((np->p_script + ((size_t) (&((struct script *)0)->
resel_tag))))
:
8431 cpu_to_scr(NCB_SCRIPT_PHYS(np, resel_notag))((np->p_script + ((size_t) (&((struct script *)0)->
resel_notag))))
;
8432
8433 /*
8434 ** Announce change to user.
8435 */
8436 if (bootverbose(np->verbose)) {
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
8454static void ncr_usercmd (ncb_p np)
8455{
8456 u_charunsigned char t;
8457 tcb_p tp;
8458 int ln;
8459 u_longunsigned long size;
8460
8461 switch (np->user.cmd) {
8462 case 0: return;
8463
8464 case UC_SETDEBUG12:
8465#ifdef SCSI_NCR_DEBUG_INFO_SUPPORT
8466 ncr_debug = np->user.data;
8467#endif
8468 break;
8469
8470 case UC_SETORDER13:
8471 np->order = np->user.data;
8472 break;
8473
8474 case UC_SETVERBOSE17:
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((16)); 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_SETSYNC10:
8492 tp->usrsync = np->user.data;
8493 ncr_negotiate (np, tp);
8494 break;
8495
8496 case UC_SETWIDE14:
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_SETTAGS11:
8505 tp->usrtags = np->user.data;
8506 for (ln = 0; ln < MAX_LUN64; ln++) {
8507 lcb_p lp;
8508 lp = ncr_lp(np, tp, ln)(!ln) ? (tp)->l0p : (tp)->lmp ? (tp)->lmp[(ln)] : 0;
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_RESETDEV18:
8518 tp->to_reset = 1;
8519 np->istat_sem = SEM0x10;
8520 OUTB (nc_istat, SIGP|SEM)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_istat))))) = (((0x20|0x10
))))
;
8521 break;
8522
8523 case UC_CLEARDEV19:
8524 for (ln = 0; ln < MAX_LUN64; ln++) {
8525 lcb_p lp;
8526 lp = ncr_lp(np, tp, ln)(!ln) ? (tp)->l0p : (tp)->lmp ? (tp)->lmp[(ln)] : 0;
8527 if (lp)
8528 lp->to_clear = 1;
8529 }
8530 np->istat_sem = SEM0x10;
8531 OUTB (nc_istat, SIGP|SEM)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_istat))))) = (((0x20|0x10
))))
;
8532 break;
8533
8534 case UC_SETFLAG15:
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
8559static void ncr_timeout (ncb_p np)
8560{
8561 u_longunsigned long thistime = ktime_get(0)(jiffies + (unsigned long) 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)(jiffies + (unsigned long) (100 +9)/10);
8576#else
8577 np->timer.expires = ktime_get(SCSI_NCR_TIMER_INTERVAL)(jiffies + (unsigned long) (100));
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(np->verbose) > 1)
8588 printk("%s: command processing resumed\n", ncr_name(np));
8589 np->settle_time = 0;
8590 requeue_waiting_list(np)process_waiting_list((np), 0x00);
8591 }
8592 return;
8593 }
8594
8595 /*
8596 ** Nothing to do for now, but that may come.
8597 */
8598 if (np->lasttime + 4*HZ100 < 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)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_istat)))))
& (INTF0x04|SIP0x02|DIP0x01)) {
8616
8617 /*
8618 ** Process pending interrupts.
8619 */
8620 if (DEBUG_FLAGSncr_debug & DEBUG_TINY(0x0080)) printk ("{");
8621 ncr_exception (np);
8622 if (DEBUG_FLAGSncr_debug & DEBUG_TINY(0x0080)) 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
8657static void ncr_log_hard_error(ncb_p np, u_shortunsigned short sist, u_charunsigned char dstat)
8658{
8659 u_int32 dsp;
8660 int script_ofs;
8661 int script_size;
8662 char *script_name;
8663 u_charunsigned char *script_base;
8664 int i;
8665
8666 dsp = INL (nc_dsp)(*(volatile unsigned int *) ((char *)np->reg + (((size_t) (
&((struct ncr_reg *)0)->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_charunsigned 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_charunsigned 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)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_sdid)))))
&0x0f, dstat, sist,
8689 (unsigned)INB (nc_socl)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_socl)))))
, (unsigned)INB (nc_sbcl)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_sbcl)))))
, (unsigned)INB (nc_sbdl)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_sbdl)))))
,
8690 (unsigned)INB (nc_sxfer)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_sxfer)))))
,(unsigned)INB (nc_scntl3)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_scntl3)))))
, script_name, script_ofs,
8691 (unsigned)INL (nc_dbc)(*(volatile unsigned int *) ((char *)np->reg + (((size_t) (
&((struct ncr_reg *)0)->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))((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)(*(volatile unsigned char *) ((char *)np->reg + (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
8773void ncr_exception (ncb_p np)
8774{
8775 u_charunsigned char istat, istatc;
8776 u_charunsigned char dstat;
8777 u_shortunsigned 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)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_istat)))))
;
8788 if (istat & INTF0x04) {
8789 OUTB (nc_istat, (istat & SIGP) | INTF | np->istat_sem)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_istat))))) = ((((istat &
0x20) | 0x04 | np->istat_sem))))
;
8790 istat = INB (nc_istat)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_istat)))))
; /* DUMMY READ */
8791 if (DEBUG_FLAGSncr_debug & DEBUG_TINY(0x0080)) printk ("F ");
8792 (void)ncr_wakeup_done (np);
8793 };
8794
8795 if (!(istat & (SIP0x02|DIP0x01)))
8796 return;
8797
8798#if 0 /* We should never get this one */
8799 if (istat & CABRT0x80)
8800 OUTB (nc_istat, CABRT)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_istat))))) = (((0x80))))
;
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 & SIP0x02)
8824 sist |= INW (nc_sist)(*(volatile unsigned short *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_sist)))))
;
8825 if (istatc & DIP0x01)
8826 dstat |= INB (nc_dstat)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_dstat)))))
;
8827 istatc = INB (nc_istat)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_istat)))))
;
8828 istat |= istatc;
8829 } while (istatc & (SIP0x02|DIP0x01));
8830
8831 if (DEBUG_FLAGSncr_debug & DEBUG_TINY(0x0080))
8832 printk ("<%d|%x:%x|%x:%x>",
8833 (int)INB(nc_scr0)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_scr0)))))
,
8834 dstat,sist,
8835 (unsigned)INL(nc_dsp)(*(volatile unsigned int *) ((char *)np->reg + (((size_t) (
&((struct ncr_reg *)0)->nc_dsp)))))
,
8836 (unsigned)INL(nc_dbc)(*(volatile unsigned int *) ((char *)np->reg + (((size_t) (
&((struct ncr_reg *)0)->nc_dbc)))))
);
8837
8838 /*
8839 ** On paper, a memory barrier may be needed here.
8840 ** And since we are paranoid ... :)
8841 */
8842 MEMORY_BARRIER()do { ; } while(0);
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 & (STO0x0400|GEN0x0200|HTH0x0100|SGE0x08|UDC0x04|SBMC0x1000|RST0x02)) &&
8860 !(dstat & (MDPE0x40|BF0x20|ABRT0x10|IID0x01))) {
8861 if (sist & PAR0x01) ncr_int_par (np, sist);
8862 else if (sist & MA0x80) ncr_int_ma (np);
8863 else if (dstat & SIR0x04) ncr_int_sir (np);
8864 else if (dstat & SSI0x08) OUTONB_STD ()do { do { ; } while(0); ((*(volatile unsigned char *) ((char *
)np->reg + (((size_t) (&((struct ncr_reg *)0)->nc_dcntl
))))) = ((((*(volatile unsigned char *) ((char *)np->reg +
(((size_t) (&((struct ncr_reg *)0)->nc_dcntl))))) | (
(0x04|0x01)))))); } while (0)
;
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 & RST0x02) {
8883 ncr_init (np, 1, bootverbose(np->verbose) ? "scsi reset" : NULL((void *) 0), HS_RESET(6|(0x80)));
8884 return;
8885 };
8886
8887 OUTB (nc_ctest3, np->rv_ctest3 | CLF)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_ctest3))))) = (((np->
rv_ctest3 | 0x04))))
; /* clear dma fifo */
8888 OUTB (nc_stest3, TE|CSF)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_stest3))))) = (((0x80|0x02
))))
; /* clear scsi fifo */
8889
8890 if (!(sist & (GEN0x0200|HTH0x0100|SGE0x08)) &&
8891 !(dstat & (MDPE0x40|BF0x20|ABRT0x10|IID0x01))) {
8892 if (sist & SBMC0x1000) ncr_int_sbmc (np);
8893 else if (sist & STO0x0400) ncr_int_sto (np);
8894 else if (sist & UDC0x04) 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)((long)(jiffies) - (long)(np->regtime) >= 0)) {
8908 np->regtime = ktime_get(10*HZ)(jiffies + (unsigned long) 10*100);
8909 for (i = 0; i<sizeof(np->regdump); i++)
8910 ((char*)&np->regdump)[i] = INB_OFF(i)(*(volatile unsigned char *) ((char *)np->reg + (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_53C10100x20) ||
8918 (np->device_id == PCI_DEVICE_ID_LSI_53C1010_660x21)) {
8919 u_charunsigned char ctest4_o, ctest4_m;
8920 u_charunsigned char shadow;
8921
8922 /*
8923 * Get shadow register data
8924 * Write 1 to ctest4
8925 */
8926 ctest4_o = INB(nc_ctest4)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_ctest4)))))
;
8927
8928 OUTB(nc_ctest4, ctest4_o | 0x10)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_ctest4))))) = (((ctest4_o
| 0x10))))
;
8929
8930 ctest4_m = INB(nc_ctest4)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_ctest4)))))
;
8931 shadow = INW_OFF(0x42)(*(volatile unsigned short *) ((char *)np->reg + (0x42)));
8932
8933 OUTB(nc_ctest4, ctest4_o)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->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 & (GEN0x0200|HTH0x0100|SGE0x08)) ||
8940 (dstat & (MDPE0x40|BF0x20|ABRT0x10|IID0x01))) {
8941 ncr_start_reset(np);
8942 return;
8943 };
8944
8945unknown_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*/
8988static void ncr_recover_scsi_int (ncb_p np, u_charunsigned char hsts)
8989{
8990 u_int32 dsp = INL (nc_dsp)(*(volatile unsigned int *) ((char *)np->reg + (((size_t) (
&((struct ncr_reg *)0)->nc_dsp)))))
;
8991 u_int32 dsa = INL (nc_dsa)(*(volatile unsigned int *) ((char *)np->reg + (((size_t) (
&((struct ncr_reg *)0)->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)(np->p_script + ((size_t) (&((struct script *)0)->getjob_begin
)))
&&
9000 dsp < NCB_SCRIPT_PHYS (np, getjob_end)(np->p_script + ((size_t) (&((struct script *)0)->getjob_end
)))
+ 1)) &&
9001 (!(dsp > NCB_SCRIPT_PHYS (np, ungetjob)(np->p_script + ((size_t) (&((struct script *)0)->ungetjob
)))
&&
9002 dsp < NCB_SCRIPT_PHYS (np, reselect)(np->p_script + ((size_t) (&((struct script *)0)->reselect
)))
+ 1)) &&
9003 (!(dsp > NCB_SCRIPTH_PHYS (np, sel_for_abort)(np->p_scripth + ((size_t) (&((struct scripth *)0)->
sel_for_abort)))
&&
9004 dsp < NCB_SCRIPTH_PHYS (np, sel_for_abort_1)(np->p_scripth + ((size_t) (&((struct scripth *)0)->
sel_for_abort_1)))
+ 1)) &&
9005 (!(dsp > NCB_SCRIPT_PHYS (np, done)(np->p_script + ((size_t) (&((struct script *)0)->done
)))
&&
9006 dsp < NCB_SCRIPT_PHYS (np, done_end)(np->p_script + ((size_t) (&((struct script *)0)->done_end
)))
+ 1))) {
9007 if (cp) {
9008 cp->host_statusphys.header.status[1] = hsts;
9009 ncr_complete (np, cp);
9010 }
9011 OUTL (nc_dsa, DSA_INVALID)((*(volatile unsigned int *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_dsa))))) = (((0xffffffff)
)))
;
9012 OUTB (nc_ctest3, np->rv_ctest3 | CLF)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_ctest3))))) = (((np->
rv_ctest3 | 0x04))))
; /* clear dma fifo */
9013 OUTB (nc_stest3, TE|CSF)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_stest3))))) = (((0x80|0x02
))))
; /* clear scsi fifo */
9014 OUTL_DSP (NCB_SCRIPT_PHYS (np, start))do { do { ; } while(0); ((*(volatile unsigned int *) ((char *
)np->reg + (((size_t) (&((struct ncr_reg *)0)->nc_dsp
))))) = (((((np->p_script + ((size_t) (&((struct script
*)0)->start)))))))); } while (0)
;
9015 }
9016 else
9017 goto reset_all;
9018
9019 return;
9020
9021reset_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
9041void ncr_int_sto (ncb_p np)
9042{
9043 u_int32 dsp = INL (nc_dsp)(*(volatile unsigned int *) ((char *)np->reg + (((size_t) (
&((struct ncr_reg *)0)->nc_dsp)))))
;
9044
9045 if (DEBUG_FLAGSncr_debug & DEBUG_TINY(0x0080)) printk ("T");
9046
9047 if (dsp == NCB_SCRIPT_PHYS (np, wf_sel_done)(np->p_script + ((size_t) (&((struct script *)0)->wf_sel_done
)))
+ 8 ||
9048 !(driver_setup.recovery & 1))
9049 ncr_recover_scsi_int(np, HS_SEL_TIMEOUT(5|(0x80)));
9050 else
9051 ncr_start_reset(np);
9052}
9053
9054/*==========================================================
9055**
9056** ncr chip exception handler for unexpected disconnect
9057**
9058**==========================================================
9059**
9060**----------------------------------------------------------
9061*/
9062void ncr_int_udc (ncb_p np)
9063{
9064 u_int32 dsa = INL (nc_dsa)(*(volatile unsigned int *) ((char *)np->reg + (((size_t) (
&((struct ncr_reg *)0)->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(10|(0x80)));
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
9099static void ncr_int_sbmc (ncb_p np)
9100{
9101 u_charunsigned char scsi_mode = INB (nc_stest4)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_stest4)))))
& SMODE0xc0;
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)(jiffies + (unsigned long) 1*100);
9114 ncr_init (np, 0, bootverbose(np->verbose) ? "scsi mode change" : NULL((void *) 0), HS_RESET(6|(0x80)));
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
9147static void ncr_int_par (ncb_p np, u_shortunsigned short sist)
9148{
9149 u_charunsigned char hsts = INB (HS_PRT)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_scr1)))))
;
9150 u_int32 dsp = INL (nc_dsp)(*(volatile unsigned int *) ((char *)np->reg + (((size_t) (
&((struct ncr_reg *)0)->nc_dsp)))))
;
9151 u_int32 dbc = INL (nc_dbc)(*(volatile unsigned int *) ((char *)np->reg + (((size_t) (
&((struct ncr_reg *)0)->nc_dbc)))))
;
9152 u_int32 dsa = INL (nc_dsa)(*(volatile unsigned int *) ((char *)np->reg + (((size_t) (
&((struct ncr_reg *)0)->nc_dsa)))))
;
9153 u_charunsigned char sbcl = INB (nc_sbcl)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_sbcl)))))
;
9154 u_charunsigned 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)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_scntl1)))))
& ISCON0x10)) {
9165 if (!(driver_setup.recovery & 1)) {
9166 ncr_recover_scsi_int(np, HS_FAIL(9|(0x80)));
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)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_scr3))))) = ((((*(volatile
unsigned char *) ((char *)np->reg + (((size_t) (&((struct
ncr_reg *)0)->nc_scr3))))) | ((1u<<7))))))
;
9190 cp->xerr_status |= XE_PARITY_ERR(4);
9191
9192 /*
9193 ** Prepare the message to send to the device.
9194 */
9195 np->msgout[0] = (phase == 7) ? M_PARITY(0x09) : M_ID_ERROR(0x05);
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)(np->p_scripth + ((size_t) (&((struct scripth *)0)->
pm_handle)))
)
9215 OUTL_DSP (dsp)do { do { ; } while(0); ((*(volatile unsigned int *) ((char *
)np->reg + (((size_t) (&((struct ncr_reg *)0)->nc_dsp
))))) = ((((dsp))))); } while (0)
;
9216 /* Phase mismatch handled by the C code */
9217 else if (sist & MA0x80)
9218 ncr_int_ma (np);
9219 /* No phase mismatch occurred */
9220 else {
9221 OUTL (nc_temp, dsp)((*(volatile unsigned int *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_temp))))) = (((dsp))))
;
9222 OUTL_DSP (NCB_SCRIPT_PHYS (np, dispatch))do { do { ; } while(0); ((*(volatile unsigned int *) ((char *
)np->reg + (((size_t) (&((struct ncr_reg *)0)->nc_dsp
))))) = (((((np->p_script + ((size_t) (&((struct script
*)0)->dispatch)))))))); } while (0)
;
9223 }
9224 }
9225 else
9226 OUTL_DSP (NCB_SCRIPT_PHYS (np, clrack))do { do { ; } while(0); ((*(volatile unsigned int *) ((char *
)np->reg + (((size_t) (&((struct ncr_reg *)0)->nc_dsp
))))) = (((((np->p_script + ((size_t) (&((struct script
*)0)->clrack)))))))); } while (0)
;
9227 return;
9228
9229reset_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
9248static 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_intunsigned int delta;
9260 u_charunsigned char cmd;
9261 u_charunsigned char hflags, hflags0;
9262 struct pm_ctx *pm;
9263 ccb_p cp;
9264
9265 dsp = INL (nc_dsp)(*(volatile unsigned int *) ((char *)np->reg + (((size_t) (
&((struct ncr_reg *)0)->nc_dsp)))))
;
9266 dbc = INL (nc_dbc)(*(volatile unsigned int *) ((char *)np->reg + (((size_t) (
&((struct ncr_reg *)0)->nc_dbc)))))
;
9267 dsa = INL (nc_dsa)(*(volatile unsigned int *) ((char *)np->reg + (((size_t) (
&((struct ncr_reg *)0)->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_FLAGSncr_debug & DEBUG_PHASE(0x0002))
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_charunsigned 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_53C10100x20) ||
9298 (np->device_id == PCI_DEVICE_ID_LSI_53C1010_660x21))
9299 delta = INL(nc_dfbc)(*(volatile unsigned int *) ((char *)np->reg + (((size_t) (
&((struct ncr_reg *)0)->nc_dfbc)))))
& 0xffff;
9300 else {
9301 dfifo = INL(nc_dfifo)(*(volatile unsigned int *) ((char *)np->reg + (((size_t) (
&((struct ncr_reg *)0)->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 & (DFS0x20 << 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)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_sstat0)))))
;
9326 if (ss0 & OLF0x20) rest++;
9327 if ((np->device_id != PCI_DEVICE_ID_LSI_53C10100x20) &&
9328 (np->device_id != PCI_DEVICE_ID_LSI_53C1010_660x21) && (ss0 & ORF0x40))
9329 rest++;
9330 if (cp && (cp->phys.select.sel_scntl3 & EWS0x08)) {
9331 ss2 = INB (nc_sstat2)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_sstat2)))))
;
9332 if (ss2 & OLF10x20) rest++;
9333 if ((np->device_id != PCI_DEVICE_ID_LSI_53C10100x20) &&
9334 (np->device_id != PCI_DEVICE_ID_LSI_53C1010_660x21) && (ss2 & ORF0x40))
9335 rest++;
9336 };
9337
9338 /*
9339 ** Clear fifos.
9340 */
9341 OUTB (nc_ctest3, np->rv_ctest3 | CLF)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_ctest3))))) = (((np->
rv_ctest3 | 0x04))))
; /* dma fifo */
9342 OUTB (nc_stest3, TE|CSF)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_stest3))))) = (((0x80|0x02
))))
; /* scsi fifo */
9343 }
9344
9345 /*
9346 ** log the information
9347 */
9348
9349 if (DEBUG_FLAGSncr_debug & (DEBUG_TINY(0x0080)|DEBUG_PHASE(0x0002)))
9350 printk ("P%x%x RL=%d D=%d ", cmd&7, INB(nc_sbcl)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->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_FLAGSncr_debug & DEBUG_PHASE(0x0002)) {
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])(vdsp[1]);
9395
9396 if (cmd & 0x10) { /* Table indirect */
9397 tblp = (u_int32 *) ((char*) &cp->phys + oadr);
9398 olen = scr_to_cpu(tblp[0])(tblp[0]);
9399 oadr = scr_to_cpu(tblp[1])(tblp[1]);
9400 } else {
9401 tblp = (u_int32 *) 0;
9402 olen = scr_to_cpu(vdsp[0])(vdsp[0]) & 0xffffff;
9403 };
9404
9405 if (DEBUG_FLAGSncr_debug & DEBUG_PHASE(0x0002)) {
9406 printk ("OCMD=%x\nTBLP=%p OLEN=%x OADR=%x\n",
9407 (unsigned) (scr_to_cpu(vdsp[0])(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])(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])(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)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->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)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_scr3)))))
;
9450 hflags = hflags0;
9451
9452 if (hflags & (HF_IN_PM01u | HF_IN_PM1(1u<<1) | HF_DP_SAVED(1u<<3))) {
9453 if (hflags & HF_IN_PM01u)
9454 nxtdsp = scr_to_cpu(cp->phys.pm0.ret)(cp->phys.pm0.ret);
9455 else if (hflags & HF_IN_PM1(1u<<1))
9456 nxtdsp = scr_to_cpu(cp->phys.pm1.ret)(cp->phys.pm1.ret);
9457
9458 if (hflags & HF_DP_SAVED(1u<<3))
9459 hflags ^= HF_ACT_PM(1u<<2);
9460 }
9461
9462 if (!(hflags & HF_ACT_PM(1u<<2))) {
9463 pm = &cp->phys.pm0;
9464 newcmd = NCB_SCRIPT_PHYS(np, pm0_data)(np->p_script + ((size_t) (&((struct script *)0)->pm0_data
)))
;
9465 }
9466 else {
9467 pm = &cp->phys.pm1;
9468 newcmd = NCB_SCRIPT_PHYS(np, pm1_data)(np->p_script + ((size_t) (&((struct script *)0)->pm1_data
)))
;
9469 }
9470
9471 hflags &= ~(HF_IN_PM01u | HF_IN_PM1(1u<<1) | HF_DP_SAVED(1u<<3));
9472 if (hflags != hflags0)
9473 OUTB (HF_PRT, hflags)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_scr3))))) = (((hflags)))
)
;
9474
9475 /*
9476 ** fillin the phase mismatch context
9477 */
9478
9479 pm->sg.addr = cpu_to_scr(oadr + olen - rest)(oadr + olen - rest);
9480 pm->sg.size = cpu_to_scr(rest)(rest);
9481 pm->ret = cpu_to_scr(nxtdsp)(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)(np->p_script + ((size_t) (&((struct script *)0)->dispatch
)))
;
9490 if ( ((cmd & 7) == 1 || (cmd & 7) == 5)
9491 && cp && (cp->phys.select.sel_scntl3 & EWS0x08) &&
9492 (INB (nc_scntl2)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_scntl2)))))
& WSR0x01)) {
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)(pm->sg.addr);
9507 cp->phys.wresid.addr = cpu_to_scr(tmp)(tmp);
9508 pm->sg.addr = cpu_to_scr(tmp + 1)(tmp + 1);
9509 tmp = scr_to_cpu(pm->sg.size)(pm->sg.size);
9510 cp->phys.wresid.size = cpu_to_scr((tmp&0xff000000) | 1)((tmp&0xff000000) | 1);
9511 pm->sg.size = cpu_to_scr(tmp - 1)(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)(np->p_scripth + ((size_t) (&((struct scripth *)0)->
wsr_ma_helper)))
;
9525 }
9526
9527 if (DEBUG_FLAGSncr_debug & DEBUG_PHASE(0x0002)) {
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)(pm->sg.addr),
9532 (unsigned)scr_to_cpu(pm->sg.size)(pm->sg.size),
9533 (unsigned)scr_to_cpu(pm->ret)(pm->ret));
9534 }
9535
9536 /*
9537 ** Restart the SCRIPTS processor.
9538 */
9539
9540 OUTL (nc_temp, newcmd)((*(volatile unsigned int *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_temp))))) = (((newcmd))))
;
9541 OUTL_DSP (nxtdsp)do { do { ; } while(0); ((*(volatile unsigned int *) ((char *
)np->reg + (((size_t) (&((struct ncr_reg *)0)->nc_dsp
))))) = ((((nxtdsp))))); } while (0)
;
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 */
9571unexpected_phase:
9572 dsp -= 8;
9573 nxtdsp = 0;
9574
9575 switch (cmd & 7) {
9576 case 2: /* COMMAND phase */
9577 nxtdsp = NCB_SCRIPT_PHYS (np, dispatch)(np->p_script + ((size_t) (&((struct script *)0)->dispatch
)))
;
9578 break;
9579#if 0
9580 case 3: /* STATUS phase */
9581 nxtdsp = NCB_SCRIPT_PHYS (np, dispatch)(np->p_script + ((size_t) (&((struct script *)0)->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)(np->p_script + ((size_t) (&((struct script *)0)->send_ident
)))
) {
9592 if (cp->tag != NO_TAG(256) && olen - rest <= 3) {
9593 cp->host_statusphys.header.status[1] = HS_BUSY(1);
9594 np->msgout[0] = M_IDENTIFY(0x80) | cp->lun;
9595 nxtdsp = NCB_SCRIPTH_PHYS (np, ident_break_atn)(np->p_scripth + ((size_t) (&((struct scripth *)0)->
ident_break_atn)))
;
9596 }
9597 else
9598 nxtdsp = NCB_SCRIPTH_PHYS (np, ident_break)(np->p_scripth + ((size_t) (&((struct scripth *)0)->
ident_break)))
;
9599 }
9600 else if (dsp == NCB_SCRIPTH_PHYS (np, send_wdtr)(np->p_scripth + ((size_t) (&((struct scripth *)0)->
send_wdtr)))
||
9601 dsp == NCB_SCRIPTH_PHYS (np, send_sdtr)(np->p_scripth + ((size_t) (&((struct scripth *)0)->
send_sdtr)))
||
9602 dsp == NCB_SCRIPTH_PHYS (np, send_ppr)(np->p_scripth + ((size_t) (&((struct scripth *)0)->
send_ppr)))
) {
9603 nxtdsp = NCB_SCRIPTH_PHYS (np, nego_bad_phase)(np->p_scripth + ((size_t) (&((struct scripth *)0)->
nego_bad_phase)))
;
9604 }
9605 break;
9606#if 0
9607 case 7: /* MSG IN phase */
9608 nxtdsp = NCB_SCRIPT_PHYS (np, clrack)(np->p_script + ((size_t) (&((struct script *)0)->clrack
)))
;
9609 break;
9610#endif
9611 }
9612
9613 if (nxtdsp) {
9614 OUTL_DSP (nxtdsp)do { do { ; } while(0); ((*(volatile unsigned int *) ((char *
)np->reg + (((size_t) (&((struct ncr_reg *)0)->nc_dsp
))))) = ((((nxtdsp))))); } while (0)
;
9615 return;
9616 }
9617
9618reset_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
9653static 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)(!cp->lun) ? (tp)->l0p : (tp)->lmp ? (tp)->lmp[(cp
->lun)] : 0
;
9658 ccb_p cp2;
9659 int busyccbs = 1;
9660 u_int32 startp;
9661 u_charunsigned char s_status = INB (SS_PRT)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_scr2)))))
;
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)(*(volatile unsigned int *) ((char *)np->reg + (((size_t) (
&((struct ncr_reg *)0)->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])(np->squeue[i]));
9681 assert(cp2){ if (!(cp2)) { (void)panic( "assertion \"%s\" failed: file \"%s\", line %d\n"
, "cp2", "../linux/src/drivers/scsi/sym53c8xx.c", 9681); } }
;
9682#ifdef SCSI_NCR_IARB_SUPPORT
9683 /* IARB hints may not be relevant any more. Forget them. */
9684 cp2->host_flagsphys.header.status[3] &= ~HF_HINT_IARB;
9685#endif
9686 if (cp2 && cp2->target == cp->target && cp2->lun == cp->lun) {
9687 xpt_remque(&cp2->link_ccbq)__xpt_que_del((&cp2->link_ccbq)->blink, (&cp2->
link_ccbq)->flink)
;
9688 xpt_insque_head(&cp2->link_ccbq, &lp->wait_ccbq)__xpt_que_add(&cp2->link_ccbq, &lp->wait_ccbq, (
&lp->wait_ccbq)->flink)
;
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((8*(8) + 2*(16)) + 4)*2) j = 0;
9696 }
9697 if ((i += 2) >= MAX_START((8*(8) + 2*(16)) + 4)*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)__xpt_que_del((&cp->link_ccbq)->blink, (&cp->
link_ccbq)->flink)
;
9708 xpt_insque_head(&cp->link_ccbq, &lp->wait_ccbq)__xpt_que_add(&cp->link_ccbq, &lp->wait_ccbq, (
&lp->wait_ccbq)->flink)
;
9709 --lp->queuedccbs;
9710 cp->queued = 0;
9711
9712next:
9713
9714#ifdef SCSI_NCR_IARB_SUPPORT
9715 /* IARB hint may not be relevant any more. Forget it. */
9716 cp->host_flagsphys.header.status[3] &= ~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))do { do { ; } while(0); ((*(volatile unsigned int *) ((char *
)np->reg + (((size_t) (&((struct ncr_reg *)0)->nc_dsp
))))) = (((((np->p_script + ((size_t) (&((struct script
*)0)->start)))))))); } while (0)
;
9725
9726 switch(s_status) {
9727 default:
9728 case S_BUSY(0x08):
9729 ncr_complete(np, cp);
9730 break;
9731 case S_QUEUE_FULL(0x28):
9732 if (!lp || !lp->queuedccbs) {
9733 ncr_complete(np, cp);
9734 break;
9735 }
9736 if (bootverbose(np->verbose) >= 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_statusphys.header.status[1] = HS_BUSY(1);
9756 cp->scsi_statusphys.header.status[2] = S_ILLEGAL(0xff);
9757 cp->xerr_status = 0;
9758 cp->extra_bytes = 0;
9759 cp->host_flagsphys.header.status[3] &= (HF_PM_TO_C(1u<<6)|HF_DATA_IN(1u<<5));
9760
9761 break;
9762
9763 case S_TERMINATED(0x20):
9764 case S_CHECK_COND(0x02):
9765 /*
9766 ** If we were requesting sense, give up.
9767 */
9768 if (cp->host_flagsphys.header.status[3] & HF_AUTO_SENSE(1u<<4)) {
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_statusphys.header.status[2];
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(0x80) | 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_FLAGSncr_debug & DEBUG_IC(0x0800)) {
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_charunsigned char sync_offset;
9833 if ((np->device_id == PCI_DEVICE_ID_LSI_53C10100x20) ||
9834 (np->device_id == PCI_DEVICE_ID_LSI_53C1010_660x21))
9835 sync_offset = tp->sval & 0x3f;
9836 else
9837 sync_offset = tp->sval & 0x1f;
9838
9839 if ((tp->wval & EWS0x08) || 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 & EWS0x08) || (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))((cp->p_ccb + ((size_t) (&((struct ccb *)0)->scsi_smsg2
))))
;
9857 cp->phys.smsg.size = cpu_to_scr(msglen)(msglen);
9858
9859 /*
9860 ** sense command
9861 */
9862 cp->phys.cmd.addr = cpu_to_scr(CCB_PHYS (cp, sensecmd))((cp->p_ccb + ((size_t) (&((struct ccb *)0)->sensecmd
))))
;
9863 cp->phys.cmd.size = cpu_to_scr(6)(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))(__builtin_constant_p(0) ? (__builtin_constant_p(((sizeof(cp->
sense_buf)))) ? __constant_c_and_count_memset((((cp->sense_buf
))),((0x01010101UL*(unsigned char)(0))),(((sizeof(cp->sense_buf
))))) : __constant_c_memset((((cp->sense_buf))),((0x01010101UL
*(unsigned char)(0))),(((sizeof(cp->sense_buf)))))) : (__builtin_constant_p
(((sizeof(cp->sense_buf)))) ? __memset_generic(((((cp->
sense_buf)))),(((0))),((((sizeof(cp->sense_buf)))))) : __memset_generic
((((cp->sense_buf))),((0)),(((sizeof(cp->sense_buf)))))
))
;
9876 cp->phys.sense.addr = cpu_to_scr(CCB_PHYS(cp,sense_buf[0]))((cp->p_ccb + ((size_t) (&((struct ccb *)0)->sense_buf
[0]))))
;
9877 cp->phys.sense.size = cpu_to_scr(sizeof(cp->sense_buf))(sizeof(cp->sense_buf));
9878
9879 /*
9880 ** requeue the command.
9881 */
9882 startp = NCB_SCRIPTH_PHYS (np, sdata_in)(np->p_scripth + ((size_t) (&((struct scripth *)0)->
sdata_in)))
;
9883
9884 cp->phys.header.savep = cpu_to_scr(startp)(startp);
9885 cp->phys.header.goalp = cpu_to_scr(startp + 16)(startp + 16);
9886 cp->phys.header.lastp = cpu_to_scr(startp)(startp);
9887 cp->phys.header.wgoalp = cpu_to_scr(startp + 16)(startp + 16);
9888 cp->phys.header.wlastp = cpu_to_scr(startp)(startp);
9889
9890 cp->host_statusphys.header.status[1] = cp->nego_status ? HS_NEGOTIATE(2) : HS_BUSY(1);
9891 cp->scsi_statusphys.header.status[2] = S_ILLEGAL(0xff);
9892 cp->host_flagsphys.header.status[3] = (HF_AUTO_SENSE(1u<<4)|HF_DATA_IN(1u<<5));
9893
9894 cp->phys.header.go.start =
9895 cpu_to_scr(NCB_SCRIPT_PHYS (np, select))((np->p_script + ((size_t) (&((struct script *)0)->
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*/
9929static int ncr_clear_tasks(ncb_p np, u_charunsigned 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_statusphys.header.status[1] != HS_DISCONNECT(3))
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(256) && cp->scsi_smsg[2] != task)
9943 continue;
9944 cp->host_statusphys.header.status[1] = hsts;
9945 cp->scsi_statusphys.header.status[2] = S_ILLEGAL(0xff);
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*/
9997static 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_charunsigned 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(7):
10012
10013 /*
10014 ** Do we have any target to reset or unit to clear ?
10015 */
10016 for (i = 0 ; i < MAX_TARGET((16)) ; 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_LUN64 ; 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_statusphys.header.status[1] != HS_DISCONNECT(3))
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)((*(volatile unsigned int *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_dsa))))) = (((np->p_ncb
))))
;
10060 OUTL_DSP (NCB_SCRIPTH_PHYS (np, sel_for_abort))do { do { ; } while(0); ((*(volatile unsigned int *) ((char *
)np->reg + (((size_t) (&((struct ncr_reg *)0)->nc_dsp
))))) = (((((np->p_scripth + ((size_t) (&((struct scripth
*)0)->sel_for_abort)))))))); } while (0)
;
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)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_istat))))) = (((0x20))))
;
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_statusphys.header.status[1] != HS_BUSY(1) &&
10081 cp->host_statusphys.header.status[1] != HS_NEGOTIATE(2))
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)(*(volatile unsigned int *) ((char *)np->reg + (((size_t) (
&((struct ncr_reg *)0)->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])(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((8*(8) + 2*(16)) + 4)*2)
10122 k = 0;
10123 }
10124
10125 i += 2;
10126 if (i >= MAX_START((8*(8) + 2*(16)) + 4)*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_statusphys.header.status[1] = HS_ABORTED(7|(0x80));
10134 cp->scsi_statusphys.header.status[2] = S_ILLEGAL(0xff);
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(14):
10143 target = (INB (nc_sdid)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_sdid)))))
& 0xf);
10144 tp = &np->target[target];
10145
10146 np->abrt_tbl.addr = vtobus(np->abrt_msg)virt_to_phys(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(0x0c);
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_LUN64 ; 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)(!lun) ? (tp)->l0p : (tp)->lmp ? (tp)->lmp[(lun)] : 0;
10180 lp->to_clear = 0; /* We donnot expect to fail here */
10181 np->abrt_msg[0] = M_IDENTIFY(0x80) | lun;
10182 np->abrt_msg[1] = M_ABORT(0x06);
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_statusphys.header.status[1] != HS_DISCONNECT(3))
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(0x06);
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(0x80) | 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(256)) {
10226 np->abrt_msg[1] = M_ABORT(0x06);
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(0x0d);
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(17):
10243 target = (INB (nc_sdid)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->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(0x06))
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(0x0c)) {
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(0x0d))
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(7|(0x80)), 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(20):
10300 cp = ncr_ccb_from_dsa(np, INL (nc_dsa)(*(volatile unsigned int *) ((char *)np->reg + (((size_t) (
&((struct ncr_reg *)0)->nc_dsa)))))
);
10301 if (!cp)
10302 break;
10303 memcpy(cp->cmd->sense_buffer, cp->sense_buf,(__builtin_constant_p(sizeof(cp->cmd->sense_buffer)) ? __constant_memcpy
((cp->cmd->sense_buffer),(cp->sense_buf),(sizeof(cp->
cmd->sense_buffer))) : __memcpy((cp->cmd->sense_buffer
),(cp->sense_buf),(sizeof(cp->cmd->sense_buffer))))
10304 sizeof(cp->cmd->sense_buffer))(__builtin_constant_p(sizeof(cp->cmd->sense_buffer)) ? __constant_memcpy
((cp->cmd->sense_buffer),(cp->sense_buf),(sizeof(cp->
cmd->sense_buffer))) : __memcpy((cp->cmd->sense_buffer
),(cp->sense_buf),(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(6|(0x80)), 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(14)) {
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)(np->abrt_tbl.size);
10323 }
10324
10325 /*
10326 ** Let the SCRIPTS processor continue.
10327 */
10328 OUTONB_STD ()do { do { ; } while(0); ((*(volatile unsigned char *) ((char *
)np->reg + (((size_t) (&((struct ncr_reg *)0)->nc_dcntl
))))) = ((((*(volatile unsigned char *) ((char *)np->reg +
(((size_t) (&((struct ncr_reg *)0)->nc_dcntl))))) | (
(0x04|0x01)))))); } while (0)
;
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
10364static 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)(np->p_script + ((size_t) (&((struct script *)0)->pm0_data
)))
)
10378 pm = &cp->phys.pm0;
10379 else if (dp_scr == NCB_SCRIPT_PHYS (np, pm1_data)(np->p_script + ((size_t) (&((struct script *)0)->pm1_data
)))
)
10380 pm = &cp->phys.pm1;
10381 else
10382 pm = 0;
10383
10384 if (pm) {
10385 dp_scr = scr_to_cpu(pm->ret)(pm->ret);
10386 dp_ofs -= scr_to_cpu(pm->sg.size)(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)(cp->phys.header.goalp);
10396 dp_sg = MAX_SCATTER((127));
10397 if (dp_scr != tmp)
10398 dp_sg -= (tmp - 8 - (int)dp_scr) / (SCR_SG_SIZE(2)*4);
10399 dp_sgmin = MAX_SCATTER((127)) - 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)(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((127))) {
10428 tmp = scr_to_cpu(cp->phys.data[dp_sg].size)(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((127)) || (dp_sg == MAX_SCATTER((127)) && 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
10460out_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
10478static 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)(*(volatile unsigned int *) ((char *)np->reg + (((size_t) (
&((struct ncr_reg *)0)->nc_temp)))))
;
10482 u_int32 dp_ret;
10483 u_int32 tmp;
10484 u_charunsigned char hflags;
10485 int dp_sg;
10486 struct pm_ctx *pm;
10487
10488 /*
10489 ** Not supported for auto_sense;
10490 */
10491 if (cp->host_flagsphys.header.status[3] & HF_AUTO_SENSE(1u<<4))
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)(cp->phys.header.goalp);
10507 dp_ret = dp_ret - 8 - (MAX_SCATTER((127)) - dp_sg) * (SCR_SG_SIZE(2)*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)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_scr3)))))
;
10522
10523 if (hflags & HF_DP_SAVED(1u<<3))
10524 hflags ^= HF_ACT_PM(1u<<2);
10525
10526 if (!(hflags & HF_ACT_PM(1u<<2))) {
10527 pm = &cp->phys.pm0;
10528 dp_scr = NCB_SCRIPT_PHYS (np, pm0_data)(np->p_script + ((size_t) (&((struct script *)0)->pm0_data
)))
;
10529 }
10530 else {
10531 pm = &cp->phys.pm1;
10532 dp_scr = NCB_SCRIPT_PHYS (np, pm1_data)(np->p_script + ((size_t) (&((struct script *)0)->pm1_data
)))
;
10533 }
10534
10535 hflags &= ~(HF_DP_SAVED(1u<<3));
10536
10537 OUTB (HF_PRT, hflags)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_scr3))))) = (((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)(dp_ret);
10547 tmp = scr_to_cpu(cp->phys.data[dp_sg-1].addr)(cp->phys.data[dp_sg-1].addr);
10548 tmp += scr_to_cpu(cp->phys.data[dp_sg-1].size)(cp->phys.data[dp_sg-1].size) + dp_ofs;
10549 pm->sg.addr = cpu_to_scr(tmp)(tmp);
10550 pm->sg.size = cpu_to_scr(-dp_ofs)(-dp_ofs);
10551
10552out_ok:
10553 OUTL (nc_temp, dp_scr)((*(volatile unsigned int *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_temp))))) = (((dp_scr))))
;
10554 OUTL_DSP (NCB_SCRIPT_PHYS (np, clrack))do { do { ; } while(0); ((*(volatile unsigned int *) ((char *
)np->reg + (((size_t) (&((struct ncr_reg *)0)->nc_dsp
))))) = (((((np->p_script + ((size_t) (&((struct script
*)0)->clrack)))))))); } while (0)
;
10555 return;
10556
10557out_reject:
10558 OUTL_DSP (NCB_SCRIPTH_PHYS (np, msg_bad))do { do { ; } while(0); ((*(volatile unsigned int *) ((char *
)np->reg + (((size_t) (&((struct ncr_reg *)0)->nc_dsp
))))) = (((((np->p_scripth + ((size_t) (&((struct scripth
*)0)->msg_bad)))))))); } while (0)
;
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
10582static 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(1)|XE_SODL_UNRUN(1<<3)|XE_SWIDE_OVRUN(1<<4))) {
10596 if (cp->xerr_status & XE_EXTRA_DATA(1))
10597 resid -= cp->extra_bytes;
10598 if (cp->xerr_status & XE_SODL_UNRUN(1<<3))
10599 ++resid;
10600 if (cp->xerr_status & XE_SWIDE_OVRUN(1<<4))
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)(np->p_scripth + ((size_t) (&((struct scripth *)0)->
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)(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((127)) - cp->segments;
Value stored to 'dp_sgmin' is never read
10635 resid = -cp->ext_ofs;
10636 for (dp_sg = cp->ext_sg; dp_sg < MAX_SCATTER((127)); ++dp_sg) {
10637 tmp = scr_to_cpu(cp->phys.data[dp_sg].size)(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
10654static int ncr_show_msg (u_charunsigned char * msg)
10655{
10656 u_charunsigned char i;
10657 printk ("%x",*msg);
10658 if (*msg==M_EXTENDED(0x01)) {
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
10671static void ncr_print_msg (ccb_p cp, char *label, u_charunsigned 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*/
10738static void ncr_sync_nego(ncb_p np, tcb_p tp, ccb_p cp)
10739{
10740 u_charunsigned char scntl3, scntl4;
10741 u_charunsigned char chg, ofs, per, fak;
10742
10743 /*
10744 ** Synchronous request message received.
10745 */
10746
10747 if (DEBUG_FLAGSncr_debug & DEBUG_NEGO(0x0200)) {
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(0x10);
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_FLAGSncr_debug & DEBUG_NEGO(0x0200)) {
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)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_scr1)))))
== HS_NEGOTIATE(2)) {
10807 OUTB (HS_PRT, HS_BUSY)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_scr1))))) = ((((1)))))
;
10808 switch (cp->nego_status) {
10809 case NS_SYNC(1):
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))do { do { ; } while(0); ((*(volatile unsigned int *) ((char *
)np->reg + (((size_t) (&((struct ncr_reg *)0)->nc_dsp
))))) = (((((np->p_scripth + ((size_t) (&((struct scripth
*)0)->msg_bad)))))))); } while (0)
;
10819 } else {
10820 /*
10821 ** Answer is ok.
10822 */
10823 if ((np->device_id != PCI_DEVICE_ID_LSI_53C10100x20) &&
10824 (np->device_id != PCI_DEVICE_ID_LSI_53C1010_660x21))
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))do { do { ; } while(0); ((*(volatile unsigned int *) ((char *
)np->reg + (((size_t) (&((struct ncr_reg *)0)->nc_dsp
))))) = (((((np->p_script + ((size_t) (&((struct script
*)0)->clrack)))))))); } while (0)
;
10830 };
10831 return;
10832
10833 case NS_WIDE(2):
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_53C10100x20) &&
10845 (np->device_id != PCI_DEVICE_ID_LSI_53C1010_660x21))
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(0x01);
10851 np->msgout[1] = 3;
10852 np->msgout[2] = M_X_SYNC_REQ(0x01);
10853 np->msgout[3] = per;
10854 np->msgout[4] = ofs;
10855
10856 cp->nego_status = NS_SYNC(1);
10857
10858 if (DEBUG_FLAGSncr_debug & DEBUG_NEGO(0x0200)) {
10859 ncr_print_msg(cp, "sync msgout", np->msgout);
10860 }
10861
10862 np->msgin [0] = M_NOOP(0x08);
10863
10864 if (!ofs)
10865 OUTL_DSP (NCB_SCRIPTH_PHYS (np, msg_bad))do { do { ; } while(0); ((*(volatile unsigned int *) ((char *
)np->reg + (((size_t) (&((struct ncr_reg *)0)->nc_dsp
))))) = (((((np->p_scripth + ((size_t) (&((struct scripth
*)0)->msg_bad)))))))); } while (0)
;
10866 else
10867 OUTL_DSP (NCB_SCRIPTH_PHYS (np, sdtr_resp))do { do { ; } while(0); ((*(volatile unsigned int *) ((char *
)np->reg + (((size_t) (&((struct ncr_reg *)0)->nc_dsp
))))) = (((((np->p_scripth + ((size_t) (&((struct scripth
*)0)->sdtr_resp)))))))); } while (0)
;
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*/
10881static void ncr_wide_nego(ncb_p np, tcb_p tp, ccb_p cp)
10882{
10883 u_charunsigned char chg, wide;
10884
10885 /*
10886 ** Wide request message received.
10887 */
10888 if (DEBUG_FLAGSncr_debug & DEBUG_NEGO(0x0200)) {
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(0x20);
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_FLAGSncr_debug & DEBUG_NEGO(0x0200)) {
10915 PRINT_ADDR(cp->cmd);
10916 printk ("wide: wide=%d chg=%d.\n", wide, chg);
10917 }
10918
10919 if (INB (HS_PRT)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_scr1)))))
== HS_NEGOTIATE(2)) {
10920 OUTB (HS_PRT, HS_BUSY)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_scr1))))) = ((((1)))))
;
10921 switch (cp->nego_status) {
10922 case NS_WIDE(2):
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))do { do { ; } while(0); ((*(volatile unsigned int *) ((char *
)np->reg + (((size_t) (&((struct ncr_reg *)0)->nc_dsp
))))) = (((((np->p_scripth + ((size_t) (&((struct scripth
*)0)->msg_bad)))))))); } while (0)
;
10932 } else {
10933 /*
10934 ** Answer is ok.
10935 */
10936 ncr_setwide (np, cp, wide, 1);
10937 OUTL_DSP (NCB_SCRIPT_PHYS (np, clrack))do { do { ; } while(0); ((*(volatile unsigned int *) ((char *
)np->reg + (((size_t) (&((struct ncr_reg *)0)->nc_dsp
))))) = (((((np->p_script + ((size_t) (&((struct script
*)0)->clrack)))))))); } while (0)
;
10938 };
10939 return;
10940
10941 case NS_SYNC(1):
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(0x01);
10955 np->msgout[1] = 2;
10956 np->msgout[2] = M_X_WIDE_REQ(0x03);
10957 np->msgout[3] = wide;
10958
10959 np->msgin [0] = M_NOOP(0x08);
10960
10961 cp->nego_status = NS_WIDE(2);
10962
10963 if (DEBUG_FLAGSncr_debug & DEBUG_NEGO(0x0200)) {
10964 ncr_print_msg(cp, "wide msgout", np->msgout);
10965 }
10966
10967 OUTL_DSP (NCB_SCRIPTH_PHYS (np, wdtr_resp))do { do { ; } while(0); ((*(volatile unsigned int *) ((char *
)np->reg + (((size_t) (&((struct ncr_reg *)0)->nc_dsp
))))) = (((((np->p_scripth + ((size_t) (&((struct scripth
*)0)->wdtr_resp)))))))); } while (0)
;
10968}
10969/*==========================================================
10970**
10971** ncr chip handler for PARALLEL PROTOCOL REQUEST
10972** (PPR) message.
10973**
10974**==========================================================
10975**
10976** Read comments above.
10977**
10978**----------------------------------------------------------
10979*/
10980static void ncr_ppr_nego(ncb_p np, tcb_p tp, ccb_p cp)
10981{
10982 u_charunsigned char scntl3, scntl4;
10983 u_charunsigned char chg, ofs, per, fak, wth, dt;
10984
10985 /*
10986 ** PPR message received.
10987 */
10988
10989 if (DEBUG_FLAGSncr_debug & DEBUG_NEGO(0x0200)) {
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(0x10);
11011
11012 if (wth)
11013 tp->inq_byte7 |= INQ7_WIDE16(0x20);
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_FLAGSncr_debug & DEBUG_NEGO(0x0200)) {
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)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_scr1)))))
== HS_NEGOTIATE(2)) {
11072 OUTB (HS_PRT, HS_BUSY)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_scr1))))) = ((((1)))))
;
11073 switch (cp->nego_status) {
11074 case NS_PPR(4):
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))do { do { ; } while(0); ((*(volatile unsigned int *) ((char *
)np->reg + (((size_t) (&((struct ncr_reg *)0)->nc_dsp
))))) = (((((np->p_scripth + ((size_t) (&((struct scripth
*)0)->msg_bad)))))))); } while (0)
;
11092 } else {
11093 /*
11094 ** Answer is ok.
11095 */
11096
11097 if ((np->device_id != PCI_DEVICE_ID_LSI_53C10100x20) &&
11098 (np->device_id != PCI_DEVICE_ID_LSI_53C1010_660x21))
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))do { do { ; } while(0); ((*(volatile unsigned int *) ((char *
)np->reg + (((size_t) (&((struct ncr_reg *)0)->nc_dsp
))))) = (((((np->p_script + ((size_t) (&((struct script
*)0)->clrack)))))))); } while (0)
;
11104
11105 };
11106 return;
11107
11108 case NS_SYNC(1):
11109 ncr_setsync (np, cp, 0, 0xe0, 0);
11110 break;
11111
11112 case NS_WIDE(2):
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_53C10100x20) &&
11139 (np->device_id != PCI_DEVICE_ID_LSI_53C1010_660x21))
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(0x01);
11145 np->msgout[1] = 6;
11146 np->msgout[2] = M_X_PPR_REQ(0x04);
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(4);
11154
11155 if (DEBUG_FLAGSncr_debug & DEBUG_NEGO(0x0200)) {
11156 ncr_print_msg(cp, "ppr msgout", np->msgout);
11157 }
11158
11159 np->msgin [0] = M_NOOP(0x08);
11160
11161 if (!ofs)
11162 OUTL_DSP (NCB_SCRIPTH_PHYS (np, msg_bad))do { do { ; } while(0); ((*(volatile unsigned int *) ((char *
)np->reg + (((size_t) (&((struct ncr_reg *)0)->nc_dsp
))))) = (((((np->p_scripth + ((size_t) (&((struct scripth
*)0)->msg_bad)))))))); } while (0)
;
11163 else
11164 OUTL_DSP (NCB_SCRIPTH_PHYS (np, ppr_resp))do { do { ; } while(0); ((*(volatile unsigned int *) ((char *
)np->reg + (((size_t) (&((struct ncr_reg *)0)->nc_dsp
))))) = (((((np->p_scripth + ((size_t) (&((struct scripth
*)0)->ppr_resp)))))))); } while (0)
;
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*/
11174static 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(1):
11183 ncr_setsync (np, cp, 0, 0xe0, 0);
11184 break;
11185
11186 case NS_WIDE(2):
11187 ncr_setwide (np, cp, 0, 0);
11188 break;
11189
11190 case NS_PPR(4):
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_FLAGSncr_debug & DEBUG_NEGO(0x0200)) {
11197 tcb_p tp=&np->target[cp->target];
11198 u_charunsigned 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(0x08);
11224 np->msgout[0] = M_NOOP(0x08);
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*/
11242static 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)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_scr1))))) = ((((1)))))
;
11246}
11247
11248
11249/*==========================================================
11250**
11251**
11252** ncr chip exception handler for programmed interrupts.
11253**
11254**
11255**==========================================================
11256*/
11257
11258void ncr_int_sir (ncb_p np)
11259{
11260 u_charunsigned char num = INB (nc_dsps)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_dsps)))))
;
11261 u_longunsigned long dsa = INL (nc_dsa)(*(volatile unsigned int *) ((char *)np->reg + (((size_t) (
&((struct ncr_reg *)0)->nc_dsa)))))
;
11262 ccb_p cp = ncr_ccb_from_dsa(np, dsa);
11263 u_charunsigned char target = INB (nc_sdid)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_sdid)))))
& 0x0f;
11264 tcb_p tp = &np->target[target];
11265 int tmp;
11266
11267 if (DEBUG_FLAGSncr_debug & DEBUG_TINY(0x0080)) 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(21):
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(7):
11283 case SIR_TARGET_SELECTED(14):
11284 case SIR_ABORT_SENT(17):
11285 case SIR_AUTO_SENSE_DONE(20):
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(2):
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(11):
11302 /*
11303 ** After reselection, the device sent a message that wasn't
11304 ** an IDENTIFY.
11305 */
11306 case SIR_RESEL_NO_IDENTIFY(12):
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]))((*(volatile unsigned int *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_dsa))))) = ((((tp->l0p
->tasktbl[0])))))
;
11314 OUTL_DSP (NCB_SCRIPT_PHYS (np, resel_go))do { do { ; } while(0); ((*(volatile unsigned int *) ((char *
)np->reg + (((size_t) (&((struct ncr_reg *)0)->nc_dsp
))))) = (((((np->p_script + ((size_t) (&((struct script
*)0)->resel_go)))))))); } while (0)
;
11315 return;
11316 }
11317 /*
11318 ** The device reselected a LUN we donnot know of.
11319 */
11320 case SIR_RESEL_BAD_LUN(13):
11321 np->msgout[0] = M_RESET(0x0c);
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(15):
11328 np->msgout[0] = M_ABORT(0x06);
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(16):
11335 np->msgout[0] = M_ABORT_TAG(0x0d);
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(18):
11342 np->lastmsg = np->msgout[0];
11343 np->msgout[0] = M_NOOP(0x08);
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(19):
11352 np->lastmsg = np->msgout[0];
11353 np->msgout[0] = M_NOOP(0x08);
11354 /* Should we really care of that */
11355 if (np->lastmsg == M_PARITY(0x09) || np->lastmsg == M_ID_ERROR(0x05)) {
11356 if (cp) {
11357 cp->xerr_status &= ~XE_PARITY_ERR(4);
11358 if (!cp->xerr_status)
11359 OUTOFFB (HF_PRT, HF_EXT_ERR)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_scr3))))) = ((((*(volatile
unsigned char *) ((char *)np->reg + (((size_t) (&((struct
ncr_reg *)0)->nc_scr3))))) & ~((1u<<7))))))
;
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(1):
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(8):
11378 ncr_print_msg(cp, "M_REJECT to send for ", np->msgin);
11379 np->msgout[0] = M_REJECT(0x07);
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(9):
11388 if (cp) {
11389 OUTONB (HF_PRT, HF_EXT_ERR)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_scr3))))) = ((((*(volatile
unsigned char *) ((char *)np->reg + (((size_t) (&((struct
ncr_reg *)0)->nc_scr3))))) | ((1u<<7))))))
;
11390 cp->xerr_status |= XE_SWIDE_OVRUN(1<<4);
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(10):
11399 if (cp) {
11400 OUTONB (HF_PRT, HF_EXT_ERR)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_scr3))))) = ((((*(volatile
unsigned char *) ((char *)np->reg + (((size_t) (&((struct
ncr_reg *)0)->nc_scr3))))) | ((1u<<7))))))
;
11401 cp->xerr_status |= XE_SODL_UNRUN(1<<3);
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(22):
11411 if (cp) {
11412 OUTONB (HF_PRT, HF_EXT_ERR)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_scr3))))) = ((((*(volatile
unsigned char *) ((char *)np->reg + (((size_t) (&((struct
ncr_reg *)0)->nc_scr3))))) | ((1u<<7))))))
;
11413 cp->xerr_status |= XE_EXTRA_DATA(1);
11414 cp->extra_bytes += INL (nc_scratcha)(*(volatile unsigned int *) ((char *)np->reg + (((size_t) (
&((struct ncr_reg *)0)->nc_scratcha)))))
;
11415 }
11416 goto out;
11417 /*
11418 ** The device switched to an illegal phase (4/5).
11419 */
11420 case SIR_BAD_PHASE(23):
11421 if (cp) {
11422 OUTONB (HF_PRT, HF_EXT_ERR)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_scr3))))) = ((((*(volatile
unsigned char *) ((char *)np->reg + (((size_t) (&((struct
ncr_reg *)0)->nc_scr3))))) | ((1u<<7))))))
;
11423 cp->xerr_status |= XE_BAD_PHASE(2);
11424 }
11425 goto out;
11426 /*
11427 ** We received a message.
11428 */
11429 case SIR_MSG_RECEIVED(3):
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(0x01):
11439 switch (np->msgin [2]) {
11440 case M_X_MODIFY_DP(0x00):
11441 if (DEBUG_FLAGSncr_debug & DEBUG_POINTER(0x0020))
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(0x01):
11448 ncr_sync_nego(np, tp, cp);
11449 return;
11450 case M_X_WIDE_REQ(0x03):
11451 ncr_wide_nego(np, tp, cp);
11452 return;
11453 case M_X_PPR_REQ(0x04):
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(0x23):
11468 if (DEBUG_FLAGSncr_debug & DEBUG_POINTER(0x0020))
11469 ncr_print_msg(cp,"ign wide residue", np->msgin);
11470 ncr_modify_dp(np, tp, cp, -1);
11471 return;
11472 case M_REJECT(0x07):
11473 if (INB (HS_PRT)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_scr1)))))
== HS_NEGOTIATE(2))
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->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(4):
11491 ncr_print_msg(cp, "WEIRD message received", np->msgin);
11492 OUTL_DSP (NCB_SCRIPTH_PHYS (np, msg_weird))do { do { ; } while(0); ((*(volatile unsigned int *) ((char *
)np->reg + (((size_t) (&((struct ncr_reg *)0)->nc_dsp
))))) = (((((np->p_scripth + ((size_t) (&((struct scripth
*)0)->msg_weird)))))))); } while (0)
;
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(5):
11500 OUTB (HS_PRT, HS_BUSY)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_scr1))))) = ((((1)))))
;
11501 /*
11502 ** Negotiation failed.
11503 ** Target does not want answer message.
11504 */
11505 case SIR_NEGO_PROTO(6):
11506 ncr_nego_default(np, tp, cp);
11507 goto out;
11508 };
11509
11510out:
11511 OUTONB_STD ()do { do { ; } while(0); ((*(volatile unsigned char *) ((char *
)np->reg + (((size_t) (&((struct ncr_reg *)0)->nc_dcntl
))))) = ((((*(volatile unsigned char *) ((char *)np->reg +
(((size_t) (&((struct ncr_reg *)0)->nc_dcntl))))) | (
(0x04|0x01)))))); } while (0)
;
11512 return;
11513out_reject:
11514 OUTL_DSP (NCB_SCRIPTH_PHYS (np, msg_bad))do { do { ; } while(0); ((*(volatile unsigned int *) ((char *
)np->reg + (((size_t) (&((struct ncr_reg *)0)->nc_dsp
))))) = (((((np->p_scripth + ((size_t) (&((struct scripth
*)0)->msg_bad)))))))); } while (0)
;
11515 return;
11516out_clrack:
11517 OUTL_DSP (NCB_SCRIPT_PHYS (np, clrack))do { do { ; } while(0); ((*(volatile unsigned int *) ((char *
)np->reg + (((size_t) (&((struct ncr_reg *)0)->nc_dsp
))))) = (((((np->p_script + ((size_t) (&((struct script
*)0)->clrack)))))))); } while (0)
;
11518 return;
11519out_stuck:
11520 return;
11521}
11522
11523
11524/*==========================================================
11525**
11526**
11527** Aquire a control block
11528**
11529**
11530**==========================================================
11531*/
11532
11533static ccb_p ncr_get_ccb (ncb_p np, u_charunsigned char tn, u_charunsigned char ln)
11534{
11535 tcb_p tp = &np->target[tn];
11536 lcb_p lp = ncr_lp(np, tp, ln)(!ln) ? (tp)->l0p : (tp)->lmp ? (tp)->lmp[(ln)] : 0;
11537 u_shortunsigned short tag = NO_TAG(256);
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)((struct ccb *)((char *)(qp)-(unsigned long)(&((struct ccb
*)0)->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)__xpt_que_add(&cp->link_ccbq, &np->b0_ccbq, (&
np->b0_ccbq)->flink)
;
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(8))
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)__xpt_que_add(&cp->link_ccbq, (&lp->wait_ccbq)->
blink, &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_FLAGSncr_debug & DEBUG_TAGS(0x0400)) {
11607 PRINT_LUN(np, tn, ln);
11608 printk ("ccb @%p using tag %d.\n", cp, tag);
11609 }
11610
11611out:
11612 return cp;
11613out_free:
11614 xpt_insque_head(&cp->link_ccbq, &np->free_ccbq)__xpt_que_add(&cp->link_ccbq, &np->free_ccbq, (
&np->free_ccbq)->flink)
;
11615 return (ccb_p) 0;
11616}
11617
11618/*==========================================================
11619**
11620**
11621** Release one control block
11622**
11623**
11624**==========================================================
11625*/
11626
11627static 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)(!cp->lun) ? (tp)->l0p : (tp)->lmp ? (tp)->lmp[(cp
->lun)] : 0
;
11631
11632 if (DEBUG_FLAGSncr_debug & DEBUG_TAGS(0x0400)) {
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(256)) {
11644 lp->cb_tags[lp->if_tag++] = cp->tag;
11645 if (lp->if_tag == MAX_TAGS(8))
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)(np->p_bad_i_t_l_q);
11649 } else {
11650 lp->tasktbl[0] = cpu_to_scr(np->p_bad_i_t_l)(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)__xpt_que_del((&cp->link_ccbq)->blink, (&cp->
link_ccbq)->flink)
;
11662 xpt_insque_head(&cp->link_ccbq, &np->free_ccbq)__xpt_que_add(&cp->link_ccbq, &np->free_ccbq, (
&np->free_ccbq)->flink)
;
11663 cp -> host_statusphys.header.status[1] = HS_IDLE(0);
11664 cp -> queued = 0;
11665}
11666
11667/*------------------------------------------------------------------------
11668** Allocate a CCB and initialize its fixed part.
11669**------------------------------------------------------------------------
11670**------------------------------------------------------------------------
11671*/
11672static 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")m_calloc(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)virt_to_phys(cp);
11693
11694 /*
11695 ** Insert this ccb into the hashed list.
11696 */
11697 hcode = CCB_HASH_CODE(cp->p_ccb)(((cp->p_ccb) >> 11) & ((1UL << 8)-1));
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))((np->p_script + ((size_t) (&((struct script *)0)->
idle))))
;
11705 cp->phys.header.go.restart = cpu_to_scr(NCB_SCRIPTH_PHYS(np,bad_i_t_l))((np->p_scripth + ((size_t) (&((struct scripth *)0)->
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]))((np->p_ncb + ((size_t) (&((struct ncb *)0)->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)__xpt_que_add(&cp->link_ccbq, &np->free_ccbq, (
&np->free_ccbq)->flink)
;
11719
11720 return cp;
11721}
11722
11723/*------------------------------------------------------------------------
11724** Look up a CCB from a DSA value.
11725**------------------------------------------------------------------------
11726**------------------------------------------------------------------------
11727*/
11728static ccb_p ncr_ccb_from_dsa(ncb_p np, u_longunsigned long dsa)
11729{
11730 int hcode;
11731 ccb_p cp;
11732
11733 hcode = CCB_HASH_CODE(dsa)(((dsa) >> 11) & ((1UL << 8)-1));
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*/
11761static void ncr_init_tcb (ncb_p np, u_charunsigned char tn)
11762{
11763 /*
11764 ** Check some alignments required by the chip.
11765 */
11766 assert (( (offsetof(struct ncr_reg, nc_sxfer) ^{ if (!(( (((size_t) (&((struct ncr_reg *)0)->nc_sxfer
)) ^ ((size_t) (&((struct tcb *)0)->sval))) &3) ==
0)) { (void)panic( "assertion \"%s\" failed: file \"%s\", line %d\n"
, "( (offsetof(struct ncr_reg, nc_sxfer) ^ offsetof(struct tcb , sval )) &3) == 0"
, "../linux/src/drivers/scsi/sym53c8xx.c", 11767); } }
11767 offsetof(struct tcb , sval )) &3) == 0){ if (!(( (((size_t) (&((struct ncr_reg *)0)->nc_sxfer
)) ^ ((size_t) (&((struct tcb *)0)->sval))) &3) ==
0)) { (void)panic( "assertion \"%s\" failed: file \"%s\", line %d\n"
, "( (offsetof(struct ncr_reg, nc_sxfer) ^ offsetof(struct tcb , sval )) &3) == 0"
, "../linux/src/drivers/scsi/sym53c8xx.c", 11767); } }
;
11768 assert (( (offsetof(struct ncr_reg, nc_scntl3) ^{ if (!(( (((size_t) (&((struct ncr_reg *)0)->nc_scntl3
)) ^ ((size_t) (&((struct tcb *)0)->wval))) &3) ==
0)) { (void)panic( "assertion \"%s\" failed: file \"%s\", line %d\n"
, "( (offsetof(struct ncr_reg, nc_scntl3) ^ offsetof(struct tcb , wval )) &3) == 0"
, "../linux/src/drivers/scsi/sym53c8xx.c", 11769); } }
11769 offsetof(struct tcb , wval )) &3) == 0){ if (!(( (((size_t) (&((struct ncr_reg *)0)->nc_scntl3
)) ^ ((size_t) (&((struct tcb *)0)->wval))) &3) ==
0)) { (void)panic( "assertion \"%s\" failed: file \"%s\", line %d\n"
, "( (offsetof(struct ncr_reg, nc_scntl3) ^ offsetof(struct tcb , wval )) &3) == 0"
, "../linux/src/drivers/scsi/sym53c8xx.c", 11769); } }
;
11770 if ((np->device_id == PCI_DEVICE_ID_LSI_53C10100x20) ||
11771 (np->device_id == PCI_DEVICE_ID_LSI_53C1010_660x21)){
11772 assert (( (offsetof(struct ncr_reg, nc_scntl4) ^{ if (!(( (((size_t) (&((struct ncr_reg *)0)->nc_scntl4
)) ^ ((size_t) (&((struct tcb *)0)->uval))) &3) ==
0)) { (void)panic( "assertion \"%s\" failed: file \"%s\", line %d\n"
, "( (offsetof(struct ncr_reg, nc_scntl4) ^ offsetof(struct tcb , uval )) &3) == 0"
, "../linux/src/drivers/scsi/sym53c8xx.c", 11773); } }
11773 offsetof(struct tcb , uval )) &3) == 0){ if (!(( (((size_t) (&((struct ncr_reg *)0)->nc_scntl4
)) ^ ((size_t) (&((struct tcb *)0)->uval))) &3) ==
0)) { (void)panic( "assertion \"%s\" failed: file \"%s\", line %d\n"
, "( (offsetof(struct ncr_reg, nc_scntl4) ^ offsetof(struct tcb , uval )) &3) == 0"
, "../linux/src/drivers/scsi/sym53c8xx.c", 11773); } }
;
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*/
11784static lcb_p ncr_alloc_lcb (ncb_p np, u_charunsigned char tn, u_charunsigned char ln)
11785{
11786 tcb_p tp = &np->target[tn];
11787 lcb_p lp = ncr_lp(np, tp, ln)(!ln) ? (tp)->l0p : (tp)->lmp ? (tp)->lmp[(ln)] : 0;
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")m_calloc(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))((np->p_ncb + ((size_t) (&((struct ncb *)0)->resel_badlun
))))
;
11812 tp->b_luntbl = cpu_to_scr(vtobus(tp->luntbl))(virt_to_phys(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_LUN64 * 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")m_calloc(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))(virt_to_phys(lp));
11834 }
11835 else {
11836 tp->l0p = lp;
11837 tp->b_lun0 = cpu_to_scr(vtobus(lp))(virt_to_phys(lp));
11838 }
11839
11840 /*
11841 ** Initialize the CCB queue headers.
11842 */
11843 xpt_que_init(&lp->busy_ccbq)do { (&lp->busy_ccbq)->flink = (&lp->busy_ccbq
); (&lp->busy_ccbq)->blink = (&lp->busy_ccbq
); } while (0)
;
11844 xpt_que_init(&lp->wait_ccbq)do { (&lp->wait_ccbq)->flink = (&lp->wait_ccbq
); (&lp->wait_ccbq)->blink = (&lp->wait_ccbq
); } while (0)
;
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))(virt_to_phys(lp->tasktbl));
11853 lp->tasktbl[0] = cpu_to_scr(np->p_notask)(np->p_notask);
11854 lp->resel_task = cpu_to_scr(NCB_SCRIPT_PHYS(np, resel_notag))((np->p_script + ((size_t) (&((struct script *)0)->
resel_notag))))
;
11855
11856 /*
11857 ** Initialize command queuing control.
11858 */
11859 lp->busyccbs = 1;
11860 lp->queuedccbs = 1;
11861 lp->queuedepth = 1;
11862fail:
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*/
11875static lcb_p ncr_setup_lcb (ncb_p np, u_charunsigned char tn, u_charunsigned char ln, u_charunsigned char *inq_data)
11876{
11877 tcb_p tp = &np->target[tn];
11878 lcb_p lp = ncr_lp(np, tp, ln)(!ln) ? (tp)->l0p : (tp)->lmp ? (tp)->lmp[(ln)] : 0;
11879 u_charunsigned 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(np->verbose)) {
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(0x10);
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(0x10) | INQ7_WIDE16(0x20));
11919
11920 /*
11921 ** If user is wanting SYNC, force this feature.
11922 */
11923 if (driver_setup.force_sync_nego)
11924 inq_byte7 |= INQ7_SYNC(0x10);
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(0x10) | INQ7_WIDE16(0x20))) {
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(0x02)) && lp->tasktbl == &lp->tasktbl_0) {
11940 lp->tasktbl = m_calloc_dma(MAX_TASKS*4, "TASKTBL")m_calloc((256/4)*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))(virt_to_phys(lp->tasktbl));
11946 for (i = 0 ; i < MAX_TASKS(256/4) ; i++)
11947 lp->tasktbl[i] = cpu_to_scr(np->p_notask)(np->p_notask);
11948
11949 lp->cb_tags = m_calloc(MAX_TAGS(8), "CB_TAGS");
11950 if (!lp->cb_tags)
11951 goto fail;
11952 for (i = 0 ; i < MAX_TAGS(8) ; i++)
11953 lp->cb_tags[i] = i;
11954
11955 lp->maxnxs = MAX_TAGS(8);
11956 lp->tags_stime = ktime_get(3*HZ)(jiffies + (unsigned long) 3*100);
11957 }
11958
11959 /*
11960 ** Adjust tagged queueing status if needed.
11961 */
11962 if ((inq_byte7 ^ lp->inq_byte7) & INQ7_QUEUE(0x02)) {
11963 lp->inq_byte7 = inq_byte7;
11964 lp->numtags = lp->maxtags;
11965 ncr_setup_tags (np, tn, ln);
11966 }
11967
11968fail:
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)(data)->addr = (badd); (data)->size = (len); \
12019 (data)->addr = cpu_to_scr(badd)(badd); \
12020 (data)->size = cpu_to_scr((((badd) >> 8) & 0xff000000) + len)((((badd) >> 8) & 0xff000000) + len);
12021#else
12022#define SCATTER_ONE(data, badd, len)(data)->addr = (badd); (data)->size = (len); \
12023 (data)->addr = cpu_to_scr(badd)(badd); \
12024 (data)->size = cpu_to_scr(len)(len);
12025#endif
12026
12027#define CROSS_16MB(p, n)(((((unsigned long) p) + n - 1) ^ ((unsigned long) p)) & ~
0xffffff)
(((((u_longunsigned long) p) + n - 1) ^ ((u_longunsigned long) p)) & ~0xffffff)
12028
12029static 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((127))-1];
12032 int segment;
12033
12034 cp->data_len = cmd->request_bufflen;
12035
12036 if (cmd->request_bufflen) {
12037 u_longunsigned long baddr = map_scsi_single_data(np, cmd)(virt_to_phys((cmd)->request_buffer));
12038
12039 SCATTER_ONE(data, baddr, cmd->request_bufflen)(data)->addr = (baddr); (data)->size = (cmd->request_bufflen
);
;
12040 if (CROSS_16MB(baddr, cmd->request_bufflen)(((((unsigned long) baddr) + cmd->request_bufflen - 1) ^ (
(unsigned long) baddr)) & ~0xffffff)
) {
12041 cp->host_flagsphys.header.status[3] |= HF_PM_TO_C(1u<<6);
12042#ifdef DEBUG_896R1
12043printk("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*/
12069static 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((127)))
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)((cmd)->use_sg);
12085 data = &cp->phys.data[MAX_SCATTER((127)) - use_sg];
12086
12087 for (segn = 0; segn < use_sg; segn++) {
12088 u_longunsigned long baddr = scsi_sg_dma_address(&scatter[segn])virt_to_phys((&scatter[segn])->address);
12089 unsigned int len = scsi_sg_dma_len(&scatter[segn])((&scatter[segn])->length);
12090
12091 SCATTER_ONE(&data[segn],(&data[segn])->addr = (baddr); (&data[segn])->size
= (len);
12092 baddr,(&data[segn])->addr = (baddr); (&data[segn])->size
= (len);
12093 len)(&data[segn])->addr = (baddr); (&data[segn])->size
= (len);
;
12094 if (CROSS_16MB(baddr, scatter[segn].length)(((((unsigned long) baddr) + scatter[segn].length - 1) ^ ((unsigned
long) baddr)) & ~0xffffff)
) {
12095 cp->host_flagsphys.header.status[3] |= HF_PM_TO_C(1u<<6);
12096#ifdef DEBUG_896R1
12097printk("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
12108static 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((127)))
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)((cmd)->use_sg);
12124 data = &cp->phys.data[MAX_SCATTER((127)) - use_sg];
12125
12126 for (segment = 0; segment < use_sg; segment++) {
12127 u_longunsigned long baddr = scsi_sg_dma_address(&scatter[segment])virt_to_phys((&scatter[segment])->address);
12128 unsigned int len = scsi_sg_dma_len(&scatter[segment])((&scatter[segment])->length);
12129
12130 SCATTER_ONE(&data[segment],(&data[segment])->addr = (baddr); (&data[segment])
->size = (len);
12131 baddr,(&data[segment])->addr = (baddr); (&data[segment])
->size = (len);
12132 len)(&data[segment])->addr = (baddr); (&data[segment])
->size = (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
12152static 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)((*(volatile unsigned int *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_dstat))))) = ((data)))
;
12162 data = INL_OFF(offsetof(struct ncr_reg, nc_dstat))(*(volatile unsigned int *) ((char *)np->reg + (((size_t) (
&((struct ncr_reg *)0)->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
12176static 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)(np->p_scripth0+((size_t) (&((struct scripth *)0)->
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)(host_wr);
12196 OUTL (nc_temp, ncr_wr)((*(volatile unsigned int *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_temp))))) = (((ncr_wr))))
;
12197 /*
12198 ** Start script (exchange values)
12199 */
12200 OUTL (nc_dsa, np->p_ncb)((*(volatile unsigned int *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_dsa))))) = (((np->p_ncb
))))
;
12201 OUTL_DSP (pc)do { do { ; } while(0); ((*(volatile unsigned int *) ((char *
)np->reg + (((size_t) (&((struct ncr_reg *)0)->nc_dsp
))))) = ((((pc))))); } while (0)
;
12202 /*
12203 ** Wait 'til done (with timeout)
12204 */
12205 for (i=0; i<NCR_SNOOP_TIMEOUT(1000000); i++)
12206 if (INB(nc_istat)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_istat)))))
& (INTF0x04|SIP0x02|DIP0x01))
12207 break;
12208 /*
12209 ** Save termination position.
12210 */
12211 pc = INL (nc_dsp)(*(volatile unsigned int *) ((char *)np->reg + (((size_t) (
&((struct ncr_reg *)0)->nc_dsp)))))
;
12212 /*
12213 ** Read memory and register.
12214 */
12215 host_rd = scr_to_cpu(np->ncr_cache)(np->ncr_cache);
12216 ncr_rd = INL (nc_scratcha)(*(volatile unsigned int *) ((char *)np->reg + (((size_t) (
&((struct ncr_reg *)0)->nc_scratcha)))))
;
12217 ncr_bk = INL (nc_temp)(*(volatile unsigned int *) ((char *)np->reg + (((size_t) (
&((struct ncr_reg *)0)->nc_temp)))))
;
12218
12219 /*
12220 ** check for timeout
12221 */
12222 if (i>=NCR_SNOOP_TIMEOUT(1000000)) {
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)(np->p_scripth0+((size_t) (&((struct scripth *)0)->
snoopend)))
+8) {
12230 printk ("CACHE TEST FAILED: script execution failed.\n");
12231 printk ("start=%08lx, pc=%08lx, end=%08lx\n",
12232 (u_longunsigned long) NCB_SCRIPTH0_PHYS (np, snooptest)(np->p_scripth0+((size_t) (&((struct scripth *)0)->
snooptest)))
, (u_longunsigned long) pc,
12233 (u_longunsigned long) NCB_SCRIPTH0_PHYS (np, snoopend)(np->p_scripth0+((size_t) (&((struct scripth *)0)->
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 */
12284static void ncr_selectclock(ncb_p np, u_charunsigned char scntl3)
12285{
12286 if (np->multiplier < 2) {
12287 OUTB(nc_scntl3, scntl3)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_scntl3))))) = (((scntl3)
)))
;
12288 return;
12289 }
12290
12291 if (bootverbose(np->verbose) >= 2)
12292 printk ("%s: enabling clock multiplier\n", ncr_name(np));
12293
12294 OUTB(nc_stest1, DBLEN)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_stest1))))) = (((0x08)))
)
; /* Enable clock multiplier */
12295
12296 if ( (np->device_id != PCI_DEVICE_ID_LSI_53C10100x20) &&
12297 (np->device_id != PCI_DEVICE_ID_LSI_53C1010_660x21) &&
12298 (np->multiplier > 2)) {
12299 int i = 20; /* Poll bit 5 of stest4 for quadrupler */
12300 while (!(INB(nc_stest4)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_stest4)))))
& LCKFRQ0x20) && --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)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_stest3))))) = (((0x20)))
)
; /* Halt the scsi clock */
12310 OUTB(nc_scntl3, scntl3)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_scntl3))))) = (((scntl3)
)))
;
12311 OUTB(nc_stest1, (DBLEN|DBLSEL))((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_stest1))))) = ((((0x08|0x04
)))))
;/* Select clock multiplier */
12312 OUTB(nc_stest3, 0x00)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_stest3))))) = (((0x00)))
)
; /* Restart scsi clock */
12313}
12314
12315
12316/*
12317 * calculate NCR SCSI clock frequency (in KHz)
12318 */
12319static 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)((*(volatile unsigned short *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_sien))))) = (((0x0))))
;/* mask all scsi interrupts */
12341 /* enable general purpose timer */
12342 (void) INW (nc_sist)(*(volatile unsigned short *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_sist)))))
; /* clear pending scsi interrupt */
12343 OUTB (nc_dien , 0)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_dien))))) = (((0))))
; /* mask all dma interrupts */
12344 (void) INW (nc_sist)(*(volatile unsigned short *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_sist)))))
; /* another one, just to be sure :) */
12345 OUTB (nc_scntl3, 4)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_scntl3))))) = (((4))))
; /* set pre-scaler to divide by 3 */
12346 OUTB (nc_stime1, 0)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_stime1))))) = (((0))))
; /* disable general purpose timer */
12347 OUTB (nc_stime1, gen)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->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)(*(volatile unsigned short *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_sist)))))
& GEN0x0200) && ms++ < 100000) {
12351 /* count 1ms */
12352 for (count = 0; count < 10; count++)
12353 UDELAY (100);
12354 }
12355 OUTB (nc_stime1, 0)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->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)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->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_53C10100x20)
12370 f = ms ? ((1 << gen) * 2866 ) / ms : 0;
12371 else
12372#endif
12373 f = ms ? ((1 << gen) * 4340) / ms : 0;
12374
12375 if (bootverbose(np->verbose) >= 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
12382static unsigned __init ncr_getfreq (ncb_p np)
12383{
12384 u_intunsigned 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 */
12397static 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 & (DBLEN0x08+DBLSEL0x04)) == DBLEN0x08+DBLSEL0x04) {
12410 if (bootverbose(np->verbose) >= 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_53C10100x20) ||
12422 (np->device_id == PCI_DEVICE_ID_LSI_53C1010_660x21)) {
12423 f1=40000;
12424 np->multiplier = mult;
12425 if (bootverbose(np->verbose) >= 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)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_stest1))))) = (((0))))
; /* make sure doubler is OFF */
12430 f1 = ncr_getfreq (np);
12431
12432 if (bootverbose(np->verbose))
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(1<<23)) {
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(np->verbose) >= 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 */
12475static u_intunsigned int __init ncr_getpciclock (ncb_p np)
12476{
12477 static u_intunsigned int f;
12478
12479 OUTB (nc_stest1, SCLK)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_stest1))))) = (((0x80)))
)
; /* Use the PCI clock as SCSI clock */
12480 f = ncr_getfreq (np);
12481 OUTB (nc_stest1, 0)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_stest1))))) = (((0))))
;
12482
12483 return f;
12484}
12485
12486/*===================== LINUX ENTRY POINTS SECTION ==========================*/
12487
12488#ifndef ucharunsigned char
12489#define ucharunsigned char unsigned char
12490#endif
12491
12492#ifndef ushortunsigned short
12493#define ushortunsigned short unsigned short
12494#endif
12495
12496#ifndef ulongunsigned long
12497#define ulongunsigned long 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_TAGS1 1
12514#define OPT_MASTER_PARITY2 2
12515#define OPT_SCSI_PARITY3 3
12516#define OPT_DISCONNECTION4 4
12517#define OPT_SPECIAL_FEATURES5 5
12518#define OPT_ULTRA_SCSI6 6
12519#define OPT_FORCE_SYNC_NEGO7 7
12520#define OPT_REVERSE_PROBE8 8
12521#define OPT_DEFAULT_SYNC9 9
12522#define OPT_VERBOSE10 10
12523#define OPT_DEBUG11 11
12524#define OPT_BURST_MAX12 12
12525#define OPT_LED_PIN13 13
12526#define OPT_MAX_WIDE14 14
12527#define OPT_SETTLE_DELAY15 15
12528#define OPT_DIFF_SUPPORT16 16
12529#define OPT_IRQM17 17
12530#define OPT_PCI_FIX_UP18 18
12531#define OPT_BUS_CHECK19 19
12532#define OPT_OPTIMIZE20 20
12533#define OPT_RECOVERY21 21
12534#define OPT_SAFE_SETUP22 22
12535#define OPT_USE_NVRAM23 23
12536#define OPT_EXCLUDE24 24
12537#define OPT_HOST_ID25 25
12538
12539#ifdef SCSI_NCR_IARB_SUPPORT
12540#define OPT_IARB 26
12541#endif
12542
12543static 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
12568static 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((void *) 0) && (pc = strchr(cur, ':')) != NULL((void *) 0)) {
12575 ++pc;
12576 ++i;
12577 if (!strncmp(p, cur, pc - cur))
12578 return i;
12579 cur = pc;
12580 }
12581 return 0;
12582}
12583
12584
12585int __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((void *) 0) && (pc = strchr(cur, ':')) != NULL((void *) 0)) {
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_TAGS1:
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_PARITY2:
12621 driver_setup.master_parity = val;
12622 break;
12623 case OPT_SCSI_PARITY3:
12624 driver_setup.scsi_parity = val;
12625 break;
12626 case OPT_DISCONNECTION4:
12627 driver_setup.disconnection = val;
12628 break;
12629 case OPT_SPECIAL_FEATURES5:
12630 driver_setup.special_features = val;
12631 break;
12632 case OPT_ULTRA_SCSI6:
12633 driver_setup.ultra_scsi = val;
12634 break;
12635 case OPT_FORCE_SYNC_NEGO7:
12636 driver_setup.force_sync_nego = val;
12637 break;
12638 case OPT_REVERSE_PROBE8:
12639 driver_setup.reverse_probe = val;
12640 break;
12641 case OPT_DEFAULT_SYNC9:
12642 driver_setup.default_sync = val;
12643 break;
12644 case OPT_VERBOSE10:
12645 driver_setup.verbose = val;
12646 break;
12647 case OPT_DEBUG11:
12648 driver_setup.debug = val;
12649 break;
12650 case OPT_BURST_MAX12:
12651 driver_setup.burst_max = val;
12652 break;
12653 case OPT_LED_PIN13:
12654 driver_setup.led_pin = val;
12655 break;
12656 case OPT_MAX_WIDE14:
12657 driver_setup.max_wide = val? 1:0;
12658 break;
12659 case OPT_SETTLE_DELAY15:
12660 driver_setup.settle_delay = val;
12661 break;
12662 case OPT_DIFF_SUPPORT16:
12663 driver_setup.diff_support = val;
12664 break;
12665 case OPT_IRQM17:
12666 driver_setup.irqm = val;
12667 break;
12668 case OPT_PCI_FIX_UP18:
12669 driver_setup.pci_fix_up = val;
12670 break;
12671 case OPT_BUS_CHECK19:
12672 driver_setup.bus_check = val;
12673 break;
12674 case OPT_OPTIMIZE20:
12675 driver_setup.optimize = val;
12676 break;
12677 case OPT_RECOVERY21:
12678 driver_setup.recovery = val;
12679 break;
12680 case OPT_USE_NVRAM23:
12681 driver_setup.use_nvram = val;
12682 break;
12683 case OPT_SAFE_SETUP22:
12684 memcpy(&driver_setup, &driver_safe_setup,(__builtin_constant_p(sizeof(driver_setup)) ? __constant_memcpy
((&driver_setup),(&driver_safe_setup),(sizeof(driver_setup
))) : __memcpy((&driver_setup),(&driver_safe_setup),(
sizeof(driver_setup))))
12685 sizeof(driver_setup))(__builtin_constant_p(sizeof(driver_setup)) ? __constant_memcpy
((&driver_setup),(&driver_safe_setup),(sizeof(driver_setup
))) : __memcpy((&driver_setup),(&driver_safe_setup),(
sizeof(driver_setup))))
;
12686 break;
12687 case OPT_EXCLUDE24:
12688 if (xi < SCSI_NCR_MAX_EXCLUDES8)
12689 driver_setup.excludes[xi++] = val;
12690 break;
12691 case OPT_HOST_ID25:
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((void *) 0))
12705 ++cur;
12706 }
12707#endif /* SCSI_NCR_BOOT_COMMAND_LINE_SUPPORT */
12708 return 1;
12709}
12710
12711#if LINUX_VERSION_CODE131108 >= LinuxVersionCode(2,3,13)(((2)<<16)+((3)<<8)+(13))
12712#ifndef MODULE
12713__setup("sym53c8xx=", sym53c8xx_setup);
12714#endif
12715#endif
12716
12717static int
12718sym53c8xx_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
12735static void __init ncr_print_driver_setup(void)
12736{
12737#define YesNo(y) y ? 'y' : 'n'
12738 printk (NAME53C8XX"sym53c8xx" ": 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"sym53c8xx" ": 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
12771static ncr_chip ncr_chip_table[] __initdata = SCSI_NCR_CHIP_TABLE{ {0x0001, 0x0f, "810", 4, 8, 4, (1<<6)} , {0x0001, 0xff
, "810a", 4, 8, 4, ((1<<6)|(1<<7)|(1<<8)|(1
<<9))|(1<<13)|(1<<12)|(1<<10)} , {0x0004
, 0xff, "815", 4, 8, 4, (1<<6)|(1<<10)} , {0x0002
, 0xff, "820", 4, 8, 4, (1<<1)|(1<<6)} , {0x0003,
0x0f, "825", 4, 8, 4, (1<<1)|(1<<6)|(1<<10
)|(1<<21)} , {0x0003, 0xff, "825a", 6, 8, 4, (1<<
1)|(((1<<6)|(1<<7)|(1<<8)|(1<<9)) &
~(1<<6))|(1<<10)|(1<<11)|(1<<13)|(1<<
12)|(1<<14)|(1<<21)} , {0x0006, 0xff, "860", 4, 8
, 5, (1<<2)|(1<<15)|((1<<6)|(1<<7)|(1
<<8)|(1<<9))|(1<<10)|(1<<13)|(1<<
12)} , {0x000f, 0x01, "875", 6, 16, 5, (1<<1)|(1<<
2)|(1<<15)|(((1<<6)|(1<<7)|(1<<8)|(1<<
9)) & ~(1<<6))|(1<<10)|(1<<11)|(1<<
13)|(1<<12)| (1<<14)|(1<<21)} , {0x000f, 0x0f
, "875", 6, 16, 5, (1<<1)|(1<<2)|(1<<4)|(((
1<<6)|(1<<7)|(1<<8)|(1<<9)) & ~(1
<<6))|(1<<10)|(1<<11)|(1<<13)|(1<<
12)| (1<<14)|(1<<21)} , {0x000f, 0x1f, "876", 6, 16
, 5, (1<<1)|(1<<2)|(1<<4)|(((1<<6)|(1
<<7)|(1<<8)|(1<<9)) & ~(1<<6))|(1
<<10)|(1<<11)|(1<<13)|(1<<12)| (1<<
14)|(1<<21)} , {0x000f, 0x2f, "875E", 6, 16, 5, (1<<
1)|(1<<2)|(1<<4)|(((1<<6)|(1<<7)|(1<<
8)|(1<<9)) & ~(1<<6))|(1<<10)|(1<<
11)|(1<<13)|(1<<12)| (1<<14)|(1<<21)}
, {0x000f, 0xff, "876", 6, 16, 5, (1<<1)|(1<<2)|
(1<<4)|(((1<<6)|(1<<7)|(1<<8)|(1<<
9)) & ~(1<<6))|(1<<10)|(1<<11)|(1<<
13)|(1<<12)| (1<<14)|(1<<21)} , {0x008f,0xff
, "875J", 6, 16, 5, (1<<1)|(1<<2)|(1<<4)|((
(1<<6)|(1<<7)|(1<<8)|(1<<9)) & ~(
1<<6))|(1<<10)|(1<<11)|(1<<13)|(1<<
12)| (1<<14)} , {0x000d, 0xff, "885", 6, 16, 5, (1<<
1)|(1<<2)|(1<<4)|(((1<<6)|(1<<7)|(1<<
8)|(1<<9)) & ~(1<<6))|(1<<10)|(1<<
11)|(1<<13)|(1<<12)| (1<<14)|(1<<21)}
, {0x000c, 0xff, "895", 6, 31, 7, (1<<1)|(1<<3)|
(1<<5)|((1<<6)|(1<<7)|(1<<8)|(1<<
9))|(1<<10)|(1<<11)|(1<<13)|(1<<12)| (
1<<14)} , {0x000b, 0xff, "896", 6, 31, 7, (1<<1)|
(1<<3)|(1<<5)|((1<<6)|(1<<7)|(1<<
8)|(1<<9))|(1<<10)|(1<<11)|(1<<13)|(1
<<12)| (1<<14)|(1<<16)|(1<<17)|(1<<
18)|(1<<19)|(1<<20)} , {0x12, 0xff, "895a", 6, 31
, 7, (1<<1)|(1<<3)|(1<<5)|((1<<6)|(1<<
7)|(1<<8)|(1<<9))|(1<<10)|(1<<11)|(1<<
13)|(1<<12)| (1<<14)|(1<<16)|(1<<17)|
(1<<18)|(1<<19)|(1<<20)} , {0xa, 0xff, "1510D"
, 7, 31, 7, (1<<1)|(1<<3)|(1<<5)|((1<<
6)|(1<<7)|(1<<8)|(1<<9))|(1<<10)|(1<<
11)|(1<<13)|(1<<12)| (1<<14)|(1<<18)}
, {0x20, 0xff, "1010", 6, 31, 7, (1<<1)|(1<<5)|(
(1<<6)|(1<<7)|(1<<8)|(1<<9))|(1<<
10)|(1<<11)|(1<<13)|(1<<12)| (1<<14)|
(1<<16)|(1<<17)|(1<<18)|(1<<19)|(1<<
20)|(1<<22)} , {0x21, 0xff, "1010_66", 6, 31, 7, (1<<
1)|(1<<5)|((1<<6)|(1<<7)|(1<<8)|(1<<
9))|(1<<10)|(1<<11)|(1<<13)|(1<<12)| (
1<<14)|(1<<16)|(1<<17)|(1<<18)|(1<<
19)|(1<<20)|(1<<22)|(1<<23)} }
;
12772static ushortunsigned short ncr_chip_ids[] __initdata = SCSI_NCR_CHIP_IDS{ 0x0001, 0x0004, 0x0002, 0x0003, 0x0006, 0x000f, 0x008f, 0x000d
, 0x000c, 0x000b, 0x12, 0xa, 0x20, 0x21 }
;
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
12792static int pqs_bus[SCSI_NCR_MAX_PQS_BUS] __initdata = { 0 };
12793
12794static void __init ncr_detect_pqs_pds(void)
12795{
12796 short index;
12797 pcidev_t dev = PCIDEV_NULL(~0u);
12798
12799 for(index=0; index < SCSI_NCR_MAX_PQS_BUS; index++) {
12800 u_charunsigned char tmp;
12801
12802 dev = pci_find_device(0x101a, 0x0009, dev);
12803 if (dev == PCIDEV_NULL(~0u)) {
12804 pqs_bus[index] = -1;
12805 break;
12806 }
12807 printk(KERN_INFO"<6>" NAME53C8XX"sym53c8xx" ": NCR PQS/PDS memory controller detected on bus %d\n", PciBusNumber(dev)((dev)>>8));
12808 pci_read_config_byte(dev, 0x44, &tmp)pcibios_read_config_byte(((dev)>>8), ((dev)&0xff), 0x44
, &tmp)
;
12809 /* bit 1: allow individual 875 configuration */
12810 tmp |= 0x2;
12811 pci_write_config_byte(dev, 0x44, tmp)pcibios_write_config_byte(((dev)>>8), ((dev)&0xff),
0x44, tmp)
;
12812 pci_read_config_byte(dev, 0x45, &tmp)pcibios_read_config_byte(((dev)>>8), ((dev)&0xff), 0x45
, &tmp)
;
12813 /* bit 2: drive individual 875 interrupts to the bus */
12814 tmp |= 0x4;
12815 pci_write_config_byte(dev, 0x45, tmp)pcibios_write_config_byte(((dev)>>8), ((dev)&0xff),
0x45, tmp)
;
12816
12817 pqs_bus[index] = PciBusNumber(dev)((dev)>>8);
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*/
12833int __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_presentpcibios_present())
12847 return 0;
12848
12849 /*
12850 ** Initialize driver general stuff.
12851 */
12852#ifdef SCSI_NCR_PROC_INFO_SUPPORT
12853#if LINUX_VERSION_CODE131108 < LinuxVersionCode(2,3,27)(((2)<<16)+((3)<<8)+(27))
12854 tpnt->proc_dir = &proc_scsi_sym53c8xx;
12855#else
12856 tpnt->proc_name = NAME53C8XX"sym53c8xx";
12857#endif
12858 tpnt->proc_info = sym53c8xx_proc_info;
12859#endif
12860
12861#if defined(SCSI_NCR_BOOT_COMMAND_LINE_SUPPORT) && defined(MODULE)
12862if (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(driver_setup.verbose) >= 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(1 << 12), "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(1 << 12) / 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(~0u);
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_NCR0x1000, ncr_chip_ids[i],
12909 pcidev);
12910 if (pcidev == PCIDEV_NULL(~0u)) {
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)((pcidev)>>8) &&
12917 devtbl[i].slot.device_fn == PciDeviceFn(pcidev)((pcidev)&0xff))
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(1):
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(2):
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"<6>" NAME53C8XX"sym53c8xx" ": 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(1))
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(1)) {
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"<6>" NAME53C8XX"sym53c8xx"
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 }
12995next:
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(1 << 12), "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*/
13025static int __init
13026sym53c8xx_pci_init(Scsi_Host_Template *tpnt, pcidev_t pdev, ncr_device *device)
13027{
13028 u_shortunsigned short vendor_id, device_id, command, status_reg;
13029 u_charunsigned char cache_line_size, latency_timer;
13030 u_charunsigned char suggested_cache_line_size = 0;
13031 u_charunsigned char pci_fix_up = driver_setup.pci_fix_up;
13032 u_charunsigned char revision;
13033 u_intunsigned int irq;
13034 u_longunsigned long base, base_2, io_port;
13035 int i;
13036 ncr_chip *chip;
13037
13038 printk(KERN_INFO"<6>" NAME53C8XX"sym53c8xx" ": at PCI bus %d, device %d, function %d\n",
13039 PciBusNumber(pdev)((pdev)>>8),
13040 (int) (PciDeviceFn(pdev)((pdev)&0xff) & 0xf8) >> 3,
13041 (int) (PciDeviceFn(pdev)((pdev)&0xff) & 7));
13042
13043#ifdef SCSI_NCR_DYNAMIC_DMA_MAPPING
13044 if (!pci_dma_supported(pdev, (dma_addr_t) (0xffffffffUL))) {
13045 printk(KERN_WARNING"<4>" NAME53C8XX"sym53c8xx"
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)pcibios_read_config_word(((pdev)>>8), ((pdev)&0xff)
, 0x04, &command)
;
13065 pci_read_config_byte(pdev, PCI_CLASS_REVISION, &revision)pcibios_read_config_byte(((pdev)>>8), ((pdev)&0xff)
, 0x08, &revision)
;
13066 pci_read_config_byte(pdev, PCI_CACHE_LINE_SIZE, &cache_line_size)pcibios_read_config_byte(((pdev)>>8), ((pdev)&0xff)
, 0x0c, &cache_line_size)
;
13067 pci_read_config_byte(pdev, PCI_LATENCY_TIMER, &latency_timer)pcibios_read_config_byte(((pdev)>>8), ((pdev)&0xff)
, 0x0d, &latency_timer)
;
13068 pci_read_config_word(pdev, PCI_STATUS, &status_reg)pcibios_read_config_word(((pdev)>>8), ((pdev)&0xff)
, 0x06, &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_charunsigned char tmp;
13079 if (pqs_bus[i] == PciBusNumber(pdev)((pdev)>>8)) {
13080 pci_read_config_byte(pdev, 0x84, &tmp)pcibios_read_config_byte(((pdev)>>8), ((pdev)&0xff)
, 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_EXCLUDES8 ; i++) {
13092 if (driver_setup.excludes[i] ==
13093 (io_port & PCI_BASE_ADDRESS_IO_MASK(~0x03)))
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(1<<13)))
13106 break;
13107 chip = &device->chip;
13108 memcpy(chip, &ncr_chip_table[i], sizeof(*chip))(__builtin_constant_p(sizeof(*chip)) ? __constant_memcpy((chip
),(&ncr_chip_table[i]),(sizeof(*chip))) : __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__1) && !defined(SCSI_NCR_PCI_MEM_NOT_SUPPORTED)
13118 if (chip && (base_2 & PCI_BASE_ADDRESS_MEM_MASK(~0x0f))) {
13119 unsigned int ram_size, ram_val;
13120 u_longunsigned long ram_ptr;
13121
13122 if (chip->features & FE_RAM8K(1<<16))
13123 ram_size = 8192;
13124 else
13125 ram_size = 4096;
13126
13127 ram_ptr = remap_pci_mem(base_2 & PCI_BASE_ADDRESS_MEM_MASK(~0x0f),
13128 ram_size);
13129 if (ram_ptr) {
13130 ram_val = readl_raw(ram_ptr + ram_size - 16)(*(volatile unsigned int *) (ram_ptr + ram_size - 16));
13131 unmap_pci_mem(ram_ptr, ram_size);
13132 if (ram_val == 0x52414944) {
13133 printk(NAME53C8XX"sym53c8xx"": 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"sym53c8xx" ": 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_IO0x1 | PCI_COMMAND_MEMORY0x2))
13152 != (PCI_COMMAND_IO0x1 | PCI_COMMAND_MEMORY0x2)) {
13153 printk(NAME53C8XX"sym53c8xx" ": setting%s%s...\n",
13154 (command & PCI_COMMAND_IO0x1) ? "" : " PCI_COMMAND_IO",
13155 (command & PCI_COMMAND_MEMORY0x2) ? "" : " PCI_COMMAND_MEMORY");
13156 command |= (PCI_COMMAND_IO0x1 | PCI_COMMAND_MEMORY0x2);
13157 pci_write_config_word(pdev, PCI_COMMAND, command)pcibios_write_config_word(((pdev)>>8), ((pdev)&0xff
), 0x04, command)
;
13158 }
13159
13160#if LINUX_VERSION_CODE131108 < LinuxVersionCode(2,2,0)(((2)<<16)+((2)<<8)+(0))
13161 if ( is_prep ) {
13162 if (io_port >= 0x10000000) {
13163 printk(NAME53C8XX"sym53c8xx" ": reallocating io_port (Wacky IBM)");
13164 io_port = (io_port & 0x00FFFFFF) | 0x01000000;
13165 pci_write_config_dword(pdev,pcibios_write_config_dword(((pdev)>>8), ((pdev)&0xff
), 0x10, io_port)
13166 PCI_BASE_ADDRESS_0, io_port)pcibios_write_config_dword(((pdev)>>8), ((pdev)&0xff
), 0x10, io_port)
;
13167 }
13168 if (base >= 0x10000000) {
13169 printk(NAME53C8XX"sym53c8xx" ": reallocating base (Wacky IBM)");
13170 base = (base & 0x00FFFFFF) | 0x01000000;
13171 pci_write_config_dword(pdev,pcibios_write_config_dword(((pdev)>>8), ((pdev)&0xff
), 0x14, base)
13172 PCI_BASE_ADDRESS_1, base)pcibios_write_config_dword(((pdev)>>8), ((pdev)&0xff
), 0x14, base)
;
13173 }
13174 if (base_2 >= 0x10000000) {
13175 printk(NAME53C8XX"sym53c8xx" ": reallocating base2 (Wacky IBM)");
13176 base_2 = (base_2 & 0x00FFFFFF) | 0x01000000;
13177 pci_write_config_dword(pdev,pcibios_write_config_dword(((pdev)>>8), ((pdev)&0xff
), 0x18, base_2)
13178 PCI_BASE_ADDRESS_2, base_2)pcibios_write_config_dword(((pdev)>>8), ((pdev)&0xff
), 0x18, base_2)
;
13179 }
13180 }
13181#endif
13182#endif /* __powerpc__ */
13183
13184#if defined(__sparc__) && (LINUX_VERSION_CODE131108 < LinuxVersionCode(2,3,0)(((2)<<16)+((3)<<8)+(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__1) && !defined(MODULE)
13211 if (!cache_line_size) {
13212#if LINUX_VERSION_CODE131108 < LinuxVersionCode(2,1,75)(((2)<<16)+((1)<<8)+(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_IO0x1)) {
13238 printk(NAME53C8XX"sym53c8xx" ": I/O base address (0x%lx) disabled.\n",
13239 (long) io_port);
13240 io_port = 0;
13241 }
13242#endif
13243 if (!(command & PCI_COMMAND_MEMORY0x2)) {
13244 printk(NAME53C8XX"sym53c8xx" ": PCI_COMMAND_MEMORY not set.\n");
13245 base = 0;
13246 base_2 = 0;
13247 }
13248 io_port &= PCI_BASE_ADDRESS_IO_MASK(~0x03);
13249 base &= PCI_BASE_ADDRESS_MEM_MASK(~0x0f);
13250 base_2 &= PCI_BASE_ADDRESS_MEM_MASK(~0x0f);
13251
13252/* #ifdef SCSI_NCR_IOMAPPED */
13253#if 1
13254 if (io_port && check_region (io_port, 128)) {
13255 printk(NAME53C8XX"sym53c8xx" ": 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"sym53c8xx" ": 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_MASTER0x4 | PCI_COMMAND_PARITY0x40))
13273 != (PCI_COMMAND_MASTER0x4 | PCI_COMMAND_PARITY0x40)) {
13274 printk(NAME53C8XX"sym53c8xx" ": setting%s%s...(fix-up)\n",
13275 (command & PCI_COMMAND_MASTER0x4) ? "" : " PCI_COMMAND_MASTER",
13276 (command & PCI_COMMAND_PARITY0x40) ? "" : " PCI_COMMAND_PARITY");
13277 command |= (PCI_COMMAND_MASTER0x4 | PCI_COMMAND_PARITY0x40);
13278 pci_write_config_word(pdev, PCI_COMMAND, command)pcibios_write_config_word(((pdev)>>8), ((pdev)&0xff
), 0x04, 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(((1<<6)|(1<<7)|(1<<8)|(1<<9))|(1<<
10)|(1<<11)|(1<<13)|(1<<12)|(1<<14))
;
13286 else {
13287 if (driver_setup.special_features & 2)
13288 chip->features &= ~FE_WRIE(1<<8);
13289 if (driver_setup.special_features & 4)
13290 chip->features &= ~FE_NOPM(1<<19);
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(1<<23)) {
13305 if (!(status_reg & PCI_STATUS_66MHZ0x20))
13306 chip->features &= ~FE_66MHZ(1<<23);
13307 }
13308 else {
13309 if (status_reg & PCI_STATUS_66MHZ0x20) {
13310 status_reg = PCI_STATUS_66MHZ0x20;
13311 pci_write_config_word(pdev, PCI_STATUS, status_reg)pcibios_write_config_word(((pdev)>>8), ((pdev)&0xff
), 0x06, status_reg)
;
13312 pci_read_config_word(pdev, PCI_STATUS, &status_reg)pcibios_read_config_word(((pdev)>>8), ((pdev)&0xff)
, 0x06, &status_reg)
;
13313 }
13314 }
13315
13316 if (driver_setup.ultra_scsi < 3 && (chip->features & FE_ULTRA3(1<<22))) {
13317 chip->features |= FE_ULTRA2(1<<3);
13318 chip->features &= ~FE_ULTRA3(1<<22);
13319 }
13320 if (driver_setup.ultra_scsi < 2 && (chip->features & FE_ULTRA2(1<<3))) {
13321 chip->features |= FE_ULTRA(1<<2);
13322 chip->features &= ~FE_ULTRA2(1<<3);
13323 }
13324 if (driver_setup.ultra_scsi < 1)
13325 chip->features &= ~FE_ULTRA(1<<2);
13326
13327 if (!driver_setup.max_wide)
13328 chip->features &= ~FE_WIDE(1<<1);
13329
13330 /*
13331 * C1010 Ultra3 support requires 16 bit data transfers.
13332 */
13333 if (!driver_setup.max_wide && (chip->features & FE_ULTRA3(1<<22))) {
13334 chip->features |= FE_ULTRA2(1<<3);
13335 chip->features |= ~FE_ULTRA3(1<<22);
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_53C8960x000b && revision <= 0x10) {
13346 chip->features |= (FE_WRIE(1<<8) | FE_CLSE(1<<7));
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(1<<7)) &&
13355 !cache_line_size && suggested_cache_line_size) {
13356 cache_line_size = suggested_cache_line_size;
13357 pci_write_config_byte(pdev,pcibios_write_config_byte(((pdev)>>8), ((pdev)&0xff
), 0x0c, cache_line_size)
13358 PCI_CACHE_LINE_SIZE, cache_line_size)pcibios_write_config_byte(((pdev)>>8), ((pdev)&0xff
), 0x0c, cache_line_size)
;
13359 printk(NAME53C8XX"sym53c8xx" ": 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(1<<8)) && !(command & PCI_COMMAND_INVALIDATE0x10)) {
13365 printk(NAME53C8XX"sym53c8xx"": setting PCI_COMMAND_INVALIDATE (fix-up)\n");
13366 command |= PCI_COMMAND_INVALIDATE0x10;
13367 pci_write_config_word(pdev, PCI_COMMAND, command)pcibios_write_config_word(((pdev)>>8), ((pdev)&0xff
), 0x04, 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 ucharunsigned char lt = (1 << chip->burst_max) + 6 + 10;
13377 if (latency_timer < lt) {
13378 printk(NAME53C8XX"sym53c8xx"
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,pcibios_write_config_byte(((pdev)>>8), ((pdev)&0xff
), 0x0d, latency_timer)
13383 PCI_LATENCY_TIMER, latency_timer)pcibios_write_config_byte(((pdev)>>8), ((pdev)&0xff
), 0x0d, 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)((pdev)>>8);
13394 device->slot.device_fn = PciDeviceFn(pdev)((pdev)&0xff);
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
13418static 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"sym53c8xx");
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(1);
13441 else if (!sym_read_Tekram_nvram(&devp->slot, devp->chip.device_id,
13442 &nvp->data.Tekram))
13443 nvp->type = SCSI_NCR_TEKRAM_NVRAM(2);
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_longunsigned 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) (driver_setup.default_tags)
13466#define ALL_TARGETS-2 -2
13467#define NO_TARGET-1 -1
13468#define ALL_LUNS-2 -2
13469#define NO_LUN-1 -1
13470
13471static 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-1;
13479 u = NO_LUN-1;
13480 while ((c = *p++) != 0) {
13481 v = simple_strtoul(p, &ep, 0);
13482 switch(c) {
13483 case '/':
13484 ++h;
13485 t = ALL_TARGETS-2;
13486 u = ALL_LUNS-2;
13487 break;
13488 case 't':
13489 if (t != target)
13490 t = (target == v) ? v : NO_TARGET-1;
13491 u = ALL_LUNS-2;
13492 break;
13493 case 'u':
13494 if (u != lun)
13495 u = (lun == v) ? v : NO_LUN-1;
13496 break;
13497 case 'q':
13498 if (h == np->unit &&
13499 (t == ALL_TARGETS-2 || t == target) &&
13500 (u == ALL_LUNS-2 || u == lun))
13501 return v;
13502 break;
13503 case '-':
13504 t = ALL_TARGETS-2;
13505 u = ALL_LUNS-2;
13506 break;
13507 default:
13508 break;
13509 }
13510 p = ep;
13511 }
13512 return DEF_DEPTH(driver_setup.default_tags);
13513}
13514
13515static 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)(!device->lun) ? (tp)->l0p : (tp)->lmp ? (tp)->lmp
[(device->lun)] : 0
;
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(8))
13547 device->queue_depth = MAX_TAGS(8);
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
13561printk("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*/
13570const char *sym53c8xx_info (struct Scsi_Host *host)
13571{
13572 return SCSI_NCR_DRIVER_NAME"sym53c8xx-1.7.1-20000726";
13573}
13574
13575/*
13576** Linux entry point of queuecommand() function
13577*/
13578
13579int 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
13586printk("sym53c8xx_queue_command\n");
13587#endif
13588
13589 cmd->scsi_done = done;
13590 cmd->host_scribble = NULL((void *) 0);
13591 cmd->SCp.ptr = NULL((void *) 0);
13592 cmd->SCp.buffer = NULL((void *) 0);
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)do { __asm__ __volatile__("pushf ; pop %0" : "=r" (flags): :"memory"
); __asm__ __volatile__ ("cli": : :"memory"); } while (0)
;
13599
13600 if ((sts = ncr_queue_command(np, cmd)) != DID_OK0x00) {
13601 SetScsiResult(cmd, sts, 0)cmd->result = (((sts) << 16) + ((0) & 0x7f));
13602#ifdef DEBUG_SYM53C8XX
13603printk("sym53c8xx : command not queued - result=%d\n", sts);
13604#endif
13605 }
13606#ifdef DEBUG_SYM53C8XX
13607 else
13608printk("sym53c8xx : command successfully queued\n");
13609#endif
13610
13611 NCR_UNLOCK_NCB(np, flags)do { __asm__ __volatile__("push %0 ; popf": :"g" (flags):"memory"
); } while (0)
;
13612
13613 if (sts != DID_OK0x00) {
13614 unmap_scsi_data(np, cmd)do {; } while (0);
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
13629static 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_FLAGSncr_debug & DEBUG_TINY(0x0080)) printk ("[");
13640
13641 NCR_LOCK_NCB(np, flags)do { __asm__ __volatile__("pushf ; pop %0" : "=r" (flags): :"memory"
); __asm__ __volatile__ ("cli": : :"memory"); } while (0)
;
13642 ncr_exception(np);
13643 done_list = np->done_list;
13644 np->done_list = 0;
13645 NCR_UNLOCK_NCB(np, flags)do { __asm__ __volatile__("push %0 ; popf": :"g" (flags):"memory"
); } while (0)
;
13646
13647 if (DEBUG_FLAGSncr_debug & DEBUG_TINY(0x0080)) printk ("]\n");
13648
13649 if (done_list) {
13650 NCR_LOCK_SCSI_DONE(np, flags)do {;} while (0);
13651 ncr_flush_done_cmds(done_list);
13652 NCR_UNLOCK_SCSI_DONE(np, flags)do {;} while (0);
13653 }
13654}
13655
13656/*
13657** Linux entry point of the timer handler
13658*/
13659
13660static 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)do { __asm__ __volatile__("pushf ; pop %0" : "=r" (flags): :"memory"
); __asm__ __volatile__ ("cli": : :"memory"); } while (0)
;
13667 ncr_timeout((ncb_p) np);
13668 done_list = np->done_list;
13669 np->done_list = 0;
13670 NCR_UNLOCK_NCB(np, flags)do { __asm__ __volatile__("push %0 ; popf": :"g" (flags):"memory"
); } while (0)
;
13671
13672 if (done_list) {
13673 NCR_LOCK_SCSI_DONE(np, flags)do {;} while (0);
13674 ncr_flush_done_cmds(done_list);
13675 NCR_UNLOCK_SCSI_DONE(np, flags)do {;} while (0);
13676 }
13677}
13678
13679/*
13680** Linux entry point of reset() function
13681*/
13682
13683#if defined SCSI_RESET_SYNCHRONOUS0x01 && defined SCSI_RESET_ASYNCHRONOUS0x02
13684int sym53c8xx_reset(Scsi_Cmnd *cmd, unsigned int reset_flags)
13685#else
13686int 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_SYNCHRONOUS0x01 && defined SCSI_RESET_ASYNCHRONOUS0x02
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)do { __asm__ __volatile__("pushf ; pop %0" : "=r" (flags): :"memory"
); __asm__ __volatile__ ("cli": : :"memory"); } while (0)
;
13702
13703 /*
13704 * We have to just ignore reset requests in some situations.
13705 */
13706#if defined SCSI_RESET_NOT_RUNNING5
13707 if (cmd->serial_number != cmd->serial_number_at_timeout) {
13708 sts = SCSI_RESET_NOT_RUNNING5;
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_SYNCHRONOUS0x01 && defined SCSI_RESET_ASYNCHRONOUS0x02
13720 sts = ncr_reset_bus(np, cmd,
13721 (reset_flags & (SCSI_RESET_SYNCHRONOUS0x01 | SCSI_RESET_ASYNCHRONOUS0x02)) == SCSI_RESET_SYNCHRONOUS0x01);
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_RESET0x200
13731 if (sts == SCSI_RESET_SUCCESS2)
13732 sts |= SCSI_RESET_HOST_RESET0x200;
13733#endif
13734
13735out:
13736 done_list = np->done_list;
13737 np->done_list = 0;
13738 NCR_UNLOCK_NCB(np, flags)do { __asm__ __volatile__("push %0 ; popf": :"g" (flags):"memory"
); } while (0)
;
13739
13740 ncr_flush_done_cmds(done_list);
13741
13742 return sts;
13743}
13744
13745/*
13746** Linux entry point of abort() function
13747*/
13748
13749int 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_SYNCHRONOUS0x01 && defined SCSI_RESET_ASYNCHRONOUS0x02
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)do { __asm__ __volatile__("pushf ; pop %0" : "=r" (flags): :"memory"
); __asm__ __volatile__ ("cli": : :"memory"); } while (0)
;
13764
13765#if defined SCSI_RESET_SYNCHRONOUS0x01 && defined SCSI_RESET_ASYNCHRONOUS0x02
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_RUNNING4;
13771 goto out;
13772 }
13773#endif
13774
13775 sts = ncr_abort_command(np, cmd);
13776out:
13777 done_list = np->done_list;
13778 np->done_list = 0;
13779 NCR_UNLOCK_NCB(np, flags)do { __asm__ __volatile__("push %0 ; popf": :"g" (flags):"memory"
); } while (0)
;
13780
13781 ncr_flush_done_cmds(done_list);
13782
13783 return sts;
13784}
13785
13786
13787#ifdef MODULE
13788int sym53c8xx_release(struct Scsi_Host *host)
13789{
13790#ifdef DEBUG_SYM53C8XX
13791printk("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
13815static 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_longunsigned 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
13831static 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_longunsigned long) cmd);
13843#endif
13844 return cmd;
13845 }
13846 pcmd = (Scsi_Cmnd **) &(*pcmd)->next_wcmd;
13847 }
13848 return 0;
13849}
13850
13851static 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_longunsigned 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_OK0x00) {
13865#ifdef DEBUG_WAITING_LIST
13866 printk("%s: cmd %lx trying to requeue\n", ncr_name(np), (u_longunsigned long) wcmd);
13867#endif
13868 sts = ncr_queue_command(np, wcmd);
13869 }
13870 if (sts != DID_OK0x00) {
13871#ifdef DEBUG_WAITING_LIST
13872 printk("%s: cmd %lx done forced sts=%d\n", ncr_name(np), (u_longunsigned long) wcmd, sts);
13873#endif
13874 SetScsiResult(wcmd, sts, 0)wcmd->result = (((sts) << 16) + ((0) & 0x7f));
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
13900static 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
13909static int get_int_arg(char *ptr, int len, u_longunsigned long *pv)
13910{
13911 int cnt, c;
13912 u_longunsigned 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
13924static int is_keyword(char *ptr, int len, char *verb)
13925{
13926 int verb_len = strlen(verb);
13927
13928 if (len >= strlen(verb) && !memcmp__builtin_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 -EINVAL22; \
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 -EINVAL22; \
13943 ptr += arg_len; len -= arg_len;
13944
13945
13946/*
13947** Parse a control command
13948*/
13949
13950static 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_longunsigned long target;
13957
13958 bzero(uc, sizeof(*uc))(__builtin_constant_p(0) ? (__builtin_constant_p(((sizeof(*uc
)))) ? __constant_c_and_count_memset((((uc))),((0x01010101UL*
(unsigned char)(0))),(((sizeof(*uc))))) : __constant_c_memset
((((uc))),((0x01010101UL*(unsigned char)(0))),(((sizeof(*uc))
)))) : (__builtin_constant_p(((sizeof(*uc)))) ? __memset_generic
(((((uc)))),(((0))),((((sizeof(*uc)))))) : __memset_generic((
((uc))),((0)),(((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_SETSYNC10;
13965 else if ((arg_len = is_keyword(ptr, len, "settags")) != 0)
13966 uc->cmd = UC_SETTAGS11;
13967 else if ((arg_len = is_keyword(ptr, len, "setorder")) != 0)
13968 uc->cmd = UC_SETORDER13;
13969 else if ((arg_len = is_keyword(ptr, len, "setverbose")) != 0)
13970 uc->cmd = UC_SETVERBOSE17;
13971 else if ((arg_len = is_keyword(ptr, len, "setwide")) != 0)
13972 uc->cmd = UC_SETWIDE14;
13973 else if ((arg_len = is_keyword(ptr, len, "setdebug")) != 0)
13974 uc->cmd = UC_SETDEBUG12;
13975 else if ((arg_len = is_keyword(ptr, len, "setflag")) != 0)
13976 uc->cmd = UC_SETFLAG15;
13977 else if ((arg_len = is_keyword(ptr, len, "resetdev")) != 0)
13978 uc->cmd = UC_RESETDEV18;
13979 else if ((arg_len = is_keyword(ptr, len, "cleardev")) != 0)
13980 uc->cmd = UC_CLEARDEV19;
13981 else
13982 arg_len = 0;
13983
13984#ifdef DEBUG_PROC_INFO
13985printk("ncr_user_command: arg_len=%d, cmd=%ld\n", arg_len, uc->cmd);
13986#endif
13987
13988 if (!arg_len)
13989 return -EINVAL22;
13990 ptr += arg_len; len -= arg_len;
13991
13992 switch(uc->cmd) {
13993 case UC_SETSYNC10:
13994 case UC_SETTAGS11:
13995 case UC_SETWIDE14:
13996 case UC_SETFLAG15:
13997 case UC_RESETDEV18:
13998 case UC_CLEARDEV19:
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
14007printk("ncr_user_command: target=%ld\n", target);
14008#endif
14009 }
14010 break;
14011 }
14012
14013 switch(uc->cmd) {
14014 case UC_SETVERBOSE17:
14015 case UC_SETSYNC10:
14016 case UC_SETTAGS11:
14017 case UC_SETWIDE14:
14018 SKIP_SPACES(1);
14019 GET_INT_ARG(uc->data);
14020#ifdef DEBUG_PROC_INFO
14021printk("ncr_user_command: data=%ld\n", uc->data);
14022#endif
14023 break;
14024 case UC_SETORDER13:
14025 SKIP_SPACES(1);
14026 if ((arg_len = is_keyword(ptr, len, "simple")))
14027 uc->data = M_SIMPLE_TAG(0x20);
14028 else if ((arg_len = is_keyword(ptr, len, "ordered")))
14029 uc->data = M_ORDERED_TAG(0x22);
14030 else if ((arg_len = is_keyword(ptr, len, "default")))
14031 uc->data = 0;
14032 else
14033 return -EINVAL22;
14034 break;
14035 case UC_SETDEBUG12:
14036 while (len > 0) {
14037 SKIP_SPACES(1);
14038 if ((arg_len = is_keyword(ptr, len, "alloc")))
14039 uc->data |= DEBUG_ALLOC(0x0001);
14040 else if ((arg_len = is_keyword(ptr, len, "phase")))
14041 uc->data |= DEBUG_PHASE(0x0002);
14042 else if ((arg_len = is_keyword(ptr, len, "queue")))
14043 uc->data |= DEBUG_QUEUE(0x0008);
14044 else if ((arg_len = is_keyword(ptr, len, "result")))
14045 uc->data |= DEBUG_RESULT(0x0010);
14046 else if ((arg_len = is_keyword(ptr, len, "pointer")))
14047 uc->data |= DEBUG_POINTER(0x0020);
14048 else if ((arg_len = is_keyword(ptr, len, "script")))
14049 uc->data |= DEBUG_SCRIPT(0x0040);
14050 else if ((arg_len = is_keyword(ptr, len, "tiny")))
14051 uc->data |= DEBUG_TINY(0x0080);
14052 else if ((arg_len = is_keyword(ptr, len, "timing")))
14053 uc->data |= DEBUG_TIMING(0x0100);
14054 else if ((arg_len = is_keyword(ptr, len, "nego")))
14055 uc->data |= DEBUG_NEGO(0x0200);
14056 else if ((arg_len = is_keyword(ptr, len, "tags")))
14057 uc->data |= DEBUG_TAGS(0x0400);
14058 else
14059 return -EINVAL22;
14060 ptr += arg_len; len -= arg_len;
14061 }
14062#ifdef DEBUG_PROC_INFO
14063printk("ncr_user_command: data=%ld\n", uc->data);
14064#endif
14065 break;
14066 case UC_SETFLAG15:
14067 while (len > 0) {
14068 SKIP_SPACES(1);
14069 if ((arg_len = is_keyword(ptr, len, "trace")))
14070 uc->data |= UF_TRACE(0x01);
14071 else if ((arg_len = is_keyword(ptr, len, "no_disc")))
14072 uc->data |= UF_NODISC(0x02);
14073 else
14074 return -EINVAL22;
14075 ptr += arg_len; len -= arg_len;
14076 }
14077 break;
14078 default:
14079 break;
14080 }
14081
14082 if (len)
14083 return -EINVAL22;
14084 else {
14085 long flags;
14086
14087 NCR_LOCK_NCB(np, flags)do { __asm__ __volatile__("pushf ; pop %0" : "=r" (flags): :"memory"
); __asm__ __volatile__ ("cli": : :"memory"); } while (0)
;
14088 ncr_usercmd (np);
14089 NCR_UNLOCK_NCB(np, flags)do { __asm__ __volatile__("push %0 ; popf": :"g" (flags):"memory"
); } while (0)
;
14090 }
14091 return length;
14092}
14093
14094#endif /* SCSI_NCR_USER_COMMAND_SUPPORT */
14095
14096#ifdef SCSI_NCR_USER_INFO_SUPPORT
14097
14098struct info_str
14099{
14100 char *buffer;
14101 int length;
14102 int offset;
14103 int pos;
14104};
14105
14106static 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)(__builtin_constant_p(len) ? __constant_memcpy((info->buffer
+ info->pos),(data),(len)) : __memcpy((info->buffer + info
->pos),(data),(len)))
;
14122 info->pos += len;
14123 }
14124}
14125
14126static 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)__builtin_va_start(args,fmt);
14133 len = vsprintflinux_vsprintf(buf, fmt, args);
14134 va_end(args)__builtin_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
14144static 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"sym53c" "%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(8));
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
14197static 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
14206printk("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 -EINVAL22;
14221
14222 if (func) {
14223#ifdef SCSI_NCR_USER_COMMAND_SUPPORT
14224 retv = ncr_user_command(ncb, buffer, length);
14225#else
14226 retv = -EINVAL22;
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 = -EINVAL22;
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 */
14268static void __init
14269S24C16_set_bit(ncr_slot *np, u_charunsigned char write_bit, u_charunsigned 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)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_gpreg))))) = (((*gpreg))
))
;
14288 UDELAY (5);
14289}
14290
14291/*
14292 * Send START condition to NVRAM to wake it up.
14293 */
14294static void __init S24C16_start(ncr_slot *np, u_charunsigned 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 */
14305static void __init S24C16_stop(ncr_slot *np, u_charunsigned 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 */
14315static void __init
14316S24C16_do_bit(ncr_slot *np, u_charunsigned char *read_bit, u_charunsigned char write_bit, u_charunsigned 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)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->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 */
14330static void __init
14331S24C16_write_ack(ncr_slot *np, u_charunsigned char write_bit, u_charunsigned char *gpreg, u_charunsigned char *gpcntl)
14332{
14333 OUTB (nc_gpcntl, *gpcntl & 0xfe)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_gpcntl))))) = (((*gpcntl
& 0xfe))))
;
14334 S24C16_do_bit(np, 0, write_bit, gpreg);
14335 OUTB (nc_gpcntl, *gpcntl)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->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 */
14342static void __init
14343S24C16_read_ack(ncr_slot *np, u_charunsigned char *read_bit, u_charunsigned char *gpreg, u_charunsigned char *gpcntl)
14344{
14345 OUTB (nc_gpcntl, *gpcntl | 0x01)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_gpcntl))))) = (((*gpcntl
| 0x01))))
;
14346 S24C16_do_bit(np, read_bit, 1, gpreg);
14347 OUTB (nc_gpcntl, *gpcntl)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->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 */
14354static void __init
14355S24C16_write_byte(ncr_slot *np, u_charunsigned char *ack_data, u_charunsigned char write_data,
14356 u_charunsigned char *gpreg, u_charunsigned 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 */
14370static void __init
14371S24C16_read_byte(ncr_slot *np, u_charunsigned char *read_data, u_charunsigned char ack_data,
14372 u_charunsigned char *gpreg, u_charunsigned char *gpcntl)
14373{
14374 int x;
14375 u_charunsigned 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 */
14389static int __init
14390sym_read_S24C16_nvram (ncr_slot *np, int offset, u_charunsigned char *data, int len)
14391{
14392 u_charunsigned char gpcntl, gpreg;
14393 u_charunsigned char old_gpcntl, old_gpreg;
14394 u_charunsigned 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)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_gpreg)))))
;
14400 old_gpcntl = INB (nc_gpcntl)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->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)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_gpreg))))) = (((old_gpreg
))))
;
14405 OUTB (nc_gpcntl, gpcntl)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->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)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->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)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_gpcntl))))) = (((gpcntl)
)))
;
14450 S24C16_stop(np, &gpreg);
14451 retv = 0;
14452out:
14453 /* return GPIO0/1 to original states after having accessed NVRAM */
14454 OUTB (nc_gpcntl, old_gpcntl)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_gpcntl))))) = (((old_gpcntl
))))
;
14455 OUTB (nc_gpreg, old_gpreg)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->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 */
14469static int __init sym_read_Symbios_nvram (ncr_slot *np, Symbios_nvram *nvram)
14470{
14471 static u_charunsigned char Symbios_trailer[6] = {0xfe, 0xfe, 0, 0, 0, 0};
14472 u_charunsigned char *data = (u_charunsigned char *) nvram;
14473 int len = sizeof(*nvram);
14474 u_shortunsigned 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_ADDRESS0x100, data, len))
14479 return 1;
14480
14481 /* check valid NVRAM signature, verify byte count and checksum */
14482 if (nvram->type != 0 ||
14483 memcmp__builtin_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 */
14510static void __init T93C46_Clk(ncr_slot *np, u_charunsigned char *gpreg)
14511{
14512 OUTB (nc_gpreg, *gpreg | 0x04)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_gpreg))))) = (((*gpreg |
0x04))))
;
14513 UDELAY (2);
14514 OUTB (nc_gpreg, *gpreg)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_gpreg))))) = (((*gpreg))
))
;
14515}
14516
14517/*
14518 * Read bit from NVRAM
14519 */
14520static void __init T93C46_Read_Bit(ncr_slot *np, u_charunsigned char *read_bit, u_charunsigned char *gpreg)
14521{
14522 UDELAY (2);
14523 T93C46_Clk(np, gpreg);
14524 *read_bit = INB (nc_gpreg)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_gpreg)))))
;
14525}
14526
14527/*
14528 * Write bit to GPIO0
14529 */
14530static void __init T93C46_Write_Bit(ncr_slot *np, u_charunsigned char write_bit, u_charunsigned 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)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->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 */
14548static void __init T93C46_Stop(ncr_slot *np, u_charunsigned char *gpreg)
14549{
14550 *gpreg &= 0xef;
14551 OUTB (nc_gpreg, *gpreg)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_gpreg))))) = (((*gpreg))
))
;
14552 UDELAY (2);
14553
14554 T93C46_Clk(np, gpreg);
14555}
14556
14557/*
14558 * Send read command and address to NVRAM
14559 */
14560static void __init
14561T93C46_Send_Command(ncr_slot *np, u_shortunsigned short write_data,
14562 u_charunsigned char *read_bit, u_charunsigned 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_charunsigned char) (write_data >> (8 - x)), gpreg);
14569
14570 *read_bit = INB (nc_gpreg)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_gpreg)))))
;
14571}
14572
14573/*
14574 * READ 2 bytes from the NVRAM
14575 */
14576static void __init
14577T93C46_Read_Word(ncr_slot *np, u_shortunsigned short *nvram_data, u_charunsigned char *gpreg)
14578{
14579 int x;
14580 u_charunsigned 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 */
14596static int __init
14597T93C46_Read_Data(ncr_slot *np, u_shortunsigned short *data,int len,u_charunsigned char *gpreg)
14598{
14599 u_charunsigned 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 */
14618static int __init
14619sym_read_T93C46_nvram (ncr_slot *np, Tekram_nvram *nvram)
14620{
14621 u_charunsigned char gpcntl, gpreg;
14622 u_charunsigned char old_gpcntl, old_gpreg;
14623 int retv = 1;
14624
14625 /* save current state of GPCNTL and GPREG */
14626 old_gpreg = INB (nc_gpreg)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->nc_gpreg)))))
;
14627 old_gpcntl = INB (nc_gpcntl)(*(volatile unsigned char *) ((char *)np->reg + (((size_t)
(&((struct ncr_reg *)0)->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)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_gpreg))))) = (((gpreg)))
)
;
14633 gpcntl = (old_gpcntl & 0xe9) | 0x09;
14634 OUTB (nc_gpcntl, gpcntl)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_gpcntl))))) = (((gpcntl)
)))
;
14635
14636 /* input all of NVRAM, 64 words */
14637 retv = T93C46_Read_Data(np, (u_shortunsigned 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)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_gpcntl))))) = (((old_gpcntl
))))
;
14642 OUTB (nc_gpreg, old_gpreg)((*(volatile unsigned char *) ((char *)np->reg + (((size_t
) (&((struct ncr_reg *)0)->nc_gpreg))))) = (((old_gpreg
))))
;
14643
14644 return retv;
14645}
14646
14647/*
14648 * Try reading Tekram NVRAM.
14649 * Return 0 if OK.
14650 */
14651static int __init
14652sym_read_Tekram_nvram (ncr_slot *np, u_shortunsigned short device_id, Tekram_nvram *nvram)
14653{
14654 u_charunsigned char *data = (u_charunsigned char *) nvram;
14655 int len = sizeof(*nvram);
14656 u_shortunsigned short csum;
14657 int x;
14658
14659 switch (device_id) {
14660 case PCI_DEVICE_ID_NCR_53C8850x000d:
14661 case PCI_DEVICE_ID_NCR_53C8950x000c:
14662 case PCI_DEVICE_ID_NCR_53C8960x000b:
14663 x = sym_read_S24C16_nvram(np, TEKRAM_24C16_NVRAM_ADDRESS0x40,
14664 data, len);
14665 break;
14666 case PCI_DEVICE_ID_NCR_53C8750x000f:
14667 x = sym_read_S24C16_nvram(np, TEKRAM_24C16_NVRAM_ADDRESS0x40,
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
14694Scsi_Host_Template driver_template = SYM53C8XX;
14695#include "scsi_module.c"
14696#endif