|
|
1.1 ! root 1: /****************************************************************************** ! 2: ** High Performance device driver for the Symbios 53C896 controller. ! 3: ** ! 4: ** Copyright (C) 1998-2000 Gerard Roudier <[email protected]> ! 5: ** ! 6: ** This driver also supports all the Symbios 53C8XX controller family, ! 7: ** except 53C810 revisions < 16, 53C825 revisions < 16 and all ! 8: ** revisions of 53C815 controllers. ! 9: ** ! 10: ** This driver is based on the Linux port of the FreeBSD ncr driver. ! 11: ** ! 12: ** Copyright (C) 1994 Wolfgang Stanglmeier ! 13: ** ! 14: **----------------------------------------------------------------------------- ! 15: ** ! 16: ** This program is free software; you can redistribute it and/or modify ! 17: ** it under the terms of the GNU General Public License as published by ! 18: ** the Free Software Foundation; either version 2 of the License, or ! 19: ** (at your option) any later version. ! 20: ** ! 21: ** This program is distributed in the hope that it will be useful, ! 22: ** but WITHOUT ANY WARRANTY; without even the implied warranty of ! 23: ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! 24: ** GNU General Public License for more details. ! 25: ** ! 26: ** You should have received a copy of the GNU General Public License ! 27: ** along with this program; if not, write to the Free Software ! 28: ** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ! 29: ** ! 30: **----------------------------------------------------------------------------- ! 31: ** ! 32: ** The Linux port of the FreeBSD ncr driver has been achieved in ! 33: ** november 1995 by: ! 34: ** ! 35: ** Gerard Roudier <[email protected]> ! 36: ** ! 37: ** Being given that this driver originates from the FreeBSD version, and ! 38: ** in order to keep synergy on both, any suggested enhancements and corrections ! 39: ** received on Linux are automatically a potential candidate for the FreeBSD ! 40: ** version. ! 41: ** ! 42: ** The original driver has been written for 386bsd and FreeBSD by ! 43: ** Wolfgang Stanglmeier <[email protected]> ! 44: ** Stefan Esser <[email protected]> ! 45: ** ! 46: **----------------------------------------------------------------------------- ! 47: ** ! 48: ** Major contributions: ! 49: ** -------------------- ! 50: ** ! 51: ** NVRAM detection and reading. ! 52: ** Copyright (C) 1997 Richard Waltham <[email protected]> ! 53: ** ! 54: ******************************************************************************* ! 55: */ ! 56: ! 57: /* ! 58: ** Supported SCSI features: ! 59: ** Synchronous data transfers ! 60: ** Wide16 SCSI BUS ! 61: ** Disconnection/Reselection ! 62: ** Tagged command queuing ! 63: ** SCSI Parity checking ! 64: ** ! 65: ** Supported NCR/SYMBIOS chips: ! 66: ** 53C810A (8 bits, Fast 10, no rom BIOS) ! 67: ** 53C825A (Wide, Fast 10, on-board rom BIOS) ! 68: ** 53C860 (8 bits, Fast 20, no rom BIOS) ! 69: ** 53C875 (Wide, Fast 20, on-board rom BIOS) ! 70: ** 53C876 (Wide, Fast 20 Dual, on-board rom BIOS) ! 71: ** 53C895 (Wide, Fast 40, on-board rom BIOS) ! 72: ** 53C895A (Wide, Fast 40, on-board rom BIOS) ! 73: ** 53C896 (Wide, Fast 40 Dual, on-board rom BIOS) ! 74: ** 53C897 (Wide, Fast 40 Dual, on-board rom BIOS) ! 75: ** 53C1510D (Wide, Fast 40 Dual, on-board rom BIOS) ! 76: ** 53C1010 (Wide, Fast 80 Dual, on-board rom BIOS) ! 77: ** 53C1010_66(Wide, Fast 80 Dual, on-board rom BIOS, 33/66MHz PCI) ! 78: ** ! 79: ** Other features: ! 80: ** Memory mapped IO ! 81: ** Module ! 82: ** Shared IRQ ! 83: */ ! 84: ! 85: /* ! 86: ** Name and version of the driver ! 87: */ ! 88: #define SCSI_NCR_DRIVER_NAME "sym53c8xx-1.7.1-20000726" ! 89: ! 90: #define SCSI_NCR_DEBUG_FLAGS (0) ! 91: ! 92: #define NAME53C "sym53c" ! 93: #define NAME53C8XX "sym53c8xx" ! 94: ! 95: /*========================================================== ! 96: ** ! 97: ** Include files ! 98: ** ! 99: **========================================================== ! 100: */ ! 101: ! 102: #define LinuxVersionCode(v, p, s) (((v)<<16)+((p)<<8)+(s)) ! 103: ! 104: #ifdef MODULE ! 105: #include <linux/module.h> ! 106: #endif ! 107: ! 108: #include <asm/dma.h> ! 109: #include <asm/io.h> ! 110: #include <asm/system.h> ! 111: #if LINUX_VERSION_CODE >= LinuxVersionCode(2,3,17) ! 112: #include <linux/spinlock.h> ! 113: #elif LINUX_VERSION_CODE >= LinuxVersionCode(2,1,93) ! 114: #include <asm/spinlock.h> ! 115: #endif ! 116: #include <linux/delay.h> ! 117: #include <linux/signal.h> ! 118: #include <linux/sched.h> ! 119: #include <linux/errno.h> ! 120: #include <linux/pci.h> ! 121: #include <linux/string.h> ! 122: #include <linux/malloc.h> ! 123: #include <linux/mm.h> ! 124: #include <linux/ioport.h> ! 125: #include <linux/time.h> ! 126: #include <linux/timer.h> ! 127: #include <linux/stat.h> ! 128: ! 129: #include <linux/version.h> ! 130: #include <linux/blk.h> ! 131: ! 132: #ifdef CONFIG_ALL_PPC ! 133: #include <asm/prom.h> ! 134: #endif ! 135: ! 136: #if LINUX_VERSION_CODE >= LinuxVersionCode(2,1,35) ! 137: #include <linux/init.h> ! 138: #endif ! 139: ! 140: #ifndef __init ! 141: #define __init ! 142: #endif ! 143: #ifndef __initdata ! 144: #define __initdata ! 145: #endif ! 146: ! 147: #if LINUX_VERSION_CODE <= LinuxVersionCode(2,1,92) ! 148: #include <linux/bios32.h> ! 149: #endif ! 150: ! 151: #include "scsi.h" ! 152: #include "hosts.h" ! 153: #include "constants.h" ! 154: #include "sd.h" ! 155: ! 156: #include <linux/types.h> ! 157: ! 158: /* ! 159: ** Define BITS_PER_LONG for earlier linux versions. ! 160: */ ! 161: #ifndef BITS_PER_LONG ! 162: #if (~0UL) == 0xffffffffUL ! 163: #define BITS_PER_LONG 32 ! 164: #else ! 165: #define BITS_PER_LONG 64 ! 166: #endif ! 167: #endif ! 168: ! 169: /* ! 170: ** Define the BSD style u_int32 and u_int64 type. ! 171: ** Are in fact u_int32_t and u_int64_t :-) ! 172: */ ! 173: typedef u32 u_int32; ! 174: typedef u64 u_int64; ! 175: ! 176: #include "sym53c8xx.h" ! 177: ! 178: /* ! 179: ** Donnot compile integrity checking code for Linux-2.3.0 ! 180: ** and above since SCSI data structures are not ready yet. ! 181: */ ! 182: /* #if LINUX_VERSION_CODE < LinuxVersionCode(2,3,0) */ ! 183: #if 0 ! 184: #define SCSI_NCR_INTEGRITY_CHECKING ! 185: #endif ! 186: ! 187: #define MIN(a,b) (((a) < (b)) ? (a) : (b)) ! 188: #define MAX(a,b) (((a) > (b)) ? (a) : (b)) ! 189: ! 190: /* ! 191: ** Hmmm... What complex some PCI-HOST bridges actually are, ! 192: ** despite the fact that the PCI specifications are looking ! 193: ** so smart and simple! ;-) ! 194: */ ! 195: #if LINUX_VERSION_CODE >= LinuxVersionCode(2,3,47) ! 196: #define SCSI_NCR_DYNAMIC_DMA_MAPPING ! 197: #endif ! 198: ! 199: /*========================================================== ! 200: ** ! 201: ** A la VMS/CAM-3 queue management. ! 202: ** Implemented from linux list management. ! 203: ** ! 204: **========================================================== ! 205: */ ! 206: ! 207: typedef struct xpt_quehead { ! 208: struct xpt_quehead *flink; /* Forward pointer */ ! 209: struct xpt_quehead *blink; /* Backward pointer */ ! 210: } XPT_QUEHEAD; ! 211: ! 212: #define xpt_que_init(ptr) do { \ ! 213: (ptr)->flink = (ptr); (ptr)->blink = (ptr); \ ! 214: } while (0) ! 215: ! 216: static inline void __xpt_que_add(struct xpt_quehead * new, ! 217: struct xpt_quehead * blink, ! 218: struct xpt_quehead * flink) ! 219: { ! 220: flink->blink = new; ! 221: new->flink = flink; ! 222: new->blink = blink; ! 223: blink->flink = new; ! 224: } ! 225: ! 226: static inline void __xpt_que_del(struct xpt_quehead * blink, ! 227: struct xpt_quehead * flink) ! 228: { ! 229: flink->blink = blink; ! 230: blink->flink = flink; ! 231: } ! 232: ! 233: static inline int xpt_que_empty(struct xpt_quehead *head) ! 234: { ! 235: return head->flink == head; ! 236: } ! 237: ! 238: static inline void xpt_que_splice(struct xpt_quehead *list, ! 239: struct xpt_quehead *head) ! 240: { ! 241: struct xpt_quehead *first = list->flink; ! 242: ! 243: if (first != list) { ! 244: struct xpt_quehead *last = list->blink; ! 245: struct xpt_quehead *at = head->flink; ! 246: ! 247: first->blink = head; ! 248: head->flink = first; ! 249: ! 250: last->flink = at; ! 251: at->blink = last; ! 252: } ! 253: } ! 254: ! 255: #define xpt_que_entry(ptr, type, member) \ ! 256: ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member))) ! 257: ! 258: ! 259: #define xpt_insque(new, pos) __xpt_que_add(new, pos, (pos)->flink) ! 260: ! 261: #define xpt_remque(el) __xpt_que_del((el)->blink, (el)->flink) ! 262: ! 263: #define xpt_insque_head(new, head) __xpt_que_add(new, head, (head)->flink) ! 264: ! 265: static inline struct xpt_quehead *xpt_remque_head(struct xpt_quehead *head) ! 266: { ! 267: struct xpt_quehead *elem = head->flink; ! 268: ! 269: if (elem != head) ! 270: __xpt_que_del(head, elem->flink); ! 271: else ! 272: elem = 0; ! 273: return elem; ! 274: } ! 275: ! 276: #define xpt_insque_tail(new, head) __xpt_que_add(new, (head)->blink, head) ! 277: ! 278: static inline struct xpt_quehead *xpt_remque_tail(struct xpt_quehead *head) ! 279: { ! 280: struct xpt_quehead *elem = head->blink; ! 281: ! 282: if (elem != head) ! 283: __xpt_que_del(elem->blink, head); ! 284: else ! 285: elem = 0; ! 286: return elem; ! 287: } ! 288: ! 289: /*========================================================== ! 290: ** ! 291: ** Configuration and Debugging ! 292: ** ! 293: **========================================================== ! 294: */ ! 295: ! 296: /* ! 297: ** SCSI address of this device. ! 298: ** The boot routines should have set it. ! 299: ** If not, use this. ! 300: */ ! 301: ! 302: #ifndef SCSI_NCR_MYADDR ! 303: #define SCSI_NCR_MYADDR (7) ! 304: #endif ! 305: ! 306: /* ! 307: ** The maximum number of tags per logic unit. ! 308: ** Used only for devices that support tags. ! 309: */ ! 310: ! 311: #ifndef SCSI_NCR_MAX_TAGS ! 312: #define SCSI_NCR_MAX_TAGS (8) ! 313: #endif ! 314: ! 315: /* ! 316: ** TAGS are actually unlimited (256 tags/lun). ! 317: ** But Linux only supports 255. :) ! 318: */ ! 319: #if SCSI_NCR_MAX_TAGS > 255 ! 320: #define MAX_TAGS 255 ! 321: #else ! 322: #define MAX_TAGS SCSI_NCR_MAX_TAGS ! 323: #endif ! 324: ! 325: /* ! 326: ** Since the ncr chips only have a 8 bit ALU, we try to be clever ! 327: ** about offset calculation in the TASK TABLE per LUN that is an ! 328: ** array of DWORDS = 4 bytes. ! 329: */ ! 330: #if MAX_TAGS > (512/4) ! 331: #define MAX_TASKS (1024/4) ! 332: #elif MAX_TAGS > (256/4) ! 333: #define MAX_TASKS (512/4) ! 334: #else ! 335: #define MAX_TASKS (256/4) ! 336: #endif ! 337: ! 338: /* ! 339: ** This one means 'NO TAG for this job' ! 340: */ ! 341: #define NO_TAG (256) ! 342: ! 343: /* ! 344: ** Number of targets supported by the driver. ! 345: ** n permits target numbers 0..n-1. ! 346: ** Default is 16, meaning targets #0..#15. ! 347: ** #7 .. is myself. ! 348: */ ! 349: ! 350: #ifdef SCSI_NCR_MAX_TARGET ! 351: #define MAX_TARGET (SCSI_NCR_MAX_TARGET) ! 352: #else ! 353: #define MAX_TARGET (16) ! 354: #endif ! 355: ! 356: /* ! 357: ** Number of logic units supported by the driver. ! 358: ** n enables logic unit numbers 0..n-1. ! 359: ** The common SCSI devices require only ! 360: ** one lun, so take 1 as the default. ! 361: */ ! 362: ! 363: #ifdef SCSI_NCR_MAX_LUN ! 364: #define MAX_LUN 64 ! 365: #else ! 366: #define MAX_LUN (1) ! 367: #endif ! 368: ! 369: /* ! 370: ** Asynchronous pre-scaler (ns). Shall be 40 for ! 371: ** the SCSI timings to be compliant. ! 372: */ ! 373: ! 374: #ifndef SCSI_NCR_MIN_ASYNC ! 375: #define SCSI_NCR_MIN_ASYNC (40) ! 376: #endif ! 377: ! 378: /* ! 379: ** The maximum number of jobs scheduled for starting. ! 380: ** We allocate 4 entries more than the value we announce ! 381: ** to the SCSI upper layer. Guess why ! :-) ! 382: */ ! 383: ! 384: #ifdef SCSI_NCR_CAN_QUEUE ! 385: #define MAX_START (SCSI_NCR_CAN_QUEUE + 4) ! 386: #else ! 387: #define MAX_START (MAX_TARGET + 7 * MAX_TAGS) ! 388: #endif ! 389: ! 390: /* ! 391: ** We donnot want to allocate more than 1 PAGE for the ! 392: ** the start queue and the done queue. We hard-code entry ! 393: ** size to 8 in order to let cpp do the checking. ! 394: ** Allows 512-4=508 pending IOs for i386 but Linux seems for ! 395: ** now not able to provide the driver with this amount of IOs. ! 396: */ ! 397: #if MAX_START > PAGE_SIZE/8 ! 398: #undef MAX_START ! 399: #define MAX_START (PAGE_SIZE/8) ! 400: #endif ! 401: ! 402: /* ! 403: ** The maximum number of segments a transfer is split into. ! 404: ** We support up to 127 segments for both read and write. ! 405: */ ! 406: ! 407: #define MAX_SCATTER (SCSI_NCR_MAX_SCATTER) ! 408: #define SCR_SG_SIZE (2) ! 409: ! 410: /* ! 411: ** other ! 412: */ ! 413: ! 414: #define NCR_SNOOP_TIMEOUT (1000000) ! 415: ! 416: /*========================================================== ! 417: ** ! 418: ** Miscallaneous BSDish defines. ! 419: ** ! 420: **========================================================== ! 421: */ ! 422: ! 423: #define u_char unsigned char ! 424: #define u_short unsigned short ! 425: #define u_int unsigned int ! 426: #define u_long unsigned long ! 427: ! 428: #ifndef bcopy ! 429: #define bcopy(s, d, n) memcpy((d), (s), (n)) ! 430: #endif ! 431: ! 432: #ifndef bzero ! 433: #define bzero(d, n) memset((d), 0, (n)) ! 434: #endif ! 435: ! 436: #ifndef offsetof ! 437: #define offsetof(t, m) ((size_t) (&((t *)0)->m)) ! 438: #endif ! 439: ! 440: /* ! 441: ** Simple Wrapper to kernel PCI bus interface. ! 442: ** ! 443: ** This wrapper allows to get rid of old kernel PCI interface ! 444: ** and still allows to preserve linux-2.0 compatibilty. ! 445: ** In fact, it is mostly an incomplete emulation of the new ! 446: ** PCI code for pre-2.2 kernels. When kernel-2.0 support ! 447: ** will be dropped, we will just have to remove most of this ! 448: ** code. ! 449: */ ! 450: ! 451: #if LINUX_VERSION_CODE >= LinuxVersionCode(2,2,0) ! 452: ! 453: typedef struct pci_dev *pcidev_t; ! 454: #define PCIDEV_NULL (0) ! 455: #define PciBusNumber(d) (d)->bus->number ! 456: #define PciDeviceFn(d) (d)->devfn ! 457: #define PciVendorId(d) (d)->vendor ! 458: #define PciDeviceId(d) (d)->device ! 459: #define PciIrqLine(d) (d)->irq ! 460: ! 461: #if LINUX_VERSION_CODE > LinuxVersionCode(2,3,12) ! 462: ! 463: static int __init ! 464: pci_get_base_address(struct pci_dev *pdev, int index, u_long *base) ! 465: { ! 466: *base = pdev->resource[index].start; ! 467: if ((pdev->resource[index].flags & 0x7) == 0x4) ! 468: ++index; ! 469: return ++index; ! 470: } ! 471: #else ! 472: static int __init ! 473: pci_get_base_address(struct pci_dev *pdev, int index, u_long *base) ! 474: { ! 475: *base = pdev->base_address[index++]; ! 476: if ((*base & 0x7) == 0x4) { ! 477: #if BITS_PER_LONG > 32 ! 478: *base |= (((u_long)pdev->base_address[index]) << 32); ! 479: #endif ! 480: ++index; ! 481: } ! 482: return index; ! 483: } ! 484: #endif ! 485: ! 486: #else /* Incomplete emulation of current PCI code for pre-2.2 kernels */ ! 487: ! 488: typedef unsigned int pcidev_t; ! 489: #define PCIDEV_NULL (~0u) ! 490: #define PciBusNumber(d) ((d)>>8) ! 491: #define PciDeviceFn(d) ((d)&0xff) ! 492: #define __PciDev(busn, devfn) (((busn)<<8)+(devfn)) ! 493: ! 494: #define pci_present pcibios_present ! 495: ! 496: #define pci_read_config_byte(d, w, v) \ ! 497: pcibios_read_config_byte(PciBusNumber(d), PciDeviceFn(d), w, v) ! 498: #define pci_read_config_word(d, w, v) \ ! 499: pcibios_read_config_word(PciBusNumber(d), PciDeviceFn(d), w, v) ! 500: #define pci_read_config_dword(d, w, v) \ ! 501: pcibios_read_config_dword(PciBusNumber(d), PciDeviceFn(d), w, v) ! 502: ! 503: #define pci_write_config_byte(d, w, v) \ ! 504: pcibios_write_config_byte(PciBusNumber(d), PciDeviceFn(d), w, v) ! 505: #define pci_write_config_word(d, w, v) \ ! 506: pcibios_write_config_word(PciBusNumber(d), PciDeviceFn(d), w, v) ! 507: #define pci_write_config_dword(d, w, v) \ ! 508: pcibios_write_config_dword(PciBusNumber(d), PciDeviceFn(d), w, v) ! 509: ! 510: static pcidev_t __init ! 511: pci_find_device(unsigned int vendor, unsigned int device, pcidev_t prev) ! 512: { ! 513: static unsigned short pci_index; ! 514: int retv; ! 515: unsigned char bus_number, device_fn; ! 516: ! 517: if (prev == PCIDEV_NULL) ! 518: pci_index = 0; ! 519: else ! 520: ++pci_index; ! 521: retv = pcibios_find_device (vendor, device, pci_index, ! 522: &bus_number, &device_fn); ! 523: return retv ? PCIDEV_NULL : __PciDev(bus_number, device_fn); ! 524: } ! 525: ! 526: static u_short __init PciVendorId(pcidev_t dev) ! 527: { ! 528: u_short vendor_id; ! 529: pci_read_config_word(dev, PCI_VENDOR_ID, &vendor_id); ! 530: return vendor_id; ! 531: } ! 532: ! 533: static u_short __init PciDeviceId(pcidev_t dev) ! 534: { ! 535: u_short device_id; ! 536: pci_read_config_word(dev, PCI_DEVICE_ID, &device_id); ! 537: return device_id; ! 538: } ! 539: ! 540: static u_int __init PciIrqLine(pcidev_t dev) ! 541: { ! 542: u_char irq; ! 543: pci_read_config_byte(dev, PCI_INTERRUPT_LINE, &irq); ! 544: return irq; ! 545: } ! 546: ! 547: static int __init ! 548: pci_get_base_address(pcidev_t dev, int offset, u_long *base) ! 549: { ! 550: u_int32 tmp; ! 551: ! 552: pci_read_config_dword(dev, PCI_BASE_ADDRESS_0 + offset, &tmp); ! 553: *base = tmp; ! 554: offset += sizeof(u_int32); ! 555: if ((tmp & 0x7) == 0x4) { ! 556: #if BITS_PER_LONG > 32 ! 557: pci_read_config_dword(dev, PCI_BASE_ADDRESS_0 + offset, &tmp); ! 558: *base |= (((u_long)tmp) << 32); ! 559: #endif ! 560: offset += sizeof(u_int32); ! 561: } ! 562: return offset; ! 563: } ! 564: ! 565: #endif /* LINUX_VERSION_CODE >= LinuxVersionCode(2,2,0) */ ! 566: ! 567: /*========================================================== ! 568: ** ! 569: ** Debugging tags ! 570: ** ! 571: **========================================================== ! 572: */ ! 573: ! 574: #define DEBUG_ALLOC (0x0001) ! 575: #define DEBUG_PHASE (0x0002) ! 576: #define DEBUG_QUEUE (0x0008) ! 577: #define DEBUG_RESULT (0x0010) ! 578: #define DEBUG_POINTER (0x0020) ! 579: #define DEBUG_SCRIPT (0x0040) ! 580: #define DEBUG_TINY (0x0080) ! 581: #define DEBUG_TIMING (0x0100) ! 582: #define DEBUG_NEGO (0x0200) ! 583: #define DEBUG_TAGS (0x0400) ! 584: #define DEBUG_IC (0x0800) ! 585: ! 586: /* ! 587: ** Enable/Disable debug messages. ! 588: ** Can be changed at runtime too. ! 589: */ ! 590: ! 591: #ifdef SCSI_NCR_DEBUG_INFO_SUPPORT ! 592: static int ncr_debug = SCSI_NCR_DEBUG_FLAGS; ! 593: #define DEBUG_FLAGS ncr_debug ! 594: #else ! 595: #define DEBUG_FLAGS SCSI_NCR_DEBUG_FLAGS ! 596: #endif ! 597: ! 598: /* ! 599: ** SMP threading. ! 600: ** ! 601: ** Assuming that SMP systems are generally high end systems and may ! 602: ** use several SCSI adapters, we are using one lock per controller ! 603: ** instead of some global one. For the moment (linux-2.1.95), driver's ! 604: ** entry points are called with the 'io_request_lock' lock held, so: ! 605: ** - We are uselessly loosing a couple of micro-seconds to lock the ! 606: ** controller data structure. ! 607: ** - But the driver is not broken by design for SMP and so can be ! 608: ** more resistant to bugs or bad changes in the IO sub-system code. ! 609: ** - A small advantage could be that the interrupt code is grained as ! 610: ** wished (e.g.: threaded by controller). ! 611: */ ! 612: ! 613: #if LINUX_VERSION_CODE >= LinuxVersionCode(2,1,93) ! 614: ! 615: spinlock_t sym53c8xx_lock = SPIN_LOCK_UNLOCKED; ! 616: #define NCR_LOCK_DRIVER(flags) spin_lock_irqsave(&sym53c8xx_lock, flags) ! 617: #define NCR_UNLOCK_DRIVER(flags) spin_unlock_irqrestore(&sym53c8xx_lock,flags) ! 618: ! 619: #define NCR_INIT_LOCK_NCB(np) spin_lock_init(&np->smp_lock); ! 620: #define NCR_LOCK_NCB(np, flags) spin_lock_irqsave(&np->smp_lock, flags) ! 621: #define NCR_UNLOCK_NCB(np, flags) spin_unlock_irqrestore(&np->smp_lock, flags) ! 622: ! 623: #define NCR_LOCK_SCSI_DONE(np, flags) \ ! 624: spin_lock_irqsave(&io_request_lock, flags) ! 625: #define NCR_UNLOCK_SCSI_DONE(np, flags) \ ! 626: spin_unlock_irqrestore(&io_request_lock, flags) ! 627: ! 628: #else ! 629: ! 630: #define NCR_LOCK_DRIVER(flags) do { save_flags(flags); cli(); } while (0) ! 631: #define NCR_UNLOCK_DRIVER(flags) do { restore_flags(flags); } while (0) ! 632: ! 633: #define NCR_INIT_LOCK_NCB(np) do { } while (0) ! 634: #define NCR_LOCK_NCB(np, flags) do { save_flags(flags); cli(); } while (0) ! 635: #define NCR_UNLOCK_NCB(np, flags) do { restore_flags(flags); } while (0) ! 636: ! 637: #define NCR_LOCK_SCSI_DONE(np, flags) do {;} while (0) ! 638: #define NCR_UNLOCK_SCSI_DONE(np, flags) do {;} while (0) ! 639: ! 640: #endif ! 641: ! 642: /* ! 643: ** Memory mapped IO ! 644: ** ! 645: ** Since linux-2.1, we must use ioremap() to map the io memory space. ! 646: ** iounmap() to unmap it. That allows portability. ! 647: ** Linux 1.3.X and 2.0.X allow to remap physical pages addresses greater ! 648: ** than the highest physical memory address to kernel virtual pages with ! 649: ** vremap() / vfree(). That was not portable but worked with i386 ! 650: ** architecture. ! 651: */ ! 652: ! 653: #if LINUX_VERSION_CODE < LinuxVersionCode(2,1,0) ! 654: #define ioremap vremap ! 655: #define iounmap vfree ! 656: #endif ! 657: ! 658: #ifdef __sparc__ ! 659: # include <asm/irq.h> ! 660: # if LINUX_VERSION_CODE < LinuxVersionCode(2,3,0) ! 661: /* ioremap/iounmap broken in 2.2.x on Sparc. -DaveM */ ! 662: # define ioremap(base, size) ((u_long) __va(base)) ! 663: # define iounmap(vaddr) ! 664: # endif ! 665: # define pcivtobus(p) bus_dvma_to_mem(p) ! 666: # define memcpy_to_pci(a, b, c) memcpy_toio((void *)(a), (const void *)(b), (c)) ! 667: #elif defined(__alpha__) ! 668: # define pcivtobus(p) ((p) & 0xfffffffful) ! 669: # define memcpy_to_pci(a, b, c) memcpy_toio((a), (b), (c)) ! 670: #else /* others */ ! 671: # define pcivtobus(p) (p) ! 672: # define memcpy_to_pci(a, b, c) memcpy_toio((a), (b), (c)) ! 673: #endif ! 674: ! 675: #ifndef SCSI_NCR_PCI_MEM_NOT_SUPPORTED ! 676: static u_long __init remap_pci_mem(u_long base, u_long size) ! 677: { ! 678: u_long page_base = ((u_long) base) & PAGE_MASK; ! 679: u_long page_offs = ((u_long) base) - page_base; ! 680: u_long page_remapped = (u_long) ioremap(page_base, page_offs+size); ! 681: ! 682: return page_remapped? (page_remapped + page_offs) : 0UL; ! 683: } ! 684: ! 685: static void __init unmap_pci_mem(u_long vaddr, u_long size) ! 686: { ! 687: if (vaddr) ! 688: iounmap((void *) (vaddr & PAGE_MASK)); ! 689: } ! 690: ! 691: #endif /* not def SCSI_NCR_PCI_MEM_NOT_SUPPORTED */ ! 692: ! 693: /* ! 694: ** Insert a delay in micro-seconds and milli-seconds. ! 695: ** ------------------------------------------------- ! 696: ** Under Linux, udelay() is restricted to delay < 1 milli-second. ! 697: ** In fact, it generally works for up to 1 second delay. ! 698: ** Since 2.1.105, the mdelay() function is provided for delays ! 699: ** in milli-seconds. ! 700: ** Under 2.0 kernels, udelay() is an inline function that is very ! 701: ** inaccurate on Pentium processors. ! 702: */ ! 703: ! 704: #if LINUX_VERSION_CODE >= LinuxVersionCode(2,1,105) ! 705: #define UDELAY udelay ! 706: #define MDELAY mdelay ! 707: #else ! 708: static void UDELAY(long us) { udelay(us); } ! 709: static void MDELAY(long ms) { while (ms--) UDELAY(1000); } ! 710: #endif ! 711: ! 712: /* ! 713: ** Simple power of two buddy-like allocator ! 714: ** ---------------------------------------- ! 715: ** This simple code is not intended to be fast, but to provide ! 716: ** power of 2 aligned memory allocations. ! 717: ** Since the SCRIPTS processor only supplies 8 bit arithmetic, ! 718: ** this allocator allows simple and fast address calculations ! 719: ** from the SCRIPTS code. In addition, cache line alignment ! 720: ** is guaranteed for power of 2 cache line size. ! 721: ** Enhanced in linux-2.3.44 to provide a memory pool per pcidev ! 722: ** to support dynamic dma mapping. (I would have preferred a ! 723: ** real bus astraction, btw). ! 724: */ ! 725: ! 726: #if LINUX_VERSION_CODE >= LinuxVersionCode(2,1,0) ! 727: #define __GetFreePages(flags, order) __get_free_pages(flags, order) ! 728: #else ! 729: #define __GetFreePages(flags, order) __get_free_pages(flags, order, 0) ! 730: #endif ! 731: ! 732: #define MEMO_SHIFT 4 /* 16 bytes minimum memory chunk */ ! 733: #if PAGE_SIZE >= 8192 ! 734: #define MEMO_PAGE_ORDER 0 /* 1 PAGE maximum */ ! 735: #else ! 736: #define MEMO_PAGE_ORDER 1 /* 2 PAGES maximum */ ! 737: #endif ! 738: #define MEMO_FREE_UNUSED /* Free unused pages immediately */ ! 739: #define MEMO_WARN 1 ! 740: #define MEMO_GFP_FLAGS GFP_ATOMIC ! 741: #define MEMO_CLUSTER_SHIFT (PAGE_SHIFT+MEMO_PAGE_ORDER) ! 742: #define MEMO_CLUSTER_SIZE (1UL << MEMO_CLUSTER_SHIFT) ! 743: #define MEMO_CLUSTER_MASK (MEMO_CLUSTER_SIZE-1) ! 744: ! 745: typedef u_long m_addr_t; /* Enough bits to bit-hack addresses */ ! 746: typedef pcidev_t m_bush_t; /* Something that addresses DMAable */ ! 747: ! 748: typedef struct m_link { /* Link between free memory chunks */ ! 749: struct m_link *next; ! 750: } m_link_s; ! 751: ! 752: #ifdef SCSI_NCR_DYNAMIC_DMA_MAPPING ! 753: typedef struct m_vtob { /* Virtual to Bus address translation */ ! 754: struct m_vtob *next; ! 755: m_addr_t vaddr; ! 756: m_addr_t baddr; ! 757: } m_vtob_s; ! 758: #define VTOB_HASH_SHIFT 5 ! 759: #define VTOB_HASH_SIZE (1UL << VTOB_HASH_SHIFT) ! 760: #define VTOB_HASH_MASK (VTOB_HASH_SIZE-1) ! 761: #define VTOB_HASH_CODE(m) \ ! 762: ((((m_addr_t) (m)) >> MEMO_CLUSTER_SHIFT) & VTOB_HASH_MASK) ! 763: #endif ! 764: ! 765: typedef struct m_pool { /* Memory pool of a given kind */ ! 766: #ifdef SCSI_NCR_DYNAMIC_DMA_MAPPING ! 767: m_bush_t bush; ! 768: m_addr_t (*getp)(struct m_pool *); ! 769: void (*freep)(struct m_pool *, m_addr_t); ! 770: #define M_GETP() mp->getp(mp) ! 771: #define M_FREEP(p) mp->freep(mp, p) ! 772: #define GetPages() __GetFreePages(MEMO_GFP_FLAGS, MEMO_PAGE_ORDER) ! 773: #define FreePages(p) free_pages(p, MEMO_PAGE_ORDER) ! 774: int nump; ! 775: m_vtob_s *(vtob[VTOB_HASH_SIZE]); ! 776: struct m_pool *next; ! 777: #else ! 778: #define M_GETP() __GetFreePages(MEMO_GFP_FLAGS, MEMO_PAGE_ORDER) ! 779: #define M_FREEP(p) free_pages(p, MEMO_PAGE_ORDER) ! 780: #endif /* SCSI_NCR_DYNAMIC_DMA_MAPPING */ ! 781: struct m_link h[PAGE_SHIFT-MEMO_SHIFT+MEMO_PAGE_ORDER+1]; ! 782: } m_pool_s; ! 783: ! 784: static void *___m_alloc(m_pool_s *mp, int size) ! 785: { ! 786: int i = 0; ! 787: int s = (1 << MEMO_SHIFT); ! 788: int j; ! 789: m_addr_t a; ! 790: m_link_s *h = mp->h; ! 791: ! 792: if (size > (PAGE_SIZE << MEMO_PAGE_ORDER)) ! 793: return 0; ! 794: ! 795: while (size > s) { ! 796: s <<= 1; ! 797: ++i; ! 798: } ! 799: ! 800: j = i; ! 801: while (!h[j].next) { ! 802: if (s == (PAGE_SIZE << MEMO_PAGE_ORDER)) { ! 803: h[j].next = (m_link_s *) M_GETP(); ! 804: if (h[j].next) ! 805: h[j].next->next = 0; ! 806: break; ! 807: } ! 808: ++j; ! 809: s <<= 1; ! 810: } ! 811: a = (m_addr_t) h[j].next; ! 812: if (a) { ! 813: h[j].next = h[j].next->next; ! 814: while (j > i) { ! 815: j -= 1; ! 816: s >>= 1; ! 817: h[j].next = (m_link_s *) (a+s); ! 818: h[j].next->next = 0; ! 819: } ! 820: } ! 821: #ifdef DEBUG ! 822: printk("___m_alloc(%d) = %p\n", size, (void *) a); ! 823: #endif ! 824: return (void *) a; ! 825: } ! 826: ! 827: static void ___m_free(m_pool_s *mp, void *ptr, int size) ! 828: { ! 829: int i = 0; ! 830: int s = (1 << MEMO_SHIFT); ! 831: m_link_s *q; ! 832: m_addr_t a, b; ! 833: m_link_s *h = mp->h; ! 834: ! 835: #ifdef DEBUG ! 836: printk("___m_free(%p, %d)\n", ptr, size); ! 837: #endif ! 838: ! 839: if (size > (PAGE_SIZE << MEMO_PAGE_ORDER)) ! 840: return; ! 841: ! 842: while (size > s) { ! 843: s <<= 1; ! 844: ++i; ! 845: } ! 846: ! 847: a = (m_addr_t) ptr; ! 848: ! 849: while (1) { ! 850: #ifdef MEMO_FREE_UNUSED ! 851: if (s == (PAGE_SIZE << MEMO_PAGE_ORDER)) { ! 852: M_FREEP(a); ! 853: break; ! 854: } ! 855: #endif ! 856: b = a ^ s; ! 857: q = &h[i]; ! 858: while (q->next && q->next != (m_link_s *) b) { ! 859: q = q->next; ! 860: } ! 861: if (!q->next) { ! 862: ((m_link_s *) a)->next = h[i].next; ! 863: h[i].next = (m_link_s *) a; ! 864: break; ! 865: } ! 866: q->next = q->next->next; ! 867: a = a & b; ! 868: s <<= 1; ! 869: ++i; ! 870: } ! 871: } ! 872: ! 873: static void *__m_calloc2(m_pool_s *mp, int size, char *name, int uflags) ! 874: { ! 875: void *p; ! 876: ! 877: p = ___m_alloc(mp, size); ! 878: ! 879: if (DEBUG_FLAGS & DEBUG_ALLOC) ! 880: printk ("new %-10s[%4d] @%p.\n", name, size, p); ! 881: ! 882: if (p) ! 883: bzero(p, size); ! 884: else if (uflags & MEMO_WARN) ! 885: printk (NAME53C8XX ": failed to allocate %s[%d]\n", name, size); ! 886: ! 887: return p; ! 888: } ! 889: ! 890: #define __m_calloc(mp, s, n) __m_calloc2(mp, s, n, MEMO_WARN) ! 891: ! 892: static void __m_free(m_pool_s *mp, void *ptr, int size, char *name) ! 893: { ! 894: if (DEBUG_FLAGS & DEBUG_ALLOC) ! 895: printk ("freeing %-10s[%4d] @%p.\n", name, size, ptr); ! 896: ! 897: ___m_free(mp, ptr, size); ! 898: ! 899: } ! 900: ! 901: /* ! 902: * With pci bus iommu support, we use a default pool of unmapped memory ! 903: * for memory we donnot need to DMA from/to and one pool per pcidev for ! 904: * memory accessed by the PCI chip. `mp0' is the default not DMAable pool. ! 905: */ ! 906: ! 907: #ifndef SCSI_NCR_DYNAMIC_DMA_MAPPING ! 908: ! 909: static m_pool_s mp0; ! 910: ! 911: #else ! 912: ! 913: static m_addr_t ___mp0_getp(m_pool_s *mp) ! 914: { ! 915: m_addr_t m = GetPages(); ! 916: if (m) ! 917: ++mp->nump; ! 918: return m; ! 919: } ! 920: ! 921: static void ___mp0_freep(m_pool_s *mp, m_addr_t m) ! 922: { ! 923: FreePages(m); ! 924: --mp->nump; ! 925: } ! 926: ! 927: static m_pool_s mp0 = {0, ___mp0_getp, ___mp0_freep}; ! 928: ! 929: #endif /* SCSI_NCR_DYNAMIC_DMA_MAPPING */ ! 930: ! 931: static void *m_calloc(int size, char *name) ! 932: { ! 933: u_long flags; ! 934: void *m; ! 935: NCR_LOCK_DRIVER(flags); ! 936: m = __m_calloc(&mp0, size, name); ! 937: NCR_UNLOCK_DRIVER(flags); ! 938: return m; ! 939: } ! 940: ! 941: static void m_free(void *ptr, int size, char *name) ! 942: { ! 943: u_long flags; ! 944: NCR_LOCK_DRIVER(flags); ! 945: __m_free(&mp0, ptr, size, name); ! 946: NCR_UNLOCK_DRIVER(flags); ! 947: } ! 948: ! 949: /* ! 950: * DMAable pools. ! 951: */ ! 952: ! 953: #ifndef SCSI_NCR_DYNAMIC_DMA_MAPPING ! 954: ! 955: /* Without pci bus iommu support, all the memory is assumed DMAable */ ! 956: ! 957: #define __m_calloc_dma(b, s, n) m_calloc(s, n) ! 958: #define __m_free_dma(b, p, s, n) m_free(p, s, n) ! 959: #define __vtobus(b, p) virt_to_bus(p) ! 960: ! 961: #else ! 962: ! 963: /* ! 964: * With pci bus iommu support, we maintain one pool per pcidev and a ! 965: * hashed reverse table for virtual to bus physical address translations. ! 966: */ ! 967: static m_addr_t ___dma_getp(m_pool_s *mp) ! 968: { ! 969: m_addr_t vp; ! 970: m_vtob_s *vbp; ! 971: ! 972: vbp = __m_calloc(&mp0, sizeof(*vbp), "VTOB"); ! 973: if (vbp) { ! 974: dma_addr_t daddr; ! 975: vp = (m_addr_t) pci_alloc_consistent(mp->bush, ! 976: PAGE_SIZE<<MEMO_PAGE_ORDER, ! 977: &daddr); ! 978: if (vp) { ! 979: int hc = VTOB_HASH_CODE(vp); ! 980: vbp->vaddr = vp; ! 981: vbp->baddr = daddr; ! 982: vbp->next = mp->vtob[hc]; ! 983: mp->vtob[hc] = vbp; ! 984: ++mp->nump; ! 985: return vp; ! 986: } ! 987: else ! 988: __m_free(&mp0, vbp, sizeof(*vbp), "VTOB"); ! 989: } ! 990: return 0; ! 991: } ! 992: ! 993: static void ___dma_freep(m_pool_s *mp, m_addr_t m) ! 994: { ! 995: m_vtob_s **vbpp, *vbp; ! 996: int hc = VTOB_HASH_CODE(m); ! 997: ! 998: vbpp = &mp->vtob[hc]; ! 999: while (*vbpp && (*vbpp)->vaddr != m) ! 1000: vbpp = &(*vbpp)->next; ! 1001: if (*vbpp) { ! 1002: vbp = *vbpp; ! 1003: *vbpp = (*vbpp)->next; ! 1004: pci_free_consistent(mp->bush, PAGE_SIZE<<MEMO_PAGE_ORDER, ! 1005: (void *)vbp->vaddr, (dma_addr_t)vbp->baddr); ! 1006: __m_free(&mp0, vbp, sizeof(*vbp), "VTOB"); ! 1007: --mp->nump; ! 1008: } ! 1009: } ! 1010: ! 1011: static inline m_pool_s *___get_dma_pool(m_bush_t bush) ! 1012: { ! 1013: m_pool_s *mp; ! 1014: for (mp = mp0.next; mp && mp->bush != bush; mp = mp->next); ! 1015: return mp; ! 1016: } ! 1017: ! 1018: static m_pool_s *___cre_dma_pool(m_bush_t bush) ! 1019: { ! 1020: m_pool_s *mp; ! 1021: mp = __m_calloc(&mp0, sizeof(*mp), "MPOOL"); ! 1022: if (mp) { ! 1023: bzero(mp, sizeof(*mp)); ! 1024: mp->bush = bush; ! 1025: mp->getp = ___dma_getp; ! 1026: mp->freep = ___dma_freep; ! 1027: mp->next = mp0.next; ! 1028: mp0.next = mp; ! 1029: } ! 1030: return mp; ! 1031: } ! 1032: ! 1033: static void ___del_dma_pool(m_pool_s *p) ! 1034: { ! 1035: struct m_pool **pp = &mp0.next; ! 1036: ! 1037: while (*pp && *pp != p) ! 1038: pp = &(*pp)->next; ! 1039: if (*pp) { ! 1040: *pp = (*pp)->next; ! 1041: __m_free(&mp0, p, sizeof(*p), "MPOOL"); ! 1042: } ! 1043: } ! 1044: ! 1045: static void *__m_calloc_dma(m_bush_t bush, int size, char *name) ! 1046: { ! 1047: u_long flags; ! 1048: struct m_pool *mp; ! 1049: void *m = 0; ! 1050: ! 1051: NCR_LOCK_DRIVER(flags); ! 1052: mp = ___get_dma_pool(bush); ! 1053: if (!mp) ! 1054: mp = ___cre_dma_pool(bush); ! 1055: if (mp) ! 1056: m = __m_calloc(mp, size, name); ! 1057: if (mp && !mp->nump) ! 1058: ___del_dma_pool(mp); ! 1059: NCR_UNLOCK_DRIVER(flags); ! 1060: ! 1061: return m; ! 1062: } ! 1063: ! 1064: static void __m_free_dma(m_bush_t bush, void *m, int size, char *name) ! 1065: { ! 1066: u_long flags; ! 1067: struct m_pool *mp; ! 1068: ! 1069: NCR_LOCK_DRIVER(flags); ! 1070: mp = ___get_dma_pool(bush); ! 1071: if (mp) ! 1072: __m_free(mp, m, size, name); ! 1073: if (mp && !mp->nump) ! 1074: ___del_dma_pool(mp); ! 1075: NCR_UNLOCK_DRIVER(flags); ! 1076: } ! 1077: ! 1078: static m_addr_t __vtobus(m_bush_t bush, void *m) ! 1079: { ! 1080: u_long flags; ! 1081: m_pool_s *mp; ! 1082: int hc = VTOB_HASH_CODE(m); ! 1083: m_vtob_s *vp = 0; ! 1084: m_addr_t a = ((m_addr_t) m) & ~MEMO_CLUSTER_MASK; ! 1085: ! 1086: NCR_LOCK_DRIVER(flags); ! 1087: mp = ___get_dma_pool(bush); ! 1088: if (mp) { ! 1089: vp = mp->vtob[hc]; ! 1090: while (vp && (m_addr_t) vp->vaddr != a) ! 1091: vp = vp->next; ! 1092: } ! 1093: NCR_UNLOCK_DRIVER(flags); ! 1094: return vp ? vp->baddr + (((m_addr_t) m) - a) : 0; ! 1095: } ! 1096: ! 1097: #endif /* SCSI_NCR_DYNAMIC_DMA_MAPPING */ ! 1098: ! 1099: #define _m_calloc_dma(np, s, n) __m_calloc_dma(np->pdev, s, n) ! 1100: #define _m_free_dma(np, p, s, n) __m_free_dma(np->pdev, p, s, n) ! 1101: #define m_calloc_dma(s, n) _m_calloc_dma(np, s, n) ! 1102: #define m_free_dma(p, s, n) _m_free_dma(np, p, s, n) ! 1103: #define _vtobus(np, p) __vtobus(np->pdev, p) ! 1104: #define vtobus(p) _vtobus(np, p) ! 1105: ! 1106: /* ! 1107: * Deal with DMA mapping/unmapping. ! 1108: */ ! 1109: ! 1110: #ifndef SCSI_NCR_DYNAMIC_DMA_MAPPING ! 1111: ! 1112: /* Linux versions prior to pci bus iommu kernel interface */ ! 1113: ! 1114: #define __unmap_scsi_data(pdev, cmd) do {; } while (0) ! 1115: #define __map_scsi_single_data(pdev, cmd) (__vtobus(pdev,(cmd)->request_buffer)) ! 1116: #define __map_scsi_sg_data(pdev, cmd) ((cmd)->use_sg) ! 1117: #define __sync_scsi_data(pdev, cmd) do {; } while (0) ! 1118: ! 1119: #define scsi_sg_dma_address(sc) vtobus((sc)->address) ! 1120: #define scsi_sg_dma_len(sc) ((sc)->length) ! 1121: ! 1122: #else ! 1123: ! 1124: /* Linux version with pci bus iommu kernel interface */ ! 1125: ! 1126: /* To keep track of the dma mapping (sg/single) that has been set */ ! 1127: #define __data_mapped SCp.phase ! 1128: #define __data_mapping SCp.have_data_in ! 1129: ! 1130: static void __unmap_scsi_data(pcidev_t pdev, Scsi_Cmnd *cmd) ! 1131: { ! 1132: int dma_dir = scsi_to_pci_dma_dir(cmd->sc_data_direction); ! 1133: ! 1134: switch(cmd->__data_mapped) { ! 1135: case 2: ! 1136: pci_unmap_sg(pdev, cmd->buffer, cmd->use_sg, dma_dir); ! 1137: break; ! 1138: case 1: ! 1139: pci_unmap_single(pdev, cmd->__data_mapping, ! 1140: cmd->request_bufflen, dma_dir); ! 1141: break; ! 1142: } ! 1143: cmd->__data_mapped = 0; ! 1144: } ! 1145: ! 1146: static u_long __map_scsi_single_data(pcidev_t pdev, Scsi_Cmnd *cmd) ! 1147: { ! 1148: dma_addr_t mapping; ! 1149: int dma_dir = scsi_to_pci_dma_dir(cmd->sc_data_direction); ! 1150: ! 1151: if (cmd->request_bufflen == 0) ! 1152: return 0; ! 1153: ! 1154: mapping = pci_map_single(pdev, cmd->request_buffer, ! 1155: cmd->request_bufflen, dma_dir); ! 1156: cmd->__data_mapped = 1; ! 1157: cmd->__data_mapping = mapping; ! 1158: ! 1159: return mapping; ! 1160: } ! 1161: ! 1162: static int __map_scsi_sg_data(pcidev_t pdev, Scsi_Cmnd *cmd) ! 1163: { ! 1164: int use_sg; ! 1165: int dma_dir = scsi_to_pci_dma_dir(cmd->sc_data_direction); ! 1166: ! 1167: if (cmd->use_sg == 0) ! 1168: return 0; ! 1169: ! 1170: use_sg = pci_map_sg(pdev, cmd->buffer, cmd->use_sg, dma_dir); ! 1171: cmd->__data_mapped = 2; ! 1172: cmd->__data_mapping = use_sg; ! 1173: ! 1174: return use_sg; ! 1175: } ! 1176: ! 1177: static void __sync_scsi_data(pcidev_t pdev, Scsi_Cmnd *cmd) ! 1178: { ! 1179: int dma_dir = scsi_to_pci_dma_dir(cmd->sc_data_direction); ! 1180: ! 1181: switch(cmd->__data_mapped) { ! 1182: case 2: ! 1183: pci_dma_sync_sg(pdev, cmd->buffer, cmd->use_sg, dma_dir); ! 1184: break; ! 1185: case 1: ! 1186: pci_dma_sync_single(pdev, cmd->__data_mapping, ! 1187: cmd->request_bufflen, dma_dir); ! 1188: break; ! 1189: } ! 1190: } ! 1191: ! 1192: #define scsi_sg_dma_address(sc) sg_dma_address(sc) ! 1193: #define scsi_sg_dma_len(sc) sg_dma_len(sc) ! 1194: ! 1195: #endif /* SCSI_NCR_DYNAMIC_DMA_MAPPING */ ! 1196: ! 1197: #define unmap_scsi_data(np, cmd) __unmap_scsi_data(np->pdev, cmd) ! 1198: #define map_scsi_single_data(np, cmd) __map_scsi_single_data(np->pdev, cmd) ! 1199: #define map_scsi_sg_data(np, cmd) __map_scsi_sg_data(np->pdev, cmd) ! 1200: #define sync_scsi_data(np, cmd) __sync_scsi_data(np->pdev, cmd) ! 1201: ! 1202: ! 1203: /* ! 1204: * Print out some buffer. ! 1205: */ ! 1206: static void ncr_print_hex(u_char *p, int n) ! 1207: { ! 1208: while (n-- > 0) ! 1209: printk (" %x", *p++); ! 1210: } ! 1211: ! 1212: static void ncr_printl_hex(char *label, u_char *p, int n) ! 1213: { ! 1214: printk("%s", label); ! 1215: ncr_print_hex(p, n); ! 1216: printk (".\n"); ! 1217: } ! 1218: ! 1219: /* ! 1220: ** Transfer direction ! 1221: ** ! 1222: ** Until some linux kernel version near 2.3.40, low-level scsi ! 1223: ** drivers were not told about data transfer direction. ! 1224: ** We check the existence of this feature that has been expected ! 1225: ** for a _long_ time by all SCSI driver developers by just ! 1226: ** testing against the definition of SCSI_DATA_UNKNOWN. Indeed ! 1227: ** this is a hack, but testing against a kernel version would ! 1228: ** have been a shame. ;-) ! 1229: */ ! 1230: #ifdef SCSI_DATA_UNKNOWN ! 1231: ! 1232: #define scsi_data_direction(cmd) (cmd->sc_data_direction) ! 1233: ! 1234: #else ! 1235: ! 1236: #define SCSI_DATA_UNKNOWN 0 ! 1237: #define SCSI_DATA_WRITE 1 ! 1238: #define SCSI_DATA_READ 2 ! 1239: #define SCSI_DATA_NONE 3 ! 1240: ! 1241: static __inline__ int scsi_data_direction(Scsi_Cmnd *cmd) ! 1242: { ! 1243: int direction; ! 1244: ! 1245: switch((int) cmd->cmnd[0]) { ! 1246: case 0x08: /* READ(6) 08 */ ! 1247: case 0x28: /* READ(10) 28 */ ! 1248: case 0xA8: /* READ(12) A8 */ ! 1249: direction = SCSI_DATA_READ; ! 1250: break; ! 1251: case 0x0A: /* WRITE(6) 0A */ ! 1252: case 0x2A: /* WRITE(10) 2A */ ! 1253: case 0xAA: /* WRITE(12) AA */ ! 1254: direction = SCSI_DATA_WRITE; ! 1255: break; ! 1256: default: ! 1257: direction = SCSI_DATA_UNKNOWN; ! 1258: break; ! 1259: } ! 1260: ! 1261: return direction; ! 1262: } ! 1263: ! 1264: #endif /* SCSI_DATA_UNKNOWN */ ! 1265: ! 1266: /* ! 1267: ** Head of list of NCR boards ! 1268: ** ! 1269: ** For kernel version < 1.3.70, host is retrieved by its irq level. ! 1270: ** For later kernels, the internal host control block address ! 1271: ** (struct ncb) is used as device id parameter of the irq stuff. ! 1272: */ ! 1273: ! 1274: static struct Scsi_Host *first_host = NULL; ! 1275: ! 1276: ! 1277: /* ! 1278: ** /proc directory entry and proc_info function ! 1279: */ ! 1280: #ifdef SCSI_NCR_PROC_INFO_SUPPORT ! 1281: #if LINUX_VERSION_CODE < LinuxVersionCode(2,3,27) ! 1282: static struct proc_dir_entry proc_scsi_sym53c8xx = { ! 1283: PROC_SCSI_SYM53C8XX, 9, NAME53C8XX, ! 1284: S_IFDIR | S_IRUGO | S_IXUGO, 2 ! 1285: }; ! 1286: #endif ! 1287: static int sym53c8xx_proc_info(char *buffer, char **start, off_t offset, ! 1288: int length, int hostno, int func); ! 1289: #endif ! 1290: ! 1291: /* ! 1292: ** Driver setup. ! 1293: ** ! 1294: ** This structure is initialized from linux config options. ! 1295: ** It can be overridden at boot-up by the boot command line. ! 1296: */ ! 1297: static struct ncr_driver_setup ! 1298: driver_setup = SCSI_NCR_DRIVER_SETUP; ! 1299: ! 1300: #ifdef SCSI_NCR_BOOT_COMMAND_LINE_SUPPORT ! 1301: static struct ncr_driver_setup ! 1302: driver_safe_setup __initdata = SCSI_NCR_DRIVER_SAFE_SETUP; ! 1303: # ifdef MODULE ! 1304: char *sym53c8xx = 0; /* command line passed by insmod */ ! 1305: # if LINUX_VERSION_CODE >= LinuxVersionCode(2,1,30) ! 1306: MODULE_PARM(sym53c8xx, "s"); ! 1307: # endif ! 1308: # endif ! 1309: #endif ! 1310: ! 1311: /* ! 1312: ** Other Linux definitions ! 1313: */ ! 1314: #define SetScsiResult(cmd, h_sts, s_sts) \ ! 1315: cmd->result = (((h_sts) << 16) + ((s_sts) & 0x7f)) ! 1316: ! 1317: /* We may have to remind our amnesiac SCSI layer of the reason of the abort */ ! 1318: #if 0 ! 1319: #define SetScsiAbortResult(cmd) \ ! 1320: SetScsiResult( \ ! 1321: cmd, \ ! 1322: (cmd)->abort_reason == DID_TIME_OUT ? DID_TIME_OUT : DID_ABORT, \ ! 1323: 0xff) ! 1324: #else ! 1325: #define SetScsiAbortResult(cmd) SetScsiResult(cmd, DID_ABORT, 0xff) ! 1326: #endif ! 1327: ! 1328: static void sym53c8xx_select_queue_depths( ! 1329: struct Scsi_Host *host, struct scsi_device *devlist); ! 1330: static void sym53c8xx_intr(int irq, void *dev_id, struct pt_regs * regs); ! 1331: static void sym53c8xx_timeout(unsigned long np); ! 1332: ! 1333: #define initverbose (driver_setup.verbose) ! 1334: #define bootverbose (np->verbose) ! 1335: ! 1336: #ifdef SCSI_NCR_NVRAM_SUPPORT ! 1337: static u_char Tekram_sync[16] __initdata = ! 1338: {25,31,37,43, 50,62,75,125, 12,15,18,21, 6,7,9,10}; ! 1339: #endif /* SCSI_NCR_NVRAM_SUPPORT */ ! 1340: ! 1341: /* ! 1342: ** Structures used by sym53c8xx_detect/sym53c8xx_pci_init to ! 1343: ** transmit device configuration to the ncr_attach() function. ! 1344: */ ! 1345: typedef struct { ! 1346: int bus; ! 1347: u_char device_fn; ! 1348: u_long base; ! 1349: u_long base_2; ! 1350: u_long io_port; ! 1351: int irq; ! 1352: /* port and reg fields to use INB, OUTB macros */ ! 1353: u_long base_io; ! 1354: volatile struct ncr_reg *reg; ! 1355: } ncr_slot; ! 1356: ! 1357: typedef struct { ! 1358: int type; ! 1359: #define SCSI_NCR_SYMBIOS_NVRAM (1) ! 1360: #define SCSI_NCR_TEKRAM_NVRAM (2) ! 1361: #ifdef SCSI_NCR_NVRAM_SUPPORT ! 1362: union { ! 1363: Symbios_nvram Symbios; ! 1364: Tekram_nvram Tekram; ! 1365: } data; ! 1366: #endif ! 1367: } ncr_nvram; ! 1368: ! 1369: /* ! 1370: ** Structure used by sym53c8xx_detect/sym53c8xx_pci_init ! 1371: ** to save data on each detected board for ncr_attach(). ! 1372: */ ! 1373: typedef struct { ! 1374: pcidev_t pdev; ! 1375: ncr_slot slot; ! 1376: ncr_chip chip; ! 1377: ncr_nvram *nvram; ! 1378: u_char host_id; ! 1379: #ifdef SCSI_NCR_PQS_PDS_SUPPORT ! 1380: u_char pqs_pds; ! 1381: #endif ! 1382: int attach_done; ! 1383: } ncr_device; ! 1384: ! 1385: /*========================================================== ! 1386: ** ! 1387: ** assert () ! 1388: ** ! 1389: **========================================================== ! 1390: ** ! 1391: ** modified copy from 386bsd:/usr/include/sys/assert.h ! 1392: ** ! 1393: **---------------------------------------------------------- ! 1394: */ ! 1395: ! 1396: #define assert(expression) { \ ! 1397: if (!(expression)) { \ ! 1398: (void)panic( \ ! 1399: "assertion \"%s\" failed: file \"%s\", line %d\n", \ ! 1400: #expression, \ ! 1401: __FILE__, __LINE__); \ ! 1402: } \ ! 1403: } ! 1404: ! 1405: /*========================================================== ! 1406: ** ! 1407: ** Command control block states. ! 1408: ** ! 1409: **========================================================== ! 1410: */ ! 1411: ! 1412: #define HS_IDLE (0) ! 1413: #define HS_BUSY (1) ! 1414: #define HS_NEGOTIATE (2) /* sync/wide data transfer*/ ! 1415: #define HS_DISCONNECT (3) /* Disconnected by target */ ! 1416: ! 1417: #define HS_DONEMASK (0x80) ! 1418: #define HS_COMPLETE (4|HS_DONEMASK) ! 1419: #define HS_SEL_TIMEOUT (5|HS_DONEMASK) /* Selection timeout */ ! 1420: #define HS_RESET (6|HS_DONEMASK) /* SCSI reset */ ! 1421: #define HS_ABORTED (7|HS_DONEMASK) /* Transfer aborted */ ! 1422: #define HS_TIMEOUT (8|HS_DONEMASK) /* Software timeout */ ! 1423: #define HS_FAIL (9|HS_DONEMASK) /* SCSI or PCI bus errors */ ! 1424: #define HS_UNEXPECTED (10|HS_DONEMASK)/* Unexpected disconnect */ ! 1425: ! 1426: #define DSA_INVALID 0xffffffff ! 1427: ! 1428: /*========================================================== ! 1429: ** ! 1430: ** Software Interrupt Codes ! 1431: ** ! 1432: **========================================================== ! 1433: */ ! 1434: ! 1435: #define SIR_BAD_STATUS (1) ! 1436: #define SIR_SEL_ATN_NO_MSG_OUT (2) ! 1437: #define SIR_MSG_RECEIVED (3) ! 1438: #define SIR_MSG_WEIRD (4) ! 1439: #define SIR_NEGO_FAILED (5) ! 1440: #define SIR_NEGO_PROTO (6) ! 1441: #define SIR_SCRIPT_STOPPED (7) ! 1442: #define SIR_REJECT_TO_SEND (8) ! 1443: #define SIR_SWIDE_OVERRUN (9) ! 1444: #define SIR_SODL_UNDERRUN (10) ! 1445: #define SIR_RESEL_NO_MSG_IN (11) ! 1446: #define SIR_RESEL_NO_IDENTIFY (12) ! 1447: #define SIR_RESEL_BAD_LUN (13) ! 1448: #define SIR_TARGET_SELECTED (14) ! 1449: #define SIR_RESEL_BAD_I_T_L (15) ! 1450: #define SIR_RESEL_BAD_I_T_L_Q (16) ! 1451: #define SIR_ABORT_SENT (17) ! 1452: #define SIR_RESEL_ABORTED (18) ! 1453: #define SIR_MSG_OUT_DONE (19) ! 1454: #define SIR_AUTO_SENSE_DONE (20) ! 1455: #define SIR_DUMMY_INTERRUPT (21) ! 1456: #define SIR_DATA_OVERRUN (22) ! 1457: #define SIR_BAD_PHASE (23) ! 1458: #define SIR_MAX (23) ! 1459: ! 1460: /*========================================================== ! 1461: ** ! 1462: ** Extended error bits. ! 1463: ** xerr_status field of struct ccb. ! 1464: ** ! 1465: **========================================================== ! 1466: */ ! 1467: ! 1468: #define XE_EXTRA_DATA (1) /* unexpected data phase */ ! 1469: #define XE_BAD_PHASE (2) /* illegal phase (4/5) */ ! 1470: #define XE_PARITY_ERR (4) /* unrecovered SCSI parity error */ ! 1471: #define XE_SODL_UNRUN (1<<3) ! 1472: #define XE_SWIDE_OVRUN (1<<4) ! 1473: ! 1474: /*========================================================== ! 1475: ** ! 1476: ** Negotiation status. ! 1477: ** nego_status field of struct ccb. ! 1478: ** ! 1479: **========================================================== ! 1480: */ ! 1481: ! 1482: #define NS_NOCHANGE (0) ! 1483: #define NS_SYNC (1) ! 1484: #define NS_WIDE (2) ! 1485: #define NS_PPR (4) ! 1486: ! 1487: /*========================================================== ! 1488: ** ! 1489: ** "Special features" of targets. ! 1490: ** quirks field of struct tcb. ! 1491: ** actualquirks field of struct ccb. ! 1492: ** ! 1493: **========================================================== ! 1494: */ ! 1495: ! 1496: #define QUIRK_AUTOSAVE (0x01) ! 1497: ! 1498: /*========================================================== ! 1499: ** ! 1500: ** Capability bits in Inquire response byte 7. ! 1501: ** ! 1502: **========================================================== ! 1503: */ ! 1504: ! 1505: #define INQ7_QUEUE (0x02) ! 1506: #define INQ7_SYNC (0x10) ! 1507: #define INQ7_WIDE16 (0x20) ! 1508: ! 1509: /*========================================================== ! 1510: ** ! 1511: ** A CCB hashed table is used to retrieve CCB address ! 1512: ** from DSA value. ! 1513: ** ! 1514: **========================================================== ! 1515: */ ! 1516: ! 1517: #define CCB_HASH_SHIFT 8 ! 1518: #define CCB_HASH_SIZE (1UL << CCB_HASH_SHIFT) ! 1519: #define CCB_HASH_MASK (CCB_HASH_SIZE-1) ! 1520: #define CCB_HASH_CODE(dsa) (((dsa) >> 11) & CCB_HASH_MASK) ! 1521: ! 1522: /*========================================================== ! 1523: ** ! 1524: ** Declaration of structs. ! 1525: ** ! 1526: **========================================================== ! 1527: */ ! 1528: ! 1529: struct tcb; ! 1530: struct lcb; ! 1531: struct ccb; ! 1532: struct ncb; ! 1533: struct script; ! 1534: ! 1535: typedef struct ncb * ncb_p; ! 1536: typedef struct tcb * tcb_p; ! 1537: typedef struct lcb * lcb_p; ! 1538: typedef struct ccb * ccb_p; ! 1539: ! 1540: struct link { ! 1541: ncrcmd l_cmd; ! 1542: ncrcmd l_paddr; ! 1543: }; ! 1544: ! 1545: struct usrcmd { ! 1546: u_long target; ! 1547: u_long lun; ! 1548: u_long data; ! 1549: u_long cmd; ! 1550: }; ! 1551: ! 1552: #define UC_SETSYNC 10 ! 1553: #define UC_SETTAGS 11 ! 1554: #define UC_SETDEBUG 12 ! 1555: #define UC_SETORDER 13 ! 1556: #define UC_SETWIDE 14 ! 1557: #define UC_SETFLAG 15 ! 1558: #define UC_SETVERBOSE 17 ! 1559: #define UC_RESETDEV 18 ! 1560: #define UC_CLEARDEV 19 ! 1561: ! 1562: #define UF_TRACE (0x01) ! 1563: #define UF_NODISC (0x02) ! 1564: #define UF_NOSCAN (0x04) ! 1565: ! 1566: /*======================================================================== ! 1567: ** ! 1568: ** Declaration of structs: target control block ! 1569: ** ! 1570: **======================================================================== ! 1571: */ ! 1572: struct tcb { ! 1573: /*---------------------------------------------------------------- ! 1574: ** LUN tables. ! 1575: ** An array of bus addresses is used on reselection by ! 1576: ** the SCRIPT. ! 1577: **---------------------------------------------------------------- ! 1578: */ ! 1579: u_int32 *luntbl; /* lcbs bus address table */ ! 1580: u_int32 b_luntbl; /* bus address of this table */ ! 1581: u_int32 b_lun0; /* bus address of lun0 */ ! 1582: lcb_p l0p; /* lcb of LUN #0 (normal case) */ ! 1583: #if MAX_LUN > 1 ! 1584: lcb_p *lmp; /* Other lcb's [1..MAX_LUN] */ ! 1585: #endif ! 1586: /*---------------------------------------------------------------- ! 1587: ** Target capabilities. ! 1588: **---------------------------------------------------------------- ! 1589: */ ! 1590: u_char inq_done; /* Target capabilities received */ ! 1591: u_char inq_byte7; /* Contains these capabilities */ ! 1592: ! 1593: /*---------------------------------------------------------------- ! 1594: ** Some flags. ! 1595: **---------------------------------------------------------------- ! 1596: */ ! 1597: u_char to_reset; /* This target is to be reset */ ! 1598: ! 1599: /*---------------------------------------------------------------- ! 1600: ** Pointer to the ccb used for negotiation. ! 1601: ** Prevent from starting a negotiation for all queued commands ! 1602: ** when tagged command queuing is enabled. ! 1603: **---------------------------------------------------------------- ! 1604: */ ! 1605: ccb_p nego_cp; ! 1606: ! 1607: /*---------------------------------------------------------------- ! 1608: ** negotiation of wide and synch transfer and device quirks. ! 1609: ** sval, wval and uval are read from SCRIPTS and so have alignment ! 1610: ** constraints. ! 1611: **---------------------------------------------------------------- ! 1612: */ ! 1613: /*0*/ u_char minsync; ! 1614: /*1*/ u_char sval; ! 1615: /*2*/ u_short period; ! 1616: /*0*/ u_char maxoffs; ! 1617: /*1*/ u_char quirks; ! 1618: /*2*/ u_char widedone; ! 1619: /*3*/ u_char wval; ! 1620: /*0*/ u_char uval; ! 1621: ! 1622: #ifdef SCSI_NCR_INTEGRITY_CHECKING ! 1623: u_char ic_min_sync; ! 1624: u_char ic_max_width; ! 1625: u_char ic_done; ! 1626: #endif ! 1627: u_char ic_maximums_set; ! 1628: u_char ppr_negotiation; ! 1629: ! 1630: /*---------------------------------------------------------------- ! 1631: ** User settable limits and options. ! 1632: ** These limits are read from the NVRAM if present. ! 1633: **---------------------------------------------------------------- ! 1634: */ ! 1635: u_char usrsync; ! 1636: u_char usrwide; ! 1637: u_short usrtags; ! 1638: u_char usrflag; ! 1639: }; ! 1640: ! 1641: /*======================================================================== ! 1642: ** ! 1643: ** Declaration of structs: lun control block ! 1644: ** ! 1645: **======================================================================== ! 1646: */ ! 1647: struct lcb { ! 1648: /*---------------------------------------------------------------- ! 1649: ** On reselection, SCRIPTS use this value as a JUMP address ! 1650: ** after the IDENTIFY has been successfully received. ! 1651: ** This field is set to 'resel_tag' if TCQ is enabled and ! 1652: ** to 'resel_notag' if TCQ is disabled. ! 1653: ** (Must be at zero due to bad lun handling on reselection) ! 1654: **---------------------------------------------------------------- ! 1655: */ ! 1656: /*0*/ u_int32 resel_task; ! 1657: ! 1658: /*---------------------------------------------------------------- ! 1659: ** Task table used by the script processor to retrieve the ! 1660: ** task corresponding to a reselected nexus. The TAG is used ! 1661: ** as offset to determine the corresponding entry. ! 1662: ** Each entry contains the associated CCB bus address. ! 1663: **---------------------------------------------------------------- ! 1664: */ ! 1665: u_int32 tasktbl_0; /* Used if TCQ not enabled */ ! 1666: u_int32 *tasktbl; ! 1667: u_int32 b_tasktbl; ! 1668: ! 1669: /*---------------------------------------------------------------- ! 1670: ** CCB queue management. ! 1671: **---------------------------------------------------------------- ! 1672: */ ! 1673: XPT_QUEHEAD busy_ccbq; /* Queue of busy CCBs */ ! 1674: XPT_QUEHEAD wait_ccbq; /* Queue of waiting for IO CCBs */ ! 1675: u_short busyccbs; /* CCBs busy for this lun */ ! 1676: u_short queuedccbs; /* CCBs queued to the controller*/ ! 1677: u_short queuedepth; /* Queue depth for this lun */ ! 1678: u_short scdev_depth; /* SCSI device queue depth */ ! 1679: u_short maxnxs; /* Max possible nexuses */ ! 1680: ! 1681: /*---------------------------------------------------------------- ! 1682: ** Control of tagged command queuing. ! 1683: ** Tags allocation is performed using a circular buffer. ! 1684: ** This avoids using a loop for tag allocation. ! 1685: **---------------------------------------------------------------- ! 1686: */ ! 1687: u_short ia_tag; /* Tag allocation index */ ! 1688: u_short if_tag; /* Tag release index */ ! 1689: u_char *cb_tags; /* Circular tags buffer */ ! 1690: u_char inq_byte7; /* Store unit CmdQ capability */ ! 1691: u_char usetags; /* Command queuing is active */ ! 1692: u_char to_clear; /* User wants to clear all tasks*/ ! 1693: u_short maxtags; /* Max NR of tags asked by user */ ! 1694: u_short numtags; /* Current number of tags */ ! 1695: ! 1696: /*---------------------------------------------------------------- ! 1697: ** QUEUE FULL and ORDERED tag control. ! 1698: **---------------------------------------------------------------- ! 1699: */ ! 1700: u_short num_good; /* Nr of GOOD since QUEUE FULL */ ! 1701: u_short tags_sum[2]; /* Tags sum counters */ ! 1702: u_char tags_si; /* Current index to tags sum */ ! 1703: u_long tags_stime; /* Last time we switch tags_sum */ ! 1704: }; ! 1705: ! 1706: /*======================================================================== ! 1707: ** ! 1708: ** Declaration of structs: actions for a task. ! 1709: ** ! 1710: **======================================================================== ! 1711: ** ! 1712: ** It is part of the CCB and is called by the scripts processor to ! 1713: ** start or restart the data structure (nexus). ! 1714: ** ! 1715: **------------------------------------------------------------------------ ! 1716: */ ! 1717: struct action { ! 1718: u_int32 start; ! 1719: u_int32 restart; ! 1720: }; ! 1721: ! 1722: /*======================================================================== ! 1723: ** ! 1724: ** Declaration of structs: Phase mismatch context. ! 1725: ** ! 1726: **======================================================================== ! 1727: ** ! 1728: ** It is part of the CCB and is used as parameters for the DATA ! 1729: ** pointer. We need two contexts to handle correctly the SAVED ! 1730: ** DATA POINTER. ! 1731: ** ! 1732: **------------------------------------------------------------------------ ! 1733: */ ! 1734: struct pm_ctx { ! 1735: struct scr_tblmove sg; /* Updated interrupted SG block */ ! 1736: u_int32 ret; /* SCRIPT return address */ ! 1737: }; ! 1738: ! 1739: /*======================================================================== ! 1740: ** ! 1741: ** Declaration of structs: global HEADER. ! 1742: ** ! 1743: **======================================================================== ! 1744: ** ! 1745: ** In earlier driver versions, this substructure was copied from the ! 1746: ** ccb to a global address after selection (or reselection) and copied ! 1747: ** back before disconnect. Since we are now using LOAD/STORE DSA ! 1748: ** RELATIVE instructions, the script is able to access directly these ! 1749: ** fields, and so, this header is no more copied. ! 1750: ** ! 1751: **------------------------------------------------------------------------ ! 1752: */ ! 1753: ! 1754: struct head { ! 1755: /*---------------------------------------------------------------- ! 1756: ** Start and restart SCRIPTS addresses (must be at 0). ! 1757: **---------------------------------------------------------------- ! 1758: */ ! 1759: struct action go; ! 1760: ! 1761: /*---------------------------------------------------------------- ! 1762: ** Saved data pointer. ! 1763: ** Points to the position in the script responsible for the ! 1764: ** actual transfer of data. ! 1765: ** It's written after reception of a SAVE_DATA_POINTER message. ! 1766: ** The goalpointer points after the last transfer command. ! 1767: **---------------------------------------------------------------- ! 1768: */ ! 1769: u_int32 savep; ! 1770: u_int32 lastp; ! 1771: u_int32 goalp; ! 1772: ! 1773: /*---------------------------------------------------------------- ! 1774: ** Alternate data pointer. ! 1775: ** They are copied back to savep/lastp/goalp by the SCRIPTS ! 1776: ** when the direction is unknown and the device claims data out. ! 1777: **---------------------------------------------------------------- ! 1778: */ ! 1779: u_int32 wlastp; ! 1780: u_int32 wgoalp; ! 1781: ! 1782: /*---------------------------------------------------------------- ! 1783: ** Status fields. ! 1784: **---------------------------------------------------------------- ! 1785: */ ! 1786: u_char status[4]; /* host status */ ! 1787: }; ! 1788: ! 1789: /* ! 1790: ** LUN control block lookup. ! 1791: ** We use a direct pointer for LUN #0, and a table of pointers ! 1792: ** which is only allocated for devices that support LUN(s) > 0. ! 1793: */ ! 1794: #if MAX_LUN <= 1 ! 1795: #define ncr_lp(np, tp, lun) (!lun) ? (tp)->l0p : 0 ! 1796: #else ! 1797: #define ncr_lp(np, tp, lun) \ ! 1798: (!lun) ? (tp)->l0p : (tp)->lmp ? (tp)->lmp[(lun)] : 0 ! 1799: #endif ! 1800: ! 1801: /* ! 1802: ** The status bytes are used by the host and the script processor. ! 1803: ** ! 1804: ** The four bytes (status[4]) are copied to the scratchb register ! 1805: ** (declared as scr0..scr3 in ncr_reg.h) just after the select/reselect, ! 1806: ** and copied back just after disconnecting. ! 1807: ** Inside the script the XX_REG are used. ! 1808: */ ! 1809: ! 1810: /* ! 1811: ** Last four bytes (script) ! 1812: */ ! 1813: #define QU_REG scr0 ! 1814: #define HS_REG scr1 ! 1815: #define HS_PRT nc_scr1 ! 1816: #define SS_REG scr2 ! 1817: #define SS_PRT nc_scr2 ! 1818: #define HF_REG scr3 ! 1819: #define HF_PRT nc_scr3 ! 1820: ! 1821: /* ! 1822: ** Last four bytes (host) ! 1823: */ ! 1824: #define actualquirks phys.header.status[0] ! 1825: #define host_status phys.header.status[1] ! 1826: #define scsi_status phys.header.status[2] ! 1827: #define host_flags phys.header.status[3] ! 1828: ! 1829: /* ! 1830: ** Host flags ! 1831: */ ! 1832: #define HF_IN_PM0 1u ! 1833: #define HF_IN_PM1 (1u<<1) ! 1834: #define HF_ACT_PM (1u<<2) ! 1835: #define HF_DP_SAVED (1u<<3) ! 1836: #define HF_AUTO_SENSE (1u<<4) ! 1837: #define HF_DATA_IN (1u<<5) ! 1838: #define HF_PM_TO_C (1u<<6) ! 1839: #define HF_EXT_ERR (1u<<7) ! 1840: ! 1841: #ifdef SCSI_NCR_IARB_SUPPORT ! 1842: #define HF_HINT_IARB (1u<<7) ! 1843: #endif ! 1844: ! 1845: /* ! 1846: ** This one is stolen from QU_REG.:) ! 1847: */ ! 1848: #define HF_DATA_ST (1u<<7) ! 1849: ! 1850: /*========================================================== ! 1851: ** ! 1852: ** Declaration of structs: Data structure block ! 1853: ** ! 1854: **========================================================== ! 1855: ** ! 1856: ** During execution of a ccb by the script processor, ! 1857: ** the DSA (data structure address) register points ! 1858: ** to this substructure of the ccb. ! 1859: ** This substructure contains the header with ! 1860: ** the script-processor-changable data and ! 1861: ** data blocks for the indirect move commands. ! 1862: ** ! 1863: **---------------------------------------------------------- ! 1864: */ ! 1865: ! 1866: struct dsb { ! 1867: ! 1868: /* ! 1869: ** Header. ! 1870: */ ! 1871: ! 1872: struct head header; ! 1873: ! 1874: /* ! 1875: ** Table data for Script ! 1876: */ ! 1877: ! 1878: struct scr_tblsel select; ! 1879: struct scr_tblmove smsg ; ! 1880: struct scr_tblmove smsg_ext ; ! 1881: struct scr_tblmove cmd ; ! 1882: struct scr_tblmove sense ; ! 1883: struct scr_tblmove wresid; ! 1884: struct scr_tblmove data [MAX_SCATTER]; ! 1885: ! 1886: /* ! 1887: ** Phase mismatch contexts. ! 1888: ** We need two to handle correctly the ! 1889: ** SAVED DATA POINTER. ! 1890: */ ! 1891: ! 1892: struct pm_ctx pm0; ! 1893: struct pm_ctx pm1; ! 1894: }; ! 1895: ! 1896: ! 1897: /*======================================================================== ! 1898: ** ! 1899: ** Declaration of structs: Command control block. ! 1900: ** ! 1901: **======================================================================== ! 1902: */ ! 1903: struct ccb { ! 1904: /*---------------------------------------------------------------- ! 1905: ** This is the data structure which is pointed by the DSA ! 1906: ** register when it is executed by the script processor. ! 1907: ** It must be the first entry. ! 1908: **---------------------------------------------------------------- ! 1909: */ ! 1910: struct dsb phys; ! 1911: ! 1912: /*---------------------------------------------------------------- ! 1913: ** The general SCSI driver provides a ! 1914: ** pointer to a control block. ! 1915: **---------------------------------------------------------------- ! 1916: */ ! 1917: Scsi_Cmnd *cmd; /* SCSI command */ ! 1918: u_char cdb_buf[16]; /* Copy of CDB */ ! 1919: u_char sense_buf[64]; ! 1920: int data_len; /* Total data length */ ! 1921: int segments; /* Number of SG segments */ ! 1922: ! 1923: /*---------------------------------------------------------------- ! 1924: ** Message areas. ! 1925: ** We prepare a message to be sent after selection. ! 1926: ** We may use a second one if the command is rescheduled ! 1927: ** due to CHECK_CONDITION or QUEUE FULL status. ! 1928: ** Contents are IDENTIFY and SIMPLE_TAG. ! 1929: ** While negotiating sync or wide transfer, ! 1930: ** a SDTR or WDTR message is appended. ! 1931: **---------------------------------------------------------------- ! 1932: */ ! 1933: u_char scsi_smsg [12]; ! 1934: u_char scsi_smsg2[12]; ! 1935: ! 1936: /*---------------------------------------------------------------- ! 1937: ** Miscellaneous status'. ! 1938: **---------------------------------------------------------------- ! 1939: */ ! 1940: u_char nego_status; /* Negotiation status */ ! 1941: u_char xerr_status; /* Extended error flags */ ! 1942: u_int32 extra_bytes; /* Extraneous bytes transferred */ ! 1943: ! 1944: /*---------------------------------------------------------------- ! 1945: ** Saved info for auto-sense ! 1946: **---------------------------------------------------------------- ! 1947: */ ! 1948: u_char sv_scsi_status; ! 1949: u_char sv_xerr_status; ! 1950: ! 1951: /*---------------------------------------------------------------- ! 1952: ** Other fields. ! 1953: **---------------------------------------------------------------- ! 1954: */ ! 1955: u_long p_ccb; /* BUS address of this CCB */ ! 1956: u_char sensecmd[6]; /* Sense command */ ! 1957: u_char to_abort; /* This CCB is to be aborted */ ! 1958: u_short tag; /* Tag for this transfer */ ! 1959: /* NO_TAG means no tag */ ! 1960: u_char tags_si; /* Lun tags sum index (0,1) */ ! 1961: ! 1962: u_char target; ! 1963: u_char lun; ! 1964: u_short queued; ! 1965: ccb_p link_ccb; /* Host adapter CCB chain */ ! 1966: ccb_p link_ccbh; /* Host adapter CCB hash chain */ ! 1967: XPT_QUEHEAD link_ccbq; /* Link to unit CCB queue */ ! 1968: u_int32 startp; /* Initial data pointer */ ! 1969: u_int32 lastp0; /* Initial 'lastp' */ ! 1970: int ext_sg; /* Extreme data pointer, used */ ! 1971: int ext_ofs; /* to calculate the residual. */ ! 1972: int resid; ! 1973: }; ! 1974: ! 1975: #define CCB_PHYS(cp,lbl) (cp->p_ccb + offsetof(struct ccb, lbl)) ! 1976: ! 1977: ! 1978: /*======================================================================== ! 1979: ** ! 1980: ** Declaration of structs: NCR device descriptor ! 1981: ** ! 1982: **======================================================================== ! 1983: */ ! 1984: struct ncb { ! 1985: /*---------------------------------------------------------------- ! 1986: ** Idle task and invalid task actions and their bus ! 1987: ** addresses. ! 1988: **---------------------------------------------------------------- ! 1989: */ ! 1990: struct action idletask; ! 1991: struct action notask; ! 1992: struct action bad_i_t_l; ! 1993: struct action bad_i_t_l_q; ! 1994: u_long p_idletask; ! 1995: u_long p_notask; ! 1996: u_long p_bad_i_t_l; ! 1997: u_long p_bad_i_t_l_q; ! 1998: ! 1999: /*---------------------------------------------------------------- ! 2000: ** Dummy lun table to protect us against target returning bad ! 2001: ** lun number on reselection. ! 2002: **---------------------------------------------------------------- ! 2003: */ ! 2004: u_int32 *badluntbl; /* Table physical address */ ! 2005: u_int32 resel_badlun; /* SCRIPT handler BUS address */ ! 2006: ! 2007: /*---------------------------------------------------------------- ! 2008: ** Bit 32-63 of the on-chip RAM bus address in LE format. ! 2009: ** The START_RAM64 script loads the MMRS and MMWS from this ! 2010: ** field. ! 2011: **---------------------------------------------------------------- ! 2012: */ ! 2013: u_int32 scr_ram_seg; ! 2014: ! 2015: /*---------------------------------------------------------------- ! 2016: ** CCBs management queues. ! 2017: **---------------------------------------------------------------- ! 2018: */ ! 2019: Scsi_Cmnd *waiting_list; /* Commands waiting for a CCB */ ! 2020: /* when lcb is not allocated. */ ! 2021: Scsi_Cmnd *done_list; /* Commands waiting for done() */ ! 2022: /* callback to be invoked. */ ! 2023: #if LINUX_VERSION_CODE >= LinuxVersionCode(2,1,93) ! 2024: spinlock_t smp_lock; /* Lock for SMP threading */ ! 2025: #endif ! 2026: ! 2027: /*---------------------------------------------------------------- ! 2028: ** Chip and controller indentification. ! 2029: **---------------------------------------------------------------- ! 2030: */ ! 2031: int unit; /* Unit number */ ! 2032: char chip_name[8]; /* Chip name */ ! 2033: char inst_name[16]; /* ncb instance name */ ! 2034: ! 2035: /*---------------------------------------------------------------- ! 2036: ** Initial value of some IO register bits. ! 2037: ** These values are assumed to have been set by BIOS, and may ! 2038: ** be used for probing adapter implementation differences. ! 2039: **---------------------------------------------------------------- ! 2040: */ ! 2041: u_char sv_scntl0, sv_scntl3, sv_dmode, sv_dcntl, sv_ctest3, sv_ctest4, ! 2042: sv_ctest5, sv_gpcntl, sv_stest2, sv_stest4, sv_stest1, sv_scntl4; ! 2043: ! 2044: /*---------------------------------------------------------------- ! 2045: ** Actual initial value of IO register bits used by the ! 2046: ** driver. They are loaded at initialisation according to ! 2047: ** features that are to be enabled. ! 2048: **---------------------------------------------------------------- ! 2049: */ ! 2050: u_char rv_scntl0, rv_scntl3, rv_dmode, rv_dcntl, rv_ctest3, rv_ctest4, ! 2051: rv_ctest5, rv_stest2, rv_ccntl0, rv_ccntl1, rv_scntl4; ! 2052: ! 2053: /*---------------------------------------------------------------- ! 2054: ** Target data. ! 2055: ** Target control block bus address array used by the SCRIPT ! 2056: ** on reselection. ! 2057: **---------------------------------------------------------------- ! 2058: */ ! 2059: struct tcb target[MAX_TARGET]; ! 2060: u_int32 *targtbl; ! 2061: ! 2062: /*---------------------------------------------------------------- ! 2063: ** Virtual and physical bus addresses of the chip. ! 2064: **---------------------------------------------------------------- ! 2065: */ ! 2066: #ifndef SCSI_NCR_PCI_MEM_NOT_SUPPORTED ! 2067: u_long base_va; /* MMIO base virtual address */ ! 2068: u_long base2_va; /* On-chip RAM virtual address */ ! 2069: #endif ! 2070: u_long base_ba; /* MMIO base bus address */ ! 2071: u_long base_io; /* IO space base address */ ! 2072: u_long base_ws; /* (MM)IO window size */ ! 2073: u_long base2_ba; /* On-chip RAM bus address */ ! 2074: u_long base2_ws; /* On-chip RAM window size */ ! 2075: u_int irq; /* IRQ number */ ! 2076: volatile /* Pointer to volatile for */ ! 2077: struct ncr_reg *reg; /* memory mapped IO. */ ! 2078: ! 2079: /*---------------------------------------------------------------- ! 2080: ** SCRIPTS virtual and physical bus addresses. ! 2081: ** 'script' is loaded in the on-chip RAM if present. ! 2082: ** 'scripth' stays in main memory for all chips except the ! 2083: ** 53C895A and 53C896 that provide 8K on-chip RAM. ! 2084: **---------------------------------------------------------------- ! 2085: */ ! 2086: struct script *script0; /* Copies of script and scripth */ ! 2087: struct scripth *scripth0; /* relocated for this ncb. */ ! 2088: u_long p_script; /* Actual script and scripth */ ! 2089: u_long p_scripth; /* bus addresses. */ ! 2090: u_long p_scripth0; ! 2091: ! 2092: /*---------------------------------------------------------------- ! 2093: ** General controller parameters and configuration. ! 2094: **---------------------------------------------------------------- ! 2095: */ ! 2096: pcidev_t pdev; ! 2097: u_short device_id; /* PCI device id */ ! 2098: u_char revision_id; /* PCI device revision id */ ! 2099: u_char bus; /* PCI BUS number */ ! 2100: u_char device_fn; /* PCI BUS device and function */ ! 2101: u_char myaddr; /* SCSI id of the adapter */ ! 2102: u_char maxburst; /* log base 2 of dwords burst */ ! 2103: u_char maxwide; /* Maximum transfer width */ ! 2104: u_char minsync; /* Minimum sync period factor */ ! 2105: u_char maxsync; /* Maximum sync period factor */ ! 2106: u_char maxoffs; /* Max scsi offset */ ! 2107: u_char multiplier; /* Clock multiplier (1,2,4) */ ! 2108: u_char clock_divn; /* Number of clock divisors */ ! 2109: u_long clock_khz; /* SCSI clock frequency in KHz */ ! 2110: u_int features; /* Chip features map */ ! 2111: ! 2112: /*---------------------------------------------------------------- ! 2113: ** Range for the PCI clock frequency measurement result ! 2114: ** that ensures the algorithm used by the driver can be ! 2115: ** trusted for the SCSI clock frequency measurement. ! 2116: ** (Assuming a PCI clock frequency of 33 MHz). ! 2117: **---------------------------------------------------------------- ! 2118: */ ! 2119: u_int pciclock_min; ! 2120: u_int pciclock_max; ! 2121: ! 2122: /*---------------------------------------------------------------- ! 2123: ** Start queue management. ! 2124: ** It is filled up by the host processor and accessed by the ! 2125: ** SCRIPTS processor in order to start SCSI commands. ! 2126: **---------------------------------------------------------------- ! 2127: */ ! 2128: u_long p_squeue; /* Start queue BUS address */ ! 2129: u_int32 *squeue; /* Start queue virtual address */ ! 2130: u_short squeueput; /* Next free slot of the queue */ ! 2131: u_short actccbs; /* Number of allocated CCBs */ ! 2132: u_short queuedepth; /* Start queue depth */ ! 2133: ! 2134: /*---------------------------------------------------------------- ! 2135: ** Command completion queue. ! 2136: ** It is the same size as the start queue to avoid overflow. ! 2137: **---------------------------------------------------------------- ! 2138: */ ! 2139: u_short dqueueget; /* Next position to scan */ ! 2140: u_int32 *dqueue; /* Completion (done) queue */ ! 2141: ! 2142: /*---------------------------------------------------------------- ! 2143: ** Timeout handler. ! 2144: **---------------------------------------------------------------- ! 2145: */ ! 2146: struct timer_list timer; /* Timer handler link header */ ! 2147: u_long lasttime; ! 2148: u_long settle_time; /* Resetting the SCSI BUS */ ! 2149: ! 2150: /*---------------------------------------------------------------- ! 2151: ** Debugging and profiling. ! 2152: **---------------------------------------------------------------- ! 2153: */ ! 2154: struct ncr_reg regdump; /* Register dump */ ! 2155: u_long regtime; /* Time it has been done */ ! 2156: ! 2157: /*---------------------------------------------------------------- ! 2158: ** Miscellaneous buffers accessed by the scripts-processor. ! 2159: ** They shall be DWORD aligned, because they may be read or ! 2160: ** written with a script command. ! 2161: **---------------------------------------------------------------- ! 2162: */ ! 2163: u_char msgout[12]; /* Buffer for MESSAGE OUT */ ! 2164: u_char msgin [12]; /* Buffer for MESSAGE IN */ ! 2165: u_int32 lastmsg; /* Last SCSI message sent */ ! 2166: u_char scratch; /* Scratch for SCSI receive */ ! 2167: ! 2168: /*---------------------------------------------------------------- ! 2169: ** Miscellaneous configuration and status parameters. ! 2170: **---------------------------------------------------------------- ! 2171: */ ! 2172: u_char scsi_mode; /* Current SCSI BUS mode */ ! 2173: u_char order; /* Tag order to use */ ! 2174: u_char verbose; /* Verbosity for this controller*/ ! 2175: u_int32 ncr_cache; /* Used for cache test at init. */ ! 2176: u_long p_ncb; /* BUS address of this NCB */ ! 2177: ! 2178: /*---------------------------------------------------------------- ! 2179: ** CCB lists and queue. ! 2180: **---------------------------------------------------------------- ! 2181: */ ! 2182: ccb_p ccbh[CCB_HASH_SIZE]; /* CCB hashed by DSA value */ ! 2183: struct ccb *ccbc; /* CCB chain */ ! 2184: XPT_QUEHEAD free_ccbq; /* Queue of available CCBs */ ! 2185: ! 2186: /*---------------------------------------------------------------- ! 2187: ** IMMEDIATE ARBITRATION (IARB) control. ! 2188: ** We keep track in 'last_cp' of the last CCB that has been ! 2189: ** queued to the SCRIPTS processor and clear 'last_cp' when ! 2190: ** this CCB completes. If last_cp is not zero at the moment ! 2191: ** we queue a new CCB, we set a flag in 'last_cp' that is ! 2192: ** used by the SCRIPTS as a hint for setting IARB. ! 2193: ** We donnot set more than 'iarb_max' consecutive hints for ! 2194: ** IARB in order to leave devices a chance to reselect. ! 2195: ** By the way, any non zero value of 'iarb_max' is unfair. :) ! 2196: **---------------------------------------------------------------- ! 2197: */ ! 2198: #ifdef SCSI_NCR_IARB_SUPPORT ! 2199: struct ccb *last_cp; /* Last queud CCB used for IARB */ ! 2200: u_short iarb_max; /* Max. # consecutive IARB hints*/ ! 2201: u_short iarb_count; /* Actual # of these hints */ ! 2202: #endif ! 2203: ! 2204: /*---------------------------------------------------------------- ! 2205: ** We need the LCB in order to handle disconnections and ! 2206: ** to count active CCBs for task management. So, we use ! 2207: ** a unique CCB for LUNs we donnot have the LCB yet. ! 2208: ** This queue normally should have at most 1 element. ! 2209: **---------------------------------------------------------------- ! 2210: */ ! 2211: XPT_QUEHEAD b0_ccbq; ! 2212: ! 2213: /*---------------------------------------------------------------- ! 2214: ** We use a different scatter function for 896 rev 1. ! 2215: **---------------------------------------------------------------- ! 2216: */ ! 2217: int (*scatter) (ncb_p, ccb_p, Scsi_Cmnd *); ! 2218: ! 2219: /*---------------------------------------------------------------- ! 2220: ** Command abort handling. ! 2221: ** We need to synchronize tightly with the SCRIPTS ! 2222: ** processor in order to handle things correctly. ! 2223: **---------------------------------------------------------------- ! 2224: */ ! 2225: u_char abrt_msg[4]; /* Message to send buffer */ ! 2226: struct scr_tblmove abrt_tbl; /* Table for the MOV of it */ ! 2227: struct scr_tblsel abrt_sel; /* Sync params for selection */ ! 2228: u_char istat_sem; /* Tells the chip to stop (SEM) */ ! 2229: ! 2230: /*---------------------------------------------------------------- ! 2231: ** Fields that should be removed or changed. ! 2232: **---------------------------------------------------------------- ! 2233: */ ! 2234: struct usrcmd user; /* Command from user */ ! 2235: volatile u_char release_stage; /* Synchronisation stage on release */ ! 2236: ! 2237: /*---------------------------------------------------------------- ! 2238: ** Fields that are used (primarily) for integrity check ! 2239: **---------------------------------------------------------------- ! 2240: */ ! 2241: unsigned char check_integrity; /* Enable midlayer integ. check on ! 2242: * bus scan. */ ! 2243: #ifdef SCSI_NCR_INTEGRITY_CHECKING ! 2244: unsigned char check_integ_par; /* Set if par or Init. Det. error ! 2245: * used only during integ check */ ! 2246: #endif ! 2247: }; ! 2248: ! 2249: #define NCB_PHYS(np, lbl) (np->p_ncb + offsetof(struct ncb, lbl)) ! 2250: #define NCB_SCRIPT_PHYS(np,lbl) (np->p_script + offsetof (struct script, lbl)) ! 2251: #define NCB_SCRIPTH_PHYS(np,lbl) (np->p_scripth + offsetof (struct scripth,lbl)) ! 2252: #define NCB_SCRIPTH0_PHYS(np,lbl) (np->p_scripth0+offsetof (struct scripth,lbl)) ! 2253: ! 2254: /*========================================================== ! 2255: ** ! 2256: ** ! 2257: ** Script for NCR-Processor. ! 2258: ** ! 2259: ** Use ncr_script_fill() to create the variable parts. ! 2260: ** Use ncr_script_copy_and_bind() to make a copy and ! 2261: ** bind to physical addresses. ! 2262: ** ! 2263: ** ! 2264: **========================================================== ! 2265: ** ! 2266: ** We have to know the offsets of all labels before ! 2267: ** we reach them (for forward jumps). ! 2268: ** Therefore we declare a struct here. ! 2269: ** If you make changes inside the script, ! 2270: ** DONT FORGET TO CHANGE THE LENGTHS HERE! ! 2271: ** ! 2272: **---------------------------------------------------------- ! 2273: */ ! 2274: ! 2275: /* ! 2276: ** Script fragments which are loaded into the on-chip RAM ! 2277: ** of 825A, 875, 876, 895, 895A and 896 chips. ! 2278: */ ! 2279: struct script { ! 2280: ncrcmd start [ 14]; ! 2281: ncrcmd getjob_begin [ 4]; ! 2282: ncrcmd getjob_end [ 4]; ! 2283: ncrcmd select [ 8]; ! 2284: ncrcmd wf_sel_done [ 2]; ! 2285: ncrcmd send_ident [ 2]; ! 2286: #ifdef SCSI_NCR_IARB_SUPPORT ! 2287: ncrcmd select2 [ 8]; ! 2288: #else ! 2289: ncrcmd select2 [ 2]; ! 2290: #endif ! 2291: ncrcmd command [ 2]; ! 2292: ncrcmd dispatch [ 28]; ! 2293: ncrcmd sel_no_cmd [ 10]; ! 2294: ncrcmd init [ 6]; ! 2295: ncrcmd clrack [ 4]; ! 2296: ncrcmd disp_status [ 4]; ! 2297: ncrcmd datai_done [ 26]; ! 2298: ncrcmd datao_done [ 12]; ! 2299: ncrcmd ign_i_w_r_msg [ 4]; ! 2300: ncrcmd datai_phase [ 2]; ! 2301: ncrcmd datao_phase [ 4]; ! 2302: ncrcmd msg_in [ 2]; ! 2303: ncrcmd msg_in2 [ 10]; ! 2304: #ifdef SCSI_NCR_IARB_SUPPORT ! 2305: ncrcmd status [ 14]; ! 2306: #else ! 2307: ncrcmd status [ 10]; ! 2308: #endif ! 2309: ncrcmd complete [ 8]; ! 2310: #ifdef SCSI_NCR_PCIQ_MAY_REORDER_WRITES ! 2311: ncrcmd complete2 [ 12]; ! 2312: #else ! 2313: ncrcmd complete2 [ 10]; ! 2314: #endif ! 2315: #ifdef SCSI_NCR_PCIQ_SYNC_ON_INTR ! 2316: ncrcmd done [ 18]; ! 2317: #else ! 2318: ncrcmd done [ 14]; ! 2319: #endif ! 2320: ncrcmd done_end [ 2]; ! 2321: ncrcmd save_dp [ 8]; ! 2322: ncrcmd restore_dp [ 4]; ! 2323: ncrcmd disconnect [ 20]; ! 2324: #ifdef SCSI_NCR_IARB_SUPPORT ! 2325: ncrcmd idle [ 4]; ! 2326: #else ! 2327: ncrcmd idle [ 2]; ! 2328: #endif ! 2329: #ifdef SCSI_NCR_IARB_SUPPORT ! 2330: ncrcmd ungetjob [ 6]; ! 2331: #else ! 2332: ncrcmd ungetjob [ 4]; ! 2333: #endif ! 2334: ncrcmd reselect [ 4]; ! 2335: ncrcmd reselected [ 20]; ! 2336: ncrcmd resel_scntl4 [ 30]; ! 2337: #if MAX_TASKS*4 > 512 ! 2338: ncrcmd resel_tag [ 18]; ! 2339: #elif MAX_TASKS*4 > 256 ! 2340: ncrcmd resel_tag [ 12]; ! 2341: #else ! 2342: ncrcmd resel_tag [ 8]; ! 2343: #endif ! 2344: ncrcmd resel_go [ 6]; ! 2345: ncrcmd resel_notag [ 2]; ! 2346: ncrcmd resel_dsa [ 8]; ! 2347: ncrcmd data_in [MAX_SCATTER * SCR_SG_SIZE]; ! 2348: ncrcmd data_in2 [ 4]; ! 2349: ncrcmd data_out [MAX_SCATTER * SCR_SG_SIZE]; ! 2350: ncrcmd data_out2 [ 4]; ! 2351: ncrcmd pm0_data [ 12]; ! 2352: ncrcmd pm0_data_out [ 6]; ! 2353: ncrcmd pm0_data_end [ 6]; ! 2354: ncrcmd pm1_data [ 12]; ! 2355: ncrcmd pm1_data_out [ 6]; ! 2356: ncrcmd pm1_data_end [ 6]; ! 2357: }; ! 2358: ! 2359: /* ! 2360: ** Script fragments which stay in main memory for all chips ! 2361: ** except for the 895A and 896 that support 8K on-chip RAM. ! 2362: */ ! 2363: struct scripth { ! 2364: ncrcmd start64 [ 2]; ! 2365: ncrcmd no_data [ 2]; ! 2366: ncrcmd sel_for_abort [ 18]; ! 2367: ncrcmd sel_for_abort_1 [ 2]; ! 2368: ncrcmd select_no_atn [ 8]; ! 2369: ncrcmd wf_sel_done_no_atn [ 4]; ! 2370: ! 2371: ncrcmd msg_in_etc [ 14]; ! 2372: ncrcmd msg_received [ 4]; ! 2373: ncrcmd msg_weird_seen [ 4]; ! 2374: ncrcmd msg_extended [ 20]; ! 2375: ncrcmd msg_bad [ 6]; ! 2376: ncrcmd msg_weird [ 4]; ! 2377: ncrcmd msg_weird1 [ 8]; ! 2378: ! 2379: ncrcmd wdtr_resp [ 6]; ! 2380: ncrcmd send_wdtr [ 4]; ! 2381: ncrcmd sdtr_resp [ 6]; ! 2382: ncrcmd send_sdtr [ 4]; ! 2383: ncrcmd ppr_resp [ 6]; ! 2384: ncrcmd send_ppr [ 4]; ! 2385: ncrcmd nego_bad_phase [ 4]; ! 2386: ncrcmd msg_out [ 4]; ! 2387: ncrcmd msg_out_done [ 4]; ! 2388: ncrcmd data_ovrun [ 2]; ! 2389: ncrcmd data_ovrun1 [ 22]; ! 2390: ncrcmd data_ovrun2 [ 8]; ! 2391: ncrcmd abort_resel [ 16]; ! 2392: ncrcmd resend_ident [ 4]; ! 2393: ncrcmd ident_break [ 4]; ! 2394: ncrcmd ident_break_atn [ 4]; ! 2395: ncrcmd sdata_in [ 6]; ! 2396: ncrcmd data_io [ 2]; ! 2397: ncrcmd data_io_com [ 8]; ! 2398: ncrcmd data_io_out [ 12]; ! 2399: ncrcmd resel_bad_lun [ 4]; ! 2400: ncrcmd bad_i_t_l [ 4]; ! 2401: ncrcmd bad_i_t_l_q [ 4]; ! 2402: ncrcmd bad_status [ 6]; ! 2403: ncrcmd tweak_pmj [ 12]; ! 2404: ncrcmd pm_handle [ 20]; ! 2405: ncrcmd pm_handle1 [ 4]; ! 2406: ncrcmd pm_save [ 4]; ! 2407: ncrcmd pm0_save [ 14]; ! 2408: ncrcmd pm1_save [ 14]; ! 2409: ! 2410: /* WSR handling */ ! 2411: #ifdef SYM_DEBUG_PM_WITH_WSR ! 2412: ncrcmd pm_wsr_handle [ 44]; ! 2413: #else ! 2414: ncrcmd pm_wsr_handle [ 42]; ! 2415: #endif ! 2416: ncrcmd wsr_ma_helper [ 4]; ! 2417: ! 2418: /* Data area */ ! 2419: ncrcmd zero [ 1]; ! 2420: ncrcmd scratch [ 1]; ! 2421: ncrcmd scratch1 [ 1]; ! 2422: ncrcmd pm0_data_addr [ 1]; ! 2423: ncrcmd pm1_data_addr [ 1]; ! 2424: ncrcmd saved_dsa [ 1]; ! 2425: ncrcmd saved_drs [ 1]; ! 2426: ncrcmd done_pos [ 1]; ! 2427: ncrcmd startpos [ 1]; ! 2428: ncrcmd targtbl [ 1]; ! 2429: /* End of data area */ ! 2430: ! 2431: #ifdef SCSI_NCR_PCI_MEM_NOT_SUPPORTED ! 2432: ncrcmd start_ram [ 1]; ! 2433: ncrcmd script0_ba [ 4]; ! 2434: ncrcmd start_ram64 [ 3]; ! 2435: ncrcmd script0_ba64 [ 3]; ! 2436: ncrcmd scripth0_ba64 [ 6]; ! 2437: ncrcmd ram_seg64 [ 1]; ! 2438: #endif ! 2439: ncrcmd snooptest [ 6]; ! 2440: ncrcmd snoopend [ 2]; ! 2441: }; ! 2442: ! 2443: /*========================================================== ! 2444: ** ! 2445: ** ! 2446: ** Function headers. ! 2447: ** ! 2448: ** ! 2449: **========================================================== ! 2450: */ ! 2451: ! 2452: static ccb_p ncr_alloc_ccb (ncb_p np); ! 2453: static void ncr_complete (ncb_p np, ccb_p cp); ! 2454: static void ncr_exception (ncb_p np); ! 2455: static void ncr_free_ccb (ncb_p np, ccb_p cp); ! 2456: static ccb_p ncr_ccb_from_dsa(ncb_p np, u_long dsa); ! 2457: static void ncr_init_tcb (ncb_p np, u_char tn); ! 2458: static lcb_p ncr_alloc_lcb (ncb_p np, u_char tn, u_char ln); ! 2459: static lcb_p ncr_setup_lcb (ncb_p np, u_char tn, u_char ln, ! 2460: u_char *inq_data); ! 2461: static void ncr_getclock (ncb_p np, int mult); ! 2462: static u_int ncr_getpciclock (ncb_p np); ! 2463: static void ncr_selectclock (ncb_p np, u_char scntl3); ! 2464: static ccb_p ncr_get_ccb (ncb_p np, u_char tn, u_char ln); ! 2465: static void ncr_init (ncb_p np, int reset, char * msg, u_long code); ! 2466: static void ncr_int_sbmc (ncb_p np); ! 2467: static void ncr_int_par (ncb_p np, u_short sist); ! 2468: static void ncr_int_ma (ncb_p np); ! 2469: static void ncr_int_sir (ncb_p np); ! 2470: static void ncr_int_sto (ncb_p np); ! 2471: static void ncr_int_udc (ncb_p np); ! 2472: static void ncr_negotiate (ncb_p np, tcb_p tp); ! 2473: static int ncr_prepare_nego(ncb_p np, ccb_p cp, u_char *msgptr); ! 2474: #ifdef SCSI_NCR_INTEGRITY_CHECKING ! 2475: static int ncr_ic_nego(ncb_p np, ccb_p cp, Scsi_Cmnd *cmd, u_char *msgptr); ! 2476: #endif ! 2477: static void ncr_script_copy_and_bind ! 2478: (ncb_p np, ncrcmd *src, ncrcmd *dst, int len); ! 2479: static void ncr_script_fill (struct script * scr, struct scripth * scripth); ! 2480: static int ncr_scatter_896R1 (ncb_p np, ccb_p cp, Scsi_Cmnd *cmd); ! 2481: static int ncr_scatter (ncb_p np, ccb_p cp, Scsi_Cmnd *cmd); ! 2482: static void ncr_getsync (ncb_p np, u_char sfac, u_char *fakp, u_char *scntl3p); ! 2483: static void ncr_get_xfer_info(ncb_p np, tcb_p tp, u_char *factor, u_char *offset, u_char *width); ! 2484: static void ncr_setsync (ncb_p np, ccb_p cp, u_char scntl3, u_char sxfer, u_char scntl4); ! 2485: static void ncr_set_sync_wide_status (ncb_p np, u_char target); ! 2486: static void ncr_setup_tags (ncb_p np, u_char tn, u_char ln); ! 2487: static void ncr_setwide (ncb_p np, ccb_p cp, u_char wide, u_char ack); ! 2488: static void ncr_setsyncwide (ncb_p np, ccb_p cp, u_char scntl3, u_char sxfer, u_char scntl4, u_char wide); ! 2489: static int ncr_show_msg (u_char * msg); ! 2490: static void ncr_print_msg (ccb_p cp, char *label, u_char * msg); ! 2491: static int ncr_snooptest (ncb_p np); ! 2492: static void ncr_timeout (ncb_p np); ! 2493: static void ncr_wakeup (ncb_p np, u_long code); ! 2494: static int ncr_wakeup_done (ncb_p np); ! 2495: static void ncr_start_next_ccb (ncb_p np, lcb_p lp, int maxn); ! 2496: static void ncr_put_start_queue(ncb_p np, ccb_p cp); ! 2497: static void ncr_chip_reset (ncb_p np); ! 2498: static void ncr_soft_reset (ncb_p np); ! 2499: static void ncr_start_reset (ncb_p np); ! 2500: static int ncr_reset_scsi_bus (ncb_p np, int enab_int, int settle_delay); ! 2501: static int ncr_compute_residual (ncb_p np, ccb_p cp); ! 2502: ! 2503: #ifdef SCSI_NCR_USER_COMMAND_SUPPORT ! 2504: static void ncr_usercmd (ncb_p np); ! 2505: #endif ! 2506: ! 2507: static int ncr_attach (Scsi_Host_Template *tpnt, int unit, ncr_device *device); ! 2508: static void ncr_free_resources(ncb_p np); ! 2509: ! 2510: static void insert_into_waiting_list(ncb_p np, Scsi_Cmnd *cmd); ! 2511: static Scsi_Cmnd *retrieve_from_waiting_list(int to_remove, ncb_p np, Scsi_Cmnd *cmd); ! 2512: static void process_waiting_list(ncb_p np, int sts); ! 2513: ! 2514: #define remove_from_waiting_list(np, cmd) \ ! 2515: retrieve_from_waiting_list(1, (np), (cmd)) ! 2516: #define requeue_waiting_list(np) process_waiting_list((np), DID_OK) ! 2517: #define reset_waiting_list(np) process_waiting_list((np), DID_RESET) ! 2518: ! 2519: #ifdef SCSI_NCR_NVRAM_SUPPORT ! 2520: static void ncr_get_nvram (ncr_device *devp, ncr_nvram *nvp); ! 2521: static int sym_read_Tekram_nvram (ncr_slot *np, u_short device_id, ! 2522: Tekram_nvram *nvram); ! 2523: static int sym_read_Symbios_nvram (ncr_slot *np, Symbios_nvram *nvram); ! 2524: #endif ! 2525: ! 2526: /*========================================================== ! 2527: ** ! 2528: ** ! 2529: ** Global static data. ! 2530: ** ! 2531: ** ! 2532: **========================================================== ! 2533: */ ! 2534: ! 2535: static inline char *ncr_name (ncb_p np) ! 2536: { ! 2537: return np->inst_name; ! 2538: } ! 2539: ! 2540: ! 2541: /*========================================================== ! 2542: ** ! 2543: ** ! 2544: ** Scripts for NCR-Processor. ! 2545: ** ! 2546: ** Use ncr_script_bind for binding to physical addresses. ! 2547: ** ! 2548: ** ! 2549: **========================================================== ! 2550: ** ! 2551: ** NADDR generates a reference to a field of the controller data. ! 2552: ** PADDR generates a reference to another part of the script. ! 2553: ** RADDR generates a reference to a script processor register. ! 2554: ** FADDR generates a reference to a script processor register ! 2555: ** with offset. ! 2556: ** ! 2557: **---------------------------------------------------------- ! 2558: */ ! 2559: ! 2560: #define RELOC_SOFTC 0x40000000 ! 2561: #define RELOC_LABEL 0x50000000 ! 2562: #define RELOC_REGISTER 0x60000000 ! 2563: #if 0 ! 2564: #define RELOC_KVAR 0x70000000 ! 2565: #endif ! 2566: #define RELOC_LABELH 0x80000000 ! 2567: #define RELOC_MASK 0xf0000000 ! 2568: ! 2569: #define NADDR(label) (RELOC_SOFTC | offsetof(struct ncb, label)) ! 2570: #define PADDR(label) (RELOC_LABEL | offsetof(struct script, label)) ! 2571: #define PADDRH(label) (RELOC_LABELH | offsetof(struct scripth, label)) ! 2572: #define RADDR(label) (RELOC_REGISTER | REG(label)) ! 2573: #define FADDR(label,ofs)(RELOC_REGISTER | ((REG(label))+(ofs))) ! 2574: #define KVAR(which) (RELOC_KVAR | (which)) ! 2575: ! 2576: #define SCR_DATA_ZERO 0xf00ff00f ! 2577: ! 2578: #ifdef RELOC_KVAR ! 2579: #define SCRIPT_KVAR_JIFFIES (0) ! 2580: #define SCRIPT_KVAR_FIRST SCRIPT_KVAR_JIFFIES ! 2581: #define SCRIPT_KVAR_LAST SCRIPT_KVAR_JIFFIES ! 2582: /* ! 2583: * Kernel variables referenced in the scripts. ! 2584: * THESE MUST ALL BE ALIGNED TO A 4-BYTE BOUNDARY. ! 2585: */ ! 2586: static void *script_kvars[] __initdata = ! 2587: { (void *)&jiffies }; ! 2588: #endif ! 2589: ! 2590: static struct script script0 __initdata = { ! 2591: /*--------------------------< START >-----------------------*/ { ! 2592: /* ! 2593: ** This NOP will be patched with LED ON ! 2594: ** SCR_REG_REG (gpreg, SCR_AND, 0xfe) ! 2595: */ ! 2596: SCR_NO_OP, ! 2597: 0, ! 2598: /* ! 2599: ** Clear SIGP. ! 2600: */ ! 2601: SCR_FROM_REG (ctest2), ! 2602: 0, ! 2603: ! 2604: /* ! 2605: ** Stop here if the C code wants to perform ! 2606: ** some error recovery procedure manually. ! 2607: ** (Indicate this by setting SEM in ISTAT) ! 2608: */ ! 2609: SCR_FROM_REG (istat), ! 2610: 0, ! 2611: /* ! 2612: ** Report to the C code the next position in ! 2613: ** the start queue the SCRIPTS will schedule. ! 2614: ** The C code must not change SCRATCHA. ! 2615: */ ! 2616: SCR_LOAD_ABS (scratcha, 4), ! 2617: PADDRH (startpos), ! 2618: SCR_INT ^ IFTRUE (MASK (SEM, SEM)), ! 2619: SIR_SCRIPT_STOPPED, ! 2620: ! 2621: /* ! 2622: ** Start the next job. ! 2623: ** ! 2624: ** @DSA = start point for this job. ! 2625: ** SCRATCHA = address of this job in the start queue. ! 2626: ** ! 2627: ** We will restore startpos with SCRATCHA if we fails the ! 2628: ** arbitration or if it is the idle job. ! 2629: ** ! 2630: ** The below GETJOB_BEGIN to GETJOB_END section of SCRIPTS ! 2631: ** is a critical path. If it is partially executed, it then ! 2632: ** may happen that the job address is not yet in the DSA ! 2633: ** and the the next queue position points to the next JOB. ! 2634: */ ! 2635: SCR_LOAD_ABS (dsa, 4), ! 2636: PADDRH (startpos), ! 2637: SCR_LOAD_REL (temp, 4), ! 2638: 4, ! 2639: }/*-------------------------< GETJOB_BEGIN >------------------*/,{ ! 2640: SCR_STORE_ABS (temp, 4), ! 2641: PADDRH (startpos), ! 2642: SCR_LOAD_REL (dsa, 4), ! 2643: 0, ! 2644: }/*-------------------------< GETJOB_END >--------------------*/,{ ! 2645: SCR_LOAD_REL (temp, 4), ! 2646: 0, ! 2647: SCR_RETURN, ! 2648: 0, ! 2649: ! 2650: }/*-------------------------< SELECT >----------------------*/,{ ! 2651: /* ! 2652: ** DSA contains the address of a scheduled ! 2653: ** data structure. ! 2654: ** ! 2655: ** SCRATCHA contains the address of the start queue ! 2656: ** entry which points to the next job. ! 2657: ** ! 2658: ** Set Initiator mode. ! 2659: ** ! 2660: ** (Target mode is left as an exercise for the reader) ! 2661: */ ! 2662: ! 2663: SCR_CLR (SCR_TRG), ! 2664: 0, ! 2665: /* ! 2666: ** And try to select this target. ! 2667: */ ! 2668: SCR_SEL_TBL_ATN ^ offsetof (struct dsb, select), ! 2669: PADDR (ungetjob), ! 2670: /* ! 2671: ** Now there are 4 possibilities: ! 2672: ** ! 2673: ** (1) The ncr looses arbitration. ! 2674: ** This is ok, because it will try again, ! 2675: ** when the bus becomes idle. ! 2676: ** (But beware of the timeout function!) ! 2677: ** ! 2678: ** (2) The ncr is reselected. ! 2679: ** Then the script processor takes the jump ! 2680: ** to the RESELECT label. ! 2681: ** ! 2682: ** (3) The ncr wins arbitration. ! 2683: ** Then it will execute SCRIPTS instruction until ! 2684: ** the next instruction that checks SCSI phase. ! 2685: ** Then will stop and wait for selection to be ! 2686: ** complete or selection time-out to occur. ! 2687: ** ! 2688: ** After having won arbitration, the ncr SCRIPTS ! 2689: ** processor is able to execute instructions while ! 2690: ** the SCSI core is performing SCSI selection. But ! 2691: ** some script instruction that is not waiting for ! 2692: ** a valid phase (or selection timeout) to occur ! 2693: ** breaks the selection procedure, by probably ! 2694: ** affecting timing requirements. ! 2695: ** So we have to wait immediately for the next phase ! 2696: ** or the selection to complete or time-out. ! 2697: */ ! 2698: ! 2699: /* ! 2700: ** load the savep (saved pointer) into ! 2701: ** the actual data pointer. ! 2702: */ ! 2703: SCR_LOAD_REL (temp, 4), ! 2704: offsetof (struct ccb, phys.header.savep), ! 2705: /* ! 2706: ** Initialize the status registers ! 2707: */ ! 2708: SCR_LOAD_REL (scr0, 4), ! 2709: offsetof (struct ccb, phys.header.status), ! 2710: ! 2711: }/*-------------------------< WF_SEL_DONE >----------------------*/,{ ! 2712: SCR_INT ^ IFFALSE (WHEN (SCR_MSG_OUT)), ! 2713: SIR_SEL_ATN_NO_MSG_OUT, ! 2714: }/*-------------------------< SEND_IDENT >----------------------*/,{ ! 2715: /* ! 2716: ** Selection complete. ! 2717: ** Send the IDENTIFY and SIMPLE_TAG messages ! 2718: ** (and the M_X_SYNC_REQ / M_X_WIDE_REQ message) ! 2719: */ ! 2720: SCR_MOVE_TBL ^ SCR_MSG_OUT, ! 2721: offsetof (struct dsb, smsg), ! 2722: }/*-------------------------< SELECT2 >----------------------*/,{ ! 2723: #ifdef SCSI_NCR_IARB_SUPPORT ! 2724: /* ! 2725: ** Set IMMEDIATE ARBITRATION if we have been given ! 2726: ** a hint to do so. (Some job to do after this one). ! 2727: */ ! 2728: SCR_FROM_REG (HF_REG), ! 2729: 0, ! 2730: SCR_JUMPR ^ IFFALSE (MASK (HF_HINT_IARB, HF_HINT_IARB)), ! 2731: 8, ! 2732: SCR_REG_REG (scntl1, SCR_OR, IARB), ! 2733: 0, ! 2734: #endif ! 2735: /* ! 2736: ** Anticipate the COMMAND phase. ! 2737: ** This is the PHASE we expect at this point. ! 2738: */ ! 2739: SCR_JUMP ^ IFFALSE (WHEN (SCR_COMMAND)), ! 2740: PADDR (sel_no_cmd), ! 2741: ! 2742: }/*-------------------------< COMMAND >--------------------*/,{ ! 2743: /* ! 2744: ** ... and send the command ! 2745: */ ! 2746: SCR_MOVE_TBL ^ SCR_COMMAND, ! 2747: offsetof (struct dsb, cmd), ! 2748: ! 2749: }/*-----------------------< DISPATCH >----------------------*/,{ ! 2750: /* ! 2751: ** MSG_IN is the only phase that shall be ! 2752: ** entered at least once for each (re)selection. ! 2753: ** So we test it first. ! 2754: */ ! 2755: SCR_JUMP ^ IFTRUE (WHEN (SCR_MSG_IN)), ! 2756: PADDR (msg_in), ! 2757: SCR_JUMP ^ IFTRUE (IF (SCR_DATA_OUT)), ! 2758: PADDR (datao_phase), ! 2759: SCR_JUMP ^ IFTRUE (IF (SCR_DATA_IN)), ! 2760: PADDR (datai_phase), ! 2761: SCR_JUMP ^ IFTRUE (IF (SCR_STATUS)), ! 2762: PADDR (status), ! 2763: SCR_JUMP ^ IFTRUE (IF (SCR_COMMAND)), ! 2764: PADDR (command), ! 2765: SCR_JUMP ^ IFTRUE (IF (SCR_MSG_OUT)), ! 2766: PADDRH (msg_out), ! 2767: /* ! 2768: * Discard as many illegal phases as ! 2769: * required and tell the C code about. ! 2770: */ ! 2771: SCR_JUMPR ^ IFFALSE (WHEN (SCR_ILG_OUT)), ! 2772: 16, ! 2773: SCR_MOVE_ABS (1) ^ SCR_ILG_OUT, ! 2774: NADDR (scratch), ! 2775: SCR_JUMPR ^ IFTRUE (WHEN (SCR_ILG_OUT)), ! 2776: -16, ! 2777: SCR_JUMPR ^ IFFALSE (WHEN (SCR_ILG_IN)), ! 2778: 16, ! 2779: SCR_MOVE_ABS (1) ^ SCR_ILG_IN, ! 2780: NADDR (scratch), ! 2781: SCR_JUMPR ^ IFTRUE (WHEN (SCR_ILG_IN)), ! 2782: -16, ! 2783: SCR_INT, ! 2784: SIR_BAD_PHASE, ! 2785: SCR_JUMP, ! 2786: PADDR (dispatch), ! 2787: }/*---------------------< SEL_NO_CMD >----------------------*/,{ ! 2788: /* ! 2789: ** The target does not switch to command ! 2790: ** phase after IDENTIFY has been sent. ! 2791: ** ! 2792: ** If it stays in MSG OUT phase send it ! 2793: ** the IDENTIFY again. ! 2794: */ ! 2795: SCR_JUMP ^ IFTRUE (WHEN (SCR_MSG_OUT)), ! 2796: PADDRH (resend_ident), ! 2797: /* ! 2798: ** If target does not switch to MSG IN phase ! 2799: ** and we sent a negotiation, assert the ! 2800: ** failure immediately. ! 2801: */ ! 2802: SCR_JUMP ^ IFTRUE (WHEN (SCR_MSG_IN)), ! 2803: PADDR (dispatch), ! 2804: SCR_FROM_REG (HS_REG), ! 2805: 0, ! 2806: SCR_INT ^ IFTRUE (DATA (HS_NEGOTIATE)), ! 2807: SIR_NEGO_FAILED, ! 2808: /* ! 2809: ** Jump to dispatcher. ! 2810: */ ! 2811: SCR_JUMP, ! 2812: PADDR (dispatch), ! 2813: ! 2814: }/*-------------------------< INIT >------------------------*/,{ ! 2815: /* ! 2816: ** Wait for the SCSI RESET signal to be ! 2817: ** inactive before restarting operations, ! 2818: ** since the chip may hang on SEL_ATN ! 2819: ** if SCSI RESET is active. ! 2820: */ ! 2821: SCR_FROM_REG (sstat0), ! 2822: 0, ! 2823: SCR_JUMPR ^ IFTRUE (MASK (IRST, IRST)), ! 2824: -16, ! 2825: SCR_JUMP, ! 2826: PADDR (start), ! 2827: }/*-------------------------< CLRACK >----------------------*/,{ ! 2828: /* ! 2829: ** Terminate possible pending message phase. ! 2830: */ ! 2831: SCR_CLR (SCR_ACK), ! 2832: 0, ! 2833: SCR_JUMP, ! 2834: PADDR (dispatch), ! 2835: ! 2836: }/*-------------------------< DISP_STATUS >----------------------*/,{ ! 2837: /* ! 2838: ** Anticipate STATUS phase. ! 2839: ** ! 2840: ** Does spare 3 SCRIPTS instructions when we have ! 2841: ** completed the INPUT of the data. ! 2842: */ ! 2843: SCR_JUMP ^ IFTRUE (WHEN (SCR_STATUS)), ! 2844: PADDR (status), ! 2845: SCR_JUMP, ! 2846: PADDR (dispatch), ! 2847: ! 2848: }/*-------------------------< DATAI_DONE >-------------------*/,{ ! 2849: /* ! 2850: * If the device wants us to send more data, ! 2851: * we must count the extra bytes. ! 2852: */ ! 2853: SCR_JUMP ^ IFTRUE (WHEN (SCR_DATA_IN)), ! 2854: PADDRH (data_ovrun), ! 2855: /* ! 2856: ** If the SWIDE is not full, jump to dispatcher. ! 2857: ** We anticipate a STATUS phase. ! 2858: ** If we get later an IGNORE WIDE RESIDUE, we ! 2859: ** will alias it as a MODIFY DP (-1). ! 2860: */ ! 2861: SCR_FROM_REG (scntl2), ! 2862: 0, ! 2863: SCR_JUMP ^ IFFALSE (MASK (WSR, WSR)), ! 2864: PADDR (disp_status), ! 2865: /* ! 2866: ** The SWIDE is full. ! 2867: ** Clear this condition. ! 2868: */ ! 2869: SCR_REG_REG (scntl2, SCR_OR, WSR), ! 2870: 0, ! 2871: /* ! 2872: * We are expecting an IGNORE RESIDUE message ! 2873: * from the device, otherwise we are in data ! 2874: * overrun condition. Check against MSG_IN phase. ! 2875: */ ! 2876: SCR_INT ^ IFFALSE (WHEN (SCR_MSG_IN)), ! 2877: SIR_SWIDE_OVERRUN, ! 2878: SCR_JUMP ^ IFFALSE (WHEN (SCR_MSG_IN)), ! 2879: PADDR (disp_status), ! 2880: /* ! 2881: * We are in MSG_IN phase, ! 2882: * Read the first byte of the message. ! 2883: * If it is not an IGNORE RESIDUE message, ! 2884: * signal overrun and jump to message ! 2885: * processing. ! 2886: */ ! 2887: SCR_MOVE_ABS (1) ^ SCR_MSG_IN, ! 2888: NADDR (msgin[0]), ! 2889: SCR_INT ^ IFFALSE (DATA (M_IGN_RESIDUE)), ! 2890: SIR_SWIDE_OVERRUN, ! 2891: SCR_JUMP ^ IFFALSE (DATA (M_IGN_RESIDUE)), ! 2892: PADDR (msg_in2), ! 2893: ! 2894: /* ! 2895: * We got the message we expected. ! 2896: * Read the 2nd byte, and jump to dispatcher. ! 2897: */ ! 2898: SCR_CLR (SCR_ACK), ! 2899: 0, ! 2900: SCR_MOVE_ABS (1) ^ SCR_MSG_IN, ! 2901: NADDR (msgin[1]), ! 2902: SCR_CLR (SCR_ACK), ! 2903: 0, ! 2904: SCR_JUMP, ! 2905: PADDR (disp_status), ! 2906: ! 2907: }/*-------------------------< DATAO_DONE >-------------------*/,{ ! 2908: /* ! 2909: * If the device wants us to send more data, ! 2910: * we must count the extra bytes. ! 2911: */ ! 2912: SCR_JUMP ^ IFTRUE (WHEN (SCR_DATA_OUT)), ! 2913: PADDRH (data_ovrun), ! 2914: /* ! 2915: ** If the SODL is not full jump to dispatcher. ! 2916: ** We anticipate a MSG IN phase or a STATUS phase. ! 2917: */ ! 2918: SCR_FROM_REG (scntl2), ! 2919: 0, ! 2920: SCR_JUMP ^ IFFALSE (MASK (WSS, WSS)), ! 2921: PADDR (disp_status), ! 2922: /* ! 2923: ** The SODL is full, clear this condition. ! 2924: */ ! 2925: SCR_REG_REG (scntl2, SCR_OR, WSS), ! 2926: 0, ! 2927: /* ! 2928: ** And signal a DATA UNDERRUN condition ! 2929: ** to the C code. ! 2930: */ ! 2931: SCR_INT, ! 2932: SIR_SODL_UNDERRUN, ! 2933: SCR_JUMP, ! 2934: PADDR (dispatch), ! 2935: ! 2936: }/*-------------------------< IGN_I_W_R_MSG >--------------*/,{ ! 2937: /* ! 2938: ** We jump here from the phase mismatch interrupt, ! 2939: ** When we have a SWIDE and the device has presented ! 2940: ** a IGNORE WIDE RESIDUE message on the BUS. ! 2941: ** We just have to throw away this message and then ! 2942: ** to jump to dispatcher. ! 2943: */ ! 2944: SCR_MOVE_ABS (2) ^ SCR_MSG_IN, ! 2945: NADDR (scratch), ! 2946: /* ! 2947: ** Clear ACK and jump to dispatcher. ! 2948: */ ! 2949: SCR_JUMP, ! 2950: PADDR (clrack), ! 2951: ! 2952: }/*-------------------------< DATAI_PHASE >------------------*/,{ ! 2953: SCR_RETURN, ! 2954: 0, ! 2955: }/*-------------------------< DATAO_PHASE >------------------*/,{ ! 2956: /* ! 2957: ** Patch for 53c1010_66 only - to allow A0 part ! 2958: ** to operate properly in a 33MHz PCI bus. ! 2959: ** ! 2960: ** SCR_REG_REG(scntl4, SCR_OR, 0x0c), ! 2961: ** 0, ! 2962: */ ! 2963: SCR_NO_OP, ! 2964: 0, ! 2965: SCR_RETURN, ! 2966: 0, ! 2967: }/*-------------------------< MSG_IN >--------------------*/,{ ! 2968: /* ! 2969: ** Get the first byte of the message. ! 2970: ** ! 2971: ** The script processor doesn't negate the ! 2972: ** ACK signal after this transfer. ! 2973: */ ! 2974: SCR_MOVE_ABS (1) ^ SCR_MSG_IN, ! 2975: NADDR (msgin[0]), ! 2976: }/*-------------------------< MSG_IN2 >--------------------*/,{ ! 2977: /* ! 2978: ** Check first against 1 byte messages ! 2979: ** that we handle from SCRIPTS. ! 2980: */ ! 2981: SCR_JUMP ^ IFTRUE (DATA (M_COMPLETE)), ! 2982: PADDR (complete), ! 2983: SCR_JUMP ^ IFTRUE (DATA (M_DISCONNECT)), ! 2984: PADDR (disconnect), ! 2985: SCR_JUMP ^ IFTRUE (DATA (M_SAVE_DP)), ! 2986: PADDR (save_dp), ! 2987: SCR_JUMP ^ IFTRUE (DATA (M_RESTORE_DP)), ! 2988: PADDR (restore_dp), ! 2989: /* ! 2990: ** We handle all other messages from the ! 2991: ** C code, so no need to waste on-chip RAM ! 2992: ** for those ones. ! 2993: */ ! 2994: SCR_JUMP, ! 2995: PADDRH (msg_in_etc), ! 2996: ! 2997: }/*-------------------------< STATUS >--------------------*/,{ ! 2998: /* ! 2999: ** get the status ! 3000: */ ! 3001: SCR_MOVE_ABS (1) ^ SCR_STATUS, ! 3002: NADDR (scratch), ! 3003: #ifdef SCSI_NCR_IARB_SUPPORT ! 3004: /* ! 3005: ** If STATUS is not GOOD, clear IMMEDIATE ARBITRATION, ! 3006: ** since we may have to tamper the start queue from ! 3007: ** the C code. ! 3008: */ ! 3009: SCR_JUMPR ^ IFTRUE (DATA (S_GOOD)), ! 3010: 8, ! 3011: SCR_REG_REG (scntl1, SCR_AND, ~IARB), ! 3012: 0, ! 3013: #endif ! 3014: /* ! 3015: ** save status to scsi_status. ! 3016: ** mark as complete. ! 3017: */ ! 3018: SCR_TO_REG (SS_REG), ! 3019: 0, ! 3020: SCR_LOAD_REG (HS_REG, HS_COMPLETE), ! 3021: 0, ! 3022: /* ! 3023: ** Anticipate the MESSAGE PHASE for ! 3024: ** the TASK COMPLETE message. ! 3025: */ ! 3026: SCR_JUMP ^ IFTRUE (WHEN (SCR_MSG_IN)), ! 3027: PADDR (msg_in), ! 3028: SCR_JUMP, ! 3029: PADDR (dispatch), ! 3030: ! 3031: }/*-------------------------< COMPLETE >-----------------*/,{ ! 3032: /* ! 3033: ** Complete message. ! 3034: ** ! 3035: ** Copy the data pointer to LASTP in header. ! 3036: */ ! 3037: SCR_STORE_REL (temp, 4), ! 3038: offsetof (struct ccb, phys.header.lastp), ! 3039: /* ! 3040: ** When we terminate the cycle by clearing ACK, ! 3041: ** the target may disconnect immediately. ! 3042: ** ! 3043: ** We don't want to be told of an ! 3044: ** "unexpected disconnect", ! 3045: ** so we disable this feature. ! 3046: */ ! 3047: SCR_REG_REG (scntl2, SCR_AND, 0x7f), ! 3048: 0, ! 3049: /* ! 3050: ** Terminate cycle ... ! 3051: */ ! 3052: SCR_CLR (SCR_ACK|SCR_ATN), ! 3053: 0, ! 3054: /* ! 3055: ** ... and wait for the disconnect. ! 3056: */ ! 3057: SCR_WAIT_DISC, ! 3058: 0, ! 3059: }/*-------------------------< COMPLETE2 >-----------------*/,{ ! 3060: /* ! 3061: ** Save host status to header. ! 3062: */ ! 3063: SCR_STORE_REL (scr0, 4), ! 3064: offsetof (struct ccb, phys.header.status), ! 3065: ! 3066: #ifdef SCSI_NCR_PCIQ_MAY_REORDER_WRITES ! 3067: /* ! 3068: ** Some bridges may reorder DMA writes to memory. ! 3069: ** We donnot want the CPU to deal with completions ! 3070: ** without all the posted write having been flushed ! 3071: ** to memory. This DUMMY READ should flush posted ! 3072: ** buffers prior to the CPU having to deal with ! 3073: ** completions. ! 3074: */ ! 3075: SCR_LOAD_REL (scr0, 4), /* DUMMY READ */ ! 3076: offsetof (struct ccb, phys.header.status), ! 3077: #endif ! 3078: /* ! 3079: ** If command resulted in not GOOD status, ! 3080: ** call the C code if needed. ! 3081: */ ! 3082: SCR_FROM_REG (SS_REG), ! 3083: 0, ! 3084: SCR_CALL ^ IFFALSE (DATA (S_GOOD)), ! 3085: PADDRH (bad_status), ! 3086: ! 3087: /* ! 3088: ** If we performed an auto-sense, call ! 3089: ** the C code to synchronyze task aborts ! 3090: ** with UNIT ATTENTION conditions. ! 3091: */ ! 3092: SCR_FROM_REG (HF_REG), ! 3093: 0, ! 3094: SCR_INT ^ IFTRUE (MASK (HF_AUTO_SENSE, HF_AUTO_SENSE)), ! 3095: SIR_AUTO_SENSE_DONE, ! 3096: ! 3097: }/*------------------------< DONE >-----------------*/,{ ! 3098: #ifdef SCSI_NCR_PCIQ_SYNC_ON_INTR ! 3099: /* ! 3100: ** It seems that some bridges flush everything ! 3101: ** when the INTR line is raised. For these ones, ! 3102: ** we can just ensure that the INTR line will be ! 3103: ** raised before each completion. So, if it happens ! 3104: ** that we have been faster that the CPU, we just ! 3105: ** have to synchronize with it. A dummy programmed ! 3106: ** interrupt will do the trick. ! 3107: ** Note that we overlap at most 1 IO with the CPU ! 3108: ** in this situation and that the IRQ line must not ! 3109: ** be shared. ! 3110: */ ! 3111: SCR_FROM_REG (istat), ! 3112: 0, ! 3113: SCR_INT ^ IFTRUE (MASK (INTF, INTF)), ! 3114: SIR_DUMMY_INTERRUPT, ! 3115: #endif ! 3116: /* ! 3117: ** Copy the DSA to the DONE QUEUE and ! 3118: ** signal completion to the host. ! 3119: ** If we are interrupted between DONE ! 3120: ** and DONE_END, we must reset, otherwise ! 3121: ** the completed CCB will be lost. ! 3122: */ ! 3123: SCR_STORE_ABS (dsa, 4), ! 3124: PADDRH (saved_dsa), ! 3125: SCR_LOAD_ABS (dsa, 4), ! 3126: PADDRH (done_pos), ! 3127: SCR_LOAD_ABS (scratcha, 4), ! 3128: PADDRH (saved_dsa), ! 3129: SCR_STORE_REL (scratcha, 4), ! 3130: 0, ! 3131: /* ! 3132: ** The instruction below reads the DONE QUEUE next ! 3133: ** free position from memory. ! 3134: ** In addition it ensures that all PCI posted writes ! 3135: ** are flushed and so the DSA value of the done ! 3136: ** CCB is visible by the CPU before INTFLY is raised. ! 3137: */ ! 3138: SCR_LOAD_REL (temp, 4), ! 3139: 4, ! 3140: SCR_INT_FLY, ! 3141: 0, ! 3142: SCR_STORE_ABS (temp, 4), ! 3143: PADDRH (done_pos), ! 3144: }/*------------------------< DONE_END >-----------------*/,{ ! 3145: SCR_JUMP, ! 3146: PADDR (start), ! 3147: ! 3148: }/*-------------------------< SAVE_DP >------------------*/,{ ! 3149: /* ! 3150: ** Clear ACK immediately. ! 3151: ** No need to delay it. ! 3152: */ ! 3153: SCR_CLR (SCR_ACK), ! 3154: 0, ! 3155: /* ! 3156: ** Keep track we received a SAVE DP, so ! 3157: ** we will switch to the other PM context ! 3158: ** on the next PM since the DP may point ! 3159: ** to the current PM context. ! 3160: */ ! 3161: SCR_REG_REG (HF_REG, SCR_OR, HF_DP_SAVED), ! 3162: 0, ! 3163: /* ! 3164: ** SAVE_DP message: ! 3165: ** Copy the data pointer to SAVEP in header. ! 3166: */ ! 3167: SCR_STORE_REL (temp, 4), ! 3168: offsetof (struct ccb, phys.header.savep), ! 3169: SCR_JUMP, ! 3170: PADDR (dispatch), ! 3171: }/*-------------------------< RESTORE_DP >---------------*/,{ ! 3172: /* ! 3173: ** RESTORE_DP message: ! 3174: ** Copy SAVEP in header to actual data pointer. ! 3175: */ ! 3176: SCR_LOAD_REL (temp, 4), ! 3177: offsetof (struct ccb, phys.header.savep), ! 3178: SCR_JUMP, ! 3179: PADDR (clrack), ! 3180: ! 3181: }/*-------------------------< DISCONNECT >---------------*/,{ ! 3182: /* ! 3183: ** DISCONNECTing ... ! 3184: ** ! 3185: ** disable the "unexpected disconnect" feature, ! 3186: ** and remove the ACK signal. ! 3187: */ ! 3188: SCR_REG_REG (scntl2, SCR_AND, 0x7f), ! 3189: 0, ! 3190: SCR_CLR (SCR_ACK|SCR_ATN), ! 3191: 0, ! 3192: /* ! 3193: ** Wait for the disconnect. ! 3194: */ ! 3195: SCR_WAIT_DISC, ! 3196: 0, ! 3197: /* ! 3198: ** Status is: DISCONNECTED. ! 3199: */ ! 3200: SCR_LOAD_REG (HS_REG, HS_DISCONNECT), ! 3201: 0, ! 3202: /* ! 3203: ** Save host status to header. ! 3204: */ ! 3205: SCR_STORE_REL (scr0, 4), ! 3206: offsetof (struct ccb, phys.header.status), ! 3207: /* ! 3208: ** If QUIRK_AUTOSAVE is set, ! 3209: ** do an "save pointer" operation. ! 3210: */ ! 3211: SCR_FROM_REG (QU_REG), ! 3212: 0, ! 3213: SCR_JUMP ^ IFFALSE (MASK (QUIRK_AUTOSAVE, QUIRK_AUTOSAVE)), ! 3214: PADDR (start), ! 3215: /* ! 3216: ** like SAVE_DP message: ! 3217: ** Remember we saved the data pointer. ! 3218: ** Copy data pointer to SAVEP in header. ! 3219: */ ! 3220: SCR_REG_REG (HF_REG, SCR_OR, HF_DP_SAVED), ! 3221: 0, ! 3222: SCR_STORE_REL (temp, 4), ! 3223: offsetof (struct ccb, phys.header.savep), ! 3224: SCR_JUMP, ! 3225: PADDR (start), ! 3226: ! 3227: }/*-------------------------< IDLE >------------------------*/,{ ! 3228: /* ! 3229: ** Nothing to do? ! 3230: ** Wait for reselect. ! 3231: ** This NOP will be patched with LED OFF ! 3232: ** SCR_REG_REG (gpreg, SCR_OR, 0x01) ! 3233: */ ! 3234: SCR_NO_OP, ! 3235: 0, ! 3236: #ifdef SCSI_NCR_IARB_SUPPORT ! 3237: SCR_JUMPR, ! 3238: 8, ! 3239: #endif ! 3240: }/*-------------------------< UNGETJOB >-----------------*/,{ ! 3241: #ifdef SCSI_NCR_IARB_SUPPORT ! 3242: /* ! 3243: ** Set IMMEDIATE ARBITRATION, for the next time. ! 3244: ** This will give us better chance to win arbitration ! 3245: ** for the job we just wanted to do. ! 3246: */ ! 3247: SCR_REG_REG (scntl1, SCR_OR, IARB), ! 3248: 0, ! 3249: #endif ! 3250: /* ! 3251: ** We are not able to restart the SCRIPTS if we are ! 3252: ** interrupted and these instruction haven't been ! 3253: ** all executed. BTW, this is very unlikely to ! 3254: ** happen, but we check that from the C code. ! 3255: */ ! 3256: SCR_LOAD_REG (dsa, 0xff), ! 3257: 0, ! 3258: SCR_STORE_ABS (scratcha, 4), ! 3259: PADDRH (startpos), ! 3260: }/*-------------------------< RESELECT >--------------------*/,{ ! 3261: /* ! 3262: ** make the host status invalid. ! 3263: */ ! 3264: SCR_CLR (SCR_TRG), ! 3265: 0, ! 3266: /* ! 3267: ** Sleep waiting for a reselection. ! 3268: ** If SIGP is set, special treatment. ! 3269: ** ! 3270: ** Zu allem bereit .. ! 3271: */ ! 3272: SCR_WAIT_RESEL, ! 3273: PADDR(start), ! 3274: }/*-------------------------< RESELECTED >------------------*/,{ ! 3275: /* ! 3276: ** This NOP will be patched with LED ON ! 3277: ** SCR_REG_REG (gpreg, SCR_AND, 0xfe) ! 3278: */ ! 3279: SCR_NO_OP, ! 3280: 0, ! 3281: /* ! 3282: ** load the target id into the sdid ! 3283: */ ! 3284: SCR_REG_SFBR (ssid, SCR_AND, 0x8F), ! 3285: 0, ! 3286: SCR_TO_REG (sdid), ! 3287: 0, ! 3288: /* ! 3289: ** load the target control block address ! 3290: */ ! 3291: SCR_LOAD_ABS (dsa, 4), ! 3292: PADDRH (targtbl), ! 3293: SCR_SFBR_REG (dsa, SCR_SHL, 0), ! 3294: 0, ! 3295: SCR_REG_REG (dsa, SCR_SHL, 0), ! 3296: 0, ! 3297: SCR_REG_REG (dsa, SCR_AND, 0x3c), ! 3298: 0, ! 3299: SCR_LOAD_REL (dsa, 4), ! 3300: 0, ! 3301: /* ! 3302: ** Load the synchronous transfer registers. ! 3303: */ ! 3304: SCR_LOAD_REL (scntl3, 1), ! 3305: offsetof(struct tcb, wval), ! 3306: SCR_LOAD_REL (sxfer, 1), ! 3307: offsetof(struct tcb, sval), ! 3308: }/*-------------------------< RESEL_SCNTL4 >------------------*/,{ ! 3309: /* ! 3310: ** Write with uval value. Patch if device ! 3311: ** does not support Ultra3. ! 3312: ** ! 3313: ** SCR_LOAD_REL (scntl4, 1), ! 3314: ** offsetof(struct tcb, uval), ! 3315: */ ! 3316: ! 3317: SCR_NO_OP, ! 3318: 0, ! 3319: /* ! 3320: * We expect MESSAGE IN phase. ! 3321: * If not, get help from the C code. ! 3322: */ ! 3323: SCR_INT ^ IFFALSE (WHEN (SCR_MSG_IN)), ! 3324: SIR_RESEL_NO_MSG_IN, ! 3325: SCR_MOVE_ABS (1) ^ SCR_MSG_IN, ! 3326: NADDR (msgin), ! 3327: ! 3328: /* ! 3329: * If IDENTIFY LUN #0, use a faster path ! 3330: * to find the LCB structure. ! 3331: */ ! 3332: SCR_JUMPR ^ IFTRUE (MASK (0x80, 0xbf)), ! 3333: 56, ! 3334: /* ! 3335: * If message isn't an IDENTIFY, ! 3336: * tell the C code about. ! 3337: */ ! 3338: SCR_INT ^ IFFALSE (MASK (0x80, 0x80)), ! 3339: SIR_RESEL_NO_IDENTIFY, ! 3340: /* ! 3341: * It is an IDENTIFY message, ! 3342: * Load the LUN control block address. ! 3343: */ ! 3344: SCR_LOAD_REL (dsa, 4), ! 3345: offsetof(struct tcb, b_luntbl), ! 3346: SCR_SFBR_REG (dsa, SCR_SHL, 0), ! 3347: 0, ! 3348: SCR_REG_REG (dsa, SCR_SHL, 0), ! 3349: 0, ! 3350: SCR_REG_REG (dsa, SCR_AND, 0xfc), ! 3351: 0, ! 3352: SCR_LOAD_REL (dsa, 4), ! 3353: 0, ! 3354: SCR_JUMPR, ! 3355: 8, ! 3356: /* ! 3357: ** LUN 0 special case (but usual one :)) ! 3358: */ ! 3359: SCR_LOAD_REL (dsa, 4), ! 3360: offsetof(struct tcb, b_lun0), ! 3361: ! 3362: /* ! 3363: ** Load the reselect task action for this LUN. ! 3364: ** Load the tasks DSA array for this LUN. ! 3365: ** Call the action. ! 3366: */ ! 3367: SCR_LOAD_REL (temp, 4), ! 3368: offsetof(struct lcb, resel_task), ! 3369: SCR_LOAD_REL (dsa, 4), ! 3370: offsetof(struct lcb, b_tasktbl), ! 3371: SCR_RETURN, ! 3372: 0, ! 3373: }/*-------------------------< RESEL_TAG >-------------------*/,{ ! 3374: /* ! 3375: ** ACK the IDENTIFY or TAG previously received ! 3376: */ ! 3377: ! 3378: SCR_CLR (SCR_ACK), ! 3379: 0, ! 3380: /* ! 3381: ** Read IDENTIFY + SIMPLE + TAG using a single MOVE. ! 3382: ** Agressive optimization, is'nt it? ! 3383: ** No need to test the SIMPLE TAG message, since the ! 3384: ** driver only supports conformant devices for tags. ;-) ! 3385: */ ! 3386: SCR_MOVE_ABS (2) ^ SCR_MSG_IN, ! 3387: NADDR (msgin), ! 3388: /* ! 3389: ** Read the TAG from the SIDL. ! 3390: ** Still an aggressive optimization. ;-) ! 3391: ** Compute the CCB indirect jump address which ! 3392: ** is (#TAG*2 & 0xfc) due to tag numbering using ! 3393: ** 1,3,5..MAXTAGS*2+1 actual values. ! 3394: */ ! 3395: SCR_REG_SFBR (sidl, SCR_SHL, 0), ! 3396: 0, ! 3397: #if MAX_TASKS*4 > 512 ! 3398: SCR_JUMPR ^ IFFALSE (CARRYSET), ! 3399: 8, ! 3400: SCR_REG_REG (dsa1, SCR_OR, 2), ! 3401: 0, ! 3402: SCR_REG_REG (sfbr, SCR_SHL, 0), ! 3403: 0, ! 3404: SCR_JUMPR ^ IFFALSE (CARRYSET), ! 3405: 8, ! 3406: SCR_REG_REG (dsa1, SCR_OR, 1), ! 3407: 0, ! 3408: #elif MAX_TASKS*4 > 256 ! 3409: SCR_JUMPR ^ IFFALSE (CARRYSET), ! 3410: 8, ! 3411: SCR_REG_REG (dsa1, SCR_OR, 1), ! 3412: 0, ! 3413: #endif ! 3414: /* ! 3415: ** Retrieve the DSA of this task. ! 3416: ** JUMP indirectly to the restart point of the CCB. ! 3417: */ ! 3418: SCR_SFBR_REG (dsa, SCR_AND, 0xfc), ! 3419: 0, ! 3420: }/*-------------------------< RESEL_GO >-------------------*/,{ ! 3421: SCR_LOAD_REL (dsa, 4), ! 3422: 0, ! 3423: SCR_LOAD_REL (temp, 4), ! 3424: offsetof(struct ccb, phys.header.go.restart), ! 3425: SCR_RETURN, ! 3426: 0, ! 3427: /* In normal situations we branch to RESEL_DSA */ ! 3428: }/*-------------------------< RESEL_NOTAG >-------------------*/,{ ! 3429: /* ! 3430: ** JUMP indirectly to the restart point of the CCB. ! 3431: */ ! 3432: SCR_JUMP, ! 3433: PADDR (resel_go), ! 3434: ! 3435: }/*-------------------------< RESEL_DSA >-------------------*/,{ ! 3436: /* ! 3437: ** Ack the IDENTIFY or TAG previously received. ! 3438: */ ! 3439: SCR_CLR (SCR_ACK), ! 3440: 0, ! 3441: /* ! 3442: ** load the savep (saved pointer) into ! 3443: ** the actual data pointer. ! 3444: */ ! 3445: SCR_LOAD_REL (temp, 4), ! 3446: offsetof (struct ccb, phys.header.savep), ! 3447: /* ! 3448: ** Initialize the status registers ! 3449: */ ! 3450: SCR_LOAD_REL (scr0, 4), ! 3451: offsetof (struct ccb, phys.header.status), ! 3452: /* ! 3453: ** Jump to dispatcher. ! 3454: */ ! 3455: SCR_JUMP, ! 3456: PADDR (dispatch), ! 3457: ! 3458: }/*-------------------------< DATA_IN >--------------------*/,{ ! 3459: /* ! 3460: ** Because the size depends on the ! 3461: ** #define MAX_SCATTER parameter, ! 3462: ** it is filled in at runtime. ! 3463: ** ! 3464: ** ##===========< i=0; i<MAX_SCATTER >========= ! 3465: ** || SCR_CHMOV_TBL ^ SCR_DATA_IN, ! 3466: ** || offsetof (struct dsb, data[ i]), ! 3467: ** ##========================================== ! 3468: ** ! 3469: **--------------------------------------------------------- ! 3470: */ ! 3471: 0 ! 3472: }/*-------------------------< DATA_IN2 >-------------------*/,{ ! 3473: SCR_CALL, ! 3474: PADDR (datai_done), ! 3475: SCR_JUMP, ! 3476: PADDRH (data_ovrun), ! 3477: }/*-------------------------< DATA_OUT >--------------------*/,{ ! 3478: /* ! 3479: ** Because the size depends on the ! 3480: ** #define MAX_SCATTER parameter, ! 3481: ** it is filled in at runtime. ! 3482: ** ! 3483: ** ##===========< i=0; i<MAX_SCATTER >========= ! 3484: ** || SCR_CHMOV_TBL ^ SCR_DATA_OUT, ! 3485: ** || offsetof (struct dsb, data[ i]), ! 3486: ** ##========================================== ! 3487: ** ! 3488: **--------------------------------------------------------- ! 3489: */ ! 3490: 0 ! 3491: }/*-------------------------< DATA_OUT2 >-------------------*/,{ ! 3492: SCR_CALL, ! 3493: PADDR (datao_done), ! 3494: SCR_JUMP, ! 3495: PADDRH (data_ovrun), ! 3496: ! 3497: }/*-------------------------< PM0_DATA >--------------------*/,{ ! 3498: /* ! 3499: ** Read our host flags to SFBR, so we will be able ! 3500: ** to check against the data direction we expect. ! 3501: */ ! 3502: SCR_FROM_REG (HF_REG), ! 3503: 0, ! 3504: /* ! 3505: ** Check against actual DATA PHASE. ! 3506: */ ! 3507: SCR_JUMP ^ IFFALSE (WHEN (SCR_DATA_IN)), ! 3508: PADDR (pm0_data_out), ! 3509: /* ! 3510: ** Actual phase is DATA IN. ! 3511: ** Check against expected direction. ! 3512: */ ! 3513: SCR_JUMP ^ IFFALSE (MASK (HF_DATA_IN, HF_DATA_IN)), ! 3514: PADDRH (data_ovrun), ! 3515: /* ! 3516: ** Keep track we are moving data from the ! 3517: ** PM0 DATA mini-script. ! 3518: */ ! 3519: SCR_REG_REG (HF_REG, SCR_OR, HF_IN_PM0), ! 3520: 0, ! 3521: /* ! 3522: ** Move the data to memory. ! 3523: */ ! 3524: SCR_CHMOV_TBL ^ SCR_DATA_IN, ! 3525: offsetof (struct ccb, phys.pm0.sg), ! 3526: SCR_JUMP, ! 3527: PADDR (pm0_data_end), ! 3528: }/*-------------------------< PM0_DATA_OUT >----------------*/,{ ! 3529: /* ! 3530: ** Actual phase is DATA OUT. ! 3531: ** Check against expected direction. ! 3532: */ ! 3533: SCR_JUMP ^ IFTRUE (MASK (HF_DATA_IN, HF_DATA_IN)), ! 3534: PADDRH (data_ovrun), ! 3535: /* ! 3536: ** Keep track we are moving data from the ! 3537: ** PM0 DATA mini-script. ! 3538: */ ! 3539: SCR_REG_REG (HF_REG, SCR_OR, HF_IN_PM0), ! 3540: 0, ! 3541: /* ! 3542: ** Move the data from memory. ! 3543: */ ! 3544: SCR_CHMOV_TBL ^ SCR_DATA_OUT, ! 3545: offsetof (struct ccb, phys.pm0.sg), ! 3546: }/*-------------------------< PM0_DATA_END >----------------*/,{ ! 3547: /* ! 3548: ** Clear the flag that told we were moving ! 3549: ** data from the PM0 DATA mini-script. ! 3550: */ ! 3551: SCR_REG_REG (HF_REG, SCR_AND, (~HF_IN_PM0)), ! 3552: 0, ! 3553: /* ! 3554: ** Return to the previous DATA script which ! 3555: ** is guaranteed by design (if no bug) to be ! 3556: ** the main DATA script for this transfer. ! 3557: */ ! 3558: SCR_LOAD_REL (temp, 4), ! 3559: offsetof (struct ccb, phys.pm0.ret), ! 3560: SCR_RETURN, ! 3561: 0, ! 3562: }/*-------------------------< PM1_DATA >--------------------*/,{ ! 3563: /* ! 3564: ** Read our host flags to SFBR, so we will be able ! 3565: ** to check against the data direction we expect. ! 3566: */ ! 3567: SCR_FROM_REG (HF_REG), ! 3568: 0, ! 3569: /* ! 3570: ** Check against actual DATA PHASE. ! 3571: */ ! 3572: SCR_JUMP ^ IFFALSE (WHEN (SCR_DATA_IN)), ! 3573: PADDR (pm1_data_out), ! 3574: /* ! 3575: ** Actual phase is DATA IN. ! 3576: ** Check against expected direction. ! 3577: */ ! 3578: SCR_JUMP ^ IFFALSE (MASK (HF_DATA_IN, HF_DATA_IN)), ! 3579: PADDRH (data_ovrun), ! 3580: /* ! 3581: ** Keep track we are moving data from the ! 3582: ** PM1 DATA mini-script. ! 3583: */ ! 3584: SCR_REG_REG (HF_REG, SCR_OR, HF_IN_PM1), ! 3585: 0, ! 3586: /* ! 3587: ** Move the data to memory. ! 3588: */ ! 3589: SCR_CHMOV_TBL ^ SCR_DATA_IN, ! 3590: offsetof (struct ccb, phys.pm1.sg), ! 3591: SCR_JUMP, ! 3592: PADDR (pm1_data_end), ! 3593: }/*-------------------------< PM1_DATA_OUT >----------------*/,{ ! 3594: /* ! 3595: ** Actual phase is DATA OUT. ! 3596: ** Check against expected direction. ! 3597: */ ! 3598: SCR_JUMP ^ IFTRUE (MASK (HF_DATA_IN, HF_DATA_IN)), ! 3599: PADDRH (data_ovrun), ! 3600: /* ! 3601: ** Keep track we are moving data from the ! 3602: ** PM1 DATA mini-script. ! 3603: */ ! 3604: SCR_REG_REG (HF_REG, SCR_OR, HF_IN_PM1), ! 3605: 0, ! 3606: /* ! 3607: ** Move the data from memory. ! 3608: */ ! 3609: SCR_CHMOV_TBL ^ SCR_DATA_OUT, ! 3610: offsetof (struct ccb, phys.pm1.sg), ! 3611: }/*-------------------------< PM1_DATA_END >----------------*/,{ ! 3612: /* ! 3613: ** Clear the flag that told we were moving ! 3614: ** data from the PM1 DATA mini-script. ! 3615: */ ! 3616: SCR_REG_REG (HF_REG, SCR_AND, (~HF_IN_PM1)), ! 3617: 0, ! 3618: /* ! 3619: ** Return to the previous DATA script which ! 3620: ** is guaranteed by design (if no bug) to be ! 3621: ** the main DATA script for this transfer. ! 3622: */ ! 3623: SCR_LOAD_REL (temp, 4), ! 3624: offsetof (struct ccb, phys.pm1.ret), ! 3625: SCR_RETURN, ! 3626: 0, ! 3627: }/*---------------------------------------------------------*/ ! 3628: }; ! 3629: ! 3630: ! 3631: static struct scripth scripth0 __initdata = { ! 3632: /*------------------------< START64 >-----------------------*/{ ! 3633: /* ! 3634: ** SCRIPT entry point for the 895A and the 896. ! 3635: ** For now, there is no specific stuff for that ! 3636: ** chip at this point, but this may come. ! 3637: */ ! 3638: SCR_JUMP, ! 3639: PADDR (init), ! 3640: }/*-------------------------< NO_DATA >-------------------*/,{ ! 3641: SCR_JUMP, ! 3642: PADDRH (data_ovrun), ! 3643: }/*-----------------------< SEL_FOR_ABORT >------------------*/,{ ! 3644: /* ! 3645: ** We are jumped here by the C code, if we have ! 3646: ** some target to reset or some disconnected ! 3647: ** job to abort. Since error recovery is a serious ! 3648: ** busyness, we will really reset the SCSI BUS, if ! 3649: ** case of a SCSI interrupt occurring in this path. ! 3650: */ ! 3651: ! 3652: /* ! 3653: ** Set initiator mode. ! 3654: */ ! 3655: SCR_CLR (SCR_TRG), ! 3656: 0, ! 3657: /* ! 3658: ** And try to select this target. ! 3659: */ ! 3660: SCR_SEL_TBL_ATN ^ offsetof (struct ncb, abrt_sel), ! 3661: PADDR (reselect), ! 3662: ! 3663: /* ! 3664: ** Wait for the selection to complete or ! 3665: ** the selection to time out. ! 3666: */ ! 3667: SCR_JUMPR ^ IFFALSE (WHEN (SCR_MSG_OUT)), ! 3668: -8, ! 3669: /* ! 3670: ** Call the C code. ! 3671: */ ! 3672: SCR_INT, ! 3673: SIR_TARGET_SELECTED, ! 3674: /* ! 3675: ** The C code should let us continue here. ! 3676: ** Send the 'kiss of death' message. ! 3677: ** We expect an immediate disconnect once ! 3678: ** the target has eaten the message. ! 3679: */ ! 3680: SCR_REG_REG (scntl2, SCR_AND, 0x7f), ! 3681: 0, ! 3682: SCR_MOVE_TBL ^ SCR_MSG_OUT, ! 3683: offsetof (struct ncb, abrt_tbl), ! 3684: SCR_CLR (SCR_ACK|SCR_ATN), ! 3685: 0, ! 3686: SCR_WAIT_DISC, ! 3687: 0, ! 3688: /* ! 3689: ** Tell the C code that we are done. ! 3690: */ ! 3691: SCR_INT, ! 3692: SIR_ABORT_SENT, ! 3693: }/*-----------------------< SEL_FOR_ABORT_1 >--------------*/,{ ! 3694: /* ! 3695: ** Jump at scheduler. ! 3696: */ ! 3697: SCR_JUMP, ! 3698: PADDR (start), ! 3699: ! 3700: }/*------------------------< SELECT_NO_ATN >-----------------*/,{ ! 3701: /* ! 3702: ** Set Initiator mode. ! 3703: ** And try to select this target without ATN. ! 3704: */ ! 3705: ! 3706: SCR_CLR (SCR_TRG), ! 3707: 0, ! 3708: SCR_SEL_TBL ^ offsetof (struct dsb, select), ! 3709: PADDR (ungetjob), ! 3710: /* ! 3711: ** load the savep (saved pointer) into ! 3712: ** the actual data pointer. ! 3713: */ ! 3714: SCR_LOAD_REL (temp, 4), ! 3715: offsetof (struct ccb, phys.header.savep), ! 3716: /* ! 3717: ** Initialize the status registers ! 3718: */ ! 3719: SCR_LOAD_REL (scr0, 4), ! 3720: offsetof (struct ccb, phys.header.status), ! 3721: ! 3722: }/*------------------------< WF_SEL_DONE_NO_ATN >-----------------*/,{ ! 3723: /* ! 3724: ** Wait immediately for the next phase or ! 3725: ** the selection to complete or time-out. ! 3726: */ ! 3727: SCR_JUMPR ^ IFFALSE (WHEN (SCR_MSG_OUT)), ! 3728: 0, ! 3729: SCR_JUMP, ! 3730: PADDR (select2), ! 3731: ! 3732: }/*-------------------------< MSG_IN_ETC >--------------------*/,{ ! 3733: /* ! 3734: ** If it is an EXTENDED (variable size message) ! 3735: ** Handle it. ! 3736: */ ! 3737: SCR_JUMP ^ IFTRUE (DATA (M_EXTENDED)), ! 3738: PADDRH (msg_extended), ! 3739: /* ! 3740: ** Let the C code handle any other ! 3741: ** 1 byte message. ! 3742: */ ! 3743: SCR_JUMP ^ IFTRUE (MASK (0x00, 0xf0)), ! 3744: PADDRH (msg_received), ! 3745: SCR_JUMP ^ IFTRUE (MASK (0x10, 0xf0)), ! 3746: PADDRH (msg_received), ! 3747: /* ! 3748: ** We donnot handle 2 bytes messages from SCRIPTS. ! 3749: ** So, let the C code deal with these ones too. ! 3750: */ ! 3751: SCR_JUMP ^ IFFALSE (MASK (0x20, 0xf0)), ! 3752: PADDRH (msg_weird_seen), ! 3753: SCR_CLR (SCR_ACK), ! 3754: 0, ! 3755: SCR_MOVE_ABS (1) ^ SCR_MSG_IN, ! 3756: NADDR (msgin[1]), ! 3757: SCR_JUMP, ! 3758: PADDRH (msg_received), ! 3759: ! 3760: }/*-------------------------< MSG_RECEIVED >--------------------*/,{ ! 3761: SCR_LOAD_REL (scratcha, 4), /* DUMMY READ */ ! 3762: 0, ! 3763: SCR_INT, ! 3764: SIR_MSG_RECEIVED, ! 3765: ! 3766: }/*-------------------------< MSG_WEIRD_SEEN >------------------*/,{ ! 3767: SCR_LOAD_REL (scratcha1, 4), /* DUMMY READ */ ! 3768: 0, ! 3769: SCR_INT, ! 3770: SIR_MSG_WEIRD, ! 3771: ! 3772: }/*-------------------------< MSG_EXTENDED >--------------------*/,{ ! 3773: /* ! 3774: ** Clear ACK and get the next byte ! 3775: ** assumed to be the message length. ! 3776: */ ! 3777: SCR_CLR (SCR_ACK), ! 3778: 0, ! 3779: SCR_MOVE_ABS (1) ^ SCR_MSG_IN, ! 3780: NADDR (msgin[1]), ! 3781: /* ! 3782: ** Try to catch some unlikely situations as 0 length ! 3783: ** or too large the length. ! 3784: */ ! 3785: SCR_JUMP ^ IFTRUE (DATA (0)), ! 3786: PADDRH (msg_weird_seen), ! 3787: SCR_TO_REG (scratcha), ! 3788: 0, ! 3789: SCR_REG_REG (sfbr, SCR_ADD, (256-8)), ! 3790: 0, ! 3791: SCR_JUMP ^ IFTRUE (CARRYSET), ! 3792: PADDRH (msg_weird_seen), ! 3793: /* ! 3794: ** We donnot handle extended messages from SCRIPTS. ! 3795: ** Read the amount of data correponding to the ! 3796: ** message length and call the C code. ! 3797: */ ! 3798: SCR_STORE_REL (scratcha, 1), ! 3799: offsetof (struct dsb, smsg_ext.size), ! 3800: SCR_CLR (SCR_ACK), ! 3801: 0, ! 3802: SCR_MOVE_TBL ^ SCR_MSG_IN, ! 3803: offsetof (struct dsb, smsg_ext), ! 3804: SCR_JUMP, ! 3805: PADDRH (msg_received), ! 3806: ! 3807: }/*-------------------------< MSG_BAD >------------------*/,{ ! 3808: /* ! 3809: ** unimplemented message - reject it. ! 3810: */ ! 3811: SCR_INT, ! 3812: SIR_REJECT_TO_SEND, ! 3813: SCR_SET (SCR_ATN), ! 3814: 0, ! 3815: SCR_JUMP, ! 3816: PADDR (clrack), ! 3817: ! 3818: }/*-------------------------< MSG_WEIRD >--------------------*/,{ ! 3819: /* ! 3820: ** weird message received ! 3821: ** ignore all MSG IN phases and reject it. ! 3822: */ ! 3823: SCR_INT, ! 3824: SIR_REJECT_TO_SEND, ! 3825: SCR_SET (SCR_ATN), ! 3826: 0, ! 3827: }/*-------------------------< MSG_WEIRD1 >--------------------*/,{ ! 3828: SCR_CLR (SCR_ACK), ! 3829: 0, ! 3830: SCR_JUMP ^ IFFALSE (WHEN (SCR_MSG_IN)), ! 3831: PADDR (dispatch), ! 3832: SCR_MOVE_ABS (1) ^ SCR_MSG_IN, ! 3833: NADDR (scratch), ! 3834: SCR_JUMP, ! 3835: PADDRH (msg_weird1), ! 3836: }/*-------------------------< WDTR_RESP >----------------*/,{ ! 3837: /* ! 3838: ** let the target fetch our answer. ! 3839: */ ! 3840: SCR_SET (SCR_ATN), ! 3841: 0, ! 3842: SCR_CLR (SCR_ACK), ! 3843: 0, ! 3844: SCR_JUMP ^ IFFALSE (WHEN (SCR_MSG_OUT)), ! 3845: PADDRH (nego_bad_phase), ! 3846: ! 3847: }/*-------------------------< SEND_WDTR >----------------*/,{ ! 3848: /* ! 3849: ** Send the M_X_WIDE_REQ ! 3850: */ ! 3851: SCR_MOVE_ABS (4) ^ SCR_MSG_OUT, ! 3852: NADDR (msgout), ! 3853: SCR_JUMP, ! 3854: PADDRH (msg_out_done), ! 3855: ! 3856: }/*-------------------------< SDTR_RESP >-------------*/,{ ! 3857: /* ! 3858: ** let the target fetch our answer. ! 3859: */ ! 3860: SCR_SET (SCR_ATN), ! 3861: 0, ! 3862: SCR_CLR (SCR_ACK), ! 3863: 0, ! 3864: SCR_JUMP ^ IFFALSE (WHEN (SCR_MSG_OUT)), ! 3865: PADDRH (nego_bad_phase), ! 3866: ! 3867: }/*-------------------------< SEND_SDTR >-------------*/,{ ! 3868: /* ! 3869: ** Send the M_X_SYNC_REQ ! 3870: */ ! 3871: SCR_MOVE_ABS (5) ^ SCR_MSG_OUT, ! 3872: NADDR (msgout), ! 3873: SCR_JUMP, ! 3874: PADDRH (msg_out_done), ! 3875: ! 3876: }/*-------------------------< PPR_RESP >-------------*/,{ ! 3877: /* ! 3878: ** let the target fetch our answer. ! 3879: */ ! 3880: SCR_SET (SCR_ATN), ! 3881: 0, ! 3882: SCR_CLR (SCR_ACK), ! 3883: 0, ! 3884: SCR_JUMP ^ IFFALSE (WHEN (SCR_MSG_OUT)), ! 3885: PADDRH (nego_bad_phase), ! 3886: ! 3887: }/*-------------------------< SEND_PPR >-------------*/,{ ! 3888: /* ! 3889: ** Send the M_X_PPR_REQ ! 3890: */ ! 3891: SCR_MOVE_ABS (8) ^ SCR_MSG_OUT, ! 3892: NADDR (msgout), ! 3893: SCR_JUMP, ! 3894: PADDRH (msg_out_done), ! 3895: ! 3896: }/*-------------------------< NEGO_BAD_PHASE >------------*/,{ ! 3897: SCR_INT, ! 3898: SIR_NEGO_PROTO, ! 3899: SCR_JUMP, ! 3900: PADDR (dispatch), ! 3901: ! 3902: }/*-------------------------< MSG_OUT >-------------------*/,{ ! 3903: /* ! 3904: ** The target requests a message. ! 3905: */ ! 3906: SCR_MOVE_ABS (1) ^ SCR_MSG_OUT, ! 3907: NADDR (msgout), ! 3908: /* ! 3909: ** ... wait for the next phase ! 3910: ** if it's a message out, send it again, ... ! 3911: */ ! 3912: SCR_JUMP ^ IFTRUE (WHEN (SCR_MSG_OUT)), ! 3913: PADDRH (msg_out), ! 3914: }/*-------------------------< MSG_OUT_DONE >--------------*/,{ ! 3915: /* ! 3916: ** ... else clear the message ... ! 3917: */ ! 3918: SCR_INT, ! 3919: SIR_MSG_OUT_DONE, ! 3920: /* ! 3921: ** ... and process the next phase ! 3922: */ ! 3923: SCR_JUMP, ! 3924: PADDR (dispatch), ! 3925: ! 3926: }/*-------------------------< DATA_OVRUN >-----------------------*/,{ ! 3927: /* ! 3928: * Use scratcha to count the extra bytes. ! 3929: */ ! 3930: SCR_LOAD_ABS (scratcha, 4), ! 3931: PADDRH (zero), ! 3932: }/*-------------------------< DATA_OVRUN1 >----------------------*/,{ ! 3933: /* ! 3934: * The target may want to transfer too much data. ! 3935: * ! 3936: * If phase is DATA OUT write 1 byte and count it. ! 3937: */ ! 3938: SCR_JUMPR ^ IFFALSE (WHEN (SCR_DATA_OUT)), ! 3939: 16, ! 3940: SCR_CHMOV_ABS (1) ^ SCR_DATA_OUT, ! 3941: NADDR (scratch), ! 3942: SCR_JUMP, ! 3943: PADDRH (data_ovrun2), ! 3944: /* ! 3945: * If WSR is set, clear this condition, and ! 3946: * count this byte. ! 3947: */ ! 3948: SCR_FROM_REG (scntl2), ! 3949: 0, ! 3950: SCR_JUMPR ^ IFFALSE (MASK (WSR, WSR)), ! 3951: 16, ! 3952: SCR_REG_REG (scntl2, SCR_OR, WSR), ! 3953: 0, ! 3954: SCR_JUMP, ! 3955: PADDRH (data_ovrun2), ! 3956: /* ! 3957: * Finally check against DATA IN phase. ! 3958: * Signal data overrun to the C code ! 3959: * and jump to dispatcher if not so. ! 3960: * Read 1 byte otherwise and count it. ! 3961: */ ! 3962: SCR_JUMPR ^ IFTRUE (WHEN (SCR_DATA_IN)), ! 3963: 16, ! 3964: SCR_INT, ! 3965: SIR_DATA_OVERRUN, ! 3966: SCR_JUMP, ! 3967: PADDR (dispatch), ! 3968: SCR_CHMOV_ABS (1) ^ SCR_DATA_IN, ! 3969: NADDR (scratch), ! 3970: }/*-------------------------< DATA_OVRUN2 >----------------------*/,{ ! 3971: /* ! 3972: * Count this byte. ! 3973: * This will allow to return a negative ! 3974: * residual to user. ! 3975: */ ! 3976: SCR_REG_REG (scratcha, SCR_ADD, 0x01), ! 3977: 0, ! 3978: SCR_REG_REG (scratcha1, SCR_ADDC, 0), ! 3979: 0, ! 3980: SCR_REG_REG (scratcha2, SCR_ADDC, 0), ! 3981: 0, ! 3982: /* ! 3983: * .. and repeat as required. ! 3984: */ ! 3985: SCR_JUMP, ! 3986: PADDRH (data_ovrun1), ! 3987: ! 3988: }/*-------------------------< ABORT_RESEL >----------------*/,{ ! 3989: SCR_SET (SCR_ATN), ! 3990: 0, ! 3991: SCR_CLR (SCR_ACK), ! 3992: 0, ! 3993: /* ! 3994: ** send the abort/abortag/reset message ! 3995: ** we expect an immediate disconnect ! 3996: */ ! 3997: SCR_REG_REG (scntl2, SCR_AND, 0x7f), ! 3998: 0, ! 3999: SCR_MOVE_ABS (1) ^ SCR_MSG_OUT, ! 4000: NADDR (msgout), ! 4001: SCR_CLR (SCR_ACK|SCR_ATN), ! 4002: 0, ! 4003: SCR_WAIT_DISC, ! 4004: 0, ! 4005: SCR_INT, ! 4006: SIR_RESEL_ABORTED, ! 4007: SCR_JUMP, ! 4008: PADDR (start), ! 4009: }/*-------------------------< RESEND_IDENT >-------------------*/,{ ! 4010: /* ! 4011: ** The target stays in MSG OUT phase after having acked ! 4012: ** Identify [+ Tag [+ Extended message ]]. Targets shall ! 4013: ** behave this way on parity error. ! 4014: ** We must send it again all the messages. ! 4015: */ ! 4016: SCR_SET (SCR_ATN), /* Shall be asserted 2 deskew delays before the */ ! 4017: 0, /* 1rst ACK = 90 ns. Hope the NCR is'nt too fast */ ! 4018: SCR_JUMP, ! 4019: PADDR (send_ident), ! 4020: }/*-------------------------< IDENT_BREAK >-------------------*/,{ ! 4021: SCR_CLR (SCR_ATN), ! 4022: 0, ! 4023: SCR_JUMP, ! 4024: PADDR (select2), ! 4025: }/*-------------------------< IDENT_BREAK_ATN >----------------*/,{ ! 4026: SCR_SET (SCR_ATN), ! 4027: 0, ! 4028: SCR_JUMP, ! 4029: PADDR (select2), ! 4030: }/*-------------------------< SDATA_IN >-------------------*/,{ ! 4031: SCR_CHMOV_TBL ^ SCR_DATA_IN, ! 4032: offsetof (struct dsb, sense), ! 4033: SCR_CALL, ! 4034: PADDR (datai_done), ! 4035: SCR_JUMP, ! 4036: PADDRH (data_ovrun), ! 4037: }/*-------------------------< DATA_IO >--------------------*/,{ ! 4038: /* ! 4039: ** We jump here if the data direction was unknown at the ! 4040: ** time we had to queue the command to the scripts processor. ! 4041: ** Pointers had been set as follow in this situation: ! 4042: ** savep --> DATA_IO ! 4043: ** lastp --> start pointer when DATA_IN ! 4044: ** goalp --> goal pointer when DATA_IN ! 4045: ** wlastp --> start pointer when DATA_OUT ! 4046: ** wgoalp --> goal pointer when DATA_OUT ! 4047: ** This script sets savep/lastp/goalp according to the ! 4048: ** direction chosen by the target. ! 4049: */ ! 4050: SCR_JUMP ^ IFTRUE (WHEN (SCR_DATA_OUT)), ! 4051: PADDRH(data_io_out), ! 4052: }/*-------------------------< DATA_IO_COM >-----------------*/,{ ! 4053: /* ! 4054: ** Direction is DATA IN. ! 4055: ** Warning: we jump here, even when phase is DATA OUT. ! 4056: */ ! 4057: SCR_LOAD_REL (scratcha, 4), ! 4058: offsetof (struct ccb, phys.header.lastp), ! 4059: SCR_STORE_REL (scratcha, 4), ! 4060: offsetof (struct ccb, phys.header.savep), ! 4061: ! 4062: /* ! 4063: ** Jump to the SCRIPTS according to actual direction. ! 4064: */ ! 4065: SCR_LOAD_REL (temp, 4), ! 4066: offsetof (struct ccb, phys.header.savep), ! 4067: SCR_RETURN, ! 4068: 0, ! 4069: }/*-------------------------< DATA_IO_OUT >-----------------*/,{ ! 4070: /* ! 4071: ** Direction is DATA OUT. ! 4072: */ ! 4073: SCR_REG_REG (HF_REG, SCR_AND, (~HF_DATA_IN)), ! 4074: 0, ! 4075: SCR_LOAD_REL (scratcha, 4), ! 4076: offsetof (struct ccb, phys.header.wlastp), ! 4077: SCR_STORE_REL (scratcha, 4), ! 4078: offsetof (struct ccb, phys.header.lastp), ! 4079: SCR_LOAD_REL (scratcha, 4), ! 4080: offsetof (struct ccb, phys.header.wgoalp), ! 4081: SCR_STORE_REL (scratcha, 4), ! 4082: offsetof (struct ccb, phys.header.goalp), ! 4083: SCR_JUMP, ! 4084: PADDRH(data_io_com), ! 4085: ! 4086: }/*-------------------------< RESEL_BAD_LUN >---------------*/,{ ! 4087: /* ! 4088: ** Message is an IDENTIFY, but lun is unknown. ! 4089: ** Signal problem to C code for logging the event. ! 4090: ** Send a M_ABORT to clear all pending tasks. ! 4091: */ ! 4092: SCR_INT, ! 4093: SIR_RESEL_BAD_LUN, ! 4094: SCR_JUMP, ! 4095: PADDRH (abort_resel), ! 4096: }/*-------------------------< BAD_I_T_L >------------------*/,{ ! 4097: /* ! 4098: ** We donnot have a task for that I_T_L. ! 4099: ** Signal problem to C code for logging the event. ! 4100: ** Send a M_ABORT message. ! 4101: */ ! 4102: SCR_INT, ! 4103: SIR_RESEL_BAD_I_T_L, ! 4104: SCR_JUMP, ! 4105: PADDRH (abort_resel), ! 4106: }/*-------------------------< BAD_I_T_L_Q >----------------*/,{ ! 4107: /* ! 4108: ** We donnot have a task that matches the tag. ! 4109: ** Signal problem to C code for logging the event. ! 4110: ** Send a M_ABORTTAG message. ! 4111: */ ! 4112: SCR_INT, ! 4113: SIR_RESEL_BAD_I_T_L_Q, ! 4114: SCR_JUMP, ! 4115: PADDRH (abort_resel), ! 4116: }/*-------------------------< BAD_STATUS >-----------------*/,{ ! 4117: /* ! 4118: ** Anything different from INTERMEDIATE ! 4119: ** CONDITION MET should be a bad SCSI status, ! 4120: ** given that GOOD status has already been tested. ! 4121: ** Call the C code. ! 4122: */ ! 4123: SCR_LOAD_ABS (scratcha, 4), ! 4124: PADDRH (startpos), ! 4125: SCR_INT ^ IFFALSE (DATA (S_COND_MET)), ! 4126: SIR_BAD_STATUS, ! 4127: SCR_RETURN, ! 4128: 0, ! 4129: ! 4130: }/*-------------------------< TWEAK_PMJ >------------------*/,{ ! 4131: /* ! 4132: ** Disable PM handling from SCRIPTS for the data phase ! 4133: ** and so force PM to be handled from C code if HF_PM_TO_C ! 4134: ** flag is set. ! 4135: */ ! 4136: SCR_FROM_REG(HF_REG), ! 4137: 0, ! 4138: SCR_JUMPR ^ IFTRUE (MASK (HF_PM_TO_C, HF_PM_TO_C)), ! 4139: 16, ! 4140: SCR_REG_REG (ccntl0, SCR_OR, ENPMJ), ! 4141: 0, ! 4142: SCR_RETURN, ! 4143: 0, ! 4144: SCR_REG_REG (ccntl0, SCR_AND, (~ENPMJ)), ! 4145: 0, ! 4146: SCR_RETURN, ! 4147: 0, ! 4148: ! 4149: }/*-------------------------< PM_HANDLE >------------------*/,{ ! 4150: /* ! 4151: ** Phase mismatch handling. ! 4152: ** ! 4153: ** Since we have to deal with 2 SCSI data pointers ! 4154: ** (current and saved), we need at least 2 contexts. ! 4155: ** Each context (pm0 and pm1) has a saved area, a ! 4156: ** SAVE mini-script and a DATA phase mini-script. ! 4157: */ ! 4158: /* ! 4159: ** Get the PM handling flags. ! 4160: */ ! 4161: SCR_FROM_REG (HF_REG), ! 4162: 0, ! 4163: /* ! 4164: ** If no flags (1rst PM for example), avoid ! 4165: ** all the below heavy flags testing. ! 4166: ** This makes the normal case a bit faster. ! 4167: */ ! 4168: SCR_JUMP ^ IFTRUE (MASK (0, (HF_IN_PM0 | HF_IN_PM1 | HF_DP_SAVED))), ! 4169: PADDRH (pm_handle1), ! 4170: /* ! 4171: ** If we received a SAVE DP, switch to the ! 4172: ** other PM context since the savep may point ! 4173: ** to the current PM context. ! 4174: */ ! 4175: SCR_JUMPR ^ IFFALSE (MASK (HF_DP_SAVED, HF_DP_SAVED)), ! 4176: 8, ! 4177: SCR_REG_REG (sfbr, SCR_XOR, HF_ACT_PM), ! 4178: 0, ! 4179: /* ! 4180: ** If we have been interrupt in a PM DATA mini-script, ! 4181: ** we take the return address from the corresponding ! 4182: ** saved area. ! 4183: ** This ensure the return address always points to the ! 4184: ** main DATA script for this transfer. ! 4185: */ ! 4186: SCR_JUMP ^ IFTRUE (MASK (0, (HF_IN_PM0 | HF_IN_PM1))), ! 4187: PADDRH (pm_handle1), ! 4188: SCR_JUMPR ^ IFFALSE (MASK (HF_IN_PM0, HF_IN_PM0)), ! 4189: 16, ! 4190: SCR_LOAD_REL (ia, 4), ! 4191: offsetof(struct ccb, phys.pm0.ret), ! 4192: SCR_JUMP, ! 4193: PADDRH (pm_save), ! 4194: SCR_LOAD_REL (ia, 4), ! 4195: offsetof(struct ccb, phys.pm1.ret), ! 4196: SCR_JUMP, ! 4197: PADDRH (pm_save), ! 4198: }/*-------------------------< PM_HANDLE1 >-----------------*/,{ ! 4199: /* ! 4200: ** Normal case. ! 4201: ** Update the return address so that it ! 4202: ** will point after the interrupted MOVE. ! 4203: */ ! 4204: SCR_REG_REG (ia, SCR_ADD, 8), ! 4205: 0, ! 4206: SCR_REG_REG (ia1, SCR_ADDC, 0), ! 4207: 0, ! 4208: }/*-------------------------< PM_SAVE >--------------------*/,{ ! 4209: /* ! 4210: ** Clear all the flags that told us if we were ! 4211: ** interrupted in a PM DATA mini-script and/or ! 4212: ** we received a SAVE DP. ! 4213: */ ! 4214: SCR_SFBR_REG (HF_REG, SCR_AND, (~(HF_IN_PM0|HF_IN_PM1|HF_DP_SAVED))), ! 4215: 0, ! 4216: /* ! 4217: ** Choose the current PM context. ! 4218: */ ! 4219: SCR_JUMP ^ IFTRUE (MASK (HF_ACT_PM, HF_ACT_PM)), ! 4220: PADDRH (pm1_save), ! 4221: }/*-------------------------< PM0_SAVE >-------------------*/,{ ! 4222: SCR_STORE_REL (ia, 4), ! 4223: offsetof(struct ccb, phys.pm0.ret), ! 4224: /* ! 4225: ** If WSR bit is set, either UA and RBC may ! 4226: ** have to be changed whatever the device wants ! 4227: ** to ignore this residue ot not. ! 4228: */ ! 4229: SCR_FROM_REG (scntl2), ! 4230: 0, ! 4231: SCR_CALL ^ IFTRUE (MASK (WSR, WSR)), ! 4232: PADDRH (pm_wsr_handle), ! 4233: /* ! 4234: ** Save the remaining byte count, the updated ! 4235: ** address and the return address. ! 4236: */ ! 4237: SCR_STORE_REL (rbc, 4), ! 4238: offsetof(struct ccb, phys.pm0.sg.size), ! 4239: SCR_STORE_REL (ua, 4), ! 4240: offsetof(struct ccb, phys.pm0.sg.addr), ! 4241: /* ! 4242: ** Set the current pointer at the PM0 DATA mini-script. ! 4243: */ ! 4244: SCR_LOAD_ABS (temp, 4), ! 4245: PADDRH (pm0_data_addr), ! 4246: SCR_JUMP, ! 4247: PADDR (dispatch), ! 4248: }/*-------------------------< PM1_SAVE >-------------------*/,{ ! 4249: SCR_STORE_REL (ia, 4), ! 4250: offsetof(struct ccb, phys.pm1.ret), ! 4251: /* ! 4252: ** If WSR bit is set, either UA and RBC may ! 4253: ** have been changed whatever the device wants ! 4254: ** to ignore this residue or not. ! 4255: */ ! 4256: SCR_FROM_REG (scntl2), ! 4257: 0, ! 4258: SCR_CALL ^ IFTRUE (MASK (WSR, WSR)), ! 4259: PADDRH (pm_wsr_handle), ! 4260: /* ! 4261: ** Save the remaining byte count, the updated ! 4262: ** address and the return address. ! 4263: */ ! 4264: SCR_STORE_REL (rbc, 4), ! 4265: offsetof(struct ccb, phys.pm1.sg.size), ! 4266: SCR_STORE_REL (ua, 4), ! 4267: offsetof(struct ccb, phys.pm1.sg.addr), ! 4268: /* ! 4269: ** Set the current pointer at the PM1 DATA mini-script. ! 4270: */ ! 4271: SCR_LOAD_ABS (temp, 4), ! 4272: PADDRH (pm1_data_addr), ! 4273: SCR_JUMP, ! 4274: PADDR (dispatch), ! 4275: }/*--------------------------< PM_WSR_HANDLE >-----------------------*/,{ ! 4276: /* ! 4277: * Phase mismatch handling from SCRIPT with WSR set. ! 4278: * Such a condition can occur if the chip wants to ! 4279: * execute a CHMOV(size > 1) when the WSR bit is ! 4280: * set and the target changes PHASE. ! 4281: */ ! 4282: #ifdef SYM_DEBUG_PM_WITH_WSR ! 4283: /* ! 4284: * Some debugging may still be needed.:) ! 4285: */ ! 4286: SCR_INT, ! 4287: SIR_PM_WITH_WSR, ! 4288: #endif ! 4289: /* ! 4290: * We must move the residual byte to memory. ! 4291: * ! 4292: * UA contains bit 0..31 of the address to ! 4293: * move the residual byte. ! 4294: * Move it to the table indirect. ! 4295: */ ! 4296: SCR_STORE_REL (ua, 4), ! 4297: offsetof (struct ccb, phys.wresid.addr), ! 4298: /* ! 4299: * Increment UA (move address to next position). ! 4300: */ ! 4301: SCR_REG_REG (ua, SCR_ADD, 1), ! 4302: 0, ! 4303: SCR_REG_REG (ua1, SCR_ADDC, 0), ! 4304: 0, ! 4305: SCR_REG_REG (ua2, SCR_ADDC, 0), ! 4306: 0, ! 4307: SCR_REG_REG (ua3, SCR_ADDC, 0), ! 4308: 0, ! 4309: /* ! 4310: * Compute SCRATCHA as: ! 4311: * - size to transfer = 1 byte. ! 4312: * - bit 24..31 = high address bit [32...39]. ! 4313: */ ! 4314: SCR_LOAD_ABS (scratcha, 4), ! 4315: PADDRH (zero), ! 4316: SCR_REG_REG (scratcha, SCR_OR, 1), ! 4317: 0, ! 4318: SCR_FROM_REG (rbc3), ! 4319: 0, ! 4320: SCR_TO_REG (scratcha3), ! 4321: 0, ! 4322: /* ! 4323: * Move this value to the table indirect. ! 4324: */ ! 4325: SCR_STORE_REL (scratcha, 4), ! 4326: offsetof (struct ccb, phys.wresid.size), ! 4327: /* ! 4328: * Wait for a valid phase. ! 4329: * While testing with bogus QUANTUM drives, the C1010 ! 4330: * sometimes raised a spurious phase mismatch with ! 4331: * WSR and the CHMOV(1) triggered another PM. ! 4332: * Waiting explicitely for the PHASE seemed to avoid ! 4333: * the nested phase mismatch. Btw, this didn't happen ! 4334: * using my IBM drives. ! 4335: */ ! 4336: SCR_JUMPR ^ IFFALSE (WHEN (SCR_DATA_IN)), ! 4337: 0, ! 4338: /* ! 4339: * Perform the move of the residual byte. ! 4340: */ ! 4341: SCR_CHMOV_TBL ^ SCR_DATA_IN, ! 4342: offsetof (struct ccb, phys.wresid), ! 4343: /* ! 4344: * We can now handle the phase mismatch with UA fixed. ! 4345: * RBC[0..23]=0 is a special case that does not require ! 4346: * a PM context. The C code also checks against this. ! 4347: */ ! 4348: SCR_FROM_REG (rbc), ! 4349: 0, ! 4350: SCR_RETURN ^ IFFALSE (DATA (0)), ! 4351: 0, ! 4352: SCR_FROM_REG (rbc1), ! 4353: 0, ! 4354: SCR_RETURN ^ IFFALSE (DATA (0)), ! 4355: 0, ! 4356: SCR_FROM_REG (rbc2), ! 4357: 0, ! 4358: SCR_RETURN ^ IFFALSE (DATA (0)), ! 4359: 0, ! 4360: /* ! 4361: * RBC[0..23]=0. ! 4362: * Not only we donnot need a PM context, but this would ! 4363: * lead to a bogus CHMOV(0). This condition means that ! 4364: * the residual was the last byte to move from this CHMOV. ! 4365: * So, we just have to move the current data script pointer ! 4366: * (i.e. TEMP) to the SCRIPTS address following the ! 4367: * interrupted CHMOV and jump to dispatcher. ! 4368: */ ! 4369: SCR_STORE_ABS (ia, 4), ! 4370: PADDRH (scratch), ! 4371: SCR_LOAD_ABS (temp, 4), ! 4372: PADDRH (scratch), ! 4373: SCR_JUMP, ! 4374: PADDR (dispatch), ! 4375: }/*--------------------------< WSR_MA_HELPER >-----------------------*/,{ ! 4376: /* ! 4377: * Helper for the C code when WSR bit is set. ! 4378: * Perform the move of the residual byte. ! 4379: */ ! 4380: SCR_CHMOV_TBL ^ SCR_DATA_IN, ! 4381: offsetof (struct ccb, phys.wresid), ! 4382: SCR_JUMP, ! 4383: PADDR (dispatch), ! 4384: }/*-------------------------< ZERO >------------------------*/,{ ! 4385: SCR_DATA_ZERO, ! 4386: }/*-------------------------< SCRATCH >---------------------*/,{ ! 4387: SCR_DATA_ZERO, ! 4388: }/*-------------------------< SCRATCH1 >--------------------*/,{ ! 4389: SCR_DATA_ZERO, ! 4390: }/*-------------------------< PM0_DATA_ADDR >---------------*/,{ ! 4391: SCR_DATA_ZERO, ! 4392: }/*-------------------------< PM1_DATA_ADDR >---------------*/,{ ! 4393: SCR_DATA_ZERO, ! 4394: }/*-------------------------< SAVED_DSA >-------------------*/,{ ! 4395: SCR_DATA_ZERO, ! 4396: }/*-------------------------< SAVED_DRS >-------------------*/,{ ! 4397: SCR_DATA_ZERO, ! 4398: }/*-------------------------< DONE_POS >--------------------*/,{ ! 4399: SCR_DATA_ZERO, ! 4400: }/*-------------------------< STARTPOS >--------------------*/,{ ! 4401: SCR_DATA_ZERO, ! 4402: }/*-------------------------< TARGTBL >---------------------*/,{ ! 4403: SCR_DATA_ZERO, ! 4404: ! 4405: ! 4406: /* ! 4407: ** We may use MEMORY MOVE instructions to load the on chip-RAM, ! 4408: ** if it happens that mapping PCI memory is not possible. ! 4409: ** But writing the RAM from the CPU is the preferred method, ! 4410: ** since PCI 2.2 seems to disallow PCI self-mastering. ! 4411: */ ! 4412: ! 4413: #ifdef SCSI_NCR_PCI_MEM_NOT_SUPPORTED ! 4414: ! 4415: }/*-------------------------< START_RAM >-------------------*/,{ ! 4416: /* ! 4417: ** Load the script into on-chip RAM, ! 4418: ** and jump to start point. ! 4419: */ ! 4420: SCR_COPY (sizeof (struct script)), ! 4421: }/*-------------------------< SCRIPT0_BA >--------------------*/,{ ! 4422: 0, ! 4423: PADDR (start), ! 4424: SCR_JUMP, ! 4425: PADDR (init), ! 4426: ! 4427: }/*-------------------------< START_RAM64 >--------------------*/,{ ! 4428: /* ! 4429: ** Load the RAM and start for 64 bit PCI (895A,896). ! 4430: ** Both scripts (script and scripth) are loaded into ! 4431: ** the RAM which is 8K (4K for 825A/875/895). ! 4432: ** We also need to load some 32-63 bit segments ! 4433: ** address of the SCRIPTS processor. ! 4434: ** LOAD/STORE ABSOLUTE always refers to on-chip RAM ! 4435: ** in our implementation. The main memory is ! 4436: ** accessed using LOAD/STORE DSA RELATIVE. ! 4437: */ ! 4438: SCR_LOAD_REL (mmws, 4), ! 4439: offsetof (struct ncb, scr_ram_seg), ! 4440: SCR_COPY (sizeof(struct script)), ! 4441: }/*-------------------------< SCRIPT0_BA64 >--------------------*/,{ ! 4442: 0, ! 4443: PADDR (start), ! 4444: SCR_COPY (sizeof(struct scripth)), ! 4445: }/*-------------------------< SCRIPTH0_BA64 >--------------------*/,{ ! 4446: 0, ! 4447: PADDRH (start64), ! 4448: SCR_LOAD_REL (mmrs, 4), ! 4449: offsetof (struct ncb, scr_ram_seg), ! 4450: SCR_JUMP64, ! 4451: PADDRH (start64), ! 4452: }/*-------------------------< RAM_SEG64 >--------------------*/,{ ! 4453: 0, ! 4454: ! 4455: #endif /* SCSI_NCR_PCI_MEM_NOT_SUPPORTED */ ! 4456: ! 4457: }/*-------------------------< SNOOPTEST >-------------------*/,{ ! 4458: /* ! 4459: ** Read the variable. ! 4460: */ ! 4461: SCR_LOAD_REL (scratcha, 4), ! 4462: offsetof(struct ncb, ncr_cache), ! 4463: SCR_STORE_REL (temp, 4), ! 4464: offsetof(struct ncb, ncr_cache), ! 4465: SCR_LOAD_REL (temp, 4), ! 4466: offsetof(struct ncb, ncr_cache), ! 4467: }/*-------------------------< SNOOPEND >-------------------*/,{ ! 4468: /* ! 4469: ** And stop. ! 4470: */ ! 4471: SCR_INT, ! 4472: 99, ! 4473: }/*--------------------------------------------------------*/ ! 4474: }; ! 4475: ! 4476: /*========================================================== ! 4477: ** ! 4478: ** ! 4479: ** Fill in #define dependent parts of the script ! 4480: ** ! 4481: ** ! 4482: **========================================================== ! 4483: */ ! 4484: ! 4485: void __init ncr_script_fill (struct script * scr, struct scripth * scrh) ! 4486: { ! 4487: int i; ! 4488: ncrcmd *p; ! 4489: ! 4490: p = scr->data_in; ! 4491: for (i=0; i<MAX_SCATTER; i++) { ! 4492: *p++ =SCR_CHMOV_TBL ^ SCR_DATA_IN; ! 4493: *p++ =offsetof (struct dsb, data[i]); ! 4494: }; ! 4495: ! 4496: assert ((u_long)p == (u_long)&scr->data_in + sizeof (scr->data_in)); ! 4497: ! 4498: p = scr->data_out; ! 4499: ! 4500: for (i=0; i<MAX_SCATTER; i++) { ! 4501: *p++ =SCR_CHMOV_TBL ^ SCR_DATA_OUT; ! 4502: *p++ =offsetof (struct dsb, data[i]); ! 4503: }; ! 4504: ! 4505: assert ((u_long)p == (u_long)&scr->data_out + sizeof (scr->data_out)); ! 4506: } ! 4507: ! 4508: /*========================================================== ! 4509: ** ! 4510: ** ! 4511: ** Copy and rebind a script. ! 4512: ** ! 4513: ** ! 4514: **========================================================== ! 4515: */ ! 4516: ! 4517: static void __init ! 4518: ncr_script_copy_and_bind (ncb_p np,ncrcmd *src,ncrcmd *dst,int len) ! 4519: { ! 4520: ncrcmd opcode, new, old, tmp1, tmp2; ! 4521: ncrcmd *start, *end; ! 4522: int relocs; ! 4523: int opchanged = 0; ! 4524: ! 4525: start = src; ! 4526: end = src + len/4; ! 4527: ! 4528: while (src < end) { ! 4529: ! 4530: opcode = *src++; ! 4531: *dst++ = cpu_to_scr(opcode); ! 4532: ! 4533: /* ! 4534: ** If we forget to change the length ! 4535: ** in struct script, a field will be ! 4536: ** padded with 0. This is an illegal ! 4537: ** command. ! 4538: */ ! 4539: ! 4540: if (opcode == 0) { ! 4541: printk (KERN_INFO "%s: ERROR0 IN SCRIPT at %d.\n", ! 4542: ncr_name(np), (int) (src-start-1)); ! 4543: MDELAY (10000); ! 4544: continue; ! 4545: }; ! 4546: ! 4547: /* ! 4548: ** We use the bogus value 0xf00ff00f ;-) ! 4549: ** to reserve data area in SCRIPTS. ! 4550: */ ! 4551: if (opcode == SCR_DATA_ZERO) { ! 4552: dst[-1] = 0; ! 4553: continue; ! 4554: } ! 4555: ! 4556: if (DEBUG_FLAGS & DEBUG_SCRIPT) ! 4557: printk (KERN_INFO "%p: <%x>\n", ! 4558: (src-1), (unsigned)opcode); ! 4559: ! 4560: /* ! 4561: ** We don't have to decode ALL commands ! 4562: */ ! 4563: switch (opcode >> 28) { ! 4564: ! 4565: case 0xf: ! 4566: /* ! 4567: ** LOAD / STORE DSA relative, don't relocate. ! 4568: */ ! 4569: relocs = 0; ! 4570: break; ! 4571: case 0xe: ! 4572: /* ! 4573: ** LOAD / STORE absolute. ! 4574: */ ! 4575: relocs = 1; ! 4576: break; ! 4577: case 0xc: ! 4578: /* ! 4579: ** COPY has TWO arguments. ! 4580: */ ! 4581: relocs = 2; ! 4582: tmp1 = src[0]; ! 4583: tmp2 = src[1]; ! 4584: #ifdef RELOC_KVAR ! 4585: if ((tmp1 & RELOC_MASK) == RELOC_KVAR) ! 4586: tmp1 = 0; ! 4587: if ((tmp2 & RELOC_MASK) == RELOC_KVAR) ! 4588: tmp2 = 0; ! 4589: #endif ! 4590: if ((tmp1 ^ tmp2) & 3) { ! 4591: printk (KERN_ERR"%s: ERROR1 IN SCRIPT at %d.\n", ! 4592: ncr_name(np), (int) (src-start-1)); ! 4593: MDELAY (1000); ! 4594: } ! 4595: /* ! 4596: ** If PREFETCH feature not enabled, remove ! 4597: ** the NO FLUSH bit if present. ! 4598: */ ! 4599: if ((opcode & SCR_NO_FLUSH) && ! 4600: !(np->features & FE_PFEN)) { ! 4601: dst[-1] = cpu_to_scr(opcode & ~SCR_NO_FLUSH); ! 4602: ++opchanged; ! 4603: } ! 4604: break; ! 4605: ! 4606: case 0x0: ! 4607: /* ! 4608: ** MOVE/CHMOV (absolute address) ! 4609: */ ! 4610: if (!(np->features & FE_WIDE)) ! 4611: dst[-1] = cpu_to_scr(opcode | OPC_MOVE); ! 4612: relocs = 1; ! 4613: break; ! 4614: ! 4615: case 0x1: ! 4616: /* ! 4617: ** MOVE/CHMOV (table indirect) ! 4618: */ ! 4619: if (!(np->features & FE_WIDE)) ! 4620: dst[-1] = cpu_to_scr(opcode | OPC_MOVE); ! 4621: relocs = 0; ! 4622: break; ! 4623: ! 4624: case 0x8: ! 4625: /* ! 4626: ** JUMP / CALL ! 4627: ** dont't relocate if relative :-) ! 4628: */ ! 4629: if (opcode & 0x00800000) ! 4630: relocs = 0; ! 4631: else if ((opcode & 0xf8400000) == 0x80400000)/*JUMP64*/ ! 4632: relocs = 2; ! 4633: else ! 4634: relocs = 1; ! 4635: break; ! 4636: ! 4637: case 0x4: ! 4638: case 0x5: ! 4639: case 0x6: ! 4640: case 0x7: ! 4641: relocs = 1; ! 4642: break; ! 4643: ! 4644: default: ! 4645: relocs = 0; ! 4646: break; ! 4647: }; ! 4648: ! 4649: if (!relocs) { ! 4650: *dst++ = cpu_to_scr(*src++); ! 4651: continue; ! 4652: } ! 4653: while (relocs--) { ! 4654: old = *src++; ! 4655: ! 4656: switch (old & RELOC_MASK) { ! 4657: case RELOC_REGISTER: ! 4658: new = (old & ~RELOC_MASK) + pcivtobus(np->base_ba); ! 4659: break; ! 4660: case RELOC_LABEL: ! 4661: new = (old & ~RELOC_MASK) + np->p_script; ! 4662: break; ! 4663: case RELOC_LABELH: ! 4664: new = (old & ~RELOC_MASK) + np->p_scripth; ! 4665: break; ! 4666: case RELOC_SOFTC: ! 4667: new = (old & ~RELOC_MASK) + np->p_ncb; ! 4668: break; ! 4669: #ifdef RELOC_KVAR ! 4670: case RELOC_KVAR: ! 4671: new=0; ! 4672: if (((old & ~RELOC_MASK) < SCRIPT_KVAR_FIRST) || ! 4673: ((old & ~RELOC_MASK) > SCRIPT_KVAR_LAST)) ! 4674: panic("ncr KVAR out of range"); ! 4675: new = vtobus(script_kvars[old & ~RELOC_MASK]); ! 4676: #endif ! 4677: break; ! 4678: case 0: ! 4679: /* Don't relocate a 0 address. */ ! 4680: if (old == 0) { ! 4681: new = old; ! 4682: break; ! 4683: } ! 4684: /* fall through */ ! 4685: default: ! 4686: new = 0; /* For 'cc' not to complain */ ! 4687: panic("ncr_script_copy_and_bind: " ! 4688: "weird relocation %x\n", old); ! 4689: break; ! 4690: } ! 4691: ! 4692: *dst++ = cpu_to_scr(new); ! 4693: } ! 4694: }; ! 4695: } ! 4696: ! 4697: /*========================================================== ! 4698: ** ! 4699: ** ! 4700: ** Auto configuration: attach and init a host adapter. ! 4701: ** ! 4702: ** ! 4703: **========================================================== ! 4704: */ ! 4705: ! 4706: /* ! 4707: ** Linux host data structure. ! 4708: */ ! 4709: ! 4710: struct host_data { ! 4711: struct ncb *ncb; ! 4712: }; ! 4713: ! 4714: /* ! 4715: ** Print something which allows to retrieve the controler type, unit, ! 4716: ** target, lun concerned by a kernel message. ! 4717: */ ! 4718: ! 4719: static void PRINT_TARGET(ncb_p np, int target) ! 4720: { ! 4721: printk(KERN_INFO "%s-<%d,*>: ", ncr_name(np), target); ! 4722: } ! 4723: ! 4724: static void PRINT_LUN(ncb_p np, int target, int lun) ! 4725: { ! 4726: printk(KERN_INFO "%s-<%d,%d>: ", ncr_name(np), target, lun); ! 4727: } ! 4728: ! 4729: static void PRINT_ADDR(Scsi_Cmnd *cmd) ! 4730: { ! 4731: struct host_data *host_data = (struct host_data *) cmd->host->hostdata; ! 4732: PRINT_LUN(host_data->ncb, cmd->target, cmd->lun); ! 4733: } ! 4734: ! 4735: /*========================================================== ! 4736: ** ! 4737: ** NCR chip clock divisor table. ! 4738: ** Divisors are multiplied by 10,000,000 in order to make ! 4739: ** calculations more simple. ! 4740: ** ! 4741: **========================================================== ! 4742: */ ! 4743: ! 4744: #define _5M 5000000 ! 4745: static u_long div_10M[] = ! 4746: {2*_5M, 3*_5M, 4*_5M, 6*_5M, 8*_5M, 12*_5M, 16*_5M}; ! 4747: ! 4748: ! 4749: /*=============================================================== ! 4750: ** ! 4751: ** Prepare io register values used by ncr_init() according ! 4752: ** to selected and supported features. ! 4753: ** ! 4754: ** NCR/SYMBIOS chips allow burst lengths of 2, 4, 8, 16, 32, 64, ! 4755: ** 128 transfers. All chips support at least 16 transfers bursts. ! 4756: ** The 825A, 875 and 895 chips support bursts of up to 128 ! 4757: ** transfers and the 895A and 896 support bursts of up to 64 ! 4758: ** transfers. All other chips support up to 16 transfers bursts. ! 4759: ** ! 4760: ** For PCI 32 bit data transfers each transfer is a DWORD (4 bytes). ! 4761: ** It is a QUADWORD (8 bytes) for PCI 64 bit data transfers. ! 4762: ** Only the 896 is able to perform 64 bit data transfers. ! 4763: ** ! 4764: ** We use log base 2 (burst length) as internal code, with ! 4765: ** value 0 meaning "burst disabled". ! 4766: ** ! 4767: **=============================================================== ! 4768: */ ! 4769: ! 4770: /* ! 4771: * Burst length from burst code. ! 4772: */ ! 4773: #define burst_length(bc) (!(bc))? 0 : 1 << (bc) ! 4774: ! 4775: /* ! 4776: * Burst code from io register bits. ! 4777: */ ! 4778: #define burst_code(dmode, ctest4, ctest5) \ ! 4779: (ctest4) & 0x80? 0 : (((dmode) & 0xc0) >> 6) + ((ctest5) & 0x04) + 1 ! 4780: ! 4781: /* ! 4782: * Set initial io register bits from burst code. ! 4783: */ ! 4784: static inline void ncr_init_burst(ncb_p np, u_char bc) ! 4785: { ! 4786: np->rv_ctest4 &= ~0x80; ! 4787: np->rv_dmode &= ~(0x3 << 6); ! 4788: np->rv_ctest5 &= ~0x4; ! 4789: ! 4790: if (!bc) { ! 4791: np->rv_ctest4 |= 0x80; ! 4792: } ! 4793: else { ! 4794: --bc; ! 4795: np->rv_dmode |= ((bc & 0x3) << 6); ! 4796: np->rv_ctest5 |= (bc & 0x4); ! 4797: } ! 4798: } ! 4799: ! 4800: #ifdef SCSI_NCR_NVRAM_SUPPORT ! 4801: ! 4802: /* ! 4803: ** Get target set-up from Symbios format NVRAM. ! 4804: */ ! 4805: ! 4806: static void __init ! 4807: ncr_Symbios_setup_target(ncb_p np, int target, Symbios_nvram *nvram) ! 4808: { ! 4809: tcb_p tp = &np->target[target]; ! 4810: Symbios_target *tn = &nvram->target[target]; ! 4811: ! 4812: tp->usrsync = tn->sync_period ? (tn->sync_period + 3) / 4 : 255; ! 4813: tp->usrwide = tn->bus_width == 0x10 ? 1 : 0; ! 4814: tp->usrtags = ! 4815: (tn->flags & SYMBIOS_QUEUE_TAGS_ENABLED)? MAX_TAGS : 0; ! 4816: ! 4817: if (!(tn->flags & SYMBIOS_DISCONNECT_ENABLE)) ! 4818: tp->usrflag |= UF_NODISC; ! 4819: if (!(tn->flags & SYMBIOS_SCAN_AT_BOOT_TIME)) ! 4820: tp->usrflag |= UF_NOSCAN; ! 4821: } ! 4822: ! 4823: /* ! 4824: ** Get target set-up from Tekram format NVRAM. ! 4825: */ ! 4826: ! 4827: static void __init ! 4828: ncr_Tekram_setup_target(ncb_p np, int target, Tekram_nvram *nvram) ! 4829: { ! 4830: tcb_p tp = &np->target[target]; ! 4831: struct Tekram_target *tn = &nvram->target[target]; ! 4832: int i; ! 4833: ! 4834: if (tn->flags & TEKRAM_SYNC_NEGO) { ! 4835: i = tn->sync_index & 0xf; ! 4836: tp->usrsync = Tekram_sync[i]; ! 4837: } ! 4838: ! 4839: tp->usrwide = (tn->flags & TEKRAM_WIDE_NEGO) ? 1 : 0; ! 4840: ! 4841: if (tn->flags & TEKRAM_TAGGED_COMMANDS) { ! 4842: tp->usrtags = 2 << nvram->max_tags_index; ! 4843: } ! 4844: ! 4845: if (!(tn->flags & TEKRAM_DISCONNECT_ENABLE)) ! 4846: tp->usrflag = UF_NODISC; ! 4847: ! 4848: /* If any device does not support parity, we will not use this option */ ! 4849: if (!(tn->flags & TEKRAM_PARITY_CHECK)) ! 4850: np->rv_scntl0 &= ~0x0a; /* SCSI parity checking disabled */ ! 4851: } ! 4852: #endif /* SCSI_NCR_NVRAM_SUPPORT */ ! 4853: ! 4854: /* ! 4855: ** Save initial settings of some IO registers. ! 4856: ** Assumed to have been set by BIOS. ! 4857: */ ! 4858: static void __init ncr_save_initial_setting(ncb_p np) ! 4859: { ! 4860: np->sv_scntl0 = INB(nc_scntl0) & 0x0a; ! 4861: np->sv_dmode = INB(nc_dmode) & 0xce; ! 4862: np->sv_dcntl = INB(nc_dcntl) & 0xa8; ! 4863: np->sv_ctest3 = INB(nc_ctest3) & 0x01; ! 4864: np->sv_ctest4 = INB(nc_ctest4) & 0x80; ! 4865: np->sv_gpcntl = INB(nc_gpcntl); ! 4866: np->sv_stest2 = INB(nc_stest2) & 0x20; ! 4867: np->sv_stest4 = INB(nc_stest4); ! 4868: np->sv_stest1 = INB(nc_stest1); ! 4869: ! 4870: np->sv_scntl3 = INB(nc_scntl3) & 0x07; ! 4871: ! 4872: if ((np->device_id == PCI_DEVICE_ID_LSI_53C1010) || ! 4873: (np->device_id == PCI_DEVICE_ID_LSI_53C1010_66) ){ ! 4874: /* ! 4875: ** C1010 always uses large fifo, bit 5 rsvd ! 4876: ** scntl4 used ONLY with C1010 ! 4877: */ ! 4878: np->sv_ctest5 = INB(nc_ctest5) & 0x04 ; ! 4879: np->sv_scntl4 = INB(nc_scntl4); ! 4880: } ! 4881: else { ! 4882: np->sv_ctest5 = INB(nc_ctest5) & 0x24 ; ! 4883: np->sv_scntl4 = 0; ! 4884: } ! 4885: } ! 4886: ! 4887: /* ! 4888: ** Prepare io register values used by ncr_init() ! 4889: ** according to selected and supported features. ! 4890: */ ! 4891: static int __init ncr_prepare_setting(ncb_p np, ncr_nvram *nvram) ! 4892: { ! 4893: u_char burst_max; ! 4894: u_long period; ! 4895: int i; ! 4896: ! 4897: /* ! 4898: ** Wide ? ! 4899: */ ! 4900: ! 4901: np->maxwide = (np->features & FE_WIDE)? 1 : 0; ! 4902: ! 4903: /* ! 4904: ** Get the frequency of the chip's clock. ! 4905: ** Find the right value for scntl3. ! 4906: */ ! 4907: ! 4908: if (np->features & FE_QUAD) ! 4909: np->multiplier = 4; ! 4910: else if (np->features & FE_DBLR) ! 4911: np->multiplier = 2; ! 4912: else ! 4913: np->multiplier = 1; ! 4914: ! 4915: np->clock_khz = (np->features & FE_CLK80)? 80000 : 40000; ! 4916: np->clock_khz *= np->multiplier; ! 4917: ! 4918: if (np->clock_khz != 40000) ! 4919: ncr_getclock(np, np->multiplier); ! 4920: ! 4921: /* ! 4922: * Divisor to be used for async (timer pre-scaler). ! 4923: * ! 4924: * Note: For C1010 the async divisor is 2(8) if he ! 4925: * quadrupler is disabled (enabled). ! 4926: */ ! 4927: ! 4928: if ( (np->device_id == PCI_DEVICE_ID_LSI_53C1010) || ! 4929: (np->device_id == PCI_DEVICE_ID_LSI_53C1010_66)) { ! 4930: ! 4931: np->rv_scntl3 = 0; ! 4932: } ! 4933: else ! 4934: { ! 4935: i = np->clock_divn - 1; ! 4936: while (--i >= 0) { ! 4937: if (10ul * SCSI_NCR_MIN_ASYNC * np->clock_khz ! 4938: > div_10M[i]) { ! 4939: ++i; ! 4940: break; ! 4941: } ! 4942: } ! 4943: np->rv_scntl3 = i+1; ! 4944: } ! 4945: ! 4946: ! 4947: /* ! 4948: * Save the ultra3 register for the C1010/C1010_66 ! 4949: */ ! 4950: ! 4951: np->rv_scntl4 = np->sv_scntl4; ! 4952: ! 4953: /* ! 4954: * Minimum synchronous period factor supported by the chip. ! 4955: * Btw, 'period' is in tenths of nanoseconds. ! 4956: */ ! 4957: ! 4958: period = (4 * div_10M[0] + np->clock_khz - 1) / np->clock_khz; ! 4959: if (period <= 250) np->minsync = 10; ! 4960: else if (period <= 303) np->minsync = 11; ! 4961: else if (period <= 500) np->minsync = 12; ! 4962: else np->minsync = (period + 40 - 1) / 40; ! 4963: ! 4964: /* ! 4965: * Fix up. If sync. factor is 10 (160000Khz clock) and chip ! 4966: * supports ultra3, then min. sync. period 12.5ns and the factor is 9 ! 4967: */ ! 4968: ! 4969: if ((np->minsync == 10) && (np->features & FE_ULTRA3)) ! 4970: np->minsync = 9; ! 4971: ! 4972: /* ! 4973: * Check against chip SCSI standard support (SCSI-2,ULTRA,ULTRA2). ! 4974: * ! 4975: * Transfer period minimums: SCSI-1 200 (50); Fast 100 (25) ! 4976: * Ultra 50 (12); Ultra2 (6); Ultra3 (3) ! 4977: */ ! 4978: ! 4979: if (np->minsync < 25 && !(np->features & (FE_ULTRA|FE_ULTRA2|FE_ULTRA3))) ! 4980: np->minsync = 25; ! 4981: else if (np->minsync < 12 && (np->features & FE_ULTRA)) ! 4982: np->minsync = 12; ! 4983: else if (np->minsync < 10 && (np->features & FE_ULTRA2)) ! 4984: np->minsync = 10; ! 4985: else if (np->minsync < 9 && (np->features & FE_ULTRA3)) ! 4986: np->minsync = 9; ! 4987: ! 4988: /* ! 4989: * Maximum synchronous period factor supported by the chip. ! 4990: */ ! 4991: ! 4992: period = (11 * div_10M[np->clock_divn - 1]) / (4 * np->clock_khz); ! 4993: np->maxsync = period > 2540 ? 254 : period / 10; ! 4994: ! 4995: /* ! 4996: ** 64 bit (53C895A or 53C896) ? ! 4997: */ ! 4998: if (np->features & FE_64BIT) ! 4999: #ifdef SCSI_NCR_USE_64BIT_DAC ! 5000: np->rv_ccntl1 |= (XTIMOD | EXTIBMV); ! 5001: #else ! 5002: np->rv_ccntl1 |= (DDAC); ! 5003: #endif ! 5004: ! 5005: /* ! 5006: ** Phase mismatch handled by SCRIPTS (53C895A, 53C896 or C1010) ? ! 5007: */ ! 5008: if (np->features & FE_NOPM) ! 5009: np->rv_ccntl0 |= (ENPMJ); ! 5010: ! 5011: /* ! 5012: ** Prepare initial value of other IO registers ! 5013: */ ! 5014: #if defined SCSI_NCR_TRUST_BIOS_SETTING ! 5015: np->rv_scntl0 = np->sv_scntl0; ! 5016: np->rv_dmode = np->sv_dmode; ! 5017: np->rv_dcntl = np->sv_dcntl; ! 5018: np->rv_ctest3 = np->sv_ctest3; ! 5019: np->rv_ctest4 = np->sv_ctest4; ! 5020: np->rv_ctest5 = np->sv_ctest5; ! 5021: burst_max = burst_code(np->sv_dmode, np->sv_ctest4, np->sv_ctest5); ! 5022: #else ! 5023: ! 5024: /* ! 5025: ** Select burst length (dwords) ! 5026: */ ! 5027: burst_max = driver_setup.burst_max; ! 5028: if (burst_max == 255) ! 5029: burst_max = burst_code(np->sv_dmode, np->sv_ctest4, np->sv_ctest5); ! 5030: if (burst_max > 7) ! 5031: burst_max = 7; ! 5032: if (burst_max > np->maxburst) ! 5033: burst_max = np->maxburst; ! 5034: ! 5035: /* ! 5036: ** DEL 352 - 53C810 Rev x11 - Part Number 609-0392140 - ITEM 2. ! 5037: ** This chip and the 860 Rev 1 may wrongly use PCI cache line ! 5038: ** based transactions on LOAD/STORE instructions. So we have ! 5039: ** to prevent these chips from using such PCI transactions in ! 5040: ** this driver. The generic sym53c8xx driver that does not use ! 5041: ** LOAD/STORE instructions does not need this work-around. ! 5042: */ ! 5043: if ((np->device_id == PCI_DEVICE_ID_NCR_53C810 && ! 5044: np->revision_id >= 0x10 && np->revision_id <= 0x11) || ! 5045: (np->device_id == PCI_DEVICE_ID_NCR_53C860 && ! 5046: np->revision_id <= 0x1)) ! 5047: np->features &= ~(FE_WRIE|FE_ERL|FE_ERMP); ! 5048: ! 5049: /* ! 5050: ** DEL ? - 53C1010 Rev 1 - Part Number 609-0393638 ! 5051: ** 64-bit Slave Cycles must be disabled. ! 5052: */ ! 5053: if ( ((np->device_id == PCI_DEVICE_ID_LSI_53C1010) && (np->revision_id < 0x02) ) ! 5054: || (np->device_id == PCI_DEVICE_ID_LSI_53C1010_66 ) ) ! 5055: np->rv_ccntl1 |= 0x10; ! 5056: ! 5057: /* ! 5058: ** Select all supported special features. ! 5059: ** If we are using on-board RAM for scripts, prefetch (PFEN) ! 5060: ** does not help, but burst op fetch (BOF) does. ! 5061: ** Disabling PFEN makes sure BOF will be used. ! 5062: */ ! 5063: if (np->features & FE_ERL) ! 5064: np->rv_dmode |= ERL; /* Enable Read Line */ ! 5065: if (np->features & FE_BOF) ! 5066: np->rv_dmode |= BOF; /* Burst Opcode Fetch */ ! 5067: if (np->features & FE_ERMP) ! 5068: np->rv_dmode |= ERMP; /* Enable Read Multiple */ ! 5069: #if 1 ! 5070: if ((np->features & FE_PFEN) && !np->base2_ba) ! 5071: #else ! 5072: if (np->features & FE_PFEN) ! 5073: #endif ! 5074: np->rv_dcntl |= PFEN; /* Prefetch Enable */ ! 5075: if (np->features & FE_CLSE) ! 5076: np->rv_dcntl |= CLSE; /* Cache Line Size Enable */ ! 5077: if (np->features & FE_WRIE) ! 5078: np->rv_ctest3 |= WRIE; /* Write and Invalidate */ ! 5079: ! 5080: ! 5081: if ( (np->device_id != PCI_DEVICE_ID_LSI_53C1010) && ! 5082: (np->device_id != PCI_DEVICE_ID_LSI_53C1010_66) && ! 5083: (np->features & FE_DFS)) ! 5084: np->rv_ctest5 |= DFS; /* Dma Fifo Size */ ! 5085: /* C1010/C1010_66 always large fifo */ ! 5086: ! 5087: /* ! 5088: ** Select some other ! 5089: */ ! 5090: if (driver_setup.master_parity) ! 5091: np->rv_ctest4 |= MPEE; /* Master parity checking */ ! 5092: if (driver_setup.scsi_parity) ! 5093: np->rv_scntl0 |= 0x0a; /* full arb., ena parity, par->ATN */ ! 5094: ! 5095: #ifdef SCSI_NCR_NVRAM_SUPPORT ! 5096: /* ! 5097: ** Get parity checking, host ID and verbose mode from NVRAM ! 5098: **/ ! 5099: if (nvram) { ! 5100: switch(nvram->type) { ! 5101: case SCSI_NCR_TEKRAM_NVRAM: ! 5102: np->myaddr = nvram->data.Tekram.host_id & 0x0f; ! 5103: break; ! 5104: case SCSI_NCR_SYMBIOS_NVRAM: ! 5105: if (!(nvram->data.Symbios.flags & SYMBIOS_PARITY_ENABLE)) ! 5106: np->rv_scntl0 &= ~0x0a; ! 5107: np->myaddr = nvram->data.Symbios.host_id & 0x0f; ! 5108: if (nvram->data.Symbios.flags & SYMBIOS_VERBOSE_MSGS) ! 5109: np->verbose += 1; ! 5110: break; ! 5111: } ! 5112: } ! 5113: #endif ! 5114: /* ! 5115: ** Get SCSI addr of host adapter (set by bios?). ! 5116: */ ! 5117: if (np->myaddr == 255) { ! 5118: np->myaddr = INB(nc_scid) & 0x07; ! 5119: if (!np->myaddr) ! 5120: np->myaddr = SCSI_NCR_MYADDR; ! 5121: } ! 5122: ! 5123: #endif /* SCSI_NCR_TRUST_BIOS_SETTING */ ! 5124: ! 5125: /* ! 5126: * Prepare initial io register bits for burst length ! 5127: */ ! 5128: ncr_init_burst(np, burst_max); ! 5129: ! 5130: /* ! 5131: ** Set SCSI BUS mode. ! 5132: ** ! 5133: ** - ULTRA2 chips (895/895A/896) ! 5134: ** and ULTRA 3 chips (1010) report the current ! 5135: ** BUS mode through the STEST4 IO register. ! 5136: ** - For previous generation chips (825/825A/875), ! 5137: ** user has to tell us how to check against HVD, ! 5138: ** since a 100% safe algorithm is not possible. ! 5139: */ ! 5140: np->scsi_mode = SMODE_SE; ! 5141: if (np->features & (FE_ULTRA2 | FE_ULTRA3)) ! 5142: np->scsi_mode = (np->sv_stest4 & SMODE); ! 5143: else if (np->features & FE_DIFF) { ! 5144: switch(driver_setup.diff_support) { ! 5145: case 4: /* Trust previous settings if present, then GPIO3 */ ! 5146: if (np->sv_scntl3) { ! 5147: if (np->sv_stest2 & 0x20) ! 5148: np->scsi_mode = SMODE_HVD; ! 5149: break; ! 5150: } ! 5151: case 3: /* SYMBIOS controllers report HVD through GPIO3 */ ! 5152: if (nvram && nvram->type != SCSI_NCR_SYMBIOS_NVRAM) ! 5153: break; ! 5154: if (INB(nc_gpreg) & 0x08) ! 5155: break; ! 5156: case 2: /* Set HVD unconditionally */ ! 5157: np->scsi_mode = SMODE_HVD; ! 5158: case 1: /* Trust previous settings for HVD */ ! 5159: if (np->sv_stest2 & 0x20) ! 5160: np->scsi_mode = SMODE_HVD; ! 5161: break; ! 5162: default:/* Don't care about HVD */ ! 5163: break; ! 5164: } ! 5165: } ! 5166: if (np->scsi_mode == SMODE_HVD) ! 5167: np->rv_stest2 |= 0x20; ! 5168: ! 5169: /* ! 5170: ** Set LED support from SCRIPTS. ! 5171: ** Ignore this feature for boards known to use a ! 5172: ** specific GPIO wiring and for the 895A or 896 ! 5173: ** that drive the LED directly. ! 5174: ** Also probe initial setting of GPIO0 as output. ! 5175: */ ! 5176: if ((driver_setup.led_pin || ! 5177: (nvram && nvram->type == SCSI_NCR_SYMBIOS_NVRAM)) && ! 5178: !(np->features & FE_LEDC) && !(np->sv_gpcntl & 0x01)) ! 5179: np->features |= FE_LED0; ! 5180: ! 5181: /* ! 5182: ** Set irq mode. ! 5183: */ ! 5184: switch(driver_setup.irqm & 3) { ! 5185: case 2: ! 5186: np->rv_dcntl |= IRQM; ! 5187: break; ! 5188: case 1: ! 5189: np->rv_dcntl |= (np->sv_dcntl & IRQM); ! 5190: break; ! 5191: default: ! 5192: break; ! 5193: } ! 5194: ! 5195: /* ! 5196: ** Configure targets according to driver setup. ! 5197: ** If NVRAM present get targets setup from NVRAM. ! 5198: ** Allow to override sync, wide and NOSCAN from ! 5199: ** boot command line. ! 5200: */ ! 5201: for (i = 0 ; i < MAX_TARGET ; i++) { ! 5202: tcb_p tp = &np->target[i]; ! 5203: ! 5204: tp->usrsync = 255; ! 5205: #ifdef SCSI_NCR_NVRAM_SUPPORT ! 5206: if (nvram) { ! 5207: switch(nvram->type) { ! 5208: case SCSI_NCR_TEKRAM_NVRAM: ! 5209: ncr_Tekram_setup_target(np, i, &nvram->data.Tekram); ! 5210: break; ! 5211: case SCSI_NCR_SYMBIOS_NVRAM: ! 5212: ncr_Symbios_setup_target(np, i, &nvram->data.Symbios); ! 5213: break; ! 5214: } ! 5215: if (driver_setup.use_nvram & 0x2) ! 5216: tp->usrsync = driver_setup.default_sync; ! 5217: if (driver_setup.use_nvram & 0x4) ! 5218: tp->usrwide = driver_setup.max_wide; ! 5219: if (driver_setup.use_nvram & 0x8) ! 5220: tp->usrflag &= ~UF_NOSCAN; ! 5221: } ! 5222: else { ! 5223: #else ! 5224: if (1) { ! 5225: #endif ! 5226: tp->usrsync = driver_setup.default_sync; ! 5227: tp->usrwide = driver_setup.max_wide; ! 5228: tp->usrtags = MAX_TAGS; ! 5229: if (!driver_setup.disconnection) ! 5230: np->target[i].usrflag = UF_NODISC; ! 5231: } ! 5232: } ! 5233: ! 5234: /* ! 5235: ** Announce all that stuff to user. ! 5236: */ ! 5237: ! 5238: i = nvram ? nvram->type : 0; ! 5239: printk(KERN_INFO "%s: %sID %d, Fast-%d%s%s\n", ncr_name(np), ! 5240: i == SCSI_NCR_SYMBIOS_NVRAM ? "Symbios format NVRAM, " : ! 5241: (i == SCSI_NCR_TEKRAM_NVRAM ? "Tekram format NVRAM, " : ""), ! 5242: np->myaddr, ! 5243: np->minsync < 10 ? 80 : ! 5244: (np->minsync < 12 ? 40 : (np->minsync < 25 ? 20 : 10) ), ! 5245: (np->rv_scntl0 & 0xa) ? ", Parity Checking" : ", NO Parity", ! 5246: (np->rv_stest2 & 0x20) ? ", Differential" : ""); ! 5247: ! 5248: if (bootverbose > 1) { ! 5249: printk (KERN_INFO "%s: initial SCNTL3/DMODE/DCNTL/CTEST3/4/5 = " ! 5250: "(hex) %02x/%02x/%02x/%02x/%02x/%02x\n", ! 5251: ncr_name(np), np->sv_scntl3, np->sv_dmode, np->sv_dcntl, ! 5252: np->sv_ctest3, np->sv_ctest4, np->sv_ctest5); ! 5253: ! 5254: printk (KERN_INFO "%s: final SCNTL3/DMODE/DCNTL/CTEST3/4/5 = " ! 5255: "(hex) %02x/%02x/%02x/%02x/%02x/%02x\n", ! 5256: ncr_name(np), np->rv_scntl3, np->rv_dmode, np->rv_dcntl, ! 5257: np->rv_ctest3, np->rv_ctest4, np->rv_ctest5); ! 5258: } ! 5259: ! 5260: if (bootverbose && np->base2_ba) ! 5261: printk (KERN_INFO "%s: on-chip RAM at 0x%lx\n", ! 5262: ncr_name(np), np->base2_ba); ! 5263: ! 5264: return 0; ! 5265: } ! 5266: ! 5267: ! 5268: #ifdef SCSI_NCR_DEBUG_NVRAM ! 5269: ! 5270: void __init ncr_display_Symbios_nvram(ncb_p np, Symbios_nvram *nvram) ! 5271: { ! 5272: int i; ! 5273: ! 5274: /* display Symbios nvram host data */ ! 5275: printk(KERN_DEBUG "%s: HOST ID=%d%s%s%s%s%s\n", ! 5276: ncr_name(np), nvram->host_id & 0x0f, ! 5277: (nvram->flags & SYMBIOS_SCAM_ENABLE) ? " SCAM" :"", ! 5278: (nvram->flags & SYMBIOS_PARITY_ENABLE) ? " PARITY" :"", ! 5279: (nvram->flags & SYMBIOS_VERBOSE_MSGS) ? " VERBOSE" :"", ! 5280: (nvram->flags & SYMBIOS_CHS_MAPPING) ? " CHS_ALT" :"", ! 5281: (nvram->flags1 & SYMBIOS_SCAN_HI_LO) ? " HI_LO" :""); ! 5282: ! 5283: /* display Symbios nvram drive data */ ! 5284: for (i = 0 ; i < 15 ; i++) { ! 5285: struct Symbios_target *tn = &nvram->target[i]; ! 5286: printk(KERN_DEBUG "%s-%d:%s%s%s%s WIDTH=%d SYNC=%d TMO=%d\n", ! 5287: ncr_name(np), i, ! 5288: (tn->flags & SYMBIOS_DISCONNECT_ENABLE) ? " DISC" : "", ! 5289: (tn->flags & SYMBIOS_SCAN_AT_BOOT_TIME) ? " SCAN_BOOT" : "", ! 5290: (tn->flags & SYMBIOS_SCAN_LUNS) ? " SCAN_LUNS" : "", ! 5291: (tn->flags & SYMBIOS_QUEUE_TAGS_ENABLED)? " TCQ" : "", ! 5292: tn->bus_width, ! 5293: tn->sync_period / 4, ! 5294: tn->timeout); ! 5295: } ! 5296: } ! 5297: ! 5298: static u_char Tekram_boot_delay[7] __initdata = {3, 5, 10, 20, 30, 60, 120}; ! 5299: ! 5300: void __init ncr_display_Tekram_nvram(ncb_p np, Tekram_nvram *nvram) ! 5301: { ! 5302: int i, tags, boot_delay; ! 5303: char *rem; ! 5304: ! 5305: /* display Tekram nvram host data */ ! 5306: tags = 2 << nvram->max_tags_index; ! 5307: boot_delay = 0; ! 5308: if (nvram->boot_delay_index < 6) ! 5309: boot_delay = Tekram_boot_delay[nvram->boot_delay_index]; ! 5310: switch((nvram->flags & TEKRAM_REMOVABLE_FLAGS) >> 6) { ! 5311: default: ! 5312: case 0: rem = ""; break; ! 5313: case 1: rem = " REMOVABLE=boot device"; break; ! 5314: case 2: rem = " REMOVABLE=all"; break; ! 5315: } ! 5316: ! 5317: printk(KERN_DEBUG ! 5318: "%s: HOST ID=%d%s%s%s%s%s%s%s%s%s BOOT DELAY=%d tags=%d\n", ! 5319: ncr_name(np), nvram->host_id & 0x0f, ! 5320: (nvram->flags1 & SYMBIOS_SCAM_ENABLE) ? " SCAM" :"", ! 5321: (nvram->flags & TEKRAM_MORE_THAN_2_DRIVES) ? " >2DRIVES" :"", ! 5322: (nvram->flags & TEKRAM_DRIVES_SUP_1GB) ? " >1GB" :"", ! 5323: (nvram->flags & TEKRAM_RESET_ON_POWER_ON) ? " RESET" :"", ! 5324: (nvram->flags & TEKRAM_ACTIVE_NEGATION) ? " ACT_NEG" :"", ! 5325: (nvram->flags & TEKRAM_IMMEDIATE_SEEK) ? " IMM_SEEK" :"", ! 5326: (nvram->flags & TEKRAM_SCAN_LUNS) ? " SCAN_LUNS" :"", ! 5327: (nvram->flags1 & TEKRAM_F2_F6_ENABLED) ? " F2_F6" :"", ! 5328: rem, boot_delay, tags); ! 5329: ! 5330: /* display Tekram nvram drive data */ ! 5331: for (i = 0; i <= 15; i++) { ! 5332: int sync, j; ! 5333: struct Tekram_target *tn = &nvram->target[i]; ! 5334: j = tn->sync_index & 0xf; ! 5335: sync = Tekram_sync[j]; ! 5336: printk(KERN_DEBUG "%s-%d:%s%s%s%s%s%s PERIOD=%d\n", ! 5337: ncr_name(np), i, ! 5338: (tn->flags & TEKRAM_PARITY_CHECK) ? " PARITY" : "", ! 5339: (tn->flags & TEKRAM_SYNC_NEGO) ? " SYNC" : "", ! 5340: (tn->flags & TEKRAM_DISCONNECT_ENABLE) ? " DISC" : "", ! 5341: (tn->flags & TEKRAM_START_CMD) ? " START" : "", ! 5342: (tn->flags & TEKRAM_TAGGED_COMMANDS) ? " TCQ" : "", ! 5343: (tn->flags & TEKRAM_WIDE_NEGO) ? " WIDE" : "", ! 5344: sync); ! 5345: } ! 5346: } ! 5347: #endif /* SCSI_NCR_DEBUG_NVRAM */ ! 5348: ! 5349: /* ! 5350: ** Host attach and initialisations. ! 5351: ** ! 5352: ** Allocate host data and ncb structure. ! 5353: ** Request IO region and remap MMIO region. ! 5354: ** Do chip initialization. ! 5355: ** If all is OK, install interrupt handling and ! 5356: ** start the timer daemon. ! 5357: */ ! 5358: ! 5359: static int __init ! 5360: ncr_attach (Scsi_Host_Template *tpnt, int unit, ncr_device *device) ! 5361: { ! 5362: struct host_data *host_data; ! 5363: ncb_p np = 0; ! 5364: struct Scsi_Host *instance = 0; ! 5365: u_long flags = 0; ! 5366: ncr_nvram *nvram = device->nvram; ! 5367: int i; ! 5368: ! 5369: printk(KERN_INFO NAME53C "%s-%d: rev 0x%x on pci bus %d device %d function %d " ! 5370: #ifdef __sparc__ ! 5371: "irq %s\n", ! 5372: #else ! 5373: "irq %d\n", ! 5374: #endif ! 5375: device->chip.name, unit, device->chip.revision_id, ! 5376: device->slot.bus, (device->slot.device_fn & 0xf8) >> 3, ! 5377: device->slot.device_fn & 7, ! 5378: #ifdef __sparc__ ! 5379: __irq_itoa(device->slot.irq)); ! 5380: #else ! 5381: device->slot.irq); ! 5382: #endif ! 5383: ! 5384: /* ! 5385: ** Allocate host_data structure ! 5386: */ ! 5387: if (!(instance = scsi_register(tpnt, sizeof(*host_data)))) ! 5388: goto attach_error; ! 5389: host_data = (struct host_data *) instance->hostdata; ! 5390: ! 5391: /* ! 5392: ** Allocate the host control block. ! 5393: */ ! 5394: np = __m_calloc_dma(device->pdev, sizeof(struct ncb), "NCB"); ! 5395: if (!np) ! 5396: goto attach_error; ! 5397: NCR_INIT_LOCK_NCB(np); ! 5398: np->pdev = device->pdev; ! 5399: np->p_ncb = vtobus(np); ! 5400: host_data->ncb = np; ! 5401: ! 5402: /* ! 5403: ** Store input informations in the host data structure. ! 5404: */ ! 5405: strncpy(np->chip_name, device->chip.name, sizeof(np->chip_name) - 1); ! 5406: np->unit = unit; ! 5407: np->verbose = driver_setup.verbose; ! 5408: sprintf(np->inst_name, NAME53C "%s-%d", np->chip_name, np->unit); ! 5409: np->device_id = device->chip.device_id; ! 5410: np->revision_id = device->chip.revision_id; ! 5411: np->bus = device->slot.bus; ! 5412: np->device_fn = device->slot.device_fn; ! 5413: np->features = device->chip.features; ! 5414: np->clock_divn = device->chip.nr_divisor; ! 5415: np->maxoffs = device->chip.offset_max; ! 5416: np->maxburst = device->chip.burst_max; ! 5417: np->myaddr = device->host_id; ! 5418: ! 5419: /* ! 5420: ** Allocate the start queue. ! 5421: */ ! 5422: np->squeue = (ncrcmd *) ! 5423: m_calloc_dma(sizeof(ncrcmd)*(MAX_START*2), "SQUEUE"); ! 5424: if (!np->squeue) ! 5425: goto attach_error; ! 5426: np->p_squeue = vtobus(np->squeue); ! 5427: ! 5428: /* ! 5429: ** Allocate the done queue. ! 5430: */ ! 5431: np->dqueue = (ncrcmd *) ! 5432: m_calloc_dma(sizeof(ncrcmd)*(MAX_START*2), "DQUEUE"); ! 5433: if (!np->dqueue) ! 5434: goto attach_error; ! 5435: ! 5436: /* ! 5437: ** Allocate the target bus address array. ! 5438: */ ! 5439: np->targtbl = (u_int32 *) m_calloc_dma(256, "TARGTBL"); ! 5440: if (!np->targtbl) ! 5441: goto attach_error; ! 5442: ! 5443: /* ! 5444: ** Allocate SCRIPTS areas ! 5445: */ ! 5446: np->script0 = (struct script *) ! 5447: m_calloc_dma(sizeof(struct script), "SCRIPT"); ! 5448: if (!np->script0) ! 5449: goto attach_error; ! 5450: np->scripth0 = (struct scripth *) ! 5451: m_calloc_dma(sizeof(struct scripth), "SCRIPTH"); ! 5452: if (!np->scripth0) ! 5453: goto attach_error; ! 5454: ! 5455: /* ! 5456: ** Initialyze the CCB free queue and, ! 5457: ** allocate some CCB. We need at least ONE. ! 5458: */ ! 5459: xpt_que_init(&np->free_ccbq); ! 5460: xpt_que_init(&np->b0_ccbq); ! 5461: if (!ncr_alloc_ccb(np)) ! 5462: goto attach_error; ! 5463: ! 5464: /* ! 5465: ** Initialize timer structure ! 5466: ** ! 5467: */ ! 5468: init_timer(&np->timer); ! 5469: np->timer.data = (unsigned long) np; ! 5470: np->timer.function = sym53c8xx_timeout; ! 5471: ! 5472: /* ! 5473: ** Try to map the controller chip to ! 5474: ** virtual and physical memory. ! 5475: */ ! 5476: ! 5477: np->base_ba = device->slot.base; ! 5478: np->base_ws = (np->features & FE_IO256)? 256 : 128; ! 5479: np->base2_ba = (np->features & FE_RAM)? device->slot.base_2 : 0; ! 5480: ! 5481: #ifndef SCSI_NCR_IOMAPPED ! 5482: np->base_va = remap_pci_mem(np->base_ba, np->base_ws); ! 5483: if (!np->base_va) { ! 5484: printk(KERN_ERR "%s: can't map PCI MMIO region\n",ncr_name(np)); ! 5485: goto attach_error; ! 5486: } ! 5487: else if (bootverbose > 1) ! 5488: printk(KERN_INFO "%s: using memory mapped IO\n", ncr_name(np)); ! 5489: ! 5490: /* ! 5491: ** Make the controller's registers available. ! 5492: ** Now the INB INW INL OUTB OUTW OUTL macros ! 5493: ** can be used safely. ! 5494: */ ! 5495: ! 5496: np->reg = (struct ncr_reg *) np->base_va; ! 5497: ! 5498: #endif /* !defined SCSI_NCR_IOMAPPED */ ! 5499: ! 5500: /* ! 5501: ** If on-chip RAM is used, make sure SCRIPTS isn't too large. ! 5502: */ ! 5503: if (np->base2_ba && sizeof(struct script) > 4096) { ! 5504: printk(KERN_ERR "%s: script too large.\n", ncr_name(np)); ! 5505: goto attach_error; ! 5506: } ! 5507: ! 5508: /* ! 5509: ** Try to map the controller chip into iospace. ! 5510: */ ! 5511: ! 5512: if (device->slot.io_port) { ! 5513: request_region(device->slot.io_port, np->base_ws, NAME53C8XX); ! 5514: np->base_io = device->slot.io_port; ! 5515: } ! 5516: ! 5517: #ifdef SCSI_NCR_NVRAM_SUPPORT ! 5518: if (nvram) { ! 5519: switch(nvram->type) { ! 5520: case SCSI_NCR_SYMBIOS_NVRAM: ! 5521: #ifdef SCSI_NCR_DEBUG_NVRAM ! 5522: ncr_display_Symbios_nvram(np, &nvram->data.Symbios); ! 5523: #endif ! 5524: break; ! 5525: case SCSI_NCR_TEKRAM_NVRAM: ! 5526: #ifdef SCSI_NCR_DEBUG_NVRAM ! 5527: ncr_display_Tekram_nvram(np, &nvram->data.Tekram); ! 5528: #endif ! 5529: break; ! 5530: default: ! 5531: nvram = 0; ! 5532: #ifdef SCSI_NCR_DEBUG_NVRAM ! 5533: printk(KERN_DEBUG "%s: NVRAM: None or invalid data.\n", ncr_name(np)); ! 5534: #endif ! 5535: } ! 5536: } ! 5537: #endif ! 5538: ! 5539: /* ! 5540: ** Save setting of some IO registers, so we will ! 5541: ** be able to probe specific implementations. ! 5542: */ ! 5543: ncr_save_initial_setting (np); ! 5544: ! 5545: /* ! 5546: ** Reset the chip now, since it has been reported ! 5547: ** that SCSI clock calibration may not work properly ! 5548: ** if the chip is currently active. ! 5549: */ ! 5550: ncr_chip_reset (np); ! 5551: ! 5552: /* ! 5553: ** Do chip dependent initialization. ! 5554: */ ! 5555: (void) ncr_prepare_setting(np, nvram); ! 5556: ! 5557: /* ! 5558: ** Check the PCI clock frequency if needed. ! 5559: ** ! 5560: ** Must be done after ncr_prepare_setting since it destroys ! 5561: ** STEST1 that is used to probe for the clock multiplier. ! 5562: ** ! 5563: ** The range is currently [22688 - 45375 Khz], given ! 5564: ** the values used by ncr_getclock(). ! 5565: ** This calibration of the frequecy measurement ! 5566: ** algorithm against the PCI clock frequency is only ! 5567: ** performed if the driver has had to measure the SCSI ! 5568: ** clock due to other heuristics not having been enough ! 5569: ** to deduce the SCSI clock frequency. ! 5570: ** ! 5571: ** When the chip has been initialized correctly by the ! 5572: ** SCSI BIOS, the driver deduces the presence of the ! 5573: ** clock multiplier and the value of the SCSI clock from ! 5574: ** initial values of IO registers, and therefore no ! 5575: ** clock measurement is performed. ! 5576: ** Normally the driver should never have to measure any ! 5577: ** clock, unless the controller may use a 80 MHz clock ! 5578: ** or has a clock multiplier and any of the following ! 5579: ** condition is met: ! 5580: ** ! 5581: ** - No SCSI BIOS is present. ! 5582: ** - SCSI BIOS did'nt enable the multiplier for some reason. ! 5583: ** - User has disabled the controller from the SCSI BIOS. ! 5584: ** - User booted the O/S from another O/S that did'nt enable ! 5585: ** the multiplier for some reason. ! 5586: ** ! 5587: ** As a result, the driver may only have to measure some ! 5588: ** frequency in very unusual situations. ! 5589: ** ! 5590: ** For this reality test against the PCI clock to really ! 5591: ** protect against flaws in the udelay() calibration or ! 5592: ** driver problem that affect the clock measurement ! 5593: ** algorithm, the actual PCI clock frequency must be 33 MHz. ! 5594: */ ! 5595: i = np->pciclock_max ? ncr_getpciclock(np) : 0; ! 5596: if (i && (i < np->pciclock_min || i > np->pciclock_max)) { ! 5597: printk(KERN_ERR "%s: PCI clock (%u KHz) is out of range " ! 5598: "[%u KHz - %u KHz].\n", ! 5599: ncr_name(np), i, np->pciclock_min, np->pciclock_max); ! 5600: goto attach_error; ! 5601: } ! 5602: ! 5603: /* ! 5604: ** Patch script to physical addresses ! 5605: */ ! 5606: ncr_script_fill (&script0, &scripth0); ! 5607: ! 5608: np->p_script = vtobus(np->script0); ! 5609: np->p_scripth = vtobus(np->scripth0); ! 5610: np->p_scripth0 = np->p_scripth; ! 5611: ! 5612: if (np->base2_ba) { ! 5613: np->p_script = pcivtobus(np->base2_ba); ! 5614: if (np->features & FE_RAM8K) { ! 5615: np->base2_ws = 8192; ! 5616: np->p_scripth = np->p_script + 4096; ! 5617: #if BITS_PER_LONG > 32 ! 5618: np->scr_ram_seg = cpu_to_scr(np->base2_ba >> 32); ! 5619: #endif ! 5620: } ! 5621: else ! 5622: np->base2_ws = 4096; ! 5623: #ifndef SCSI_NCR_PCI_MEM_NOT_SUPPORTED ! 5624: np->base2_va = remap_pci_mem(np->base2_ba, np->base2_ws); ! 5625: if (!np->base2_va) { ! 5626: printk(KERN_ERR "%s: can't map PCI MEMORY region\n", ! 5627: ncr_name(np)); ! 5628: goto attach_error; ! 5629: } ! 5630: #endif ! 5631: } ! 5632: ! 5633: ncr_script_copy_and_bind (np, (ncrcmd *) &script0, (ncrcmd *) np->script0, sizeof(struct script)); ! 5634: ncr_script_copy_and_bind (np, (ncrcmd *) &scripth0, (ncrcmd *) np->scripth0, sizeof(struct scripth)); ! 5635: ! 5636: /* ! 5637: ** Patch some variables in SCRIPTS ! 5638: */ ! 5639: np->scripth0->pm0_data_addr[0] = ! 5640: cpu_to_scr(NCB_SCRIPT_PHYS(np, pm0_data)); ! 5641: np->scripth0->pm1_data_addr[0] = ! 5642: cpu_to_scr(NCB_SCRIPT_PHYS(np, pm1_data)); ! 5643: ! 5644: /* ! 5645: ** Patch if not Ultra 3 - Do not write to scntl4 ! 5646: */ ! 5647: if (np->features & FE_ULTRA3) { ! 5648: np->script0->resel_scntl4[0] = cpu_to_scr(SCR_LOAD_REL (scntl4, 1)); ! 5649: np->script0->resel_scntl4[1] = cpu_to_scr(offsetof(struct tcb, uval)); ! 5650: } ! 5651: ! 5652: ! 5653: #ifdef SCSI_NCR_PCI_MEM_NOT_SUPPORTED ! 5654: np->scripth0->script0_ba[0] = cpu_to_scr(vtobus(np->script0)); ! 5655: np->scripth0->script0_ba64[0] = cpu_to_scr(vtobus(np->script0)); ! 5656: np->scripth0->scripth0_ba64[0] = cpu_to_scr(vtobus(np->scripth0)); ! 5657: np->scripth0->ram_seg64[0] = np->scr_ram_seg; ! 5658: #endif ! 5659: /* ! 5660: ** Prepare the idle and invalid task actions. ! 5661: */ ! 5662: np->idletask.start = cpu_to_scr(NCB_SCRIPT_PHYS (np, idle)); ! 5663: np->idletask.restart = cpu_to_scr(NCB_SCRIPTH_PHYS (np, bad_i_t_l)); ! 5664: np->p_idletask = NCB_PHYS(np, idletask); ! 5665: ! 5666: np->notask.start = cpu_to_scr(NCB_SCRIPT_PHYS (np, idle)); ! 5667: np->notask.restart = cpu_to_scr(NCB_SCRIPTH_PHYS (np, bad_i_t_l)); ! 5668: np->p_notask = NCB_PHYS(np, notask); ! 5669: ! 5670: np->bad_i_t_l.start = cpu_to_scr(NCB_SCRIPT_PHYS (np, idle)); ! 5671: np->bad_i_t_l.restart = cpu_to_scr(NCB_SCRIPTH_PHYS (np, bad_i_t_l)); ! 5672: np->p_bad_i_t_l = NCB_PHYS(np, bad_i_t_l); ! 5673: ! 5674: np->bad_i_t_l_q.start = cpu_to_scr(NCB_SCRIPT_PHYS (np, idle)); ! 5675: np->bad_i_t_l_q.restart = cpu_to_scr(NCB_SCRIPTH_PHYS (np,bad_i_t_l_q)); ! 5676: np->p_bad_i_t_l_q = NCB_PHYS(np, bad_i_t_l_q); ! 5677: ! 5678: /* ! 5679: ** Allocate and prepare the bad lun table. ! 5680: */ ! 5681: np->badluntbl = m_calloc_dma(256, "BADLUNTBL"); ! 5682: if (!np->badluntbl) ! 5683: goto attach_error; ! 5684: ! 5685: assert (offsetof(struct lcb, resel_task) == 0); ! 5686: np->resel_badlun = cpu_to_scr(NCB_SCRIPTH_PHYS(np, resel_bad_lun)); ! 5687: ! 5688: for (i = 0 ; i < 64 ; i++) ! 5689: np->badluntbl[i] = cpu_to_scr(NCB_PHYS(np, resel_badlun)); ! 5690: ! 5691: /* ! 5692: ** Prepare the target bus address array. ! 5693: */ ! 5694: np->scripth0->targtbl[0] = cpu_to_scr(vtobus(np->targtbl)); ! 5695: for (i = 0 ; i < MAX_TARGET ; i++) { ! 5696: np->targtbl[i] = cpu_to_scr(NCB_PHYS(np, target[i])); ! 5697: np->target[i].b_luntbl = cpu_to_scr(vtobus(np->badluntbl)); ! 5698: np->target[i].b_lun0 = cpu_to_scr(NCB_PHYS(np, resel_badlun)); ! 5699: } ! 5700: ! 5701: /* ! 5702: ** Patch the script for LED support. ! 5703: */ ! 5704: ! 5705: if (np->features & FE_LED0) { ! 5706: np->script0->idle[0] = ! 5707: cpu_to_scr(SCR_REG_REG(gpreg, SCR_OR, 0x01)); ! 5708: np->script0->reselected[0] = ! 5709: cpu_to_scr(SCR_REG_REG(gpreg, SCR_AND, 0xfe)); ! 5710: np->script0->start[0] = ! 5711: cpu_to_scr(SCR_REG_REG(gpreg, SCR_AND, 0xfe)); ! 5712: } ! 5713: ! 5714: /* ! 5715: ** Patch the script to provide an extra clock cycle on ! 5716: ** data out phase - 53C1010_66MHz part only. ! 5717: */ ! 5718: if (np->device_id == PCI_DEVICE_ID_LSI_53C1010_66){ ! 5719: np->script0->datao_phase[0] = ! 5720: cpu_to_scr(SCR_REG_REG(scntl4, SCR_OR, 0x0c)); ! 5721: } ! 5722: ! 5723: #ifdef SCSI_NCR_IARB_SUPPORT ! 5724: /* ! 5725: ** If user does not want to use IMMEDIATE ARBITRATION ! 5726: ** when we are reselected while attempting to arbitrate, ! 5727: ** patch the SCRIPTS accordingly with a SCRIPT NO_OP. ! 5728: */ ! 5729: if (!(driver_setup.iarb & 1)) ! 5730: np->script0->ungetjob[0] = cpu_to_scr(SCR_NO_OP); ! 5731: /* ! 5732: ** If user wants IARB to be set when we win arbitration ! 5733: ** and have other jobs, compute the max number of consecutive ! 5734: ** settings of IARB hint before we leave devices a chance to ! 5735: ** arbitrate for reselection. ! 5736: */ ! 5737: np->iarb_max = (driver_setup.iarb >> 4); ! 5738: #endif ! 5739: ! 5740: /* ! 5741: ** DEL 472 - 53C896 Rev 1 - Part Number 609-0393055 - ITEM 5. ! 5742: */ ! 5743: if (np->device_id == PCI_DEVICE_ID_NCR_53C896 && ! 5744: np->revision_id <= 0x1 && (np->features & FE_NOPM)) { ! 5745: np->scatter = ncr_scatter_896R1; ! 5746: np->script0->datai_phase[0] = cpu_to_scr(SCR_JUMP); ! 5747: np->script0->datai_phase[1] = ! 5748: cpu_to_scr(NCB_SCRIPTH_PHYS (np, tweak_pmj)); ! 5749: np->script0->datao_phase[0] = cpu_to_scr(SCR_JUMP); ! 5750: np->script0->datao_phase[1] = ! 5751: cpu_to_scr(NCB_SCRIPTH_PHYS (np, tweak_pmj)); ! 5752: } ! 5753: else ! 5754: #ifdef DEBUG_896R1 ! 5755: np->scatter = ncr_scatter_896R1; ! 5756: #else ! 5757: np->scatter = ncr_scatter; ! 5758: #endif ! 5759: ! 5760: /* ! 5761: ** Reset chip. ! 5762: ** We should use ncr_soft_reset(), but we donnot want to do ! 5763: ** so, since we may not be safe if ABRT interrupt occurs due ! 5764: ** to the BIOS or previous O/S having enable this interrupt. ! 5765: ** ! 5766: ** For C1010 need to set ABRT bit prior to SRST if SCRIPTs ! 5767: ** are running. Not true in this case. ! 5768: */ ! 5769: ncr_chip_reset(np); ! 5770: ! 5771: /* ! 5772: ** Now check the cache handling of the pci chipset. ! 5773: */ ! 5774: ! 5775: if (ncr_snooptest (np)) { ! 5776: printk (KERN_ERR "CACHE INCORRECTLY CONFIGURED.\n"); ! 5777: goto attach_error; ! 5778: }; ! 5779: ! 5780: /* ! 5781: ** Install the interrupt handler. ! 5782: ** If we synchonize the C code with SCRIPTS on interrupt, ! 5783: ** we donnot want to share the INTR line at all. ! 5784: */ ! 5785: if (request_irq(device->slot.irq, sym53c8xx_intr, ! 5786: #ifdef SCSI_NCR_PCIQ_SYNC_ON_INTR ! 5787: ((driver_setup.irqm & 0x20) ? 0 : SA_INTERRUPT), ! 5788: #else ! 5789: ((driver_setup.irqm & 0x10) ? 0 : SA_SHIRQ) | ! 5790: ! 5791: #if 0 && LINUX_VERSION_CODE < LinuxVersionCode(2,2,0) ! 5792: ((driver_setup.irqm & 0x20) ? 0 : SA_INTERRUPT), ! 5793: #else ! 5794: 0, ! 5795: #endif ! 5796: #endif ! 5797: NAME53C8XX, np)) { ! 5798: printk(KERN_ERR "%s: request irq %d failure\n", ! 5799: ncr_name(np), device->slot.irq); ! 5800: goto attach_error; ! 5801: } ! 5802: np->irq = device->slot.irq; ! 5803: ! 5804: /* ! 5805: ** After SCSI devices have been opened, we cannot ! 5806: ** reset the bus safely, so we do it here. ! 5807: ** Interrupt handler does the real work. ! 5808: ** Process the reset exception, ! 5809: ** if interrupts are not enabled yet. ! 5810: ** Then enable disconnects. ! 5811: */ ! 5812: NCR_LOCK_NCB(np, flags); ! 5813: if (ncr_reset_scsi_bus(np, 0, driver_setup.settle_delay) != 0) { ! 5814: printk(KERN_ERR "%s: FATAL ERROR: CHECK SCSI BUS - CABLES, TERMINATION, DEVICE POWER etc.!\n", ncr_name(np)); ! 5815: ! 5816: NCR_UNLOCK_NCB(np, flags); ! 5817: goto attach_error; ! 5818: } ! 5819: ncr_exception (np); ! 5820: ! 5821: /* ! 5822: ** The middle-level SCSI driver does not ! 5823: ** wait for devices to settle. ! 5824: ** Wait synchronously if more than 2 seconds. ! 5825: */ ! 5826: if (driver_setup.settle_delay > 2) { ! 5827: printk(KERN_INFO "%s: waiting %d seconds for scsi devices to settle...\n", ! 5828: ncr_name(np), driver_setup.settle_delay); ! 5829: MDELAY (1000 * driver_setup.settle_delay); ! 5830: } ! 5831: ! 5832: /* ! 5833: ** start the timeout daemon ! 5834: */ ! 5835: np->lasttime=0; ! 5836: ncr_timeout (np); ! 5837: ! 5838: /* ! 5839: ** use SIMPLE TAG messages by default ! 5840: */ ! 5841: #ifdef SCSI_NCR_ALWAYS_SIMPLE_TAG ! 5842: np->order = M_SIMPLE_TAG; ! 5843: #endif ! 5844: ! 5845: /* ! 5846: ** Done. ! 5847: */ ! 5848: if (!first_host) ! 5849: first_host = instance; ! 5850: ! 5851: /* ! 5852: ** Fill Linux host instance structure ! 5853: ** and return success. ! 5854: */ ! 5855: instance->max_channel = 0; ! 5856: instance->this_id = np->myaddr; ! 5857: instance->max_id = np->maxwide ? 16 : 8; ! 5858: instance->max_lun = MAX_LUN; ! 5859: #ifndef SCSI_NCR_IOMAPPED ! 5860: #if LINUX_VERSION_CODE >= LinuxVersionCode(2,3,29) ! 5861: instance->base = (unsigned long) np->reg; ! 5862: #else ! 5863: instance->base = (char *) np->reg; ! 5864: #endif ! 5865: #endif ! 5866: instance->irq = np->irq; ! 5867: instance->unique_id = np->base_io; ! 5868: instance->io_port = np->base_io; ! 5869: instance->n_io_port = np->base_ws; ! 5870: instance->dma_channel = 0; ! 5871: instance->cmd_per_lun = MAX_TAGS; ! 5872: instance->can_queue = (MAX_START-4); ! 5873: ! 5874: np->check_integrity = 0; ! 5875: ! 5876: #ifdef SCSI_NCR_INTEGRITY_CHECKING ! 5877: instance->check_integrity = 0; ! 5878: ! 5879: #ifdef SCSI_NCR_ENABLE_INTEGRITY_CHECK ! 5880: if ( !(driver_setup.bus_check & 0x04) ) { ! 5881: np->check_integrity = 1; ! 5882: instance->check_integrity = 1; ! 5883: } ! 5884: #endif ! 5885: #endif ! 5886: ! 5887: instance->select_queue_depths = sym53c8xx_select_queue_depths; ! 5888: ! 5889: NCR_UNLOCK_NCB(np, flags); ! 5890: ! 5891: /* ! 5892: ** Now let the generic SCSI driver ! 5893: ** look for the SCSI devices on the bus .. ! 5894: */ ! 5895: return 0; ! 5896: ! 5897: attach_error: ! 5898: if (!instance) return -1; ! 5899: printk(KERN_INFO "%s: giving up ...\n", ncr_name(np)); ! 5900: if (np) ! 5901: ncr_free_resources(np); ! 5902: scsi_unregister(instance); ! 5903: ! 5904: return -1; ! 5905: } ! 5906: ! 5907: ! 5908: /* ! 5909: ** Free controller resources. ! 5910: */ ! 5911: static void ncr_free_resources(ncb_p np) ! 5912: { ! 5913: ccb_p cp; ! 5914: tcb_p tp; ! 5915: lcb_p lp; ! 5916: int target, lun; ! 5917: ! 5918: if (np->irq) ! 5919: free_irq(np->irq, np); ! 5920: if (np->base_io) ! 5921: release_region(np->base_io, np->base_ws); ! 5922: #ifndef SCSI_NCR_PCI_MEM_NOT_SUPPORTED ! 5923: if (np->base_va) ! 5924: unmap_pci_mem(np->base_va, np->base_ws); ! 5925: if (np->base2_va) ! 5926: unmap_pci_mem(np->base2_va, np->base2_ws); ! 5927: #endif ! 5928: if (np->scripth0) ! 5929: m_free_dma(np->scripth0, sizeof(struct scripth), "SCRIPTH"); ! 5930: if (np->script0) ! 5931: m_free_dma(np->script0, sizeof(struct script), "SCRIPT"); ! 5932: if (np->squeue) ! 5933: m_free_dma(np->squeue, sizeof(ncrcmd)*(MAX_START*2), "SQUEUE"); ! 5934: if (np->dqueue) ! 5935: m_free_dma(np->dqueue, sizeof(ncrcmd)*(MAX_START*2),"DQUEUE"); ! 5936: ! 5937: while ((cp = np->ccbc) != NULL) { ! 5938: np->ccbc = cp->link_ccb; ! 5939: m_free_dma(cp, sizeof(*cp), "CCB"); ! 5940: } ! 5941: ! 5942: if (np->badluntbl) ! 5943: m_free_dma(np->badluntbl, 256,"BADLUNTBL"); ! 5944: ! 5945: for (target = 0; target < MAX_TARGET ; target++) { ! 5946: tp = &np->target[target]; ! 5947: for (lun = 0 ; lun < MAX_LUN ; lun++) { ! 5948: lp = ncr_lp(np, tp, lun); ! 5949: if (!lp) ! 5950: continue; ! 5951: if (lp->tasktbl != &lp->tasktbl_0) ! 5952: m_free_dma(lp->tasktbl, MAX_TASKS*4, "TASKTBL"); ! 5953: if (lp->cb_tags) ! 5954: m_free(lp->cb_tags, MAX_TAGS, "CB_TAGS"); ! 5955: m_free_dma(lp, sizeof(*lp), "LCB"); ! 5956: } ! 5957: #if MAX_LUN > 1 ! 5958: if (tp->lmp) ! 5959: m_free(tp->lmp, MAX_LUN * sizeof(lcb_p), "LMP"); ! 5960: if (tp->luntbl) ! 5961: m_free_dma(tp->luntbl, 256, "LUNTBL"); ! 5962: #endif ! 5963: } ! 5964: ! 5965: if (np->targtbl) ! 5966: m_free_dma(np->targtbl, 256, "TARGTBL"); ! 5967: ! 5968: m_free_dma(np, sizeof(*np), "NCB"); ! 5969: } ! 5970: ! 5971: ! 5972: /*========================================================== ! 5973: ** ! 5974: ** ! 5975: ** Done SCSI commands list management. ! 5976: ** ! 5977: ** We donnot enter the scsi_done() callback immediately ! 5978: ** after a command has been seen as completed but we ! 5979: ** insert it into a list which is flushed outside any kind ! 5980: ** of driver critical section. ! 5981: ** This allows to do minimal stuff under interrupt and ! 5982: ** inside critical sections and to also avoid locking up ! 5983: ** on recursive calls to driver entry points under SMP. ! 5984: ** In fact, the only kernel point which is entered by the ! 5985: ** driver with a driver lock set is get_free_pages(GFP_ATOMIC...) ! 5986: ** that shall not reenter the driver under any circumstance. ! 5987: ** ! 5988: **========================================================== ! 5989: */ ! 5990: static inline void ncr_queue_done_cmd(ncb_p np, Scsi_Cmnd *cmd) ! 5991: { ! 5992: unmap_scsi_data(np, cmd); ! 5993: cmd->host_scribble = (char *) np->done_list; ! 5994: np->done_list = cmd; ! 5995: } ! 5996: ! 5997: static inline void ncr_flush_done_cmds(Scsi_Cmnd *lcmd) ! 5998: { ! 5999: Scsi_Cmnd *cmd; ! 6000: ! 6001: while (lcmd) { ! 6002: cmd = lcmd; ! 6003: lcmd = (Scsi_Cmnd *) cmd->host_scribble; ! 6004: cmd->scsi_done(cmd); ! 6005: } ! 6006: } ! 6007: ! 6008: /*========================================================== ! 6009: ** ! 6010: ** ! 6011: ** Prepare the next negotiation message for integrity check, ! 6012: ** if needed. ! 6013: ** ! 6014: ** Fill in the part of message buffer that contains the ! 6015: ** negotiation and the nego_status field of the CCB. ! 6016: ** Returns the size of the message in bytes. ! 6017: ** ! 6018: ** If tp->ppr_negotiation is 1 and a M_REJECT occurs, then ! 6019: ** we disable ppr_negotiation. If the first ppr_negotiation is ! 6020: ** successful, set this flag to 2. ! 6021: ** ! 6022: **========================================================== ! 6023: */ ! 6024: #ifdef SCSI_NCR_INTEGRITY_CHECKING ! 6025: static int ncr_ic_nego(ncb_p np, ccb_p cp, Scsi_Cmnd *cmd, u_char *msgptr) ! 6026: { ! 6027: tcb_p tp = &np->target[cp->target]; ! 6028: int msglen = 0; ! 6029: int nego = 0; ! 6030: u_char new_width, new_offset, new_period; ! 6031: u_char no_increase; ! 6032: ! 6033: if (tp->ppr_negotiation == 1) /* PPR message successful */ ! 6034: tp->ppr_negotiation = 2; ! 6035: ! 6036: if (tp->inq_done) { ! 6037: ! 6038: if (!tp->ic_maximums_set) { ! 6039: tp->ic_maximums_set = 1; ! 6040: ! 6041: /* ! 6042: * Check against target, host and user limits ! 6043: */ ! 6044: if ( (tp->inq_byte7 & INQ7_WIDE16) && ! 6045: np->maxwide && tp->usrwide) ! 6046: tp->ic_max_width = 1; ! 6047: else ! 6048: tp->ic_max_width = 0; ! 6049: ! 6050: ! 6051: if ((tp->inq_byte7 & INQ7_SYNC) && tp->maxoffs) ! 6052: tp->ic_min_sync = (tp->minsync < np->minsync) ? ! 6053: np->minsync : tp->minsync; ! 6054: else ! 6055: tp->ic_min_sync = 255; ! 6056: ! 6057: tp->period = 1; ! 6058: tp->widedone = 1; ! 6059: ! 6060: /* ! 6061: * Enable PPR negotiation - only if Ultra3 support ! 6062: * is accessible. ! 6063: */ ! 6064: ! 6065: #if 0 ! 6066: if (tp->ic_max_width && (tp->ic_min_sync != 255 )) ! 6067: tp->ppr_negotiation = 1; ! 6068: #endif ! 6069: tp->ppr_negotiation = 0; ! 6070: if (np->features & FE_ULTRA3) { ! 6071: if (tp->ic_max_width && (tp->ic_min_sync == 0x09)) ! 6072: tp->ppr_negotiation = 1; ! 6073: } ! 6074: ! 6075: if (!tp->ppr_negotiation) ! 6076: cmd->ic_nego &= ~NS_PPR; ! 6077: } ! 6078: ! 6079: if (DEBUG_FLAGS & DEBUG_IC) { ! 6080: printk("%s: cmd->ic_nego %d, 1st byte 0x%2X\n", ! 6081: ncr_name(np), cmd->ic_nego, cmd->cmnd[0]); ! 6082: } ! 6083: ! 6084: /* Previous command recorded a parity or an initiator ! 6085: * detected error condition. Force bus to narrow for this ! 6086: * target. Clear flag. Negotation on request sense. ! 6087: * Note: kernel forces 2 bus resets :o( but clears itself out. ! 6088: * Minor bug? in scsi_obsolete.c (ugly) ! 6089: */ ! 6090: if (np->check_integ_par) { ! 6091: printk("%s: Parity Error. Target set to narrow.\n", ! 6092: ncr_name(np)); ! 6093: tp->ic_max_width = 0; ! 6094: tp->widedone = tp->period = 0; ! 6095: } ! 6096: ! 6097: /* Initializing: ! 6098: * If ic_nego == NS_PPR, we are in the initial test for ! 6099: * PPR messaging support. If driver flag is clear, then ! 6100: * either we don't support PPR nego (narrow or async device) ! 6101: * or this is the second TUR and we have had a M. REJECT ! 6102: * or unexpected disconnect on the first PPR negotiation. ! 6103: * Do not negotiate, reset nego flags (in case a reset has ! 6104: * occurred), clear ic_nego and return. ! 6105: * General case: Kernel will clear flag on a fallback. ! 6106: * Do only SDTR or WDTR in the future. ! 6107: */ ! 6108: if (!tp->ppr_negotiation && (cmd->ic_nego == NS_PPR )) { ! 6109: tp->ppr_negotiation = 0; ! 6110: cmd->ic_nego &= ~NS_PPR; ! 6111: tp->widedone = tp->period = 1; ! 6112: return msglen; ! 6113: } ! 6114: else if (( tp->ppr_negotiation && !(cmd->ic_nego & NS_PPR )) || ! 6115: (!tp->ppr_negotiation && (cmd->ic_nego & NS_PPR )) ) { ! 6116: tp->ppr_negotiation = 0; ! 6117: cmd->ic_nego &= ~NS_PPR; ! 6118: } ! 6119: ! 6120: /* ! 6121: * Always check the PPR nego. flag bit if ppr_negotiation ! 6122: * is set. If the ic_nego PPR bit is clear, ! 6123: * there must have been a fallback. Do only ! 6124: * WDTR / SDTR in the future. ! 6125: */ ! 6126: if ((tp->ppr_negotiation) && (!(cmd->ic_nego & NS_PPR))) ! 6127: tp->ppr_negotiation = 0; ! 6128: ! 6129: /* In case of a bus reset, ncr_negotiate will reset ! 6130: * the flags tp->widedone and tp->period to 0, forcing ! 6131: * a new negotiation. Do WDTR then SDTR. If PPR, do both. ! 6132: * Do NOT increase the period. It is possible for the Scsi_Cmnd ! 6133: * flags to be set to increase the period when a bus reset ! 6134: * occurs - we don't want to change anything. ! 6135: */ ! 6136: ! 6137: no_increase = 0; ! 6138: ! 6139: if (tp->ppr_negotiation && (!tp->widedone) && (!tp->period) ) { ! 6140: cmd->ic_nego = NS_PPR; ! 6141: tp->widedone = tp->period = 1; ! 6142: no_increase = 1; ! 6143: } ! 6144: else if (!tp->widedone) { ! 6145: cmd->ic_nego = NS_WIDE; ! 6146: tp->widedone = 1; ! 6147: no_increase = 1; ! 6148: } ! 6149: else if (!tp->period) { ! 6150: cmd->ic_nego = NS_SYNC; ! 6151: tp->period = 1; ! 6152: no_increase = 1; ! 6153: } ! 6154: ! 6155: new_width = cmd->ic_nego_width & tp->ic_max_width; ! 6156: ! 6157: switch (cmd->ic_nego_sync) { ! 6158: case 2: /* increase the period */ ! 6159: if (!no_increase) { ! 6160: if (tp->ic_min_sync <= 0x09) ! 6161: tp->ic_min_sync = 0x0A; ! 6162: else if (tp->ic_min_sync <= 0x0A) ! 6163: tp->ic_min_sync = 0x0C; ! 6164: else if (tp->ic_min_sync <= 0x0C) ! 6165: tp->ic_min_sync = 0x19; ! 6166: else if (tp->ic_min_sync <= 0x19) ! 6167: tp->ic_min_sync *= 2; ! 6168: else { ! 6169: tp->ic_min_sync = 255; ! 6170: cmd->ic_nego_sync = 0; ! 6171: tp->maxoffs = 0; ! 6172: } ! 6173: } ! 6174: new_period = tp->maxoffs?tp->ic_min_sync:0; ! 6175: new_offset = tp->maxoffs; ! 6176: break; ! 6177: ! 6178: case 1: /* nego. to maximum */ ! 6179: new_period = tp->maxoffs?tp->ic_min_sync:0; ! 6180: new_offset = tp->maxoffs; ! 6181: break; ! 6182: ! 6183: case 0: /* nego to async */ ! 6184: default: ! 6185: new_period = 0; ! 6186: new_offset = 0; ! 6187: break; ! 6188: }; ! 6189: ! 6190: ! 6191: nego = NS_NOCHANGE; ! 6192: if (tp->ppr_negotiation) { ! 6193: u_char options_byte = 0; ! 6194: ! 6195: /* ! 6196: ** Must make sure data is consistent. ! 6197: ** If period is 9 and sync, must be wide and DT bit set. ! 6198: ** else period must be larger. If the width is 0, ! 6199: ** reset bus to wide but increase the period to 0x0A. ! 6200: ** Note: The strange else clause is due to the integrity check. ! 6201: ** If fails at 0x09, wide, the I.C. code will redo at the same ! 6202: ** speed but a narrow bus. The driver must take care of slowing ! 6203: ** the bus speed down. ! 6204: ** ! 6205: ** The maximum offset in ST mode is 31, in DT mode 62 (1010/1010_66 only) ! 6206: */ ! 6207: if ( (new_period==0x09) && new_offset) { ! 6208: if (new_width) ! 6209: options_byte = 0x02; ! 6210: else { ! 6211: tp->ic_min_sync = 0x0A; ! 6212: new_period = 0x0A; ! 6213: cmd->ic_nego_width = 1; ! 6214: new_width = 1; ! 6215: new_offset &= 0x1f; ! 6216: } ! 6217: } ! 6218: else if (new_period > 0x09) ! 6219: new_offset &= 0x1f; ! 6220: ! 6221: nego = NS_PPR; ! 6222: ! 6223: msgptr[msglen++] = M_EXTENDED; ! 6224: msgptr[msglen++] = 6; ! 6225: msgptr[msglen++] = M_X_PPR_REQ; ! 6226: msgptr[msglen++] = new_period; ! 6227: msgptr[msglen++] = 0; ! 6228: msgptr[msglen++] = new_offset; ! 6229: msgptr[msglen++] = new_width; ! 6230: msgptr[msglen++] = options_byte; ! 6231: ! 6232: } ! 6233: else { ! 6234: switch (cmd->ic_nego & ~NS_PPR) { ! 6235: case NS_WIDE: ! 6236: /* ! 6237: ** WDTR negotiation on if device supports ! 6238: ** wide or if wide device forced narrow ! 6239: ** due to a parity error. ! 6240: */ ! 6241: ! 6242: cmd->ic_nego_width &= tp->ic_max_width; ! 6243: ! 6244: if (tp->ic_max_width | np->check_integ_par) { ! 6245: nego = NS_WIDE; ! 6246: msgptr[msglen++] = M_EXTENDED; ! 6247: msgptr[msglen++] = 2; ! 6248: msgptr[msglen++] = M_X_WIDE_REQ; ! 6249: msgptr[msglen++] = new_width; ! 6250: } ! 6251: break; ! 6252: ! 6253: case NS_SYNC: ! 6254: /* ! 6255: ** negotiate synchronous transfers ! 6256: ** Target must support sync transfers. ! 6257: ** Min. period = 0x0A, maximum offset of 31=0x1f. ! 6258: */ ! 6259: ! 6260: if (tp->inq_byte7 & INQ7_SYNC) { ! 6261: ! 6262: if (new_offset && (new_period < 0x0A)) { ! 6263: tp->ic_min_sync = 0x0A; ! 6264: new_period = 0x0A; ! 6265: } ! 6266: nego = NS_SYNC; ! 6267: msgptr[msglen++] = M_EXTENDED; ! 6268: msgptr[msglen++] = 3; ! 6269: msgptr[msglen++] = M_X_SYNC_REQ; ! 6270: msgptr[msglen++] = new_period; ! 6271: msgptr[msglen++] = new_offset & 0x1f; ! 6272: } ! 6273: else ! 6274: cmd->ic_nego_sync = 0; ! 6275: break; ! 6276: ! 6277: case NS_NOCHANGE: ! 6278: break; ! 6279: } ! 6280: } ! 6281: ! 6282: }; ! 6283: ! 6284: cp->nego_status = nego; ! 6285: np->check_integ_par = 0; ! 6286: ! 6287: if (nego) { ! 6288: tp->nego_cp = cp; ! 6289: if (DEBUG_FLAGS & DEBUG_NEGO) { ! 6290: ncr_print_msg(cp, nego == NS_WIDE ? ! 6291: "wide/narrow msgout": ! 6292: (nego == NS_SYNC ? "sync/async msgout" : "ppr msgout"), ! 6293: msgptr); ! 6294: }; ! 6295: }; ! 6296: ! 6297: return msglen; ! 6298: } ! 6299: #endif /* SCSI_NCR_INTEGRITY_CHECKING */ ! 6300: ! 6301: /*========================================================== ! 6302: ** ! 6303: ** ! 6304: ** Prepare the next negotiation message if needed. ! 6305: ** ! 6306: ** Fill in the part of message buffer that contains the ! 6307: ** negotiation and the nego_status field of the CCB. ! 6308: ** Returns the size of the message in bytes. ! 6309: ** ! 6310: ** ! 6311: **========================================================== ! 6312: */ ! 6313: ! 6314: ! 6315: static int ncr_prepare_nego(ncb_p np, ccb_p cp, u_char *msgptr) ! 6316: { ! 6317: tcb_p tp = &np->target[cp->target]; ! 6318: int msglen = 0; ! 6319: int nego = 0; ! 6320: u_char width, offset, factor, last_byte; ! 6321: ! 6322: if (!np->check_integrity) { ! 6323: /* If integrity checking disabled, enable PPR messaging ! 6324: * if device supports wide, sync and ultra 3 ! 6325: */ ! 6326: if (tp->ppr_negotiation == 1) /* PPR message successful */ ! 6327: tp->ppr_negotiation = 2; ! 6328: ! 6329: if ((tp->inq_done) && (!tp->ic_maximums_set)) { ! 6330: tp->ic_maximums_set = 1; ! 6331: ! 6332: /* ! 6333: * Issue PPR only if board is capable ! 6334: * and set-up for Ultra3 transfers. ! 6335: */ ! 6336: tp->ppr_negotiation = 0; ! 6337: if ( (np->features & FE_ULTRA3) && ! 6338: (tp->usrwide) && (tp->maxoffs) && ! 6339: (tp->minsync == 0x09) ) ! 6340: tp->ppr_negotiation = 1; ! 6341: } ! 6342: } ! 6343: ! 6344: if (tp->inq_done) { ! 6345: /* ! 6346: * Get the current width, offset and period ! 6347: */ ! 6348: ncr_get_xfer_info( np, tp, &factor, ! 6349: &offset, &width); ! 6350: ! 6351: /* ! 6352: ** negotiate wide transfers ? ! 6353: */ ! 6354: ! 6355: if (!tp->widedone) { ! 6356: if (tp->inq_byte7 & INQ7_WIDE16) { ! 6357: if (tp->ppr_negotiation) ! 6358: nego = NS_PPR; ! 6359: else ! 6360: nego = NS_WIDE; ! 6361: ! 6362: width = tp->usrwide; ! 6363: #ifdef SCSI_NCR_INTEGRITY_CHECKING ! 6364: if (tp->ic_done) ! 6365: width &= tp->ic_max_width; ! 6366: #endif ! 6367: } else ! 6368: tp->widedone=1; ! 6369: ! 6370: }; ! 6371: ! 6372: /* ! 6373: ** negotiate synchronous transfers? ! 6374: */ ! 6375: ! 6376: if ((nego != NS_WIDE) && !tp->period) { ! 6377: if (tp->inq_byte7 & INQ7_SYNC) { ! 6378: if (tp->ppr_negotiation) ! 6379: nego = NS_PPR; ! 6380: else ! 6381: nego = NS_SYNC; ! 6382: ! 6383: /* Check for async flag */ ! 6384: if (tp->maxoffs == 0) { ! 6385: offset = 0; ! 6386: factor = 0; ! 6387: } ! 6388: else { ! 6389: offset = tp->maxoffs; ! 6390: factor = tp->minsync; ! 6391: #ifdef SCSI_NCR_INTEGRITY_CHECKING ! 6392: if ((tp->ic_done) && ! 6393: (factor < tp->ic_min_sync)) ! 6394: factor = tp->ic_min_sync; ! 6395: #endif ! 6396: } ! 6397: ! 6398: } else { ! 6399: offset = 0; ! 6400: factor = 0; ! 6401: tp->period =0xffff; ! 6402: PRINT_TARGET(np, cp->target); ! 6403: printk ("target did not report SYNC.\n"); ! 6404: }; ! 6405: }; ! 6406: }; ! 6407: ! 6408: switch (nego) { ! 6409: case NS_PPR: ! 6410: /* ! 6411: ** Must make sure data is consistent. ! 6412: ** If period is 9 and sync, must be wide and DT bit set ! 6413: ** else period must be larger. ! 6414: ** Maximum offset is 31=0x1f is ST mode, 62 if DT mode ! 6415: */ ! 6416: last_byte = 0; ! 6417: if ( (factor==9) && offset) { ! 6418: if (!width) { ! 6419: factor = 0x0A; ! 6420: offset &= 0x1f; ! 6421: } ! 6422: else ! 6423: last_byte = 0x02; ! 6424: } ! 6425: else if (factor > 0x09) ! 6426: offset &= 0x1f; ! 6427: ! 6428: msgptr[msglen++] = M_EXTENDED; ! 6429: msgptr[msglen++] = 6; ! 6430: msgptr[msglen++] = M_X_PPR_REQ; ! 6431: msgptr[msglen++] = factor; ! 6432: msgptr[msglen++] = 0; ! 6433: msgptr[msglen++] = offset; ! 6434: msgptr[msglen++] = width; ! 6435: msgptr[msglen++] = last_byte; ! 6436: break; ! 6437: case NS_SYNC: ! 6438: /* ! 6439: ** Never negotiate faster than Ultra 2 (25ns periods) ! 6440: */ ! 6441: if (offset && (factor < 0x0A)) { ! 6442: factor = 0x0A; ! 6443: tp->minsync = 0x0A; ! 6444: } ! 6445: ! 6446: msgptr[msglen++] = M_EXTENDED; ! 6447: msgptr[msglen++] = 3; ! 6448: msgptr[msglen++] = M_X_SYNC_REQ; ! 6449: msgptr[msglen++] = factor; ! 6450: msgptr[msglen++] = offset & 0x1f; ! 6451: break; ! 6452: case NS_WIDE: ! 6453: msgptr[msglen++] = M_EXTENDED; ! 6454: msgptr[msglen++] = 2; ! 6455: msgptr[msglen++] = M_X_WIDE_REQ; ! 6456: msgptr[msglen++] = width; ! 6457: break; ! 6458: }; ! 6459: ! 6460: cp->nego_status = nego; ! 6461: ! 6462: if (nego) { ! 6463: tp->nego_cp = cp; ! 6464: if (DEBUG_FLAGS & DEBUG_NEGO) { ! 6465: ncr_print_msg(cp, nego == NS_WIDE ? ! 6466: "wide msgout": ! 6467: (nego == NS_SYNC ? "sync msgout" : "ppr msgout"), ! 6468: msgptr); ! 6469: }; ! 6470: }; ! 6471: ! 6472: return msglen; ! 6473: } ! 6474: ! 6475: /*========================================================== ! 6476: ** ! 6477: ** ! 6478: ** Start execution of a SCSI command. ! 6479: ** This is called from the generic SCSI driver. ! 6480: ** ! 6481: ** ! 6482: **========================================================== ! 6483: */ ! 6484: static int ncr_queue_command (ncb_p np, Scsi_Cmnd *cmd) ! 6485: { ! 6486: /* Scsi_Device *device = cmd->device; */ ! 6487: tcb_p tp = &np->target[cmd->target]; ! 6488: lcb_p lp = ncr_lp(np, tp, cmd->lun); ! 6489: ccb_p cp; ! 6490: ! 6491: u_char idmsg, *msgptr; ! 6492: u_int msglen; ! 6493: int direction; ! 6494: u_int32 lastp, goalp; ! 6495: ! 6496: /*--------------------------------------------- ! 6497: ** ! 6498: ** Some shortcuts ... ! 6499: ** ! 6500: **--------------------------------------------- ! 6501: */ ! 6502: if ((cmd->target == np->myaddr ) || ! 6503: (cmd->target >= MAX_TARGET) || ! 6504: (cmd->lun >= MAX_LUN )) { ! 6505: return(DID_BAD_TARGET); ! 6506: } ! 6507: ! 6508: /*--------------------------------------------- ! 6509: ** ! 6510: ** Complete the 1st TEST UNIT READY command ! 6511: ** with error condition if the device is ! 6512: ** flagged NOSCAN, in order to speed up ! 6513: ** the boot. ! 6514: ** ! 6515: **--------------------------------------------- ! 6516: */ ! 6517: if (cmd->cmnd[0] == 0 && (tp->usrflag & UF_NOSCAN)) { ! 6518: tp->usrflag &= ~UF_NOSCAN; ! 6519: return DID_BAD_TARGET; ! 6520: } ! 6521: ! 6522: if (DEBUG_FLAGS & DEBUG_TINY) { ! 6523: PRINT_ADDR(cmd); ! 6524: printk ("CMD=%x ", cmd->cmnd[0]); ! 6525: } ! 6526: ! 6527: /*--------------------------------------------------- ! 6528: ** ! 6529: ** Assign a ccb / bind cmd. ! 6530: ** If resetting, shorten settle_time if necessary ! 6531: ** in order to avoid spurious timeouts. ! 6532: ** If resetting or no free ccb, ! 6533: ** insert cmd into the waiting list. ! 6534: ** ! 6535: **---------------------------------------------------- ! 6536: */ ! 6537: if (np->settle_time && cmd->timeout_per_command >= HZ) { ! 6538: u_long tlimit = ktime_get(cmd->timeout_per_command - HZ); ! 6539: if (ktime_dif(np->settle_time, tlimit) > 0) ! 6540: np->settle_time = tlimit; ! 6541: } ! 6542: ! 6543: if (np->settle_time || !(cp=ncr_get_ccb (np, cmd->target, cmd->lun))) { ! 6544: insert_into_waiting_list(np, cmd); ! 6545: return(DID_OK); ! 6546: } ! 6547: cp->cmd = cmd; ! 6548: ! 6549: /*--------------------------------------------------- ! 6550: ** ! 6551: ** Enable tagged queue if asked by scsi ioctl ! 6552: ** ! 6553: **---------------------------------------------------- ! 6554: */ ! 6555: #if 0 /* This stuff was only usefull for linux-1.2.13 */ ! 6556: if (lp && !lp->numtags && cmd->device && cmd->device->tagged_queue) { ! 6557: lp->numtags = tp->usrtags; ! 6558: ncr_setup_tags (np, cp->target, cp->lun); ! 6559: } ! 6560: #endif ! 6561: ! 6562: /*---------------------------------------------------- ! 6563: ** ! 6564: ** Build the identify / tag / sdtr message ! 6565: ** ! 6566: **---------------------------------------------------- ! 6567: */ ! 6568: ! 6569: idmsg = M_IDENTIFY | cp->lun; ! 6570: ! 6571: if (cp ->tag != NO_TAG || (lp && !(tp->usrflag & UF_NODISC))) ! 6572: idmsg |= 0x40; ! 6573: ! 6574: msgptr = cp->scsi_smsg; ! 6575: msglen = 0; ! 6576: msgptr[msglen++] = idmsg; ! 6577: ! 6578: if (cp->tag != NO_TAG) { ! 6579: char order = np->order; ! 6580: ! 6581: /* ! 6582: ** Force ordered tag if necessary to avoid timeouts ! 6583: ** and to preserve interactivity. ! 6584: */ ! 6585: if (lp && ktime_exp(lp->tags_stime)) { ! 6586: lp->tags_si = !(lp->tags_si); ! 6587: if (lp->tags_sum[lp->tags_si]) { ! 6588: order = M_ORDERED_TAG; ! 6589: if ((DEBUG_FLAGS & DEBUG_TAGS)||bootverbose>0){ ! 6590: PRINT_ADDR(cmd); ! 6591: printk("ordered tag forced.\n"); ! 6592: } ! 6593: } ! 6594: lp->tags_stime = ktime_get(3*HZ); ! 6595: } ! 6596: ! 6597: if (order == 0) { ! 6598: /* ! 6599: ** Ordered write ops, unordered read ops. ! 6600: */ ! 6601: switch (cmd->cmnd[0]) { ! 6602: case 0x08: /* READ_SMALL (6) */ ! 6603: case 0x28: /* READ_BIG (10) */ ! 6604: case 0xa8: /* READ_HUGE (12) */ ! 6605: order = M_SIMPLE_TAG; ! 6606: break; ! 6607: default: ! 6608: order = M_ORDERED_TAG; ! 6609: } ! 6610: } ! 6611: msgptr[msglen++] = order; ! 6612: /* ! 6613: ** For less than 128 tags, actual tags are numbered ! 6614: ** 1,3,5,..2*MAXTAGS+1,since we may have to deal ! 6615: ** with devices that have problems with #TAG 0 or too ! 6616: ** great #TAG numbers. For more tags (up to 256), ! 6617: ** we use directly our tag number. ! 6618: */ ! 6619: #if MAX_TASKS > (512/4) ! 6620: msgptr[msglen++] = cp->tag; ! 6621: #else ! 6622: msgptr[msglen++] = (cp->tag << 1) + 1; ! 6623: #endif ! 6624: } ! 6625: ! 6626: cp->host_flags = 0; ! 6627: ! 6628: /*---------------------------------------------------- ! 6629: ** ! 6630: ** Build the data descriptors ! 6631: ** ! 6632: **---------------------------------------------------- ! 6633: */ ! 6634: ! 6635: direction = scsi_data_direction(cmd); ! 6636: if (direction != SCSI_DATA_NONE) { ! 6637: cp->segments = np->scatter (np, cp, cp->cmd); ! 6638: if (cp->segments < 0) { ! 6639: ncr_free_ccb(np, cp); ! 6640: return(DID_ERROR); ! 6641: } ! 6642: } ! 6643: else { ! 6644: cp->data_len = 0; ! 6645: cp->segments = 0; ! 6646: } ! 6647: ! 6648: /*--------------------------------------------------- ! 6649: ** ! 6650: ** negotiation required? ! 6651: ** ! 6652: ** (nego_status is filled by ncr_prepare_nego()) ! 6653: ** ! 6654: **--------------------------------------------------- ! 6655: */ ! 6656: ! 6657: cp->nego_status = 0; ! 6658: ! 6659: #ifdef SCSI_NCR_INTEGRITY_CHECKING ! 6660: if ((np->check_integrity && tp->ic_done) || !np->check_integrity) { ! 6661: if ((!tp->widedone || !tp->period) && !tp->nego_cp && lp) { ! 6662: msglen += ncr_prepare_nego (np, cp, msgptr + msglen); ! 6663: } ! 6664: } ! 6665: else if (np->check_integrity && (cmd->ic_in_progress)) { ! 6666: msglen += ncr_ic_nego (np, cp, cmd, msgptr + msglen); ! 6667: } ! 6668: else if (np->check_integrity && cmd->ic_complete) { ! 6669: u_long current_period; ! 6670: u_char current_offset, current_width, current_factor; ! 6671: ! 6672: ncr_get_xfer_info (np, tp, ¤t_factor, ! 6673: ¤t_offset, ¤t_width); ! 6674: ! 6675: tp->ic_max_width = current_width; ! 6676: tp->ic_min_sync = current_factor; ! 6677: ! 6678: if (current_factor == 9) current_period = 125; ! 6679: else if (current_factor == 10) current_period = 250; ! 6680: else if (current_factor == 11) current_period = 303; ! 6681: else if (current_factor == 12) current_period = 500; ! 6682: else current_period = current_factor * 40; ! 6683: ! 6684: /* ! 6685: * Negotiation for this target is complete. Update flags. ! 6686: */ ! 6687: tp->period = current_period; ! 6688: tp->widedone = 1; ! 6689: tp->ic_done = 1; ! 6690: ! 6691: printk("%s: Integrity Check Complete: \n", ncr_name(np)); ! 6692: ! 6693: printk("%s: %s %s SCSI", ncr_name(np), ! 6694: current_offset?"SYNC":"ASYNC", ! 6695: tp->ic_max_width?"WIDE":"NARROW"); ! 6696: if (current_offset) { ! 6697: u_long mbs = 10000 * (tp->ic_max_width + 1); ! 6698: ! 6699: printk(" %d.%d MB/s", ! 6700: (int) (mbs / current_period), (int) (mbs % current_period)); ! 6701: ! 6702: printk(" (%d ns, %d offset)\n", ! 6703: (int) current_period/10, current_offset); ! 6704: } ! 6705: else ! 6706: printk(" %d MB/s. \n ", (tp->ic_max_width+1)*5); ! 6707: } ! 6708: #else ! 6709: if ((!tp->widedone || !tp->period) && !tp->nego_cp && lp) { ! 6710: msglen += ncr_prepare_nego (np, cp, msgptr + msglen); ! 6711: } ! 6712: #endif /* SCSI_NCR_INTEGRITY_CHECKING */ ! 6713: ! 6714: ! 6715: /*---------------------------------------------------- ! 6716: ** ! 6717: ** Determine xfer direction. ! 6718: ** ! 6719: **---------------------------------------------------- ! 6720: */ ! 6721: if (!cp->data_len) ! 6722: direction = SCSI_DATA_NONE; ! 6723: ! 6724: /* ! 6725: ** If data direction is UNKNOWN, speculate DATA_READ ! 6726: ** but prepare alternate pointers for WRITE in case ! 6727: ** of our speculation will be just wrong. ! 6728: ** SCRIPTS will swap values if needed. ! 6729: */ ! 6730: switch(direction) { ! 6731: case SCSI_DATA_UNKNOWN: ! 6732: case SCSI_DATA_WRITE: ! 6733: goalp = NCB_SCRIPT_PHYS (np, data_out2) + 8; ! 6734: lastp = goalp - 8 - (cp->segments * (SCR_SG_SIZE*4)); ! 6735: if (direction != SCSI_DATA_UNKNOWN) ! 6736: break; ! 6737: cp->phys.header.wgoalp = cpu_to_scr(goalp); ! 6738: cp->phys.header.wlastp = cpu_to_scr(lastp); ! 6739: /* fall through */ ! 6740: case SCSI_DATA_READ: ! 6741: cp->host_flags |= HF_DATA_IN; ! 6742: goalp = NCB_SCRIPT_PHYS (np, data_in2) + 8; ! 6743: lastp = goalp - 8 - (cp->segments * (SCR_SG_SIZE*4)); ! 6744: break; ! 6745: default: ! 6746: case SCSI_DATA_NONE: ! 6747: lastp = goalp = NCB_SCRIPTH_PHYS (np, no_data); ! 6748: break; ! 6749: } ! 6750: ! 6751: /* ! 6752: ** Set all pointers values needed by SCRIPTS. ! 6753: ** If direction is unknown, start at data_io. ! 6754: */ ! 6755: cp->phys.header.lastp = cpu_to_scr(lastp); ! 6756: cp->phys.header.goalp = cpu_to_scr(goalp); ! 6757: ! 6758: if (direction == SCSI_DATA_UNKNOWN) ! 6759: cp->phys.header.savep = ! 6760: cpu_to_scr(NCB_SCRIPTH_PHYS (np, data_io)); ! 6761: else ! 6762: cp->phys.header.savep= cpu_to_scr(lastp); ! 6763: ! 6764: /* ! 6765: ** Save the initial data pointer in order to be able ! 6766: ** to redo the command. ! 6767: ** We also have to save the initial lastp, since it ! 6768: ** will be changed to DATA_IO if we don't know the data ! 6769: ** direction and the device completes the command with ! 6770: ** QUEUE FULL status (without entering the data phase). ! 6771: */ ! 6772: cp->startp = cp->phys.header.savep; ! 6773: cp->lastp0 = cp->phys.header.lastp; ! 6774: ! 6775: /*---------------------------------------------------- ! 6776: ** ! 6777: ** fill in ccb ! 6778: ** ! 6779: **---------------------------------------------------- ! 6780: ** ! 6781: ** ! 6782: ** physical -> virtual backlink ! 6783: ** Generic SCSI command ! 6784: */ ! 6785: ! 6786: /* ! 6787: ** Startqueue ! 6788: */ ! 6789: cp->phys.header.go.start = cpu_to_scr(NCB_SCRIPT_PHYS (np,select)); ! 6790: cp->phys.header.go.restart = cpu_to_scr(NCB_SCRIPT_PHYS (np,resel_dsa)); ! 6791: /* ! 6792: ** select ! 6793: */ ! 6794: cp->phys.select.sel_id = cp->target; ! 6795: cp->phys.select.sel_scntl3 = tp->wval; ! 6796: cp->phys.select.sel_sxfer = tp->sval; ! 6797: cp->phys.select.sel_scntl4 = tp->uval; ! 6798: /* ! 6799: ** message ! 6800: */ ! 6801: cp->phys.smsg.addr = cpu_to_scr(CCB_PHYS (cp, scsi_smsg)); ! 6802: cp->phys.smsg.size = cpu_to_scr(msglen); ! 6803: ! 6804: /* ! 6805: ** command ! 6806: */ ! 6807: memcpy(cp->cdb_buf, cmd->cmnd, MIN(cmd->cmd_len, sizeof(cp->cdb_buf))); ! 6808: cp->phys.cmd.addr = cpu_to_scr(CCB_PHYS (cp, cdb_buf[0])); ! 6809: cp->phys.cmd.size = cpu_to_scr(cmd->cmd_len); ! 6810: ! 6811: /* ! 6812: ** status ! 6813: */ ! 6814: cp->actualquirks = tp->quirks; ! 6815: cp->host_status = cp->nego_status ? HS_NEGOTIATE : HS_BUSY; ! 6816: cp->scsi_status = S_ILLEGAL; ! 6817: cp->xerr_status = 0; ! 6818: cp->extra_bytes = 0; ! 6819: ! 6820: /* ! 6821: ** extreme data pointer. ! 6822: ** shall be positive, so -1 is lower than lowest.:) ! 6823: */ ! 6824: cp->ext_sg = -1; ! 6825: cp->ext_ofs = 0; ! 6826: ! 6827: /*---------------------------------------------------- ! 6828: ** ! 6829: ** Critical region: start this job. ! 6830: ** ! 6831: **---------------------------------------------------- ! 6832: */ ! 6833: ! 6834: /* ! 6835: ** activate this job. ! 6836: */ ! 6837: ! 6838: /* ! 6839: ** insert next CCBs into start queue. ! 6840: ** 2 max at a time is enough to flush the CCB wait queue. ! 6841: */ ! 6842: if (lp) ! 6843: ncr_start_next_ccb(np, lp, 2); ! 6844: else ! 6845: ncr_put_start_queue(np, cp); ! 6846: ! 6847: /* ! 6848: ** Command is successfully queued. ! 6849: */ ! 6850: ! 6851: return(DID_OK); ! 6852: } ! 6853: ! 6854: ! 6855: /*========================================================== ! 6856: ** ! 6857: ** ! 6858: ** Insert a CCB into the start queue and wake up the ! 6859: ** SCRIPTS processor. ! 6860: ** ! 6861: ** ! 6862: **========================================================== ! 6863: */ ! 6864: ! 6865: static void ncr_start_next_ccb(ncb_p np, lcb_p lp, int maxn) ! 6866: { ! 6867: XPT_QUEHEAD *qp; ! 6868: ccb_p cp; ! 6869: ! 6870: while (maxn-- && lp->queuedccbs < lp->queuedepth) { ! 6871: qp = xpt_remque_head(&lp->wait_ccbq); ! 6872: if (!qp) ! 6873: break; ! 6874: ++lp->queuedccbs; ! 6875: cp = xpt_que_entry(qp, struct ccb, link_ccbq); ! 6876: xpt_insque_tail(qp, &lp->busy_ccbq); ! 6877: lp->tasktbl[cp->tag == NO_TAG ? 0 : cp->tag] = ! 6878: cpu_to_scr(cp->p_ccb); ! 6879: ncr_put_start_queue(np, cp); ! 6880: } ! 6881: } ! 6882: ! 6883: static void ncr_put_start_queue(ncb_p np, ccb_p cp) ! 6884: { ! 6885: u_short qidx; ! 6886: ! 6887: #ifdef SCSI_NCR_IARB_SUPPORT ! 6888: /* ! 6889: ** If the previously queued CCB is not yet done, ! 6890: ** set the IARB hint. The SCRIPTS will go with IARB ! 6891: ** for this job when starting the previous one. ! 6892: ** We leave devices a chance to win arbitration by ! 6893: ** not using more than 'iarb_max' consecutive ! 6894: ** immediate arbitrations. ! 6895: */ ! 6896: if (np->last_cp && np->iarb_count < np->iarb_max) { ! 6897: np->last_cp->host_flags |= HF_HINT_IARB; ! 6898: ++np->iarb_count; ! 6899: } ! 6900: else ! 6901: np->iarb_count = 0; ! 6902: np->last_cp = cp; ! 6903: #endif ! 6904: ! 6905: /* ! 6906: ** insert into start queue. ! 6907: */ ! 6908: qidx = np->squeueput + 2; ! 6909: if (qidx >= MAX_START*2) qidx = 0; ! 6910: ! 6911: np->squeue [qidx] = cpu_to_scr(np->p_idletask); ! 6912: MEMORY_BARRIER(); ! 6913: np->squeue [np->squeueput] = cpu_to_scr(cp->p_ccb); ! 6914: ! 6915: np->squeueput = qidx; ! 6916: cp->queued = 1; ! 6917: ! 6918: if (DEBUG_FLAGS & DEBUG_QUEUE) ! 6919: printk ("%s: queuepos=%d.\n", ncr_name (np), np->squeueput); ! 6920: ! 6921: /* ! 6922: ** Script processor may be waiting for reselect. ! 6923: ** Wake it up. ! 6924: */ ! 6925: MEMORY_BARRIER(); ! 6926: OUTB (nc_istat, SIGP|np->istat_sem); ! 6927: } ! 6928: ! 6929: ! 6930: /*========================================================== ! 6931: ** ! 6932: ** Soft reset the chip. ! 6933: ** ! 6934: ** Some 896 and 876 chip revisions may hang-up if we set ! 6935: ** the SRST (soft reset) bit at the wrong time when SCRIPTS ! 6936: ** are running. ! 6937: ** So, we need to abort the current operation prior to ! 6938: ** soft resetting the chip. ! 6939: ** ! 6940: **========================================================== ! 6941: */ ! 6942: ! 6943: static void ncr_chip_reset (ncb_p np) ! 6944: { ! 6945: OUTB (nc_istat, SRST); ! 6946: UDELAY (10); ! 6947: OUTB (nc_istat, 0); ! 6948: } ! 6949: ! 6950: static void ncr_soft_reset(ncb_p np) ! 6951: { ! 6952: u_char istat; ! 6953: int i; ! 6954: ! 6955: OUTB (nc_istat, CABRT); ! 6956: for (i = 1000000 ; i ; --i) { ! 6957: istat = INB (nc_istat); ! 6958: if (istat & SIP) { ! 6959: INW (nc_sist); ! 6960: continue; ! 6961: } ! 6962: if (istat & DIP) { ! 6963: OUTB (nc_istat, 0); ! 6964: INB (nc_dstat); ! 6965: break; ! 6966: } ! 6967: } ! 6968: if (!i) ! 6969: printk("%s: unable to abort current chip operation.\n", ! 6970: ncr_name(np)); ! 6971: ncr_chip_reset(np); ! 6972: } ! 6973: ! 6974: /*========================================================== ! 6975: ** ! 6976: ** ! 6977: ** Start reset process. ! 6978: ** The interrupt handler will reinitialize the chip. ! 6979: ** The timeout handler will wait for settle_time before ! 6980: ** clearing it and so resuming command processing. ! 6981: ** ! 6982: ** ! 6983: **========================================================== ! 6984: */ ! 6985: static void ncr_start_reset(ncb_p np) ! 6986: { ! 6987: (void) ncr_reset_scsi_bus(np, 1, driver_setup.settle_delay); ! 6988: } ! 6989: ! 6990: static int ncr_reset_scsi_bus(ncb_p np, int enab_int, int settle_delay) ! 6991: { ! 6992: u_int32 term; ! 6993: int retv = 0; ! 6994: ! 6995: np->settle_time = ktime_get(settle_delay * HZ); ! 6996: ! 6997: if (bootverbose > 1) ! 6998: printk("%s: resetting, " ! 6999: "command processing suspended for %d seconds\n", ! 7000: ncr_name(np), settle_delay); ! 7001: ! 7002: ncr_soft_reset(np); /* Soft reset the chip */ ! 7003: UDELAY (2000); /* The 895/6 need time for the bus mode to settle */ ! 7004: if (enab_int) ! 7005: OUTW (nc_sien, RST); ! 7006: /* ! 7007: ** Enable Tolerant, reset IRQD if present and ! 7008: ** properly set IRQ mode, prior to resetting the bus. ! 7009: */ ! 7010: OUTB (nc_stest3, TE); ! 7011: OUTB (nc_dcntl, (np->rv_dcntl & IRQM)); ! 7012: OUTB (nc_scntl1, CRST); ! 7013: UDELAY (200); ! 7014: ! 7015: if (!driver_setup.bus_check) ! 7016: goto out; ! 7017: /* ! 7018: ** Check for no terminators or SCSI bus shorts to ground. ! 7019: ** Read SCSI data bus, data parity bits and control signals. ! 7020: ** We are expecting RESET to be TRUE and other signals to be ! 7021: ** FALSE. ! 7022: */ ! 7023: term = INB(nc_sstat0); ! 7024: term = ((term & 2) << 7) + ((term & 1) << 17); /* rst sdp0 */ ! 7025: term |= ((INB(nc_sstat2) & 0x01) << 26) | /* sdp1 */ ! 7026: ((INW(nc_sbdl) & 0xff) << 9) | /* d7-0 */ ! 7027: ((INW(nc_sbdl) & 0xff00) << 10) | /* d15-8 */ ! 7028: INB(nc_sbcl); /* req ack bsy sel atn msg cd io */ ! 7029: ! 7030: if (!(np->features & FE_WIDE)) ! 7031: term &= 0x3ffff; ! 7032: ! 7033: if (term != (2<<7)) { ! 7034: printk("%s: suspicious SCSI data while resetting the BUS.\n", ! 7035: ncr_name(np)); ! 7036: printk("%s: %sdp0,d7-0,rst,req,ack,bsy,sel,atn,msg,c/d,i/o = " ! 7037: "0x%lx, expecting 0x%lx\n", ! 7038: ncr_name(np), ! 7039: (np->features & FE_WIDE) ? "dp1,d15-8," : "", ! 7040: (u_long)term, (u_long)(2<<7)); ! 7041: if (driver_setup.bus_check == 1) ! 7042: retv = 1; ! 7043: } ! 7044: out: ! 7045: OUTB (nc_scntl1, 0); ! 7046: return retv; ! 7047: } ! 7048: ! 7049: /*========================================================== ! 7050: ** ! 7051: ** ! 7052: ** Reset the SCSI BUS. ! 7053: ** This is called from the generic SCSI driver. ! 7054: ** ! 7055: ** ! 7056: **========================================================== ! 7057: */ ! 7058: static int ncr_reset_bus (ncb_p np, Scsi_Cmnd *cmd, int sync_reset) ! 7059: { ! 7060: /* Scsi_Device *device = cmd->device; */ ! 7061: ccb_p cp; ! 7062: int found; ! 7063: ! 7064: /* ! 7065: * Return immediately if reset is in progress. ! 7066: */ ! 7067: if (np->settle_time) { ! 7068: return SCSI_RESET_PUNT; ! 7069: } ! 7070: /* ! 7071: * Start the reset process. ! 7072: * The script processor is then assumed to be stopped. ! 7073: * Commands will now be queued in the waiting list until a settle ! 7074: * delay of 2 seconds will be completed. ! 7075: */ ! 7076: ncr_start_reset(np); ! 7077: /* ! 7078: * First, look in the wakeup list ! 7079: */ ! 7080: for (found=0, cp=np->ccbc; cp; cp=cp->link_ccb) { ! 7081: /* ! 7082: ** look for the ccb of this command. ! 7083: */ ! 7084: if (cp->host_status == HS_IDLE) continue; ! 7085: if (cp->cmd == cmd) { ! 7086: found = 1; ! 7087: break; ! 7088: } ! 7089: } ! 7090: /* ! 7091: * Then, look in the waiting list ! 7092: */ ! 7093: if (!found && retrieve_from_waiting_list(0, np, cmd)) ! 7094: found = 1; ! 7095: /* ! 7096: * Wake-up all awaiting commands with DID_RESET. ! 7097: */ ! 7098: reset_waiting_list(np); ! 7099: /* ! 7100: * Wake-up all pending commands with HS_RESET -> DID_RESET. ! 7101: */ ! 7102: ncr_wakeup(np, HS_RESET); ! 7103: /* ! 7104: * If the involved command was not in a driver queue, and the ! 7105: * scsi driver told us reset is synchronous, and the command is not ! 7106: * currently in the waiting list, complete it with DID_RESET status, ! 7107: * in order to keep it alive. ! 7108: */ ! 7109: if (!found && sync_reset && !retrieve_from_waiting_list(0, np, cmd)) { ! 7110: SetScsiResult(cmd, DID_RESET, 0); ! 7111: ncr_queue_done_cmd(np, cmd); ! 7112: } ! 7113: ! 7114: return SCSI_RESET_SUCCESS; ! 7115: } ! 7116: ! 7117: /*========================================================== ! 7118: ** ! 7119: ** ! 7120: ** Abort an SCSI command. ! 7121: ** This is called from the generic SCSI driver. ! 7122: ** ! 7123: ** ! 7124: **========================================================== ! 7125: */ ! 7126: static int ncr_abort_command (ncb_p np, Scsi_Cmnd *cmd) ! 7127: { ! 7128: /* Scsi_Device *device = cmd->device; */ ! 7129: ccb_p cp; ! 7130: ! 7131: /* ! 7132: * First, look for the scsi command in the waiting list ! 7133: */ ! 7134: if (remove_from_waiting_list(np, cmd)) { ! 7135: SetScsiAbortResult(cmd); ! 7136: ncr_queue_done_cmd(np, cmd); ! 7137: return SCSI_ABORT_SUCCESS; ! 7138: } ! 7139: ! 7140: /* ! 7141: * Then, look in the wakeup list ! 7142: */ ! 7143: for (cp=np->ccbc; cp; cp=cp->link_ccb) { ! 7144: /* ! 7145: ** look for the ccb of this command. ! 7146: */ ! 7147: if (cp->host_status == HS_IDLE) continue; ! 7148: if (cp->cmd == cmd) ! 7149: break; ! 7150: } ! 7151: ! 7152: if (!cp) { ! 7153: return SCSI_ABORT_NOT_RUNNING; ! 7154: } ! 7155: ! 7156: /* ! 7157: ** Keep track we have to abort this job. ! 7158: */ ! 7159: cp->to_abort = 1; ! 7160: ! 7161: /* ! 7162: ** Tell the SCRIPTS processor to stop ! 7163: ** and synchronize with us. ! 7164: */ ! 7165: np->istat_sem = SEM; ! 7166: ! 7167: /* ! 7168: ** If there are no requests, the script ! 7169: ** processor will sleep on SEL_WAIT_RESEL. ! 7170: ** Let's wake it up, since it may have to work. ! 7171: */ ! 7172: OUTB (nc_istat, SIGP|SEM); ! 7173: ! 7174: /* ! 7175: ** Tell user we are working for him. ! 7176: */ ! 7177: return SCSI_ABORT_PENDING; ! 7178: } ! 7179: ! 7180: /*========================================================== ! 7181: ** ! 7182: ** Linux release module stuff. ! 7183: ** ! 7184: ** Called before unloading the module ! 7185: ** Detach the host. ! 7186: ** We have to free resources and halt the NCR chip ! 7187: ** ! 7188: **========================================================== ! 7189: */ ! 7190: ! 7191: #ifdef MODULE ! 7192: static int ncr_detach(ncb_p np) ! 7193: { ! 7194: int i; ! 7195: ! 7196: printk("%s: detaching ...\n", ncr_name(np)); ! 7197: ! 7198: /* ! 7199: ** Stop the ncr_timeout process ! 7200: ** Set release_stage to 1 and wait that ncr_timeout() set it to 2. ! 7201: */ ! 7202: np->release_stage = 1; ! 7203: for (i = 50 ; i && np->release_stage != 2 ; i--) MDELAY (100); ! 7204: if (np->release_stage != 2) ! 7205: printk("%s: the timer seems to be already stopped\n", ! 7206: ncr_name(np)); ! 7207: else np->release_stage = 2; ! 7208: ! 7209: /* ! 7210: ** Reset NCR chip. ! 7211: ** We should use ncr_soft_reset(), but we donnot want to do ! 7212: ** so, since we may not be safe if interrupts occur. ! 7213: */ ! 7214: ! 7215: printk("%s: resetting chip\n", ncr_name(np)); ! 7216: ncr_chip_reset(np); ! 7217: ! 7218: /* ! 7219: ** Restore bios setting for automatic clock detection. ! 7220: */ ! 7221: OUTB(nc_dmode, np->sv_dmode); ! 7222: OUTB(nc_dcntl, np->sv_dcntl); ! 7223: OUTB(nc_ctest3, np->sv_ctest3); ! 7224: OUTB(nc_ctest4, np->sv_ctest4); ! 7225: OUTB(nc_ctest5, np->sv_ctest5); ! 7226: OUTB(nc_gpcntl, np->sv_gpcntl); ! 7227: OUTB(nc_stest2, np->sv_stest2); ! 7228: ! 7229: ncr_selectclock(np, np->sv_scntl3); ! 7230: /* ! 7231: ** Free host resources ! 7232: */ ! 7233: ncr_free_resources(np); ! 7234: ! 7235: return 1; ! 7236: } ! 7237: #endif ! 7238: ! 7239: /*========================================================== ! 7240: ** ! 7241: ** ! 7242: ** Complete execution of a SCSI command. ! 7243: ** Signal completion to the generic SCSI driver. ! 7244: ** ! 7245: ** ! 7246: **========================================================== ! 7247: */ ! 7248: ! 7249: void ncr_complete (ncb_p np, ccb_p cp) ! 7250: { ! 7251: Scsi_Cmnd *cmd; ! 7252: tcb_p tp; ! 7253: lcb_p lp; ! 7254: ! 7255: /* ! 7256: ** Sanity check ! 7257: */ ! 7258: if (!cp || !cp->cmd) ! 7259: return; ! 7260: ! 7261: /* ! 7262: ** Print some debugging info. ! 7263: */ ! 7264: ! 7265: if (DEBUG_FLAGS & DEBUG_TINY) ! 7266: printk ("CCB=%lx STAT=%x/%x\n", (unsigned long)cp, ! 7267: cp->host_status,cp->scsi_status); ! 7268: ! 7269: /* ! 7270: ** Get command, target and lun pointers. ! 7271: */ ! 7272: ! 7273: cmd = cp->cmd; ! 7274: cp->cmd = NULL; ! 7275: tp = &np->target[cp->target]; ! 7276: lp = ncr_lp(np, tp, cp->lun); ! 7277: ! 7278: /* ! 7279: ** We donnot queue more than 1 ccb per target ! 7280: ** with negotiation at any time. If this ccb was ! 7281: ** used for negotiation, clear this info in the tcb. ! 7282: */ ! 7283: ! 7284: if (cp == tp->nego_cp) ! 7285: tp->nego_cp = 0; ! 7286: ! 7287: #ifdef SCSI_NCR_IARB_SUPPORT ! 7288: /* ! 7289: ** We just complete the last queued CCB. ! 7290: ** Clear this info that is no more relevant. ! 7291: */ ! 7292: if (cp == np->last_cp) ! 7293: np->last_cp = 0; ! 7294: #endif ! 7295: ! 7296: /* ! 7297: ** If auto-sense performed, change scsi status, ! 7298: ** Otherwise, compute the residual. ! 7299: */ ! 7300: if (cp->host_flags & HF_AUTO_SENSE) { ! 7301: cp->scsi_status = cp->sv_scsi_status; ! 7302: cp->xerr_status = cp->sv_xerr_status; ! 7303: } ! 7304: else { ! 7305: cp->resid = 0; ! 7306: if (cp->xerr_status || ! 7307: cp->phys.header.lastp != cp->phys.header.goalp) ! 7308: cp->resid = ncr_compute_residual(np, cp); ! 7309: } ! 7310: ! 7311: /* ! 7312: ** Check for extended errors. ! 7313: */ ! 7314: ! 7315: if (cp->xerr_status) { ! 7316: if (cp->xerr_status & XE_PARITY_ERR) { ! 7317: PRINT_ADDR(cmd); ! 7318: printk ("unrecovered SCSI parity error.\n"); ! 7319: } ! 7320: if (cp->xerr_status & XE_EXTRA_DATA) { ! 7321: PRINT_ADDR(cmd); ! 7322: printk ("extraneous data discarded.\n"); ! 7323: } ! 7324: if (cp->xerr_status & XE_BAD_PHASE) { ! 7325: PRINT_ADDR(cmd); ! 7326: printk ("illegal scsi phase (4/5).\n"); ! 7327: } ! 7328: if (cp->xerr_status & XE_SODL_UNRUN) { ! 7329: PRINT_ADDR(cmd); ! 7330: printk ("ODD transfer in DATA OUT phase.\n"); ! 7331: } ! 7332: if (cp->xerr_status & XE_SWIDE_OVRUN){ ! 7333: PRINT_ADDR(cmd); ! 7334: printk ("ODD transfer in DATA IN phase.\n"); ! 7335: } ! 7336: ! 7337: if (cp->host_status==HS_COMPLETE) ! 7338: cp->host_status = HS_FAIL; ! 7339: } ! 7340: ! 7341: /* ! 7342: ** Print out any error for debugging purpose. ! 7343: */ ! 7344: if (DEBUG_FLAGS & (DEBUG_RESULT|DEBUG_TINY)) { ! 7345: if (cp->host_status!=HS_COMPLETE || cp->scsi_status!=S_GOOD || ! 7346: cp->resid) { ! 7347: PRINT_ADDR(cmd); ! 7348: printk ("ERROR: cmd=%x host_status=%x scsi_status=%x " ! 7349: "data_len=%d residual=%d\n", ! 7350: cmd->cmnd[0], cp->host_status, cp->scsi_status, ! 7351: cp->data_len, cp->resid); ! 7352: } ! 7353: } ! 7354: ! 7355: #if LINUX_VERSION_CODE >= LinuxVersionCode(2,3,99) ! 7356: /* ! 7357: ** Move residual byte count to user structure. ! 7358: */ ! 7359: cmd->resid = cp->resid; ! 7360: #endif ! 7361: /* ! 7362: ** Check the status. ! 7363: */ ! 7364: if ( (cp->host_status == HS_COMPLETE) ! 7365: && (cp->scsi_status == S_GOOD || ! 7366: cp->scsi_status == S_COND_MET)) { ! 7367: /* ! 7368: ** All went well (GOOD status). ! 7369: ** CONDITION MET status is returned on ! 7370: ** `Pre-Fetch' or `Search data' success. ! 7371: */ ! 7372: SetScsiResult(cmd, DID_OK, cp->scsi_status); ! 7373: ! 7374: /* ! 7375: ** Allocate the lcb if not yet. ! 7376: */ ! 7377: if (!lp) ! 7378: ncr_alloc_lcb (np, cp->target, cp->lun); ! 7379: ! 7380: /* ! 7381: ** On standard INQUIRY response (EVPD and CmDt ! 7382: ** not set), setup logical unit according to ! 7383: ** announced capabilities (we need the 1rst 7 bytes). ! 7384: */ ! 7385: if (cmd->cmnd[0] == 0x12 && !(cmd->cmnd[1] & 0x3) && ! 7386: cmd->cmnd[4] >= 7 && !cmd->use_sg) { ! 7387: sync_scsi_data(np, cmd); /* SYNC the data */ ! 7388: ncr_setup_lcb (np, cp->target, cp->lun, ! 7389: (char *) cmd->request_buffer); ! 7390: } ! 7391: ! 7392: /* ! 7393: ** If tags was reduced due to queue full, ! 7394: ** increase tags if 1000 good status received. ! 7395: */ ! 7396: if (lp && lp->usetags && lp->numtags < lp->maxtags) { ! 7397: ++lp->num_good; ! 7398: if (lp->num_good >= 1000) { ! 7399: lp->num_good = 0; ! 7400: ++lp->numtags; ! 7401: ncr_setup_tags (np, cp->target, cp->lun); ! 7402: } ! 7403: } ! 7404: } else if ((cp->host_status == HS_COMPLETE) ! 7405: && (cp->scsi_status == S_CHECK_COND)) { ! 7406: /* ! 7407: ** Check condition code ! 7408: */ ! 7409: SetScsiResult(cmd, DID_OK, S_CHECK_COND); ! 7410: ! 7411: if (DEBUG_FLAGS & (DEBUG_RESULT|DEBUG_TINY)) { ! 7412: PRINT_ADDR(cmd); ! 7413: ncr_printl_hex("sense data:", cmd->sense_buffer, 14); ! 7414: } ! 7415: } else if ((cp->host_status == HS_COMPLETE) ! 7416: && (cp->scsi_status == S_CONFLICT)) { ! 7417: /* ! 7418: ** Reservation Conflict condition code ! 7419: */ ! 7420: SetScsiResult(cmd, DID_OK, S_CONFLICT); ! 7421: ! 7422: } else if ((cp->host_status == HS_COMPLETE) ! 7423: && (cp->scsi_status == S_BUSY || ! 7424: cp->scsi_status == S_QUEUE_FULL)) { ! 7425: ! 7426: /* ! 7427: ** Target is busy. ! 7428: */ ! 7429: SetScsiResult(cmd, DID_OK, cp->scsi_status); ! 7430: ! 7431: } else if ((cp->host_status == HS_SEL_TIMEOUT) ! 7432: || (cp->host_status == HS_TIMEOUT)) { ! 7433: ! 7434: /* ! 7435: ** No response ! 7436: */ ! 7437: SetScsiResult(cmd, DID_TIME_OUT, cp->scsi_status); ! 7438: ! 7439: } else if (cp->host_status == HS_RESET) { ! 7440: ! 7441: /* ! 7442: ** SCSI bus reset ! 7443: */ ! 7444: SetScsiResult(cmd, DID_RESET, cp->scsi_status); ! 7445: ! 7446: } else if (cp->host_status == HS_ABORTED) { ! 7447: ! 7448: /* ! 7449: ** Transfer aborted ! 7450: */ ! 7451: SetScsiAbortResult(cmd); ! 7452: ! 7453: } else { ! 7454: int did_status; ! 7455: ! 7456: /* ! 7457: ** Other protocol messes ! 7458: */ ! 7459: PRINT_ADDR(cmd); ! 7460: printk ("COMMAND FAILED (%x %x) @%p.\n", ! 7461: cp->host_status, cp->scsi_status, cp); ! 7462: ! 7463: did_status = DID_ERROR; ! 7464: if (cp->xerr_status & XE_PARITY_ERR) ! 7465: did_status = DID_PARITY; ! 7466: ! 7467: SetScsiResult(cmd, did_status, cp->scsi_status); ! 7468: } ! 7469: ! 7470: /* ! 7471: ** trace output ! 7472: */ ! 7473: ! 7474: if (tp->usrflag & UF_TRACE) { ! 7475: PRINT_ADDR(cmd); ! 7476: printk (" CMD:"); ! 7477: ncr_print_hex(cmd->cmnd, cmd->cmd_len); ! 7478: ! 7479: if (cp->host_status==HS_COMPLETE) { ! 7480: switch (cp->scsi_status) { ! 7481: case S_GOOD: ! 7482: printk (" GOOD"); ! 7483: break; ! 7484: case S_CHECK_COND: ! 7485: printk (" SENSE:"); ! 7486: ncr_print_hex(cmd->sense_buffer, 14); ! 7487: break; ! 7488: default: ! 7489: printk (" STAT: %x\n", cp->scsi_status); ! 7490: break; ! 7491: } ! 7492: } else printk (" HOSTERROR: %x", cp->host_status); ! 7493: printk ("\n"); ! 7494: } ! 7495: ! 7496: /* ! 7497: ** Free this ccb ! 7498: */ ! 7499: ncr_free_ccb (np, cp); ! 7500: ! 7501: /* ! 7502: ** requeue awaiting scsi commands for this lun. ! 7503: */ ! 7504: if (lp && lp->queuedccbs < lp->queuedepth && ! 7505: !xpt_que_empty(&lp->wait_ccbq)) ! 7506: ncr_start_next_ccb(np, lp, 2); ! 7507: ! 7508: /* ! 7509: ** requeue awaiting scsi commands for this controller. ! 7510: */ ! 7511: if (np->waiting_list) ! 7512: requeue_waiting_list(np); ! 7513: ! 7514: /* ! 7515: ** signal completion to generic driver. ! 7516: */ ! 7517: ncr_queue_done_cmd(np, cmd); ! 7518: } ! 7519: ! 7520: /*========================================================== ! 7521: ** ! 7522: ** ! 7523: ** Signal all (or one) control block done. ! 7524: ** ! 7525: ** ! 7526: **========================================================== ! 7527: */ ! 7528: ! 7529: /* ! 7530: ** The NCR has completed CCBs. ! 7531: ** Look at the DONE QUEUE. ! 7532: ** ! 7533: ** On architectures that may reorder LOAD/STORE operations, ! 7534: ** a memory barrier may be needed after the reading of the ! 7535: ** so-called `flag' and prior to dealing with the data. ! 7536: */ ! 7537: int ncr_wakeup_done (ncb_p np) ! 7538: { ! 7539: ccb_p cp; ! 7540: int i, n; ! 7541: u_long dsa; ! 7542: ! 7543: n = 0; ! 7544: i = np->dqueueget; ! 7545: while (1) { ! 7546: dsa = scr_to_cpu(np->dqueue[i]); ! 7547: if (!dsa) ! 7548: break; ! 7549: np->dqueue[i] = 0; ! 7550: if ((i = i+2) >= MAX_START*2) ! 7551: i = 0; ! 7552: ! 7553: cp = ncr_ccb_from_dsa(np, dsa); ! 7554: if (cp) { ! 7555: MEMORY_BARRIER(); ! 7556: ncr_complete (np, cp); ! 7557: ++n; ! 7558: } ! 7559: else ! 7560: printk (KERN_ERR "%s: bad DSA (%lx) in done queue.\n", ! 7561: ncr_name(np), dsa); ! 7562: } ! 7563: np->dqueueget = i; ! 7564: ! 7565: return n; ! 7566: } ! 7567: ! 7568: /* ! 7569: ** Complete all active CCBs. ! 7570: */ ! 7571: void ncr_wakeup (ncb_p np, u_long code) ! 7572: { ! 7573: ccb_p cp = np->ccbc; ! 7574: ! 7575: while (cp) { ! 7576: if (cp->host_status != HS_IDLE) { ! 7577: cp->host_status = code; ! 7578: ncr_complete (np, cp); ! 7579: } ! 7580: cp = cp->link_ccb; ! 7581: } ! 7582: } ! 7583: ! 7584: /*========================================================== ! 7585: ** ! 7586: ** ! 7587: ** Start NCR chip. ! 7588: ** ! 7589: ** ! 7590: **========================================================== ! 7591: */ ! 7592: ! 7593: void ncr_init (ncb_p np, int reset, char * msg, u_long code) ! 7594: { ! 7595: int i; ! 7596: u_long phys; ! 7597: ! 7598: /* ! 7599: ** Reset chip if asked, otherwise just clear fifos. ! 7600: */ ! 7601: ! 7602: if (reset) ! 7603: ncr_soft_reset(np); ! 7604: else { ! 7605: OUTB (nc_stest3, TE|CSF); ! 7606: OUTONB (nc_ctest3, CLF); ! 7607: } ! 7608: ! 7609: /* ! 7610: ** Message. ! 7611: */ ! 7612: ! 7613: if (msg) printk (KERN_INFO "%s: restart (%s).\n", ncr_name (np), msg); ! 7614: ! 7615: /* ! 7616: ** Clear Start Queue ! 7617: */ ! 7618: phys = np->p_squeue; ! 7619: np->queuedepth = MAX_START - 1; /* 1 entry needed as end marker */ ! 7620: for (i = 0; i < MAX_START*2; i += 2) { ! 7621: np->squeue[i] = cpu_to_scr(np->p_idletask); ! 7622: np->squeue[i+1] = cpu_to_scr(phys + (i+2)*4); ! 7623: } ! 7624: np->squeue[MAX_START*2-1] = cpu_to_scr(phys); ! 7625: ! 7626: ! 7627: /* ! 7628: ** Start at first entry. ! 7629: */ ! 7630: np->squeueput = 0; ! 7631: np->scripth0->startpos[0] = cpu_to_scr(phys); ! 7632: ! 7633: /* ! 7634: ** Clear Done Queue ! 7635: */ ! 7636: phys = vtobus(np->dqueue); ! 7637: for (i = 0; i < MAX_START*2; i += 2) { ! 7638: np->dqueue[i] = 0; ! 7639: np->dqueue[i+1] = cpu_to_scr(phys + (i+2)*4); ! 7640: } ! 7641: np->dqueue[MAX_START*2-1] = cpu_to_scr(phys); ! 7642: ! 7643: /* ! 7644: ** Start at first entry. ! 7645: */ ! 7646: np->scripth0->done_pos[0] = cpu_to_scr(phys); ! 7647: np->dqueueget = 0; ! 7648: ! 7649: /* ! 7650: ** Wakeup all pending jobs. ! 7651: */ ! 7652: ncr_wakeup (np, code); ! 7653: ! 7654: /* ! 7655: ** Init chip. ! 7656: */ ! 7657: ! 7658: OUTB (nc_istat, 0x00 ); /* Remove Reset, abort */ ! 7659: UDELAY (2000); /* The 895 needs time for the bus mode to settle */ ! 7660: ! 7661: OUTB (nc_scntl0, np->rv_scntl0 | 0xc0); ! 7662: /* full arb., ena parity, par->ATN */ ! 7663: OUTB (nc_scntl1, 0x00); /* odd parity, and remove CRST!! */ ! 7664: ! 7665: ncr_selectclock(np, np->rv_scntl3); /* Select SCSI clock */ ! 7666: ! 7667: OUTB (nc_scid , RRE|np->myaddr); /* Adapter SCSI address */ ! 7668: OUTW (nc_respid, 1ul<<np->myaddr); /* Id to respond to */ ! 7669: OUTB (nc_istat , SIGP ); /* Signal Process */ ! 7670: OUTB (nc_dmode , np->rv_dmode); /* Burst length, dma mode */ ! 7671: OUTB (nc_ctest5, np->rv_ctest5); /* Large fifo + large burst */ ! 7672: ! 7673: OUTB (nc_dcntl , NOCOM|np->rv_dcntl); /* Protect SFBR */ ! 7674: OUTB (nc_ctest3, np->rv_ctest3); /* Write and invalidate */ ! 7675: OUTB (nc_ctest4, np->rv_ctest4); /* Master parity checking */ ! 7676: ! 7677: if ((np->device_id != PCI_DEVICE_ID_LSI_53C1010) && ! 7678: (np->device_id != PCI_DEVICE_ID_LSI_53C1010_66)){ ! 7679: OUTB (nc_stest2, EXT|np->rv_stest2); ! 7680: /* Extended Sreq/Sack filtering, not supported in C1010/C1010_66 */ ! 7681: } ! 7682: OUTB (nc_stest3, TE); /* TolerANT enable */ ! 7683: OUTB (nc_stime0, 0x0c); /* HTH disabled STO 0.25 sec */ ! 7684: ! 7685: /* ! 7686: ** DEL 441 - 53C876 Rev 5 - Part Number 609-0392787/2788 - ITEM 2. ! 7687: ** Disable overlapped arbitration for all dual-function ! 7688: ** devices, regardless revision id. ! 7689: ** We may consider it is a post-chip-design feature. ;-) ! 7690: ** ! 7691: ** Errata applies to all 896 and 1010 parts. ! 7692: */ ! 7693: if (np->device_id == PCI_DEVICE_ID_NCR_53C875) ! 7694: OUTB (nc_ctest0, (1<<5)); ! 7695: else if (np->device_id == PCI_DEVICE_ID_NCR_53C896 || ! 7696: np->device_id == PCI_DEVICE_ID_LSI_53C1010 || ! 7697: np->device_id == PCI_DEVICE_ID_LSI_53C1010_66 ) ! 7698: np->rv_ccntl0 |= DPR; ! 7699: ! 7700: /* ! 7701: ** C1010_66MHz rev 0 part requies AIPCNTL1 bit 3 to be set. ! 7702: */ ! 7703: if (np->device_id == PCI_DEVICE_ID_LSI_53C1010_66) ! 7704: OUTB(nc_aipcntl1, (1<<3)); ! 7705: ! 7706: /* ! 7707: ** If 64 bit (895A/896/1010/1010_66) write the CCNTL1 register to ! 7708: ** enable 40 bit address table indirect addressing for MOVE. ! 7709: ** Also write CCNTL0 if 64 bit chip, since this register seems ! 7710: ** to only be used by 64 bit cores. ! 7711: */ ! 7712: if (np->features & FE_64BIT) { ! 7713: OUTB (nc_ccntl0, np->rv_ccntl0); ! 7714: OUTB (nc_ccntl1, np->rv_ccntl1); ! 7715: } ! 7716: ! 7717: /* ! 7718: ** If phase mismatch handled by scripts (53C895A or 53C896 ! 7719: ** or 53C1010 or 53C1010_66), set PM jump addresses. ! 7720: */ ! 7721: ! 7722: if (np->features & FE_NOPM) { ! 7723: printk(KERN_INFO "%s: handling phase mismatch from SCRIPTS.\n", ! 7724: ncr_name(np)); ! 7725: OUTL (nc_pmjad1, NCB_SCRIPTH_PHYS (np, pm_handle)); ! 7726: OUTL (nc_pmjad2, NCB_SCRIPTH_PHYS (np, pm_handle)); ! 7727: } ! 7728: ! 7729: /* ! 7730: ** Enable GPIO0 pin for writing if LED support from SCRIPTS. ! 7731: ** Also set GPIO5 and clear GPIO6 if hardware LED control. ! 7732: */ ! 7733: ! 7734: if (np->features & FE_LED0) ! 7735: OUTB(nc_gpcntl, INB(nc_gpcntl) & ~0x01); ! 7736: else if (np->features & FE_LEDC) ! 7737: OUTB(nc_gpcntl, (INB(nc_gpcntl) & ~0x41) | 0x20); ! 7738: ! 7739: ! 7740: /* ! 7741: ** enable ints ! 7742: */ ! 7743: ! 7744: OUTW (nc_sien , STO|HTH|MA|SGE|UDC|RST|PAR); ! 7745: OUTB (nc_dien , MDPE|BF|SSI|SIR|IID); ! 7746: ! 7747: /* ! 7748: ** For 895/895A/896/c1010 ! 7749: ** Enable SBMC interrupt and save current SCSI bus mode. ! 7750: */ ! 7751: if ( (np->features & FE_ULTRA2) || (np->features & FE_ULTRA3) ) { ! 7752: OUTONW (nc_sien, SBMC); ! 7753: np->scsi_mode = INB (nc_stest4) & SMODE; ! 7754: } ! 7755: ! 7756: /* ! 7757: ** Fill in target structure. ! 7758: ** Reinitialize usrsync. ! 7759: ** Reinitialize usrwide. ! 7760: ** Prepare sync negotiation according to actual SCSI bus mode. ! 7761: */ ! 7762: ! 7763: for (i=0;i<MAX_TARGET;i++) { ! 7764: tcb_p tp = &np->target[i]; ! 7765: ! 7766: tp->to_reset = 0; ! 7767: ! 7768: tp->sval = 0; ! 7769: tp->wval = np->rv_scntl3; ! 7770: tp->uval = np->rv_scntl4; ! 7771: ! 7772: if (tp->usrsync != 255) { ! 7773: if (tp->usrsync <= np->maxsync) { ! 7774: if (tp->usrsync < np->minsync) { ! 7775: tp->usrsync = np->minsync; ! 7776: } ! 7777: } ! 7778: else ! 7779: tp->usrsync = 255; ! 7780: }; ! 7781: ! 7782: if (tp->usrwide > np->maxwide) ! 7783: tp->usrwide = np->maxwide; ! 7784: ! 7785: ncr_negotiate (np, tp); ! 7786: } ! 7787: ! 7788: /* ! 7789: ** Download SCSI SCRIPTS to on-chip RAM if present, ! 7790: ** and start script processor. ! 7791: ** We do the download preferently from the CPU. ! 7792: ** For platforms that may not support PCI memory mapping, ! 7793: ** we use a simple SCRIPTS that performs MEMORY MOVEs. ! 7794: */ ! 7795: if (np->base2_ba) { ! 7796: if (bootverbose) ! 7797: printk ("%s: Downloading SCSI SCRIPTS.\n", ! 7798: ncr_name(np)); ! 7799: #ifdef SCSI_NCR_PCI_MEM_NOT_SUPPORTED ! 7800: if (np->base2_ws == 8192) ! 7801: phys = NCB_SCRIPTH0_PHYS (np, start_ram64); ! 7802: else ! 7803: phys = NCB_SCRIPTH_PHYS (np, start_ram); ! 7804: #else ! 7805: if (np->base2_ws == 8192) { ! 7806: memcpy_to_pci(np->base2_va + 4096, ! 7807: np->scripth0, sizeof(struct scripth)); ! 7808: OUTL (nc_mmws, np->scr_ram_seg); ! 7809: OUTL (nc_mmrs, np->scr_ram_seg); ! 7810: OUTL (nc_sfs, np->scr_ram_seg); ! 7811: phys = NCB_SCRIPTH_PHYS (np, start64); ! 7812: } ! 7813: else ! 7814: phys = NCB_SCRIPT_PHYS (np, init); ! 7815: memcpy_to_pci(np->base2_va, np->script0, sizeof(struct script)); ! 7816: #endif /* SCSI_NCR_PCI_MEM_NOT_SUPPORTED */ ! 7817: } ! 7818: else ! 7819: phys = NCB_SCRIPT_PHYS (np, init); ! 7820: ! 7821: np->istat_sem = 0; ! 7822: ! 7823: OUTL (nc_dsa, np->p_ncb); ! 7824: OUTL_DSP (phys); ! 7825: } ! 7826: ! 7827: /*========================================================== ! 7828: ** ! 7829: ** Prepare the negotiation values for wide and ! 7830: ** synchronous transfers. ! 7831: ** ! 7832: **========================================================== ! 7833: */ ! 7834: ! 7835: static void ncr_negotiate (struct ncb* np, struct tcb* tp) ! 7836: { ! 7837: /* ! 7838: ** minsync unit is 4ns ! ! 7839: */ ! 7840: ! 7841: u_long minsync = tp->usrsync; ! 7842: ! 7843: /* ! 7844: ** SCSI bus mode limit ! 7845: */ ! 7846: ! 7847: if (np->scsi_mode && np->scsi_mode == SMODE_SE) { ! 7848: if (minsync < 12) minsync = 12; ! 7849: } ! 7850: ! 7851: /* ! 7852: ** our limit .. ! 7853: */ ! 7854: ! 7855: if (minsync < np->minsync) ! 7856: minsync = np->minsync; ! 7857: ! 7858: /* ! 7859: ** divider limit ! 7860: */ ! 7861: ! 7862: if (minsync > np->maxsync) ! 7863: minsync = 255; ! 7864: ! 7865: tp->minsync = minsync; ! 7866: tp->maxoffs = (minsync<255 ? np->maxoffs : 0); ! 7867: ! 7868: /* ! 7869: ** period=0: has to negotiate sync transfer ! 7870: */ ! 7871: ! 7872: tp->period=0; ! 7873: ! 7874: /* ! 7875: ** widedone=0: has to negotiate wide transfer ! 7876: */ ! 7877: tp->widedone=0; ! 7878: } ! 7879: ! 7880: /*========================================================== ! 7881: ** ! 7882: ** Get clock factor and sync divisor for a given ! 7883: ** synchronous factor period. ! 7884: ** Returns the clock factor (in sxfer) and scntl3 ! 7885: ** synchronous divisor field. ! 7886: ** ! 7887: **========================================================== ! 7888: */ ! 7889: ! 7890: static void ncr_getsync(ncb_p np, u_char sfac, u_char *fakp, u_char *scntl3p) ! 7891: { ! 7892: u_long clk = np->clock_khz; /* SCSI clock frequency in kHz */ ! 7893: int div = np->clock_divn; /* Number of divisors supported */ ! 7894: u_long fak; /* Sync factor in sxfer */ ! 7895: u_long per; /* Period in tenths of ns */ ! 7896: u_long kpc; /* (per * clk) */ ! 7897: ! 7898: /* ! 7899: ** Compute the synchronous period in tenths of nano-seconds ! 7900: ** from sfac. ! 7901: ** ! 7902: ** Note, if sfac == 9, DT is being used. Double the period of 125 ! 7903: ** to 250. ! 7904: */ ! 7905: if (sfac <= 10) per = 250; ! 7906: else if (sfac == 11) per = 303; ! 7907: else if (sfac == 12) per = 500; ! 7908: else per = 40 * sfac; ! 7909: ! 7910: /* ! 7911: ** Look for the greatest clock divisor that allows an ! 7912: ** input speed faster than the period. ! 7913: */ ! 7914: kpc = per * clk; ! 7915: while (--div >= 0) ! 7916: if (kpc >= (div_10M[div] << 2)) break; ! 7917: ! 7918: /* ! 7919: ** Calculate the lowest clock factor that allows an output ! 7920: ** speed not faster than the period. ! 7921: */ ! 7922: fak = (kpc - 1) / div_10M[div] + 1; ! 7923: ! 7924: #if 0 /* This optimization does not seem very usefull */ ! 7925: ! 7926: per = (fak * div_10M[div]) / clk; ! 7927: ! 7928: /* ! 7929: ** Why not to try the immediate lower divisor and to choose ! 7930: ** the one that allows the fastest output speed ? ! 7931: ** We dont want input speed too much greater than output speed. ! 7932: */ ! 7933: if (div >= 1 && fak < 8) { ! 7934: u_long fak2, per2; ! 7935: fak2 = (kpc - 1) / div_10M[div-1] + 1; ! 7936: per2 = (fak2 * div_10M[div-1]) / clk; ! 7937: if (per2 < per && fak2 <= 8) { ! 7938: fak = fak2; ! 7939: per = per2; ! 7940: --div; ! 7941: } ! 7942: } ! 7943: #endif ! 7944: ! 7945: if (fak < 4) fak = 4; /* Should never happen, too bad ... */ ! 7946: ! 7947: /* ! 7948: ** Compute and return sync parameters for the ncr ! 7949: */ ! 7950: *fakp = fak - 4; ! 7951: ! 7952: /* ! 7953: ** If sfac < 25, and 8xx parts, desire that the chip operate at ! 7954: ** least at Ultra speeds. Must set bit 7 of scntl3. ! 7955: ** For C1010, do not set this bit. If operating at Ultra3 speeds, ! 7956: ** set the U3EN bit instead. ! 7957: */ ! 7958: if ((np->device_id == PCI_DEVICE_ID_LSI_53C1010) || ! 7959: (np->device_id == PCI_DEVICE_ID_LSI_53C1010_66)) { ! 7960: *scntl3p = (div+1) << 4; ! 7961: *fakp = 0; ! 7962: } ! 7963: else { ! 7964: *scntl3p = ((div+1) << 4) + (sfac < 25 ? 0x80 : 0); ! 7965: *fakp = fak - 4; ! 7966: } ! 7967: } ! 7968: ! 7969: /*========================================================== ! 7970: ** ! 7971: ** Utility routine to return the current bus width ! 7972: ** synchronous period and offset. ! 7973: ** Utilizes target sval, wval and uval ! 7974: ** ! 7975: **========================================================== ! 7976: */ ! 7977: static void ncr_get_xfer_info(ncb_p np, tcb_p tp, u_char *factor, ! 7978: u_char *offset, u_char *width) ! 7979: { ! 7980: ! 7981: u_char idiv; ! 7982: u_long period; ! 7983: ! 7984: *width = (tp->wval & EWS) ? 1 : 0; ! 7985: ! 7986: if ((np->device_id == PCI_DEVICE_ID_LSI_53C1010) || ! 7987: (np->device_id == PCI_DEVICE_ID_LSI_53C1010_66)) ! 7988: *offset = (tp->sval & 0x3f); ! 7989: else ! 7990: *offset = (tp->sval & 0x1f); ! 7991: ! 7992: /* ! 7993: * Midlayer signal to the driver that all of the scsi commands ! 7994: * for the integrity check have completed. Save the negotiated ! 7995: * parameters (extracted from sval, wval and uval). ! 7996: * See ncr_setsync for alg. details. ! 7997: */ ! 7998: ! 7999: idiv = (tp->wval>>4) & 0x07; ! 8000: ! 8001: if ( *offset && idiv ) { ! 8002: if ((np->device_id == PCI_DEVICE_ID_LSI_53C1010) || ! 8003: (np->device_id == PCI_DEVICE_ID_LSI_53C1010_66)){ ! 8004: if (tp->uval & 0x80) ! 8005: period = (2*div_10M[idiv-1])/np->clock_khz; ! 8006: else ! 8007: period = (4*div_10M[idiv-1])/np->clock_khz; ! 8008: } ! 8009: else ! 8010: period = (((tp->sval>>5)+4)*div_10M[idiv-1])/np->clock_khz; ! 8011: } ! 8012: else ! 8013: period = 0xffff; ! 8014: ! 8015: if (period <= 125) *factor = 9; ! 8016: else if (period <= 250) *factor = 10; ! 8017: else if (period <= 303) *factor = 11; ! 8018: else if (period <= 500) *factor = 12; ! 8019: else *factor = (period + 40 - 1) / 40; ! 8020: ! 8021: } ! 8022: ! 8023: ! 8024: /*========================================================== ! 8025: ** ! 8026: ** Set actual values, sync status and patch all ccbs of ! 8027: ** a target according to new sync/wide agreement. ! 8028: ** ! 8029: **========================================================== ! 8030: */ ! 8031: ! 8032: static void ncr_set_sync_wide_status (ncb_p np, u_char target) ! 8033: { ! 8034: ccb_p cp = np->ccbc; ! 8035: tcb_p tp = &np->target[target]; ! 8036: ! 8037: /* ! 8038: ** set actual value and sync_status ! 8039: ** ! 8040: ** TEMP register contains current scripts address ! 8041: ** which is data type/direction/dependent. ! 8042: */ ! 8043: OUTB (nc_sxfer, tp->sval); ! 8044: OUTB (nc_scntl3, tp->wval); ! 8045: if ((np->device_id == PCI_DEVICE_ID_LSI_53C1010) || ! 8046: (np->device_id == PCI_DEVICE_ID_LSI_53C1010_66)) ! 8047: OUTB (nc_scntl4, tp->uval); ! 8048: ! 8049: /* ! 8050: ** patch ALL ccbs of this target. ! 8051: */ ! 8052: for (cp = np->ccbc; cp; cp = cp->link_ccb) { ! 8053: if (cp->host_status == HS_IDLE) ! 8054: continue; ! 8055: if (cp->target != target) ! 8056: continue; ! 8057: cp->phys.select.sel_scntl3 = tp->wval; ! 8058: cp->phys.select.sel_sxfer = tp->sval; ! 8059: if ((np->device_id == PCI_DEVICE_ID_LSI_53C1010) || ! 8060: (np->device_id == PCI_DEVICE_ID_LSI_53C1010_66)) ! 8061: cp->phys.select.sel_scntl4 = tp->uval; ! 8062: }; ! 8063: } ! 8064: ! 8065: /*========================================================== ! 8066: ** ! 8067: ** Switch sync mode for current job and it's target ! 8068: ** ! 8069: **========================================================== ! 8070: */ ! 8071: ! 8072: static void ncr_setsync (ncb_p np, ccb_p cp, u_char scntl3, u_char sxfer, ! 8073: u_char scntl4) ! 8074: { ! 8075: tcb_p tp; ! 8076: u_char target = INB (nc_sdid) & 0x0f; ! 8077: u_char idiv; ! 8078: u_char offset; ! 8079: ! 8080: assert (cp); ! 8081: if (!cp) return; ! 8082: ! 8083: assert (target == (cp->target & 0xf)); ! 8084: ! 8085: tp = &np->target[target]; ! 8086: ! 8087: if ((np->device_id == PCI_DEVICE_ID_LSI_53C1010) || ! 8088: (np->device_id == PCI_DEVICE_ID_LSI_53C1010_66)) { ! 8089: offset = sxfer & 0x3f; /* bits 5-0 */ ! 8090: scntl3 = (scntl3 & 0xf0) | (tp->wval & EWS); ! 8091: scntl4 = (scntl4 & 0x80); ! 8092: } ! 8093: else { ! 8094: offset = sxfer & 0x1f; /* bits 4-0 */ ! 8095: if (!scntl3 || !offset) ! 8096: scntl3 = np->rv_scntl3; ! 8097: ! 8098: scntl3 = (scntl3 & 0xf0) | (tp->wval & EWS) | ! 8099: (np->rv_scntl3 & 0x07); ! 8100: } ! 8101: ! 8102: ! 8103: /* ! 8104: ** Deduce the value of controller sync period from scntl3. ! 8105: ** period is in tenths of nano-seconds. ! 8106: */ ! 8107: ! 8108: idiv = ((scntl3 >> 4) & 0x7); ! 8109: if ( offset && idiv) { ! 8110: if ((np->device_id == PCI_DEVICE_ID_LSI_53C1010) || ! 8111: (np->device_id == PCI_DEVICE_ID_LSI_53C1010_66)) { ! 8112: /* Note: If extra data hold clocks are used, ! 8113: * the formulas below must be modified. ! 8114: * When scntl4 == 0, ST mode. ! 8115: */ ! 8116: if (scntl4 & 0x80) ! 8117: tp->period = (2*div_10M[idiv-1])/np->clock_khz; ! 8118: else ! 8119: tp->period = (4*div_10M[idiv-1])/np->clock_khz; ! 8120: } ! 8121: else ! 8122: tp->period = (((sxfer>>5)+4)*div_10M[idiv-1])/np->clock_khz; ! 8123: } ! 8124: else ! 8125: tp->period = 0xffff; ! 8126: ! 8127: ! 8128: /* ! 8129: ** Stop there if sync parameters are unchanged ! 8130: */ ! 8131: if (tp->sval == sxfer && tp->wval == scntl3 && tp->uval == scntl4) return; ! 8132: tp->sval = sxfer; ! 8133: tp->wval = scntl3; ! 8134: tp->uval = scntl4; ! 8135: ! 8136: /* ! 8137: ** Bells and whistles ;-) ! 8138: ** Donnot announce negotiations due to auto-sense, ! 8139: ** unless user really want us to be verbose. :) ! 8140: */ ! 8141: if ( bootverbose < 2 && (cp->host_flags & HF_AUTO_SENSE)) ! 8142: goto next; ! 8143: PRINT_TARGET(np, target); ! 8144: if (offset) { ! 8145: unsigned f10 = 100000 << (tp->widedone ? tp->widedone -1 : 0); ! 8146: unsigned mb10 = (f10 + tp->period/2) / tp->period; ! 8147: char *scsi; ! 8148: ! 8149: /* ! 8150: ** Disable extended Sreq/Sack filtering ! 8151: */ ! 8152: if ((tp->period <= 2000) && ! 8153: (np->device_id != PCI_DEVICE_ID_LSI_53C1010) && ! 8154: (np->device_id != PCI_DEVICE_ID_LSI_53C1010_66)) ! 8155: OUTOFFB (nc_stest2, EXT); ! 8156: ! 8157: /* ! 8158: ** Bells and whistles ;-) ! 8159: */ ! 8160: if (tp->period < 250) scsi = "FAST-80"; ! 8161: else if (tp->period < 500) scsi = "FAST-40"; ! 8162: else if (tp->period < 1000) scsi = "FAST-20"; ! 8163: else if (tp->period < 2000) scsi = "FAST-10"; ! 8164: else scsi = "FAST-5"; ! 8165: ! 8166: printk ("%s %sSCSI %d.%d MB/s (%d ns, offset %d)\n", scsi, ! 8167: tp->widedone > 1 ? "WIDE " : "", ! 8168: mb10 / 10, mb10 % 10, tp->period / 10, offset); ! 8169: } else ! 8170: printk ("%sasynchronous.\n", tp->widedone > 1 ? "wide " : ""); ! 8171: next: ! 8172: /* ! 8173: ** set actual value and sync_status ! 8174: ** patch ALL ccbs of this target. ! 8175: */ ! 8176: ncr_set_sync_wide_status(np, target); ! 8177: } ! 8178: ! 8179: ! 8180: /*========================================================== ! 8181: ** ! 8182: ** Switch wide mode for current job and it's target ! 8183: ** SCSI specs say: a SCSI device that accepts a WDTR ! 8184: ** message shall reset the synchronous agreement to ! 8185: ** asynchronous mode. ! 8186: ** ! 8187: **========================================================== ! 8188: */ ! 8189: ! 8190: static void ncr_setwide (ncb_p np, ccb_p cp, u_char wide, u_char ack) ! 8191: { ! 8192: u_short target = INB (nc_sdid) & 0x0f; ! 8193: tcb_p tp; ! 8194: u_char scntl3; ! 8195: u_char sxfer; ! 8196: ! 8197: assert (cp); ! 8198: if (!cp) return; ! 8199: ! 8200: assert (target == (cp->target & 0xf)); ! 8201: ! 8202: tp = &np->target[target]; ! 8203: tp->widedone = wide+1; ! 8204: scntl3 = (tp->wval & (~EWS)) | (wide ? EWS : 0); ! 8205: ! 8206: sxfer = ack ? 0 : tp->sval; ! 8207: ! 8208: /* ! 8209: ** Stop there if sync/wide parameters are unchanged ! 8210: */ ! 8211: if (tp->sval == sxfer && tp->wval == scntl3) return; ! 8212: tp->sval = sxfer; ! 8213: tp->wval = scntl3; ! 8214: ! 8215: /* ! 8216: ** Bells and whistles ;-) ! 8217: */ ! 8218: if (bootverbose >= 2) { ! 8219: PRINT_TARGET(np, target); ! 8220: if (scntl3 & EWS) ! 8221: printk ("WIDE SCSI (16 bit) enabled.\n"); ! 8222: else ! 8223: printk ("WIDE SCSI disabled.\n"); ! 8224: } ! 8225: ! 8226: /* ! 8227: ** set actual value and sync_status ! 8228: ** patch ALL ccbs of this target. ! 8229: */ ! 8230: ncr_set_sync_wide_status(np, target); ! 8231: } ! 8232: ! 8233: ! 8234: /*========================================================== ! 8235: ** ! 8236: ** Switch sync/wide mode for current job and it's target ! 8237: ** PPR negotiations only ! 8238: ** ! 8239: **========================================================== ! 8240: */ ! 8241: ! 8242: static void ncr_setsyncwide (ncb_p np, ccb_p cp, u_char scntl3, u_char sxfer, ! 8243: u_char scntl4, u_char wide) ! 8244: { ! 8245: tcb_p tp; ! 8246: u_char target = INB (nc_sdid) & 0x0f; ! 8247: u_char idiv; ! 8248: u_char offset; ! 8249: ! 8250: assert (cp); ! 8251: if (!cp) return; ! 8252: ! 8253: assert (target == (cp->target & 0xf)); ! 8254: ! 8255: tp = &np->target[target]; ! 8256: tp->widedone = wide+1; ! 8257: ! 8258: if ((np->device_id == PCI_DEVICE_ID_LSI_53C1010) || ! 8259: (np->device_id == PCI_DEVICE_ID_LSI_53C1010_66)) { ! 8260: offset = sxfer & 0x3f; /* bits 5-0 */ ! 8261: scntl3 = (scntl3 & 0xf0) | (wide ? EWS : 0); ! 8262: scntl4 = (scntl4 & 0x80); ! 8263: } ! 8264: else { ! 8265: offset = sxfer & 0x1f; /* bits 4-0 */ ! 8266: if (!scntl3 || !offset) ! 8267: scntl3 = np->rv_scntl3; ! 8268: ! 8269: scntl3 = (scntl3 & 0xf0) | (wide ? EWS : 0) | ! 8270: (np->rv_scntl3 & 0x07); ! 8271: } ! 8272: ! 8273: ! 8274: /* ! 8275: ** Deduce the value of controller sync period from scntl3. ! 8276: ** period is in tenths of nano-seconds. ! 8277: */ ! 8278: ! 8279: idiv = ((scntl3 >> 4) & 0x7); ! 8280: if ( offset && idiv) { ! 8281: if ((np->device_id == PCI_DEVICE_ID_LSI_53C1010) || ! 8282: (np->device_id == PCI_DEVICE_ID_LSI_53C1010_66)) { ! 8283: /* Note: If extra data hold clocks are used, ! 8284: * the formulas below must be modified. ! 8285: * When scntl4 == 0, ST mode. ! 8286: */ ! 8287: if (scntl4 & 0x80) ! 8288: tp->period = (2*div_10M[idiv-1])/np->clock_khz; ! 8289: else ! 8290: tp->period = (4*div_10M[idiv-1])/np->clock_khz; ! 8291: } ! 8292: else ! 8293: tp->period = (((sxfer>>5)+4)*div_10M[idiv-1])/np->clock_khz; ! 8294: } ! 8295: else ! 8296: tp->period = 0xffff; ! 8297: ! 8298: ! 8299: /* ! 8300: ** Stop there if sync parameters are unchanged ! 8301: */ ! 8302: if (tp->sval == sxfer && tp->wval == scntl3 && tp->uval == scntl4) return; ! 8303: tp->sval = sxfer; ! 8304: tp->wval = scntl3; ! 8305: tp->uval = scntl4; ! 8306: ! 8307: /* ! 8308: ** Bells and whistles ;-) ! 8309: ** Donnot announce negotiations due to auto-sense, ! 8310: ** unless user really want us to be verbose. :) ! 8311: */ ! 8312: if ( bootverbose < 2 && (cp->host_flags & HF_AUTO_SENSE)) ! 8313: goto next; ! 8314: PRINT_TARGET(np, target); ! 8315: if (offset) { ! 8316: unsigned f10 = 100000 << (tp->widedone ? tp->widedone -1 : 0); ! 8317: unsigned mb10 = (f10 + tp->period/2) / tp->period; ! 8318: char *scsi; ! 8319: ! 8320: /* ! 8321: ** Disable extended Sreq/Sack filtering ! 8322: */ ! 8323: if ((tp->period <= 2000) && ! 8324: (np->device_id != PCI_DEVICE_ID_LSI_53C1010) && ! 8325: (np->device_id != PCI_DEVICE_ID_LSI_53C1010_66)) ! 8326: OUTOFFB (nc_stest2, EXT); ! 8327: ! 8328: /* ! 8329: ** Bells and whistles ;-) ! 8330: */ ! 8331: if (tp->period < 250) scsi = "FAST-80"; ! 8332: else if (tp->period < 500) scsi = "FAST-40"; ! 8333: else if (tp->period < 1000) scsi = "FAST-20"; ! 8334: else if (tp->period < 2000) scsi = "FAST-10"; ! 8335: else scsi = "FAST-5"; ! 8336: ! 8337: printk ("%s %sSCSI %d.%d MB/s (%d ns, offset %d)\n", scsi, ! 8338: tp->widedone > 1 ? "WIDE " : "", ! 8339: mb10 / 10, mb10 % 10, tp->period / 10, offset); ! 8340: } else ! 8341: printk ("%sasynchronous.\n", tp->widedone > 1 ? "wide " : ""); ! 8342: next: ! 8343: /* ! 8344: ** set actual value and sync_status ! 8345: ** patch ALL ccbs of this target. ! 8346: */ ! 8347: ncr_set_sync_wide_status(np, target); ! 8348: } ! 8349: ! 8350: ! 8351: ! 8352: ! 8353: /*========================================================== ! 8354: ** ! 8355: ** Switch tagged mode for a target. ! 8356: ** ! 8357: **========================================================== ! 8358: */ ! 8359: ! 8360: static void ncr_setup_tags (ncb_p np, u_char tn, u_char ln) ! 8361: { ! 8362: tcb_p tp = &np->target[tn]; ! 8363: lcb_p lp = ncr_lp(np, tp, ln); ! 8364: u_short reqtags, maxdepth; ! 8365: ! 8366: /* ! 8367: ** Just in case ... ! 8368: */ ! 8369: if ((!tp) || (!lp)) ! 8370: return; ! 8371: ! 8372: /* ! 8373: ** If SCSI device queue depth is not yet set, leave here. ! 8374: */ ! 8375: if (!lp->scdev_depth) ! 8376: return; ! 8377: ! 8378: /* ! 8379: ** Donnot allow more tags than the SCSI driver can queue ! 8380: ** for this device. ! 8381: ** Donnot allow more tags than we can handle. ! 8382: */ ! 8383: maxdepth = lp->scdev_depth; ! 8384: if (maxdepth > lp->maxnxs) maxdepth = lp->maxnxs; ! 8385: if (lp->maxtags > maxdepth) lp->maxtags = maxdepth; ! 8386: if (lp->numtags > maxdepth) lp->numtags = maxdepth; ! 8387: ! 8388: /* ! 8389: ** only devices conformant to ANSI Version >= 2 ! 8390: ** only devices capable of tagged commands ! 8391: ** only if enabled by user .. ! 8392: */ ! 8393: if ((lp->inq_byte7 & INQ7_QUEUE) && lp->numtags > 1) { ! 8394: reqtags = lp->numtags; ! 8395: } else { ! 8396: reqtags = 1; ! 8397: }; ! 8398: ! 8399: /* ! 8400: ** Update max number of tags ! 8401: */ ! 8402: lp->numtags = reqtags; ! 8403: if (lp->numtags > lp->maxtags) ! 8404: lp->maxtags = lp->numtags; ! 8405: ! 8406: /* ! 8407: ** If we want to switch tag mode, we must wait ! 8408: ** for no CCB to be active. ! 8409: */ ! 8410: if (reqtags > 1 && lp->usetags) { /* Stay in tagged mode */ ! 8411: if (lp->queuedepth == reqtags) /* Already announced */ ! 8412: return; ! 8413: lp->queuedepth = reqtags; ! 8414: } ! 8415: else if (reqtags <= 1 && !lp->usetags) { /* Stay in untagged mode */ ! 8416: lp->queuedepth = reqtags; ! 8417: return; ! 8418: } ! 8419: else { /* Want to switch tag mode */ ! 8420: if (lp->busyccbs) /* If not yet safe, return */ ! 8421: return; ! 8422: lp->queuedepth = reqtags; ! 8423: lp->usetags = reqtags > 1 ? 1 : 0; ! 8424: } ! 8425: ! 8426: /* ! 8427: ** Patch the lun mini-script, according to tag mode. ! 8428: */ ! 8429: lp->resel_task = lp->usetags? ! 8430: cpu_to_scr(NCB_SCRIPT_PHYS(np, resel_tag)) : ! 8431: cpu_to_scr(NCB_SCRIPT_PHYS(np, resel_notag)); ! 8432: ! 8433: /* ! 8434: ** Announce change to user. ! 8435: */ ! 8436: if (bootverbose) { ! 8437: PRINT_LUN(np, tn, ln); ! 8438: if (lp->usetags) ! 8439: printk("tagged command queue depth set to %d\n", reqtags); ! 8440: else ! 8441: printk("tagged command queueing disabled\n"); ! 8442: } ! 8443: } ! 8444: ! 8445: /*---------------------------------------------------- ! 8446: ** ! 8447: ** handle user commands ! 8448: ** ! 8449: **---------------------------------------------------- ! 8450: */ ! 8451: ! 8452: #ifdef SCSI_NCR_USER_COMMAND_SUPPORT ! 8453: ! 8454: static void ncr_usercmd (ncb_p np) ! 8455: { ! 8456: u_char t; ! 8457: tcb_p tp; ! 8458: int ln; ! 8459: u_long size; ! 8460: ! 8461: switch (np->user.cmd) { ! 8462: case 0: return; ! 8463: ! 8464: case UC_SETDEBUG: ! 8465: #ifdef SCSI_NCR_DEBUG_INFO_SUPPORT ! 8466: ncr_debug = np->user.data; ! 8467: #endif ! 8468: break; ! 8469: ! 8470: case UC_SETORDER: ! 8471: np->order = np->user.data; ! 8472: break; ! 8473: ! 8474: case UC_SETVERBOSE: ! 8475: np->verbose = np->user.data; ! 8476: break; ! 8477: ! 8478: default: ! 8479: /* ! 8480: ** We assume that other commands apply to targets. ! 8481: ** This should always be the case and avoid the below ! 8482: ** 4 lines to be repeated 5 times. ! 8483: */ ! 8484: for (t = 0; t < MAX_TARGET; t++) { ! 8485: if (!((np->user.target >> t) & 1)) ! 8486: continue; ! 8487: tp = &np->target[t]; ! 8488: ! 8489: switch (np->user.cmd) { ! 8490: ! 8491: case UC_SETSYNC: ! 8492: tp->usrsync = np->user.data; ! 8493: ncr_negotiate (np, tp); ! 8494: break; ! 8495: ! 8496: case UC_SETWIDE: ! 8497: size = np->user.data; ! 8498: if (size > np->maxwide) ! 8499: size=np->maxwide; ! 8500: tp->usrwide = size; ! 8501: ncr_negotiate (np, tp); ! 8502: break; ! 8503: ! 8504: case UC_SETTAGS: ! 8505: tp->usrtags = np->user.data; ! 8506: for (ln = 0; ln < MAX_LUN; ln++) { ! 8507: lcb_p lp; ! 8508: lp = ncr_lp(np, tp, ln); ! 8509: if (!lp) ! 8510: continue; ! 8511: lp->numtags = np->user.data; ! 8512: lp->maxtags = lp->numtags; ! 8513: ncr_setup_tags (np, t, ln); ! 8514: } ! 8515: break; ! 8516: ! 8517: case UC_RESETDEV: ! 8518: tp->to_reset = 1; ! 8519: np->istat_sem = SEM; ! 8520: OUTB (nc_istat, SIGP|SEM); ! 8521: break; ! 8522: ! 8523: case UC_CLEARDEV: ! 8524: for (ln = 0; ln < MAX_LUN; ln++) { ! 8525: lcb_p lp; ! 8526: lp = ncr_lp(np, tp, ln); ! 8527: if (lp) ! 8528: lp->to_clear = 1; ! 8529: } ! 8530: np->istat_sem = SEM; ! 8531: OUTB (nc_istat, SIGP|SEM); ! 8532: break; ! 8533: ! 8534: case UC_SETFLAG: ! 8535: tp->usrflag = np->user.data; ! 8536: break; ! 8537: } ! 8538: } ! 8539: break; ! 8540: } ! 8541: np->user.cmd=0; ! 8542: } ! 8543: #endif ! 8544: ! 8545: /*========================================================== ! 8546: ** ! 8547: ** ! 8548: ** ncr timeout handler. ! 8549: ** ! 8550: ** ! 8551: **========================================================== ! 8552: ** ! 8553: ** Misused to keep the driver running when ! 8554: ** interrupts are not configured correctly. ! 8555: ** ! 8556: **---------------------------------------------------------- ! 8557: */ ! 8558: ! 8559: static void ncr_timeout (ncb_p np) ! 8560: { ! 8561: u_long thistime = ktime_get(0); ! 8562: ! 8563: /* ! 8564: ** If release process in progress, let's go ! 8565: ** Set the release stage from 1 to 2 to synchronize ! 8566: ** with the release process. ! 8567: */ ! 8568: ! 8569: if (np->release_stage) { ! 8570: if (np->release_stage == 1) np->release_stage = 2; ! 8571: return; ! 8572: } ! 8573: ! 8574: #ifdef SCSI_NCR_PCIQ_BROKEN_INTR ! 8575: np->timer.expires = ktime_get((HZ+9)/10); ! 8576: #else ! 8577: np->timer.expires = ktime_get(SCSI_NCR_TIMER_INTERVAL); ! 8578: #endif ! 8579: add_timer(&np->timer); ! 8580: ! 8581: /* ! 8582: ** If we are resetting the ncr, wait for settle_time before ! 8583: ** clearing it. Then command processing will be resumed. ! 8584: */ ! 8585: if (np->settle_time) { ! 8586: if (np->settle_time <= thistime) { ! 8587: if (bootverbose > 1) ! 8588: printk("%s: command processing resumed\n", ncr_name(np)); ! 8589: np->settle_time = 0; ! 8590: requeue_waiting_list(np); ! 8591: } ! 8592: return; ! 8593: } ! 8594: ! 8595: /* ! 8596: ** Nothing to do for now, but that may come. ! 8597: */ ! 8598: if (np->lasttime + 4*HZ < thistime) { ! 8599: np->lasttime = thistime; ! 8600: } ! 8601: ! 8602: #ifdef SCSI_NCR_PCIQ_MAY_MISS_COMPLETIONS ! 8603: /* ! 8604: ** Some way-broken PCI bridges may lead to ! 8605: ** completions being lost when the clearing ! 8606: ** of the INTFLY flag by the CPU occurs ! 8607: ** concurrently with the chip raising this flag. ! 8608: ** If this ever happen, lost completions will ! 8609: ** be reaped here. ! 8610: */ ! 8611: ncr_wakeup_done(np); ! 8612: #endif ! 8613: ! 8614: #ifdef SCSI_NCR_PCIQ_BROKEN_INTR ! 8615: if (INB(nc_istat) & (INTF|SIP|DIP)) { ! 8616: ! 8617: /* ! 8618: ** Process pending interrupts. ! 8619: */ ! 8620: if (DEBUG_FLAGS & DEBUG_TINY) printk ("{"); ! 8621: ncr_exception (np); ! 8622: if (DEBUG_FLAGS & DEBUG_TINY) printk ("}"); ! 8623: } ! 8624: #endif /* SCSI_NCR_PCIQ_BROKEN_INTR */ ! 8625: } ! 8626: ! 8627: /*========================================================== ! 8628: ** ! 8629: ** log message for real hard errors ! 8630: ** ! 8631: ** "ncr0 targ 0?: ERROR (ds:si) (so-si-sd) (sxfer/scntl3) @ name (dsp:dbc)." ! 8632: ** " reg: r0 r1 r2 r3 r4 r5 r6 ..... rf." ! 8633: ** ! 8634: ** exception register: ! 8635: ** ds: dstat ! 8636: ** si: sist ! 8637: ** ! 8638: ** SCSI bus lines: ! 8639: ** so: control lines as driven by NCR. ! 8640: ** si: control lines as seen by NCR. ! 8641: ** sd: scsi data lines as seen by NCR. ! 8642: ** ! 8643: ** wide/fastmode: ! 8644: ** sxfer: (see the manual) ! 8645: ** scntl3: (see the manual) ! 8646: ** ! 8647: ** current script command: ! 8648: ** dsp: script address (relative to start of script). ! 8649: ** dbc: first word of script command. ! 8650: ** ! 8651: ** First 24 register of the chip: ! 8652: ** r0..rf ! 8653: ** ! 8654: **========================================================== ! 8655: */ ! 8656: ! 8657: static void ncr_log_hard_error(ncb_p np, u_short sist, u_char dstat) ! 8658: { ! 8659: u_int32 dsp; ! 8660: int script_ofs; ! 8661: int script_size; ! 8662: char *script_name; ! 8663: u_char *script_base; ! 8664: int i; ! 8665: ! 8666: dsp = INL (nc_dsp); ! 8667: ! 8668: if (dsp > np->p_script && dsp <= np->p_script + sizeof(struct script)) { ! 8669: script_ofs = dsp - np->p_script; ! 8670: script_size = sizeof(struct script); ! 8671: script_base = (u_char *) np->script0; ! 8672: script_name = "script"; ! 8673: } ! 8674: else if (np->p_scripth < dsp && ! 8675: dsp <= np->p_scripth + sizeof(struct scripth)) { ! 8676: script_ofs = dsp - np->p_scripth; ! 8677: script_size = sizeof(struct scripth); ! 8678: script_base = (u_char *) np->scripth0; ! 8679: script_name = "scripth"; ! 8680: } else { ! 8681: script_ofs = dsp; ! 8682: script_size = 0; ! 8683: script_base = 0; ! 8684: script_name = "mem"; ! 8685: } ! 8686: ! 8687: printk ("%s:%d: ERROR (%x:%x) (%x-%x-%x) (%x/%x) @ (%s %x:%08x).\n", ! 8688: ncr_name (np), (unsigned)INB (nc_sdid)&0x0f, dstat, sist, ! 8689: (unsigned)INB (nc_socl), (unsigned)INB (nc_sbcl), (unsigned)INB (nc_sbdl), ! 8690: (unsigned)INB (nc_sxfer),(unsigned)INB (nc_scntl3), script_name, script_ofs, ! 8691: (unsigned)INL (nc_dbc)); ! 8692: ! 8693: if (((script_ofs & 3) == 0) && ! 8694: (unsigned)script_ofs < script_size) { ! 8695: printk ("%s: script cmd = %08x\n", ncr_name(np), ! 8696: scr_to_cpu((int) *(ncrcmd *)(script_base + script_ofs))); ! 8697: } ! 8698: ! 8699: printk ("%s: regdump:", ncr_name(np)); ! 8700: for (i=0; i<24;i++) ! 8701: printk (" %02x", (unsigned)INB_OFF(i)); ! 8702: printk (".\n"); ! 8703: } ! 8704: ! 8705: /*============================================================ ! 8706: ** ! 8707: ** ncr chip exception handler. ! 8708: ** ! 8709: **============================================================ ! 8710: ** ! 8711: ** In normal situations, interrupt conditions occur one at ! 8712: ** a time. But when something bad happens on the SCSI BUS, ! 8713: ** the chip may raise several interrupt flags before ! 8714: ** stopping and interrupting the CPU. The additionnal ! 8715: ** interrupt flags are stacked in some extra registers ! 8716: ** after the SIP and/or DIP flag has been raised in the ! 8717: ** ISTAT. After the CPU has read the interrupt condition ! 8718: ** flag from SIST or DSTAT, the chip unstacks the other ! 8719: ** interrupt flags and sets the corresponding bits in ! 8720: ** SIST or DSTAT. Since the chip starts stacking once the ! 8721: ** SIP or DIP flag is set, there is a small window of time ! 8722: ** where the stacking does not occur. ! 8723: ** ! 8724: ** Typically, multiple interrupt conditions may happen in ! 8725: ** the following situations: ! 8726: ** ! 8727: ** - SCSI parity error + Phase mismatch (PAR|MA) ! 8728: ** When an parity error is detected in input phase ! 8729: ** and the device switches to msg-in phase inside a ! 8730: ** block MOV. ! 8731: ** - SCSI parity error + Unexpected disconnect (PAR|UDC) ! 8732: ** When a stupid device does not want to handle the ! 8733: ** recovery of an SCSI parity error. ! 8734: ** - Some combinations of STO, PAR, UDC, ... ! 8735: ** When using non compliant SCSI stuff, when user is ! 8736: ** doing non compliant hot tampering on the BUS, when ! 8737: ** something really bad happens to a device, etc ... ! 8738: ** ! 8739: ** The heuristic suggested by SYMBIOS to handle ! 8740: ** multiple interrupts is to try unstacking all ! 8741: ** interrupts conditions and to handle them on some ! 8742: ** priority based on error severity. ! 8743: ** This will work when the unstacking has been ! 8744: ** successful, but we cannot be 100 % sure of that, ! 8745: ** since the CPU may have been faster to unstack than ! 8746: ** the chip is able to stack. Hmmm ... But it seems that ! 8747: ** such a situation is very unlikely to happen. ! 8748: ** ! 8749: ** If this happen, for example STO catched by the CPU ! 8750: ** then UDC happenning before the CPU have restarted ! 8751: ** the SCRIPTS, the driver may wrongly complete the ! 8752: ** same command on UDC, since the SCRIPTS didn't restart ! 8753: ** and the DSA still points to the same command. ! 8754: ** We avoid this situation by setting the DSA to an ! 8755: ** invalid value when the CCB is completed and before ! 8756: ** restarting the SCRIPTS. ! 8757: ** ! 8758: ** Another issue is that we need some section of our ! 8759: ** recovery procedures to be somehow uninterruptible and ! 8760: ** that the SCRIPTS processor does not provides such a ! 8761: ** feature. For this reason, we handle recovery preferently ! 8762: ** from the C code and check against some SCRIPTS ! 8763: ** critical sections from the C code. ! 8764: ** ! 8765: ** Hopefully, the interrupt handling of the driver is now ! 8766: ** able to resist to weird BUS error conditions, but donnot ! 8767: ** ask me for any guarantee that it will never fail. :-) ! 8768: ** Use at your own decision and risk. ! 8769: ** ! 8770: **============================================================ ! 8771: */ ! 8772: ! 8773: void ncr_exception (ncb_p np) ! 8774: { ! 8775: u_char istat, istatc; ! 8776: u_char dstat; ! 8777: u_short sist; ! 8778: int i; ! 8779: ! 8780: /* ! 8781: ** interrupt on the fly ? ! 8782: ** ! 8783: ** A `dummy read' is needed to ensure that the ! 8784: ** clear of the INTF flag reaches the device ! 8785: ** before the scanning of the DONE queue. ! 8786: */ ! 8787: istat = INB (nc_istat); ! 8788: if (istat & INTF) { ! 8789: OUTB (nc_istat, (istat & SIGP) | INTF | np->istat_sem); ! 8790: istat = INB (nc_istat); /* DUMMY READ */ ! 8791: if (DEBUG_FLAGS & DEBUG_TINY) printk ("F "); ! 8792: (void)ncr_wakeup_done (np); ! 8793: }; ! 8794: ! 8795: if (!(istat & (SIP|DIP))) ! 8796: return; ! 8797: ! 8798: #if 0 /* We should never get this one */ ! 8799: if (istat & CABRT) ! 8800: OUTB (nc_istat, CABRT); ! 8801: #endif ! 8802: ! 8803: /* ! 8804: ** Steinbach's Guideline for Systems Programming: ! 8805: ** Never test for an error condition you don't know how to handle. ! 8806: */ ! 8807: ! 8808: /*======================================================== ! 8809: ** PAR and MA interrupts may occur at the same time, ! 8810: ** and we need to know of both in order to handle ! 8811: ** this situation properly. We try to unstack SCSI ! 8812: ** interrupts for that reason. BTW, I dislike a LOT ! 8813: ** such a loop inside the interrupt routine. ! 8814: ** Even if DMA interrupt stacking is very unlikely to ! 8815: ** happen, we also try unstacking these ones, since ! 8816: ** this has no performance impact. ! 8817: **========================================================= ! 8818: */ ! 8819: sist = 0; ! 8820: dstat = 0; ! 8821: istatc = istat; ! 8822: do { ! 8823: if (istatc & SIP) ! 8824: sist |= INW (nc_sist); ! 8825: if (istatc & DIP) ! 8826: dstat |= INB (nc_dstat); ! 8827: istatc = INB (nc_istat); ! 8828: istat |= istatc; ! 8829: } while (istatc & (SIP|DIP)); ! 8830: ! 8831: if (DEBUG_FLAGS & DEBUG_TINY) ! 8832: printk ("<%d|%x:%x|%x:%x>", ! 8833: (int)INB(nc_scr0), ! 8834: dstat,sist, ! 8835: (unsigned)INL(nc_dsp), ! 8836: (unsigned)INL(nc_dbc)); ! 8837: ! 8838: /* ! 8839: ** On paper, a memory barrier may be needed here. ! 8840: ** And since we are paranoid ... :) ! 8841: */ ! 8842: MEMORY_BARRIER(); ! 8843: ! 8844: /*======================================================== ! 8845: ** First, interrupts we want to service cleanly. ! 8846: ** ! 8847: ** Phase mismatch (MA) is the most frequent interrupt ! 8848: ** for chip earlier than the 896 and so we have to service ! 8849: ** it as quickly as possible. ! 8850: ** A SCSI parity error (PAR) may be combined with a phase ! 8851: ** mismatch condition (MA). ! 8852: ** Programmed interrupts (SIR) are used to call the C code ! 8853: ** from SCRIPTS. ! 8854: ** The single step interrupt (SSI) is not used in this ! 8855: ** driver. ! 8856: **========================================================= ! 8857: */ ! 8858: ! 8859: if (!(sist & (STO|GEN|HTH|SGE|UDC|SBMC|RST)) && ! 8860: !(dstat & (MDPE|BF|ABRT|IID))) { ! 8861: if (sist & PAR) ncr_int_par (np, sist); ! 8862: else if (sist & MA) ncr_int_ma (np); ! 8863: else if (dstat & SIR) ncr_int_sir (np); ! 8864: else if (dstat & SSI) OUTONB_STD (); ! 8865: else goto unknown_int; ! 8866: return; ! 8867: }; ! 8868: ! 8869: /*======================================================== ! 8870: ** Now, interrupts that donnot happen in normal ! 8871: ** situations and that we may need to recover from. ! 8872: ** ! 8873: ** On SCSI RESET (RST), we reset everything. ! 8874: ** On SCSI BUS MODE CHANGE (SBMC), we complete all ! 8875: ** active CCBs with RESET status, prepare all devices ! 8876: ** for negotiating again and restart the SCRIPTS. ! 8877: ** On STO and UDC, we complete the CCB with the corres- ! 8878: ** ponding status and restart the SCRIPTS. ! 8879: **========================================================= ! 8880: */ ! 8881: ! 8882: if (sist & RST) { ! 8883: ncr_init (np, 1, bootverbose ? "scsi reset" : NULL, HS_RESET); ! 8884: return; ! 8885: }; ! 8886: ! 8887: OUTB (nc_ctest3, np->rv_ctest3 | CLF); /* clear dma fifo */ ! 8888: OUTB (nc_stest3, TE|CSF); /* clear scsi fifo */ ! 8889: ! 8890: if (!(sist & (GEN|HTH|SGE)) && ! 8891: !(dstat & (MDPE|BF|ABRT|IID))) { ! 8892: if (sist & SBMC) ncr_int_sbmc (np); ! 8893: else if (sist & STO) ncr_int_sto (np); ! 8894: else if (sist & UDC) ncr_int_udc (np); ! 8895: else goto unknown_int; ! 8896: return; ! 8897: }; ! 8898: ! 8899: /*========================================================= ! 8900: ** Now, interrupts we are not able to recover cleanly. ! 8901: ** ! 8902: ** Do the register dump. ! 8903: ** Log message for hard errors. ! 8904: ** Reset everything. ! 8905: **========================================================= ! 8906: */ ! 8907: if (ktime_exp(np->regtime)) { ! 8908: np->regtime = ktime_get(10*HZ); ! 8909: for (i = 0; i<sizeof(np->regdump); i++) ! 8910: ((char*)&np->regdump)[i] = INB_OFF(i); ! 8911: np->regdump.nc_dstat = dstat; ! 8912: np->regdump.nc_sist = sist; ! 8913: }; ! 8914: ! 8915: ncr_log_hard_error(np, sist, dstat); ! 8916: ! 8917: if ((np->device_id == PCI_DEVICE_ID_LSI_53C1010) || ! 8918: (np->device_id == PCI_DEVICE_ID_LSI_53C1010_66)) { ! 8919: u_char ctest4_o, ctest4_m; ! 8920: u_char shadow; ! 8921: ! 8922: /* ! 8923: * Get shadow register data ! 8924: * Write 1 to ctest4 ! 8925: */ ! 8926: ctest4_o = INB(nc_ctest4); ! 8927: ! 8928: OUTB(nc_ctest4, ctest4_o | 0x10); ! 8929: ! 8930: ctest4_m = INB(nc_ctest4); ! 8931: shadow = INW_OFF(0x42); ! 8932: ! 8933: OUTB(nc_ctest4, ctest4_o); ! 8934: ! 8935: printk("%s: ctest4/sist original 0x%x/0x%X mod: 0x%X/0x%x\n", ! 8936: ncr_name(np), ctest4_o, sist, ctest4_m, shadow); ! 8937: } ! 8938: ! 8939: if ((sist & (GEN|HTH|SGE)) || ! 8940: (dstat & (MDPE|BF|ABRT|IID))) { ! 8941: ncr_start_reset(np); ! 8942: return; ! 8943: }; ! 8944: ! 8945: unknown_int: ! 8946: /*========================================================= ! 8947: ** We just miss the cause of the interrupt. :( ! 8948: ** Print a message. The timeout will do the real work. ! 8949: **========================================================= ! 8950: */ ! 8951: printk( "%s: unknown interrupt(s) ignored, " ! 8952: "ISTAT=0x%x DSTAT=0x%x SIST=0x%x\n", ! 8953: ncr_name(np), istat, dstat, sist); ! 8954: } ! 8955: ! 8956: ! 8957: /*========================================================== ! 8958: ** ! 8959: ** generic recovery from scsi interrupt ! 8960: ** ! 8961: **========================================================== ! 8962: ** ! 8963: ** The doc says that when the chip gets an SCSI interrupt, ! 8964: ** it tries to stop in an orderly fashion, by completing ! 8965: ** an instruction fetch that had started or by flushing ! 8966: ** the DMA fifo for a write to memory that was executing. ! 8967: ** Such a fashion is not enough to know if the instruction ! 8968: ** that was just before the current DSP value has been ! 8969: ** executed or not. ! 8970: ** ! 8971: ** There are 3 small SCRIPTS sections that deal with the ! 8972: ** start queue and the done queue that may break any ! 8973: ** assomption from the C code if we are interrupted ! 8974: ** inside, so we reset if it happens. Btw, since these ! 8975: ** SCRIPTS sections are executed while the SCRIPTS hasn't ! 8976: ** started SCSI operations, it is very unlikely to happen. ! 8977: ** ! 8978: ** All the driver data structures are supposed to be ! 8979: ** allocated from the same 4 GB memory window, so there ! 8980: ** is a 1 to 1 relationship between DSA and driver data ! 8981: ** structures. Since we are careful :) to invalidate the ! 8982: ** DSA when we complete a command or when the SCRIPTS ! 8983: ** pushes a DSA into a queue, we can trust it when it ! 8984: ** points to a CCB. ! 8985: ** ! 8986: **---------------------------------------------------------- ! 8987: */ ! 8988: static void ncr_recover_scsi_int (ncb_p np, u_char hsts) ! 8989: { ! 8990: u_int32 dsp = INL (nc_dsp); ! 8991: u_int32 dsa = INL (nc_dsa); ! 8992: ccb_p cp = ncr_ccb_from_dsa(np, dsa); ! 8993: ! 8994: /* ! 8995: ** If we haven't been interrupted inside the SCRIPTS ! 8996: ** critical pathes, we can safely restart the SCRIPTS ! 8997: ** and trust the DSA value if it matches a CCB. ! 8998: */ ! 8999: if ((!(dsp > NCB_SCRIPT_PHYS (np, getjob_begin) && ! 9000: dsp < NCB_SCRIPT_PHYS (np, getjob_end) + 1)) && ! 9001: (!(dsp > NCB_SCRIPT_PHYS (np, ungetjob) && ! 9002: dsp < NCB_SCRIPT_PHYS (np, reselect) + 1)) && ! 9003: (!(dsp > NCB_SCRIPTH_PHYS (np, sel_for_abort) && ! 9004: dsp < NCB_SCRIPTH_PHYS (np, sel_for_abort_1) + 1)) && ! 9005: (!(dsp > NCB_SCRIPT_PHYS (np, done) && ! 9006: dsp < NCB_SCRIPT_PHYS (np, done_end) + 1))) { ! 9007: if (cp) { ! 9008: cp->host_status = hsts; ! 9009: ncr_complete (np, cp); ! 9010: } ! 9011: OUTL (nc_dsa, DSA_INVALID); ! 9012: OUTB (nc_ctest3, np->rv_ctest3 | CLF); /* clear dma fifo */ ! 9013: OUTB (nc_stest3, TE|CSF); /* clear scsi fifo */ ! 9014: OUTL_DSP (NCB_SCRIPT_PHYS (np, start)); ! 9015: } ! 9016: else ! 9017: goto reset_all; ! 9018: ! 9019: return; ! 9020: ! 9021: reset_all: ! 9022: ncr_start_reset(np); ! 9023: } ! 9024: ! 9025: /*========================================================== ! 9026: ** ! 9027: ** ncr chip exception handler for selection timeout ! 9028: ** ! 9029: **========================================================== ! 9030: ** ! 9031: ** There seems to be a bug in the 53c810. ! 9032: ** Although a STO-Interrupt is pending, ! 9033: ** it continues executing script commands. ! 9034: ** But it will fail and interrupt (IID) on ! 9035: ** the next instruction where it's looking ! 9036: ** for a valid phase. ! 9037: ** ! 9038: **---------------------------------------------------------- ! 9039: */ ! 9040: ! 9041: void ncr_int_sto (ncb_p np) ! 9042: { ! 9043: u_int32 dsp = INL (nc_dsp); ! 9044: ! 9045: if (DEBUG_FLAGS & DEBUG_TINY) printk ("T"); ! 9046: ! 9047: if (dsp == NCB_SCRIPT_PHYS (np, wf_sel_done) + 8 || ! 9048: !(driver_setup.recovery & 1)) ! 9049: ncr_recover_scsi_int(np, HS_SEL_TIMEOUT); ! 9050: else ! 9051: ncr_start_reset(np); ! 9052: } ! 9053: ! 9054: /*========================================================== ! 9055: ** ! 9056: ** ncr chip exception handler for unexpected disconnect ! 9057: ** ! 9058: **========================================================== ! 9059: ** ! 9060: **---------------------------------------------------------- ! 9061: */ ! 9062: void ncr_int_udc (ncb_p np) ! 9063: { ! 9064: u_int32 dsa = INL (nc_dsa); ! 9065: ccb_p cp = ncr_ccb_from_dsa(np, dsa); ! 9066: tcb_p tp = &np->target[cp->target]; ! 9067: ! 9068: /* ! 9069: * Fix Up. Some disks respond to a PPR negotation with ! 9070: * a bus free instead of a message reject. ! 9071: * Disable ppr negotiation if this is first time ! 9072: * tried ppr negotiation. ! 9073: */ ! 9074: ! 9075: if (tp->ppr_negotiation == 1) ! 9076: tp->ppr_negotiation = 0; ! 9077: ! 9078: printk ("%s: unexpected disconnect\n", ncr_name(np)); ! 9079: ncr_recover_scsi_int(np, HS_UNEXPECTED); ! 9080: } ! 9081: ! 9082: /*========================================================== ! 9083: ** ! 9084: ** ncr chip exception handler for SCSI bus mode change ! 9085: ** ! 9086: **========================================================== ! 9087: ** ! 9088: ** spi2-r12 11.2.3 says a transceiver mode change must ! 9089: ** generate a reset event and a device that detects a reset ! 9090: ** event shall initiate a hard reset. It says also that a ! 9091: ** device that detects a mode change shall set data transfer ! 9092: ** mode to eight bit asynchronous, etc... ! 9093: ** So, just resetting should be enough. ! 9094: ** ! 9095: ** ! 9096: **---------------------------------------------------------- ! 9097: */ ! 9098: ! 9099: static void ncr_int_sbmc (ncb_p np) ! 9100: { ! 9101: u_char scsi_mode = INB (nc_stest4) & SMODE; ! 9102: ! 9103: printk("%s: SCSI bus mode change from %x to %x.\n", ! 9104: ncr_name(np), np->scsi_mode, scsi_mode); ! 9105: ! 9106: np->scsi_mode = scsi_mode; ! 9107: ! 9108: ! 9109: /* ! 9110: ** Suspend command processing for 1 second and ! 9111: ** reinitialize all except the chip. ! 9112: */ ! 9113: np->settle_time = ktime_get(1*HZ); ! 9114: ncr_init (np, 0, bootverbose ? "scsi mode change" : NULL, HS_RESET); ! 9115: } ! 9116: ! 9117: /*========================================================== ! 9118: ** ! 9119: ** ncr chip exception handler for SCSI parity error. ! 9120: ** ! 9121: **========================================================== ! 9122: ** ! 9123: ** When the chip detects a SCSI parity error and is ! 9124: ** currently executing a (CH)MOV instruction, it does ! 9125: ** not interrupt immediately, but tries to finish the ! 9126: ** transfer of the current scatter entry before ! 9127: ** interrupting. The following situations may occur: ! 9128: ** ! 9129: ** - The complete scatter entry has been transferred ! 9130: ** without the device having changed phase. ! 9131: ** The chip will then interrupt with the DSP pointing ! 9132: ** to the instruction that follows the MOV. ! 9133: ** ! 9134: ** - A phase mismatch occurs before the MOV finished ! 9135: ** and phase errors are to be handled by the C code. ! 9136: ** The chip will then interrupt with both PAR and MA ! 9137: ** conditions set. ! 9138: ** ! 9139: ** - A phase mismatch occurs before the MOV finished and ! 9140: ** phase errors are to be handled by SCRIPTS (895A or 896). ! 9141: ** The chip will load the DSP with the phase mismatch ! 9142: ** JUMP address and interrupt the host processor. ! 9143: ** ! 9144: **---------------------------------------------------------- ! 9145: */ ! 9146: ! 9147: static void ncr_int_par (ncb_p np, u_short sist) ! 9148: { ! 9149: u_char hsts = INB (HS_PRT); ! 9150: u_int32 dsp = INL (nc_dsp); ! 9151: u_int32 dbc = INL (nc_dbc); ! 9152: u_int32 dsa = INL (nc_dsa); ! 9153: u_char sbcl = INB (nc_sbcl); ! 9154: u_char cmd = dbc >> 24; ! 9155: int phase = cmd & 7; ! 9156: ccb_p cp = ncr_ccb_from_dsa(np, dsa); ! 9157: ! 9158: printk("%s: SCSI parity error detected: SCR1=%d DBC=%x SBCL=%x\n", ! 9159: ncr_name(np), hsts, dbc, sbcl); ! 9160: ! 9161: /* ! 9162: ** Check that the chip is connected to the SCSI BUS. ! 9163: */ ! 9164: if (!(INB (nc_scntl1) & ISCON)) { ! 9165: if (!(driver_setup.recovery & 1)) { ! 9166: ncr_recover_scsi_int(np, HS_FAIL); ! 9167: return; ! 9168: } ! 9169: goto reset_all; ! 9170: } ! 9171: ! 9172: /* ! 9173: ** If the nexus is not clearly identified, reset the bus. ! 9174: ** We will try to do better later. ! 9175: */ ! 9176: if (!cp) ! 9177: goto reset_all; ! 9178: ! 9179: /* ! 9180: ** Check instruction was a MOV, direction was INPUT and ! 9181: ** ATN is asserted. ! 9182: */ ! 9183: if ((cmd & 0xc0) || !(phase & 1) || !(sbcl & 0x8)) ! 9184: goto reset_all; ! 9185: ! 9186: /* ! 9187: ** Keep track of the parity error. ! 9188: */ ! 9189: OUTONB (HF_PRT, HF_EXT_ERR); ! 9190: cp->xerr_status |= XE_PARITY_ERR; ! 9191: ! 9192: /* ! 9193: ** Prepare the message to send to the device. ! 9194: */ ! 9195: np->msgout[0] = (phase == 7) ? M_PARITY : M_ID_ERROR; ! 9196: ! 9197: #ifdef SCSI_NCR_INTEGRITY_CHECKING ! 9198: /* ! 9199: ** Save error message. For integrity check use only. ! 9200: */ ! 9201: if (np->check_integrity) ! 9202: np->check_integ_par = np->msgout[0]; ! 9203: #endif ! 9204: ! 9205: /* ! 9206: ** If the old phase was DATA IN or DT DATA IN phase, ! 9207: ** we have to deal with the 3 situations described above. ! 9208: ** For other input phases (MSG IN and STATUS), the device ! 9209: ** must resend the whole thing that failed parity checking ! 9210: ** or signal error. So, jumping to dispatcher should be OK. ! 9211: */ ! 9212: if ((phase == 1) || (phase == 5)) { ! 9213: /* Phase mismatch handled by SCRIPTS */ ! 9214: if (dsp == NCB_SCRIPTH_PHYS (np, pm_handle)) ! 9215: OUTL_DSP (dsp); ! 9216: /* Phase mismatch handled by the C code */ ! 9217: else if (sist & MA) ! 9218: ncr_int_ma (np); ! 9219: /* No phase mismatch occurred */ ! 9220: else { ! 9221: OUTL (nc_temp, dsp); ! 9222: OUTL_DSP (NCB_SCRIPT_PHYS (np, dispatch)); ! 9223: } ! 9224: } ! 9225: else ! 9226: OUTL_DSP (NCB_SCRIPT_PHYS (np, clrack)); ! 9227: return; ! 9228: ! 9229: reset_all: ! 9230: ncr_start_reset(np); ! 9231: return; ! 9232: } ! 9233: ! 9234: /*========================================================== ! 9235: ** ! 9236: ** ! 9237: ** ncr chip exception handler for phase errors. ! 9238: ** ! 9239: ** ! 9240: **========================================================== ! 9241: ** ! 9242: ** We have to construct a new transfer descriptor, ! 9243: ** to transfer the rest of the current block. ! 9244: ** ! 9245: **---------------------------------------------------------- ! 9246: */ ! 9247: ! 9248: static void ncr_int_ma (ncb_p np) ! 9249: { ! 9250: u_int32 dbc; ! 9251: u_int32 rest; ! 9252: u_int32 dsp; ! 9253: u_int32 dsa; ! 9254: u_int32 nxtdsp; ! 9255: u_int32 *vdsp; ! 9256: u_int32 oadr, olen; ! 9257: u_int32 *tblp; ! 9258: u_int32 newcmd; ! 9259: u_int delta; ! 9260: u_char cmd; ! 9261: u_char hflags, hflags0; ! 9262: struct pm_ctx *pm; ! 9263: ccb_p cp; ! 9264: ! 9265: dsp = INL (nc_dsp); ! 9266: dbc = INL (nc_dbc); ! 9267: dsa = INL (nc_dsa); ! 9268: ! 9269: cmd = dbc >> 24; ! 9270: rest = dbc & 0xffffff; ! 9271: delta = 0; ! 9272: ! 9273: /* ! 9274: ** locate matching cp. ! 9275: */ ! 9276: cp = ncr_ccb_from_dsa(np, dsa); ! 9277: ! 9278: if (DEBUG_FLAGS & DEBUG_PHASE) ! 9279: printk("CCB = %2x %2x %2x %2x %2x %2x\n", ! 9280: cp->cmd->cmnd[0], cp->cmd->cmnd[1], cp->cmd->cmnd[2], ! 9281: cp->cmd->cmnd[3], cp->cmd->cmnd[4], cp->cmd->cmnd[5]); ! 9282: ! 9283: /* ! 9284: ** Donnot take into account dma fifo and various buffers in ! 9285: ** INPUT phase since the chip flushes everything before ! 9286: ** raising the MA interrupt for interrupted INPUT phases. ! 9287: ** For DATA IN phase, we will check for the SWIDE later. ! 9288: */ ! 9289: if ((cmd & 7) != 1 && (cmd & 7) != 5) { ! 9290: u_int32 dfifo; ! 9291: u_char ss0, ss2; ! 9292: ! 9293: /* ! 9294: ** If C1010, DFBC contains number of bytes in DMA fifo. ! 9295: ** else read DFIFO, CTEST[4-6] using 1 PCI bus ownership. ! 9296: */ ! 9297: if ((np->device_id == PCI_DEVICE_ID_LSI_53C1010) || ! 9298: (np->device_id == PCI_DEVICE_ID_LSI_53C1010_66)) ! 9299: delta = INL(nc_dfbc) & 0xffff; ! 9300: else { ! 9301: dfifo = INL(nc_dfifo); ! 9302: ! 9303: /* ! 9304: ** Calculate remaining bytes in DMA fifo. ! 9305: ** C1010 - always large fifo, value in dfbc ! 9306: ** Otherwise, (CTEST5 = dfifo >> 16) ! 9307: */ ! 9308: if (dfifo & (DFS << 16)) ! 9309: delta = ((((dfifo >> 8) & 0x300) | ! 9310: (dfifo & 0xff)) - rest) & 0x3ff; ! 9311: else ! 9312: delta = ((dfifo & 0xff) - rest) & 0x7f; ! 9313: ! 9314: /* ! 9315: ** The data in the dma fifo has not been ! 9316: ** transferred to the target -> add the amount ! 9317: ** to the rest and clear the data. ! 9318: ** Check the sstat2 register in case of wide ! 9319: ** transfer. ! 9320: */ ! 9321: ! 9322: } ! 9323: ! 9324: rest += delta; ! 9325: ss0 = INB (nc_sstat0); ! 9326: if (ss0 & OLF) rest++; ! 9327: if ((np->device_id != PCI_DEVICE_ID_LSI_53C1010) && ! 9328: (np->device_id != PCI_DEVICE_ID_LSI_53C1010_66) && (ss0 & ORF)) ! 9329: rest++; ! 9330: if (cp && (cp->phys.select.sel_scntl3 & EWS)) { ! 9331: ss2 = INB (nc_sstat2); ! 9332: if (ss2 & OLF1) rest++; ! 9333: if ((np->device_id != PCI_DEVICE_ID_LSI_53C1010) && ! 9334: (np->device_id != PCI_DEVICE_ID_LSI_53C1010_66) && (ss2 & ORF)) ! 9335: rest++; ! 9336: }; ! 9337: ! 9338: /* ! 9339: ** Clear fifos. ! 9340: */ ! 9341: OUTB (nc_ctest3, np->rv_ctest3 | CLF); /* dma fifo */ ! 9342: OUTB (nc_stest3, TE|CSF); /* scsi fifo */ ! 9343: } ! 9344: ! 9345: /* ! 9346: ** log the information ! 9347: */ ! 9348: ! 9349: if (DEBUG_FLAGS & (DEBUG_TINY|DEBUG_PHASE)) ! 9350: printk ("P%x%x RL=%d D=%d ", cmd&7, INB(nc_sbcl)&7, ! 9351: (unsigned) rest, (unsigned) delta); ! 9352: ! 9353: /* ! 9354: ** try to find the interrupted script command, ! 9355: ** and the address at which to continue. ! 9356: */ ! 9357: vdsp = 0; ! 9358: nxtdsp = 0; ! 9359: if (dsp > np->p_script && ! 9360: dsp <= np->p_script + sizeof(struct script)) { ! 9361: vdsp = (u_int32 *)((char*)np->script0 + (dsp-np->p_script-8)); ! 9362: nxtdsp = dsp; ! 9363: } ! 9364: else if (dsp > np->p_scripth && ! 9365: dsp <= np->p_scripth + sizeof(struct scripth)) { ! 9366: vdsp = (u_int32 *)((char*)np->scripth0 + (dsp-np->p_scripth-8)); ! 9367: nxtdsp = dsp; ! 9368: } ! 9369: ! 9370: /* ! 9371: ** log the information ! 9372: */ ! 9373: if (DEBUG_FLAGS & DEBUG_PHASE) { ! 9374: printk ("\nCP=%p DSP=%x NXT=%x VDSP=%p CMD=%x ", ! 9375: cp, (unsigned)dsp, (unsigned)nxtdsp, vdsp, cmd); ! 9376: }; ! 9377: ! 9378: if (!vdsp) { ! 9379: printk ("%s: interrupted SCRIPT address not found.\n", ! 9380: ncr_name (np)); ! 9381: goto reset_all; ! 9382: } ! 9383: ! 9384: if (!cp) { ! 9385: printk ("%s: SCSI phase error fixup: CCB already dequeued.\n", ! 9386: ncr_name (np)); ! 9387: goto reset_all; ! 9388: } ! 9389: ! 9390: /* ! 9391: ** get old startaddress and old length. ! 9392: */ ! 9393: ! 9394: oadr = scr_to_cpu(vdsp[1]); ! 9395: ! 9396: if (cmd & 0x10) { /* Table indirect */ ! 9397: tblp = (u_int32 *) ((char*) &cp->phys + oadr); ! 9398: olen = scr_to_cpu(tblp[0]); ! 9399: oadr = scr_to_cpu(tblp[1]); ! 9400: } else { ! 9401: tblp = (u_int32 *) 0; ! 9402: olen = scr_to_cpu(vdsp[0]) & 0xffffff; ! 9403: }; ! 9404: ! 9405: if (DEBUG_FLAGS & DEBUG_PHASE) { ! 9406: printk ("OCMD=%x\nTBLP=%p OLEN=%x OADR=%x\n", ! 9407: (unsigned) (scr_to_cpu(vdsp[0]) >> 24), ! 9408: tblp, ! 9409: (unsigned) olen, ! 9410: (unsigned) oadr); ! 9411: }; ! 9412: ! 9413: /* ! 9414: ** check cmd against assumed interrupted script command. ! 9415: ** If dt data phase, the MOVE instruction hasn't bit 4 of ! 9416: ** the phase. ! 9417: */ ! 9418: ! 9419: if (((cmd & 2) ? cmd : (cmd & ~4)) != (scr_to_cpu(vdsp[0]) >> 24)) { ! 9420: PRINT_ADDR(cp->cmd); ! 9421: printk ("internal error: cmd=%02x != %02x=(vdsp[0] >> 24)\n", ! 9422: (unsigned)cmd, (unsigned)scr_to_cpu(vdsp[0]) >> 24); ! 9423: ! 9424: goto reset_all; ! 9425: }; ! 9426: ! 9427: /* ! 9428: ** if old phase not dataphase, leave here. ! 9429: ** C/D line is low if data. ! 9430: */ ! 9431: ! 9432: if (cmd & 0x02) { ! 9433: PRINT_ADDR(cp->cmd); ! 9434: printk ("phase change %x-%x %d@%08x resid=%d.\n", ! 9435: cmd&7, INB(nc_sbcl)&7, (unsigned)olen, ! 9436: (unsigned)oadr, (unsigned)rest); ! 9437: goto unexpected_phase; ! 9438: }; ! 9439: ! 9440: /* ! 9441: ** Choose the correct PM save area. ! 9442: ** ! 9443: ** Look at the PM_SAVE SCRIPT if you want to understand ! 9444: ** this stuff. The equivalent code is implemented in ! 9445: ** SCRIPTS for the 895A and 896 that are able to handle ! 9446: ** PM from the SCRIPTS processor. ! 9447: */ ! 9448: ! 9449: hflags0 = INB (HF_PRT); ! 9450: hflags = hflags0; ! 9451: ! 9452: if (hflags & (HF_IN_PM0 | HF_IN_PM1 | HF_DP_SAVED)) { ! 9453: if (hflags & HF_IN_PM0) ! 9454: nxtdsp = scr_to_cpu(cp->phys.pm0.ret); ! 9455: else if (hflags & HF_IN_PM1) ! 9456: nxtdsp = scr_to_cpu(cp->phys.pm1.ret); ! 9457: ! 9458: if (hflags & HF_DP_SAVED) ! 9459: hflags ^= HF_ACT_PM; ! 9460: } ! 9461: ! 9462: if (!(hflags & HF_ACT_PM)) { ! 9463: pm = &cp->phys.pm0; ! 9464: newcmd = NCB_SCRIPT_PHYS(np, pm0_data); ! 9465: } ! 9466: else { ! 9467: pm = &cp->phys.pm1; ! 9468: newcmd = NCB_SCRIPT_PHYS(np, pm1_data); ! 9469: } ! 9470: ! 9471: hflags &= ~(HF_IN_PM0 | HF_IN_PM1 | HF_DP_SAVED); ! 9472: if (hflags != hflags0) ! 9473: OUTB (HF_PRT, hflags); ! 9474: ! 9475: /* ! 9476: ** fillin the phase mismatch context ! 9477: */ ! 9478: ! 9479: pm->sg.addr = cpu_to_scr(oadr + olen - rest); ! 9480: pm->sg.size = cpu_to_scr(rest); ! 9481: pm->ret = cpu_to_scr(nxtdsp); ! 9482: ! 9483: /* ! 9484: ** If we have a SWIDE, ! 9485: ** - prepare the address to write the SWIDE from SCRIPTS, ! 9486: ** - compute the SCRIPTS address to restart from, ! 9487: ** - move current data pointer context by one byte. ! 9488: */ ! 9489: nxtdsp = NCB_SCRIPT_PHYS (np, dispatch); ! 9490: if ( ((cmd & 7) == 1 || (cmd & 7) == 5) ! 9491: && cp && (cp->phys.select.sel_scntl3 & EWS) && ! 9492: (INB (nc_scntl2) & WSR)) { ! 9493: u32 tmp; ! 9494: ! 9495: #ifdef SYM_DEBUG_PM_WITH_WSR ! 9496: PRINT_ADDR(cp); ! 9497: printf ("MA interrupt with WSR set - " ! 9498: "pm->sg.addr=%x - pm->sg.size=%d\n", ! 9499: pm->sg.addr, pm->sg.size); ! 9500: #endif ! 9501: /* ! 9502: * Set up the table indirect for the MOVE ! 9503: * of the residual byte and adjust the data ! 9504: * pointer context. ! 9505: */ ! 9506: tmp = scr_to_cpu(pm->sg.addr); ! 9507: cp->phys.wresid.addr = cpu_to_scr(tmp); ! 9508: pm->sg.addr = cpu_to_scr(tmp + 1); ! 9509: tmp = scr_to_cpu(pm->sg.size); ! 9510: cp->phys.wresid.size = cpu_to_scr((tmp&0xff000000) | 1); ! 9511: pm->sg.size = cpu_to_scr(tmp - 1); ! 9512: ! 9513: /* ! 9514: * If only the residual byte is to be moved, ! 9515: * no PM context is needed. ! 9516: */ ! 9517: if ((tmp&0xffffff) == 1) ! 9518: newcmd = pm->ret; ! 9519: ! 9520: /* ! 9521: * Prepare the address of SCRIPTS that will ! 9522: * move the residual byte to memory. ! 9523: */ ! 9524: nxtdsp = NCB_SCRIPTH_PHYS (np, wsr_ma_helper); ! 9525: } ! 9526: ! 9527: if (DEBUG_FLAGS & DEBUG_PHASE) { ! 9528: PRINT_ADDR(cp->cmd); ! 9529: printk ("PM %x %x %x / %x %x %x.\n", ! 9530: hflags0, hflags, newcmd, ! 9531: (unsigned)scr_to_cpu(pm->sg.addr), ! 9532: (unsigned)scr_to_cpu(pm->sg.size), ! 9533: (unsigned)scr_to_cpu(pm->ret)); ! 9534: } ! 9535: ! 9536: /* ! 9537: ** Restart the SCRIPTS processor. ! 9538: */ ! 9539: ! 9540: OUTL (nc_temp, newcmd); ! 9541: OUTL_DSP (nxtdsp); ! 9542: return; ! 9543: ! 9544: /* ! 9545: ** Unexpected phase changes that occurs when the current phase ! 9546: ** is not a DATA IN or DATA OUT phase are due to error conditions. ! 9547: ** Such event may only happen when the SCRIPTS is using a ! 9548: ** multibyte SCSI MOVE. ! 9549: ** ! 9550: ** Phase change Some possible cause ! 9551: ** ! 9552: ** COMMAND --> MSG IN SCSI parity error detected by target. ! 9553: ** COMMAND --> STATUS Bad command or refused by target. ! 9554: ** MSG OUT --> MSG IN Message rejected by target. ! 9555: ** MSG OUT --> COMMAND Bogus target that discards extended ! 9556: ** negotiation messages. ! 9557: ** ! 9558: ** The code below does not care of the new phase and so ! 9559: ** trusts the target. Why to annoy it ? ! 9560: ** If the interrupted phase is COMMAND phase, we restart at ! 9561: ** dispatcher. ! 9562: ** If a target does not get all the messages after selection, ! 9563: ** the code assumes blindly that the target discards extended ! 9564: ** messages and clears the negotiation status. ! 9565: ** If the target does not want all our response to negotiation, ! 9566: ** we force a SIR_NEGO_PROTO interrupt (it is a hack that avoids ! 9567: ** bloat for such a should_not_happen situation). ! 9568: ** In all other situation, we reset the BUS. ! 9569: ** Are these assumptions reasonnable ? (Wait and see ...) ! 9570: */ ! 9571: unexpected_phase: ! 9572: dsp -= 8; ! 9573: nxtdsp = 0; ! 9574: ! 9575: switch (cmd & 7) { ! 9576: case 2: /* COMMAND phase */ ! 9577: nxtdsp = NCB_SCRIPT_PHYS (np, dispatch); ! 9578: break; ! 9579: #if 0 ! 9580: case 3: /* STATUS phase */ ! 9581: nxtdsp = NCB_SCRIPT_PHYS (np, dispatch); ! 9582: break; ! 9583: #endif ! 9584: case 6: /* MSG OUT phase */ ! 9585: /* ! 9586: ** If the device may want to use untagged when we want ! 9587: ** tagged, we prepare an IDENTIFY without disc. granted, ! 9588: ** since we will not be able to handle reselect. ! 9589: ** Otherwise, we just don't care. ! 9590: */ ! 9591: if (dsp == NCB_SCRIPT_PHYS (np, send_ident)) { ! 9592: if (cp->tag != NO_TAG && olen - rest <= 3) { ! 9593: cp->host_status = HS_BUSY; ! 9594: np->msgout[0] = M_IDENTIFY | cp->lun; ! 9595: nxtdsp = NCB_SCRIPTH_PHYS (np, ident_break_atn); ! 9596: } ! 9597: else ! 9598: nxtdsp = NCB_SCRIPTH_PHYS (np, ident_break); ! 9599: } ! 9600: else if (dsp == NCB_SCRIPTH_PHYS (np, send_wdtr) || ! 9601: dsp == NCB_SCRIPTH_PHYS (np, send_sdtr) || ! 9602: dsp == NCB_SCRIPTH_PHYS (np, send_ppr)) { ! 9603: nxtdsp = NCB_SCRIPTH_PHYS (np, nego_bad_phase); ! 9604: } ! 9605: break; ! 9606: #if 0 ! 9607: case 7: /* MSG IN phase */ ! 9608: nxtdsp = NCB_SCRIPT_PHYS (np, clrack); ! 9609: break; ! 9610: #endif ! 9611: } ! 9612: ! 9613: if (nxtdsp) { ! 9614: OUTL_DSP (nxtdsp); ! 9615: return; ! 9616: } ! 9617: ! 9618: reset_all: ! 9619: ncr_start_reset(np); ! 9620: } ! 9621: ! 9622: /*========================================================== ! 9623: ** ! 9624: ** ncr chip handler for QUEUE FULL and CHECK CONDITION ! 9625: ** ! 9626: **========================================================== ! 9627: ** ! 9628: ** On QUEUE FULL status, we set the actual tagged command ! 9629: ** queue depth to the number of disconnected CCBs that is ! 9630: ** hopefully a good value to avoid further QUEUE FULL. ! 9631: ** ! 9632: ** On CHECK CONDITION or COMMAND TERMINATED, we use the ! 9633: ** CCB of the failed command for performing a REQUEST ! 9634: ** SENSE SCSI command. ! 9635: ** ! 9636: ** We do not want to change the order commands will be ! 9637: ** actually queued to the device after we received a ! 9638: ** QUEUE FULL status. We also want to properly deal with ! 9639: ** contingent allegiance condition. For these reasons, ! 9640: ** we remove from the start queue all commands for this ! 9641: ** LUN that haven't been yet queued to the device and ! 9642: ** put them back in the correponding LUN queue, then ! 9643: ** requeue the CCB that failed in front of the LUN queue. ! 9644: ** I just hope this not to be performed too often. :) ! 9645: ** ! 9646: ** If we are using IMMEDIATE ARBITRATION, we clear the ! 9647: ** IARB hint for every commands we encounter in order not ! 9648: ** to be stuck with a won arbitration and no job to queue ! 9649: ** to a device. ! 9650: **---------------------------------------------------------- ! 9651: */ ! 9652: ! 9653: static void ncr_sir_to_redo(ncb_p np, int num, ccb_p cp) ! 9654: { ! 9655: Scsi_Cmnd *cmd = cp->cmd; ! 9656: tcb_p tp = &np->target[cp->target]; ! 9657: lcb_p lp = ncr_lp(np, tp, cp->lun); ! 9658: ccb_p cp2; ! 9659: int busyccbs = 1; ! 9660: u_int32 startp; ! 9661: u_char s_status = INB (SS_PRT); ! 9662: int msglen; ! 9663: int i, j; ! 9664: ! 9665: ! 9666: /* ! 9667: ** If the LCB is not yet available, then only ! 9668: ** 1 IO is accepted, so we should have it. ! 9669: */ ! 9670: if (!lp) ! 9671: goto next; ! 9672: /* ! 9673: ** Remove all CCBs queued to the chip for that LUN and put ! 9674: ** them back in the LUN CCB wait queue. ! 9675: */ ! 9676: busyccbs = lp->queuedccbs; ! 9677: i = (INL (nc_scratcha) - np->p_squeue) / 4; ! 9678: j = i; ! 9679: while (i != np->squeueput) { ! 9680: cp2 = ncr_ccb_from_dsa(np, scr_to_cpu(np->squeue[i])); ! 9681: assert(cp2); ! 9682: #ifdef SCSI_NCR_IARB_SUPPORT ! 9683: /* IARB hints may not be relevant any more. Forget them. */ ! 9684: cp2->host_flags &= ~HF_HINT_IARB; ! 9685: #endif ! 9686: if (cp2 && cp2->target == cp->target && cp2->lun == cp->lun) { ! 9687: xpt_remque(&cp2->link_ccbq); ! 9688: xpt_insque_head(&cp2->link_ccbq, &lp->wait_ccbq); ! 9689: --lp->queuedccbs; ! 9690: cp2->queued = 0; ! 9691: } ! 9692: else { ! 9693: if (i != j) ! 9694: np->squeue[j] = np->squeue[i]; ! 9695: if ((j += 2) >= MAX_START*2) j = 0; ! 9696: } ! 9697: if ((i += 2) >= MAX_START*2) i = 0; ! 9698: } ! 9699: if (i != j) /* Copy back the idle task if needed */ ! 9700: np->squeue[j] = np->squeue[i]; ! 9701: np->squeueput = j; /* Update our current start queue pointer */ ! 9702: ! 9703: /* ! 9704: ** Requeue the interrupted CCB in front of the ! 9705: ** LUN CCB wait queue to preserve ordering. ! 9706: */ ! 9707: xpt_remque(&cp->link_ccbq); ! 9708: xpt_insque_head(&cp->link_ccbq, &lp->wait_ccbq); ! 9709: --lp->queuedccbs; ! 9710: cp->queued = 0; ! 9711: ! 9712: next: ! 9713: ! 9714: #ifdef SCSI_NCR_IARB_SUPPORT ! 9715: /* IARB hint may not be relevant any more. Forget it. */ ! 9716: cp->host_flags &= ~HF_HINT_IARB; ! 9717: if (np->last_cp) ! 9718: np->last_cp = 0; ! 9719: #endif ! 9720: ! 9721: /* ! 9722: ** Now we can restart the SCRIPTS processor safely. ! 9723: */ ! 9724: OUTL_DSP (NCB_SCRIPT_PHYS (np, start)); ! 9725: ! 9726: switch(s_status) { ! 9727: default: ! 9728: case S_BUSY: ! 9729: ncr_complete(np, cp); ! 9730: break; ! 9731: case S_QUEUE_FULL: ! 9732: if (!lp || !lp->queuedccbs) { ! 9733: ncr_complete(np, cp); ! 9734: break; ! 9735: } ! 9736: if (bootverbose >= 1) { ! 9737: PRINT_ADDR(cmd); ! 9738: printk ("QUEUE FULL! %d busy, %d disconnected CCBs\n", ! 9739: busyccbs, lp->queuedccbs); ! 9740: } ! 9741: /* ! 9742: ** Decrease number of tags to the number of ! 9743: ** disconnected commands. ! 9744: */ ! 9745: if (lp->queuedccbs < lp->numtags) { ! 9746: lp->numtags = lp->queuedccbs; ! 9747: lp->num_good = 0; ! 9748: ncr_setup_tags (np, cp->target, cp->lun); ! 9749: } ! 9750: /* ! 9751: ** Repair the offending CCB. ! 9752: */ ! 9753: cp->phys.header.savep = cp->startp; ! 9754: cp->phys.header.lastp = cp->lastp0; ! 9755: cp->host_status = HS_BUSY; ! 9756: cp->scsi_status = S_ILLEGAL; ! 9757: cp->xerr_status = 0; ! 9758: cp->extra_bytes = 0; ! 9759: cp->host_flags &= (HF_PM_TO_C|HF_DATA_IN); ! 9760: ! 9761: break; ! 9762: ! 9763: case S_TERMINATED: ! 9764: case S_CHECK_COND: ! 9765: /* ! 9766: ** If we were requesting sense, give up. ! 9767: */ ! 9768: if (cp->host_flags & HF_AUTO_SENSE) { ! 9769: ncr_complete(np, cp); ! 9770: break; ! 9771: } ! 9772: ! 9773: /* ! 9774: ** Save SCSI status and extended error. ! 9775: ** Compute the data residual now. ! 9776: */ ! 9777: cp->sv_scsi_status = cp->scsi_status; ! 9778: cp->sv_xerr_status = cp->xerr_status; ! 9779: cp->resid = ncr_compute_residual(np, cp); ! 9780: ! 9781: /* ! 9782: ** Device returned CHECK CONDITION status. ! 9783: ** Prepare all needed data strutures for getting ! 9784: ** sense data. ! 9785: */ ! 9786: ! 9787: /* ! 9788: ** identify message ! 9789: */ ! 9790: cp->scsi_smsg2[0] = M_IDENTIFY | cp->lun; ! 9791: msglen = 1; ! 9792: ! 9793: /* ! 9794: ** If we are currently using anything different from ! 9795: ** async. 8 bit data transfers with that target, ! 9796: ** start a negotiation, since the device may want ! 9797: ** to report us a UNIT ATTENTION condition due to ! 9798: ** a cause we currently ignore, and we donnot want ! 9799: ** to be stuck with WIDE and/or SYNC data transfer. ! 9800: ** ! 9801: ** cp->nego_status is filled by ncr_prepare_nego(). ! 9802: ** ! 9803: ** Do NOT negotiate if performing integrity check ! 9804: ** or if integrity check has completed, all check ! 9805: ** conditions will have been cleared. ! 9806: */ ! 9807: ! 9808: #ifdef SCSI_NCR_INTEGRITY_CHECKING ! 9809: if (DEBUG_FLAGS & DEBUG_IC) { ! 9810: printk("%s: ncr_sir_to_redo: ic_done %2X, in_progress %2X\n", ! 9811: ncr_name(np), tp->ic_done, cp->cmd->ic_in_progress); ! 9812: } ! 9813: ! 9814: /* ! 9815: ** If parity error during integrity check, ! 9816: ** set the target width to narrow. Otherwise, ! 9817: ** do not negotiate on a request sense. ! 9818: */ ! 9819: if ( np->check_integ_par && np->check_integrity ! 9820: && cp->cmd->ic_in_progress ) { ! 9821: cp->nego_status = 0; ! 9822: msglen += ! 9823: ncr_ic_nego (np, cp, cmd ,&cp->scsi_smsg2[msglen]); ! 9824: } ! 9825: ! 9826: if (!np->check_integrity || ! 9827: (np->check_integrity && ! 9828: (!cp->cmd->ic_in_progress && !tp->ic_done)) ) { ! 9829: ncr_negotiate(np, tp); ! 9830: cp->nego_status = 0; ! 9831: { ! 9832: u_char sync_offset; ! 9833: if ((np->device_id == PCI_DEVICE_ID_LSI_53C1010) || ! 9834: (np->device_id == PCI_DEVICE_ID_LSI_53C1010_66)) ! 9835: sync_offset = tp->sval & 0x3f; ! 9836: else ! 9837: sync_offset = tp->sval & 0x1f; ! 9838: ! 9839: if ((tp->wval & EWS) || sync_offset) ! 9840: msglen += ! 9841: ncr_prepare_nego (np, cp, &cp->scsi_smsg2[msglen]); ! 9842: } ! 9843: ! 9844: } ! 9845: #else ! 9846: ncr_negotiate(np, tp); ! 9847: cp->nego_status = 0; ! 9848: if ((tp->wval & EWS) || (tp->sval & 0x1f)) ! 9849: msglen += ! 9850: ncr_prepare_nego (np, cp, &cp->scsi_smsg2[msglen]); ! 9851: #endif /* SCSI_NCR_INTEGRITY_CHECKING */ ! 9852: ! 9853: /* ! 9854: ** Message table indirect structure. ! 9855: */ ! 9856: cp->phys.smsg.addr = cpu_to_scr(CCB_PHYS (cp, scsi_smsg2)); ! 9857: cp->phys.smsg.size = cpu_to_scr(msglen); ! 9858: ! 9859: /* ! 9860: ** sense command ! 9861: */ ! 9862: cp->phys.cmd.addr = cpu_to_scr(CCB_PHYS (cp, sensecmd)); ! 9863: cp->phys.cmd.size = cpu_to_scr(6); ! 9864: ! 9865: /* ! 9866: ** patch requested size into sense command ! 9867: */ ! 9868: cp->sensecmd[0] = 0x03; ! 9869: cp->sensecmd[1] = cp->lun << 5; ! 9870: cp->sensecmd[4] = sizeof(cp->sense_buf); ! 9871: ! 9872: /* ! 9873: ** sense data ! 9874: */ ! 9875: bzero(cp->sense_buf, sizeof(cp->sense_buf)); ! 9876: cp->phys.sense.addr = cpu_to_scr(CCB_PHYS(cp,sense_buf[0])); ! 9877: cp->phys.sense.size = cpu_to_scr(sizeof(cp->sense_buf)); ! 9878: ! 9879: /* ! 9880: ** requeue the command. ! 9881: */ ! 9882: startp = NCB_SCRIPTH_PHYS (np, sdata_in); ! 9883: ! 9884: cp->phys.header.savep = cpu_to_scr(startp); ! 9885: cp->phys.header.goalp = cpu_to_scr(startp + 16); ! 9886: cp->phys.header.lastp = cpu_to_scr(startp); ! 9887: cp->phys.header.wgoalp = cpu_to_scr(startp + 16); ! 9888: cp->phys.header.wlastp = cpu_to_scr(startp); ! 9889: ! 9890: cp->host_status = cp->nego_status ? HS_NEGOTIATE : HS_BUSY; ! 9891: cp->scsi_status = S_ILLEGAL; ! 9892: cp->host_flags = (HF_AUTO_SENSE|HF_DATA_IN); ! 9893: ! 9894: cp->phys.header.go.start = ! 9895: cpu_to_scr(NCB_SCRIPT_PHYS (np, select)); ! 9896: ! 9897: /* ! 9898: ** If lp not yet allocated, requeue the command. ! 9899: */ ! 9900: if (!lp) ! 9901: ncr_put_start_queue(np, cp); ! 9902: break; ! 9903: } ! 9904: ! 9905: /* ! 9906: ** requeue awaiting scsi commands for this lun. ! 9907: */ ! 9908: if (lp) ! 9909: ncr_start_next_ccb(np, lp, 1); ! 9910: ! 9911: return; ! 9912: } ! 9913: ! 9914: /*---------------------------------------------------------- ! 9915: ** ! 9916: ** After a device has accepted some management message ! 9917: ** as BUS DEVICE RESET, ABORT TASK, etc ..., or when ! 9918: ** a device signals a UNIT ATTENTION condition, some ! 9919: ** tasks are thrown away by the device. We are required ! 9920: ** to reflect that on our tasks list since the device ! 9921: ** will never complete these tasks. ! 9922: ** ! 9923: ** This function completes all disconnected CCBs for a ! 9924: ** given target that matches the following criteria: ! 9925: ** - lun=-1 means any logical UNIT otherwise a given one. ! 9926: ** - task=-1 means any task, otherwise a given one. ! 9927: **---------------------------------------------------------- ! 9928: */ ! 9929: static int ncr_clear_tasks(ncb_p np, u_char hsts, ! 9930: int target, int lun, int task) ! 9931: { ! 9932: int i = 0; ! 9933: ccb_p cp; ! 9934: ! 9935: for (cp = np->ccbc; cp; cp = cp->link_ccb) { ! 9936: if (cp->host_status != HS_DISCONNECT) ! 9937: continue; ! 9938: if (cp->target != target) ! 9939: continue; ! 9940: if (lun != -1 && cp->lun != lun) ! 9941: continue; ! 9942: if (task != -1 && cp->tag != NO_TAG && cp->scsi_smsg[2] != task) ! 9943: continue; ! 9944: cp->host_status = hsts; ! 9945: cp->scsi_status = S_ILLEGAL; ! 9946: ncr_complete(np, cp); ! 9947: ++i; ! 9948: } ! 9949: return i; ! 9950: } ! 9951: ! 9952: /*========================================================== ! 9953: ** ! 9954: ** ncr chip handler for TASKS recovery. ! 9955: ** ! 9956: **========================================================== ! 9957: ** ! 9958: ** We cannot safely abort a command, while the SCRIPTS ! 9959: ** processor is running, since we just would be in race ! 9960: ** with it. ! 9961: ** ! 9962: ** As long as we have tasks to abort, we keep the SEM ! 9963: ** bit set in the ISTAT. When this bit is set, the ! 9964: ** SCRIPTS processor interrupts (SIR_SCRIPT_STOPPED) ! 9965: ** each time it enters the scheduler. ! 9966: ** ! 9967: ** If we have to reset a target, clear tasks of a unit, ! 9968: ** or to perform the abort of a disconnected job, we ! 9969: ** restart the SCRIPTS for selecting the target. Once ! 9970: ** selected, the SCRIPTS interrupts (SIR_TARGET_SELECTED). ! 9971: ** If it loses arbitration, the SCRIPTS will interrupt again ! 9972: ** the next time it will enter its scheduler, and so on ... ! 9973: ** ! 9974: ** On SIR_TARGET_SELECTED, we scan for the more ! 9975: ** appropriate thing to do: ! 9976: ** ! 9977: ** - If nothing, we just sent a M_ABORT message to the ! 9978: ** target to get rid of the useless SCSI bus ownership. ! 9979: ** According to the specs, no tasks shall be affected. ! 9980: ** - If the target is to be reset, we send it a M_RESET ! 9981: ** message. ! 9982: ** - If a logical UNIT is to be cleared , we send the ! 9983: ** IDENTIFY(lun) + M_ABORT. ! 9984: ** - If an untagged task is to be aborted, we send the ! 9985: ** IDENTIFY(lun) + M_ABORT. ! 9986: ** - If a tagged task is to be aborted, we send the ! 9987: ** IDENTIFY(lun) + task attributes + M_ABORT_TAG. ! 9988: ** ! 9989: ** Once our 'kiss of death' :) message has been accepted ! 9990: ** by the target, the SCRIPTS interrupts again ! 9991: ** (SIR_ABORT_SENT). On this interrupt, we complete ! 9992: ** all the CCBs that should have been aborted by the ! 9993: ** target according to our message. ! 9994: ** ! 9995: **---------------------------------------------------------- ! 9996: */ ! 9997: static void ncr_sir_task_recovery(ncb_p np, int num) ! 9998: { ! 9999: ccb_p cp; ! 10000: tcb_p tp; ! 10001: int target=-1, lun=-1, task; ! 10002: int i, k; ! 10003: u_char *p; ! 10004: ! 10005: switch(num) { ! 10006: /* ! 10007: ** The SCRIPTS processor stopped before starting ! 10008: ** the next command in order to allow us to perform ! 10009: ** some task recovery. ! 10010: */ ! 10011: case SIR_SCRIPT_STOPPED: ! 10012: ! 10013: /* ! 10014: ** Do we have any target to reset or unit to clear ? ! 10015: */ ! 10016: for (i = 0 ; i < MAX_TARGET ; i++) { ! 10017: tp = &np->target[i]; ! 10018: if (tp->to_reset || (tp->l0p && tp->l0p->to_clear)) { ! 10019: target = i; ! 10020: break; ! 10021: } ! 10022: if (!tp->lmp) ! 10023: continue; ! 10024: for (k = 1 ; k < MAX_LUN ; k++) { ! 10025: if (tp->lmp[k] && tp->lmp[k]->to_clear) { ! 10026: target = i; ! 10027: break; ! 10028: } ! 10029: } ! 10030: if (target != -1) ! 10031: break; ! 10032: } ! 10033: ! 10034: /* ! 10035: ** If not, look at the CCB list for any ! 10036: ** disconnected CCB to be aborted. ! 10037: */ ! 10038: if (target == -1) { ! 10039: for (cp = np->ccbc; cp; cp = cp->link_ccb) { ! 10040: if (cp->host_status != HS_DISCONNECT) ! 10041: continue; ! 10042: if (cp->to_abort) { ! 10043: target = cp->target; ! 10044: break; ! 10045: } ! 10046: } ! 10047: } ! 10048: ! 10049: /* ! 10050: ** If some target is to be selected, ! 10051: ** prepare and start the selection. ! 10052: */ ! 10053: if (target != -1) { ! 10054: tp = &np->target[target]; ! 10055: np->abrt_sel.sel_id = target; ! 10056: np->abrt_sel.sel_scntl3 = tp->wval; ! 10057: np->abrt_sel.sel_sxfer = tp->sval; ! 10058: np->abrt_sel.sel_scntl4 = tp->uval; ! 10059: OUTL(nc_dsa, np->p_ncb); ! 10060: OUTL_DSP (NCB_SCRIPTH_PHYS (np, sel_for_abort)); ! 10061: return; ! 10062: } ! 10063: ! 10064: /* ! 10065: ** Nothing is to be selected, so we donnot need ! 10066: ** to synchronize with the SCRIPTS anymore. ! 10067: ** Remove the SEM flag from the ISTAT. ! 10068: */ ! 10069: np->istat_sem = 0; ! 10070: OUTB (nc_istat, SIGP); ! 10071: ! 10072: /* ! 10073: ** Now look at CCBs to abort that haven't started yet. ! 10074: ** Remove all those CCBs from the start queue and ! 10075: ** complete them with appropriate status. ! 10076: ** Btw, the SCRIPTS processor is still stopped, so ! 10077: ** we are not in race. ! 10078: */ ! 10079: for (cp = np->ccbc; cp; cp = cp->link_ccb) { ! 10080: if (cp->host_status != HS_BUSY && ! 10081: cp->host_status != HS_NEGOTIATE) ! 10082: continue; ! 10083: if (!cp->to_abort) ! 10084: continue; ! 10085: #ifdef SCSI_NCR_IARB_SUPPORT ! 10086: /* ! 10087: ** If we are using IMMEDIATE ARBITRATION, we donnot ! 10088: ** want to cancel the last queued CCB, since the ! 10089: ** SCRIPTS may have anticipated the selection. ! 10090: */ ! 10091: if (cp == np->last_cp) { ! 10092: cp->to_abort = 0; ! 10093: continue; ! 10094: } ! 10095: #endif ! 10096: /* ! 10097: ** Compute index of next position in the start ! 10098: ** queue the SCRIPTS will schedule. ! 10099: */ ! 10100: i = (INL (nc_scratcha) - np->p_squeue) / 4; ! 10101: ! 10102: /* ! 10103: ** Remove the job from the start queue. ! 10104: */ ! 10105: k = -1; ! 10106: while (1) { ! 10107: if (i == np->squeueput) ! 10108: break; ! 10109: if (k == -1) { /* Not found yet */ ! 10110: if (cp == ncr_ccb_from_dsa(np, ! 10111: scr_to_cpu(np->squeue[i]))) ! 10112: k = i; /* Found */ ! 10113: } ! 10114: else { ! 10115: /* ! 10116: ** Once found, we have to move ! 10117: ** back all jobs by 1 position. ! 10118: */ ! 10119: np->squeue[k] = np->squeue[i]; ! 10120: k += 2; ! 10121: if (k >= MAX_START*2) ! 10122: k = 0; ! 10123: } ! 10124: ! 10125: i += 2; ! 10126: if (i >= MAX_START*2) ! 10127: i = 0; ! 10128: } ! 10129: if (k != -1) { ! 10130: np->squeue[k] = np->squeue[i]; /* Idle task */ ! 10131: np->squeueput = k; /* Start queue pointer */ ! 10132: } ! 10133: cp->host_status = HS_ABORTED; ! 10134: cp->scsi_status = S_ILLEGAL; ! 10135: ncr_complete(np, cp); ! 10136: } ! 10137: break; ! 10138: /* ! 10139: ** The SCRIPTS processor has selected a target ! 10140: ** we may have some manual recovery to perform for. ! 10141: */ ! 10142: case SIR_TARGET_SELECTED: ! 10143: target = (INB (nc_sdid) & 0xf); ! 10144: tp = &np->target[target]; ! 10145: ! 10146: np->abrt_tbl.addr = vtobus(np->abrt_msg); ! 10147: ! 10148: /* ! 10149: ** If the target is to be reset, prepare a ! 10150: ** M_RESET message and clear the to_reset flag ! 10151: ** since we donnot expect this operation to fail. ! 10152: */ ! 10153: if (tp->to_reset) { ! 10154: np->abrt_msg[0] = M_RESET; ! 10155: np->abrt_tbl.size = 1; ! 10156: tp->to_reset = 0; ! 10157: break; ! 10158: } ! 10159: ! 10160: /* ! 10161: ** Otherwise, look for some logical unit to be cleared. ! 10162: */ ! 10163: if (tp->l0p && tp->l0p->to_clear) ! 10164: lun = 0; ! 10165: else if (tp->lmp) { ! 10166: for (k = 1 ; k < MAX_LUN ; k++) { ! 10167: if (tp->lmp[k] && tp->lmp[k]->to_clear) { ! 10168: lun = k; ! 10169: break; ! 10170: } ! 10171: } ! 10172: } ! 10173: ! 10174: /* ! 10175: ** If a logical unit is to be cleared, prepare ! 10176: ** an IDENTIFY(lun) + ABORT MESSAGE. ! 10177: */ ! 10178: if (lun != -1) { ! 10179: lcb_p lp = ncr_lp(np, tp, lun); ! 10180: lp->to_clear = 0; /* We donnot expect to fail here */ ! 10181: np->abrt_msg[0] = M_IDENTIFY | lun; ! 10182: np->abrt_msg[1] = M_ABORT; ! 10183: np->abrt_tbl.size = 2; ! 10184: break; ! 10185: } ! 10186: ! 10187: /* ! 10188: ** Otherwise, look for some disconnected job to ! 10189: ** abort for this target. ! 10190: */ ! 10191: for (cp = np->ccbc; cp; cp = cp->link_ccb) { ! 10192: if (cp->host_status != HS_DISCONNECT) ! 10193: continue; ! 10194: if (cp->target != target) ! 10195: continue; ! 10196: if (cp->to_abort) ! 10197: break; ! 10198: } ! 10199: ! 10200: /* ! 10201: ** If we have none, probably since the device has ! 10202: ** completed the command before we won abitration, ! 10203: ** send a M_ABORT message without IDENTIFY. ! 10204: ** According to the specs, the device must just ! 10205: ** disconnect the BUS and not abort any task. ! 10206: */ ! 10207: if (!cp) { ! 10208: np->abrt_msg[0] = M_ABORT; ! 10209: np->abrt_tbl.size = 1; ! 10210: break; ! 10211: } ! 10212: ! 10213: /* ! 10214: ** We have some task to abort. ! 10215: ** Set the IDENTIFY(lun) ! 10216: */ ! 10217: np->abrt_msg[0] = M_IDENTIFY | cp->lun; ! 10218: ! 10219: /* ! 10220: ** If we want to abort an untagged command, we ! 10221: ** will send a IDENTIFY + M_ABORT. ! 10222: ** Otherwise (tagged command), we will send ! 10223: ** a IDENTITFY + task attributes + ABORT TAG. ! 10224: */ ! 10225: if (cp->tag == NO_TAG) { ! 10226: np->abrt_msg[1] = M_ABORT; ! 10227: np->abrt_tbl.size = 2; ! 10228: } ! 10229: else { ! 10230: np->abrt_msg[1] = cp->scsi_smsg[1]; ! 10231: np->abrt_msg[2] = cp->scsi_smsg[2]; ! 10232: np->abrt_msg[3] = M_ABORT_TAG; ! 10233: np->abrt_tbl.size = 4; ! 10234: } ! 10235: cp->to_abort = 0; /* We donnot expect to fail here */ ! 10236: break; ! 10237: ! 10238: /* ! 10239: ** The target has accepted our message and switched ! 10240: ** to BUS FREE phase as we expected. ! 10241: */ ! 10242: case SIR_ABORT_SENT: ! 10243: target = (INB (nc_sdid) & 0xf); ! 10244: tp = &np->target[target]; ! 10245: ! 10246: /* ! 10247: ** If we didn't abort anything, leave here. ! 10248: */ ! 10249: if (np->abrt_msg[0] == M_ABORT) ! 10250: break; ! 10251: ! 10252: /* ! 10253: ** If we sent a M_RESET, then a hardware reset has ! 10254: ** been performed by the target. ! 10255: ** - Reset everything to async 8 bit ! 10256: ** - Tell ourself to negotiate next time :-) ! 10257: ** - Prepare to clear all disconnected CCBs for ! 10258: ** this target from our task list (lun=task=-1) ! 10259: */ ! 10260: lun = -1; ! 10261: task = -1; ! 10262: if (np->abrt_msg[0] == M_RESET) { ! 10263: tp->sval = 0; ! 10264: tp->wval = np->rv_scntl3; ! 10265: tp->uval = np->rv_scntl4; ! 10266: ncr_set_sync_wide_status(np, target); ! 10267: ncr_negotiate(np, tp); ! 10268: } ! 10269: ! 10270: /* ! 10271: ** Otherwise, check for the LUN and TASK(s) ! 10272: ** concerned by the cancelation. ! 10273: ** If it is not ABORT_TAG then it is CLEAR_QUEUE ! 10274: ** or an ABORT message :-) ! 10275: */ ! 10276: else { ! 10277: lun = np->abrt_msg[0] & 0x3f; ! 10278: if (np->abrt_msg[1] == M_ABORT_TAG) ! 10279: task = np->abrt_msg[2]; ! 10280: } ! 10281: ! 10282: /* ! 10283: ** Complete all the CCBs the device should have ! 10284: ** aborted due to our 'kiss of death' message. ! 10285: */ ! 10286: (void) ncr_clear_tasks(np, HS_ABORTED, target, lun, task); ! 10287: break; ! 10288: ! 10289: /* ! 10290: ** We have performed a auto-sense that succeeded. ! 10291: ** If the device reports a UNIT ATTENTION condition ! 10292: ** due to a RESET condition, we must complete all ! 10293: ** disconnect CCBs for this unit since the device ! 10294: ** shall have thrown them away. ! 10295: ** Since I haven't time to guess what the specs are ! 10296: ** expecting for other UNIT ATTENTION conditions, I ! 10297: ** decided to only care about RESET conditions. :) ! 10298: */ ! 10299: case SIR_AUTO_SENSE_DONE: ! 10300: cp = ncr_ccb_from_dsa(np, INL (nc_dsa)); ! 10301: if (!cp) ! 10302: break; ! 10303: memcpy(cp->cmd->sense_buffer, cp->sense_buf, ! 10304: sizeof(cp->cmd->sense_buffer)); ! 10305: p = &cp->cmd->sense_buffer[0]; ! 10306: ! 10307: if (p[0] != 0x70 || p[2] != 0x6 || p[12] != 0x29) ! 10308: break; ! 10309: #if 0 ! 10310: (void) ncr_clear_tasks(np, HS_RESET, cp->target, cp->lun, -1); ! 10311: #endif ! 10312: break; ! 10313: } ! 10314: ! 10315: /* ! 10316: ** Print to the log the message we intend to send. ! 10317: */ ! 10318: if (num == SIR_TARGET_SELECTED) { ! 10319: PRINT_TARGET(np, target); ! 10320: ncr_printl_hex("control msgout:", np->abrt_msg, ! 10321: np->abrt_tbl.size); ! 10322: np->abrt_tbl.size = cpu_to_scr(np->abrt_tbl.size); ! 10323: } ! 10324: ! 10325: /* ! 10326: ** Let the SCRIPTS processor continue. ! 10327: */ ! 10328: OUTONB_STD (); ! 10329: } ! 10330: ! 10331: ! 10332: /*========================================================== ! 10333: ** ! 10334: ** G�rard's alchemy:) that deals with with the data ! 10335: ** pointer for both MDP and the residual calculation. ! 10336: ** ! 10337: **========================================================== ! 10338: ** ! 10339: ** I didn't want to bloat the code by more than 200 ! 10340: ** lignes for the handling of both MDP and the residual. ! 10341: ** This has been achieved by using a data pointer ! 10342: ** representation consisting in an index in the data ! 10343: ** array (dp_sg) and a negative offset (dp_ofs) that ! 10344: ** have the following meaning: ! 10345: ** ! 10346: ** - dp_sg = MAX_SCATTER ! 10347: ** we are at the end of the data script. ! 10348: ** - dp_sg < MAX_SCATTER ! 10349: ** dp_sg points to the next entry of the scatter array ! 10350: ** we want to transfer. ! 10351: ** - dp_ofs < 0 ! 10352: ** dp_ofs represents the residual of bytes of the ! 10353: ** previous entry scatter entry we will send first. ! 10354: ** - dp_ofs = 0 ! 10355: ** no residual to send first. ! 10356: ** ! 10357: ** The function ncr_evaluate_dp() accepts an arbitray ! 10358: ** offset (basically from the MDP message) and returns ! 10359: ** the corresponding values of dp_sg and dp_ofs. ! 10360: ** ! 10361: **---------------------------------------------------------- ! 10362: */ ! 10363: ! 10364: static int ncr_evaluate_dp(ncb_p np, ccb_p cp, u_int32 scr, int *ofs) ! 10365: { ! 10366: u_int32 dp_scr; ! 10367: int dp_ofs, dp_sg, dp_sgmin; ! 10368: int tmp; ! 10369: struct pm_ctx *pm; ! 10370: ! 10371: /* ! 10372: ** Compute the resulted data pointer in term of a script ! 10373: ** address within some DATA script and a signed byte offset. ! 10374: */ ! 10375: dp_scr = scr; ! 10376: dp_ofs = *ofs; ! 10377: if (dp_scr == NCB_SCRIPT_PHYS (np, pm0_data)) ! 10378: pm = &cp->phys.pm0; ! 10379: else if (dp_scr == NCB_SCRIPT_PHYS (np, pm1_data)) ! 10380: pm = &cp->phys.pm1; ! 10381: else ! 10382: pm = 0; ! 10383: ! 10384: if (pm) { ! 10385: dp_scr = scr_to_cpu(pm->ret); ! 10386: dp_ofs -= scr_to_cpu(pm->sg.size); ! 10387: } ! 10388: ! 10389: /* ! 10390: ** Deduce the index of the sg entry. ! 10391: ** Keep track of the index of the first valid entry. ! 10392: ** If result is dp_sg = MAX_SCATTER, then we are at the ! 10393: ** end of the data and vice-versa. ! 10394: */ ! 10395: tmp = scr_to_cpu(cp->phys.header.goalp); ! 10396: dp_sg = MAX_SCATTER; ! 10397: if (dp_scr != tmp) ! 10398: dp_sg -= (tmp - 8 - (int)dp_scr) / (SCR_SG_SIZE*4); ! 10399: dp_sgmin = MAX_SCATTER - cp->segments; ! 10400: ! 10401: /* ! 10402: ** Move to the sg entry the data pointer belongs to. ! 10403: ** ! 10404: ** If we are inside the data area, we expect result to be: ! 10405: ** ! 10406: ** Either, ! 10407: ** dp_ofs = 0 and dp_sg is the index of the sg entry ! 10408: ** the data pointer belongs to (or the end of the data) ! 10409: ** Or, ! 10410: ** dp_ofs < 0 and dp_sg is the index of the sg entry ! 10411: ** the data pointer belongs to + 1. ! 10412: */ ! 10413: if (dp_ofs < 0) { ! 10414: int n; ! 10415: while (dp_sg > dp_sgmin) { ! 10416: --dp_sg; ! 10417: tmp = scr_to_cpu(cp->phys.data[dp_sg].size); ! 10418: n = dp_ofs + (tmp & 0xffffff); ! 10419: if (n > 0) { ! 10420: ++dp_sg; ! 10421: break; ! 10422: } ! 10423: dp_ofs = n; ! 10424: } ! 10425: } ! 10426: else if (dp_ofs > 0) { ! 10427: while (dp_sg < MAX_SCATTER) { ! 10428: tmp = scr_to_cpu(cp->phys.data[dp_sg].size); ! 10429: dp_ofs -= (tmp & 0xffffff); ! 10430: ++dp_sg; ! 10431: if (dp_ofs <= 0) ! 10432: break; ! 10433: } ! 10434: } ! 10435: ! 10436: /* ! 10437: ** Make sure the data pointer is inside the data area. ! 10438: ** If not, return some error. ! 10439: */ ! 10440: if (dp_sg < dp_sgmin || (dp_sg == dp_sgmin && dp_ofs < 0)) ! 10441: goto out_err; ! 10442: else if (dp_sg > MAX_SCATTER || (dp_sg == MAX_SCATTER && dp_ofs > 0)) ! 10443: goto out_err; ! 10444: ! 10445: /* ! 10446: ** Save the extreme pointer if needed. ! 10447: */ ! 10448: if (dp_sg > cp->ext_sg || ! 10449: (dp_sg == cp->ext_sg && dp_ofs > cp->ext_ofs)) { ! 10450: cp->ext_sg = dp_sg; ! 10451: cp->ext_ofs = dp_ofs; ! 10452: } ! 10453: ! 10454: /* ! 10455: ** Return data. ! 10456: */ ! 10457: *ofs = dp_ofs; ! 10458: return dp_sg; ! 10459: ! 10460: out_err: ! 10461: return -1; ! 10462: } ! 10463: ! 10464: /*========================================================== ! 10465: ** ! 10466: ** ncr chip handler for MODIFY DATA POINTER MESSAGE ! 10467: ** ! 10468: **========================================================== ! 10469: ** ! 10470: ** We also call this function on IGNORE WIDE RESIDUE ! 10471: ** messages that do not match a SWIDE full condition. ! 10472: ** Btw, we assume in that situation that such a message ! 10473: ** is equivalent to a MODIFY DATA POINTER (offset=-1). ! 10474: ** ! 10475: **---------------------------------------------------------- ! 10476: */ ! 10477: ! 10478: static void ncr_modify_dp(ncb_p np, tcb_p tp, ccb_p cp, int ofs) ! 10479: { ! 10480: int dp_ofs = ofs; ! 10481: u_int32 dp_scr = INL (nc_temp); ! 10482: u_int32 dp_ret; ! 10483: u_int32 tmp; ! 10484: u_char hflags; ! 10485: int dp_sg; ! 10486: struct pm_ctx *pm; ! 10487: ! 10488: /* ! 10489: ** Not supported for auto_sense; ! 10490: */ ! 10491: if (cp->host_flags & HF_AUTO_SENSE) ! 10492: goto out_reject; ! 10493: ! 10494: /* ! 10495: ** Apply our alchemy:) (see comments in ncr_evaluate_dp()), ! 10496: ** to the resulted data pointer. ! 10497: */ ! 10498: dp_sg = ncr_evaluate_dp(np, cp, dp_scr, &dp_ofs); ! 10499: if (dp_sg < 0) ! 10500: goto out_reject; ! 10501: ! 10502: /* ! 10503: ** And our alchemy:) allows to easily calculate the data ! 10504: ** script address we want to return for the next data phase. ! 10505: */ ! 10506: dp_ret = cpu_to_scr(cp->phys.header.goalp); ! 10507: dp_ret = dp_ret - 8 - (MAX_SCATTER - dp_sg) * (SCR_SG_SIZE*4); ! 10508: ! 10509: /* ! 10510: ** If offset / scatter entry is zero we donnot need ! 10511: ** a context for the new current data pointer. ! 10512: */ ! 10513: if (dp_ofs == 0) { ! 10514: dp_scr = dp_ret; ! 10515: goto out_ok; ! 10516: } ! 10517: ! 10518: /* ! 10519: ** Get a context for the new current data pointer. ! 10520: */ ! 10521: hflags = INB (HF_PRT); ! 10522: ! 10523: if (hflags & HF_DP_SAVED) ! 10524: hflags ^= HF_ACT_PM; ! 10525: ! 10526: if (!(hflags & HF_ACT_PM)) { ! 10527: pm = &cp->phys.pm0; ! 10528: dp_scr = NCB_SCRIPT_PHYS (np, pm0_data); ! 10529: } ! 10530: else { ! 10531: pm = &cp->phys.pm1; ! 10532: dp_scr = NCB_SCRIPT_PHYS (np, pm1_data); ! 10533: } ! 10534: ! 10535: hflags &= ~(HF_DP_SAVED); ! 10536: ! 10537: OUTB (HF_PRT, hflags); ! 10538: ! 10539: /* ! 10540: ** Set up the new current data pointer. ! 10541: ** ofs < 0 there, and for the next data phase, we ! 10542: ** want to transfer part of the data of the sg entry ! 10543: ** corresponding to index dp_sg-1 prior to returning ! 10544: ** to the main data script. ! 10545: */ ! 10546: pm->ret = cpu_to_scr(dp_ret); ! 10547: tmp = scr_to_cpu(cp->phys.data[dp_sg-1].addr); ! 10548: tmp += scr_to_cpu(cp->phys.data[dp_sg-1].size) + dp_ofs; ! 10549: pm->sg.addr = cpu_to_scr(tmp); ! 10550: pm->sg.size = cpu_to_scr(-dp_ofs); ! 10551: ! 10552: out_ok: ! 10553: OUTL (nc_temp, dp_scr); ! 10554: OUTL_DSP (NCB_SCRIPT_PHYS (np, clrack)); ! 10555: return; ! 10556: ! 10557: out_reject: ! 10558: OUTL_DSP (NCB_SCRIPTH_PHYS (np, msg_bad)); ! 10559: } ! 10560: ! 10561: ! 10562: /*========================================================== ! 10563: ** ! 10564: ** ncr chip calculation of the data residual. ! 10565: ** ! 10566: **========================================================== ! 10567: ** ! 10568: ** As I used to say, the requirement of data residual ! 10569: ** in SCSI is broken, useless and cannot be achieved ! 10570: ** without huge complexity. ! 10571: ** But most OSes and even the official CAM require it. ! 10572: ** When stupidity happens to be so widely spread inside ! 10573: ** a community, it gets hard to convince. ! 10574: ** ! 10575: ** Anyway, I don't care, since I am not going to use ! 10576: ** any software that considers this data residual as ! 10577: ** a relevant information. :) ! 10578: ** ! 10579: **---------------------------------------------------------- ! 10580: */ ! 10581: ! 10582: static int ncr_compute_residual(ncb_p np, ccb_p cp) ! 10583: { ! 10584: int dp_sg, dp_sgmin, tmp; ! 10585: int resid=0; ! 10586: int dp_ofs = 0; ! 10587: ! 10588: /* ! 10589: * Check for some data lost or just thrown away. ! 10590: * We are not required to be quite accurate in this ! 10591: * situation. Btw, if we are odd for output and the ! 10592: * device claims some more data, it may well happen ! 10593: * than our residual be zero. :-) ! 10594: */ ! 10595: if (cp->xerr_status & (XE_EXTRA_DATA|XE_SODL_UNRUN|XE_SWIDE_OVRUN)) { ! 10596: if (cp->xerr_status & XE_EXTRA_DATA) ! 10597: resid -= cp->extra_bytes; ! 10598: if (cp->xerr_status & XE_SODL_UNRUN) ! 10599: ++resid; ! 10600: if (cp->xerr_status & XE_SWIDE_OVRUN) ! 10601: --resid; ! 10602: } ! 10603: ! 10604: ! 10605: /* ! 10606: ** If SCRIPTS reaches its goal point, then ! 10607: ** there is no additionnal residual. ! 10608: */ ! 10609: if (cp->phys.header.lastp == cp->phys.header.goalp) ! 10610: return resid; ! 10611: ! 10612: /* ! 10613: ** If the last data pointer is data_io (direction ! 10614: ** unknown), then no data transfer should have ! 10615: ** taken place. ! 10616: */ ! 10617: if (cp->phys.header.lastp == NCB_SCRIPTH_PHYS (np, data_io)) ! 10618: return cp->data_len; ! 10619: ! 10620: /* ! 10621: ** If no data transfer occurs, or if the data ! 10622: ** pointer is weird, return full residual. ! 10623: */ ! 10624: if (cp->startp == cp->phys.header.lastp || ! 10625: ncr_evaluate_dp(np, cp, scr_to_cpu(cp->phys.header.lastp), ! 10626: &dp_ofs) < 0) { ! 10627: return cp->data_len; ! 10628: } ! 10629: ! 10630: /* ! 10631: ** We are now full comfortable in the computation ! 10632: ** of the data residual (2's complement). ! 10633: */ ! 10634: dp_sgmin = MAX_SCATTER - cp->segments; ! 10635: resid = -cp->ext_ofs; ! 10636: for (dp_sg = cp->ext_sg; dp_sg < MAX_SCATTER; ++dp_sg) { ! 10637: tmp = scr_to_cpu(cp->phys.data[dp_sg].size); ! 10638: resid += (tmp & 0xffffff); ! 10639: } ! 10640: ! 10641: /* ! 10642: ** Hopefully, the result is not too wrong. ! 10643: */ ! 10644: return resid; ! 10645: } ! 10646: ! 10647: /*========================================================== ! 10648: ** ! 10649: ** Print out the containt of a SCSI message. ! 10650: ** ! 10651: **========================================================== ! 10652: */ ! 10653: ! 10654: static int ncr_show_msg (u_char * msg) ! 10655: { ! 10656: u_char i; ! 10657: printk ("%x",*msg); ! 10658: if (*msg==M_EXTENDED) { ! 10659: for (i=1;i<8;i++) { ! 10660: if (i-1>msg[1]) break; ! 10661: printk ("-%x",msg[i]); ! 10662: }; ! 10663: return (i+1); ! 10664: } else if ((*msg & 0xf0) == 0x20) { ! 10665: printk ("-%x",msg[1]); ! 10666: return (2); ! 10667: }; ! 10668: return (1); ! 10669: } ! 10670: ! 10671: static void ncr_print_msg (ccb_p cp, char *label, u_char *msg) ! 10672: { ! 10673: if (cp) ! 10674: PRINT_ADDR(cp->cmd); ! 10675: if (label) ! 10676: printk ("%s: ", label); ! 10677: ! 10678: (void) ncr_show_msg (msg); ! 10679: printk (".\n"); ! 10680: } ! 10681: ! 10682: /*=================================================================== ! 10683: ** ! 10684: ** Negotiation for WIDE and SYNCHRONOUS DATA TRANSFER. ! 10685: ** ! 10686: **=================================================================== ! 10687: ** ! 10688: ** Was Sie schon immer ueber transfermode negotiation wissen wollten ... ! 10689: ** ! 10690: ** We try to negotiate sync and wide transfer only after ! 10691: ** a successfull inquire command. We look at byte 7 of the ! 10692: ** inquire data to determine the capabilities of the target. ! 10693: ** ! 10694: ** When we try to negotiate, we append the negotiation message ! 10695: ** to the identify and (maybe) simple tag message. ! 10696: ** The host status field is set to HS_NEGOTIATE to mark this ! 10697: ** situation. ! 10698: ** ! 10699: ** If the target doesn't answer this message immediately ! 10700: ** (as required by the standard), the SIR_NEGO_FAILED interrupt ! 10701: ** will be raised eventually. ! 10702: ** The handler removes the HS_NEGOTIATE status, and sets the ! 10703: ** negotiated value to the default (async / nowide). ! 10704: ** ! 10705: ** If we receive a matching answer immediately, we check it ! 10706: ** for validity, and set the values. ! 10707: ** ! 10708: ** If we receive a Reject message immediately, we assume the ! 10709: ** negotiation has failed, and fall back to standard values. ! 10710: ** ! 10711: ** If we receive a negotiation message while not in HS_NEGOTIATE ! 10712: ** state, it's a target initiated negotiation. We prepare a ! 10713: ** (hopefully) valid answer, set our parameters, and send back ! 10714: ** this answer to the target. ! 10715: ** ! 10716: ** If the target doesn't fetch the answer (no message out phase), ! 10717: ** we assume the negotiation has failed, and fall back to default ! 10718: ** settings (SIR_NEGO_PROTO interrupt). ! 10719: ** ! 10720: ** When we set the values, we adjust them in all ccbs belonging ! 10721: ** to this target, in the controller's register, and in the "phys" ! 10722: ** field of the controller's struct ncb. ! 10723: ** ! 10724: **--------------------------------------------------------------------- ! 10725: */ ! 10726: ! 10727: /*========================================================== ! 10728: ** ! 10729: ** ncr chip handler for SYNCHRONOUS DATA TRANSFER ! 10730: ** REQUEST (SDTR) message. ! 10731: ** ! 10732: **========================================================== ! 10733: ** ! 10734: ** Read comments above. ! 10735: ** ! 10736: **---------------------------------------------------------- ! 10737: */ ! 10738: static void ncr_sync_nego(ncb_p np, tcb_p tp, ccb_p cp) ! 10739: { ! 10740: u_char scntl3, scntl4; ! 10741: u_char chg, ofs, per, fak; ! 10742: ! 10743: /* ! 10744: ** Synchronous request message received. ! 10745: */ ! 10746: ! 10747: if (DEBUG_FLAGS & DEBUG_NEGO) { ! 10748: ncr_print_msg(cp, "sync msg in", np->msgin); ! 10749: }; ! 10750: ! 10751: /* ! 10752: ** get requested values. ! 10753: */ ! 10754: ! 10755: chg = 0; ! 10756: per = np->msgin[3]; ! 10757: ofs = np->msgin[4]; ! 10758: if (ofs==0) per=255; ! 10759: ! 10760: /* ! 10761: ** if target sends SDTR message, ! 10762: ** it CAN transfer synch. ! 10763: */ ! 10764: ! 10765: if (ofs) ! 10766: tp->inq_byte7 |= INQ7_SYNC; ! 10767: ! 10768: /* ! 10769: ** check values against driver limits. ! 10770: */ ! 10771: ! 10772: if (per < np->minsync) ! 10773: {chg = 1; per = np->minsync;} ! 10774: if (per < tp->minsync) ! 10775: {chg = 1; per = tp->minsync;} ! 10776: if (ofs > tp->maxoffs) ! 10777: {chg = 1; ofs = tp->maxoffs;} ! 10778: ! 10779: /* ! 10780: ** Check against controller limits. ! 10781: */ ! 10782: fak = 7; ! 10783: scntl3 = 0; ! 10784: scntl4 = 0; ! 10785: if (ofs != 0) { ! 10786: ncr_getsync(np, per, &fak, &scntl3); ! 10787: if (fak > 7) { ! 10788: chg = 1; ! 10789: ofs = 0; ! 10790: } ! 10791: } ! 10792: if (ofs == 0) { ! 10793: fak = 7; ! 10794: per = 0; ! 10795: scntl3 = 0; ! 10796: scntl4 = 0; ! 10797: tp->minsync = 0; ! 10798: } ! 10799: ! 10800: if (DEBUG_FLAGS & DEBUG_NEGO) { ! 10801: PRINT_ADDR(cp->cmd); ! 10802: printk ("sync: per=%d scntl3=0x%x scntl4=0x%x ofs=%d fak=%d chg=%d.\n", ! 10803: per, scntl3, scntl4, ofs, fak, chg); ! 10804: } ! 10805: ! 10806: if (INB (HS_PRT) == HS_NEGOTIATE) { ! 10807: OUTB (HS_PRT, HS_BUSY); ! 10808: switch (cp->nego_status) { ! 10809: case NS_SYNC: ! 10810: /* ! 10811: ** This was an answer message ! 10812: */ ! 10813: if (chg) { ! 10814: /* ! 10815: ** Answer wasn't acceptable. ! 10816: */ ! 10817: ncr_setsync (np, cp, 0, 0xe0, 0); ! 10818: OUTL_DSP (NCB_SCRIPTH_PHYS (np, msg_bad)); ! 10819: } else { ! 10820: /* ! 10821: ** Answer is ok. ! 10822: */ ! 10823: if ((np->device_id != PCI_DEVICE_ID_LSI_53C1010) && ! 10824: (np->device_id != PCI_DEVICE_ID_LSI_53C1010_66)) ! 10825: ncr_setsync (np, cp, scntl3, (fak<<5)|ofs,0); ! 10826: else ! 10827: ncr_setsync (np, cp, scntl3, ofs, scntl4); ! 10828: ! 10829: OUTL_DSP (NCB_SCRIPT_PHYS (np, clrack)); ! 10830: }; ! 10831: return; ! 10832: ! 10833: case NS_WIDE: ! 10834: ncr_setwide (np, cp, 0, 0); ! 10835: break; ! 10836: }; ! 10837: }; ! 10838: ! 10839: /* ! 10840: ** It was a request. Set value and ! 10841: ** prepare an answer message ! 10842: */ ! 10843: ! 10844: if ((np->device_id != PCI_DEVICE_ID_LSI_53C1010) && ! 10845: (np->device_id != PCI_DEVICE_ID_LSI_53C1010_66)) ! 10846: ncr_setsync (np, cp, scntl3, (fak<<5)|ofs,0); ! 10847: else ! 10848: ncr_setsync (np, cp, scntl3, ofs, scntl4); ! 10849: ! 10850: np->msgout[0] = M_EXTENDED; ! 10851: np->msgout[1] = 3; ! 10852: np->msgout[2] = M_X_SYNC_REQ; ! 10853: np->msgout[3] = per; ! 10854: np->msgout[4] = ofs; ! 10855: ! 10856: cp->nego_status = NS_SYNC; ! 10857: ! 10858: if (DEBUG_FLAGS & DEBUG_NEGO) { ! 10859: ncr_print_msg(cp, "sync msgout", np->msgout); ! 10860: } ! 10861: ! 10862: np->msgin [0] = M_NOOP; ! 10863: ! 10864: if (!ofs) ! 10865: OUTL_DSP (NCB_SCRIPTH_PHYS (np, msg_bad)); ! 10866: else ! 10867: OUTL_DSP (NCB_SCRIPTH_PHYS (np, sdtr_resp)); ! 10868: } ! 10869: ! 10870: /*========================================================== ! 10871: ** ! 10872: ** ncr chip handler for WIDE DATA TRANSFER REQUEST ! 10873: ** (WDTR) message. ! 10874: ** ! 10875: **========================================================== ! 10876: ** ! 10877: ** Read comments above. ! 10878: ** ! 10879: **---------------------------------------------------------- ! 10880: */ ! 10881: static void ncr_wide_nego(ncb_p np, tcb_p tp, ccb_p cp) ! 10882: { ! 10883: u_char chg, wide; ! 10884: ! 10885: /* ! 10886: ** Wide request message received. ! 10887: */ ! 10888: if (DEBUG_FLAGS & DEBUG_NEGO) { ! 10889: ncr_print_msg(cp, "wide msgin", np->msgin); ! 10890: }; ! 10891: ! 10892: /* ! 10893: ** get requested values. ! 10894: */ ! 10895: ! 10896: chg = 0; ! 10897: wide = np->msgin[3]; ! 10898: ! 10899: /* ! 10900: ** if target sends WDTR message, ! 10901: ** it CAN transfer wide. ! 10902: */ ! 10903: ! 10904: if (wide) ! 10905: tp->inq_byte7 |= INQ7_WIDE16; ! 10906: ! 10907: /* ! 10908: ** check values against driver limits. ! 10909: */ ! 10910: ! 10911: if (wide > tp->usrwide) ! 10912: {chg = 1; wide = tp->usrwide;} ! 10913: ! 10914: if (DEBUG_FLAGS & DEBUG_NEGO) { ! 10915: PRINT_ADDR(cp->cmd); ! 10916: printk ("wide: wide=%d chg=%d.\n", wide, chg); ! 10917: } ! 10918: ! 10919: if (INB (HS_PRT) == HS_NEGOTIATE) { ! 10920: OUTB (HS_PRT, HS_BUSY); ! 10921: switch (cp->nego_status) { ! 10922: case NS_WIDE: ! 10923: /* ! 10924: ** This was an answer message ! 10925: */ ! 10926: if (chg) { ! 10927: /* ! 10928: ** Answer wasn't acceptable. ! 10929: */ ! 10930: ncr_setwide (np, cp, 0, 1); ! 10931: OUTL_DSP (NCB_SCRIPTH_PHYS (np, msg_bad)); ! 10932: } else { ! 10933: /* ! 10934: ** Answer is ok. ! 10935: */ ! 10936: ncr_setwide (np, cp, wide, 1); ! 10937: OUTL_DSP (NCB_SCRIPT_PHYS (np, clrack)); ! 10938: }; ! 10939: return; ! 10940: ! 10941: case NS_SYNC: ! 10942: ncr_setsync (np, cp, 0, 0xe0, 0); ! 10943: break; ! 10944: }; ! 10945: }; ! 10946: ! 10947: /* ! 10948: ** It was a request, set value and ! 10949: ** prepare an answer message ! 10950: */ ! 10951: ! 10952: ncr_setwide (np, cp, wide, 1); ! 10953: ! 10954: np->msgout[0] = M_EXTENDED; ! 10955: np->msgout[1] = 2; ! 10956: np->msgout[2] = M_X_WIDE_REQ; ! 10957: np->msgout[3] = wide; ! 10958: ! 10959: np->msgin [0] = M_NOOP; ! 10960: ! 10961: cp->nego_status = NS_WIDE; ! 10962: ! 10963: if (DEBUG_FLAGS & DEBUG_NEGO) { ! 10964: ncr_print_msg(cp, "wide msgout", np->msgout); ! 10965: } ! 10966: ! 10967: OUTL_DSP (NCB_SCRIPTH_PHYS (np, wdtr_resp)); ! 10968: } ! 10969: /*========================================================== ! 10970: ** ! 10971: ** ncr chip handler for PARALLEL PROTOCOL REQUEST ! 10972: ** (PPR) message. ! 10973: ** ! 10974: **========================================================== ! 10975: ** ! 10976: ** Read comments above. ! 10977: ** ! 10978: **---------------------------------------------------------- ! 10979: */ ! 10980: static void ncr_ppr_nego(ncb_p np, tcb_p tp, ccb_p cp) ! 10981: { ! 10982: u_char scntl3, scntl4; ! 10983: u_char chg, ofs, per, fak, wth, dt; ! 10984: ! 10985: /* ! 10986: ** PPR message received. ! 10987: */ ! 10988: ! 10989: if (DEBUG_FLAGS & DEBUG_NEGO) { ! 10990: ncr_print_msg(cp, "ppr msg in", np->msgin); ! 10991: }; ! 10992: ! 10993: /* ! 10994: ** get requested values. ! 10995: */ ! 10996: ! 10997: chg = 0; ! 10998: per = np->msgin[3]; ! 10999: ofs = np->msgin[5]; ! 11000: wth = np->msgin[6]; ! 11001: dt = np->msgin[7]; ! 11002: if (ofs==0) per=255; ! 11003: ! 11004: /* ! 11005: ** if target sends sync (wide), ! 11006: ** it CAN transfer synch (wide). ! 11007: */ ! 11008: ! 11009: if (ofs) ! 11010: tp->inq_byte7 |= INQ7_SYNC; ! 11011: ! 11012: if (wth) ! 11013: tp->inq_byte7 |= INQ7_WIDE16; ! 11014: ! 11015: /* ! 11016: ** check values against driver limits. ! 11017: */ ! 11018: ! 11019: if (wth > tp->usrwide) ! 11020: {chg = 1; wth = tp->usrwide;} ! 11021: if (per < np->minsync) ! 11022: {chg = 1; per = np->minsync;} ! 11023: if (per < tp->minsync) ! 11024: {chg = 1; per = tp->minsync;} ! 11025: if (ofs > tp->maxoffs) ! 11026: {chg = 1; ofs = tp->maxoffs;} ! 11027: ! 11028: /* ! 11029: ** Check against controller limits. ! 11030: */ ! 11031: fak = 7; ! 11032: scntl3 = 0; ! 11033: scntl4 = 0; ! 11034: if (ofs != 0) { ! 11035: scntl4 = dt ? 0x80 : 0; ! 11036: ncr_getsync(np, per, &fak, &scntl3); ! 11037: if (fak > 7) { ! 11038: chg = 1; ! 11039: ofs = 0; ! 11040: } ! 11041: } ! 11042: if (ofs == 0) { ! 11043: fak = 7; ! 11044: per = 0; ! 11045: scntl3 = 0; ! 11046: scntl4 = 0; ! 11047: tp->minsync = 0; ! 11048: } ! 11049: ! 11050: /* ! 11051: ** If target responds with Ultra 3 speed ! 11052: ** but narrow or not DT, reject. ! 11053: ** If target responds with DT request ! 11054: ** but not Ultra3 speeds, reject message, ! 11055: ** reset min sync for target to 0x0A and ! 11056: ** set flags to re-negotiate. ! 11057: */ ! 11058: ! 11059: if ((per == 0x09) && ofs && (!wth || !dt)) ! 11060: chg = 1; ! 11061: else if (( (per > 0x09) && dt) ) ! 11062: chg = 2; ! 11063: ! 11064: ! 11065: if (DEBUG_FLAGS & DEBUG_NEGO) { ! 11066: PRINT_ADDR(cp->cmd); ! 11067: printk ("ppr: wth=%d per=%d scntl3=0x%x scntl4=0x%x ofs=%d fak=%d chg=%d.\n", ! 11068: wth, per, scntl3, scntl4, ofs, fak, chg); ! 11069: } ! 11070: ! 11071: if (INB (HS_PRT) == HS_NEGOTIATE) { ! 11072: OUTB (HS_PRT, HS_BUSY); ! 11073: switch (cp->nego_status) { ! 11074: case NS_PPR: ! 11075: /* ! 11076: ** This was an answer message ! 11077: */ ! 11078: if (chg) { ! 11079: /* ! 11080: ** Answer wasn't acceptable. ! 11081: */ ! 11082: if (chg == 2) { ! 11083: /* Send message reject and reset flags for ! 11084: ** host to re-negotiate with min period 0x0A. ! 11085: */ ! 11086: tp->minsync = 0x0A; ! 11087: tp->period = 0; ! 11088: tp->widedone = 0; ! 11089: } ! 11090: ncr_setsyncwide (np, cp, 0, 0xe0, 0, 0); ! 11091: OUTL_DSP (NCB_SCRIPTH_PHYS (np, msg_bad)); ! 11092: } else { ! 11093: /* ! 11094: ** Answer is ok. ! 11095: */ ! 11096: ! 11097: if ((np->device_id != PCI_DEVICE_ID_LSI_53C1010) && ! 11098: (np->device_id != PCI_DEVICE_ID_LSI_53C1010_66)) ! 11099: ncr_setsyncwide (np, cp, scntl3, (fak<<5)|ofs,0, wth); ! 11100: else ! 11101: ncr_setsyncwide (np, cp, scntl3, ofs, scntl4, wth); ! 11102: ! 11103: OUTL_DSP (NCB_SCRIPT_PHYS (np, clrack)); ! 11104: ! 11105: }; ! 11106: return; ! 11107: ! 11108: case NS_SYNC: ! 11109: ncr_setsync (np, cp, 0, 0xe0, 0); ! 11110: break; ! 11111: ! 11112: case NS_WIDE: ! 11113: ncr_setwide (np, cp, 0, 0); ! 11114: break; ! 11115: }; ! 11116: }; ! 11117: ! 11118: /* ! 11119: ** It was a request. Set value and ! 11120: ** prepare an answer message ! 11121: ** ! 11122: ** If narrow or not DT and requesting Ultra3 ! 11123: ** slow the bus down and force ST. If not ! 11124: ** requesting Ultra3, force ST. ! 11125: ** Max offset is 31=0x1f if ST mode. ! 11126: */ ! 11127: ! 11128: if ((per == 0x09) && ofs && (!wth || !dt)) { ! 11129: per = 0x0A; ! 11130: dt = 0; ! 11131: ofs &= 0x1f; ! 11132: } ! 11133: else if ( (per > 0x09) && dt) { ! 11134: dt = 0; ! 11135: ofs &= 0x1f; ! 11136: } ! 11137: ! 11138: if ((np->device_id != PCI_DEVICE_ID_LSI_53C1010) && ! 11139: (np->device_id != PCI_DEVICE_ID_LSI_53C1010_66)) ! 11140: ncr_setsyncwide (np, cp, scntl3, (fak<<5)|ofs,0, wth); ! 11141: else ! 11142: ncr_setsyncwide (np, cp, scntl3, ofs, scntl4, wth); ! 11143: ! 11144: np->msgout[0] = M_EXTENDED; ! 11145: np->msgout[1] = 6; ! 11146: np->msgout[2] = M_X_PPR_REQ; ! 11147: np->msgout[3] = per; ! 11148: np->msgout[4] = 0; ! 11149: np->msgout[5] = ofs; ! 11150: np->msgout[6] = wth; ! 11151: np->msgout[7] = dt; ! 11152: ! 11153: cp->nego_status = NS_PPR; ! 11154: ! 11155: if (DEBUG_FLAGS & DEBUG_NEGO) { ! 11156: ncr_print_msg(cp, "ppr msgout", np->msgout); ! 11157: } ! 11158: ! 11159: np->msgin [0] = M_NOOP; ! 11160: ! 11161: if (!ofs) ! 11162: OUTL_DSP (NCB_SCRIPTH_PHYS (np, msg_bad)); ! 11163: else ! 11164: OUTL_DSP (NCB_SCRIPTH_PHYS (np, ppr_resp)); ! 11165: } ! 11166: ! 11167: ! 11168: ! 11169: /* ! 11170: ** Reset SYNC or WIDE to default settings. ! 11171: ** Called when a negotiation does not succeed either ! 11172: ** on rejection or on protocol error. ! 11173: */ ! 11174: static void ncr_nego_default(ncb_p np, tcb_p tp, ccb_p cp) ! 11175: { ! 11176: /* ! 11177: ** any error in negotiation: ! 11178: ** fall back to default mode. ! 11179: */ ! 11180: switch (cp->nego_status) { ! 11181: ! 11182: case NS_SYNC: ! 11183: ncr_setsync (np, cp, 0, 0xe0, 0); ! 11184: break; ! 11185: ! 11186: case NS_WIDE: ! 11187: ncr_setwide (np, cp, 0, 0); ! 11188: break; ! 11189: ! 11190: case NS_PPR: ! 11191: /* ! 11192: * ppr_negotiation is set to 1 on the first ppr nego command. ! 11193: * If ppr is successful, it is reset to 2. ! 11194: * If unsuccessful it is reset to 0. ! 11195: */ ! 11196: if (DEBUG_FLAGS & DEBUG_NEGO) { ! 11197: tcb_p tp=&np->target[cp->target]; ! 11198: u_char factor, offset, width; ! 11199: ! 11200: ncr_get_xfer_info ( np, tp, &factor, &offset, &width); ! 11201: ! 11202: printk("Current factor %d offset %d width %d\n", ! 11203: factor, offset, width); ! 11204: } ! 11205: if (tp->ppr_negotiation == 2) ! 11206: ncr_setsyncwide (np, cp, 0, 0xe0, 0, 0); ! 11207: else if (tp->ppr_negotiation == 1) { ! 11208: ! 11209: /* First ppr command has received a M REJECT. ! 11210: * Do not change the existing wide/sync parameter ! 11211: * values (asyn/narrow if this as the first nego; ! 11212: * may be different if target initiates nego.). ! 11213: */ ! 11214: tp->ppr_negotiation = 0; ! 11215: } ! 11216: else ! 11217: { ! 11218: tp->ppr_negotiation = 0; ! 11219: ncr_setwide (np, cp, 0, 0); ! 11220: } ! 11221: break; ! 11222: }; ! 11223: np->msgin [0] = M_NOOP; ! 11224: np->msgout[0] = M_NOOP; ! 11225: cp->nego_status = 0; ! 11226: } ! 11227: ! 11228: /*========================================================== ! 11229: ** ! 11230: ** ncr chip handler for MESSAGE REJECT received for ! 11231: ** a WIDE or SYNCHRONOUS negotiation. ! 11232: ** ! 11233: ** clear the PPR negotiation flag, all future nego. ! 11234: ** will be SDTR and WDTR ! 11235: ** ! 11236: **========================================================== ! 11237: ** ! 11238: ** Read comments above. ! 11239: ** ! 11240: **---------------------------------------------------------- ! 11241: */ ! 11242: static void ncr_nego_rejected(ncb_p np, tcb_p tp, ccb_p cp) ! 11243: { ! 11244: ncr_nego_default(np, tp, cp); ! 11245: OUTB (HS_PRT, HS_BUSY); ! 11246: } ! 11247: ! 11248: ! 11249: /*========================================================== ! 11250: ** ! 11251: ** ! 11252: ** ncr chip exception handler for programmed interrupts. ! 11253: ** ! 11254: ** ! 11255: **========================================================== ! 11256: */ ! 11257: ! 11258: void ncr_int_sir (ncb_p np) ! 11259: { ! 11260: u_char num = INB (nc_dsps); ! 11261: u_long dsa = INL (nc_dsa); ! 11262: ccb_p cp = ncr_ccb_from_dsa(np, dsa); ! 11263: u_char target = INB (nc_sdid) & 0x0f; ! 11264: tcb_p tp = &np->target[target]; ! 11265: int tmp; ! 11266: ! 11267: if (DEBUG_FLAGS & DEBUG_TINY) printk ("I#%d", num); ! 11268: ! 11269: switch (num) { ! 11270: /* ! 11271: ** See comments in the SCRIPTS code. ! 11272: */ ! 11273: #ifdef SCSI_NCR_PCIQ_SYNC_ON_INTR ! 11274: case SIR_DUMMY_INTERRUPT: ! 11275: goto out; ! 11276: #endif ! 11277: ! 11278: /* ! 11279: ** The C code is currently trying to recover from something. ! 11280: ** Typically, user want to abort some command. ! 11281: */ ! 11282: case SIR_SCRIPT_STOPPED: ! 11283: case SIR_TARGET_SELECTED: ! 11284: case SIR_ABORT_SENT: ! 11285: case SIR_AUTO_SENSE_DONE: ! 11286: ncr_sir_task_recovery(np, num); ! 11287: return; ! 11288: /* ! 11289: ** The device didn't go to MSG OUT phase after having ! 11290: ** been selected with ATN. We donnot want to handle ! 11291: ** that. ! 11292: */ ! 11293: case SIR_SEL_ATN_NO_MSG_OUT: ! 11294: printk ("%s:%d: No MSG OUT phase after selection with ATN.\n", ! 11295: ncr_name (np), target); ! 11296: goto out_stuck; ! 11297: /* ! 11298: ** The device didn't switch to MSG IN phase after ! 11299: ** having reseleted the initiator. ! 11300: */ ! 11301: case SIR_RESEL_NO_MSG_IN: ! 11302: /* ! 11303: ** After reselection, the device sent a message that wasn't ! 11304: ** an IDENTIFY. ! 11305: */ ! 11306: case SIR_RESEL_NO_IDENTIFY: ! 11307: /* ! 11308: ** If devices reselecting without sending an IDENTIFY ! 11309: ** message still exist, this should help. ! 11310: ** We just assume lun=0, 1 CCB, no tag. ! 11311: */ ! 11312: if (tp->l0p) { ! 11313: OUTL (nc_dsa, scr_to_cpu(tp->l0p->tasktbl[0])); ! 11314: OUTL_DSP (NCB_SCRIPT_PHYS (np, resel_go)); ! 11315: return; ! 11316: } ! 11317: /* ! 11318: ** The device reselected a LUN we donnot know of. ! 11319: */ ! 11320: case SIR_RESEL_BAD_LUN: ! 11321: np->msgout[0] = M_RESET; ! 11322: goto out; ! 11323: /* ! 11324: ** The device reselected for an untagged nexus and we ! 11325: ** haven't any. ! 11326: */ ! 11327: case SIR_RESEL_BAD_I_T_L: ! 11328: np->msgout[0] = M_ABORT; ! 11329: goto out; ! 11330: /* ! 11331: ** The device reselected for a tagged nexus that we donnot ! 11332: ** have. ! 11333: */ ! 11334: case SIR_RESEL_BAD_I_T_L_Q: ! 11335: np->msgout[0] = M_ABORT_TAG; ! 11336: goto out; ! 11337: /* ! 11338: ** The SCRIPTS let us know that the device has grabbed ! 11339: ** our message and will abort the job. ! 11340: */ ! 11341: case SIR_RESEL_ABORTED: ! 11342: np->lastmsg = np->msgout[0]; ! 11343: np->msgout[0] = M_NOOP; ! 11344: printk ("%s:%d: message %x sent on bad reselection.\n", ! 11345: ncr_name (np), target, np->lastmsg); ! 11346: goto out; ! 11347: /* ! 11348: ** The SCRIPTS let us know that a message has been ! 11349: ** successfully sent to the device. ! 11350: */ ! 11351: case SIR_MSG_OUT_DONE: ! 11352: np->lastmsg = np->msgout[0]; ! 11353: np->msgout[0] = M_NOOP; ! 11354: /* Should we really care of that */ ! 11355: if (np->lastmsg == M_PARITY || np->lastmsg == M_ID_ERROR) { ! 11356: if (cp) { ! 11357: cp->xerr_status &= ~XE_PARITY_ERR; ! 11358: if (!cp->xerr_status) ! 11359: OUTOFFB (HF_PRT, HF_EXT_ERR); ! 11360: } ! 11361: } ! 11362: goto out; ! 11363: /* ! 11364: ** The device didn't send a GOOD SCSI status. ! 11365: ** We may have some work to do prior to allow ! 11366: ** the SCRIPTS processor to continue. ! 11367: */ ! 11368: case SIR_BAD_STATUS: ! 11369: if (!cp) ! 11370: goto out; ! 11371: ncr_sir_to_redo(np, num, cp); ! 11372: return; ! 11373: /* ! 11374: ** We are asked by the SCRIPTS to prepare a ! 11375: ** REJECT message. ! 11376: */ ! 11377: case SIR_REJECT_TO_SEND: ! 11378: ncr_print_msg(cp, "M_REJECT to send for ", np->msgin); ! 11379: np->msgout[0] = M_REJECT; ! 11380: goto out; ! 11381: /* ! 11382: ** We have been ODD at the end of a DATA IN ! 11383: ** transfer and the device didn't send a ! 11384: ** IGNORE WIDE RESIDUE message. ! 11385: ** It is a data overrun condition. ! 11386: */ ! 11387: case SIR_SWIDE_OVERRUN: ! 11388: if (cp) { ! 11389: OUTONB (HF_PRT, HF_EXT_ERR); ! 11390: cp->xerr_status |= XE_SWIDE_OVRUN; ! 11391: } ! 11392: goto out; ! 11393: /* ! 11394: ** We have been ODD at the end of a DATA OUT ! 11395: ** transfer. ! 11396: ** It is a data underrun condition. ! 11397: */ ! 11398: case SIR_SODL_UNDERRUN: ! 11399: if (cp) { ! 11400: OUTONB (HF_PRT, HF_EXT_ERR); ! 11401: cp->xerr_status |= XE_SODL_UNRUN; ! 11402: } ! 11403: goto out; ! 11404: /* ! 11405: ** The device wants us to tranfer more data than ! 11406: ** expected or in the wrong direction. ! 11407: ** The number of extra bytes is in scratcha. ! 11408: ** It is a data overrun condition. ! 11409: */ ! 11410: case SIR_DATA_OVERRUN: ! 11411: if (cp) { ! 11412: OUTONB (HF_PRT, HF_EXT_ERR); ! 11413: cp->xerr_status |= XE_EXTRA_DATA; ! 11414: cp->extra_bytes += INL (nc_scratcha); ! 11415: } ! 11416: goto out; ! 11417: /* ! 11418: ** The device switched to an illegal phase (4/5). ! 11419: */ ! 11420: case SIR_BAD_PHASE: ! 11421: if (cp) { ! 11422: OUTONB (HF_PRT, HF_EXT_ERR); ! 11423: cp->xerr_status |= XE_BAD_PHASE; ! 11424: } ! 11425: goto out; ! 11426: /* ! 11427: ** We received a message. ! 11428: */ ! 11429: case SIR_MSG_RECEIVED: ! 11430: if (!cp) ! 11431: goto out_stuck; ! 11432: switch (np->msgin [0]) { ! 11433: /* ! 11434: ** We received an extended message. ! 11435: ** We handle MODIFY DATA POINTER, SDTR, WDTR ! 11436: ** and reject all other extended messages. ! 11437: */ ! 11438: case M_EXTENDED: ! 11439: switch (np->msgin [2]) { ! 11440: case M_X_MODIFY_DP: ! 11441: if (DEBUG_FLAGS & DEBUG_POINTER) ! 11442: ncr_print_msg(cp,"modify DP",np->msgin); ! 11443: tmp = (np->msgin[3]<<24) + (np->msgin[4]<<16) + ! 11444: (np->msgin[5]<<8) + (np->msgin[6]); ! 11445: ncr_modify_dp(np, tp, cp, tmp); ! 11446: return; ! 11447: case M_X_SYNC_REQ: ! 11448: ncr_sync_nego(np, tp, cp); ! 11449: return; ! 11450: case M_X_WIDE_REQ: ! 11451: ncr_wide_nego(np, tp, cp); ! 11452: return; ! 11453: case M_X_PPR_REQ: ! 11454: ncr_ppr_nego(np, tp, cp); ! 11455: return; ! 11456: default: ! 11457: goto out_reject; ! 11458: } ! 11459: break; ! 11460: /* ! 11461: ** We received a 1/2 byte message not handled from SCRIPTS. ! 11462: ** We are only expecting MESSAGE REJECT and IGNORE WIDE ! 11463: ** RESIDUE messages that haven't been anticipated by ! 11464: ** SCRIPTS on SWIDE full condition. Unanticipated IGNORE ! 11465: ** WIDE RESIDUE messages are aliased as MODIFY DP (-1). ! 11466: */ ! 11467: case M_IGN_RESIDUE: ! 11468: if (DEBUG_FLAGS & DEBUG_POINTER) ! 11469: ncr_print_msg(cp,"ign wide residue", np->msgin); ! 11470: ncr_modify_dp(np, tp, cp, -1); ! 11471: return; ! 11472: case M_REJECT: ! 11473: if (INB (HS_PRT) == HS_NEGOTIATE) ! 11474: ncr_nego_rejected(np, tp, cp); ! 11475: else { ! 11476: PRINT_ADDR(cp->cmd); ! 11477: printk ("M_REJECT received (%x:%x).\n", ! 11478: scr_to_cpu(np->lastmsg), np->msgout[0]); ! 11479: } ! 11480: goto out_clrack; ! 11481: break; ! 11482: default: ! 11483: goto out_reject; ! 11484: } ! 11485: break; ! 11486: /* ! 11487: ** We received an unknown message. ! 11488: ** Ignore all MSG IN phases and reject it. ! 11489: */ ! 11490: case SIR_MSG_WEIRD: ! 11491: ncr_print_msg(cp, "WEIRD message received", np->msgin); ! 11492: OUTL_DSP (NCB_SCRIPTH_PHYS (np, msg_weird)); ! 11493: return; ! 11494: /* ! 11495: ** Negotiation failed. ! 11496: ** Target does not send us the reply. ! 11497: ** Remove the HS_NEGOTIATE status. ! 11498: */ ! 11499: case SIR_NEGO_FAILED: ! 11500: OUTB (HS_PRT, HS_BUSY); ! 11501: /* ! 11502: ** Negotiation failed. ! 11503: ** Target does not want answer message. ! 11504: */ ! 11505: case SIR_NEGO_PROTO: ! 11506: ncr_nego_default(np, tp, cp); ! 11507: goto out; ! 11508: }; ! 11509: ! 11510: out: ! 11511: OUTONB_STD (); ! 11512: return; ! 11513: out_reject: ! 11514: OUTL_DSP (NCB_SCRIPTH_PHYS (np, msg_bad)); ! 11515: return; ! 11516: out_clrack: ! 11517: OUTL_DSP (NCB_SCRIPT_PHYS (np, clrack)); ! 11518: return; ! 11519: out_stuck: ! 11520: return; ! 11521: } ! 11522: ! 11523: ! 11524: /*========================================================== ! 11525: ** ! 11526: ** ! 11527: ** Aquire a control block ! 11528: ** ! 11529: ** ! 11530: **========================================================== ! 11531: */ ! 11532: ! 11533: static ccb_p ncr_get_ccb (ncb_p np, u_char tn, u_char ln) ! 11534: { ! 11535: tcb_p tp = &np->target[tn]; ! 11536: lcb_p lp = ncr_lp(np, tp, ln); ! 11537: u_short tag = NO_TAG; ! 11538: XPT_QUEHEAD *qp; ! 11539: ccb_p cp = (ccb_p) 0; ! 11540: ! 11541: /* ! 11542: ** Allocate a new CCB if needed. ! 11543: */ ! 11544: if (xpt_que_empty(&np->free_ccbq)) ! 11545: (void) ncr_alloc_ccb(np); ! 11546: ! 11547: /* ! 11548: ** Look for a free CCB ! 11549: */ ! 11550: qp = xpt_remque_head(&np->free_ccbq); ! 11551: if (!qp) ! 11552: goto out; ! 11553: cp = xpt_que_entry(qp, struct ccb, link_ccbq); ! 11554: ! 11555: /* ! 11556: ** If the LCB is not yet available and we already ! 11557: ** have queued a CCB for a LUN without LCB, ! 11558: ** give up. Otherwise all is fine. :-) ! 11559: */ ! 11560: if (!lp) { ! 11561: if (xpt_que_empty(&np->b0_ccbq)) ! 11562: xpt_insque_head(&cp->link_ccbq, &np->b0_ccbq); ! 11563: else ! 11564: goto out_free; ! 11565: } else { ! 11566: /* ! 11567: ** Tune tag mode if asked by user. ! 11568: */ ! 11569: if (lp->queuedepth != lp->numtags) { ! 11570: ncr_setup_tags(np, tn, ln); ! 11571: } ! 11572: ! 11573: /* ! 11574: ** Get a tag for this nexus if required. ! 11575: ** Keep from using more tags than we can handle. ! 11576: */ ! 11577: if (lp->usetags) { ! 11578: if (lp->busyccbs < lp->maxnxs) { ! 11579: tag = lp->cb_tags[lp->ia_tag]; ! 11580: ++lp->ia_tag; ! 11581: if (lp->ia_tag == MAX_TAGS) ! 11582: lp->ia_tag = 0; ! 11583: cp->tags_si = lp->tags_si; ! 11584: ++lp->tags_sum[cp->tags_si]; ! 11585: } ! 11586: else ! 11587: goto out_free; ! 11588: } ! 11589: ! 11590: /* ! 11591: ** Put the CCB in the LUN wait queue and ! 11592: ** count it as busy. ! 11593: */ ! 11594: xpt_insque_tail(&cp->link_ccbq, &lp->wait_ccbq); ! 11595: ++lp->busyccbs; ! 11596: } ! 11597: ! 11598: /* ! 11599: ** Remember all informations needed to free this CCB. ! 11600: */ ! 11601: cp->to_abort = 0; ! 11602: cp->tag = tag; ! 11603: cp->target = tn; ! 11604: cp->lun = ln; ! 11605: ! 11606: if (DEBUG_FLAGS & DEBUG_TAGS) { ! 11607: PRINT_LUN(np, tn, ln); ! 11608: printk ("ccb @%p using tag %d.\n", cp, tag); ! 11609: } ! 11610: ! 11611: out: ! 11612: return cp; ! 11613: out_free: ! 11614: xpt_insque_head(&cp->link_ccbq, &np->free_ccbq); ! 11615: return (ccb_p) 0; ! 11616: } ! 11617: ! 11618: /*========================================================== ! 11619: ** ! 11620: ** ! 11621: ** Release one control block ! 11622: ** ! 11623: ** ! 11624: **========================================================== ! 11625: */ ! 11626: ! 11627: static void ncr_free_ccb (ncb_p np, ccb_p cp) ! 11628: { ! 11629: tcb_p tp = &np->target[cp->target]; ! 11630: lcb_p lp = ncr_lp(np, tp, cp->lun); ! 11631: ! 11632: if (DEBUG_FLAGS & DEBUG_TAGS) { ! 11633: PRINT_LUN(np, cp->target, cp->lun); ! 11634: printk ("ccb @%p freeing tag %d.\n", cp, cp->tag); ! 11635: } ! 11636: ! 11637: /* ! 11638: ** If lun control block available, make available ! 11639: ** the task slot and the tag if any. ! 11640: ** Decrement counters. ! 11641: */ ! 11642: if (lp) { ! 11643: if (cp->tag != NO_TAG) { ! 11644: lp->cb_tags[lp->if_tag++] = cp->tag; ! 11645: if (lp->if_tag == MAX_TAGS) ! 11646: lp->if_tag = 0; ! 11647: --lp->tags_sum[cp->tags_si]; ! 11648: lp->tasktbl[cp->tag] = cpu_to_scr(np->p_bad_i_t_l_q); ! 11649: } else { ! 11650: lp->tasktbl[0] = cpu_to_scr(np->p_bad_i_t_l); ! 11651: } ! 11652: --lp->busyccbs; ! 11653: if (cp->queued) { ! 11654: --lp->queuedccbs; ! 11655: } ! 11656: } ! 11657: ! 11658: /* ! 11659: ** Make this CCB available. ! 11660: */ ! 11661: xpt_remque(&cp->link_ccbq); ! 11662: xpt_insque_head(&cp->link_ccbq, &np->free_ccbq); ! 11663: cp -> host_status = HS_IDLE; ! 11664: cp -> queued = 0; ! 11665: } ! 11666: ! 11667: /*------------------------------------------------------------------------ ! 11668: ** Allocate a CCB and initialize its fixed part. ! 11669: **------------------------------------------------------------------------ ! 11670: **------------------------------------------------------------------------ ! 11671: */ ! 11672: static ccb_p ncr_alloc_ccb(ncb_p np) ! 11673: { ! 11674: ccb_p cp = 0; ! 11675: int hcode; ! 11676: ! 11677: /* ! 11678: ** Allocate memory for this CCB. ! 11679: */ ! 11680: cp = m_calloc_dma(sizeof(struct ccb), "CCB"); ! 11681: if (!cp) ! 11682: return 0; ! 11683: ! 11684: /* ! 11685: ** Count it and initialyze it. ! 11686: */ ! 11687: np->actccbs++; ! 11688: ! 11689: /* ! 11690: ** Remember virtual and bus address of this ccb. ! 11691: */ ! 11692: cp->p_ccb = vtobus(cp); ! 11693: ! 11694: /* ! 11695: ** Insert this ccb into the hashed list. ! 11696: */ ! 11697: hcode = CCB_HASH_CODE(cp->p_ccb); ! 11698: cp->link_ccbh = np->ccbh[hcode]; ! 11699: np->ccbh[hcode] = cp; ! 11700: ! 11701: /* ! 11702: ** Initialyze the start and restart actions. ! 11703: */ ! 11704: cp->phys.header.go.start = cpu_to_scr(NCB_SCRIPT_PHYS (np, idle)); ! 11705: cp->phys.header.go.restart = cpu_to_scr(NCB_SCRIPTH_PHYS(np,bad_i_t_l)); ! 11706: ! 11707: /* ! 11708: ** Initilialyze some other fields. ! 11709: */ ! 11710: cp->phys.smsg_ext.addr = cpu_to_scr(NCB_PHYS(np, msgin[2])); ! 11711: ! 11712: /* ! 11713: ** Chain into wakeup list and free ccb queue. ! 11714: */ ! 11715: cp->link_ccb = np->ccbc; ! 11716: np->ccbc = cp; ! 11717: ! 11718: xpt_insque_head(&cp->link_ccbq, &np->free_ccbq); ! 11719: ! 11720: return cp; ! 11721: } ! 11722: ! 11723: /*------------------------------------------------------------------------ ! 11724: ** Look up a CCB from a DSA value. ! 11725: **------------------------------------------------------------------------ ! 11726: **------------------------------------------------------------------------ ! 11727: */ ! 11728: static ccb_p ncr_ccb_from_dsa(ncb_p np, u_long dsa) ! 11729: { ! 11730: int hcode; ! 11731: ccb_p cp; ! 11732: ! 11733: hcode = CCB_HASH_CODE(dsa); ! 11734: cp = np->ccbh[hcode]; ! 11735: while (cp) { ! 11736: if (cp->p_ccb == dsa) ! 11737: break; ! 11738: cp = cp->link_ccbh; ! 11739: } ! 11740: ! 11741: return cp; ! 11742: } ! 11743: ! 11744: /*========================================================== ! 11745: ** ! 11746: ** ! 11747: ** Allocation of resources for Targets/Luns/Tags. ! 11748: ** ! 11749: ** ! 11750: **========================================================== ! 11751: */ ! 11752: ! 11753: ! 11754: /*------------------------------------------------------------------------ ! 11755: ** Target control block initialisation. ! 11756: **------------------------------------------------------------------------ ! 11757: ** This data structure is fully initialized after a SCSI command ! 11758: ** has been successfully completed for this target. ! 11759: **------------------------------------------------------------------------ ! 11760: */ ! 11761: static void ncr_init_tcb (ncb_p np, u_char tn) ! 11762: { ! 11763: /* ! 11764: ** Check some alignments required by the chip. ! 11765: */ ! 11766: assert (( (offsetof(struct ncr_reg, nc_sxfer) ^ ! 11767: offsetof(struct tcb , sval )) &3) == 0); ! 11768: assert (( (offsetof(struct ncr_reg, nc_scntl3) ^ ! 11769: offsetof(struct tcb , wval )) &3) == 0); ! 11770: if ((np->device_id == PCI_DEVICE_ID_LSI_53C1010) || ! 11771: (np->device_id == PCI_DEVICE_ID_LSI_53C1010_66)){ ! 11772: assert (( (offsetof(struct ncr_reg, nc_scntl4) ^ ! 11773: offsetof(struct tcb , uval )) &3) == 0); ! 11774: } ! 11775: } ! 11776: ! 11777: /*------------------------------------------------------------------------ ! 11778: ** Lun control block allocation and initialization. ! 11779: **------------------------------------------------------------------------ ! 11780: ** This data structure is allocated and initialized after a SCSI ! 11781: ** command has been successfully completed for this target/lun. ! 11782: **------------------------------------------------------------------------ ! 11783: */ ! 11784: static lcb_p ncr_alloc_lcb (ncb_p np, u_char tn, u_char ln) ! 11785: { ! 11786: tcb_p tp = &np->target[tn]; ! 11787: lcb_p lp = ncr_lp(np, tp, ln); ! 11788: ! 11789: /* ! 11790: ** Already done, return. ! 11791: */ ! 11792: if (lp) ! 11793: return lp; ! 11794: ! 11795: /* ! 11796: ** Initialize the target control block if not yet. ! 11797: */ ! 11798: ncr_init_tcb(np, tn); ! 11799: ! 11800: /* ! 11801: ** Allocate the lcb bus address array. ! 11802: ** Compute the bus address of this table. ! 11803: */ ! 11804: if (ln && !tp->luntbl) { ! 11805: int i; ! 11806: ! 11807: tp->luntbl = m_calloc_dma(256, "LUNTBL"); ! 11808: if (!tp->luntbl) ! 11809: goto fail; ! 11810: for (i = 0 ; i < 64 ; i++) ! 11811: tp->luntbl[i] = cpu_to_scr(NCB_PHYS(np, resel_badlun)); ! 11812: tp->b_luntbl = cpu_to_scr(vtobus(tp->luntbl)); ! 11813: } ! 11814: ! 11815: /* ! 11816: ** Allocate the table of pointers for LUN(s) > 0, if needed. ! 11817: */ ! 11818: if (ln && !tp->lmp) { ! 11819: tp->lmp = m_calloc(MAX_LUN * sizeof(lcb_p), "LMP"); ! 11820: if (!tp->lmp) ! 11821: goto fail; ! 11822: } ! 11823: ! 11824: /* ! 11825: ** Allocate the lcb. ! 11826: ** Make it available to the chip. ! 11827: */ ! 11828: lp = m_calloc_dma(sizeof(struct lcb), "LCB"); ! 11829: if (!lp) ! 11830: goto fail; ! 11831: if (ln) { ! 11832: tp->lmp[ln] = lp; ! 11833: tp->luntbl[ln] = cpu_to_scr(vtobus(lp)); ! 11834: } ! 11835: else { ! 11836: tp->l0p = lp; ! 11837: tp->b_lun0 = cpu_to_scr(vtobus(lp)); ! 11838: } ! 11839: ! 11840: /* ! 11841: ** Initialize the CCB queue headers. ! 11842: */ ! 11843: xpt_que_init(&lp->busy_ccbq); ! 11844: xpt_que_init(&lp->wait_ccbq); ! 11845: ! 11846: /* ! 11847: ** Set max CCBs to 1 and use the default task array ! 11848: ** by default. ! 11849: */ ! 11850: lp->maxnxs = 1; ! 11851: lp->tasktbl = &lp->tasktbl_0; ! 11852: lp->b_tasktbl = cpu_to_scr(vtobus(lp->tasktbl)); ! 11853: lp->tasktbl[0] = cpu_to_scr(np->p_notask); ! 11854: lp->resel_task = cpu_to_scr(NCB_SCRIPT_PHYS(np, resel_notag)); ! 11855: ! 11856: /* ! 11857: ** Initialize command queuing control. ! 11858: */ ! 11859: lp->busyccbs = 1; ! 11860: lp->queuedccbs = 1; ! 11861: lp->queuedepth = 1; ! 11862: fail: ! 11863: return lp; ! 11864: } ! 11865: ! 11866: ! 11867: /*------------------------------------------------------------------------ ! 11868: ** Lun control block setup on INQUIRY data received. ! 11869: **------------------------------------------------------------------------ ! 11870: ** We only support WIDE, SYNC for targets and CMDQ for logical units. ! 11871: ** This setup is done on each INQUIRY since we are expecting user ! 11872: ** will play with CHANGE DEFINITION commands. :-) ! 11873: **------------------------------------------------------------------------ ! 11874: */ ! 11875: static lcb_p ncr_setup_lcb (ncb_p np, u_char tn, u_char ln, u_char *inq_data) ! 11876: { ! 11877: tcb_p tp = &np->target[tn]; ! 11878: lcb_p lp = ncr_lp(np, tp, ln); ! 11879: u_char inq_byte7; ! 11880: int i; ! 11881: ! 11882: /* ! 11883: ** If no lcb, try to allocate it. ! 11884: */ ! 11885: if (!lp && !(lp = ncr_alloc_lcb(np, tn, ln))) ! 11886: goto fail; ! 11887: ! 11888: #if 0 /* No more used. Left here as provision */ ! 11889: /* ! 11890: ** Get device quirks. ! 11891: */ ! 11892: tp->quirks = 0; ! 11893: if (tp->quirks && bootverbose) { ! 11894: PRINT_LUN(np, tn, ln); ! 11895: printk ("quirks=%x.\n", tp->quirks); ! 11896: } ! 11897: #endif ! 11898: ! 11899: /* ! 11900: ** Evaluate trustable target/unit capabilities. ! 11901: ** We only believe device version >= SCSI-2 that ! 11902: ** use appropriate response data format (2). ! 11903: ** But it seems that some CCS devices also ! 11904: ** support SYNC and I donnot want to frustrate ! 11905: ** anybody. ;-) ! 11906: */ ! 11907: inq_byte7 = 0; ! 11908: if ((inq_data[2] & 0x7) >= 2 && (inq_data[3] & 0xf) == 2) ! 11909: inq_byte7 = inq_data[7]; ! 11910: else if ((inq_data[2] & 0x7) == 1 && (inq_data[3] & 0xf) == 1) ! 11911: inq_byte7 = INQ7_SYNC; ! 11912: ! 11913: /* ! 11914: ** Throw away announced LUN capabilities if we are told ! 11915: ** that there is no real device supported by the logical unit. ! 11916: */ ! 11917: if ((inq_data[0] & 0xe0) > 0x20 || (inq_data[0] & 0x1f) == 0x1f) ! 11918: inq_byte7 &= (INQ7_SYNC | INQ7_WIDE16); ! 11919: ! 11920: /* ! 11921: ** If user is wanting SYNC, force this feature. ! 11922: */ ! 11923: if (driver_setup.force_sync_nego) ! 11924: inq_byte7 |= INQ7_SYNC; ! 11925: ! 11926: /* ! 11927: ** Prepare negotiation if SIP capabilities have changed. ! 11928: */ ! 11929: tp->inq_done = 1; ! 11930: if ((inq_byte7 ^ tp->inq_byte7) & (INQ7_SYNC | INQ7_WIDE16)) { ! 11931: tp->inq_byte7 = inq_byte7; ! 11932: ncr_negotiate(np, tp); ! 11933: } ! 11934: ! 11935: /* ! 11936: ** If unit supports tagged commands, allocate and ! 11937: ** initialyze the task table if not yet. ! 11938: */ ! 11939: if ((inq_byte7 & INQ7_QUEUE) && lp->tasktbl == &lp->tasktbl_0) { ! 11940: lp->tasktbl = m_calloc_dma(MAX_TASKS*4, "TASKTBL"); ! 11941: if (!lp->tasktbl) { ! 11942: lp->tasktbl = &lp->tasktbl_0; ! 11943: goto fail; ! 11944: } ! 11945: lp->b_tasktbl = cpu_to_scr(vtobus(lp->tasktbl)); ! 11946: for (i = 0 ; i < MAX_TASKS ; i++) ! 11947: lp->tasktbl[i] = cpu_to_scr(np->p_notask); ! 11948: ! 11949: lp->cb_tags = m_calloc(MAX_TAGS, "CB_TAGS"); ! 11950: if (!lp->cb_tags) ! 11951: goto fail; ! 11952: for (i = 0 ; i < MAX_TAGS ; i++) ! 11953: lp->cb_tags[i] = i; ! 11954: ! 11955: lp->maxnxs = MAX_TAGS; ! 11956: lp->tags_stime = ktime_get(3*HZ); ! 11957: } ! 11958: ! 11959: /* ! 11960: ** Adjust tagged queueing status if needed. ! 11961: */ ! 11962: if ((inq_byte7 ^ lp->inq_byte7) & INQ7_QUEUE) { ! 11963: lp->inq_byte7 = inq_byte7; ! 11964: lp->numtags = lp->maxtags; ! 11965: ncr_setup_tags (np, tn, ln); ! 11966: } ! 11967: ! 11968: fail: ! 11969: return lp; ! 11970: } ! 11971: ! 11972: /*========================================================== ! 11973: ** ! 11974: ** ! 11975: ** Build Scatter Gather Block ! 11976: ** ! 11977: ** ! 11978: **========================================================== ! 11979: ** ! 11980: ** The transfer area may be scattered among ! 11981: ** several non adjacent physical pages. ! 11982: ** ! 11983: ** We may use MAX_SCATTER blocks. ! 11984: ** ! 11985: **---------------------------------------------------------- ! 11986: */ ! 11987: ! 11988: /* ! 11989: ** We try to reduce the number of interrupts caused ! 11990: ** by unexpected phase changes due to disconnects. ! 11991: ** A typical harddisk may disconnect before ANY block. ! 11992: ** If we wanted to avoid unexpected phase changes at all ! 11993: ** we had to use a break point every 512 bytes. ! 11994: ** Of course the number of scatter/gather blocks is ! 11995: ** limited. ! 11996: ** Under Linux, the scatter/gatter blocks are provided by ! 11997: ** the generic driver. We just have to copy addresses and ! 11998: ** sizes to the data segment array. ! 11999: */ ! 12000: ! 12001: /* ! 12002: ** For 64 bit systems, we use the 8 upper bits of the size field ! 12003: ** to provide bus address bits 32-39 to the SCRIPTS processor. ! 12004: ** This allows the 895A and 896 to address up to 1 TB of memory. ! 12005: ** For 32 bit chips on 64 bit systems, we must be provided with ! 12006: ** memory addresses that fit into the first 32 bit bus address ! 12007: ** range and so, this does not matter and we expect an error from ! 12008: ** the chip if this ever happen. ! 12009: ** ! 12010: ** We use a separate function for the case Linux does not provide ! 12011: ** a scatter list in order to allow better code optimization ! 12012: ** for the case we have a scatter list (BTW, for now this just wastes ! 12013: ** about 40 bytes of code for x86, but my guess is that the scatter ! 12014: ** code will get more complex later). ! 12015: */ ! 12016: ! 12017: #ifdef SCSI_NCR_USE_64BIT_DAC ! 12018: #define SCATTER_ONE(data, badd, len) \ ! 12019: (data)->addr = cpu_to_scr(badd); \ ! 12020: (data)->size = cpu_to_scr((((badd) >> 8) & 0xff000000) + len); ! 12021: #else ! 12022: #define SCATTER_ONE(data, badd, len) \ ! 12023: (data)->addr = cpu_to_scr(badd); \ ! 12024: (data)->size = cpu_to_scr(len); ! 12025: #endif ! 12026: ! 12027: #define CROSS_16MB(p, n) (((((u_long) p) + n - 1) ^ ((u_long) p)) & ~0xffffff) ! 12028: ! 12029: static int ncr_scatter_no_sglist(ncb_p np, ccb_p cp, Scsi_Cmnd *cmd) ! 12030: { ! 12031: struct scr_tblmove *data = &cp->phys.data[MAX_SCATTER-1]; ! 12032: int segment; ! 12033: ! 12034: cp->data_len = cmd->request_bufflen; ! 12035: ! 12036: if (cmd->request_bufflen) { ! 12037: u_long baddr = map_scsi_single_data(np, cmd); ! 12038: ! 12039: SCATTER_ONE(data, baddr, cmd->request_bufflen); ! 12040: if (CROSS_16MB(baddr, cmd->request_bufflen)) { ! 12041: cp->host_flags |= HF_PM_TO_C; ! 12042: #ifdef DEBUG_896R1 ! 12043: printk("He! we are crossing a 16 MB boundary (0x%lx, 0x%x)\n", ! 12044: baddr, cmd->request_bufflen); ! 12045: #endif ! 12046: } ! 12047: segment = 1; ! 12048: } ! 12049: else ! 12050: segment = 0; ! 12051: ! 12052: return segment; ! 12053: } ! 12054: ! 12055: /* ! 12056: ** DEL 472 - 53C896 Rev 1 - Part Number 609-0393055 - ITEM 5. ! 12057: ** ! 12058: ** We disable data phase mismatch handling from SCRIPTS for data ! 12059: ** transfers that contains scatter/gather entries that cross ! 12060: ** a 16 MB boundary. ! 12061: ** We use a different scatter function for 896 rev. 1 that needs ! 12062: ** such a work-around. Doing so, we do not affect performance for ! 12063: ** other chips. ! 12064: ** This problem should not be triggered for disk IOs under Linux, ! 12065: ** since such IOs are performed using pages and buffers that are ! 12066: ** nicely power-of-two sized and aligned. But, since this may change ! 12067: ** at any time, a work-around was required. ! 12068: */ ! 12069: static int ncr_scatter_896R1(ncb_p np, ccb_p cp, Scsi_Cmnd *cmd) ! 12070: { ! 12071: int segn; ! 12072: int use_sg = (int) cmd->use_sg; ! 12073: ! 12074: cp->data_len = 0; ! 12075: ! 12076: if (!use_sg) ! 12077: segn = ncr_scatter_no_sglist(np, cp, cmd); ! 12078: else if (use_sg > MAX_SCATTER) ! 12079: segn = -1; ! 12080: else { ! 12081: struct scatterlist *scatter = (struct scatterlist *)cmd->buffer; ! 12082: struct scr_tblmove *data; ! 12083: ! 12084: use_sg = map_scsi_sg_data(np, cmd); ! 12085: data = &cp->phys.data[MAX_SCATTER - use_sg]; ! 12086: ! 12087: for (segn = 0; segn < use_sg; segn++) { ! 12088: u_long baddr = scsi_sg_dma_address(&scatter[segn]); ! 12089: unsigned int len = scsi_sg_dma_len(&scatter[segn]); ! 12090: ! 12091: SCATTER_ONE(&data[segn], ! 12092: baddr, ! 12093: len); ! 12094: if (CROSS_16MB(baddr, scatter[segn].length)) { ! 12095: cp->host_flags |= HF_PM_TO_C; ! 12096: #ifdef DEBUG_896R1 ! 12097: printk("He! we are crossing a 16 MB boundary (0x%lx, 0x%x)\n", ! 12098: baddr, scatter[segn].length); ! 12099: #endif ! 12100: } ! 12101: cp->data_len += len; ! 12102: } ! 12103: } ! 12104: ! 12105: return segn; ! 12106: } ! 12107: ! 12108: static int ncr_scatter(ncb_p np, ccb_p cp, Scsi_Cmnd *cmd) ! 12109: { ! 12110: int segment; ! 12111: int use_sg = (int) cmd->use_sg; ! 12112: ! 12113: cp->data_len = 0; ! 12114: ! 12115: if (!use_sg) ! 12116: segment = ncr_scatter_no_sglist(np, cp, cmd); ! 12117: else if (use_sg > MAX_SCATTER) ! 12118: segment = -1; ! 12119: else { ! 12120: struct scatterlist *scatter = (struct scatterlist *)cmd->buffer; ! 12121: struct scr_tblmove *data; ! 12122: ! 12123: use_sg = map_scsi_sg_data(np, cmd); ! 12124: data = &cp->phys.data[MAX_SCATTER - use_sg]; ! 12125: ! 12126: for (segment = 0; segment < use_sg; segment++) { ! 12127: u_long baddr = scsi_sg_dma_address(&scatter[segment]); ! 12128: unsigned int len = scsi_sg_dma_len(&scatter[segment]); ! 12129: ! 12130: SCATTER_ONE(&data[segment], ! 12131: baddr, ! 12132: len); ! 12133: cp->data_len += len; ! 12134: } ! 12135: } ! 12136: ! 12137: return segment; ! 12138: } ! 12139: ! 12140: /*========================================================== ! 12141: ** ! 12142: ** ! 12143: ** Test the pci bus snoop logic :-( ! 12144: ** ! 12145: ** Has to be called with interrupts disabled. ! 12146: ** ! 12147: ** ! 12148: **========================================================== ! 12149: */ ! 12150: ! 12151: #ifndef SCSI_NCR_IOMAPPED ! 12152: static int __init ncr_regtest (struct ncb* np) ! 12153: { ! 12154: register volatile u_int32 data; ! 12155: /* ! 12156: ** ncr registers may NOT be cached. ! 12157: ** write 0xffffffff to a read only register area, ! 12158: ** and try to read it back. ! 12159: */ ! 12160: data = 0xffffffff; ! 12161: OUTL_OFF(offsetof(struct ncr_reg, nc_dstat), data); ! 12162: data = INL_OFF(offsetof(struct ncr_reg, nc_dstat)); ! 12163: #if 1 ! 12164: if (data == 0xffffffff) { ! 12165: #else ! 12166: if ((data & 0xe2f0fffd) != 0x02000080) { ! 12167: #endif ! 12168: printk ("CACHE TEST FAILED: reg dstat-sstat2 readback %x.\n", ! 12169: (unsigned) data); ! 12170: return (0x10); ! 12171: }; ! 12172: return (0); ! 12173: } ! 12174: #endif ! 12175: ! 12176: static int __init ncr_snooptest (struct ncb* np) ! 12177: { ! 12178: u_int32 ncr_rd, ncr_wr, ncr_bk, host_rd, host_wr, pc; ! 12179: int i, err=0; ! 12180: #ifndef SCSI_NCR_IOMAPPED ! 12181: if (np->reg) { ! 12182: err |= ncr_regtest (np); ! 12183: if (err) return (err); ! 12184: } ! 12185: #endif ! 12186: /* ! 12187: ** init ! 12188: */ ! 12189: pc = NCB_SCRIPTH0_PHYS (np, snooptest); ! 12190: host_wr = 1; ! 12191: ncr_wr = 2; ! 12192: /* ! 12193: ** Set memory and register. ! 12194: */ ! 12195: np->ncr_cache = cpu_to_scr(host_wr); ! 12196: OUTL (nc_temp, ncr_wr); ! 12197: /* ! 12198: ** Start script (exchange values) ! 12199: */ ! 12200: OUTL (nc_dsa, np->p_ncb); ! 12201: OUTL_DSP (pc); ! 12202: /* ! 12203: ** Wait 'til done (with timeout) ! 12204: */ ! 12205: for (i=0; i<NCR_SNOOP_TIMEOUT; i++) ! 12206: if (INB(nc_istat) & (INTF|SIP|DIP)) ! 12207: break; ! 12208: /* ! 12209: ** Save termination position. ! 12210: */ ! 12211: pc = INL (nc_dsp); ! 12212: /* ! 12213: ** Read memory and register. ! 12214: */ ! 12215: host_rd = scr_to_cpu(np->ncr_cache); ! 12216: ncr_rd = INL (nc_scratcha); ! 12217: ncr_bk = INL (nc_temp); ! 12218: ! 12219: /* ! 12220: ** check for timeout ! 12221: */ ! 12222: if (i>=NCR_SNOOP_TIMEOUT) { ! 12223: printk ("CACHE TEST FAILED: timeout.\n"); ! 12224: return (0x20); ! 12225: }; ! 12226: /* ! 12227: ** Check termination position. ! 12228: */ ! 12229: if (pc != NCB_SCRIPTH0_PHYS (np, snoopend)+8) { ! 12230: printk ("CACHE TEST FAILED: script execution failed.\n"); ! 12231: printk ("start=%08lx, pc=%08lx, end=%08lx\n", ! 12232: (u_long) NCB_SCRIPTH0_PHYS (np, snooptest), (u_long) pc, ! 12233: (u_long) NCB_SCRIPTH0_PHYS (np, snoopend) +8); ! 12234: return (0x40); ! 12235: }; ! 12236: /* ! 12237: ** Show results. ! 12238: */ ! 12239: if (host_wr != ncr_rd) { ! 12240: printk ("CACHE TEST FAILED: host wrote %d, ncr read %d.\n", ! 12241: (int) host_wr, (int) ncr_rd); ! 12242: err |= 1; ! 12243: }; ! 12244: if (host_rd != ncr_wr) { ! 12245: printk ("CACHE TEST FAILED: ncr wrote %d, host read %d.\n", ! 12246: (int) ncr_wr, (int) host_rd); ! 12247: err |= 2; ! 12248: }; ! 12249: if (ncr_bk != ncr_wr) { ! 12250: printk ("CACHE TEST FAILED: ncr wrote %d, read back %d.\n", ! 12251: (int) ncr_wr, (int) ncr_bk); ! 12252: err |= 4; ! 12253: }; ! 12254: return (err); ! 12255: } ! 12256: ! 12257: /*========================================================== ! 12258: ** ! 12259: ** Determine the ncr's clock frequency. ! 12260: ** This is essential for the negotiation ! 12261: ** of the synchronous transfer rate. ! 12262: ** ! 12263: **========================================================== ! 12264: ** ! 12265: ** Note: we have to return the correct value. ! 12266: ** THERE IS NO SAFE DEFAULT VALUE. ! 12267: ** ! 12268: ** Most NCR/SYMBIOS boards are delivered with a 40 Mhz clock. ! 12269: ** 53C860 and 53C875 rev. 1 support fast20 transfers but ! 12270: ** do not have a clock doubler and so are provided with a ! 12271: ** 80 MHz clock. All other fast20 boards incorporate a doubler ! 12272: ** and so should be delivered with a 40 MHz clock. ! 12273: ** The recent fast40 chips (895/896/895A) and the ! 12274: ** fast80 chip (C1010) use a 40 Mhz base clock ! 12275: ** and provide a clock quadrupler (160 Mhz). The code below ! 12276: ** tries to deal as cleverly as possible with all this stuff. ! 12277: ** ! 12278: **---------------------------------------------------------- ! 12279: */ ! 12280: ! 12281: /* ! 12282: * Select NCR SCSI clock frequency ! 12283: */ ! 12284: static void ncr_selectclock(ncb_p np, u_char scntl3) ! 12285: { ! 12286: if (np->multiplier < 2) { ! 12287: OUTB(nc_scntl3, scntl3); ! 12288: return; ! 12289: } ! 12290: ! 12291: if (bootverbose >= 2) ! 12292: printk ("%s: enabling clock multiplier\n", ncr_name(np)); ! 12293: ! 12294: OUTB(nc_stest1, DBLEN); /* Enable clock multiplier */ ! 12295: ! 12296: if ( (np->device_id != PCI_DEVICE_ID_LSI_53C1010) && ! 12297: (np->device_id != PCI_DEVICE_ID_LSI_53C1010_66) && ! 12298: (np->multiplier > 2)) { ! 12299: int i = 20; /* Poll bit 5 of stest4 for quadrupler */ ! 12300: while (!(INB(nc_stest4) & LCKFRQ) && --i > 0) ! 12301: UDELAY (20); ! 12302: if (!i) ! 12303: printk("%s: the chip cannot lock the frequency\n", ! 12304: ncr_name(np)); ! 12305: ! 12306: } else /* Wait 120 micro-seconds for multiplier*/ ! 12307: UDELAY (120); ! 12308: ! 12309: OUTB(nc_stest3, HSC); /* Halt the scsi clock */ ! 12310: OUTB(nc_scntl3, scntl3); ! 12311: OUTB(nc_stest1, (DBLEN|DBLSEL));/* Select clock multiplier */ ! 12312: OUTB(nc_stest3, 0x00); /* Restart scsi clock */ ! 12313: } ! 12314: ! 12315: ! 12316: /* ! 12317: * calculate NCR SCSI clock frequency (in KHz) ! 12318: */ ! 12319: static unsigned __init ncrgetfreq (ncb_p np, int gen) ! 12320: { ! 12321: unsigned int ms = 0; ! 12322: unsigned int f; ! 12323: int count; ! 12324: ! 12325: /* ! 12326: * Measure GEN timer delay in order ! 12327: * to calculate SCSI clock frequency ! 12328: * ! 12329: * This code will never execute too ! 12330: * many loop iterations (if DELAY is ! 12331: * reasonably correct). It could get ! 12332: * too low a delay (too high a freq.) ! 12333: * if the CPU is slow executing the ! 12334: * loop for some reason (an NMI, for ! 12335: * example). For this reason we will ! 12336: * if multiple measurements are to be ! 12337: * performed trust the higher delay ! 12338: * (lower frequency returned). ! 12339: */ ! 12340: OUTW (nc_sien , 0x0);/* mask all scsi interrupts */ ! 12341: /* enable general purpose timer */ ! 12342: (void) INW (nc_sist); /* clear pending scsi interrupt */ ! 12343: OUTB (nc_dien , 0); /* mask all dma interrupts */ ! 12344: (void) INW (nc_sist); /* another one, just to be sure :) */ ! 12345: OUTB (nc_scntl3, 4); /* set pre-scaler to divide by 3 */ ! 12346: OUTB (nc_stime1, 0); /* disable general purpose timer */ ! 12347: OUTB (nc_stime1, gen); /* set to nominal delay of 1<<gen * 125us */ ! 12348: /* Temporary fix for udelay issue with Alpha ! 12349: platform */ ! 12350: while (!(INW(nc_sist) & GEN) && ms++ < 100000) { ! 12351: /* count 1ms */ ! 12352: for (count = 0; count < 10; count++) ! 12353: UDELAY (100); ! 12354: } ! 12355: OUTB (nc_stime1, 0); /* disable general purpose timer */ ! 12356: /* ! 12357: * set prescaler to divide by whatever 0 means ! 12358: * 0 ought to choose divide by 2, but appears ! 12359: * to set divide by 3.5 mode in my 53c810 ... ! 12360: */ ! 12361: OUTB (nc_scntl3, 0); ! 12362: ! 12363: /* ! 12364: * adjust for prescaler, and convert into KHz ! 12365: * scale values derived empirically. C1010 uses ! 12366: * different dividers ! 12367: */ ! 12368: #if 0 ! 12369: if (np->device_id == PCI_DEVICE_ID_LSI_53C1010) ! 12370: f = ms ? ((1 << gen) * 2866 ) / ms : 0; ! 12371: else ! 12372: #endif ! 12373: f = ms ? ((1 << gen) * 4340) / ms : 0; ! 12374: ! 12375: if (bootverbose >= 2) ! 12376: printk ("%s: Delay (GEN=%d): %u msec, %u KHz\n", ! 12377: ncr_name(np), gen, ms, f); ! 12378: ! 12379: return f; ! 12380: } ! 12381: ! 12382: static unsigned __init ncr_getfreq (ncb_p np) ! 12383: { ! 12384: u_int f1, f2; ! 12385: int gen = 11; ! 12386: ! 12387: (void) ncrgetfreq (np, gen); /* throw away first result */ ! 12388: f1 = ncrgetfreq (np, gen); ! 12389: f2 = ncrgetfreq (np, gen); ! 12390: if (f1 > f2) f1 = f2; /* trust lower result */ ! 12391: return f1; ! 12392: } ! 12393: ! 12394: /* ! 12395: * Get/probe NCR SCSI clock frequency ! 12396: */ ! 12397: static void __init ncr_getclock (ncb_p np, int mult) ! 12398: { ! 12399: unsigned char scntl3 = np->sv_scntl3; ! 12400: unsigned char stest1 = np->sv_stest1; ! 12401: unsigned f1; ! 12402: ! 12403: np->multiplier = 1; ! 12404: f1 = 40000; ! 12405: ! 12406: /* ! 12407: ** True with 875/895/896/895A with clock multiplier selected ! 12408: */ ! 12409: if (mult > 1 && (stest1 & (DBLEN+DBLSEL)) == DBLEN+DBLSEL) { ! 12410: if (bootverbose >= 2) ! 12411: printk ("%s: clock multiplier found\n", ncr_name(np)); ! 12412: np->multiplier = mult; ! 12413: } ! 12414: ! 12415: /* ! 12416: ** If multiplier not found but a C1010, assume a mult of 4. ! 12417: ** If multiplier not found or scntl3 not 7,5,3, ! 12418: ** reset chip and get frequency from general purpose timer. ! 12419: ** Otherwise trust scntl3 BIOS setting. ! 12420: */ ! 12421: if ((np->device_id == PCI_DEVICE_ID_LSI_53C1010) || ! 12422: (np->device_id == PCI_DEVICE_ID_LSI_53C1010_66)) { ! 12423: f1=40000; ! 12424: np->multiplier = mult; ! 12425: if (bootverbose >= 2) ! 12426: printk ("%s: clock multiplier assumed\n", ncr_name(np)); ! 12427: } ! 12428: else if (np->multiplier != mult || (scntl3 & 7) < 3 || !(scntl3 & 1)) { ! 12429: OUTB (nc_stest1, 0); /* make sure doubler is OFF */ ! 12430: f1 = ncr_getfreq (np); ! 12431: ! 12432: if (bootverbose) ! 12433: printk ("%s: NCR clock is %uKHz\n", ncr_name(np), f1); ! 12434: ! 12435: if (f1 < 55000) f1 = 40000; ! 12436: else f1 = 80000; ! 12437: ! 12438: /* ! 12439: ** Suggest to also check the PCI clock frequency ! 12440: ** to make sure our frequency calculation algorithm ! 12441: ** is not too biased. ! 12442: */ ! 12443: if (np->features & FE_66MHZ) { ! 12444: np->pciclock_min = (66000*55+80-1)/80; ! 12445: np->pciclock_max = (66000*55)/40; ! 12446: } ! 12447: else { ! 12448: np->pciclock_min = (33000*55+80-1)/80; ! 12449: np->pciclock_max = (33000*55)/40; ! 12450: } ! 12451: ! 12452: if (f1 == 40000 && mult > 1) { ! 12453: if (bootverbose >= 2) ! 12454: printk ("%s: clock multiplier assumed\n", ncr_name(np)); ! 12455: np->multiplier = mult; ! 12456: } ! 12457: } else { ! 12458: if ((scntl3 & 7) == 3) f1 = 40000; ! 12459: else if ((scntl3 & 7) == 5) f1 = 80000; ! 12460: else f1 = 160000; ! 12461: ! 12462: f1 /= np->multiplier; ! 12463: } ! 12464: ! 12465: /* ! 12466: ** Compute controller synchronous parameters. ! 12467: */ ! 12468: f1 *= np->multiplier; ! 12469: np->clock_khz = f1; ! 12470: } ! 12471: ! 12472: /* ! 12473: * Get/probe PCI clock frequency ! 12474: */ ! 12475: static u_int __init ncr_getpciclock (ncb_p np) ! 12476: { ! 12477: static u_int f; ! 12478: ! 12479: OUTB (nc_stest1, SCLK); /* Use the PCI clock as SCSI clock */ ! 12480: f = ncr_getfreq (np); ! 12481: OUTB (nc_stest1, 0); ! 12482: ! 12483: return f; ! 12484: } ! 12485: ! 12486: /*===================== LINUX ENTRY POINTS SECTION ==========================*/ ! 12487: ! 12488: #ifndef uchar ! 12489: #define uchar unsigned char ! 12490: #endif ! 12491: ! 12492: #ifndef ushort ! 12493: #define ushort unsigned short ! 12494: #endif ! 12495: ! 12496: #ifndef ulong ! 12497: #define ulong unsigned long ! 12498: #endif ! 12499: ! 12500: /* --------------------------------------------------------------------- ! 12501: ** ! 12502: ** Driver setup from the boot command line ! 12503: ** ! 12504: ** --------------------------------------------------------------------- ! 12505: */ ! 12506: ! 12507: #ifdef MODULE ! 12508: #define ARG_SEP ' ' ! 12509: #else ! 12510: #define ARG_SEP ',' ! 12511: #endif ! 12512: ! 12513: #define OPT_TAGS 1 ! 12514: #define OPT_MASTER_PARITY 2 ! 12515: #define OPT_SCSI_PARITY 3 ! 12516: #define OPT_DISCONNECTION 4 ! 12517: #define OPT_SPECIAL_FEATURES 5 ! 12518: #define OPT_ULTRA_SCSI 6 ! 12519: #define OPT_FORCE_SYNC_NEGO 7 ! 12520: #define OPT_REVERSE_PROBE 8 ! 12521: #define OPT_DEFAULT_SYNC 9 ! 12522: #define OPT_VERBOSE 10 ! 12523: #define OPT_DEBUG 11 ! 12524: #define OPT_BURST_MAX 12 ! 12525: #define OPT_LED_PIN 13 ! 12526: #define OPT_MAX_WIDE 14 ! 12527: #define OPT_SETTLE_DELAY 15 ! 12528: #define OPT_DIFF_SUPPORT 16 ! 12529: #define OPT_IRQM 17 ! 12530: #define OPT_PCI_FIX_UP 18 ! 12531: #define OPT_BUS_CHECK 19 ! 12532: #define OPT_OPTIMIZE 20 ! 12533: #define OPT_RECOVERY 21 ! 12534: #define OPT_SAFE_SETUP 22 ! 12535: #define OPT_USE_NVRAM 23 ! 12536: #define OPT_EXCLUDE 24 ! 12537: #define OPT_HOST_ID 25 ! 12538: ! 12539: #ifdef SCSI_NCR_IARB_SUPPORT ! 12540: #define OPT_IARB 26 ! 12541: #endif ! 12542: ! 12543: static char setup_token[] __initdata = ! 12544: "tags:" "mpar:" ! 12545: "spar:" "disc:" ! 12546: "specf:" "ultra:" ! 12547: "fsn:" "revprob:" ! 12548: "sync:" "verb:" ! 12549: "debug:" "burst:" ! 12550: "led:" "wide:" ! 12551: "settle:" "diff:" ! 12552: "irqm:" "pcifix:" ! 12553: "buschk:" "optim:" ! 12554: "recovery:" ! 12555: "safe:" "nvram:" ! 12556: "excl:" "hostid:" ! 12557: #ifdef SCSI_NCR_IARB_SUPPORT ! 12558: "iarb:" ! 12559: #endif ! 12560: ; /* DONNOT REMOVE THIS ';' */ ! 12561: ! 12562: #ifdef MODULE ! 12563: #define ARG_SEP ' ' ! 12564: #else ! 12565: #define ARG_SEP ',' ! 12566: #endif ! 12567: ! 12568: static int __init get_setup_token(char *p) ! 12569: { ! 12570: char *cur = setup_token; ! 12571: char *pc; ! 12572: int i = 0; ! 12573: ! 12574: while (cur != NULL && (pc = strchr(cur, ':')) != NULL) { ! 12575: ++pc; ! 12576: ++i; ! 12577: if (!strncmp(p, cur, pc - cur)) ! 12578: return i; ! 12579: cur = pc; ! 12580: } ! 12581: return 0; ! 12582: } ! 12583: ! 12584: ! 12585: int __init sym53c8xx_setup(char *str) ! 12586: { ! 12587: #ifdef SCSI_NCR_BOOT_COMMAND_LINE_SUPPORT ! 12588: char *cur = str; ! 12589: char *pc, *pv; ! 12590: unsigned long val; ! 12591: int i, c; ! 12592: int xi = 0; ! 12593: ! 12594: while (cur != NULL && (pc = strchr(cur, ':')) != NULL) { ! 12595: char *pe; ! 12596: ! 12597: val = 0; ! 12598: pv = pc; ! 12599: c = *++pv; ! 12600: ! 12601: if (c == 'n') ! 12602: val = 0; ! 12603: else if (c == 'y') ! 12604: val = 1; ! 12605: else ! 12606: val = (int) simple_strtoul(pv, &pe, 0); ! 12607: ! 12608: switch (get_setup_token(cur)) { ! 12609: case OPT_TAGS: ! 12610: driver_setup.default_tags = val; ! 12611: if (pe && *pe == '/') { ! 12612: i = 0; ! 12613: while (*pe && *pe != ARG_SEP && ! 12614: i < sizeof(driver_setup.tag_ctrl)-1) { ! 12615: driver_setup.tag_ctrl[i++] = *pe++; ! 12616: } ! 12617: driver_setup.tag_ctrl[i] = '\0'; ! 12618: } ! 12619: break; ! 12620: case OPT_MASTER_PARITY: ! 12621: driver_setup.master_parity = val; ! 12622: break; ! 12623: case OPT_SCSI_PARITY: ! 12624: driver_setup.scsi_parity = val; ! 12625: break; ! 12626: case OPT_DISCONNECTION: ! 12627: driver_setup.disconnection = val; ! 12628: break; ! 12629: case OPT_SPECIAL_FEATURES: ! 12630: driver_setup.special_features = val; ! 12631: break; ! 12632: case OPT_ULTRA_SCSI: ! 12633: driver_setup.ultra_scsi = val; ! 12634: break; ! 12635: case OPT_FORCE_SYNC_NEGO: ! 12636: driver_setup.force_sync_nego = val; ! 12637: break; ! 12638: case OPT_REVERSE_PROBE: ! 12639: driver_setup.reverse_probe = val; ! 12640: break; ! 12641: case OPT_DEFAULT_SYNC: ! 12642: driver_setup.default_sync = val; ! 12643: break; ! 12644: case OPT_VERBOSE: ! 12645: driver_setup.verbose = val; ! 12646: break; ! 12647: case OPT_DEBUG: ! 12648: driver_setup.debug = val; ! 12649: break; ! 12650: case OPT_BURST_MAX: ! 12651: driver_setup.burst_max = val; ! 12652: break; ! 12653: case OPT_LED_PIN: ! 12654: driver_setup.led_pin = val; ! 12655: break; ! 12656: case OPT_MAX_WIDE: ! 12657: driver_setup.max_wide = val? 1:0; ! 12658: break; ! 12659: case OPT_SETTLE_DELAY: ! 12660: driver_setup.settle_delay = val; ! 12661: break; ! 12662: case OPT_DIFF_SUPPORT: ! 12663: driver_setup.diff_support = val; ! 12664: break; ! 12665: case OPT_IRQM: ! 12666: driver_setup.irqm = val; ! 12667: break; ! 12668: case OPT_PCI_FIX_UP: ! 12669: driver_setup.pci_fix_up = val; ! 12670: break; ! 12671: case OPT_BUS_CHECK: ! 12672: driver_setup.bus_check = val; ! 12673: break; ! 12674: case OPT_OPTIMIZE: ! 12675: driver_setup.optimize = val; ! 12676: break; ! 12677: case OPT_RECOVERY: ! 12678: driver_setup.recovery = val; ! 12679: break; ! 12680: case OPT_USE_NVRAM: ! 12681: driver_setup.use_nvram = val; ! 12682: break; ! 12683: case OPT_SAFE_SETUP: ! 12684: memcpy(&driver_setup, &driver_safe_setup, ! 12685: sizeof(driver_setup)); ! 12686: break; ! 12687: case OPT_EXCLUDE: ! 12688: if (xi < SCSI_NCR_MAX_EXCLUDES) ! 12689: driver_setup.excludes[xi++] = val; ! 12690: break; ! 12691: case OPT_HOST_ID: ! 12692: driver_setup.host_id = val; ! 12693: break; ! 12694: #ifdef SCSI_NCR_IARB_SUPPORT ! 12695: case OPT_IARB: ! 12696: driver_setup.iarb = val; ! 12697: break; ! 12698: #endif ! 12699: default: ! 12700: printk("sym53c8xx_setup: unexpected boot option '%.*s' ignored\n", (int)(pc-cur+1), cur); ! 12701: break; ! 12702: } ! 12703: ! 12704: if ((cur = strchr(cur, ARG_SEP)) != NULL) ! 12705: ++cur; ! 12706: } ! 12707: #endif /* SCSI_NCR_BOOT_COMMAND_LINE_SUPPORT */ ! 12708: return 1; ! 12709: } ! 12710: ! 12711: #if LINUX_VERSION_CODE >= LinuxVersionCode(2,3,13) ! 12712: #ifndef MODULE ! 12713: __setup("sym53c8xx=", sym53c8xx_setup); ! 12714: #endif ! 12715: #endif ! 12716: ! 12717: static int ! 12718: sym53c8xx_pci_init(Scsi_Host_Template *tpnt, pcidev_t pdev, ncr_device *device); ! 12719: ! 12720: /* ! 12721: ** Linux entry point for SYM53C8XX devices detection routine. ! 12722: ** ! 12723: ** Called by the middle-level scsi drivers at initialization time, ! 12724: ** or at module installation. ! 12725: ** ! 12726: ** Read the PCI configuration and try to attach each ! 12727: ** detected NCR board. ! 12728: ** ! 12729: ** If NVRAM is present, try to attach boards according to ! 12730: ** the used defined boot order. ! 12731: ** ! 12732: ** Returns the number of boards successfully attached. ! 12733: */ ! 12734: ! 12735: static void __init ncr_print_driver_setup(void) ! 12736: { ! 12737: #define YesNo(y) y ? 'y' : 'n' ! 12738: printk (NAME53C8XX ": setup=disc:%c,specf:%d,ultra:%d,tags:%d,sync:%d," ! 12739: "burst:%d,wide:%c,diff:%d,revprob:%c,buschk:0x%x\n", ! 12740: YesNo(driver_setup.disconnection), ! 12741: driver_setup.special_features, ! 12742: driver_setup.ultra_scsi, ! 12743: driver_setup.default_tags, ! 12744: driver_setup.default_sync, ! 12745: driver_setup.burst_max, ! 12746: YesNo(driver_setup.max_wide), ! 12747: driver_setup.diff_support, ! 12748: YesNo(driver_setup.reverse_probe), ! 12749: driver_setup.bus_check); ! 12750: ! 12751: printk (NAME53C8XX ": setup=mpar:%c,spar:%c,fsn=%c,verb:%d,debug:0x%x," ! 12752: "led:%c,settle:%d,irqm:0x%x,nvram:0x%x,pcifix:0x%x\n", ! 12753: YesNo(driver_setup.master_parity), ! 12754: YesNo(driver_setup.scsi_parity), ! 12755: YesNo(driver_setup.force_sync_nego), ! 12756: driver_setup.verbose, ! 12757: driver_setup.debug, ! 12758: YesNo(driver_setup.led_pin), ! 12759: driver_setup.settle_delay, ! 12760: driver_setup.irqm, ! 12761: driver_setup.use_nvram, ! 12762: driver_setup.pci_fix_up); ! 12763: #undef YesNo ! 12764: } ! 12765: ! 12766: /*=================================================================== ! 12767: ** SYM53C8XX devices description table and chip ids list. ! 12768: **=================================================================== ! 12769: */ ! 12770: ! 12771: static ncr_chip ncr_chip_table[] __initdata = SCSI_NCR_CHIP_TABLE; ! 12772: static ushort ncr_chip_ids[] __initdata = SCSI_NCR_CHIP_IDS; ! 12773: ! 12774: #ifdef SCSI_NCR_PQS_PDS_SUPPORT ! 12775: /*=================================================================== ! 12776: ** Detect all NCR PQS/PDS boards and keep track of their bus nr. ! 12777: ** ! 12778: ** The NCR PQS or PDS card is constructed as a DEC bridge ! 12779: ** behind which sit a proprietary NCR memory controller and ! 12780: ** four or two 53c875s as separate devices. In its usual mode ! 12781: ** of operation, the 875s are slaved to the memory controller ! 12782: ** for all transfers. We can tell if an 875 is part of a ! 12783: ** PQS/PDS or not since if it is, it will be on the same bus ! 12784: ** as the memory controller. To operate with the Linux ! 12785: ** driver, the memory controller is disabled and the 875s ! 12786: ** freed to function independently. The only wrinkle is that ! 12787: ** the preset SCSI ID (which may be zero) must be read in from ! 12788: ** a special configuration space register of the 875 ! 12789: **=================================================================== ! 12790: */ ! 12791: #define SCSI_NCR_MAX_PQS_BUS 16 ! 12792: static int pqs_bus[SCSI_NCR_MAX_PQS_BUS] __initdata = { 0 }; ! 12793: ! 12794: static void __init ncr_detect_pqs_pds(void) ! 12795: { ! 12796: short index; ! 12797: pcidev_t dev = PCIDEV_NULL; ! 12798: ! 12799: for(index=0; index < SCSI_NCR_MAX_PQS_BUS; index++) { ! 12800: u_char tmp; ! 12801: ! 12802: dev = pci_find_device(0x101a, 0x0009, dev); ! 12803: if (dev == PCIDEV_NULL) { ! 12804: pqs_bus[index] = -1; ! 12805: break; ! 12806: } ! 12807: printk(KERN_INFO NAME53C8XX ": NCR PQS/PDS memory controller detected on bus %d\n", PciBusNumber(dev)); ! 12808: pci_read_config_byte(dev, 0x44, &tmp); ! 12809: /* bit 1: allow individual 875 configuration */ ! 12810: tmp |= 0x2; ! 12811: pci_write_config_byte(dev, 0x44, tmp); ! 12812: pci_read_config_byte(dev, 0x45, &tmp); ! 12813: /* bit 2: drive individual 875 interrupts to the bus */ ! 12814: tmp |= 0x4; ! 12815: pci_write_config_byte(dev, 0x45, tmp); ! 12816: ! 12817: pqs_bus[index] = PciBusNumber(dev); ! 12818: } ! 12819: } ! 12820: #endif /* SCSI_NCR_PQS_PDS_SUPPORT */ ! 12821: ! 12822: /*=================================================================== ! 12823: ** Detect all 53c8xx hosts and then attach them. ! 12824: ** ! 12825: ** If we are using NVRAM, once all hosts are detected, we need to ! 12826: ** check any NVRAM for boot order in case detect and boot order ! 12827: ** differ and attach them using the order in the NVRAM. ! 12828: ** ! 12829: ** If no NVRAM is found or data appears invalid attach boards in ! 12830: ** the the order they are detected. ! 12831: **=================================================================== ! 12832: */ ! 12833: int __init sym53c8xx_detect(Scsi_Host_Template *tpnt) ! 12834: { ! 12835: pcidev_t pcidev; ! 12836: int i, j, chips, hosts, count; ! 12837: int attach_count = 0; ! 12838: ncr_device *devtbl, *devp; ! 12839: #ifdef SCSI_NCR_NVRAM_SUPPORT ! 12840: ncr_nvram nvram0, nvram, *nvp; ! 12841: #endif ! 12842: ! 12843: /* ! 12844: ** PCI is required. ! 12845: */ ! 12846: if (!pci_present()) ! 12847: return 0; ! 12848: ! 12849: /* ! 12850: ** Initialize driver general stuff. ! 12851: */ ! 12852: #ifdef SCSI_NCR_PROC_INFO_SUPPORT ! 12853: #if LINUX_VERSION_CODE < LinuxVersionCode(2,3,27) ! 12854: tpnt->proc_dir = &proc_scsi_sym53c8xx; ! 12855: #else ! 12856: tpnt->proc_name = NAME53C8XX; ! 12857: #endif ! 12858: tpnt->proc_info = sym53c8xx_proc_info; ! 12859: #endif ! 12860: ! 12861: #if defined(SCSI_NCR_BOOT_COMMAND_LINE_SUPPORT) && defined(MODULE) ! 12862: if (sym53c8xx) ! 12863: sym53c8xx_setup(sym53c8xx); ! 12864: #endif ! 12865: #ifdef SCSI_NCR_DEBUG_INFO_SUPPORT ! 12866: ncr_debug = driver_setup.debug; ! 12867: #endif ! 12868: ! 12869: if (initverbose >= 2) ! 12870: ncr_print_driver_setup(); ! 12871: ! 12872: /* ! 12873: ** Allocate the device table since we donnot want to ! 12874: ** overflow the kernel stack. ! 12875: ** 1 x 4K PAGE is enough for more than 40 devices for i386. ! 12876: */ ! 12877: devtbl = m_calloc(PAGE_SIZE, "devtbl"); ! 12878: if (!devtbl) ! 12879: return 0; ! 12880: ! 12881: /* ! 12882: ** Detect all NCR PQS/PDS memory controllers. ! 12883: */ ! 12884: #ifdef SCSI_NCR_PQS_PDS_SUPPORT ! 12885: ncr_detect_pqs_pds(); ! 12886: #endif ! 12887: ! 12888: /* ! 12889: ** Detect all 53c8xx hosts. ! 12890: ** Save the first Symbios NVRAM content if any ! 12891: ** for the boot order. ! 12892: */ ! 12893: chips = sizeof(ncr_chip_ids) / sizeof(ncr_chip_ids[0]); ! 12894: hosts = PAGE_SIZE / sizeof(*devtbl); ! 12895: #ifdef SCSI_NCR_NVRAM_SUPPORT ! 12896: nvp = (driver_setup.use_nvram & 0x1) ? &nvram0 : 0; ! 12897: #endif ! 12898: j = 0; ! 12899: count = 0; ! 12900: pcidev = PCIDEV_NULL; ! 12901: while (1) { ! 12902: char *msg = ""; ! 12903: if (count >= hosts) ! 12904: break; ! 12905: if (j >= chips) ! 12906: break; ! 12907: i = driver_setup.reverse_probe ? chips - 1 - j : j; ! 12908: pcidev = pci_find_device(PCI_VENDOR_ID_NCR, ncr_chip_ids[i], ! 12909: pcidev); ! 12910: if (pcidev == PCIDEV_NULL) { ! 12911: ++j; ! 12912: continue; ! 12913: } ! 12914: /* Some HW as the HP LH4 may report twice PCI devices */ ! 12915: for (i = 0; i < count ; i++) { ! 12916: if (devtbl[i].slot.bus == PciBusNumber(pcidev) && ! 12917: devtbl[i].slot.device_fn == PciDeviceFn(pcidev)) ! 12918: break; ! 12919: } ! 12920: if (i != count) /* Ignore this device if we already have it */ ! 12921: continue; ! 12922: devp = &devtbl[count]; ! 12923: devp->host_id = driver_setup.host_id; ! 12924: devp->attach_done = 0; ! 12925: if (sym53c8xx_pci_init(tpnt, pcidev, devp)) { ! 12926: continue; ! 12927: } ! 12928: ++count; ! 12929: #ifdef SCSI_NCR_NVRAM_SUPPORT ! 12930: if (nvp) { ! 12931: ncr_get_nvram(devp, nvp); ! 12932: switch(nvp->type) { ! 12933: case SCSI_NCR_SYMBIOS_NVRAM: ! 12934: /* ! 12935: * Switch to the other nvram buffer, so that ! 12936: * nvram0 will contain the first Symbios ! 12937: * format NVRAM content with boot order. ! 12938: */ ! 12939: nvp = &nvram; ! 12940: msg = "with Symbios NVRAM"; ! 12941: break; ! 12942: case SCSI_NCR_TEKRAM_NVRAM: ! 12943: msg = "with Tekram NVRAM"; ! 12944: break; ! 12945: } ! 12946: } ! 12947: #endif ! 12948: #ifdef SCSI_NCR_PQS_PDS_SUPPORT ! 12949: if (devp->pqs_pds) ! 12950: msg = "(NCR PQS/PDS)"; ! 12951: #endif ! 12952: printk(KERN_INFO NAME53C8XX ": 53c%s detected %s\n", ! 12953: devp->chip.name, msg); ! 12954: } ! 12955: ! 12956: /* ! 12957: ** If we have found a SYMBIOS NVRAM, use first the NVRAM boot ! 12958: ** sequence as device boot order. ! 12959: ** check devices in the boot record against devices detected. ! 12960: ** attach devices if we find a match. boot table records that ! 12961: ** do not match any detected devices will be ignored. ! 12962: ** devices that do not match any boot table will not be attached ! 12963: ** here but will attempt to be attached during the device table ! 12964: ** rescan. ! 12965: */ ! 12966: #ifdef SCSI_NCR_NVRAM_SUPPORT ! 12967: if (!nvp || nvram0.type != SCSI_NCR_SYMBIOS_NVRAM) ! 12968: goto next; ! 12969: for (i = 0; i < 4; i++) { ! 12970: Symbios_host *h = &nvram0.data.Symbios.host[i]; ! 12971: for (j = 0 ; j < count ; j++) { ! 12972: devp = &devtbl[j]; ! 12973: if (h->device_fn != devp->slot.device_fn || ! 12974: h->bus_nr != devp->slot.bus || ! 12975: h->device_id != devp->chip.device_id) ! 12976: continue; ! 12977: if (devp->attach_done) ! 12978: continue; ! 12979: if (h->flags & SYMBIOS_INIT_SCAN_AT_BOOT) { ! 12980: ncr_get_nvram(devp, nvp); ! 12981: if (!ncr_attach (tpnt, attach_count, devp)) ! 12982: attach_count++; ! 12983: } ! 12984: else if (!(driver_setup.use_nvram & 0x80)) ! 12985: printk(KERN_INFO NAME53C8XX ! 12986: ": 53c%s state OFF thus not attached\n", ! 12987: devp->chip.name); ! 12988: else ! 12989: continue; ! 12990: ! 12991: devp->attach_done = 1; ! 12992: break; ! 12993: } ! 12994: } ! 12995: next: ! 12996: #endif ! 12997: ! 12998: /* ! 12999: ** Rescan device list to make sure all boards attached. ! 13000: ** Devices without boot records will not be attached yet ! 13001: ** so try to attach them here. ! 13002: */ ! 13003: for (i= 0; i < count; i++) { ! 13004: devp = &devtbl[i]; ! 13005: if (!devp->attach_done) { ! 13006: #ifdef SCSI_NCR_NVRAM_SUPPORT ! 13007: ncr_get_nvram(devp, nvp); ! 13008: #endif ! 13009: if (!ncr_attach (tpnt, attach_count, devp)) ! 13010: attach_count++; ! 13011: } ! 13012: } ! 13013: ! 13014: m_free(devtbl, PAGE_SIZE, "devtbl"); ! 13015: ! 13016: return attach_count; ! 13017: } ! 13018: ! 13019: /*=================================================================== ! 13020: ** Read and check the PCI configuration for any detected NCR ! 13021: ** boards and save data for attaching after all boards have ! 13022: ** been detected. ! 13023: **=================================================================== ! 13024: */ ! 13025: static int __init ! 13026: sym53c8xx_pci_init(Scsi_Host_Template *tpnt, pcidev_t pdev, ncr_device *device) ! 13027: { ! 13028: u_short vendor_id, device_id, command, status_reg; ! 13029: u_char cache_line_size, latency_timer; ! 13030: u_char suggested_cache_line_size = 0; ! 13031: u_char pci_fix_up = driver_setup.pci_fix_up; ! 13032: u_char revision; ! 13033: u_int irq; ! 13034: u_long base, base_2, io_port; ! 13035: int i; ! 13036: ncr_chip *chip; ! 13037: ! 13038: printk(KERN_INFO NAME53C8XX ": at PCI bus %d, device %d, function %d\n", ! 13039: PciBusNumber(pdev), ! 13040: (int) (PciDeviceFn(pdev) & 0xf8) >> 3, ! 13041: (int) (PciDeviceFn(pdev) & 7)); ! 13042: ! 13043: #ifdef SCSI_NCR_DYNAMIC_DMA_MAPPING ! 13044: if (!pci_dma_supported(pdev, (dma_addr_t) (0xffffffffUL))) { ! 13045: printk(KERN_WARNING NAME53C8XX ! 13046: "32 BIT PCI BUS DMA ADDRESSING NOT SUPPORTED\n"); ! 13047: return -1; ! 13048: } ! 13049: #endif ! 13050: ! 13051: /* ! 13052: ** Read info from the PCI config space. ! 13053: ** pci_read_config_xxx() functions are assumed to be used for ! 13054: ** successfully detected PCI devices. ! 13055: */ ! 13056: vendor_id = PciVendorId(pdev); ! 13057: device_id = PciDeviceId(pdev); ! 13058: irq = PciIrqLine(pdev); ! 13059: i = 0; ! 13060: i = pci_get_base_address(pdev, i, &io_port); ! 13061: i = pci_get_base_address(pdev, i, &base); ! 13062: (void) pci_get_base_address(pdev, i, &base_2); ! 13063: ! 13064: pci_read_config_word(pdev, PCI_COMMAND, &command); ! 13065: pci_read_config_byte(pdev, PCI_CLASS_REVISION, &revision); ! 13066: pci_read_config_byte(pdev, PCI_CACHE_LINE_SIZE, &cache_line_size); ! 13067: pci_read_config_byte(pdev, PCI_LATENCY_TIMER, &latency_timer); ! 13068: pci_read_config_word(pdev, PCI_STATUS, &status_reg); ! 13069: ! 13070: #ifdef SCSI_NCR_PQS_PDS_SUPPORT ! 13071: /* ! 13072: ** Match the BUS number for PQS/PDS devices. ! 13073: ** Read the SCSI ID from a special register mapped ! 13074: ** into the configuration space of the individual ! 13075: ** 875s. This register is set up by the PQS bios ! 13076: */ ! 13077: for(i = 0; i < SCSI_NCR_MAX_PQS_BUS && pqs_bus[i] != -1; i++) { ! 13078: u_char tmp; ! 13079: if (pqs_bus[i] == PciBusNumber(pdev)) { ! 13080: pci_read_config_byte(pdev, 0x84, &tmp); ! 13081: device->pqs_pds = 1; ! 13082: device->host_id = tmp; ! 13083: break; ! 13084: } ! 13085: } ! 13086: #endif /* SCSI_NCR_PQS_PDS_SUPPORT */ ! 13087: ! 13088: /* ! 13089: ** If user excludes this chip, donnot initialize it. ! 13090: */ ! 13091: for (i = 0 ; i < SCSI_NCR_MAX_EXCLUDES ; i++) { ! 13092: if (driver_setup.excludes[i] == ! 13093: (io_port & PCI_BASE_ADDRESS_IO_MASK)) ! 13094: return -1; ! 13095: } ! 13096: /* ! 13097: ** Check if the chip is supported ! 13098: */ ! 13099: chip = 0; ! 13100: for (i = 0; i < sizeof(ncr_chip_table)/sizeof(ncr_chip_table[0]); i++) { ! 13101: if (device_id != ncr_chip_table[i].device_id) ! 13102: continue; ! 13103: if (revision > ncr_chip_table[i].revision_id) ! 13104: continue; ! 13105: if (!(ncr_chip_table[i].features & FE_LDSTR)) ! 13106: break; ! 13107: chip = &device->chip; ! 13108: memcpy(chip, &ncr_chip_table[i], sizeof(*chip)); ! 13109: chip->revision_id = revision; ! 13110: break; ! 13111: } ! 13112: ! 13113: /* ! 13114: ** Ignore Symbios chips controlled by SISL RAID controller. ! 13115: ** This controller sets value 0x52414944 at RAM end - 16. ! 13116: */ ! 13117: #if defined(__i386__) && !defined(SCSI_NCR_PCI_MEM_NOT_SUPPORTED) ! 13118: if (chip && (base_2 & PCI_BASE_ADDRESS_MEM_MASK)) { ! 13119: unsigned int ram_size, ram_val; ! 13120: u_long ram_ptr; ! 13121: ! 13122: if (chip->features & FE_RAM8K) ! 13123: ram_size = 8192; ! 13124: else ! 13125: ram_size = 4096; ! 13126: ! 13127: ram_ptr = remap_pci_mem(base_2 & PCI_BASE_ADDRESS_MEM_MASK, ! 13128: ram_size); ! 13129: if (ram_ptr) { ! 13130: ram_val = readl_raw(ram_ptr + ram_size - 16); ! 13131: unmap_pci_mem(ram_ptr, ram_size); ! 13132: if (ram_val == 0x52414944) { ! 13133: printk(NAME53C8XX": not initializing, " ! 13134: "driven by SISL RAID controller.\n"); ! 13135: return -1; ! 13136: } ! 13137: } ! 13138: } ! 13139: #endif /* i386 and PCI MEMORY accessible */ ! 13140: ! 13141: if (!chip) { ! 13142: printk(NAME53C8XX ": not initializing, device not supported\n"); ! 13143: return -1; ! 13144: } ! 13145: ! 13146: #ifdef __powerpc__ ! 13147: /* ! 13148: ** Fix-up for power/pc. ! 13149: ** Should not be performed by the driver. ! 13150: */ ! 13151: if ((command & (PCI_COMMAND_IO | PCI_COMMAND_MEMORY)) ! 13152: != (PCI_COMMAND_IO | PCI_COMMAND_MEMORY)) { ! 13153: printk(NAME53C8XX ": setting%s%s...\n", ! 13154: (command & PCI_COMMAND_IO) ? "" : " PCI_COMMAND_IO", ! 13155: (command & PCI_COMMAND_MEMORY) ? "" : " PCI_COMMAND_MEMORY"); ! 13156: command |= (PCI_COMMAND_IO | PCI_COMMAND_MEMORY); ! 13157: pci_write_config_word(pdev, PCI_COMMAND, command); ! 13158: } ! 13159: ! 13160: #if LINUX_VERSION_CODE < LinuxVersionCode(2,2,0) ! 13161: if ( is_prep ) { ! 13162: if (io_port >= 0x10000000) { ! 13163: printk(NAME53C8XX ": reallocating io_port (Wacky IBM)"); ! 13164: io_port = (io_port & 0x00FFFFFF) | 0x01000000; ! 13165: pci_write_config_dword(pdev, ! 13166: PCI_BASE_ADDRESS_0, io_port); ! 13167: } ! 13168: if (base >= 0x10000000) { ! 13169: printk(NAME53C8XX ": reallocating base (Wacky IBM)"); ! 13170: base = (base & 0x00FFFFFF) | 0x01000000; ! 13171: pci_write_config_dword(pdev, ! 13172: PCI_BASE_ADDRESS_1, base); ! 13173: } ! 13174: if (base_2 >= 0x10000000) { ! 13175: printk(NAME53C8XX ": reallocating base2 (Wacky IBM)"); ! 13176: base_2 = (base_2 & 0x00FFFFFF) | 0x01000000; ! 13177: pci_write_config_dword(pdev, ! 13178: PCI_BASE_ADDRESS_2, base_2); ! 13179: } ! 13180: } ! 13181: #endif ! 13182: #endif /* __powerpc__ */ ! 13183: ! 13184: #if defined(__sparc__) && (LINUX_VERSION_CODE < LinuxVersionCode(2,3,0)) ! 13185: /* ! 13186: ** Fix-ups for sparc. ! 13187: ** ! 13188: ** I wrote: Should not be performed by the driver, ! 13189: ** Guy wrote: but how can OBP know each and every PCI card, ! 13190: ** if they don't use Fcode? ! 13191: ** I replied: no need to know each and every PCI card, just ! 13192: ** be skilled enough to understand the PCI specs. ! 13193: */ ! 13194: ! 13195: /* ! 13196: ** PCI configuration is based on configuration registers being ! 13197: ** coherent with hardware and software resource identifications. ! 13198: ** This is fairly simple, but seems still too complex for Sparc. ! 13199: */ ! 13200: base = __pa(base); ! 13201: base_2 = __pa(base_2); ! 13202: ! 13203: if (!cache_line_size) ! 13204: suggested_cache_line_size = 16; ! 13205: ! 13206: driver_setup.pci_fix_up |= 0x7; ! 13207: ! 13208: #endif /* __sparc__ */ ! 13209: ! 13210: #if defined(__i386__) && !defined(MODULE) ! 13211: if (!cache_line_size) { ! 13212: #if LINUX_VERSION_CODE < LinuxVersionCode(2,1,75) ! 13213: extern char x86; ! 13214: switch(x86) { ! 13215: #else ! 13216: switch(boot_cpu_data.x86) { ! 13217: #endif ! 13218: case 4: suggested_cache_line_size = 4; break; ! 13219: case 6: ! 13220: case 5: suggested_cache_line_size = 8; break; ! 13221: } ! 13222: } ! 13223: #endif /* __i386__ */ ! 13224: ! 13225: /* ! 13226: ** Check availability of IO space, memory space. ! 13227: ** Enable master capability if not yet. ! 13228: ** ! 13229: ** We shouldn't have to care about the IO region when ! 13230: ** we are using MMIO. But calling check_region() from ! 13231: ** both the ncr53c8xx and the sym53c8xx drivers prevents ! 13232: ** from attaching devices from the both drivers. ! 13233: ** If you have a better idea, let me know. ! 13234: */ ! 13235: /* #ifdef SCSI_NCR_IOMAPPED */ ! 13236: #if 1 ! 13237: if (!(command & PCI_COMMAND_IO)) { ! 13238: printk(NAME53C8XX ": I/O base address (0x%lx) disabled.\n", ! 13239: (long) io_port); ! 13240: io_port = 0; ! 13241: } ! 13242: #endif ! 13243: if (!(command & PCI_COMMAND_MEMORY)) { ! 13244: printk(NAME53C8XX ": PCI_COMMAND_MEMORY not set.\n"); ! 13245: base = 0; ! 13246: base_2 = 0; ! 13247: } ! 13248: io_port &= PCI_BASE_ADDRESS_IO_MASK; ! 13249: base &= PCI_BASE_ADDRESS_MEM_MASK; ! 13250: base_2 &= PCI_BASE_ADDRESS_MEM_MASK; ! 13251: ! 13252: /* #ifdef SCSI_NCR_IOMAPPED */ ! 13253: #if 1 ! 13254: if (io_port && check_region (io_port, 128)) { ! 13255: printk(NAME53C8XX ": IO region 0x%lx[0..127] is in use\n", ! 13256: (long) io_port); ! 13257: io_port = 0; ! 13258: } ! 13259: if (!io_port) ! 13260: return -1; ! 13261: #endif ! 13262: #ifndef SCSI_NCR_IOMAPPED ! 13263: if (!base) { ! 13264: printk(NAME53C8XX ": MMIO base address disabled.\n"); ! 13265: return -1; ! 13266: } ! 13267: #endif ! 13268: ! 13269: /* ! 13270: ** Set MASTER capable and PARITY bit, if not yet. ! 13271: */ ! 13272: if ((command & (PCI_COMMAND_MASTER | PCI_COMMAND_PARITY)) ! 13273: != (PCI_COMMAND_MASTER | PCI_COMMAND_PARITY)) { ! 13274: printk(NAME53C8XX ": setting%s%s...(fix-up)\n", ! 13275: (command & PCI_COMMAND_MASTER) ? "" : " PCI_COMMAND_MASTER", ! 13276: (command & PCI_COMMAND_PARITY) ? "" : " PCI_COMMAND_PARITY"); ! 13277: command |= (PCI_COMMAND_MASTER | PCI_COMMAND_PARITY); ! 13278: pci_write_config_word(pdev, PCI_COMMAND, command); ! 13279: } ! 13280: ! 13281: /* ! 13282: ** Fix some features according to driver setup. ! 13283: */ ! 13284: if (!(driver_setup.special_features & 1)) ! 13285: chip->features &= ~FE_SPECIAL_SET; ! 13286: else { ! 13287: if (driver_setup.special_features & 2) ! 13288: chip->features &= ~FE_WRIE; ! 13289: if (driver_setup.special_features & 4) ! 13290: chip->features &= ~FE_NOPM; ! 13291: } ! 13292: ! 13293: /* ! 13294: ** Work around for errant bit in 895A. The 66Mhz ! 13295: ** capable bit is set erroneously. Clear this bit. ! 13296: ** (Item 1 DEL 533) ! 13297: ** ! 13298: ** Make sure Config space and Features agree. ! 13299: ** ! 13300: ** Recall: writes are not normal to status register - ! 13301: ** write a 1 to clear and a 0 to leave unchanged. ! 13302: ** Can only reset bits. ! 13303: */ ! 13304: if (chip->features & FE_66MHZ) { ! 13305: if (!(status_reg & PCI_STATUS_66MHZ)) ! 13306: chip->features &= ~FE_66MHZ; ! 13307: } ! 13308: else { ! 13309: if (status_reg & PCI_STATUS_66MHZ) { ! 13310: status_reg = PCI_STATUS_66MHZ; ! 13311: pci_write_config_word(pdev, PCI_STATUS, status_reg); ! 13312: pci_read_config_word(pdev, PCI_STATUS, &status_reg); ! 13313: } ! 13314: } ! 13315: ! 13316: if (driver_setup.ultra_scsi < 3 && (chip->features & FE_ULTRA3)) { ! 13317: chip->features |= FE_ULTRA2; ! 13318: chip->features &= ~FE_ULTRA3; ! 13319: } ! 13320: if (driver_setup.ultra_scsi < 2 && (chip->features & FE_ULTRA2)) { ! 13321: chip->features |= FE_ULTRA; ! 13322: chip->features &= ~FE_ULTRA2; ! 13323: } ! 13324: if (driver_setup.ultra_scsi < 1) ! 13325: chip->features &= ~FE_ULTRA; ! 13326: ! 13327: if (!driver_setup.max_wide) ! 13328: chip->features &= ~FE_WIDE; ! 13329: ! 13330: /* ! 13331: * C1010 Ultra3 support requires 16 bit data transfers. ! 13332: */ ! 13333: if (!driver_setup.max_wide && (chip->features & FE_ULTRA3)) { ! 13334: chip->features |= FE_ULTRA2; ! 13335: chip->features |= ~FE_ULTRA3; ! 13336: } ! 13337: ! 13338: /* ! 13339: ** Some features are required to be enabled in order to ! 13340: ** work around some chip problems. :) ;) ! 13341: ** (ITEM 12 of a DEL about the 896 I haven't yet). ! 13342: ** We must ensure the chip will use WRITE AND INVALIDATE. ! 13343: ** The revision number limit is for now arbitrary. ! 13344: */ ! 13345: if (device_id == PCI_DEVICE_ID_NCR_53C896 && revision <= 0x10) { ! 13346: chip->features |= (FE_WRIE | FE_CLSE); ! 13347: pci_fix_up |= 3; /* Force appropriate PCI fix-up */ ! 13348: } ! 13349: ! 13350: #ifdef SCSI_NCR_PCI_FIX_UP_SUPPORT ! 13351: /* ! 13352: ** Try to fix up PCI config according to wished features. ! 13353: */ ! 13354: if ((pci_fix_up & 1) && (chip->features & FE_CLSE) && ! 13355: !cache_line_size && suggested_cache_line_size) { ! 13356: cache_line_size = suggested_cache_line_size; ! 13357: pci_write_config_byte(pdev, ! 13358: PCI_CACHE_LINE_SIZE, cache_line_size); ! 13359: printk(NAME53C8XX ": PCI_CACHE_LINE_SIZE set to %d (fix-up).\n", ! 13360: cache_line_size); ! 13361: } ! 13362: ! 13363: if ((pci_fix_up & 2) && cache_line_size && ! 13364: (chip->features & FE_WRIE) && !(command & PCI_COMMAND_INVALIDATE)) { ! 13365: printk(NAME53C8XX": setting PCI_COMMAND_INVALIDATE (fix-up)\n"); ! 13366: command |= PCI_COMMAND_INVALIDATE; ! 13367: pci_write_config_word(pdev, PCI_COMMAND, command); ! 13368: } ! 13369: ! 13370: /* ! 13371: ** Tune PCI LATENCY TIMER according to burst max length transfer. ! 13372: ** (latency timer >= burst length + 6, we add 10 to be quite sure) ! 13373: */ ! 13374: ! 13375: if (chip->burst_max && (latency_timer == 0 || (pci_fix_up & 4))) { ! 13376: uchar lt = (1 << chip->burst_max) + 6 + 10; ! 13377: if (latency_timer < lt) { ! 13378: printk(NAME53C8XX ! 13379: ": changing PCI_LATENCY_TIMER from %d to %d.\n", ! 13380: (int) latency_timer, (int) lt); ! 13381: latency_timer = lt; ! 13382: pci_write_config_byte(pdev, ! 13383: PCI_LATENCY_TIMER, latency_timer); ! 13384: } ! 13385: } ! 13386: ! 13387: #endif /* SCSI_NCR_PCI_FIX_UP_SUPPORT */ ! 13388: ! 13389: /* ! 13390: ** Initialise ncr_device structure with items required by ncr_attach. ! 13391: */ ! 13392: device->pdev = pdev; ! 13393: device->slot.bus = PciBusNumber(pdev); ! 13394: device->slot.device_fn = PciDeviceFn(pdev); ! 13395: device->slot.base = base; ! 13396: device->slot.base_2 = base_2; ! 13397: device->slot.io_port = io_port; ! 13398: device->slot.irq = irq; ! 13399: device->attach_done = 0; ! 13400: ! 13401: return 0; ! 13402: } ! 13403: ! 13404: ! 13405: /*=================================================================== ! 13406: ** Detect and try to read SYMBIOS and TEKRAM NVRAM. ! 13407: ** ! 13408: ** Data can be used to order booting of boards. ! 13409: ** ! 13410: ** Data is saved in ncr_device structure if NVRAM found. This ! 13411: ** is then used to find drive boot order for ncr_attach(). ! 13412: ** ! 13413: ** NVRAM data is passed to Scsi_Host_Template later during ! 13414: ** ncr_attach() for any device set up. ! 13415: *=================================================================== ! 13416: */ ! 13417: #ifdef SCSI_NCR_NVRAM_SUPPORT ! 13418: static void __init ncr_get_nvram(ncr_device *devp, ncr_nvram *nvp) ! 13419: { ! 13420: devp->nvram = nvp; ! 13421: if (!nvp) ! 13422: return; ! 13423: /* ! 13424: ** Get access to chip IO registers ! 13425: */ ! 13426: #ifdef SCSI_NCR_IOMAPPED ! 13427: request_region(devp->slot.io_port, 128, NAME53C8XX); ! 13428: devp->slot.base_io = devp->slot.io_port; ! 13429: #else ! 13430: devp->slot.reg = (struct ncr_reg *) remap_pci_mem(devp->slot.base, 128); ! 13431: if (!devp->slot.reg) ! 13432: return; ! 13433: #endif ! 13434: ! 13435: /* ! 13436: ** Try to read SYMBIOS nvram. ! 13437: ** Try to read TEKRAM nvram if Symbios nvram not found. ! 13438: */ ! 13439: if (!sym_read_Symbios_nvram(&devp->slot, &nvp->data.Symbios)) ! 13440: nvp->type = SCSI_NCR_SYMBIOS_NVRAM; ! 13441: else if (!sym_read_Tekram_nvram(&devp->slot, devp->chip.device_id, ! 13442: &nvp->data.Tekram)) ! 13443: nvp->type = SCSI_NCR_TEKRAM_NVRAM; ! 13444: else { ! 13445: nvp->type = 0; ! 13446: devp->nvram = 0; ! 13447: } ! 13448: ! 13449: /* ! 13450: ** Release access to chip IO registers ! 13451: */ ! 13452: #ifdef SCSI_NCR_IOMAPPED ! 13453: release_region(devp->slot.base_io, 128); ! 13454: #else ! 13455: unmap_pci_mem((u_long) devp->slot.reg, 128ul); ! 13456: #endif ! 13457: ! 13458: } ! 13459: #endif /* SCSI_NCR_NVRAM_SUPPORT */ ! 13460: ! 13461: /* ! 13462: ** Linux select queue depths function ! 13463: */ ! 13464: ! 13465: #define DEF_DEPTH (driver_setup.default_tags) ! 13466: #define ALL_TARGETS -2 ! 13467: #define NO_TARGET -1 ! 13468: #define ALL_LUNS -2 ! 13469: #define NO_LUN -1 ! 13470: ! 13471: static int device_queue_depth(ncb_p np, int target, int lun) ! 13472: { ! 13473: int c, h, t, u, v; ! 13474: char *p = driver_setup.tag_ctrl; ! 13475: char *ep; ! 13476: ! 13477: h = -1; ! 13478: t = NO_TARGET; ! 13479: u = NO_LUN; ! 13480: while ((c = *p++) != 0) { ! 13481: v = simple_strtoul(p, &ep, 0); ! 13482: switch(c) { ! 13483: case '/': ! 13484: ++h; ! 13485: t = ALL_TARGETS; ! 13486: u = ALL_LUNS; ! 13487: break; ! 13488: case 't': ! 13489: if (t != target) ! 13490: t = (target == v) ? v : NO_TARGET; ! 13491: u = ALL_LUNS; ! 13492: break; ! 13493: case 'u': ! 13494: if (u != lun) ! 13495: u = (lun == v) ? v : NO_LUN; ! 13496: break; ! 13497: case 'q': ! 13498: if (h == np->unit && ! 13499: (t == ALL_TARGETS || t == target) && ! 13500: (u == ALL_LUNS || u == lun)) ! 13501: return v; ! 13502: break; ! 13503: case '-': ! 13504: t = ALL_TARGETS; ! 13505: u = ALL_LUNS; ! 13506: break; ! 13507: default: ! 13508: break; ! 13509: } ! 13510: p = ep; ! 13511: } ! 13512: return DEF_DEPTH; ! 13513: } ! 13514: ! 13515: static void sym53c8xx_select_queue_depths(struct Scsi_Host *host, struct scsi_device *devlist) ! 13516: { ! 13517: struct scsi_device *device; ! 13518: ! 13519: for (device = devlist; device; device = device->next) { ! 13520: ncb_p np; ! 13521: tcb_p tp; ! 13522: lcb_p lp; ! 13523: int numtags; ! 13524: ! 13525: if (device->host != host) ! 13526: continue; ! 13527: ! 13528: np = ((struct host_data *) host->hostdata)->ncb; ! 13529: tp = &np->target[device->id]; ! 13530: lp = ncr_lp(np, tp, device->lun); ! 13531: ! 13532: /* ! 13533: ** Select queue depth from driver setup. ! 13534: ** Donnot use more than configured by user. ! 13535: ** Use at least 2. ! 13536: ** Donnot use more than our maximum. ! 13537: */ ! 13538: numtags = device_queue_depth(np, device->id, device->lun); ! 13539: if (numtags > tp->usrtags) ! 13540: numtags = tp->usrtags; ! 13541: if (!device->tagged_supported) ! 13542: numtags = 1; ! 13543: device->queue_depth = numtags; ! 13544: if (device->queue_depth < 2) ! 13545: device->queue_depth = 2; ! 13546: if (device->queue_depth > MAX_TAGS) ! 13547: device->queue_depth = MAX_TAGS; ! 13548: ! 13549: /* ! 13550: ** Since the queue depth is not tunable under Linux, ! 13551: ** we need to know this value in order not to ! 13552: ** announce stupid things to user. ! 13553: */ ! 13554: if (lp) { ! 13555: lp->numtags = lp->maxtags = numtags; ! 13556: lp->scdev_depth = device->queue_depth; ! 13557: } ! 13558: ncr_setup_tags (np, device->id, device->lun); ! 13559: ! 13560: #ifdef DEBUG_SYM53C8XX ! 13561: printk("sym53c8xx_select_queue_depth: host=%d, id=%d, lun=%d, depth=%d\n", ! 13562: np->unit, device->id, device->lun, device->queue_depth); ! 13563: #endif ! 13564: } ! 13565: } ! 13566: ! 13567: /* ! 13568: ** Linux entry point for info() function ! 13569: */ ! 13570: const char *sym53c8xx_info (struct Scsi_Host *host) ! 13571: { ! 13572: return SCSI_NCR_DRIVER_NAME; ! 13573: } ! 13574: ! 13575: /* ! 13576: ** Linux entry point of queuecommand() function ! 13577: */ ! 13578: ! 13579: int sym53c8xx_queue_command (Scsi_Cmnd *cmd, void (* done)(Scsi_Cmnd *)) ! 13580: { ! 13581: ncb_p np = ((struct host_data *) cmd->host->hostdata)->ncb; ! 13582: unsigned long flags; ! 13583: int sts; ! 13584: ! 13585: #ifdef DEBUG_SYM53C8XX ! 13586: printk("sym53c8xx_queue_command\n"); ! 13587: #endif ! 13588: ! 13589: cmd->scsi_done = done; ! 13590: cmd->host_scribble = NULL; ! 13591: cmd->SCp.ptr = NULL; ! 13592: cmd->SCp.buffer = NULL; ! 13593: #ifdef SCSI_NCR_DYNAMIC_DMA_MAPPING ! 13594: cmd->__data_mapped = 0; ! 13595: cmd->__data_mapping = 0; ! 13596: #endif ! 13597: ! 13598: NCR_LOCK_NCB(np, flags); ! 13599: ! 13600: if ((sts = ncr_queue_command(np, cmd)) != DID_OK) { ! 13601: SetScsiResult(cmd, sts, 0); ! 13602: #ifdef DEBUG_SYM53C8XX ! 13603: printk("sym53c8xx : command not queued - result=%d\n", sts); ! 13604: #endif ! 13605: } ! 13606: #ifdef DEBUG_SYM53C8XX ! 13607: else ! 13608: printk("sym53c8xx : command successfully queued\n"); ! 13609: #endif ! 13610: ! 13611: NCR_UNLOCK_NCB(np, flags); ! 13612: ! 13613: if (sts != DID_OK) { ! 13614: unmap_scsi_data(np, cmd); ! 13615: done(cmd); ! 13616: } ! 13617: ! 13618: return sts; ! 13619: } ! 13620: ! 13621: /* ! 13622: ** Linux entry point of the interrupt handler. ! 13623: ** Since linux versions > 1.3.70, we trust the kernel for ! 13624: ** passing the internal host descriptor as 'dev_id'. ! 13625: ** Otherwise, we scan the host list and call the interrupt ! 13626: ** routine for each host that uses this IRQ. ! 13627: */ ! 13628: ! 13629: static void sym53c8xx_intr(int irq, void *dev_id, struct pt_regs * regs) ! 13630: { ! 13631: unsigned long flags; ! 13632: ncb_p np = (ncb_p) dev_id; ! 13633: Scsi_Cmnd *done_list; ! 13634: ! 13635: #ifdef DEBUG_SYM53C8XX ! 13636: printk("sym53c8xx : interrupt received\n"); ! 13637: #endif ! 13638: ! 13639: if (DEBUG_FLAGS & DEBUG_TINY) printk ("["); ! 13640: ! 13641: NCR_LOCK_NCB(np, flags); ! 13642: ncr_exception(np); ! 13643: done_list = np->done_list; ! 13644: np->done_list = 0; ! 13645: NCR_UNLOCK_NCB(np, flags); ! 13646: ! 13647: if (DEBUG_FLAGS & DEBUG_TINY) printk ("]\n"); ! 13648: ! 13649: if (done_list) { ! 13650: NCR_LOCK_SCSI_DONE(np, flags); ! 13651: ncr_flush_done_cmds(done_list); ! 13652: NCR_UNLOCK_SCSI_DONE(np, flags); ! 13653: } ! 13654: } ! 13655: ! 13656: /* ! 13657: ** Linux entry point of the timer handler ! 13658: */ ! 13659: ! 13660: static void sym53c8xx_timeout(unsigned long npref) ! 13661: { ! 13662: ncb_p np = (ncb_p) npref; ! 13663: unsigned long flags; ! 13664: Scsi_Cmnd *done_list; ! 13665: ! 13666: NCR_LOCK_NCB(np, flags); ! 13667: ncr_timeout((ncb_p) np); ! 13668: done_list = np->done_list; ! 13669: np->done_list = 0; ! 13670: NCR_UNLOCK_NCB(np, flags); ! 13671: ! 13672: if (done_list) { ! 13673: NCR_LOCK_SCSI_DONE(np, flags); ! 13674: ncr_flush_done_cmds(done_list); ! 13675: NCR_UNLOCK_SCSI_DONE(np, flags); ! 13676: } ! 13677: } ! 13678: ! 13679: /* ! 13680: ** Linux entry point of reset() function ! 13681: */ ! 13682: ! 13683: #if defined SCSI_RESET_SYNCHRONOUS && defined SCSI_RESET_ASYNCHRONOUS ! 13684: int sym53c8xx_reset(Scsi_Cmnd *cmd, unsigned int reset_flags) ! 13685: #else ! 13686: int sym53c8xx_reset(Scsi_Cmnd *cmd) ! 13687: #endif ! 13688: { ! 13689: ncb_p np = ((struct host_data *) cmd->host->hostdata)->ncb; ! 13690: int sts; ! 13691: unsigned long flags; ! 13692: Scsi_Cmnd *done_list; ! 13693: ! 13694: #if defined SCSI_RESET_SYNCHRONOUS && defined SCSI_RESET_ASYNCHRONOUS ! 13695: printk("sym53c8xx_reset: pid=%lu reset_flags=%x serial_number=%ld serial_number_at_timeout=%ld\n", ! 13696: cmd->pid, reset_flags, cmd->serial_number, cmd->serial_number_at_timeout); ! 13697: #else ! 13698: printk("sym53c8xx_reset: command pid %lu\n", cmd->pid); ! 13699: #endif ! 13700: ! 13701: NCR_LOCK_NCB(np, flags); ! 13702: ! 13703: /* ! 13704: * We have to just ignore reset requests in some situations. ! 13705: */ ! 13706: #if defined SCSI_RESET_NOT_RUNNING ! 13707: if (cmd->serial_number != cmd->serial_number_at_timeout) { ! 13708: sts = SCSI_RESET_NOT_RUNNING; ! 13709: goto out; ! 13710: } ! 13711: #endif ! 13712: /* ! 13713: * If the mid-level driver told us reset is synchronous, it seems ! 13714: * that we must call the done() callback for the involved command, ! 13715: * even if this command was not queued to the low-level driver, ! 13716: * before returning SCSI_RESET_SUCCESS. ! 13717: */ ! 13718: ! 13719: #if defined SCSI_RESET_SYNCHRONOUS && defined SCSI_RESET_ASYNCHRONOUS ! 13720: sts = ncr_reset_bus(np, cmd, ! 13721: (reset_flags & (SCSI_RESET_SYNCHRONOUS | SCSI_RESET_ASYNCHRONOUS)) == SCSI_RESET_SYNCHRONOUS); ! 13722: #else ! 13723: sts = ncr_reset_bus(np, cmd, 0); ! 13724: #endif ! 13725: ! 13726: /* ! 13727: * Since we always reset the controller, when we return success, ! 13728: * we add this information to the return code. ! 13729: */ ! 13730: #if defined SCSI_RESET_HOST_RESET ! 13731: if (sts == SCSI_RESET_SUCCESS) ! 13732: sts |= SCSI_RESET_HOST_RESET; ! 13733: #endif ! 13734: ! 13735: out: ! 13736: done_list = np->done_list; ! 13737: np->done_list = 0; ! 13738: NCR_UNLOCK_NCB(np, flags); ! 13739: ! 13740: ncr_flush_done_cmds(done_list); ! 13741: ! 13742: return sts; ! 13743: } ! 13744: ! 13745: /* ! 13746: ** Linux entry point of abort() function ! 13747: */ ! 13748: ! 13749: int sym53c8xx_abort(Scsi_Cmnd *cmd) ! 13750: { ! 13751: ncb_p np = ((struct host_data *) cmd->host->hostdata)->ncb; ! 13752: int sts; ! 13753: unsigned long flags; ! 13754: Scsi_Cmnd *done_list; ! 13755: ! 13756: #if defined SCSI_RESET_SYNCHRONOUS && defined SCSI_RESET_ASYNCHRONOUS ! 13757: printk("sym53c8xx_abort: pid=%lu serial_number=%ld serial_number_at_timeout=%ld\n", ! 13758: cmd->pid, cmd->serial_number, cmd->serial_number_at_timeout); ! 13759: #else ! 13760: printk("sym53c8xx_abort: command pid %lu\n", cmd->pid); ! 13761: #endif ! 13762: ! 13763: NCR_LOCK_NCB(np, flags); ! 13764: ! 13765: #if defined SCSI_RESET_SYNCHRONOUS && defined SCSI_RESET_ASYNCHRONOUS ! 13766: /* ! 13767: * We have to just ignore abort requests in some situations. ! 13768: */ ! 13769: if (cmd->serial_number != cmd->serial_number_at_timeout) { ! 13770: sts = SCSI_ABORT_NOT_RUNNING; ! 13771: goto out; ! 13772: } ! 13773: #endif ! 13774: ! 13775: sts = ncr_abort_command(np, cmd); ! 13776: out: ! 13777: done_list = np->done_list; ! 13778: np->done_list = 0; ! 13779: NCR_UNLOCK_NCB(np, flags); ! 13780: ! 13781: ncr_flush_done_cmds(done_list); ! 13782: ! 13783: return sts; ! 13784: } ! 13785: ! 13786: ! 13787: #ifdef MODULE ! 13788: int sym53c8xx_release(struct Scsi_Host *host) ! 13789: { ! 13790: #ifdef DEBUG_SYM53C8XX ! 13791: printk("sym53c8xx : release\n"); ! 13792: #endif ! 13793: ncr_detach(((struct host_data *) host->hostdata)->ncb); ! 13794: ! 13795: return 1; ! 13796: } ! 13797: #endif ! 13798: ! 13799: ! 13800: /* ! 13801: ** Scsi command waiting list management. ! 13802: ** ! 13803: ** It may happen that we cannot insert a scsi command into the start queue, ! 13804: ** in the following circumstances. ! 13805: ** Too few preallocated ccb(s), ! 13806: ** maxtags < cmd_per_lun of the Linux host control block, ! 13807: ** etc... ! 13808: ** Such scsi commands are inserted into a waiting list. ! 13809: ** When a scsi command complete, we try to requeue the commands of the ! 13810: ** waiting list. ! 13811: */ ! 13812: ! 13813: #define next_wcmd host_scribble ! 13814: ! 13815: static void insert_into_waiting_list(ncb_p np, Scsi_Cmnd *cmd) ! 13816: { ! 13817: Scsi_Cmnd *wcmd; ! 13818: ! 13819: #ifdef DEBUG_WAITING_LIST ! 13820: printk("%s: cmd %lx inserted into waiting list\n", ncr_name(np), (u_long) cmd); ! 13821: #endif ! 13822: cmd->next_wcmd = 0; ! 13823: if (!(wcmd = np->waiting_list)) np->waiting_list = cmd; ! 13824: else { ! 13825: while ((wcmd->next_wcmd) != 0) ! 13826: wcmd = (Scsi_Cmnd *) wcmd->next_wcmd; ! 13827: wcmd->next_wcmd = (char *) cmd; ! 13828: } ! 13829: } ! 13830: ! 13831: static Scsi_Cmnd *retrieve_from_waiting_list(int to_remove, ncb_p np, Scsi_Cmnd *cmd) ! 13832: { ! 13833: Scsi_Cmnd **pcmd = &np->waiting_list; ! 13834: ! 13835: while (*pcmd) { ! 13836: if (cmd == *pcmd) { ! 13837: if (to_remove) { ! 13838: *pcmd = (Scsi_Cmnd *) cmd->next_wcmd; ! 13839: cmd->next_wcmd = 0; ! 13840: } ! 13841: #ifdef DEBUG_WAITING_LIST ! 13842: printk("%s: cmd %lx retrieved from waiting list\n", ncr_name(np), (u_long) cmd); ! 13843: #endif ! 13844: return cmd; ! 13845: } ! 13846: pcmd = (Scsi_Cmnd **) &(*pcmd)->next_wcmd; ! 13847: } ! 13848: return 0; ! 13849: } ! 13850: ! 13851: static void process_waiting_list(ncb_p np, int sts) ! 13852: { ! 13853: Scsi_Cmnd *waiting_list, *wcmd; ! 13854: ! 13855: waiting_list = np->waiting_list; ! 13856: np->waiting_list = 0; ! 13857: ! 13858: #ifdef DEBUG_WAITING_LIST ! 13859: if (waiting_list) printk("%s: waiting_list=%lx processing sts=%d\n", ncr_name(np), (u_long) waiting_list, sts); ! 13860: #endif ! 13861: while ((wcmd = waiting_list) != 0) { ! 13862: waiting_list = (Scsi_Cmnd *) wcmd->next_wcmd; ! 13863: wcmd->next_wcmd = 0; ! 13864: if (sts == DID_OK) { ! 13865: #ifdef DEBUG_WAITING_LIST ! 13866: printk("%s: cmd %lx trying to requeue\n", ncr_name(np), (u_long) wcmd); ! 13867: #endif ! 13868: sts = ncr_queue_command(np, wcmd); ! 13869: } ! 13870: if (sts != DID_OK) { ! 13871: #ifdef DEBUG_WAITING_LIST ! 13872: printk("%s: cmd %lx done forced sts=%d\n", ncr_name(np), (u_long) wcmd, sts); ! 13873: #endif ! 13874: SetScsiResult(wcmd, sts, 0); ! 13875: ncr_queue_done_cmd(np, wcmd); ! 13876: } ! 13877: } ! 13878: } ! 13879: ! 13880: #undef next_wcmd ! 13881: ! 13882: #ifdef SCSI_NCR_PROC_INFO_SUPPORT ! 13883: ! 13884: /*========================================================================= ! 13885: ** Proc file system stuff ! 13886: ** ! 13887: ** A read operation returns adapter information. ! 13888: ** A write operation is a control command. ! 13889: ** The string is parsed in the driver code and the command is passed ! 13890: ** to the ncr_usercmd() function. ! 13891: **========================================================================= ! 13892: */ ! 13893: ! 13894: #ifdef SCSI_NCR_USER_COMMAND_SUPPORT ! 13895: ! 13896: #define is_digit(c) ((c) >= '0' && (c) <= '9') ! 13897: #define digit_to_bin(c) ((c) - '0') ! 13898: #define is_space(c) ((c) == ' ' || (c) == '\t') ! 13899: ! 13900: static int skip_spaces(char *ptr, int len) ! 13901: { ! 13902: int cnt, c; ! 13903: ! 13904: for (cnt = len; cnt > 0 && (c = *ptr++) && is_space(c); cnt--); ! 13905: ! 13906: return (len - cnt); ! 13907: } ! 13908: ! 13909: static int get_int_arg(char *ptr, int len, u_long *pv) ! 13910: { ! 13911: int cnt, c; ! 13912: u_long v; ! 13913: ! 13914: for (v = 0, cnt = len; cnt > 0 && (c = *ptr++) && is_digit(c); cnt--) { ! 13915: v = (v * 10) + digit_to_bin(c); ! 13916: } ! 13917: ! 13918: if (pv) ! 13919: *pv = v; ! 13920: ! 13921: return (len - cnt); ! 13922: } ! 13923: ! 13924: static int is_keyword(char *ptr, int len, char *verb) ! 13925: { ! 13926: int verb_len = strlen(verb); ! 13927: ! 13928: if (len >= strlen(verb) && !memcmp(verb, ptr, verb_len)) ! 13929: return verb_len; ! 13930: else ! 13931: return 0; ! 13932: ! 13933: } ! 13934: ! 13935: #define SKIP_SPACES(min_spaces) \ ! 13936: if ((arg_len = skip_spaces(ptr, len)) < (min_spaces)) \ ! 13937: return -EINVAL; \ ! 13938: ptr += arg_len; len -= arg_len; ! 13939: ! 13940: #define GET_INT_ARG(v) \ ! 13941: if (!(arg_len = get_int_arg(ptr, len, &(v)))) \ ! 13942: return -EINVAL; \ ! 13943: ptr += arg_len; len -= arg_len; ! 13944: ! 13945: ! 13946: /* ! 13947: ** Parse a control command ! 13948: */ ! 13949: ! 13950: static int ncr_user_command(ncb_p np, char *buffer, int length) ! 13951: { ! 13952: char *ptr = buffer; ! 13953: int len = length; ! 13954: struct usrcmd *uc = &np->user; ! 13955: int arg_len; ! 13956: u_long target; ! 13957: ! 13958: bzero(uc, sizeof(*uc)); ! 13959: ! 13960: if (len > 0 && ptr[len-1] == '\n') ! 13961: --len; ! 13962: ! 13963: if ((arg_len = is_keyword(ptr, len, "setsync")) != 0) ! 13964: uc->cmd = UC_SETSYNC; ! 13965: else if ((arg_len = is_keyword(ptr, len, "settags")) != 0) ! 13966: uc->cmd = UC_SETTAGS; ! 13967: else if ((arg_len = is_keyword(ptr, len, "setorder")) != 0) ! 13968: uc->cmd = UC_SETORDER; ! 13969: else if ((arg_len = is_keyword(ptr, len, "setverbose")) != 0) ! 13970: uc->cmd = UC_SETVERBOSE; ! 13971: else if ((arg_len = is_keyword(ptr, len, "setwide")) != 0) ! 13972: uc->cmd = UC_SETWIDE; ! 13973: else if ((arg_len = is_keyword(ptr, len, "setdebug")) != 0) ! 13974: uc->cmd = UC_SETDEBUG; ! 13975: else if ((arg_len = is_keyword(ptr, len, "setflag")) != 0) ! 13976: uc->cmd = UC_SETFLAG; ! 13977: else if ((arg_len = is_keyword(ptr, len, "resetdev")) != 0) ! 13978: uc->cmd = UC_RESETDEV; ! 13979: else if ((arg_len = is_keyword(ptr, len, "cleardev")) != 0) ! 13980: uc->cmd = UC_CLEARDEV; ! 13981: else ! 13982: arg_len = 0; ! 13983: ! 13984: #ifdef DEBUG_PROC_INFO ! 13985: printk("ncr_user_command: arg_len=%d, cmd=%ld\n", arg_len, uc->cmd); ! 13986: #endif ! 13987: ! 13988: if (!arg_len) ! 13989: return -EINVAL; ! 13990: ptr += arg_len; len -= arg_len; ! 13991: ! 13992: switch(uc->cmd) { ! 13993: case UC_SETSYNC: ! 13994: case UC_SETTAGS: ! 13995: case UC_SETWIDE: ! 13996: case UC_SETFLAG: ! 13997: case UC_RESETDEV: ! 13998: case UC_CLEARDEV: ! 13999: SKIP_SPACES(1); ! 14000: if ((arg_len = is_keyword(ptr, len, "all")) != 0) { ! 14001: ptr += arg_len; len -= arg_len; ! 14002: uc->target = ~0; ! 14003: } else { ! 14004: GET_INT_ARG(target); ! 14005: uc->target = (1<<target); ! 14006: #ifdef DEBUG_PROC_INFO ! 14007: printk("ncr_user_command: target=%ld\n", target); ! 14008: #endif ! 14009: } ! 14010: break; ! 14011: } ! 14012: ! 14013: switch(uc->cmd) { ! 14014: case UC_SETVERBOSE: ! 14015: case UC_SETSYNC: ! 14016: case UC_SETTAGS: ! 14017: case UC_SETWIDE: ! 14018: SKIP_SPACES(1); ! 14019: GET_INT_ARG(uc->data); ! 14020: #ifdef DEBUG_PROC_INFO ! 14021: printk("ncr_user_command: data=%ld\n", uc->data); ! 14022: #endif ! 14023: break; ! 14024: case UC_SETORDER: ! 14025: SKIP_SPACES(1); ! 14026: if ((arg_len = is_keyword(ptr, len, "simple"))) ! 14027: uc->data = M_SIMPLE_TAG; ! 14028: else if ((arg_len = is_keyword(ptr, len, "ordered"))) ! 14029: uc->data = M_ORDERED_TAG; ! 14030: else if ((arg_len = is_keyword(ptr, len, "default"))) ! 14031: uc->data = 0; ! 14032: else ! 14033: return -EINVAL; ! 14034: break; ! 14035: case UC_SETDEBUG: ! 14036: while (len > 0) { ! 14037: SKIP_SPACES(1); ! 14038: if ((arg_len = is_keyword(ptr, len, "alloc"))) ! 14039: uc->data |= DEBUG_ALLOC; ! 14040: else if ((arg_len = is_keyword(ptr, len, "phase"))) ! 14041: uc->data |= DEBUG_PHASE; ! 14042: else if ((arg_len = is_keyword(ptr, len, "queue"))) ! 14043: uc->data |= DEBUG_QUEUE; ! 14044: else if ((arg_len = is_keyword(ptr, len, "result"))) ! 14045: uc->data |= DEBUG_RESULT; ! 14046: else if ((arg_len = is_keyword(ptr, len, "pointer"))) ! 14047: uc->data |= DEBUG_POINTER; ! 14048: else if ((arg_len = is_keyword(ptr, len, "script"))) ! 14049: uc->data |= DEBUG_SCRIPT; ! 14050: else if ((arg_len = is_keyword(ptr, len, "tiny"))) ! 14051: uc->data |= DEBUG_TINY; ! 14052: else if ((arg_len = is_keyword(ptr, len, "timing"))) ! 14053: uc->data |= DEBUG_TIMING; ! 14054: else if ((arg_len = is_keyword(ptr, len, "nego"))) ! 14055: uc->data |= DEBUG_NEGO; ! 14056: else if ((arg_len = is_keyword(ptr, len, "tags"))) ! 14057: uc->data |= DEBUG_TAGS; ! 14058: else ! 14059: return -EINVAL; ! 14060: ptr += arg_len; len -= arg_len; ! 14061: } ! 14062: #ifdef DEBUG_PROC_INFO ! 14063: printk("ncr_user_command: data=%ld\n", uc->data); ! 14064: #endif ! 14065: break; ! 14066: case UC_SETFLAG: ! 14067: while (len > 0) { ! 14068: SKIP_SPACES(1); ! 14069: if ((arg_len = is_keyword(ptr, len, "trace"))) ! 14070: uc->data |= UF_TRACE; ! 14071: else if ((arg_len = is_keyword(ptr, len, "no_disc"))) ! 14072: uc->data |= UF_NODISC; ! 14073: else ! 14074: return -EINVAL; ! 14075: ptr += arg_len; len -= arg_len; ! 14076: } ! 14077: break; ! 14078: default: ! 14079: break; ! 14080: } ! 14081: ! 14082: if (len) ! 14083: return -EINVAL; ! 14084: else { ! 14085: long flags; ! 14086: ! 14087: NCR_LOCK_NCB(np, flags); ! 14088: ncr_usercmd (np); ! 14089: NCR_UNLOCK_NCB(np, flags); ! 14090: } ! 14091: return length; ! 14092: } ! 14093: ! 14094: #endif /* SCSI_NCR_USER_COMMAND_SUPPORT */ ! 14095: ! 14096: #ifdef SCSI_NCR_USER_INFO_SUPPORT ! 14097: ! 14098: struct info_str ! 14099: { ! 14100: char *buffer; ! 14101: int length; ! 14102: int offset; ! 14103: int pos; ! 14104: }; ! 14105: ! 14106: static void copy_mem_info(struct info_str *info, char *data, int len) ! 14107: { ! 14108: if (info->pos + len > info->length) ! 14109: len = info->length - info->pos; ! 14110: ! 14111: if (info->pos + len < info->offset) { ! 14112: info->pos += len; ! 14113: return; ! 14114: } ! 14115: if (info->pos < info->offset) { ! 14116: data += (info->offset - info->pos); ! 14117: len -= (info->offset - info->pos); ! 14118: } ! 14119: ! 14120: if (len > 0) { ! 14121: memcpy(info->buffer + info->pos, data, len); ! 14122: info->pos += len; ! 14123: } ! 14124: } ! 14125: ! 14126: static int copy_info(struct info_str *info, char *fmt, ...) ! 14127: { ! 14128: va_list args; ! 14129: char buf[81]; ! 14130: int len; ! 14131: ! 14132: va_start(args, fmt); ! 14133: len = vsprintf(buf, fmt, args); ! 14134: va_end(args); ! 14135: ! 14136: copy_mem_info(info, buf, len); ! 14137: return len; ! 14138: } ! 14139: ! 14140: /* ! 14141: ** Copy formatted information into the input buffer. ! 14142: */ ! 14143: ! 14144: static int ncr_host_info(ncb_p np, char *ptr, off_t offset, int len) ! 14145: { ! 14146: struct info_str info; ! 14147: #ifdef CONFIG_ALL_PPC ! 14148: struct device_node* of_node; ! 14149: #endif ! 14150: ! 14151: info.buffer = ptr; ! 14152: info.length = len; ! 14153: info.offset = offset; ! 14154: info.pos = 0; ! 14155: ! 14156: copy_info(&info, "General information:\n"); ! 14157: copy_info(&info, " Chip " NAME53C "%s, device id 0x%x, " ! 14158: "revision id 0x%x\n", ! 14159: np->chip_name, np->device_id, np->revision_id); ! 14160: copy_info(&info, " On PCI bus %d, device %d, function %d, " ! 14161: #ifdef __sparc__ ! 14162: "IRQ %s\n", ! 14163: #else ! 14164: "IRQ %d\n", ! 14165: #endif ! 14166: np->bus, (np->device_fn & 0xf8) >> 3, np->device_fn & 7, ! 14167: #ifdef __sparc__ ! 14168: __irq_itoa(np->irq)); ! 14169: #else ! 14170: (int) np->irq); ! 14171: #endif ! 14172: #ifdef CONFIG_ALL_PPC ! 14173: of_node = find_pci_device_OFnode(np->bus, np->device_fn); ! 14174: if (of_node && of_node->full_name) ! 14175: copy_info(&info, "PPC OpenFirmware path : %s\n", of_node->full_name); ! 14176: #endif ! 14177: copy_info(&info, " Synchronous period factor %d, " ! 14178: "max commands per lun %d\n", ! 14179: (int) np->minsync, MAX_TAGS); ! 14180: ! 14181: if (driver_setup.debug || driver_setup.verbose > 1) { ! 14182: copy_info(&info, " Debug flags 0x%x, verbosity level %d\n", ! 14183: driver_setup.debug, driver_setup.verbose); ! 14184: } ! 14185: ! 14186: return info.pos > info.offset? info.pos - info.offset : 0; ! 14187: } ! 14188: ! 14189: #endif /* SCSI_NCR_USER_INFO_SUPPORT */ ! 14190: ! 14191: /* ! 14192: ** Entry point of the scsi proc fs of the driver. ! 14193: ** - func = 0 means read (returns adapter infos) ! 14194: ** - func = 1 means write (parse user control command) ! 14195: */ ! 14196: ! 14197: static int sym53c8xx_proc_info(char *buffer, char **start, off_t offset, ! 14198: int length, int hostno, int func) ! 14199: { ! 14200: struct Scsi_Host *host; ! 14201: struct host_data *host_data; ! 14202: ncb_p ncb = 0; ! 14203: int retv; ! 14204: ! 14205: #ifdef DEBUG_PROC_INFO ! 14206: printk("sym53c8xx_proc_info: hostno=%d, func=%d\n", hostno, func); ! 14207: #endif ! 14208: ! 14209: for (host = first_host; host; host = host->next) { ! 14210: if (host->hostt != first_host->hostt) ! 14211: continue; ! 14212: if (host->host_no == hostno) { ! 14213: host_data = (struct host_data *) host->hostdata; ! 14214: ncb = host_data->ncb; ! 14215: break; ! 14216: } ! 14217: } ! 14218: ! 14219: if (!ncb) ! 14220: return -EINVAL; ! 14221: ! 14222: if (func) { ! 14223: #ifdef SCSI_NCR_USER_COMMAND_SUPPORT ! 14224: retv = ncr_user_command(ncb, buffer, length); ! 14225: #else ! 14226: retv = -EINVAL; ! 14227: #endif ! 14228: } ! 14229: else { ! 14230: if (start) ! 14231: *start = buffer; ! 14232: #ifdef SCSI_NCR_USER_INFO_SUPPORT ! 14233: retv = ncr_host_info(ncb, buffer, offset, length); ! 14234: #else ! 14235: retv = -EINVAL; ! 14236: #endif ! 14237: } ! 14238: ! 14239: return retv; ! 14240: } ! 14241: ! 14242: ! 14243: /*========================================================================= ! 14244: ** End of proc file system stuff ! 14245: **========================================================================= ! 14246: */ ! 14247: #endif ! 14248: ! 14249: ! 14250: #ifdef SCSI_NCR_NVRAM_SUPPORT ! 14251: ! 14252: /* ! 14253: * 24C16 EEPROM reading. ! 14254: * ! 14255: * GPOI0 - data in/data out ! 14256: * GPIO1 - clock ! 14257: * Symbios NVRAM wiring now also used by Tekram. ! 14258: */ ! 14259: ! 14260: #define SET_BIT 0 ! 14261: #define CLR_BIT 1 ! 14262: #define SET_CLK 2 ! 14263: #define CLR_CLK 3 ! 14264: ! 14265: /* ! 14266: * Set/clear data/clock bit in GPIO0 ! 14267: */ ! 14268: static void __init ! 14269: S24C16_set_bit(ncr_slot *np, u_char write_bit, u_char *gpreg, int bit_mode) ! 14270: { ! 14271: UDELAY (5); ! 14272: switch (bit_mode){ ! 14273: case SET_BIT: ! 14274: *gpreg |= write_bit; ! 14275: break; ! 14276: case CLR_BIT: ! 14277: *gpreg &= 0xfe; ! 14278: break; ! 14279: case SET_CLK: ! 14280: *gpreg |= 0x02; ! 14281: break; ! 14282: case CLR_CLK: ! 14283: *gpreg &= 0xfd; ! 14284: break; ! 14285: ! 14286: } ! 14287: OUTB (nc_gpreg, *gpreg); ! 14288: UDELAY (5); ! 14289: } ! 14290: ! 14291: /* ! 14292: * Send START condition to NVRAM to wake it up. ! 14293: */ ! 14294: static void __init S24C16_start(ncr_slot *np, u_char *gpreg) ! 14295: { ! 14296: S24C16_set_bit(np, 1, gpreg, SET_BIT); ! 14297: S24C16_set_bit(np, 0, gpreg, SET_CLK); ! 14298: S24C16_set_bit(np, 0, gpreg, CLR_BIT); ! 14299: S24C16_set_bit(np, 0, gpreg, CLR_CLK); ! 14300: } ! 14301: ! 14302: /* ! 14303: * Send STOP condition to NVRAM - puts NVRAM to sleep... ZZzzzz!! ! 14304: */ ! 14305: static void __init S24C16_stop(ncr_slot *np, u_char *gpreg) ! 14306: { ! 14307: S24C16_set_bit(np, 0, gpreg, SET_CLK); ! 14308: S24C16_set_bit(np, 1, gpreg, SET_BIT); ! 14309: } ! 14310: ! 14311: /* ! 14312: * Read or write a bit to the NVRAM, ! 14313: * read if GPIO0 input else write if GPIO0 output ! 14314: */ ! 14315: static void __init ! 14316: S24C16_do_bit(ncr_slot *np, u_char *read_bit, u_char write_bit, u_char *gpreg) ! 14317: { ! 14318: S24C16_set_bit(np, write_bit, gpreg, SET_BIT); ! 14319: S24C16_set_bit(np, 0, gpreg, SET_CLK); ! 14320: if (read_bit) ! 14321: *read_bit = INB (nc_gpreg); ! 14322: S24C16_set_bit(np, 0, gpreg, CLR_CLK); ! 14323: S24C16_set_bit(np, 0, gpreg, CLR_BIT); ! 14324: } ! 14325: ! 14326: /* ! 14327: * Output an ACK to the NVRAM after reading, ! 14328: * change GPIO0 to output and when done back to an input ! 14329: */ ! 14330: static void __init ! 14331: S24C16_write_ack(ncr_slot *np, u_char write_bit, u_char *gpreg, u_char *gpcntl) ! 14332: { ! 14333: OUTB (nc_gpcntl, *gpcntl & 0xfe); ! 14334: S24C16_do_bit(np, 0, write_bit, gpreg); ! 14335: OUTB (nc_gpcntl, *gpcntl); ! 14336: } ! 14337: ! 14338: /* ! 14339: * Input an ACK from NVRAM after writing, ! 14340: * change GPIO0 to input and when done back to an output ! 14341: */ ! 14342: static void __init ! 14343: S24C16_read_ack(ncr_slot *np, u_char *read_bit, u_char *gpreg, u_char *gpcntl) ! 14344: { ! 14345: OUTB (nc_gpcntl, *gpcntl | 0x01); ! 14346: S24C16_do_bit(np, read_bit, 1, gpreg); ! 14347: OUTB (nc_gpcntl, *gpcntl); ! 14348: } ! 14349: ! 14350: /* ! 14351: * WRITE a byte to the NVRAM and then get an ACK to see it was accepted OK, ! 14352: * GPIO0 must already be set as an output ! 14353: */ ! 14354: static void __init ! 14355: S24C16_write_byte(ncr_slot *np, u_char *ack_data, u_char write_data, ! 14356: u_char *gpreg, u_char *gpcntl) ! 14357: { ! 14358: int x; ! 14359: ! 14360: for (x = 0; x < 8; x++) ! 14361: S24C16_do_bit(np, 0, (write_data >> (7 - x)) & 0x01, gpreg); ! 14362: ! 14363: S24C16_read_ack(np, ack_data, gpreg, gpcntl); ! 14364: } ! 14365: ! 14366: /* ! 14367: * READ a byte from the NVRAM and then send an ACK to say we have got it, ! 14368: * GPIO0 must already be set as an input ! 14369: */ ! 14370: static void __init ! 14371: S24C16_read_byte(ncr_slot *np, u_char *read_data, u_char ack_data, ! 14372: u_char *gpreg, u_char *gpcntl) ! 14373: { ! 14374: int x; ! 14375: u_char read_bit; ! 14376: ! 14377: *read_data = 0; ! 14378: for (x = 0; x < 8; x++) { ! 14379: S24C16_do_bit(np, &read_bit, 1, gpreg); ! 14380: *read_data |= ((read_bit & 0x01) << (7 - x)); ! 14381: } ! 14382: ! 14383: S24C16_write_ack(np, ack_data, gpreg, gpcntl); ! 14384: } ! 14385: ! 14386: /* ! 14387: * Read 'len' bytes starting at 'offset'. ! 14388: */ ! 14389: static int __init ! 14390: sym_read_S24C16_nvram (ncr_slot *np, int offset, u_char *data, int len) ! 14391: { ! 14392: u_char gpcntl, gpreg; ! 14393: u_char old_gpcntl, old_gpreg; ! 14394: u_char ack_data; ! 14395: int retv = 1; ! 14396: int x; ! 14397: ! 14398: /* save current state of GPCNTL and GPREG */ ! 14399: old_gpreg = INB (nc_gpreg); ! 14400: old_gpcntl = INB (nc_gpcntl); ! 14401: gpcntl = old_gpcntl & 0xfc; ! 14402: ! 14403: /* set up GPREG & GPCNTL to set GPIO0 and GPIO1 in to known state */ ! 14404: OUTB (nc_gpreg, old_gpreg); ! 14405: OUTB (nc_gpcntl, gpcntl); ! 14406: ! 14407: /* this is to set NVRAM into a known state with GPIO0/1 both low */ ! 14408: gpreg = old_gpreg; ! 14409: S24C16_set_bit(np, 0, &gpreg, CLR_CLK); ! 14410: S24C16_set_bit(np, 0, &gpreg, CLR_BIT); ! 14411: ! 14412: /* now set NVRAM inactive with GPIO0/1 both high */ ! 14413: S24C16_stop(np, &gpreg); ! 14414: ! 14415: /* activate NVRAM */ ! 14416: S24C16_start(np, &gpreg); ! 14417: ! 14418: /* write device code and random address MSB */ ! 14419: S24C16_write_byte(np, &ack_data, ! 14420: 0xa0 | ((offset >> 7) & 0x0e), &gpreg, &gpcntl); ! 14421: if (ack_data & 0x01) ! 14422: goto out; ! 14423: ! 14424: /* write random address LSB */ ! 14425: S24C16_write_byte(np, &ack_data, ! 14426: offset & 0xff, &gpreg, &gpcntl); ! 14427: if (ack_data & 0x01) ! 14428: goto out; ! 14429: ! 14430: /* regenerate START state to set up for reading */ ! 14431: S24C16_start(np, &gpreg); ! 14432: ! 14433: /* rewrite device code and address MSB with read bit set (lsb = 0x01) */ ! 14434: S24C16_write_byte(np, &ack_data, ! 14435: 0xa1 | ((offset >> 7) & 0x0e), &gpreg, &gpcntl); ! 14436: if (ack_data & 0x01) ! 14437: goto out; ! 14438: ! 14439: /* now set up GPIO0 for inputting data */ ! 14440: gpcntl |= 0x01; ! 14441: OUTB (nc_gpcntl, gpcntl); ! 14442: ! 14443: /* input all requested data - only part of total NVRAM */ ! 14444: for (x = 0; x < len; x++) ! 14445: S24C16_read_byte(np, &data[x], (x == (len-1)), &gpreg, &gpcntl); ! 14446: ! 14447: /* finally put NVRAM back in inactive mode */ ! 14448: gpcntl &= 0xfe; ! 14449: OUTB (nc_gpcntl, gpcntl); ! 14450: S24C16_stop(np, &gpreg); ! 14451: retv = 0; ! 14452: out: ! 14453: /* return GPIO0/1 to original states after having accessed NVRAM */ ! 14454: OUTB (nc_gpcntl, old_gpcntl); ! 14455: OUTB (nc_gpreg, old_gpreg); ! 14456: ! 14457: return retv; ! 14458: } ! 14459: ! 14460: #undef SET_BIT ! 14461: #undef CLR_BIT ! 14462: #undef SET_CLK ! 14463: #undef CLR_CLK ! 14464: ! 14465: /* ! 14466: * Try reading Symbios NVRAM. ! 14467: * Return 0 if OK. ! 14468: */ ! 14469: static int __init sym_read_Symbios_nvram (ncr_slot *np, Symbios_nvram *nvram) ! 14470: { ! 14471: static u_char Symbios_trailer[6] = {0xfe, 0xfe, 0, 0, 0, 0}; ! 14472: u_char *data = (u_char *) nvram; ! 14473: int len = sizeof(*nvram); ! 14474: u_short csum; ! 14475: int x; ! 14476: ! 14477: /* probe the 24c16 and read the SYMBIOS 24c16 area */ ! 14478: if (sym_read_S24C16_nvram (np, SYMBIOS_NVRAM_ADDRESS, data, len)) ! 14479: return 1; ! 14480: ! 14481: /* check valid NVRAM signature, verify byte count and checksum */ ! 14482: if (nvram->type != 0 || ! 14483: memcmp(nvram->trailer, Symbios_trailer, 6) || ! 14484: nvram->byte_count != len - 12) ! 14485: return 1; ! 14486: ! 14487: /* verify checksum */ ! 14488: for (x = 6, csum = 0; x < len - 6; x++) ! 14489: csum += data[x]; ! 14490: if (csum != nvram->checksum) ! 14491: return 1; ! 14492: ! 14493: return 0; ! 14494: } ! 14495: ! 14496: /* ! 14497: * 93C46 EEPROM reading. ! 14498: * ! 14499: * GPOI0 - data in ! 14500: * GPIO1 - data out ! 14501: * GPIO2 - clock ! 14502: * GPIO4 - chip select ! 14503: * ! 14504: * Used by Tekram. ! 14505: */ ! 14506: ! 14507: /* ! 14508: * Pulse clock bit in GPIO0 ! 14509: */ ! 14510: static void __init T93C46_Clk(ncr_slot *np, u_char *gpreg) ! 14511: { ! 14512: OUTB (nc_gpreg, *gpreg | 0x04); ! 14513: UDELAY (2); ! 14514: OUTB (nc_gpreg, *gpreg); ! 14515: } ! 14516: ! 14517: /* ! 14518: * Read bit from NVRAM ! 14519: */ ! 14520: static void __init T93C46_Read_Bit(ncr_slot *np, u_char *read_bit, u_char *gpreg) ! 14521: { ! 14522: UDELAY (2); ! 14523: T93C46_Clk(np, gpreg); ! 14524: *read_bit = INB (nc_gpreg); ! 14525: } ! 14526: ! 14527: /* ! 14528: * Write bit to GPIO0 ! 14529: */ ! 14530: static void __init T93C46_Write_Bit(ncr_slot *np, u_char write_bit, u_char *gpreg) ! 14531: { ! 14532: if (write_bit & 0x01) ! 14533: *gpreg |= 0x02; ! 14534: else ! 14535: *gpreg &= 0xfd; ! 14536: ! 14537: *gpreg |= 0x10; ! 14538: ! 14539: OUTB (nc_gpreg, *gpreg); ! 14540: UDELAY (2); ! 14541: ! 14542: T93C46_Clk(np, gpreg); ! 14543: } ! 14544: ! 14545: /* ! 14546: * Send STOP condition to NVRAM - puts NVRAM to sleep... ZZZzzz!! ! 14547: */ ! 14548: static void __init T93C46_Stop(ncr_slot *np, u_char *gpreg) ! 14549: { ! 14550: *gpreg &= 0xef; ! 14551: OUTB (nc_gpreg, *gpreg); ! 14552: UDELAY (2); ! 14553: ! 14554: T93C46_Clk(np, gpreg); ! 14555: } ! 14556: ! 14557: /* ! 14558: * Send read command and address to NVRAM ! 14559: */ ! 14560: static void __init ! 14561: T93C46_Send_Command(ncr_slot *np, u_short write_data, ! 14562: u_char *read_bit, u_char *gpreg) ! 14563: { ! 14564: int x; ! 14565: ! 14566: /* send 9 bits, start bit (1), command (2), address (6) */ ! 14567: for (x = 0; x < 9; x++) ! 14568: T93C46_Write_Bit(np, (u_char) (write_data >> (8 - x)), gpreg); ! 14569: ! 14570: *read_bit = INB (nc_gpreg); ! 14571: } ! 14572: ! 14573: /* ! 14574: * READ 2 bytes from the NVRAM ! 14575: */ ! 14576: static void __init ! 14577: T93C46_Read_Word(ncr_slot *np, u_short *nvram_data, u_char *gpreg) ! 14578: { ! 14579: int x; ! 14580: u_char read_bit; ! 14581: ! 14582: *nvram_data = 0; ! 14583: for (x = 0; x < 16; x++) { ! 14584: T93C46_Read_Bit(np, &read_bit, gpreg); ! 14585: ! 14586: if (read_bit & 0x01) ! 14587: *nvram_data |= (0x01 << (15 - x)); ! 14588: else ! 14589: *nvram_data &= ~(0x01 << (15 - x)); ! 14590: } ! 14591: } ! 14592: ! 14593: /* ! 14594: * Read Tekram NvRAM data. ! 14595: */ ! 14596: static int __init ! 14597: T93C46_Read_Data(ncr_slot *np, u_short *data,int len,u_char *gpreg) ! 14598: { ! 14599: u_char read_bit; ! 14600: int x; ! 14601: ! 14602: for (x = 0; x < len; x++) { ! 14603: ! 14604: /* output read command and address */ ! 14605: T93C46_Send_Command(np, 0x180 | x, &read_bit, gpreg); ! 14606: if (read_bit & 0x01) ! 14607: return 1; /* Bad */ ! 14608: T93C46_Read_Word(np, &data[x], gpreg); ! 14609: T93C46_Stop(np, gpreg); ! 14610: } ! 14611: ! 14612: return 0; ! 14613: } ! 14614: ! 14615: /* ! 14616: * Try reading 93C46 Tekram NVRAM. ! 14617: */ ! 14618: static int __init ! 14619: sym_read_T93C46_nvram (ncr_slot *np, Tekram_nvram *nvram) ! 14620: { ! 14621: u_char gpcntl, gpreg; ! 14622: u_char old_gpcntl, old_gpreg; ! 14623: int retv = 1; ! 14624: ! 14625: /* save current state of GPCNTL and GPREG */ ! 14626: old_gpreg = INB (nc_gpreg); ! 14627: old_gpcntl = INB (nc_gpcntl); ! 14628: ! 14629: /* set up GPREG & GPCNTL to set GPIO0/1/2/4 in to known state, 0 in, ! 14630: 1/2/4 out */ ! 14631: gpreg = old_gpreg & 0xe9; ! 14632: OUTB (nc_gpreg, gpreg); ! 14633: gpcntl = (old_gpcntl & 0xe9) | 0x09; ! 14634: OUTB (nc_gpcntl, gpcntl); ! 14635: ! 14636: /* input all of NVRAM, 64 words */ ! 14637: retv = T93C46_Read_Data(np, (u_short *) nvram, ! 14638: sizeof(*nvram) / sizeof(short), &gpreg); ! 14639: ! 14640: /* return GPIO0/1/2/4 to original states after having accessed NVRAM */ ! 14641: OUTB (nc_gpcntl, old_gpcntl); ! 14642: OUTB (nc_gpreg, old_gpreg); ! 14643: ! 14644: return retv; ! 14645: } ! 14646: ! 14647: /* ! 14648: * Try reading Tekram NVRAM. ! 14649: * Return 0 if OK. ! 14650: */ ! 14651: static int __init ! 14652: sym_read_Tekram_nvram (ncr_slot *np, u_short device_id, Tekram_nvram *nvram) ! 14653: { ! 14654: u_char *data = (u_char *) nvram; ! 14655: int len = sizeof(*nvram); ! 14656: u_short csum; ! 14657: int x; ! 14658: ! 14659: switch (device_id) { ! 14660: case PCI_DEVICE_ID_NCR_53C885: ! 14661: case PCI_DEVICE_ID_NCR_53C895: ! 14662: case PCI_DEVICE_ID_NCR_53C896: ! 14663: x = sym_read_S24C16_nvram(np, TEKRAM_24C16_NVRAM_ADDRESS, ! 14664: data, len); ! 14665: break; ! 14666: case PCI_DEVICE_ID_NCR_53C875: ! 14667: x = sym_read_S24C16_nvram(np, TEKRAM_24C16_NVRAM_ADDRESS, ! 14668: data, len); ! 14669: if (!x) ! 14670: break; ! 14671: default: ! 14672: x = sym_read_T93C46_nvram(np, nvram); ! 14673: break; ! 14674: } ! 14675: if (x) ! 14676: return 1; ! 14677: ! 14678: /* verify checksum */ ! 14679: for (x = 0, csum = 0; x < len - 1; x += 2) ! 14680: csum += data[x] + (data[x+1] << 8); ! 14681: if (csum != 0x1234) ! 14682: return 1; ! 14683: ! 14684: return 0; ! 14685: } ! 14686: ! 14687: #endif /* SCSI_NCR_NVRAM_SUPPORT */ ! 14688: ! 14689: /* ! 14690: ** Module stuff ! 14691: */ ! 14692: ! 14693: #ifdef MODULE ! 14694: Scsi_Host_Template driver_template = SYM53C8XX; ! 14695: #include "scsi_module.c" ! 14696: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.