home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-04-23 | 101.7 KB | 3,497 lines |
- diff -u --recursive --new-file v1.2.5/linux/CREDITS linux/CREDITS
- --- v1.2.5/linux/CREDITS Wed Mar 29 06:52:56 1995
- +++ linux/CREDITS Sun Apr 16 08:12:01 1995
- @@ -683,6 +683,10 @@
- D: CDROM driver "sonycd535" (Sony CDU-535/531)
- S:
-
- +N: Frederic Potter
- +E: Frederic.Potter@masi.ibp.fr
- +D: Some PCI kernel support
- +
- N: Stefan Probst
- E: snprobst@immd4.informatik.uni-erlangen.de
- D: The Linux Support Team Erlangen
- diff -u --recursive --new-file v1.2.5/linux/Makefile linux/Makefile
- --- v1.2.5/linux/Makefile Fri Apr 14 12:02:41 1995
- +++ linux/Makefile Fri Apr 14 12:05:10 1995
- @@ -1,6 +1,6 @@
- VERSION = 1
- PATCHLEVEL = 2
- -SUBLEVEL = 5
- +SUBLEVEL = 6
-
- ARCH = i386
-
- diff -u --recursive --new-file v1.2.5/linux/arch/i386/config.in linux/arch/i386/config.in
- --- v1.2.5/linux/arch/i386/config.in Wed Feb 15 10:50:55 1995
- +++ linux/arch/i386/config.in Mon Apr 17 13:47:56 1995
- @@ -74,6 +74,10 @@
- bool 'Scsi CDROM support' CONFIG_BLK_DEV_SR n
- bool 'Scsi generic support' CONFIG_CHR_DEV_SG n
-
- +comment 'Some SCSI devices (e.g. CD jukebox) support multiple LUNs'
- +
- +bool 'Probe all LUNs on each SCSI device' CONFIG_SCSI_MULTI_LUN n
- +
- comment 'SCSI low-level drivers'
-
- bool 'Adaptec AHA152X support' CONFIG_SCSI_AHA152X n
- diff -u --recursive --new-file v1.2.5/linux/drivers/char/ChangeLog linux/drivers/char/ChangeLog
- --- v1.2.5/linux/drivers/char/ChangeLog Fri Apr 14 12:02:41 1995
- +++ linux/drivers/char/ChangeLog Fri Apr 14 12:01:41 1995
- @@ -4,7 +4,7 @@
- rs_init): Hangups are now scheduled via a separate tqueue
- structure in the async_struct structure, tqueue_hangup.
- This task is pushed on to the tq_schedule queue, so that
- - it is processed syncronously by the scheduler.
- + it is processed synchronously by the scheduler.
-
- Sat Feb 18 12:13:51 1995 Theodore Y. Ts'o (tytso@rt-11)
-
- diff -u --recursive --new-file v1.2.5/linux/drivers/char/serial.c linux/drivers/char/serial.c
- --- v1.2.5/linux/drivers/char/serial.c Fri Apr 14 12:02:41 1995
- +++ linux/drivers/char/serial.c Fri Apr 14 12:01:40 1995
- @@ -733,7 +733,7 @@
-
- /*
- * This routine is called from the scheduler tqueue when the interrupt
- - * routine has signalled that a hangup has occured. The path of
- + * routine has signalled that a hangup has occurred. The path of
- * hangup processing is:
- *
- * serial interrupt routine -> (scheduler tqueue) ->
- diff -u --recursive --new-file v1.2.5/linux/drivers/net/lance.c linux/drivers/net/lance.c
- --- v1.2.5/linux/drivers/net/lance.c Fri Apr 14 12:02:41 1995
- +++ linux/drivers/net/lance.c Fri Apr 14 12:01:40 1995
- @@ -15,7 +15,7 @@
- Code 930.5, Goddard Space Flight Center, Greenbelt MD 20771
- */
-
- -static char *version = "lance.c:v1.07 1/18/95 becker@cesdis.gsfc.nasa.gov\n";
- +static char *version = "lance.c:v1.08 4/10/95 dplatt@3do.com\n";
-
- #include <linux/config.h>
- #include <linux/kernel.h>
- @@ -203,12 +203,18 @@
- int dirty_rx, dirty_tx; /* The ring entries to be free()ed. */
- int dma;
- struct enet_statistics stats;
- - char chip_version; /* See lance_chip_type. */
- + unsigned char chip_version; /* See lance_chip_type. */
- char tx_full;
- char lock;
- int pad0, pad1; /* Used for 8-byte alignment */
- };
-
- +#define LANCE_MUST_PAD 0x00000001
- +#define LANCE_ENABLE_AUTOSELECT 0x00000002
- +#define LANCE_MUST_REINIT_RING 0x00000004
- +#define LANCE_MUST_UNRESET 0x00000008
- +#define LANCE_HAS_MISSED_FRAME 0x00000010
- +
- /* A mapping from the chip ID number to the part number and features.
- These are from the datasheets -- in real life the '970 version
- reportedly has the same ID as the '965. */
- @@ -217,14 +223,25 @@
- char *name;
- int flags;
- } chip_table[] = {
- - {0x0000, "LANCE 7990", 0}, /* Ancient lance chip. */
- - {0x0003, "PCnet/ISA 79C960", 0}, /* 79C960 PCnet/ISA. */
- - {0x2260, "PCnet/ISA+ 79C961", 0}, /* 79C961 PCnet/ISA+, Plug-n-Play. */
- - {0x2420, "PCnet/PCI 79C970", 0}, /* 79C970 or 79C974 PCnet-SCSI, PCI. */
- + {0x0000, "LANCE 7990", /* Ancient lance chip. */
- + LANCE_MUST_PAD + LANCE_MUST_UNRESET},
- + {0x0003, "PCnet/ISA 79C960", /* 79C960 PCnet/ISA. */
- + LANCE_ENABLE_AUTOSELECT + LANCE_MUST_REINIT_RING +
- + LANCE_HAS_MISSED_FRAME},
- + {0x2260, "PCnet/ISA+ 79C961", /* 79C961 PCnet/ISA+, Plug-n-Play. */
- + LANCE_ENABLE_AUTOSELECT + LANCE_MUST_REINIT_RING +
- + LANCE_HAS_MISSED_FRAME},
- + {0x2420, "PCnet/PCI 79C970", /* 79C970 or 79C974 PCnet-SCSI, PCI. */
- + LANCE_ENABLE_AUTOSELECT + LANCE_MUST_REINIT_RING +
- + LANCE_HAS_MISSED_FRAME},
- /* Bug: the PCnet/PCI actually uses the PCnet/VLB ID number, so just call
- it the PCnet32. */
- - {0x2430, "PCnet32", 0}, /* 79C965 PCnet for VL bus. */
- - {0x0, "PCnet (unknown)", 0},
- + {0x2430, "PCnet32", /* 79C965 PCnet for VL bus. */
- + LANCE_ENABLE_AUTOSELECT + LANCE_MUST_REINIT_RING +
- + LANCE_HAS_MISSED_FRAME},
- + {0x0, "PCnet (unknown)",
- + LANCE_ENABLE_AUTOSELECT + LANCE_MUST_REINIT_RING +
- + LANCE_HAS_MISSED_FRAME},
- };
-
- enum {OLD_LANCE = 0, PCNET_ISA=1, PCNET_ISAP=2, PCNET_PCI=3, PCNET_VLB=4, LANCE_UNKNOWN=5};
- @@ -256,8 +273,6 @@
- int *port;
-
- #if defined(CONFIG_PCI)
- -#define AMD_VENDOR_ID 0x1022
- -#define AMD_DEVICE_ID 0x2000
- if (pcibios_present()) {
- int pci_index;
- printk("lance.c: PCI bios is present, checking for devices...\n");
- @@ -266,7 +281,8 @@
- unsigned long pci_ioaddr;
- unsigned short pci_command;
-
- - if (pcibios_find_device (AMD_VENDOR_ID, AMD_DEVICE_ID, pci_index,
- + if (pcibios_find_device (PCI_VENDOR_ID_AMD,
- + PCI_DEVICE_ID_AMD_LANCE, pci_index,
- &pci_bus, &pci_device_fn) != 0)
- break;
- pcibios_read_config_byte(pci_bus, pci_device_fn,
- @@ -522,7 +538,7 @@
- }
- }
-
- - if (lp->chip_version != OLD_LANCE) {
- + if (chip_table[lp->chip_version].flags & LANCE_ENABLE_AUTOSELECT) {
- /* Turn on auto-select of media (10baseT or BNC) so that the user
- can watch the LEDs even if the board isn't opened. */
- outw(0x0002, ioaddr+LANCE_ADDR);
- @@ -570,10 +586,10 @@
- }
-
- /* Un-Reset the LANCE, needed only for the NE2100. */
- - if (lp->chip_version == OLD_LANCE)
- + if (chip_table[lp->chip_version].flags & LANCE_MUST_UNRESET)
- outw(0, ioaddr+LANCE_RESET);
-
- - if (lp->chip_version != OLD_LANCE) {
- + if (chip_table[lp->chip_version].flags & LANCE_ENABLE_AUTOSELECT) {
- /* This is 79C960-specific: Turn on auto-select of media (AUI, BNC). */
- outw(0x0002, ioaddr+LANCE_ADDR);
- outw(0x0002, ioaddr+LANCE_BUS_IF);
- @@ -617,6 +633,33 @@
- return 0; /* Always succeed */
- }
-
- +/* The LANCE has been halted for one reason or another (busmaster memory
- + arbitration error, Tx FIFO underflow, driver stopped it to reconfigure,
- + etc.). Modern LANCE variants always reload their ring-buffer
- + configuration when restarted, so we must reinitialize our ring
- + context before restarting. As part of this reinitialization,
- + find all packets still on the Tx ring and pretend that they had been
- + sent (in effect, drop the packets on the floor) - the higher-level
- + protocols will time out and retransmit. It'd be better to shuffle
- + these skbs to a temp list and then actually re-Tx them after
- + restarting the chip, but I'm too lazy to do so right now. dplatt@3do.com
- +*/
- +
- +static void
- +lance_purge_tx_ring(struct device *dev)
- +{
- + struct lance_private *lp = (struct lance_private *)dev->priv;
- + int i;
- +
- + for (i = 0; i < TX_RING_SIZE; i++) {
- + if (lp->tx_skbuff[i]) {
- + dev_kfree_skb(lp->tx_skbuff[i],FREE_WRITE);
- + lp->tx_skbuff[i] = NULL;
- + }
- + }
- +}
- +
- +
- /* Initialize the LANCE Rx and Tx rings. */
- static void
- lance_init_ring(struct device *dev)
- @@ -647,12 +690,27 @@
- lp->init_block.tx_ring = (int)lp->tx_ring | TX_RING_LEN_BITS;
- }
-
- +static void
- +lance_restart(struct device *dev, unsigned int csr0_bits, int must_reinit)
- +{
- + struct lance_private *lp = (struct lance_private *)dev->priv;
- +
- + if (must_reinit ||
- + (chip_table[lp->chip_version].flags & LANCE_MUST_REINIT_RING)) {
- + lance_purge_tx_ring(dev);
- + lance_init_ring(dev);
- + }
- + outw(0x0000, dev->base_addr + LANCE_ADDR);
- + outw(csr0_bits, dev->base_addr + LANCE_DATA);
- +}
- +
- static int
- lance_start_xmit(struct sk_buff *skb, struct device *dev)
- {
- struct lance_private *lp = (struct lance_private *)dev->priv;
- int ioaddr = dev->base_addr;
- int entry;
- + unsigned long flags;
-
- /* Transmitter timeout, serious problems. */
- if (dev->tbusy) {
- @@ -681,8 +739,7 @@
- printk("\n");
- }
- #endif
- - lance_init_ring(dev);
- - outw(0x0043, ioaddr+LANCE_DATA);
- + lance_restart(dev, 0x0043, 1);
-
- dev->tbusy=0;
- dev->trans_start = jiffies;
- @@ -728,7 +785,7 @@
- with the "ownership" bits last. */
-
- /* The old LANCE chips doesn't automatically pad buffers to min. size. */
- - if (lp->chip_version == OLD_LANCE) {
- + if (chip_table[lp->chip_version].flags & LANCE_MUST_PAD) {
- lp->tx_ring[entry].length =
- -(ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN);
- } else
- @@ -758,13 +815,14 @@
-
- dev->trans_start = jiffies;
-
- + save_flags(flags);
- cli();
- lp->lock = 0;
- if (lp->tx_ring[(entry+1) & TX_RING_MOD_MASK].base == 0)
- dev->tbusy=0;
- else
- lp->tx_full = 1;
- - sti();
- + restore_flags(flags);
-
- return 0;
- }
- @@ -776,6 +834,7 @@
- struct device *dev = (struct device *)(irq2dev_map[irq]);
- struct lance_private *lp;
- int csr0, ioaddr, boguscnt=10;
- + int must_restart;
-
- if (dev == NULL) {
- printk ("lance_interrupt(): irq %d for unknown device.\n", irq);
- @@ -795,6 +854,8 @@
- /* Acknowledge all of the current interrupt sources ASAP. */
- outw(csr0 & ~0x004f, dev->base_addr + LANCE_DATA);
-
- + must_restart = 0;
- +
- if (lance_debug > 5)
- printk("%s: interrupt csr0=%#2.2x new csr=%#2.2x.\n",
- dev->name, csr0, inw(dev->base_addr + LANCE_DATA));
- @@ -828,7 +889,7 @@
- printk("%s: Tx FIFO error! Status %4.4x.\n",
- dev->name, csr0);
- /* Restart the chip. */
- - outw(0x0002, dev->base_addr + LANCE_DATA);
- + must_restart = 1;
- }
- } else {
- if (status & 0x18000000)
- @@ -871,7 +932,14 @@
- printk("%s: Bus master arbitration failure, status %4.4x.\n",
- dev->name, csr0);
- /* Restart the chip. */
- - outw(0x0002, dev->base_addr + LANCE_DATA);
- + must_restart = 1;
- + }
- +
- + if (must_restart) {
- + /* stop the chip to clear the error condition, then restart */
- + outw(0x0000, dev->base_addr + LANCE_ADDR);
- + outw(0x0004, dev->base_addr + LANCE_DATA);
- + lance_restart(dev, 0x0002, 0);
- }
- }
-
- @@ -961,7 +1029,7 @@
- dev->start = 0;
- dev->tbusy = 1;
-
- - if (lp->chip_version != OLD_LANCE) {
- + if (chip_table[lp->chip_version].flags & LANCE_HAS_MISSED_FRAME) {
- outw(112, ioaddr+LANCE_ADDR);
- lp->stats.rx_missed_errors = inw(ioaddr+LANCE_DATA);
- }
- @@ -991,14 +1059,16 @@
- struct lance_private *lp = (struct lance_private *)dev->priv;
- short ioaddr = dev->base_addr;
- short saved_addr;
- + unsigned long flags;
-
- - if (lp->chip_version != OLD_LANCE) {
- + if (chip_table[lp->chip_version].flags & LANCE_HAS_MISSED_FRAME) {
- + save_flags(flags);
- cli();
- saved_addr = inw(ioaddr+LANCE_ADDR);
- outw(112, ioaddr+LANCE_ADDR);
- lp->stats.rx_missed_errors = inw(ioaddr+LANCE_DATA);
- outw(saved_addr, ioaddr+LANCE_ADDR);
- - sti();
- + restore_flags(flags);
- }
-
- return &lp->stats;
- @@ -1015,11 +1085,9 @@
- {
- short ioaddr = dev->base_addr;
-
- - /* We take the simple way out and always enable promiscuous mode. */
- outw(0, ioaddr+LANCE_ADDR);
- outw(0x0004, ioaddr+LANCE_DATA); /* Temporarily stop the lance. */
-
- - outw(15, ioaddr+LANCE_ADDR);
- if (num_addrs >= 0) {
- short multicast_table[4];
- int i;
- @@ -1029,15 +1097,17 @@
- outw(8 + i, ioaddr+LANCE_ADDR);
- outw(multicast_table[i], ioaddr+LANCE_DATA);
- }
- + outw(15, ioaddr+LANCE_ADDR);
- outw(0x0000, ioaddr+LANCE_DATA); /* Unset promiscuous mode */
- } else {
- /* Log any net taps. */
- printk("%s: Promiscuous mode enabled.\n", dev->name);
- + outw(15, ioaddr+LANCE_ADDR);
- outw(0x8000, ioaddr+LANCE_DATA); /* Set promiscuous mode */
- }
-
- - outw(0, ioaddr+LANCE_ADDR);
- - outw(0x0142, ioaddr+LANCE_DATA); /* Resume normal operation. */
- + lance_restart(dev, 0x0142, 0); /* Resume normal operation */
- +
- }
-
-
- diff -u --recursive --new-file v1.2.5/linux/drivers/net/ne.c linux/drivers/net/ne.c
- --- v1.2.5/linux/drivers/net/ne.c Fri Apr 14 12:02:41 1995
- +++ linux/drivers/net/ne.c Thu Apr 20 11:24:55 1995
- @@ -376,7 +376,6 @@
- {
- int retries = 0;
- int nic_base = NE_BASE;
- - unsigned long flags;
-
- /* Round the count up for word writes. Do we need to do this?
- What effect will an odd byte count have on the 8390?
- @@ -412,19 +411,7 @@
- SLOW_DOWN_IO;
- #endif /* rw_bugfix */
-
- - /*
- - Now the normal output. I believe that if we don't lock this, a
- - race condition will munge the remote byte count values, and then
- - the ne2k will hang the machine by holding I/O CH RDY because it
- - expects more data. Hopefully fixes the lockups. -- Paul Gortmaker.
- -
- - Use save_flags/cli/restore_flags rather than cli/sti to avoid risk
- - of accidentally enabling interrupts which were disabled when we
- - were entered. Dave Platt <dplatt@3do.com>
- - */
- -
- - save_flags(flags);
- - cli();
- + /* Now the normal output. */
- outb_p(count & 0xff, nic_base + EN0_RCNTLO);
- outb_p(count >> 8, nic_base + EN0_RCNTHI);
- outb_p(0x00, nic_base + EN0_RSARLO);
- @@ -436,7 +423,6 @@
- } else {
- outsb(NE_BASE + NE_DATAPORT, buf, count);
- }
- - restore_flags(flags);
-
- #ifdef CONFIG_NE_SANITY
- /* This was for the ALPHA version only, but enough people have
- diff -u --recursive --new-file v1.2.5/linux/drivers/net/plip.c linux/drivers/net/plip.c
- --- v1.2.5/linux/drivers/net/plip.c Mon Feb 20 08:59:52 1995
- +++ linux/drivers/net/plip.c Mon Apr 17 13:47:56 1995
- @@ -98,6 +98,7 @@
- #include <linux/ioport.h>
- #include <asm/bitops.h>
- #include <asm/irq.h>
- +#include <asm/byteorder.h>
-
- /* Use 0 for production, 1 for verification, >2 for debug */
- #ifndef NET_DEBUG
- @@ -165,26 +166,14 @@
- enum plip_nibble_state nibble;
- union {
- struct {
- -#if defined(__i386__)
- +#if defined(LITTLE_ENDIAN)
- unsigned char lsb;
- unsigned char msb;
- -#elif defined(__mc68000__)
- +#elif defined(BIG_ENDIAN)
- unsigned char msb;
- unsigned char lsb;
- -#elif defined(__sparc__)
- - unsigned char msb;
- - unsigned char lsb;
- -#elif defined(__MIPSEL__)
- - unsigned char lsb;
- - unsigned char msb;
- -#elif defined(__MIPSEB__)
- - unsigned char msb;
- - unsigned char lsb;
- -#elif defined(__alpha__)
- - unsigned char lsb;
- - unsigned char msb;
- #else
- -#error "Adjust this structure to match your CPU"
- +#error "Please fix the endianness defines in <asm/byteorder.h>"
- #endif
- } b;
- unsigned short h;
- diff -u --recursive --new-file v1.2.5/linux/drivers/scsi/53c7,8xx.c linux/drivers/scsi/53c7,8xx.c
- --- v1.2.5/linux/drivers/scsi/53c7,8xx.c Sun Feb 19 11:22:43 1995
- +++ linux/drivers/scsi/53c7,8xx.c Mon Apr 17 13:47:57 1995
- @@ -5,8 +5,8 @@
- * weed out brain damaged main boards.
- */
-
- -#define PERM_OPTIONS (OPTION_IO_MAPPED|OPTION_DEBUG_TEST1)
-
- +#define PERM_OPTIONS (OPTION_IO_MAPPED|OPTION_DEBUG_TEST1)
- /*
- * Define SCSI_MALLOC to use scsi_malloc instead of kmalloc. Other than
- * preventing deadlock, I'm not sure why we'd want to do this.
- @@ -20,7 +20,7 @@
- * Hannover, Germany
- * hm@ix.de
- *
- - * Copyright 1993, 1994 Drew Eckhardt
- + * Copyright 1993, 1994, 1995 Drew Eckhardt
- * Visionary Computing
- * (Unix and Linux consulting and custom programming)
- * drew@Colorado.EDU
- @@ -28,8 +28,6 @@
- *
- * TolerANT and SCSI SCRIPTS are registered trademarks of NCR Corporation.
- *
- - * PRE-ALPHA
- - *
- * For more information, please consult
- *
- *
- @@ -156,6 +154,11 @@
- *
- */
-
- +#ifdef MODULE
- +#include <linux/module.h>
- +#endif
- +
- +#include <asm/dma.h>
- #include <asm/io.h>
- #include <asm/system.h>
- #include <linux/delay.h>
- @@ -176,7 +179,9 @@
- static void abnormal_finished (struct NCR53c7x0_cmd *cmd, int result);
- static int NCR53c8xx_run_tests (struct Scsi_Host *host);
- static int NCR53c8xx_script_len;
- +static int NCR53c8xx_dsa_len;
- static void NCR53c7x0_intr(int irq, struct pt_regs * regs);
- +static int halt (struct Scsi_Host *host);
- static void intr_phase_mismatch (struct Scsi_Host *host, struct NCR53c7x0_cmd
- *cmd);
- static void intr_dma (struct Scsi_Host *host, struct NCR53c7x0_cmd *cmd);
- @@ -190,40 +195,11 @@
- NCR53c7x0_cmd *cmd);
- static void NCR53c8x0_soft_reset (struct Scsi_Host *host);
-
- +static int perm_options = PERM_OPTIONS;
- +
- static struct Scsi_Host *first_host = NULL; /* Head of list of NCR boards */
- static Scsi_Host_Template *the_template = NULL;
-
- -/* Allocate storage space for constant messages, etc. */
- -
- -static long NCR53c7xx_zero = 0;
- -static long NCR53c7xx_sink;
- -static char NCR53c7xx_msg_reject = MESSAGE_REJECT;
- -static char NCR53c7xx_msg_abort = ABORT;
- -static char NCR53c7xx_msg_nop = NOP;
- -
- -/* Buffer for commands run before *malloc() works */
- -/*
- - * XXX - if need be, replace this with normal wait.
- - */
- -static int scan_scsis_buf_busy = 0;
- -static char scan_scsis_buf[512];
- -
- -
- -/*
- - * Spl-levels are evil. We shouldn't emulate braindamage.
- - * Linus
- - */
- -static int splx (int new_level)
- -{
- - register int old_level, tmp;
- - save_flags(tmp);
- - old_level = (tmp & 0x200) ? 7 : 0;
- - if (new_level)
- - sti();
- - else
- - cli();
- - return old_level;
- -}
-
- /*
- * TODO :
- @@ -285,8 +261,7 @@
- *
- * For the very similar chips, we should probably hack the fixup code
- * and interrupt code so that it works everywhere, but I suspect the
- - * NCR53c700 is going
- - * to need it's own fixup routine.
- + * NCR53c700 is going to need it's own fixup routine.
- */
-
- /*
- @@ -420,7 +395,8 @@
- * field of the hostdata structure MUST have been set.
- */
-
- -static int NCR53c7x0_init (struct Scsi_Host *host) {
- +static int
- +NCR53c7x0_init (struct Scsi_Host *host) {
- NCR53c7x0_local_declare();
- /* unsigned char tmp; */
- int i, j, ccf;
- @@ -450,13 +426,19 @@
- return -1;
- }
-
- + /* Assign constants accessed by NCR */
- + hostdata->NCR53c7xx_zero = 0;
- + hostdata->NCR53c7xx_msg_reject = MESSAGE_REJECT;
- + hostdata->NCR53c7xx_msg_abort = ABORT;
- + hostdata->NCR53c7xx_msg_nop = NOP;
- +
- /*
- * Set up an interrupt handler if we aren't already sharing an IRQ
- * with another board.
- */
-
- - for (search = first_host; search && (search->hostt == the_template) &&
- - (search->irq != host->irq); search=search->next);
- + for (search = first_host; search && ((search->hostt != the_template) ||
- + (search->irq != host->irq)); search=search->next);
-
- if (!search) {
- if (request_irq(host->irq, NCR53c7x0_intr, SA_INTERRUPT, "53c7,8xx")) {
- @@ -479,6 +461,10 @@
- hostdata->istat = ((hostdata->chip / 100) == 8) ?
- ISTAT_REG_800 : ISTAT_REG_700;
-
- +/* Only the ISTAT register is readable when the NCR is running, so make
- + sure it's halted. */
- + halt(host);
- +
- /*
- * XXX - the NCR53c700 uses bitfielded registers for SCID, SDID, etc,
- * as does the 710 with one bit per SCSI ID. Conversely, the NCR
- @@ -523,9 +509,9 @@
- hostdata->saved_dcntl = NCR53c7x0_read8(DCNTL_REG);
-
- if ((hostdata->chip / 100) == 8)
- - printk ("scsi%d : using %s interrupts.\n", host->host_no,
- - (hostdata->saved_dcntl & DCNTL_800_IRQM) ? "level active" :
- - "edge triggered");
- + printk ("scsi%d : using %s interrupts\n", host->host_no,
- + (hostdata->saved_dcntl & DCNTL_800_IRQM) ? "edge triggered" :
- + "level active");
-
- /*
- * DMODE controls DMA burst length, and on 700 series chips,
- @@ -547,8 +533,9 @@
- case DMODE_BL_4: i = 4; break;
- case DMODE_BL_8: i = 8; break;
- case DMODE_BL_16: i = 16; break;
- + default: i = 0;
- }
- - printk ("scsi%d ; burst length %d\n", host->host_no, i);
- + printk ("scsi%d : burst length %d\n", host->host_no, i);
- }
- }
-
- @@ -592,6 +579,7 @@
- */
-
- for (i = 0; i < 8; ++i) {
- + hostdata->cmd_allocated[i] = 0;
- for (j = 0; j < 8; ++j)
- hostdata->busy[i][j] = 0;
- /*
- @@ -620,8 +608,8 @@
-
- hostdata->issue_queue = hostdata->running_list =
- hostdata->finished_queue = NULL;
- - hostdata->issue_dsa_head =
- - hostdata->issue_dsa_tail = NULL;
- + hostdata->issue_dsa_head = NULL;
- + hostdata->issue_dsa_tail = NULL;
-
- if (hostdata->init_save_regs)
- hostdata->init_save_regs (host);
- @@ -688,11 +676,11 @@
- struct Scsi_Host *instance;
- struct NCR53c7x0_hostdata *hostdata;
- char chip_str[80];
- - int script_len = 0, size = 0;
- + int script_len = 0, dsa_len = 0, size = 0, max_cmd_size = 0;
- int ok = 0;
-
-
- - options |= PERM_OPTIONS;
- + options |= perm_options;
-
- switch (chip) {
- case 825:
- @@ -700,6 +688,7 @@
- case 815:
- case 810:
- script_len = NCR53c8xx_script_len;
- + dsa_len = NCR53c8xx_dsa_len;
- options |= OPTION_INTFLY;
- sprintf (chip_str, "NCR53c%d", chip);
- break;
- @@ -718,7 +707,7 @@
- if ((chip / 100 == 8) && !pci_valid)
- printk ("scsi-ncr53c7,8xx : for better reliability and performance, please use the\n"
- " PCI override instead.\n"
- - " Syntax : ncr53c8{10,20,25}=pci,<bus>,<device>,<function>\n"
- + " Syntax : ncr53c8{10,15,20,25}=pci,<bus>,<device>,<function>\n"
- " <bus> and <device> are usually 0.\n");
-
- if (options & OPTION_DEBUG_PROBE_ONLY) {
- @@ -726,9 +715,50 @@
- return -1;
- }
-
- - size = sizeof(struct NCR53c7x0_hostdata) + script_len;
- + max_cmd_size = sizeof(struct NCR53c7x0_cmd) + dsa_len +
- + /* Size of dynamic part of command structure : */
- + 2 * /* Worst case : we don't know if we need DATA IN or DATA out */
- + ( 2 * /* Current instructions per scatter/gather segment */
- + tpnt->sg_tablesize +
- + 3 /* Current startup / termination required per phase */
- + ) *
- + 8 /* Each instruction is eight bytes */;
- + /* Note that alignment will be guaranteed, since we put the command
- + allocated at probe time after the fixed-up SCSI script, which
- + consists of 32 bit words, aligned on a 32 bit boundary. */
- +
- + /* Allocate fixed part of hostdata, dynamic part to hold appropriate
- + SCSI SCRIPT(tm) plus a single, maximum-sized NCR53c7x0_cmd structure.
- +
- + We need a NCR53c7x0_cmd structure for scan_scsis() when we are
- + not loaded as a module, and when we're loaded as a module, we
- + can't use a non-dynamically allocated structure because modules
- + are vmalloc()'d, which can allow structures to cross page
- + boundaries and breaks our physical/virtual address assumptions
- + for DMA.
- +
- + So, we stick it past the end of our hostdata structure.
- +
- + ASSUMPTION :
- + Irregardless of how many simultaenous SCSI commands we allow,
- + the probe code only executes a _single_ instruction at a time,
- + so we only need one here, and don't need to allocate NCR53c7x0_cmd
- + structures for each target until we are no longer in scan_scsis
- + and kmalloc() has become functional (memory_init() happens
- + after all device driver initialization).
- + */
- +
- + size = sizeof(struct NCR53c7x0_hostdata) + script_len + max_cmd_size;
-
- instance = scsi_register (tpnt, size);
- + if (!instance)
- + return -1;
- +
- +
- + /* FIXME : if we ever support an ISA NCR53c7xx based board, we
- + need to check if the chip is running in a 16 bit mode, and if so
- + unregister it if it is past the 16M (0x1000000) mark */
- +
- hostdata = (struct NCR53c7x0_hostdata *)
- instance->hostdata;
- hostdata->size = size;
- @@ -784,7 +814,18 @@
- instance->dma_channel = dma;
-
- hostdata->options = options;
- -
- + hostdata->dsa_size = dsa_len;
- + hostdata->max_cmd_size = max_cmd_size;
- + hostdata->num_cmds = 1;
- + /* Initialize single command */
- + hostdata->free = (struct NCR53c7x0_cmd *)
- + (hostdata->script + hostdata->script_count);
- + hostdata->free->real = (void *) hostdata->free;
- + hostdata->free->size = max_cmd_size;
- + hostdata->free->free = NULL;
- + hostdata->free->next = NULL;
- +
- +
- return NCR53c7x0_init(instance);
- }
-
- @@ -796,7 +837,7 @@
- * Purpose : initializes a NCR53c800 family based on the PCI
- * bus, device, and function location of it. Allows
- * reprogramming of latency timer and determining addresses
- - * and weather bus mastering, etc. are OK.
- + * and whether bus mastering, etc. are OK.
- *
- * Useful where a new NCR chip is backwards compatible with
- * a supported chip, but the DEVICE ID has changed so it
- @@ -815,7 +856,8 @@
- unsigned short vendor_id, device_id, command;
- unsigned long base, io_port;
- unsigned char irq, revision;
- - int error, expected_chip, expected_id, max_revision, min_revision;
- + int error, expected_chip;
- + int expected_id = -1, max_revision = -1, min_revision = -1;
- int i;
-
- printk("scsi-ncr53c7,8xx : at PCI bus %d, device %d, function %d\n",
- @@ -870,6 +912,8 @@
- io_port = 0;
- } else
- io_port &= PCI_BASE_ADDRESS_IO_MASK;
- + } else {
- + io_port = 0;
- }
-
- if (command & PCI_COMMAND_MEMORY) {
- @@ -879,6 +923,8 @@
- base = 0;
- } else
- base &= PCI_BASE_ADDRESS_MEM_MASK;
- + } else {
- + base = 0;
- }
-
- if (!io_port && !base) {
- @@ -932,7 +978,6 @@
- */
-
- int NCR53c7xx_detect(Scsi_Host_Template *tpnt) {
- - short current_chip;
- int i;
- int current_override;
- int count; /* Number of boards detected */
- @@ -979,6 +1024,7 @@
-
- #include "53c8xx_d.h"
- static int NCR53c8xx_script_len = sizeof (SCRIPT);
- +static int NCR53c8xx_dsa_len = A_dsa_end + Ent_dsa_zero - Ent_dsa_code_template;
-
- /*
- * Function : static void NCR53c8x0_init_fixup (struct Scsi_Host *host)
- @@ -989,7 +1035,8 @@
- *
- */
-
- -static void NCR53c8x0_init_fixup (struct Scsi_Host *host) {
- +static void
- +NCR53c8x0_init_fixup (struct Scsi_Host *host) {
- NCR53c7x0_local_declare();
- struct NCR53c7x0_hostdata *hostdata = (struct NCR53c7x0_hostdata *)
- host->hostdata;
- @@ -1008,6 +1055,16 @@
- for (i = 0; i < PATCHES; ++i)
- hostdata->script[LABELPATCHES[i]] +=
- (unsigned long) hostdata->script;
- + /* Fixup addresses of constants that used to be EXTERNAL */
- +
- + patch_abs_32 (hostdata->script, 0, NCR53c7xx_msg_abort,
- + (long) &(hostdata->NCR53c7xx_msg_abort));
- + patch_abs_32 (hostdata->script, 0, NCR53c7xx_msg_reject,
- + (long) &(hostdata->NCR53c7xx_msg_reject));
- + patch_abs_32 (hostdata->script, 0, NCR53c7xx_zero,
- + (long) &(hostdata->NCR53c7xx_zero));
- + patch_abs_32 (hostdata->script, 0, NCR53c7xx_sink,
- + (long) &(hostdata->NCR53c7xx_sink));
-
- /*
- * Fixup absolutes set at boot-time.
- @@ -1037,10 +1094,6 @@
- ncr_to_ncr = memory_to_ncr = ncr_to_memory = tmp;
- }
-
- - printk ("scsi%d : m_to_n = 0x%x, n_to_m = 0x%x, n_to_n = 0x%x\n",
- - (int) host->host_no, (int) memory_to_ncr, (int)
- - ncr_to_memory, ncr_to_ncr);
- -
- patch_abs_32 (hostdata->script, 0, addr_scratch, base + SCRATCHA_REG_800);
- patch_abs_32 (hostdata->script, 0, addr_sfbr, base + SFBR_REG);
- patch_abs_32 (hostdata->script, 0, addr_temp, base + TEMP_REG);
- @@ -1059,11 +1112,15 @@
- patch_abs_rwri_data (hostdata->script, 0, dmode_ncr_to_memory, ncr_to_memory);
- patch_abs_rwri_data (hostdata->script, 0, dmode_ncr_to_ncr, ncr_to_ncr);
-
- - patch_abs_32 (hostdata->script, 0, issue_dsa_head, (long) &(hostdata->issue_dsa_head));
- + patch_abs_32 (hostdata->script, 0, issue_dsa_head,
- + (long) &(hostdata->issue_dsa_head));
- patch_abs_32 (hostdata->script, 0, msg_buf, (long) &(hostdata->msg_buf));
- - patch_abs_32 (hostdata->script, 0, reconnect_dsa_head, (long) &(hostdata->reconnect_dsa_head));
- - patch_abs_32 (hostdata->script, 0, reselected_identify, (long) &(hostdata->reselected_identify));
- - patch_abs_32 (hostdata->script, 0, reselected_tag, (long) &(hostdata->reselected_tag));
- + patch_abs_32 (hostdata->script, 0, reconnect_dsa_head,
- + (long) &(hostdata->reconnect_dsa_head));
- + patch_abs_32 (hostdata->script, 0, reselected_identify,
- + (long) &(hostdata->reselected_identify));
- + patch_abs_32 (hostdata->script, 0, reselected_tag,
- + (long) &(hostdata->reselected_tag));
-
- patch_abs_32 (hostdata->script, 0, test_dest, (long) &(hostdata->test_dest));
- patch_abs_32 (hostdata->script, 0, test_src, (long) &(hostdata->test_source));
- @@ -1145,17 +1202,18 @@
- struct NCR53c7x0_hostdata *hostdata = (struct NCR53c7x0_hostdata *)
- host->hostdata;
- unsigned long timeout, start;
- - int old_level, failed, i;
- + int failed, i;
- + unsigned long flags;
- +
- NCR53c7x0_local_setup(host);
-
- - printk("scsi%d : testing\n", host->host_no);
- -
- /* The NCR chip _must_ be idle to run the test scripts */
-
- - old_level = splx(0);
- + save_flags(flags);
- + cli();
- if (!hostdata->idle) {
- printk ("scsi%d : chip not idle, aborting tests\n", host->host_no);
- - splx(old_level);
- + restore_flags(flags);
- return -1;
- }
-
- @@ -1181,7 +1239,7 @@
- printk ("scsi%d : test 1", host->host_no);
- NCR53c7x0_write32 (DSP_REG, start);
- printk (" started\n");
- - splx(7);
- + sti();
-
- timeout = jiffies + 50; /* arbitrary */
- while ((hostdata->test_completed == -1) && jiffies < timeout);
- @@ -1217,7 +1275,7 @@
- (unsigned long) hostdata->script, start);
- printk ("scsi%d : DSPS = 0x%lx\n", host->host_no,
- (unsigned long) NCR53c7x0_read32(DSPS_REG));
- - splx(old_level);
- + restore_flags(flags);
- return -1;
- }
- hostdata->test_running = 0;
- @@ -1253,10 +1311,10 @@
- dsa[11] = (unsigned long) &msg;
-
- for (i = 0; i < 3; ++i) {
- - splx(0);
- + cli();
- if (!hostdata->idle) {
- printk ("scsi%d : chip not idle, aborting tests\n", host->host_no);
- - splx(old_level);
- + restore_flags(flags);
- return -1;
- }
-
- @@ -1269,7 +1327,7 @@
- hostdata->state = STATE_RUNNING;
- NCR53c7x0_write32 (DSA_REG, (unsigned long) dsa);
- NCR53c7x0_write32 (DSP_REG, start);
- - splx(7);
- + sti();
-
- timeout = jiffies + 500; /* arbitrary */
- while ((hostdata->test_completed == -1) && jiffies < timeout);
- @@ -1289,12 +1347,12 @@
- host->host_no, i);
- if (!hostdata->idle) {
- printk("scsi%d : not idle\n", host->host_no);
- - splx(old_level);
- + restore_flags(flags);
- return -1;
- }
- } else if (hostdata->test_completed == -1) {
- printk ("scsi%d : test 2 timed out\n", host->host_no);
- - splx(old_level);
- + restore_flags(flags);
- return -1;
- }
- hostdata->test_running = 0;
- @@ -1305,9 +1363,8 @@
- }
- }
- }
- - printk ("scsi%d : tests complete.\n", host->host_no);
-
- - splx(old_level);
- + restore_flags(flags);
- return 0;
- }
-
- @@ -1364,11 +1421,12 @@
- struct Scsi_Host *host = c->host;
- struct NCR53c7x0_hostdata *hostdata = (struct NCR53c7x0_hostdata *)
- host->hostdata;
- - int old_level;
- + unsigned long flags;
- char **prev, *search;
- int i;
-
- - old_level = splx(0);
- + save_flags(flags);
- + cli();
- for (i = 0; i < 2; ++i) {
- for (search = (char *) (i ? hostdata->issue_dsa_head :
- hostdata->reconnect_dsa_head), prev = (char **) (i ?
- @@ -1390,21 +1448,14 @@
- if (hostdata->running_list == cmd)
- hostdata->running_list = cmd->next;
-
- - if (!scan_scsis_buf_busy) {
- -#ifdef SCSI_MALLOC
- - scsi_free ((void *) cmd->real, cmd->size);
- -#else
- - kfree_s (cmd->real, cmd->size);
- -#endif
- - } else {
- - scan_scsis_buf_busy = 0;
- - }
- + cmd->next = hostdata->free;
- + hostdata->free = cmd;
-
- c->host_scribble = NULL;
- c->result = result;
- c->scsi_done(c);
-
- - splx(old_level);
- + restore_flags(flags);
- }
-
- /*
- @@ -1429,7 +1480,7 @@
- unsigned long *dsp;
- struct NCR53c7x0_hostdata *hostdata = (struct NCR53c7x0_hostdata *)
- host->hostdata;
- - int old_level;
- + unsigned long flags;
- NCR53c7x0_local_setup(host);
-
- /*
- @@ -1437,8 +1488,8 @@
- * dump the appropriate debugging information to standard
- * output.
- */
- -
- - old_level = splx(0);
- + save_flags(flags);
- + cli();
- dsp = (unsigned long *) NCR53c7x0_read32(DSP_REG);
- for (bp = hostdata->breakpoints; bp && bp->address != dsp;
- bp = bp->next);
- @@ -1460,7 +1511,7 @@
- * instruction in bytes.
- */
-
- - splx(old_level);
- + restore_flags(flags);
- }
-
- /*
- @@ -1575,7 +1626,7 @@
- hostdata->sync[target].select_indirect = (scntl3 << 24) | (target << 16) |
- (sxfer << 8);
-
- - script = hostdata->sync[target].script;
- + script = (long *) hostdata->sync[target].script;
-
- /* XXX - add NCR53c7x0 code to reprogram SCF bits if we want to */
- if ((hostdata->chip / 100) == 8) {
- @@ -1630,7 +1681,7 @@
- printk ("scsi%d : message", host->host_no);
- if (cmd)
- printk (" from target %d lun %d", c->target, c->lun);
- - print_msg (hostdata->msg_buf);
- + print_msg ((unsigned char *) hostdata->msg_buf);
- printk("\n");
- switch (hostdata->msg_buf[0]) {
- /*
- @@ -1665,7 +1716,8 @@
- */
- if (cmd->flags & CMD_FLAG_SDTR) {
- cmd->flags &= ~CMD_FLAG_SDTR;
- - synchronous (host, c->target, hostdata->msg_buf);
- + synchronous (host, c->target, (unsigned char *)
- + hostdata->msg_buf);
- hostdata->dsp = hostdata->script + hostdata->E_accept_message /
- sizeof(long);
- hostdata->dsp_changed = 1;
- @@ -1673,7 +1725,8 @@
- } else {
- if (hostdata->options & OPTION_SYNCHRONOUS) {
- cmd->flags |= CMD_FLAG_DID_SDTR;
- - synchronous (host, c->target, hostdata->msg_buf);
- + synchronous (host, c->target, (unsigned char *)
- + hostdata->msg_buf);
- } else {
- hostdata->msg_buf[4] = 0; /* 0 offset = async */
- }
- @@ -1948,15 +2001,16 @@
- struct NCR53c7x0_hostdata *hostdata = (struct NCR53c7x0_hostdata *)
- instance->hostdata;
- struct NCR53c7x0_break *bp, **prev;
- - int old_level;
- - old_level = splx(0);
- + unsigned long flags;
- + save_flags(flags);
- + cli();
- for (bp = (struct NCR53c7x0_break *) instance->breakpoints,
- prev = (struct NCR53c7x0_break **) &instance->breakpoints;
- bp; prev = (struct NCR53c7x0_break **) &(bp->next),
- bp = (struct NCR53c7x0_break *) bp->next);
-
- if (!bp) {
- - splx(old_level);
- + restore_flags(flags);
- return -EIO;
- }
-
- @@ -1969,7 +2023,7 @@
- if (prev)
- *prev = bp->next;
-
- - splx(old_level);
- + restore_flags(flags);
- return 0;
- }
-
- @@ -1981,7 +2035,7 @@
- struct NCR53c7x0_break *bp;
- char buf[80];
- size_t len;
- - int old_level;
- + unsigned long flags;
- /*
- * XXX - we need to insure that the processor is halted
- * here in order to prevent a race condition. So, if the
- @@ -1992,7 +2046,8 @@
- host->host_no);
- debugger_kernel_write (host, buf, strlen(buf));
-
- - old_level=splx(0);
- + save_flags(flags);
- + cli();
- for (bp = (struct NCR53c7x0_break *) host->breakpoints;
- bp; bp = (struct NCR53c7x0_break *) bp->next); {
- sprintf (buf, "scsi%d : bp : success : at %08x, replaces %08x %08x",
- @@ -2007,7 +2062,7 @@
- len = strlen(buf);
- debugger_kernel_write (host, buf, len);
- }
- - splx(old_level);
- + restore_flags(flags);
- return 0;
- }
-
- @@ -2018,20 +2073,21 @@
- struct NCR53c7x0_break *bp;
- char buf[80];
- size_t len;
- - int old_level;
- - old_level=splx(0);
- + unsigned long flags;
- + save_flags(flags);
- + cli();
-
- if (hostdata->state != STATE_HALTED) {
- sprintf (buf, "scsi%d : bs : failure : NCR not halted\n", host->host_no);
- debugger_kernel_write (host, buf, strlen(buf));
- - splx(old_level);
- + restore_flags(flags);
- return -1;
- }
-
- if (!(bp = kmalloc (sizeof (struct NCR53c7x0_break)))) {
- printk ("scsi%d : kmalloc(%d) of breakpoint structure failed, try again\n",
- host->host_no, sizeof(struct NCR53c7x0_break));
- - splx(old_level);
- + restore_flags(flags);
- return -1;
- }
-
- @@ -2043,7 +2099,7 @@
- hostdata->breakpoints = bp->next;
- memcpy ((void *) bp->address, (void *) hostdata->E_debug_break, 8);
-
- - splx(old_level);
- + restore_flags(flags);
- return 0;
- }
-
- @@ -2132,9 +2188,10 @@
- buflen) {
- struct NCR53c7x0_hostdata *hostdata = (struct NCR53c7x0_hostdata *)
- host->hostdata;
- - int copy, left, old_level;
- -
- - old_level = splx(0);
- + int copy, left;
- + unsigned long flags;
- + save_flags(flags);
- + cli();
- while (buflen) {
- left = (hostdata->debug_buf + hostdata->debug_size - 1) -
- hostdata->debug_write;
- @@ -2147,7 +2204,7 @@
- (hostdata->debug_buf + hostdata->debug_size))
- hosdata->debug_write = hostdata->debug_buf;
- }
- - (void) splx(old_level);
- + restore_flags(flags);
- }
-
- #endif /* def NCRDEBUG */
- @@ -2164,7 +2221,8 @@
- *
- */
-
- -static void NCR53c8x0_soft_reset (struct Scsi_Host *host) {
- +static void
- +NCR53c8x0_soft_reset (struct Scsi_Host *host) {
- NCR53c7x0_local_declare();
- struct NCR53c7x0_hostdata *hostdata = (struct NCR53c7x0_hostdata *)
- host->hostdata;
- @@ -2187,14 +2245,18 @@
-
-
- /*
- - * Respond to selection and reselection by targets and
- - * use our _initiator_ SCSI ID for arbitration.
- + * Respond to reselection by targets and use our _initiator_ SCSI ID
- + * for arbitration. If notyet, also respond to SCSI selection.
- *
- * XXX - Note : we must reprogram this when reselecting as
- * a target.
- */
-
- +#ifdef notyet
- NCR53c7x0_write8(SCID_REG, (host->this_id & 7)|SCID_800_RRE|SCID_800_SRE);
- +#else
- + NCR53c7x0_write8(SCID_REG, (host->this_id & 7)|SCID_800_RRE);
- +#endif
- NCR53c7x0_write8(RESPID_REG_800, hostdata->this_id_mask);
-
- /*
- @@ -2222,8 +2284,7 @@
-
-
- NCR53c7x0_write8(SIEN0_REG_800, ((hostdata->options & OPTION_PARITY) ?
- - SIEN_PAR : 0) | SIEN_RST | SIEN_UDC | SIEN_SGE | SIEN_800_SEL |
- - SIEN_800_RESEL | SIEN_MA);
- + SIEN_PAR : 0) | SIEN_RST | SIEN_UDC | SIEN_SGE | SIEN_MA);
- NCR53c7x0_write8(SIEN1_REG_800, SIEN1_800_STO | SIEN1_800_HTH);
-
- /*
- @@ -2243,11 +2304,13 @@
- /*
- * Function static struct NCR53c7x0_cmd *create_cmd (Scsi_Cmnd *cmd)
- *
- - * Purpose : Using scsi_malloc() if the system is initialized,
- - * scan_scsis_buf if not, allocate space to store the variable
- - * length NCR53c7x0_cmd structure. Initialize it based on
- - * the Scsi_Cmnd structure passed in, including dsa and
- - * Linux field initialization, and dsa code relocation.
- + * Purpose : If we have not allready allocated enough NCR53c7x0_cmd
- + * structures to satisfy any allowable number of simultaenous
- + * commands for this host; do so (using either scsi_malloc()
- + * or kmalloc() depending on configuration), and add them to the
- + * hostdata free list. Take the first structure off the free list,
- + * initialize it based on the Scsi_Cmnd structure passed in,
- + * including dsa and Linux field initialization, and dsa code relocation.
- *
- * Inputs : cmd - SCSI command
- *
- @@ -2255,26 +2318,86 @@
- * NULL on failure.
- */
-
- -static struct NCR53c7x0_cmd *create_cmd (Scsi_Cmnd *cmd) {
- +static struct NCR53c7x0_cmd *
- +create_cmd (Scsi_Cmnd *cmd) {
- NCR53c7x0_local_declare();
- struct Scsi_Host *host = cmd->host;
- struct NCR53c7x0_hostdata *hostdata = (struct NCR53c7x0_hostdata *)
- host->hostdata;
- - int size; /* Size of *tmp */
- - struct NCR53c7x0_cmd *tmp; /* NCR53c7x0_cmd structure for this command */
- + struct NCR53c7x0_cmd *tmp = NULL; /* NCR53c7x0_cmd structure for this command */
- int datain, /* Number of instructions per phase */
- dataout;
- int data_transfer_instructions, /* Count of dynamic instructions */
- - i, /* Counter */
- - alignment; /* Alignment adjustment (0 - 4) */
- + i; /* Counter */
- unsigned long *cmd_datain, /* Address of datain/dataout code */
- *cmd_dataout; /* Incremented as we assemble */
- +#ifdef notyet
- void *real; /* Real address */
- + int size; /* Size of *tmp */
- + int alignment; /* Alignment adjustment (0 - 4) */
- +#endif
- + unsigned long flags;
- NCR53c7x0_local_setup(cmd->host);
-
- +/* FIXME : when we start doing multiple simultaenous commands per LUN,
- + we will need to either
- + - Do an attach_slave() and detach_slave() the right way (alocate
- + memory in attach_slave() as we do in scsi_register).
- + - Make sure this code works
- + with the former being cleaner. At the same time, we can also go with
- + a per-device host_scribble, and introduce a NCR53c7x0_device structure
- + to replace the messy fixed length arrays we're starting to use. */
- +
- +#ifdef notyet
- +
- + if (hostdata->num_commands < host->can_queue &&
- + !in_scan_scsis &&
- + !(hostdata->cmd_allocated[cmd->target] & (1 << cmd->lun))) {
- + for (i = host->hostt->cmd_per_lun - 1; i >= 0 --i) {
- +#ifdef SCSI_MALLOC
- + /* scsi_malloc must allocate with a 512 byte granularity, but allways
- + returns buffers which are aligned on a 512 boundary */
- + size = (hostdata->max_cmd_size + 511) / 512 * 512;
- + tmp = (struct NCR53c7x0_cmd *) scsi_malloc (size);
- + if (!tmp)
- + break;
- + tmp->real = (void *) tmp;
- +#else
- + /* kmalloc() can allocate any size, but historically has returned
- + unaligned addresses, so we need to allow for alignment */
- + size = hostdata->max_cmd_size + 4;
- + real = kmalloc (size, GFP_ATOMIC);
- + alignment = 4 - (((unsigned) real) & 3);
- + tmp = (struct NCR53c7x0_cmd *) (((char *) real) + alignment);
- + if (!tmp)
- + break;
- + tmp->real = real;
- +#endif /* def SCSI_MALLOC */
- + tmp->size = size;
- + /* Insert all but last into list */
- + if (i > 0) {
- + tmp->next = hostdata->free;
- + hostdata->free = tmp;
- + }
- + }
- + }
- +#endif /* def notyet */
- + if (!tmp) {
- + save_flags(flags);
- + cli();
- + tmp = (struct NCR53c7x0_cmd *) hostdata->free;
- + if (tmp) {
- + hostdata->free = tmp->next;
- + restore_flags(flags);
- + } else {
- + restore_flags(flags);
- + return NULL;
- + }
- + }
- +
-
- /*
- - * Decide weather we need to generate commands for DATA IN,
- + * Decide whether we need to generate commands for DATA IN,
- * DATA OUT, neither, or both based on the SCSI command
- */
-
- @@ -2323,10 +2446,6 @@
- datain = dataout = 2 * (cmd->use_sg ? cmd->use_sg : 1) + 3;
- }
-
- - /*
- - * Allocate memory for the NCR53c7x0_cmd structure.
- - */
- -
- /*
- * For each data phase implemented, we need a JUMP instruction
- * to return control to other_transfer. We also need a MOVE
- @@ -2344,63 +2463,11 @@
- if (data_transfer_instructions < 2)
- data_transfer_instructions = 2;
-
- - /*
- - * We need enough space to store the base NCR53c7x0 structure,
- - * DSA, and data transfer instructions at 2 long words each,
- - * as well as padding out to the next 512 bytes for scsi_malloc.
- - *
- - * We also need to guarantee alignment of _4_ bytes.
- - */
- -
- -#ifdef SCSI_MALLOC
- - size = ((sizeof (struct NCR53c7x0_cmd) + (hostdata->dsa_end -
- - hostdata->dsa_start) + 2 * sizeof(long) *
- - data_transfer_instructions + 4 + 511) / 512) * 512;
- -#else
- - size = sizeof (struct NCR53c7x0_cmd) + (hostdata->dsa_end -
- - hostdata->dsa_start) + 2 * sizeof(long) *
- - data_transfer_instructions + 4;
- -#endif
- -
- -
- -#if 0
- - if (size > 512) {
- - printk("scsi%d : size = %d\n", host->host_no, size);
- - }
- -#endif
- -
- -#ifdef SCSI_MALLOC
- - real = in_scan_scsis ? NULL : scsi_malloc (size);
- -#else
- - real = kmalloc (size, GFP_ATOMIC);
- -#endif
- -
- - if (!real) {
- - if (!scan_scsis_buf_busy && size <= sizeof(scan_scsis_buf)) {
- - scan_scsis_buf_busy = 1;
- - real = scan_scsis_buf;
- - } else {
- - panic ("scsi%d : scan_scsis_buf too small (need %d bytes)\n",
- - host->host_no, size);
- - }
- - }
- -
- - alignment = 4 - (((unsigned) real) & 3);
- -
- - tmp = (struct NCR53c7x0_cmd *) (((char *) real) + alignment);
- -
- - tmp->real = real;
- -
- -
- - if (((unsigned long) tmp->dsa) & 0x3)
- - panic ("scsi%d : pid %d dsa structure not dword aligned!\n",
- - host->host_no, cmd->pid);
-
- /*
- * Initialize Linux specific fields.
- */
-
- - tmp->size = size;
- tmp->cmd = cmd;
- tmp->next = NULL;
- tmp->prev = NULL;
- @@ -2434,7 +2501,7 @@
- patch_dsa_32(tmp->dsa, dsa_select, 0, hostdata->sync[cmd->target].
- select_indirect);
- /*
- - * XXX - we need to figure this size based on weather
- + * XXX - we need to figure this size based on whether
- * or not we'll be using any additional messages.
- */
- patch_dsa_32(tmp->dsa, dsa_msgout, 0, 1);
- @@ -2462,7 +2529,7 @@
- patch_dsa_32(tmp->dsa, dsa_status, 1, &cmd->result);
- patch_dsa_32(tmp->dsa, dsa_msgout_other, 0, 1);
- patch_dsa_32(tmp->dsa, dsa_msgout_other, 1,
- - &NCR53c7xx_msg_nop);
- + &(hostdata->NCR53c7xx_msg_nop));
-
-
- /*
- @@ -2486,8 +2553,8 @@
- #endif
-
- /*
- - * XXX - I'm undecided weather all of this nonsense is faster
- - * in the long run, or weather I should just go and implement a loop
- + * XXX - I'm undecided whether all of this nonsense is faster
- + * in the long run, or whether I should just go and implement a loop
- * on the NCR chip using table indirect mode?
- *
- * In any case, this is how it _must_ be done for 53c700/700-66 chips,
- @@ -2516,8 +2583,8 @@
- cmd_datain[2] = ((DCMD_TYPE_TCI | DCMD_TCI_OP_CALL |
- DCMD_TCI_CD | DCMD_TCI_IO | DCMD_TCI_MSG) << 24) |
- DBC_TCI_WAIT_FOR_VALID | DBC_TCI_COMPARE_PHASE | DBC_TCI_TRUE;
- - cmd_datain[3] = hostdata->script + hostdata->E_msg_in /
- - sizeof(long);
- + cmd_datain[3] = (unsigned long) hostdata->script +
- + hostdata->E_msg_in;
- #if 0
- print_insn (host, cmd_datain, "dynamic ", 1);
- print_insn (host, cmd_datain + 2, "dynamic ", 1);
- @@ -2530,8 +2597,8 @@
- cmd_dataout[2] = ((DCMD_TYPE_TCI | DCMD_TCI_OP_CALL |
- DCMD_TCI_CD | DCMD_TCI_IO | DCMD_TCI_MSG) << 24) |
- DBC_TCI_WAIT_FOR_VALID | DBC_TCI_COMPARE_PHASE | DBC_TCI_TRUE;
- - cmd_dataout[3] = hostdata->script + hostdata->E_msg_in /
- - sizeof(long);
- + cmd_dataout[3] = (unsigned long) hostdata->script +
- + hostdata->E_msg_in;
- #if 0
- print_insn (host, cmd_dataout, "dynamic ", 1);
- print_insn (host, cmd_dataout + 2, "dynamic ", 1);
- @@ -2548,8 +2615,8 @@
- if (datain) {
- cmd_datain[0] = ((DCMD_TYPE_TCI | DCMD_TCI_OP_JUMP) << 24) |
- DBC_TCI_TRUE;
- - cmd_datain[1] = hostdata->script + hostdata->E_other_transfer
- - / sizeof(long);
- + cmd_datain[1] = (unsigned long) hostdata->script +
- + hostdata->E_other_transfer;
- #if 0
- print_insn (host, cmd_datain, "dynamic jump ", 1);
- #endif
- @@ -2567,8 +2634,8 @@
- if (dataout) {
- cmd_dataout[0] = ((DCMD_TYPE_TCI | DCMD_TCI_OP_JUMP) << 24) |
- DBC_TCI_TRUE;
- - cmd_dataout[1] = hostdata->script + hostdata->E_other_transfer
- - / sizeof(long);
- + cmd_dataout[1] = (unsigned long) hostdata->script +
- + hostdata->E_other_transfer;
- #if 0
- print_insn (host, cmd_dataout, "dynamic jump ", 1);
- #endif
- @@ -2603,7 +2670,7 @@
- struct Scsi_Host *host = cmd->host;
- struct NCR53c7x0_hostdata *hostdata = (struct NCR53c7x0_hostdata *)
- host->hostdata;
- - int old_level;
- + unsigned long flags;
- unsigned char target_was_busy;
- NCR53c7x0_local_setup(host);
-
- @@ -2671,7 +2738,8 @@
- * valid while the condition exists.
- */
-
- - old_level = splx(0);
- + save_flags(flags);
- + cli();
-
- /*
- * Consider a target busy if there are _any_ commands running
- @@ -2764,7 +2832,7 @@
- tmp->next; tmp = (struct NCR53c7x0_cmd *) tmp->next);
- tmp->next = tmp;
- }
- - splx(old_level);
- + restore_flags(flags);
- return 0;
- }
-
- @@ -2848,9 +2916,9 @@
-
- if (sstat0_sist0 & SSTAT0_UDC) {
- fatal = 1;
- - printk("scsi%d : target %d lun %d unexpected disconnect\n",
- - host->host_no, cmd->cmd->target, cmd->cmd->lun);
- if (cmd) {
- + printk("scsi%d : target %d lun %d unexpected disconnect\n",
- + host->host_no, cmd->cmd->target, cmd->cmd->lun);
- abnormal_finished(cmd, DID_ERROR << 16);
- }
- hostdata->dsp = hostdata->script + hostdata->E_schedule /
- @@ -2950,7 +3018,7 @@
- should terminate */
- int interrupted = 0; /* This HA generated
- an interrupt */
- - int old_level;
- + unsigned long flags;
-
- #ifdef NCR_DEBUG
- char buf[80]; /* Debugging sprintf buffer */
- @@ -3011,12 +3079,14 @@
- */
-
-
- - old_level = splx(0);
- + save_flags(flags);
- + cli();
- restart:
- for (cmd_prev_ptr = (struct NCR53c7x0_cmd **)
- - &(hostdata->running_list), cmd = (struct NCR53c7x0_cmd *)
- - hostdata->running_list; cmd ; cmd_prev_ptr =
- - &(cmd->next), cmd = (struct NCR53c7x0_cmd *) cmd->next) {
- + &(hostdata->running_list), cmd =
- + (struct NCR53c7x0_cmd *) hostdata->running_list; cmd ;
- + cmd_prev_ptr = (struct NCR53c7x0_cmd **) &(cmd->next),
- + cmd = (struct NCR53c7x0_cmd *) cmd->next) {
- Scsi_Cmnd *tmp;
-
- if (!cmd) {
- @@ -3045,7 +3115,7 @@
- if (cmd->prev)
- cmd->prev->next = cmd->next;
- if (cmd_prev_ptr)
- - *cmd_prev_ptr = cmd->next;
- + *cmd_prev_ptr = (struct NCR53c7x0_cmd *) cmd->next;
-
- #ifdef LUN_BUSY
- /* Check for next command for target, add to issue queue */
- @@ -3054,16 +3124,8 @@
- #endif
-
-
- - if (!scan_scsis_buf_busy) {
- -#ifdef SCSI_MALLOC
- - scsi_free ((void *) cmd->real, cmd->size);
- -#else
- - kfree_s ((void *) cmd->real, cmd->size);
- -#endif
- - } else {
- - scan_scsis_buf_busy = 0;
- - }
- -
- + cmd->next = hostdata->free;
- + hostdata->free = cmd;
-
- tmp->host_scribble = NULL;
-
- @@ -3081,7 +3143,7 @@
- goto restart;
-
- }
- - splx(old_level);
- + restore_flags(flags);
-
- if (!search_found) {
- printk ("scsi%d : WARNING : INTFLY with no completed commands.\n",
- @@ -3204,7 +3266,8 @@
- *
- */
-
- -static int abort_connected (struct Scsi_Host *host) {
- +static int
- +abort_connected (struct Scsi_Host *host) {
- struct NCR53c7x0_hostdata *hostdata = (struct NCR53c7x0_hostdata *)
- host->hostdata;
-
- @@ -3398,15 +3461,13 @@
- NCR53c7x0_local_declare();
- struct NCR53c7x0_hostdata *hostdata = (struct NCR53c7x0_hostdata *)
- host->hostdata;
- - unsigned char dstat, /* DSTAT */
- - dbc_dcmd; /* DCMD (high eight bits) + DBC */
- + unsigned char dstat; /* DSTAT */
- unsigned long *dsp,
- *next_dsp, /* Current dsp */
- - *dsa;
- -
- -
- - int ipl, /* Old ipl from splx(0) */
- - tmp;
- + *dsa,
- + dbc_dcmd; /* DCMD (high eight bits) + DBC */
- + int tmp;
- + unsigned long flags;
- NCR53c7x0_local_setup(host);
-
- if (!hostdata->dstat_valid) {
- @@ -3460,12 +3521,13 @@
- if (hostdata->options & OPTION_DEBUG_TRACE) {
- } else if (hostdata->options & OPTION_DEBUG_SINGLE) {
- print_insn (host, dsp, "s ", 0);
- - ipl = splx(0);
- + save_flags(flags);
- + cli();
- /* XXX - should we do this, or can we get away with writing dsp? */
-
- NCR53c7x0_write8 (DCNTL_REG, (NCR53c7x0_read8(DCNTL_REG) &
- ~DCNTL_SSM) | DCNTL_STD);
- - splx(ipl);
- + restore_flags(flags);
- } else {
- printk("scsi%d : unexpected single step interrupt at\n"
- " ", host->host_no);
- @@ -3654,9 +3716,10 @@
- struct Scsi_Host *host = cmd->host;
- struct NCR53c7x0_hostdata *hostdata = (struct NCR53c7x0_hostdata *)
- host->hostdata;
- - int old_level;
- + unsigned long flags;
- struct NCR53c7x0_cmd *curr, **prev;
- - old_level = splx(0);
- + save_flags(flags);
- + cli();
-
- /*
- * The command could be hiding in the issue_queue. This would be very
- @@ -3668,28 +3731,23 @@
- * pull the command out of the old queue, and call it aborted.
- */
-
- - for (curr = hostdata->issue_queue, prev = &(hostdata->issue_queue);
- - curr && curr->cmd != cmd; prev = &(curr->next), curr = curr->next);
- + for (curr = (struct NCR53c7x0_cmd *) hostdata->issue_queue,
- + prev = (struct NCR53c7x0_cmd **) &(hostdata->issue_queue);
- + curr && curr->cmd != cmd; prev = (struct NCR53c7x0_cmd **)
- + &(curr->next), curr = (struct NCR53c7x0_cmd *) curr->next);
-
- if (curr) {
- - *prev = curr->next;
- + *prev = (struct NCR53c7x0_cmd *) curr->next;
- /* XXX - get rid of DLL ? */
- if (curr->prev)
- curr->prev->next = curr->next;
-
- - if (!scan_scsis_buf_busy) {
- -#ifdef SCSI_MALLOC
- - scsi_free ((void *) curr->real, curr->size);
- -#else
- - kfree_s ((void *) curr->real, curr->size);
- -#endif
- - } else {
- - scan_scsis_buf_busy = 0;
- - }
- + curr->next = hostdata->free;
- + hostdata->free = curr;
-
- cmd->result = 0;
- cmd->scsi_done(cmd);
- - splx(old_level);
- + restore_flags(flags);
- return SCSI_ABORT_SUCCESS;
- }
-
- @@ -3698,11 +3756,13 @@
- * commands. If this is the case, drastic measures are called for.
- */
-
- - for (curr = hostdata->running_list, prev = &(hostdata->running_list);
- - curr && curr->cmd != cmd; prev = &(curr->next), curr = curr->next);
- + for (curr = (struct NCR53c7x0_cmd *) hostdata->running_list,
- + prev = (struct NCR53c7x0_cmd **) &(hostdata->running_list);
- + curr && curr->cmd != cmd; prev = (struct NCR53c7x0_cmd **)
- + &(curr->next), curr = (struct NCR53c7x0_cmd *) curr->next);
-
- if (curr) {
- - splx(old_level);
- + restore_flags(flags);
- printk ("scsi%d : DANGER : command in running list, can not abort.\n",
- cmd->host->host_no);
- return SCSI_ABORT_SNOOZE;
- @@ -3715,16 +3775,8 @@
- */
-
- curr = (struct NCR53c7x0_cmd *) cmd->host_scribble;
- -
- - if (!scan_scsis_buf_busy) {
- -#ifdef SCSI_MALLOC
- - scsi_free ((void *) curr->real, curr->size);
- -#else
- - kfree_s ((void *) curr->real, curr->size);
- -#endif
- - } else {
- - scan_scsis_buf_busy = 0;
- - }
- + curr->next = hostdata->free;
- + hostdata->free = curr;
-
- if (((cmd->result & 0xff00) == 0xff00) ||
- ((cmd->result & 0xff) == 0xff)) {
- @@ -3734,7 +3786,7 @@
- host->host_no);
- }
- cmd->scsi_done(cmd);
- - splx(old_level);
- + restore_flags(flags);
- return SCSI_ABORT_SNOOZE;
- }
-
- @@ -3749,17 +3801,47 @@
- * Returns : 0 on success.
- */
-
- -int NCR53c7xx_reset (Scsi_Cmnd *cmd) {
- +int
- +NCR53c7xx_reset (Scsi_Cmnd *cmd) {
- NCR53c7x0_local_declare();
- - struct Scsi_Host *host = cmd ? cmd->host : NULL;
- + unsigned long flags;
- + int found;
- + struct NCR53c7x0_cmd * c;
- + Scsi_Cmnd *tmp;
- + struct Scsi_Host *host = cmd->host;
- struct NCR53c7x0_hostdata *hostdata = host ?
- - (struct NCR53c7x0_hostdata *) host->hostdata : NULL;
- - if (host) NCR53c7x0_local_setup(host);
- -
- + (struct NCR53c7x0_hostdata *) host->hostdata : NULL;
- + NCR53c7x0_local_setup(host);
- + save_flags(flags);
- + halt (host);
- + NCR53c7x0_write8(SCNTL1_REG, SCNTL1_RST);
- + udelay(25); /* Minimum ammount of time to assert RST */
- + NCR53c7x0_write8(SCNTL1_REG, SCNTL1_RST);
- + for (c = (struct NCR53c7x0_cmd *) hostdata->running_list, found = 0; c;
- + c = (struct NCR53c7x0_cmd *) c->next) {
- + tmp = c->cmd;
- + c->next = hostdata->free;
- + hostdata->free = c;
- +
- + if (tmp == cmd)
- + found = 1;
- + tmp->result = DID_RESET << 16;
- + tmp->scsi_done(tmp);
- + }
- + if (!found) {
- + c = (struct NCR53c7x0_cmd *) cmd->host_scribble;
- + if (c) {
- + c->next = hostdata->free;
- + hostdata->free = c;
- + }
- + cmd->result = DID_RESET << 16;
- + cmd->scsi_done(cmd);
- + }
- + restore_flags(flags);
-
- printk ("scsi%d : DANGER : NCR53c7xx_reset is NOP\n",
- cmd->host->host_no);
- - return SCSI_RESET_SNOOZE;
- + return SCSI_RESET_SUCCESS;
- }
-
- /*
- @@ -3770,13 +3852,11 @@
- static void print_dsa (struct Scsi_Host *host, unsigned long *dsa) {
- struct NCR53c7x0_hostdata *hostdata = (struct NCR53c7x0_hostdata *)
- host->hostdata;
- - Scsi_Cmnd * cmd;
- - struct NCR53c7x0_cmd * c;
- int i, len;
- char *ptr;
-
- printk("scsi%d : dsa at 0x%x\n"
- - " + %d : dsa_msgout length = %d, data = 0x%x\n" ,
- + " + %ld : dsa_msgout length = %lu, data = 0x%lx\n" ,
- host->host_no, (unsigned) dsa, hostdata->dsa_msgout,
- dsa[hostdata->dsa_msgout / sizeof(long)],
- dsa[hostdata->dsa_msgout / sizeof(long) + 1]);
- @@ -3790,3 +3870,108 @@
- }
- }
-
- +/*
- + * Function : static int shutdown (struct Scsi_Host *host)
- + *
- + * Purpose : does a clean (we hope) shutdown of the NCR SCSI
- + * chip. Use prior to dumping core, unloading the NCR driver,
- + * etc.
- + *
- + * Returns : 0 on success
- + */
- +#ifdef MODULE
- +static int
- +shutdown (struct Scsi_Host *host) {
- + NCR53c7x0_local_declare();
- + unsigned long flags;
- + struct NCR53c7x0_hostdata *hostdata = (struct NCR53c7x0_hostdata *)
- + host->hostdata;
- + NCR53c7x0_local_setup(host);
- + save_flags (flags);
- + cli();
- + halt (host);
- + hostdata->soft_reset(host);
- +/*
- + * For now, we take the simplest solution : reset the SCSI bus. Eventually,
- + * - If a command is connected, kill it with an ABORT message
- + * - If commands are disconnected, connect to each target/LUN and
- + * do a ABORT, followed by a SOFT reset, followed by a hard
- + * reset.
- + */
- + NCR53c7x0_write8(SCNTL1_REG, SCNTL1_RST);
- + udelay(25); /* Minimum ammount of time to assert RST */
- + NCR53c7x0_write8(SCNTL1_REG, SCNTL1_RST);
- + restore_flags (flags);
- + return 0;
- +}
- +#endif
- +
- +
- +/*
- + * Function : static int halt (struct Scsi_Host *host)
- + *
- + * Purpose : halts the SCSI SCRIPTS(tm) processor on the NCR chip
- + *
- + * Inputs : host - SCSI chip to halt
- + *
- + * Returns : 0 on success
- + */
- +
- +static int
- +halt (struct Scsi_Host *host) {
- + NCR53c7x0_local_declare();
- + unsigned long flags;
- + unsigned char istat, tmp;
- + struct NCR53c7x0_hostdata *hostdata = (struct NCR53c7x0_hostdata *)
- + host->hostdata;
- + NCR53c7x0_local_setup(host);
- +
- + save_flags(flags);
- + cli();
- + NCR53c7x0_write8(hostdata->istat, ISTAT_ABRT);
- + /* Eat interrupts until we find what we're looking for */
- + for (;;) {
- + istat = NCR53c7x0_read8 (hostdata->istat);
- + if (istat & ISTAT_SIP) {
- + if ((hostdata->chip / 100) == 8) {
- + tmp = NCR53c7x0_read8(SIST0_REG_800);
- + udelay(1);
- + tmp = NCR53c7x0_read8(SIST1_REG_800);
- + } else {
- + tmp = NCR53c7x0_read8(SSTAT0_REG);
- + }
- + } else if (istat & ISTAT_DIP) {
- + NCR53c7x0_write8(hostdata->istat, 0);
- + tmp = NCR53c7x0_read8(DSTAT_REG);
- + if (tmp & DSTAT_ABRT)
- + break;
- + else
- + panic("scsi%d: could not halt NCR chip\n", host->host_no);
- + }
- + }
- + hostdata->state = STATE_HALTED;
- + restore_flags(flags);
- + return 0;
- +}
- +
- +#ifdef MODULE
- +int NCR53c7x0_release(struct Scsi_Host *host) {
- + shutdown (host);
- +/* FIXME : need to recursively free tpnt structure */
- + if (host->irq != IRQ_NONE)
- + {
- + int irq_count;
- + struct Scsi_Host *tmp;
- + for (irq_count = 0, tmp = first_host; tmp; tmp = tmp->next)
- + if (tmp->hostt == the_template && tmp->irq == host->irq)
- + ++irq_count;
- + if (irq_count == 1)
- + free_irq(host->irq);
- + }
- + if (host->dma_channel != DMA_NONE)
- + free_dma(host->dma_channel);
- + return 1;
- +}
- +Scsi_Host_Template driver_template = NCR53c7xx;
- +#include "scsi_module.c"
- +#endif /* def MODULE */
- diff -u --recursive --new-file v1.2.5/linux/drivers/scsi/53c7,8xx.h linux/drivers/scsi/53c7,8xx.h
- --- v1.2.5/linux/drivers/scsi/53c7,8xx.h Wed Jan 25 09:06:17 1995
- +++ linux/drivers/scsi/53c7,8xx.h Mon Apr 17 13:47:57 1995
- @@ -46,20 +46,27 @@
- * array.
- */
-
- -#ifdef HOSTS_C
- +#if defined(HOSTS_C) || defined(MODULE)
- #include <linux/scsicam.h>
- extern int NCR53c7xx_abort(Scsi_Cmnd *);
- extern int NCR53c7xx_detect(Scsi_Host_Template *tpnt);
- extern int NCR53c7xx_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
- extern int NCR53c7xx_reset(Scsi_Cmnd *);
- -
- -#define NCR53c7xx {NULL, NULL, "NCR53c{7,8}xx (rel 3)", NCR53c7xx_detect, \
- - NULL, NULL, \
- - NULL, NCR53c7xx_queue_command, NCR53c7xx_abort, NCR53c7xx_reset,\
- - NULL, scsicam_bios_param, \
- - /* can queue */ 1, /* id */ 7, 127 /* old SG_ALL */, \
- - /* cmd per lun */ 1 , 0, 0, DISABLE_CLUSTERING}
- +#ifdef MODULE
- +extern int NCR53c7xx_release(struct Scsi_Host *);
- #else
- +#define NCR53c7xx_release NULL
- +#endif
- +
- +#define NCR53c7xx {NULL, NULL, "NCR53c{7,8}xx (rel 4)", NCR53c7xx_detect, \
- + NULL, /* info */ NULL, /* command, depricated */ NULL, \
- + NCR53c7xx_queue_command, NCR53c7xx_abort, NCR53c7xx_reset, \
- + NULL /* slave attach */, scsicam_bios_param, /* can queue */ 1, \
- + /* id */ 7, 127 /* old SG_ALL */, /* cmd per lun */ 1 , \
- + /* present */ 0, /* unchecked isa dma */ 0, DISABLE_CLUSTERING}
- +#endif /* defined(HOSTS_C) || defined(MODULE) */
- +
- +#ifndef HOSTS_C
- /* Register addresses, ordered numerically */
-
-
- @@ -932,6 +939,9 @@
-
- struct NCR53c7x0_cmd {
- void *real; /* Real, unaligned address */
- + void (* free)(void *); /* Command to deallocate; NULL
- + for structures allocated with
- + scsi_register, etc. */
- Scsi_Cmnd *cmd; /* Associated Scsi_Cmnd
- structure, Scsi_Cmnd points
- at NCR53c7x0_cmd using
- @@ -949,7 +959,11 @@
- */
-
-
- - struct NCR53c7x0_cmd *next, *prev; /* Linux maintained lists */
- + volatile struct NCR53c7x0_cmd *next, *prev;
- + /* Linux maintained lists. Note that
- + hostdata->free is a singly linked
- + list; the rest are doubly linked */
- +
-
-
- unsigned long *data_transfer_start; /* Start of data transfer routines */
- @@ -986,10 +1000,12 @@
- /* Indicates that the NCR is executing other code. */
- #define STATE_RUNNING 2
- /*
- - * Indicates that the NCR was being aborted. Only used when running
- - * NCR53c700 compatible scripts.
- + * Indicates that the NCR was being aborted.
- */
- #define STATE_ABORTING 3
- +/*
- + * Indicates that the NCR was successfully aborted. */
- +#define STATE_ABORTED 4
-
-
- /*
- @@ -1072,6 +1088,7 @@
-
- int (* dstat_sir_intr)(struct Scsi_Host *host, struct NCR53c7x0_cmd *cmd);
-
- + long dsa_size; /* Size of DSA structure */
-
- /*
- * Location of DSA fields for the SCSI SCRIPT corresponding to this
- @@ -1160,11 +1177,13 @@
- *breakpoint_current; /* Current breakpoint being stepped
- through, NULL if we are running
- normally. */
- +#ifdef NCR_DEBUG
- int debug_size; /* Size of debug buffer */
- volatile int debug_count; /* Current data count */
- volatile char *debug_buf; /* Output ring buffer */
- volatile char *debug_write; /* Current write pointer */
- volatile char *debug_read; /* Current read pointer */
- +#endif /* def NCR_DEBUG */
-
- /* XXX - primitive debugging junk, remove when working ? */
- int debug_print_limit; /* Number of commands to print
- @@ -1203,6 +1222,21 @@
- nexus, ONLY valid for
- NCR53c700/NCR53c700-66
- */
- +
- + volatile struct NCR53c7x0_cmd *spare; /* pointer to spare,
- + allocated at probe time,
- + which we can use for
- + initialization */
- + volatile struct NCR53c7x0_cmd *free;
- + int max_cmd_size; /* Maximum size of NCR53c7x0_cmd
- + based on number of
- + scatter/gather segments, etc.
- + */
- + volatile int num_cmds; /* Number of commands
- + allocated */
- + volatile unsigned char cmd_allocated[8]; /* Have we allocated commands
- + for this target yet? If not,
- + do so ASAP */
- volatile unsigned char busy[8][8]; /* number of commands
- executing on each target
- */
- @@ -1226,13 +1260,21 @@
- volatile unsigned char msg_buf[16]; /* buffer for messages
- other than the command
- complete message */
- - volatile struct NCR53c7x0_cmd *reconnect_dsa_head;
- + volatile unsigned char *reconnect_dsa_head;
- /* disconnected commands,
- maintained by NCR */
- /* Data identifying nexus we are trying to match during reselection */
- volatile unsigned char reselected_identify; /* IDENTIFY message */
- volatile unsigned char reselected_tag; /* second byte of queue tag
- message or 0 */
- + /* These were static variables before we moved them */
- +
- + long NCR53c7xx_zero;
- + long NCR53c7xx_sink;
- + char NCR53c7xx_msg_reject;
- + char NCR53c7xx_msg_abort;
- + char NCR53c7xx_msg_nop;
- +
- int script_count; /* Size of script in longs */
- unsigned long script[0]; /* Relocated SCSI script */
-
- diff -u --recursive --new-file v1.2.5/linux/drivers/scsi/53c7,8xx.scr linux/drivers/scsi/53c7,8xx.scr
- --- v1.2.5/linux/drivers/scsi/53c7,8xx.scr Thu Mar 9 20:37:34 1995
- +++ linux/drivers/scsi/53c7,8xx.scr Mon Apr 17 13:52:38 1995
- @@ -221,10 +221,10 @@
- ABSOLUTE int_test_2 = 0x04010000 ; Test 2 complete
- ABSOLUTE int_test_3 = 0x04020000 ; Test 3 complete
-
- -EXTERNAL NCR53c7xx_msg_abort ; Pointer to abort message
- -EXTERNAL NCR53c7xx_msg_reject ; Pointer to reject message
- -EXTERNAL NCR53c7xx_zero ; long with zero in it, use for source
- -EXTERNAL NCR53c7xx_sink ; long to dump worthless data in
- +ABSOLUTE NCR53c7xx_msg_abort = 0 ; Pointer to abort message
- +ABSOLUTE NCR53c7xx_msg_reject = 0 ; Pointer to reject message
- +ABSOLUTE NCR53c7xx_zero = 0 ; long with zero in it, use for source
- +ABSOLUTE NCR53c7xx_sink = 0 ; long to dump worthless data in
-
- ; Pointer to final bytes of multi-byte messages
- ABSOLUTE msg_buf = 0
- @@ -881,13 +881,23 @@
- wait_reselect_failed:
- ; Reading CTEST2 clears the SIG_P bit in the ISTAT register.
- MOVE CTEST2 & 0x40 TO SFBR
- - JUMP selected, IF NOT 0x40
- + JUMP schedule, IF 0x40
- + MOVE SIST0 & 0x20 TO SFBR
- + JUMP selected, IF 0x20
- +; FIXME : Something bogus happened, and we shouldn't fail silently.
- JUMP schedule
-
- select_failed:
- - MOVE ISTAT & 0x20 TO SFBR
- - JUMP reselected, IF NOT 0x20
- - MOVE ISTAT & 0xdf TO ISTAT
- +; If SIGP is set, the user just gave us another command, and
- +; we should restart or return to the scheduler.
- +; Reading CTEST2 clears the SIG_P bit in the ISTAT register.
- + MOVE CTEST2 & 0x40 TO SFBR
- + JUMP select, IF 0x40
- +; Otherwise, mask the selected and reselected bits off SIST0
- + MOVE SIST0 & 0x30 TO SFBR
- + JUMP selected, IF 0x20
- + JUMP reselected, IF 0x10
- +; FIXME : Something bogus happened, and we shouldn't fail silently.
- JUMP schedule
-
- ;
- @@ -980,7 +990,10 @@
- ; If DSP points here, and a phase mismatch is encountered, we need to
- ; do a bus reset.
- ;
- +
- + MOVE SCNTL2 & 0x7f TO SCNTL2
- MOVE 1, NCR53c7xx_msg_abort, WHEN MSG_OUT
- + WAIT DISCONNECT
- INT int_norm_aborted
-
- ;
- diff -u --recursive --new-file v1.2.5/linux/drivers/scsi/53c8xx_d.h linux/drivers/scsi/53c8xx_d.h
- --- v1.2.5/linux/drivers/scsi/53c8xx_d.h Thu Mar 9 20:37:34 1995
- +++ linux/drivers/scsi/53c8xx_d.h Mon Apr 17 13:52:55 1995
- @@ -127,7 +127,7 @@
- /*
- CALL scratch_to_dsa
-
- -at 0x0000000a : */ 0x88080000,0x00000800,
- +at 0x0000000a : */ 0x88080000,0x00000830,
- /*
- JUMP reselected_check_next
-
- @@ -283,10 +283,10 @@
- ABSOLUTE int_test_2 = 0x04010000 ; Test 2 complete
- ABSOLUTE int_test_3 = 0x04020000 ; Test 3 complete
-
- -EXTERNAL NCR53c7xx_msg_abort ; Pointer to abort message
- -EXTERNAL NCR53c7xx_msg_reject ; Pointer to reject message
- -EXTERNAL NCR53c7xx_zero ; long with zero in it, use for source
- -EXTERNAL NCR53c7xx_sink ; long to dump worthless data in
- +ABSOLUTE NCR53c7xx_msg_abort = 0 ; Pointer to abort message
- +ABSOLUTE NCR53c7xx_msg_reject = 0 ; Pointer to reject message
- +ABSOLUTE NCR53c7xx_zero = 0 ; long with zero in it, use for source
- +ABSOLUTE NCR53c7xx_sink = 0 ; long to dump worthless data in
-
- ; Pointer to final bytes of multi-byte messages
- ABSOLUTE msg_buf = 0
- @@ -325,7 +325,7 @@
- ;
- CALL dsa_to_scratch
-
- -at 0x0000002d : */ 0x88080000,0x000007b8,
- +at 0x0000002d : */ 0x88080000,0x000007e8,
- /*
- ; XXX - we need to deal with the NCR53c710, which lacks an add with
- ; carry instruction, by moving around the DSA alignment to avoid
- @@ -370,7 +370,7 @@
- ; And update the head pointer.
- CALL dsa_to_scratch
-
- -at 0x00000041 : */ 0x88080000,0x000007b8,
- +at 0x00000041 : */ 0x88080000,0x000007e8,
- /*
- MOVE dmode_ncr_to_memory TO DMODE
-
- @@ -422,7 +422,7 @@
-
- CALL scratch_to_dsa
-
- -at 0x00000053 : */ 0x88080000,0x00000800,
- +at 0x00000053 : */ 0x88080000,0x00000830,
- /*
-
-
- @@ -514,7 +514,7 @@
-
- SELECT ATN FROM dsa_select, select_failed
-
- -at 0x00000067 : */ 0x4300003c,0x00000694,
- +at 0x00000067 : */ 0x4300003c,0x000006a4,
- /*
- JUMP select_msgout, WHEN MSG_OUT
-
- @@ -539,7 +539,7 @@
-
- CALL dsa_to_scratch
-
- -at 0x0000006d : */ 0x88080000,0x000007b8,
- +at 0x0000006d : */ 0x88080000,0x000007e8,
- /*
-
- MOVE SCRATCH0 + dsa_next TO SCRATCH0
- @@ -711,7 +711,7 @@
- do_dataout:
- CALL dsa_to_scratch
-
- -at 0x0000009b : */ 0x88080000,0x000007b8,
- +at 0x0000009b : */ 0x88080000,0x000007e8,
- /*
- MOVE SCRATCH0 + dsa_dataout TO SCRATCH0
-
- @@ -756,7 +756,7 @@
- do_datain:
- CALL dsa_to_scratch
-
- -at 0x000000b1 : */ 0x88080000,0x000007b8,
- +at 0x000000b1 : */ 0x88080000,0x000007e8,
- /*
- MOVE SCRATCH0 + dsa_datain TO SCRATCH0
-
- @@ -1100,7 +1100,7 @@
- /*
- MOVE 1, NCR53c7xx_msg_reject, WHEN MSG_OUT
-
- -at 0x00000132 : */ 0x0e000001,((unsigned long)&NCR53c7xx_msg_reject),
- +at 0x00000132 : */ 0x0e000001,0x00000000,
- /*
- RETURN
-
- @@ -1295,7 +1295,7 @@
- reselected_notag:
- MOVE MEMORY 1, NCR53c7xx_zero, reselected_tag
-
- -at 0x0000015c : */ 0xc0000001,((unsigned long)&NCR53c7xx_zero),0x00000000,
- +at 0x0000015c : */ 0xc0000001,0x00000000,0x00000000,
- /*
-
-
- @@ -1317,7 +1317,7 @@
- /*
- CALL scratch_to_dsa
-
- -at 0x00000166 : */ 0x88080000,0x00000800,
- +at 0x00000166 : */ 0x88080000,0x00000830,
- /*
-
- ; Fix the update-next pointer so that the reconnect_dsa_head
- @@ -1477,31 +1477,53 @@
-
- at 0x0000019f : */ 0x741a4000,0x00000000,
- /*
- - JUMP selected, IF NOT 0x40
- + JUMP schedule, IF 0x40
-
- -at 0x000001a1 : */ 0x80040040,0x00000674,
- +at 0x000001a1 : */ 0x800c0040,0x00000130,
- /*
- + MOVE SIST0 & 0x20 TO SFBR
- +
- +at 0x000001a3 : */ 0x74422000,0x00000000,
- +/*
- + JUMP selected, IF 0x20
- +
- +at 0x000001a5 : */ 0x800c0020,0x00000674,
- +/*
- +; FIXME : Something bogus happened, and we shouldn't fail silently.
- JUMP schedule
-
- -at 0x000001a3 : */ 0x80080000,0x00000130,
- +at 0x000001a7 : */ 0x80080000,0x00000130,
- /*
-
- select_failed:
- - MOVE ISTAT & 0x20 TO SFBR
- +; If SIGP is set, the user just gave us another command, and
- +; we should restart or return to the scheduler.
- +; Reading CTEST2 clears the SIG_P bit in the ISTAT register.
- + MOVE CTEST2 & 0x40 TO SFBR
- +
- +at 0x000001a9 : */ 0x741a4000,0x00000000,
- +/*
- + JUMP select, IF 0x40
-
- -at 0x000001a5 : */ 0x74142000,0x00000000,
- +at 0x000001ab : */ 0x800c0040,0x00000194,
- /*
- - JUMP reselected, IF NOT 0x20
- +; Otherwise, mask the selected and reselected bits off SIST0
- + MOVE SIST0 & 0x30 TO SFBR
-
- -at 0x000001a7 : */ 0x80040020,0x00000568,
- +at 0x000001ad : */ 0x74423000,0x00000000,
- /*
- - MOVE ISTAT & 0xdf TO ISTAT
- + JUMP selected, IF 0x20
-
- -at 0x000001a9 : */ 0x7c14df00,0x00000000,
- +at 0x000001af : */ 0x800c0020,0x00000674,
- /*
- + JUMP reselected, IF 0x10
- +
- +at 0x000001b1 : */ 0x800c0010,0x00000568,
- +/*
- +; FIXME : Something bogus happened, and we shouldn't fail silently.
- JUMP schedule
-
- -at 0x000001ab : */ 0x80080000,0x00000130,
- +at 0x000001b3 : */ 0x80080000,0x00000130,
- /*
-
- ;
- @@ -1525,11 +1547,11 @@
- test_1:
- MOVE MEMORY 4, test_src, test_dest
-
- -at 0x000001ad : */ 0xc0000004,0x00000000,0x00000000,
- +at 0x000001b5 : */ 0xc0000004,0x00000000,0x00000000,
- /*
- INT int_test_1
-
- -at 0x000001b0 : */ 0x98080000,0x04000000,
- +at 0x000001b8 : */ 0x98080000,0x04000000,
- /*
-
- ;
- @@ -1540,61 +1562,61 @@
- test_2:
- CLEAR TARGET
-
- -at 0x000001b2 : */ 0x60000200,0x00000000,
- +at 0x000001ba : */ 0x60000200,0x00000000,
- /*
- SELECT ATN FROM 0, test_2_fail
-
- -at 0x000001b4 : */ 0x43000000,0x00000720,
- +at 0x000001bc : */ 0x43000000,0x00000740,
- /*
- JUMP test_2_msgout, WHEN MSG_OUT
-
- -at 0x000001b6 : */ 0x860b0000,0x000006e0,
- +at 0x000001be : */ 0x860b0000,0x00000700,
- /*
- ENTRY test_2_msgout
- test_2_msgout:
- MOVE FROM 8, WHEN MSG_OUT
-
- -at 0x000001b8 : */ 0x1e000000,0x00000008,
- +at 0x000001c0 : */ 0x1e000000,0x00000008,
- /*
- MOVE FROM 16, WHEN CMD
-
- -at 0x000001ba : */ 0x1a000000,0x00000010,
- +at 0x000001c2 : */ 0x1a000000,0x00000010,
- /*
- MOVE FROM 24, WHEN DATA_IN
-
- -at 0x000001bc : */ 0x19000000,0x00000018,
- +at 0x000001c4 : */ 0x19000000,0x00000018,
- /*
- MOVE FROM 32, WHEN STATUS
-
- -at 0x000001be : */ 0x1b000000,0x00000020,
- +at 0x000001c6 : */ 0x1b000000,0x00000020,
- /*
- MOVE FROM 40, WHEN MSG_IN
-
- -at 0x000001c0 : */ 0x1f000000,0x00000028,
- +at 0x000001c8 : */ 0x1f000000,0x00000028,
- /*
- MOVE SCNTL2 & 0x7f TO SCNTL2
-
- -at 0x000001c2 : */ 0x7c027f00,0x00000000,
- +at 0x000001ca : */ 0x7c027f00,0x00000000,
- /*
- CLEAR ACK
-
- -at 0x000001c4 : */ 0x60000040,0x00000000,
- +at 0x000001cc : */ 0x60000040,0x00000000,
- /*
- WAIT DISCONNECT
-
- -at 0x000001c6 : */ 0x48000000,0x00000000,
- +at 0x000001ce : */ 0x48000000,0x00000000,
- /*
- test_2_fail:
- INT int_test_2
-
- -at 0x000001c8 : */ 0x98080000,0x04010000,
- +at 0x000001d0 : */ 0x98080000,0x04010000,
- /*
-
- ENTRY debug_break
- debug_break:
- INT int_debug_break
-
- -at 0x000001ca : */ 0x98080000,0x03000000,
- +at 0x000001d2 : */ 0x98080000,0x03000000,
- /*
-
- ;
- @@ -1610,26 +1632,26 @@
- target_abort:
- SET TARGET
-
- -at 0x000001cc : */ 0x58000200,0x00000000,
- +at 0x000001d4 : */ 0x58000200,0x00000000,
- /*
- DISCONNECT
-
- -at 0x000001ce : */ 0x48000000,0x00000000,
- +at 0x000001d6 : */ 0x48000000,0x00000000,
- /*
- CLEAR TARGET
-
- -at 0x000001d0 : */ 0x60000200,0x00000000,
- +at 0x000001d8 : */ 0x60000200,0x00000000,
- /*
- JUMP schedule
-
- -at 0x000001d2 : */ 0x80080000,0x00000130,
- +at 0x000001da : */ 0x80080000,0x00000130,
- /*
-
- ENTRY initiator_abort
- initiator_abort:
- SET ATN
-
- -at 0x000001d4 : */ 0x58000008,0x00000000,
- +at 0x000001dc : */ 0x58000008,0x00000000,
- /*
- ; In order to abort the currently established nexus, we
- ; need to source/sink up to one byte of data in any SCSI phase,
- @@ -1637,60 +1659,69 @@
- ; false->true
- JUMP no_eat_cmd, WHEN NOT CMD
-
- -at 0x000001d6 : */ 0x82030000,0x00000768,
- +at 0x000001de : */ 0x82030000,0x00000788,
- /*
- MOVE 1, NCR53c7xx_zero, WHEN CMD
-
- -at 0x000001d8 : */ 0x0a000001,((unsigned long)&NCR53c7xx_zero),
- +at 0x000001e0 : */ 0x0a000001,0x00000000,
- /*
- no_eat_cmd:
- JUMP no_eat_msg, WHEN NOT MSG_IN
-
- -at 0x000001da : */ 0x87030000,0x00000778,
- +at 0x000001e2 : */ 0x87030000,0x00000798,
- /*
- MOVE 1, NCR53c7xx_sink, WHEN MSG_IN
-
- -at 0x000001dc : */ 0x0f000001,((unsigned long)&NCR53c7xx_sink),
- +at 0x000001e4 : */ 0x0f000001,0x00000000,
- /*
- no_eat_msg:
- JUMP no_eat_data, WHEN NOT DATA_IN
-
- -at 0x000001de : */ 0x81030000,0x00000788,
- +at 0x000001e6 : */ 0x81030000,0x000007a8,
- /*
- MOVE 1, NCR53c7xx_sink, WHEN DATA_IN
-
- -at 0x000001e0 : */ 0x09000001,((unsigned long)&NCR53c7xx_sink),
- +at 0x000001e8 : */ 0x09000001,0x00000000,
- /*
- no_eat_data:
- JUMP no_eat_status, WHEN NOT STATUS
-
- -at 0x000001e2 : */ 0x83030000,0x00000798,
- +at 0x000001ea : */ 0x83030000,0x000007b8,
- /*
- MOVE 1, NCR53c7xx_sink, WHEN STATUS
-
- -at 0x000001e4 : */ 0x0b000001,((unsigned long)&NCR53c7xx_sink),
- +at 0x000001ec : */ 0x0b000001,0x00000000,
- /*
- no_eat_status:
- JUMP no_source_data, WHEN NOT DATA_OUT
-
- -at 0x000001e6 : */ 0x80030000,0x000007a8,
- +at 0x000001ee : */ 0x80030000,0x000007c8,
- /*
- MOVE 1, NCR53c7xx_zero, WHEN DATA_OUT
-
- -at 0x000001e8 : */ 0x08000001,((unsigned long)&NCR53c7xx_zero),
- +at 0x000001f0 : */ 0x08000001,0x00000000,
- /*
- no_source_data:
- ;
- ; If DSP points here, and a phase mismatch is encountered, we need to
- ; do a bus reset.
- ;
- +
- + MOVE SCNTL2 & 0x7f TO SCNTL2
- +
- +at 0x000001f2 : */ 0x7c027f00,0x00000000,
- +/*
- MOVE 1, NCR53c7xx_msg_abort, WHEN MSG_OUT
-
- -at 0x000001ea : */ 0x0e000001,((unsigned long)&NCR53c7xx_msg_abort),
- +at 0x000001f4 : */ 0x0e000001,0x00000000,
- +/*
- + WAIT DISCONNECT
- +
- +at 0x000001f6 : */ 0x48000000,0x00000000,
- /*
- INT int_norm_aborted
-
- -at 0x000001ec : */ 0x98080000,0x02040000,
- +at 0x000001f8 : */ 0x98080000,0x02040000,
- /*
-
- ;
- @@ -1711,77 +1742,101 @@
- dsa_to_scratch:
- MOVE DSA0 TO SFBR
-
- -at 0x000001ee : */ 0x72100000,0x00000000,
- +at 0x000001fa : */ 0x72100000,0x00000000,
- /*
- MOVE SFBR TO SCRATCH0
-
- -at 0x000001f0 : */ 0x6a340000,0x00000000,
- +at 0x000001fc : */ 0x6a340000,0x00000000,
- /*
- MOVE DSA1 TO SFBR
-
- -at 0x000001f2 : */ 0x72110000,0x00000000,
- +at 0x000001fe : */ 0x72110000,0x00000000,
- /*
- MOVE SFBR TO SCRATCH1
-
- -at 0x000001f4 : */ 0x6a350000,0x00000000,
- +at 0x00000200 : */ 0x6a350000,0x00000000,
- /*
- MOVE DSA2 TO SFBR
-
- -at 0x000001f6 : */ 0x72120000,0x00000000,
- +at 0x00000202 : */ 0x72120000,0x00000000,
- /*
- MOVE SFBR TO SCRATCH2
-
- -at 0x000001f8 : */ 0x6a360000,0x00000000,
- +at 0x00000204 : */ 0x6a360000,0x00000000,
- /*
- MOVE DSA3 TO SFBR
-
- -at 0x000001fa : */ 0x72130000,0x00000000,
- +at 0x00000206 : */ 0x72130000,0x00000000,
- /*
- MOVE SFBR TO SCRATCH3
-
- -at 0x000001fc : */ 0x6a370000,0x00000000,
- +at 0x00000208 : */ 0x6a370000,0x00000000,
- /*
- RETURN
-
- -at 0x000001fe : */ 0x90080000,0x00000000,
- +at 0x0000020a : */ 0x90080000,0x00000000,
- /*
-
- scratch_to_dsa:
- MOVE SCRATCH0 TO SFBR
-
- -at 0x00000200 : */ 0x72340000,0x00000000,
- +at 0x0000020c : */ 0x72340000,0x00000000,
- /*
- MOVE SFBR TO DSA0
-
- -at 0x00000202 : */ 0x6a100000,0x00000000,
- +at 0x0000020e : */ 0x6a100000,0x00000000,
- /*
- MOVE SCRATCH1 TO SFBR
-
- -at 0x00000204 : */ 0x72350000,0x00000000,
- +at 0x00000210 : */ 0x72350000,0x00000000,
- /*
- MOVE SFBR TO DSA1
-
- -at 0x00000206 : */ 0x6a110000,0x00000000,
- +at 0x00000212 : */ 0x6a110000,0x00000000,
- /*
- MOVE SCRATCH2 TO SFBR
-
- -at 0x00000208 : */ 0x72360000,0x00000000,
- +at 0x00000214 : */ 0x72360000,0x00000000,
- /*
- MOVE SFBR TO DSA2
-
- -at 0x0000020a : */ 0x6a120000,0x00000000,
- +at 0x00000216 : */ 0x6a120000,0x00000000,
- /*
- MOVE SCRATCH3 TO SFBR
-
- -at 0x0000020c : */ 0x72370000,0x00000000,
- +at 0x00000218 : */ 0x72370000,0x00000000,
- /*
- MOVE SFBR TO DSA3
-
- -at 0x0000020e : */ 0x6a130000,0x00000000,
- +at 0x0000021a : */ 0x6a130000,0x00000000,
- /*
- RETURN
-
- -at 0x00000210 : */ 0x90080000,0x00000000,
- +at 0x0000021c : */ 0x90080000,0x00000000,
- +};
- +
- +#define A_NCR53c7xx_msg_abort 0x00000000
- +unsigned long A_NCR53c7xx_msg_abort_used[] = {
- + 0x000001f5,
- +};
- +
- +#define A_NCR53c7xx_msg_reject 0x00000000
- +unsigned long A_NCR53c7xx_msg_reject_used[] = {
- + 0x00000133,
- +};
- +
- +#define A_NCR53c7xx_sink 0x00000000
- +unsigned long A_NCR53c7xx_sink_used[] = {
- + 0x000001e5,
- + 0x000001e9,
- + 0x000001ed,
- +};
- +
- +#define A_NCR53c7xx_zero 0x00000000
- +unsigned long A_NCR53c7xx_zero_used[] = {
- + 0x0000015d,
- + 0x000001e1,
- + 0x000001f1,
- };
-
- #define A_addr_scratch 0x00000000
- @@ -1940,7 +1995,7 @@
-
- #define A_int_debug_break 0x03000000
- unsigned long A_int_debug_break_used[] = {
- - 0x000001cb,
- + 0x000001d3,
- };
-
- #define A_int_debug_dsa_loaded 0x03030000
- @@ -2013,7 +2068,7 @@
-
- #define A_int_norm_aborted 0x02040000
- unsigned long A_int_norm_aborted_used[] = {
- - 0x000001ed,
- + 0x000001f9,
- };
-
- #define A_int_norm_command_complete 0x02020000
- @@ -2038,12 +2093,12 @@
-
- #define A_int_test_1 0x04000000
- unsigned long A_int_test_1_used[] = {
- - 0x000001b1,
- + 0x000001b9,
- };
-
- #define A_int_test_2 0x04010000
- unsigned long A_int_test_2_used[] = {
- - 0x000001c9,
- + 0x000001d1,
- };
-
- #define A_int_test_3 0x04020000
- @@ -2087,26 +2142,26 @@
-
- #define A_test_dest 0x00000000
- unsigned long A_test_dest_used[] = {
- - 0x000001af,
- + 0x000001b7,
- };
-
- #define A_test_src 0x00000000
- unsigned long A_test_src_used[] = {
- - 0x000001ae,
- + 0x000001b6,
- };
-
- #define Ent_accept_message 0x000004d8
- #define Ent_cmdout_cmdout 0x0000022c
- #define Ent_command_complete 0x00000508
- #define Ent_command_complete_msgin 0x00000518
- -#define Ent_debug_break 0x00000728
- +#define Ent_debug_break 0x00000748
- #define Ent_dsa_code_check_reselect 0x00000038
- #define Ent_dsa_code_template 0x00000000
- #define Ent_dsa_code_template_end 0x000000b4
- #define Ent_dsa_jump_resume 0x00000088
- #define Ent_dsa_schedule 0x000000b4
- #define Ent_dsa_zero 0x00000090
- -#define Ent_initiator_abort 0x00000750
- +#define Ent_initiator_abort 0x00000770
- #define Ent_msg_in 0x00000354
- #define Ent_other_transfer 0x0000031c
- #define Ent_reject_message 0x000004b8
- @@ -2115,10 +2170,10 @@
- #define Ent_schedule 0x00000130
- #define Ent_select 0x00000194
- #define Ent_select_msgout 0x000001ac
- -#define Ent_target_abort 0x00000730
- -#define Ent_test_1 0x000006b4
- -#define Ent_test_2 0x000006c8
- -#define Ent_test_2_msgout 0x000006e0
- +#define Ent_target_abort 0x00000750
- +#define Ent_test_1 0x000006d4
- +#define Ent_test_2 0x000006e8
- +#define Ent_test_2_msgout 0x00000700
- unsigned long LABELPATCHES[] = {
- 0x00000002,
- 0x0000000b,
- @@ -2178,18 +2233,21 @@
- 0x0000017a,
- 0x00000191,
- 0x000001a2,
- - 0x000001a4,
- + 0x000001a6,
- 0x000001a8,
- 0x000001ac,
- - 0x000001b5,
- - 0x000001b7,
- - 0x000001d3,
- - 0x000001d7,
- + 0x000001b0,
- + 0x000001b2,
- + 0x000001b4,
- + 0x000001bd,
- + 0x000001bf,
- 0x000001db,
- 0x000001df,
- 0x000001e3,
- 0x000001e7,
- + 0x000001eb,
- + 0x000001ef,
- };
-
- -unsigned long INSTRUCTIONS = 0x000000fe;
- -unsigned long PATCHES = 0x00000045;
- +unsigned long INSTRUCTIONS = 0x00000104;
- +unsigned long PATCHES = 0x00000048;
- diff -u --recursive --new-file v1.2.5/linux/drivers/scsi/53c8xx_u.h linux/drivers/scsi/53c8xx_u.h
- --- v1.2.5/linux/drivers/scsi/53c8xx_u.h Tue Aug 2 11:29:17 1994
- +++ linux/drivers/scsi/53c8xx_u.h Mon Apr 17 13:48:24 1995
- @@ -1,3 +1,7 @@
- +#undef A_NCR53c7xx_msg_abort
- +#undef A_NCR53c7xx_msg_reject
- +#undef A_NCR53c7xx_sink
- +#undef A_NCR53c7xx_zero
- #undef A_addr_scratch
- #undef A_addr_sfbr
- #undef A_addr_temp
- diff -u --recursive --new-file v1.2.5/linux/drivers/scsi/ChangeLog linux/drivers/scsi/ChangeLog
- --- v1.2.5/linux/drivers/scsi/ChangeLog Tue Jan 31 09:39:01 1995
- +++ linux/drivers/scsi/ChangeLog Fri Apr 21 08:51:27 1995
- @@ -1,3 +1,296 @@
- +Wed Apr 12 15:25:52 1995 Eric Youngdale (eric@andante)
- +
- + * Linux 1.2.5 released.
- +
- + * buslogic.c: Update to version 1.15 (From Dave G, I expect).
- + Fixed interrupt routine to avoid races when handling multiple
- + complete commands per interrupt. Seems to come up with faster
- + cards.
- +
- + * eata_dma.c: Modularize. Update to 2.3.5r.
- +
- + * scsi.c: If we get a FMK, EOM, or ILI when attempting to scan
- + the bus, assume that it was just noise on the bus, and ignore
- + the device.
- +
- + * scsi.h: Update and add a bunch of missing commands which we
- + were never using.
- +
- + * sd.c: Use restore_flags in do_sd_request - this may result in
- + latency conditions, but it gets rid of races and crashes.
- + Do not save flags again when searching for a second command to
- + queue.
- +
- + * st.c: Use bytes, not STP->buffer->buffer_size when reading
- + from tape.
- +
- +
- +Tue Apr 4 09:42:08 1995 Eric Youngdale (eric@andante)
- +
- + * Linux 1.2.4 released.
- +
- + * st.c: Fix typo - restoring wrong flags.
- +
- +Wed Mar 29 06:55:12 1995 Eric Youngdale (eric@andante)
- +
- + * Linux 1.2.3 released.
- +
- + * st.c: Perform some waiting operations with interrupts off.
- + Is this correct???
- +
- +Wed Mar 22 10:34:26 1995 Eric Youngdale (eric@andante)
- +
- + * Linux 1.2.2 released.
- +
- + * aha152x.c: Modularize. Add support for PCMCIA.
- +
- + * eata.c: Update to version 2.0. Fixed bug preventing media
- + detection. If scsi_register_host returns NULL, fail gracefully.
- +
- + * scsi.c: Detect as NEC (for photo-cd purposes) for the 84
- + and 25 models as "NEC_OLDCDR".
- +
- + * scsi.h: Add define for NEC_OLDCDR
- +
- + * sr.c: Add handling for NEC_OLDCDR. Treat as unknown.
- +
- + * u14-34f.c: Update to version 2.0. Fixed same bug as in
- + eata.c.
- +
- +
- +Mon Mar 6 11:11:20 1995 Eric Youngdale (eric@andante)
- +
- + * Linux 1.2.0 released. Yeah!!!
- +
- + * Minor spelling/punctuation changes throughout. Nothing
- + substantive.
- +
- +Mon Feb 20 21:33:03 1995 Eric Youngdale (eric@andante)
- +
- + * Linux 1.1.95 released.
- +
- + * qlogic.c: Update to version 0.41.
- +
- + * seagate.c: Change some message to be more descriptive about what
- + we detected.
- +
- + * sr.c: spelling/whitespace changes.
- +
- +Mon Feb 20 21:33:03 1995 Eric Youngdale (eric@andante)
- +
- + * Linux 1.1.94 released.
- +
- +Mon Feb 20 08:57:17 1995 Eric Youngdale (eric@andante)
- +
- + * Linux 1.1.93 released.
- +
- + * hosts.h: Change io_port to long int from short.
- +
- + * 53c7,8xx.c: crash on AEN fixed, SCSI reset is no longer a NOP,
- + NULL pointer panic on odd UDCs fixed, two bugs in diagnostic output
- + fixed, should initialize correctly if left running, now loadable,
- + new memory allocation, extraneous diagnostic output supressed,
- + splx() replaced with save/restore flags. [ Drew ]
- +
- + * hosts.c, hosts.h, scsi_ioctl.c, sd.c, sd_ioctl.c, sg.c, sr.c,
- + sr_ioctl.c: Add special junk at end that Emacs will use for
- + formatting the file.
- +
- + * qlogic.c: Update to v0.40a. Improve parity handling.
- +
- + * scsi.c: Add Hitachi DK312C to blacklist. Change "};" to "}" in
- + many places. Use scsi_init_malloc to get command block - may
- + need this to be dma compatible for some host adapters.
- + Restore interrupts after unregistering a host.
- +
- + * sd.c: Use sti instead of restore flags - causes latency problems.
- +
- + * seagate.c: Use controller_type to determine string used when
- + registering irq.
- +
- + * sr.c: More photo-cd hacks to make sure we get the xa stuff right.
- + * sr.h, sr.c: Change is_xa to xa_flags field.
- +
- + * st.c: Diable retries for write operations.
- +
- +Wed Feb 15 10:52:56 1995 Eric Youngdale (eric@andante)
- +
- + * Linux 1.1.92 released.
- +
- + * eata.c: Update to 1.17.
- +
- + * eata_dma.c: Add more support for /proc/scsi, add HBA_interpret flag.
- +
- + * hosts.c: If we remove last host registered, reuse host number.
- + When freeing memory from host being deregistered, free extra_bytes
- + too.
- +
- + * scsi.c (scan_scsis): memset(SDpnt, 0) and set SCmd.device to SDpnt.
- + Change memory allocation to work around bugs in __get_dma_pages.
- + Do not free host if usage count is not zero (for modules).
- +
- + * sr_ioctl.c: Increase IOCTL_TIMEOUT to 3000.
- +
- + * st.c: Allow for ST_EXTRA_DEVS in st data structures.
- +
- + * u14-34f.c: Update to 1.17.
- +
- +Thu Feb 9 10:11:16 1995 Eric Youngdale (eric@andante)
- +
- + * Linux 1.1.91 released.
- +
- + * eata.c: Update to 1.16. Use wish_block instead of host->block.
- +
- + * hosts.c: Initialize wish_block to 0.
- +
- + * hosts.h: Add wish_block.
- +
- + * scsi.c: Use wish_block as indicator that the host should be added
- + to block list.
- +
- + * sg.c: Add SG_EXTRA_DEVS to number of slots.
- +
- + * u14-34f.c: Use wish_block.
- +
- +Tue Feb 7 11:46:04 1995 Eric Youngdale (eric@andante)
- +
- + * Linux 1.1.90 released.
- +
- + * eata.c: Change naming from eata_* to eata2x_*. Now at vers 1.15.
- + Update interrupt handler to take pt_regs as arg. Allow blocking
- + even if loaded as module. Initialize target_time_out array.
- + Do not put sti(); in timing loop.
- +
- + * hosts.c: Do not reuse host numbers.
- + Use scsi_make_blocked_list to generate blocking list.
- +
- + * script_asm.pl: Beats me. Don't know perl. Something to do with
- + phase index.
- +
- + * scsi.c (scsi_make_blocked_list): New function - code copied from
- + hosts.c.
- +
- + * scsi.c: Update code to disable photo CD for Toshiba cdroms.
- + Use just manufacturer name, not model number.
- +
- + * sr.c: Fix setting density for Toshiba drives.
- +
- + * u14-34f.c: Clear target_time_out array during reset.
- +
- +Wed Feb 1 09:20:45 1995 Eric Youngdale (eric@andante)
- +
- + * Linux 1.1.89 released.
- +
- + * Makefile, u14-34f.c: Modulariz.e
- +
- + * Makefile, eata.c: Modularize. Now version 1.14
- +
- + * NCR5380.c: Update interrupt handler with new arglist. Minor
- + cleanups.
- +
- + * eata_dma.c: Modularize. Add hooks for /proc/scsi.
- + New version 2.3.0a.
- +
- + * hosts.c: Initialize ->dma_channel and ->io_port when registering
- + a new host.
- +
- + * qlogic.c: Modularize and add PCMCIA support.
- +
- + * scsi.c: Add Hitachi to blacklist.
- +
- + * scsi.c: Change default to no lun scan (too many problem devices).
- +
- + * scsi.h: Define QUEUE_FULL condition.
- +
- + * sd.c: Do not check for non-existant partition until after
- + new media check.
- +
- + * sg.c: Undo previous change which was wrong.
- +
- + * sr_ioctl.c: Increase IOCTL_TIMEOUT to 2000.
- +
- + * st.c: Patches from Kai - improve filemark handling.
- +
- +Tue Jan 31 17:32:12 1995 Eric Youngdale (eric@andante)
- +
- + * Linux 1.1.88 released.
- +
- + * Throughout - spelling/grammar fixups.
- +
- + * scsi.c: Make sure that all buffers are 16 byte aligned - some
- + drivers (buslogic) need this.
- +
- + * scsi.c (scan_scsis): Remove message printed.
- +
- + * scsi.c (scsi_init): Move message here.
- +
- +Mon Jan 30 06:40:25 1995 Eric Youngdale (eric@andante)
- +
- + * Linux 1.1.87 released.
- +
- + * sr.c: Photo-cd related changes. (Gerd Knorr??).
- +
- + * st.c: Changes from Kai related to EOM detection.
- +
- +Mon Jan 23 23:53:10 1995 Eric Youngdale (eric@andante)
- +
- + * Linux 1.1.86 released.
- +
- + * 53c7,8xx.h: Change SG size to 127.
- +
- + * eata_dma: Update to version 0i.
- +
- + * scsi.c: Test for Toshiba XM-3401TA and exclude from detection
- + as toshiba drive - photo cd does not work with this drive.
- +
- + * sr.c: Update photocd code.
- +
- +Mon Jan 23 23:53:10 1995 Eric Youngdale (eric@andante)
- +
- + * Linux 1.1.85 released.
- +
- + * st.c, st_ioctl.c, sg.c, sd_ioctl.c, scsi_ioctl.c, hosts.c:
- + include linux/mm.h
- +
- + * qlogic.c, buslogic.c, aha1542.c: Include linux/module.h.
- +
- +Sun Jan 22 22:08:46 1995 Eric Youngdale (eric@andante)
- +
- + * Linux 1.1.84 released.
- +
- + * Makefile: Support for loadable QLOGIC boards.
- +
- + * aha152x.c: Update to version 1.8 from Juergen.
- +
- + * eata_dma.c: Update from Michael Neuffer
- +
- + * in2000.c: Fix biosparam to support large disks.
- +
- + * qlogic.c: Minor changes (change sti -> restore_flags).
- +
- +Wed Jan 18 23:33:09 1995 Eric Youngdale (eric@andante)
- +
- + * Linux 1.1.83 released.
- +
- + * aha1542.c(aha1542_intr_handle): Use arguments handed down to find
- + which irq.
- +
- + * buslogic.c: Likewise.
- +
- + * eata_dma.c: Use min of 2 cmd_per_lun for OCS_enabled boards.
- +
- + * scsi.c: Make RECOVERED_ERROR a SUGGEST_IS_OK.
- +
- + * sd.c: Fail if we are opening a non-existant partition.
- +
- + * sr.c: Bump SR_TIMEOUT to 15000.
- + Do not probe for media size at boot time(hard on changers).
- + Flag device as needing sector size instead.
- +
- + * sr_ioctl.c: Remove CDROMMULTISESSION_SYS ioctl.
- +
- + * ultrastor.c: Fix bug in call to ultrastor_interrupt (wrong #args).
- +
- Mon Jan 16 07:18:23 1995 Eric Youngdale (eric@andante)
-
- * Linux 1.1.82 released.
- diff -u --recursive --new-file v1.2.5/linux/drivers/scsi/Makefile linux/drivers/scsi/Makefile
- --- v1.2.5/linux/drivers/scsi/Makefile Fri Apr 14 12:02:42 1995
- +++ linux/drivers/scsi/Makefile Mon Apr 17 13:53:22 1995
- @@ -127,6 +127,8 @@
- ifdef CONFIG_SCSI_NCR53C7xx
- SCSI_OBJS := $(SCSI_OBJS) 53c7,8xx.o
- SCSI_SRCS := $(SCSI_SRCS) 53c7,8xx.c
- +else
- +SCSI_MODULE_OBJS := $(SCSI_MODULE_OBJS) 53c7,8xx.o
- endif
-
- ifdef CONFIG_SCSI_PAS16
- @@ -190,7 +192,7 @@
-
- 53c8xx_d.h 53c8xx_u.h : 53c7,8xx.scr script_asm.pl
- ln 53c7,8xx.scr fake.c
- - $(CPP) -DCHIP=810 fake.c | grep -v ^# | perl script_asm.pl
- + $(CPP) -traditional -DCHIP=810 fake.c | grep -v '^#' | perl script_asm.pl
- mv script.h 53c8xx_d.h
- mv scriptu.h 53c8xx_u.h
- rm fake.c
- diff -u --recursive --new-file v1.2.5/linux/drivers/scsi/buslogic.c linux/drivers/scsi/buslogic.c
- --- v1.2.5/linux/drivers/scsi/buslogic.c Fri Apr 14 12:02:42 1995
- +++ linux/drivers/scsi/buslogic.c Sun Apr 23 19:18:13 1995
- @@ -469,10 +469,7 @@
- interrupt_flags = inb(INTERRUPT(base));
-
- if (!(interrupt_flags & INTV))
- - {
- - buslogic_printk("interrupt received, but INTV not set\n");
- - return;
- - }
- + buslogic_printk("interrupt received, but INTV not set\n");
-
- /*
- Reset the Host Adapter Interrupt Register. It appears to be
- @@ -504,16 +501,27 @@
- while (mb[mbi].status != MBX_NOT_IN_USE && found < BUSLOGIC_MAILBOXES)
- {
- int mbo = (struct ccb *)mb[mbi].ccbptr - ccb;
- - int result = 0;
-
- - saved_mbo[found++] = mbo;
- + sctmp = HOSTDATA(shpnt)->sc[mbo];
- +
- + /*
- + If sctmp has become NULL, higher level code must have aborted
- + this operation and called the necessary completion routine.
- + */
- +
- + if (sctmp != NULL && mb[mbi].status != MBX_COMPLETION_NOT_FOUND)
- + {
- + int result = 0;
- +
- + saved_mbo[found++] = mbo;
-
- - if (mb[mbi].status != MBX_COMPLETION_OK)
- - result = makecode(ccb[mbo].hastat, ccb[mbo].tarstat);
- + if (mb[mbi].status != MBX_COMPLETION_OK)
- + result = makecode(ccb[mbo].hastat, ccb[mbo].tarstat);
-
- - HOSTDATA(shpnt)->sc[mbo]->result = result;
- + sctmp->result = result;
-
- - mb[mbi].status = MBX_NOT_IN_USE;
- + mb[mbi].status = MBX_NOT_IN_USE;
- + }
-
- HOSTDATA(shpnt)->last_mbi_used = mbi;
-
- @@ -535,6 +543,7 @@
- {
- int mbo = saved_mbo[i];
- sctmp = HOSTDATA(shpnt)->sc[mbo];
- + if (sctmp == NULL) continue;
- /*
- First, free any storage allocated for a scatter/gather
- data segment list.
- @@ -542,14 +551,15 @@
- if (sctmp->host_scribble)
- scsi_free(sctmp->host_scribble, BUSLOGIC_SG_MALLOC);
- /*
- - Next, call the SCSI command completion handler.
- + Next, mark the SCSI Command as completed so it may be reused
- + for another command by buslogic_queuecommand. This also signals
- + to buslogic_reset that the command is no longer active.
- */
- - sctmp->scsi_done(sctmp);
- + HOSTDATA(shpnt)->sc[mbo] = NULL;
- /*
- - Finally, mark the SCSI Command as completed so it may be reused
- - for another command by buslogic_queuecommand.
- + Finally, call the SCSI command completion handler.
- */
- - HOSTDATA(shpnt)->sc[mbo] = NULL;
- + sctmp->scsi_done(sctmp);
- }
- }
-
- @@ -1344,7 +1354,7 @@
- #if 1
- static const unsigned char buscmd[] = { CMD_START_SCSI };
- struct mailbox *mb;
- - size_t mbi, mbo;
- + int mbi, mbo, last_mbi;
- unsigned long flags;
- unsigned int i;
-
- @@ -1355,28 +1365,30 @@
- save_flags(flags);
- cli();
- mb = HOSTDATA(scpnt->host)->mb;
- - mbi = HOSTDATA(scpnt->host)->last_mbi_used + 1;
- + last_mbi = HOSTDATA(scpnt->host)->last_mbi_used;
- + mbi = last_mbi + 1;
- if (mbi >= 2 * BUSLOGIC_MAILBOXES)
- mbi = BUSLOGIC_MAILBOXES;
-
- do {
- if (mb[mbi].status != MBX_NOT_IN_USE)
- break;
- + last_mbi = mbi;
- mbi++;
- if (mbi >= 2 * BUSLOGIC_MAILBOXES)
- mbi = BUSLOGIC_MAILBOXES;
- } while (mbi != HOSTDATA(scpnt->host)->last_mbi_used);
- - restore_flags(flags);
-
- if (mb[mbi].status != MBX_NOT_IN_USE) {
- - buslogic_printk("lost interrupt discovered on irq %d"
- + buslogic_printk("lost interrupt discovered on irq %d, "
- " - attempting to recover...\n",
- scpnt->host->irq);
- - {
- - buslogic_interrupt(scpnt->host->irq, NULL);
- - return SCSI_ABORT_SUCCESS;
- - }
- + HOSTDATA(scpnt->host)->last_mbi_used = last_mbi;
- + buslogic_interrupt(scpnt->host->irq, NULL);
- + restore_flags(flags);
- + return SCSI_ABORT_SUCCESS;
- }
- + restore_flags(flags);
-
- /* OK, no lost interrupt. Try looking to see how many pending commands we
- think we have. */
- diff -u --recursive --new-file v1.2.5/linux/drivers/scsi/eata_dma.c linux/drivers/scsi/eata_dma.c
- --- v1.2.5/linux/drivers/scsi/eata_dma.c Fri Apr 14 12:02:42 1995
- +++ linux/drivers/scsi/eata_dma.c Fri Apr 14 12:01:41 1995
- @@ -710,7 +710,7 @@
- while (inb((uint) base + HA_RSTATUS) & HA_SDRQ)
- inw((uint) base + HA_RDATA);
- if (warning == TRUE)
- - printk("Warning: HBA with IO on 0x%p dectected,\n"
- + printk("Warning: HBA with IO on 0x%p detected,\n"
- " this IO space is already allocated, probably by the IDE driver.\n"
- " This might lead to problems.", base);
- return (TRUE);
- diff -u --recursive --new-file v1.2.5/linux/fs/nfs/file.c linux/fs/nfs/file.c
- --- v1.2.5/linux/fs/nfs/file.c Mon Jan 23 10:38:29 1995
- +++ linux/fs/nfs/file.c Mon Apr 17 13:41:26 1995
- @@ -123,7 +123,7 @@
- if ((cache[i].inode_num == inode->i_ino)
- && (cache[i].file_pos <= pos)
- && (cache[i].file_pos + cache[i].len >= pos + count)
- - && (abs(jiffies - cache[i].time) <= EXPIRE_CACHE))
- + && (abs(jiffies - cache[i].time) < EXPIRE_CACHE))
- break;
- if (i < READ_CACHE_SIZE) {
- ++cache[i].in_use;
- diff -u --recursive --new-file v1.2.5/linux/fs/select.c linux/fs/select.c
- --- v1.2.5/linux/fs/select.c Mon Jan 23 23:04:10 1995
- +++ linux/fs/select.c Tue Apr 18 08:57:32 1995
- @@ -237,11 +237,10 @@
- }
- current->timeout = timeout;
- i = do_select(n, &in, &out, &ex, &res_in, &res_out, &res_ex);
- - if (current->timeout > jiffies)
- - timeout = current->timeout - jiffies;
- - else
- - timeout = 0;
- + timeout = current->timeout - jiffies - 1;
- current->timeout = 0;
- + if ((long) timeout < 0)
- + timeout = 0;
- if (tvp && !(current->personality & STICKY_TIMEOUTS)) {
- put_fs_long(timeout/HZ, (unsigned long *) &tvp->tv_sec);
- timeout %= HZ;
- diff -u --recursive --new-file v1.2.5/linux/include/asm-alpha/byteorder.h linux/include/asm-alpha/byteorder.h
- --- v1.2.5/linux/include/asm-alpha/byteorder.h Tue Feb 21 09:05:02 1995
- +++ linux/include/asm-alpha/byteorder.h Mon Apr 17 13:47:56 1995
- @@ -6,6 +6,9 @@
- #undef htonl
- #undef htons
-
- +#define LITTLE_ENDIAN
- +#define LITTLE_ENDIAN_BITFIELD
- +
- extern unsigned long int ntohl(unsigned long int);
- extern unsigned short int ntohs(unsigned short int);
- extern unsigned long int htonl(unsigned long int);
- diff -u --recursive --new-file v1.2.5/linux/include/asm-i386/byteorder.h linux/include/asm-i386/byteorder.h
- --- v1.2.5/linux/include/asm-i386/byteorder.h Tue Feb 21 09:02:02 1995
- +++ linux/include/asm-i386/byteorder.h Mon Apr 17 13:47:56 1995
- @@ -6,6 +6,9 @@
- #undef htonl
- #undef htons
-
- +#define LITTLE_ENDIAN 1234
- +#define LITTLE_ENDIAN_BITFIELD
- +
- extern unsigned long int ntohl(unsigned long int);
- extern unsigned short int ntohs(unsigned short int);
- extern unsigned long int htonl(unsigned long int);
- diff -u --recursive --new-file v1.2.5/linux/include/asm-mips/byteorder.h linux/include/asm-mips/byteorder.h
- --- v1.2.5/linux/include/asm-mips/byteorder.h Sat Jan 14 02:27:06 1995
- +++ linux/include/asm-mips/byteorder.h Mon Apr 17 13:47:56 1995
- @@ -6,6 +6,16 @@
- #undef htonl
- #undef htons
-
- +#ifdef MIPSEL
- +#define LITTLE_ENDIAN
- +#define LITTLE_ENDIAN_BITFIELD
- +#elif MIPSEB
- +#define BIG_ENDIAN
- +#define BIG_ENDIAN_BITFIELD
- +#else
- +#error "MIPS but neither MIPSEL nor MIPSEB?"
- +#endif
- +
- extern unsigned long int ntohl(unsigned long int);
- extern unsigned short int ntohs(unsigned short int);
- extern unsigned long int htonl(unsigned long int);
- diff -u --recursive --new-file v1.2.5/linux/include/asm-sparc/byteorder.h linux/include/asm-sparc/byteorder.h
- --- v1.2.5/linux/include/asm-sparc/byteorder.h Thu Feb 2 08:42:35 1995
- +++ linux/include/asm-sparc/byteorder.h Mon Apr 17 13:47:56 1995
- @@ -6,6 +6,9 @@
- #undef htonl
- #undef htons
-
- +#define BIG_ENDIAN
- +#define BIG_ENDIAN_BITFIELD
- +
- extern unsigned long int ntohl(unsigned long int);
- extern unsigned short int ntohs(unsigned short int);
- extern unsigned long int htonl(unsigned long int);
- diff -u --recursive --new-file v1.2.5/linux/include/linux/bios32.h linux/include/linux/bios32.h
- --- v1.2.5/linux/include/linux/bios32.h Fri Feb 3 19:28:28 1995
- +++ linux/include/linux/bios32.h Mon Apr 17 13:48:18 1995
- @@ -48,5 +48,5 @@
- unsigned char device_fn, unsigned char where, unsigned short value);
- extern pcibios_write_config_dword (unsigned char bus,
- unsigned char device_fn, unsigned char where, unsigned long value);
- -
- +extern char *pcibios_strerror (int error);
- #endif /* ndef BIOS32_H */
- diff -u --recursive --new-file v1.2.5/linux/include/linux/ip.h linux/include/linux/ip.h
- --- v1.2.5/linux/include/linux/ip.h Mon Feb 20 08:59:52 1995
- +++ linux/include/linux/ip.h Mon Apr 17 13:47:56 1995
- @@ -16,7 +16,7 @@
- */
- #ifndef _LINUX_IP_H
- #define _LINUX_IP_H
- -
- +#include <asm/byteorder.h>
-
- #define IPOPT_END 0
- #define IPOPT_NOOP 1
- @@ -34,26 +34,14 @@
- __u8 len;
- __u8 ptr;
- union {
- -#if defined(__i386__)
- - __u8 flags:4,
- - overflow:4;
- -#elif defined(__mc68000__)
- - __u8 overflow:4,
- - flags:4;
- -#elif defined(__MIPSEL__)
- - __u8 flags:4,
- - overflow:4;
- -#elif defined(__MIPSEB__)
- - __u8 overflow:4,
- - flags:4;
- -#elif defined(__alpha__)
- +#if defined(LITTLE_ENDIAN_BITFIELD)
- __u8 flags:4,
- overflow:4;
- -#elif defined(__sparc__)
- +#elif defined(BIG_ENDIAN_BITFIELD)
- __u8 overflow:4,
- flags:4;
- #else
- -#error "Adjust this structure to match your CPU"
- +#error "Please fix <asm/byteorder.h>"
- #endif
- __u8 full_char;
- } x;
- @@ -84,26 +72,14 @@
-
-
- struct iphdr {
- -#if defined(__i386__)
- - __u8 ihl:4,
- - version:4;
- -#elif defined (__mc68000__)
- - __u8 version:4,
- - ihl:4;
- -#elif defined(__MIPSEL__)
- - __u8 ihl:4,
- - version:4;
- -#elif defined(__MIPSEB__)
- - __u8 version:4,
- - ihl:4;
- -#elif defined(__alpha__)
- +#if defined(LITTLE_ENDIAN_BITFIELD)
- __u8 ihl:4,
- version:4;
- -#elif defined (__sparc__)
- +#elif defined (BIG_ENDIAN_BITFIELD)
- __u8 version:4,
- ihl:4;
- #else
- -#error "Adjust this structure to match your CPU"
- +#error "Please fix <asm/byteorder.h>"
- #endif
- __u8 tos;
- __u16 tot_len;
- diff -u --recursive --new-file v1.2.5/linux/include/linux/tcp.h linux/include/linux/tcp.h
- --- v1.2.5/linux/include/linux/tcp.h Mon Feb 20 08:59:52 1995
- +++ linux/include/linux/tcp.h Mon Apr 17 13:47:56 1995
- @@ -26,7 +26,7 @@
- __u16 dest;
- __u32 seq;
- __u32 ack_seq;
- -#if defined(__i386__)
- +#if defined(LITTLE_ENDIAN_BITFIELD)
- __u16 res1:4,
- doff:4,
- fin:1,
- @@ -36,47 +36,7 @@
- ack:1,
- urg:1,
- res2:2;
- -#elif defined(__mc68000__)
- - __u16 res2:2,
- - urg:1,
- - ack:1,
- - psh:1,
- - rst:1,
- - syn:1,
- - fin:1,
- - doff:4,
- - res1:4;
- -#elif defined(__MIPSEL__)
- - __u16 res1:4,
- - doff:4,
- - fin:1,
- - syn:1,
- - rst:1,
- - psh:1,
- - ack:1,
- - urg:1,
- - res2:2;
- -#elif defined(__MIPSEB__)
- - __u16 res2:2,
- - urg:1,
- - ack:1,
- - psh:1,
- - rst:1,
- - syn:1,
- - fin:1,
- - doff:4,
- - res1:4;
- -#elif defined(__alpha__)
- - __u16 res1:4,
- - doff:4,
- - fin:1,
- - syn:1,
- - rst:1,
- - psh:1,
- - ack:1,
- - urg:1,
- - res2:2;
- -#elif defined(__sparc__)
- +#elif defined(BIG_ENDIAN_BITFIELD)
- __u16 res2:2,
- urg:1,
- ack:1,
- @@ -87,7 +47,7 @@
- doff:4,
- res1:4;
- #else
- -#error "Adjust this structure for your cpu alignment rules"
- +#error "Adjust your <asm/byteorder.h> defines"
- #endif
- __u16 window;
- __u16 check;
- diff -u --recursive --new-file v1.2.5/linux/kernel/ksyms.c linux/kernel/ksyms.c
- --- v1.2.5/linux/kernel/ksyms.c Fri Apr 14 12:02:43 1995
- +++ linux/kernel/ksyms.c Mon Apr 17 13:48:23 1995
- @@ -34,9 +34,10 @@
- #include <linux/delay.h>
- #include <linux/config.h>
-
- -#ifdef CONFIG_INET
- +#ifdef CONFIG_NET
- #include <linux/net.h>
- #include <linux/netdevice.h>
- +#ifdef CONFIG_INET
- #include <linux/ip.h>
- #include <linux/tcp.h>
- #include "../net/inet/protocol.h"
- @@ -45,6 +46,7 @@
- #include "../drivers/net/slhc.h"
- #endif
- #endif
- +#endif
- #ifdef CONFIG_PCI
- #include <linux/pci.h>
- #endif
- @@ -105,6 +107,7 @@
- X(pcibios_read_config_byte),
- X(pcibios_read_config_word),
- X(pcibios_read_config_dword),
- + X(pcibios_strerror),
- X(pcibios_write_config_byte),
- X(pcibios_write_config_word),
- X(pcibios_write_config_dword),
- @@ -277,6 +280,7 @@
- X(inet_add_protocol),
- X(inet_del_protocol),
- #if defined(CONFIG_PPP) || defined(CONFIG_SLIP)
- + /* VJ header compression */
- X(slhc_init),
- X(slhc_free),
- X(slhc_remember),
- @@ -321,6 +325,11 @@
- #endif
- #ifdef CONFIG_SCSI
- /* Supports loadable scsi drivers */
- + /*
- + * in_scan_scsis is a hack, and should go away once the new
- + * memory allocation code is in the NCR driver
- + */
- + X(in_scan_scsis),
- X(scsi_register_module),
- X(scsi_unregister_module),
- X(scsi_free),
- @@ -331,6 +340,8 @@
- X(scsi_init_malloc),
- X(scsi_init_free),
- X(print_command),
- + X(print_msg),
- + X(print_status),
- #endif
- /* Added to make file system as module */
- X(set_writetime),
- diff -u --recursive --new-file v1.2.5/linux/mm/swap.c linux/mm/swap.c
- --- v1.2.5/linux/mm/swap.c Sun Apr 9 11:59:57 1995
- +++ linux/mm/swap.c Fri Apr 21 13:41:36 1995
- @@ -523,7 +523,7 @@
- int loop, counter;
- struct task_struct *p;
-
- - counter = 2*nr_tasks >> priority;
- + counter = 6*nr_tasks >> priority;
- for(; counter >= 0; counter--) {
- /*
- * Check that swap_task is suitable for swapping. If not, look for
- @@ -605,7 +605,7 @@
- if (swap_out(i))
- return 1;
- state = 0;
- - } while(--i);
- + } while(i--);
- }
- return 0;
- }
-