]> git.neil.brown.name Git - history.git/commitdiff
Import 1.2.7 1.2.7
authorLinus Torvalds <torvalds@linuxfoundation.org>
Fri, 23 Nov 2007 20:09:58 +0000 (15:09 -0500)
committerLinus Torvalds <torvalds@linuxfoundation.org>
Fri, 23 Nov 2007 20:09:58 +0000 (15:09 -0500)
22 files changed:
Makefile
arch/alpha/config.in
arch/i386/config.in
arch/i386/kernel/signal.c
arch/mips/config.in
arch/sparc/config.in
drivers/block/ide-cd.c
drivers/char/ChangeLog
drivers/char/serial.c
drivers/char/tty_io.c
drivers/net/3c503.c
drivers/net/8390.c
drivers/net/8390.h
drivers/net/Makefile
drivers/net/ne.c
drivers/net/wd.c
drivers/scsi/53c7,8xx.c
drivers/scsi/53c7,8xx.h
drivers/scsi/ChangeLog
fs/buffer.c
include/asm-alpha/byteorder.h
include/asm-i386/byteorder.h

index 7e41d2985c3e3db18278111cc4ab1f53179b80b0..b7c3bf27433993ad0e301995d1de813047153d90 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
 VERSION = 1
 PATCHLEVEL = 2
-SUBLEVEL = 6
+SUBLEVEL = 7
 
 ARCH = i386
 
index 794f280127f855b35c008648bc52e442123aa922..2bd47c1e06166e1b6705f2193c29319fae6a87dc 100644 (file)
@@ -43,10 +43,10 @@ else
 
 comment 'SCSI support type (disk, tape, CDrom)'
 
-bool 'Scsi disk support' CONFIG_BLK_DEV_SD y
-bool 'Scsi tape support' CONFIG_CHR_DEV_ST n
-bool 'Scsi CDROM support' CONFIG_BLK_DEV_SR n
-bool 'Scsi generic support' CONFIG_CHR_DEV_SG n
+bool 'SCSI disk support' CONFIG_BLK_DEV_SD y
+bool 'SCSI tape support' CONFIG_CHR_DEV_ST n
+bool 'SCSI CDROM support' CONFIG_BLK_DEV_SR n
+bool 'SCSI generic support' CONFIG_CHR_DEV_SG n
 
 comment 'SCSI low-level drivers'
 
@@ -233,5 +233,5 @@ if [ "$CONFIG_PROFILE" = "y" ]; then
   int ' Profile shift count' CONFIG_PROFILE_SHIFT 2
 fi
 if [ "$CONFIG_SCSI" = "y" ]; then
-bool 'Verbose scsi error reporting (kernel size +=12K)' CONFIG_SCSI_CONSTANTS y
+bool 'Verbose SCSI error reporting (kernel size +=12K)' CONFIG_SCSI_CONSTANTS y
 fi
index e619e4835d1f1236d1ad10bf7a5cb75993ae9e0b..26a80d7efac1cd496d7d0857e875c760d63c4136 100644 (file)
@@ -69,10 +69,10 @@ else
 
 comment 'SCSI support type (disk, tape, CDrom)'
 
-bool 'Scsi disk support' CONFIG_BLK_DEV_SD y
-bool 'Scsi tape support' CONFIG_CHR_DEV_ST n
-bool 'Scsi CDROM support' CONFIG_BLK_DEV_SR n
-bool 'Scsi generic support' CONFIG_CHR_DEV_SG n
+bool 'SCSI disk support' CONFIG_BLK_DEV_SD y
+bool 'SCSI tape support' CONFIG_CHR_DEV_ST n
+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'
 
@@ -267,5 +267,5 @@ if [ "$CONFIG_PROFILE" = "y" ]; then
   int ' Profile shift count' CONFIG_PROFILE_SHIFT 2
 fi
 if [ "$CONFIG_SCSI" = "y" ]; then
-bool 'Verbose scsi error reporting (kernel size +=12K)' CONFIG_SCSI_CONSTANTS y
+bool 'Verbose SCSI error reporting (kernel size +=12K)' CONFIG_SCSI_CONSTANTS y
 fi
index 0dbe2715b64c24527c15616d91f9cf705b0f0371..c14279b81856d2caaa30174727c30d9df5d8ac02 100644 (file)
@@ -151,10 +151,10 @@ asmlinkage int do_signal(unsigned long oldmask, struct pt_regs * regs)
        struct sigaction * sa;
 
        while ((signr = current->signal & mask)) {
-               __asm__("bsf %2,%1\n\t"
+               __asm__("bsf %3,%1\n\t"
                        "btrl %1,%0"
                        :"=m" (current->signal),"=r" (signr)
-                       :"1" (signr));
+                       :"0" (current->signal), "1" (signr));
                sa = current->sigaction + signr;
                signr++;
                if ((current->flags & PF_PTRACED) && signr != SIGKILL) {
index 14c7554f58c86f2b662da29d1a122db1298d16d3..999775db75f91c4f648e31766f1b18ab22ce98f3 100644 (file)
@@ -63,10 +63,10 @@ else
 
 comment 'SCSI support type (disk, tape, CDrom)'
 
-bool 'Scsi disk support' CONFIG_BLK_DEV_SD y
-bool 'Scsi tape support' CONFIG_CHR_DEV_ST y
-bool 'Scsi CDROM support' CONFIG_BLK_DEV_SR y
-bool 'Scsi generic support' CONFIG_CHR_DEV_SG y
+bool 'SCSI disk support' CONFIG_BLK_DEV_SD y
+bool 'SCSI tape support' CONFIG_CHR_DEV_ST y
+bool 'SCSI CDROM support' CONFIG_BLK_DEV_SR y
+bool 'SCSI generic support' CONFIG_CHR_DEV_SG y
 
 comment 'SCSI low-level drivers'
 
@@ -252,5 +252,5 @@ if [ "$CONFIG_PROFILE" = "y" ]; then
   int ' Profile shift count' CONFIG_PROFILE_SHIFT 2
 fi
 if [ "$CONFIG_SCSI" = "y" ]; then
-bool 'Verbose scsi error reporting (kernel size +=12K)' CONFIG_SCSI_CONSTANTS y
+bool 'Verbose SCSI error reporting (kernel size +=12K)' CONFIG_SCSI_CONSTANTS y
 fi
index 767ead214b8c9337cc55e19ef92f7e905091f92f..be9336eedd00f44c13ddbb0df6f22ff761cefcd1 100644 (file)
@@ -50,10 +50,10 @@ else
 
 comment 'SCSI support type (disk, tape, CDrom)'
 
-bool 'Scsi disk support' CONFIG_BLK_DEV_SD y
-bool 'Scsi tape support' CONFIG_CHR_DEV_ST n
-bool 'Scsi CDROM support' CONFIG_BLK_DEV_SR n
-bool 'Scsi generic support' CONFIG_CHR_DEV_SG n
+bool 'SCSI disk support' CONFIG_BLK_DEV_SD y
+bool 'SCSI tape support' CONFIG_CHR_DEV_ST n
+bool 'SCSI CDROM support' CONFIG_BLK_DEV_SR n
+bool 'SCSI generic support' CONFIG_CHR_DEV_SG n
 
 comment 'SCSI low-level drivers'
 
@@ -242,5 +242,5 @@ if [ "$CONFIG_PROFILE" = "y" ]; then
   int ' Profile shift count' CONFIG_PROFILE_SHIFT 2
 fi
 if [ "$CONFIG_SCSI" = "y" ]; then
-bool 'Verbose scsi error reporting (kernel size +=12K)' CONFIG_SCSI_CONSTANTS y
+bool 'Verbose SCSI error reporting (kernel size +=12K)' CONFIG_SCSI_CONSTANTS y
 fi
index c3f83cdc5157d3621ddef4b492aaf3aad8951de5..15c646d6acbdf349a69e5005816fac093d834239 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * linux/drivers/block/ide-cd.c  (BETA)
+ * linux/drivers/block/ide-cd.c
  *
  * 1.00  Oct 31, 1994 -- Initial version.
  * 1.01  Nov  2, 1994 -- Fixed problem with starting request in
  * 2.03  Jan 10, 1995 -- Rewrite block read routines to handle block sizes
  *                       other than 2k and to move multiple sectors in a
  *                       single transaction.
+ * 2.04  Apr 21, 1995 -- Add work-around for Creative Labs CD220E drives.
+ *                       Thanks to Nick Saw <cwsaw@pts7.pts.mot.com> for
+ *                       help in figuring this out.  Ditto for Acer and
+ *                       Aztech drives, which seem to have the same problem.
+ *                       
  *
  * ATAPI cd-rom driver.  To be used with ide.c.
  *
  * Copyright (C) 1994, 1995  scott snyder  <snyder@fnald0.fnal.gov>
+ * May be copied or modified under the terms of the GNU General Public License
+ * (../../COPYING).
  */
 
 #include <linux/cdrom.h>
@@ -88,7 +95,8 @@ struct ide_cd_flags {
 
   unsigned media_changed : 1; /* Driver has noticed a media change. */
   unsigned toc_valid     : 1; /* Saved TOC information is current. */
-  unsigned reserved : 4;
+  unsigned no_lba_toc    : 1; /* Drive cannot return TOC info in LBA format */
+  unsigned reserved : 3;
 };
 
 #define CDROM_FLAGS(dev) ((struct ide_cd_flags *)&((dev)->bios_sect))
@@ -1094,6 +1102,7 @@ cdrom_read_tocentry (ide_dev_t *dev, int trackno, int msf_flag,
 static int
 cdrom_read_toc (ide_dev_t *dev)
 {
+  int msf_flag;
   int stat, ntracks, i;
   struct atapi_toc *toc = cdrom_info[dev->hwif][dev->select.b.drive].toc;
 
@@ -1118,8 +1127,11 @@ cdrom_read_toc (ide_dev_t *dev)
 
   if (CDROM_FLAGS (dev)->toc_valid) return 0;
 
+  /* Some drives can't return TOC data in LBA format. */
+  msf_flag = (CDROM_FLAGS (dev)->no_lba_toc);
+
   /* First read just the header, so we know how long the TOC is. */
-  stat = cdrom_read_tocentry (dev, 0, 0, (char *)toc,
+  stat = cdrom_read_tocentry (dev, 0, msf_flag, (char *)toc,
                               sizeof (struct atapi_toc_header) +
                               sizeof (struct atapi_toc_entry));
   if (stat) return stat;
@@ -1129,13 +1141,21 @@ cdrom_read_toc (ide_dev_t *dev)
   if (ntracks > MAX_TRACKS) ntracks = MAX_TRACKS;
 
   /* Now read the whole schmeer. */
-  stat = cdrom_read_tocentry (dev, 0, 0, (char *)toc,
+  stat = cdrom_read_tocentry (dev, 0, msf_flag, (char *)toc,
                               sizeof (struct atapi_toc_header) +
                               (ntracks+1) * sizeof (struct atapi_toc_entry));
   if (stat) return stat;
   byte_swap_word (&toc->hdr.toc_length);
   for (i=0; i<=ntracks; i++)
-    byte_swap_long (&toc->ent[i].lba);
+    {
+      if (msf_flag)
+       {
+         byte *adr = (byte *)&(toc->ent[i].lba);
+         toc->ent[i].lba = msf_to_lba (adr[1], adr[2], adr[3]);
+       }
+      else
+       byte_swap_long (&toc->ent[i].lba);
+    }
 
   /* Remember that we've read this stuff. */
   CDROM_FLAGS (dev)->toc_valid = 1;
@@ -1618,8 +1638,20 @@ static void cdrom_setup (ide_dev_t *dev)
   CDROM_FLAGS (dev)->toc_valid     = 0;
 
   CDROM_FLAGS (dev)->no_playaudio12 = 0;
+  CDROM_FLAGS (dev)->no_lba_toc = 0;
   CDROM_FLAGS (dev)->drq_interrupt = ((dev->id->config & 0x0060) == 0x20);
 
+  /* Accommodate some broken drives... */
+  if (strcmp (dev->id->model, "CD220E") == 0)  /* Creative Labs */
+    CDROM_FLAGS (dev)->no_lba_toc = 1;
+
+  else if (strcmp (dev->id->model, "TO-ICSLYAL") == 0 ||  /* Acer CD525E */
+           strcmp (dev->id->model, "OTI-SCYLLA") == 0)
+    CDROM_FLAGS (dev)->no_lba_toc = 1;
+
+  else if (strcmp (dev->id->model, "CDA26803I SE") == 0) /* Aztech */
+    CDROM_FLAGS (dev)->no_lba_toc = 1;
+
   cdrom_info[dev->hwif][dev->select.b.drive].toc               = NULL;
   cdrom_info[dev->hwif][dev->select.b.drive].sector_buffer     = NULL;
   cdrom_info[dev->hwif][dev->select.b.drive].sector_buffered   = 0;
index a6a54c15421e580e96124eec73ef1f2bfe11cfc9..8356e7a6d2970b182c4d54991ccf4250035f5537 100644 (file)
@@ -1,3 +1,16 @@
+Wed Apr 26 10:23:44 1995  Theodore Y. Ts'o  <tytso@localhost>
+
+       * tty_io.c (release_dev): Try to shutdown the line discpline
+               *before* decrementing the tty count variable; this removes
+               a potential race condition which occurs when the line
+               discpline close blocks, and another process then tries
+               open the same serial port.
+
+       * serial.c (rs_hangup): When hanging up, flush the output buffer
+               befure shutting down the UART.  Otherwise the line
+               discpline close blocks waiting for the characters to get
+               flushed, which never happens until the serial port gets reused.
+
 Wed Apr 12 08:06:16 1995  Theodore Y. Ts'o  <tytso@localhost>
 
        * serial.c (do_serial_hangup, do_softint, check_modem_status,
index d424d4f6ace3cb4a37fbd5940146048d2582671b..6dec4c9795f58d6a34f9b67a716d68541abca297 100644 (file)
@@ -2090,6 +2090,7 @@ void rs_hangup(struct tty_struct *tty)
        if (serial_paranoia_check(info, tty->device, "rs_hangup"))
                return;
        
+       rs_flush_buffer(tty);
        shutdown(info);
        info->event = 0;
        info->count = 0;
index d6c7234137f01d81b584f74b0ca8d9eafbf75d13..baf3f4a9e20576b4dff5df00ba98b49ab95eb7ac 100644 (file)
@@ -1006,6 +1006,22 @@ static void release_dev(struct file * filp)
                        tty->link->count = 0;
                }
        }
+       if (tty->count <= 1) {
+               /*
+                * Shutdown the current line discipline, and reset it
+                * to N_TTY.
+                */
+               if (tty->ldisc.close)
+                       (tty->ldisc.close)(tty);
+               tty->ldisc = ldiscs[N_TTY];
+               tty->termios->c_line = N_TTY;
+               if (o_tty && o_tty->count <= 0) {
+                       if (o_tty->ldisc.close)
+                               (o_tty->ldisc.close)(o_tty);
+                       o_tty->ldisc = ldiscs[N_TTY];
+                       o_tty->termios->c_line = N_TTY;
+               }
+       }
        if (--tty->count < 0) {
                printk("release_dev: bad tty->count (%d) for %s\n",
                       tty->count, tty_name(tty));
@@ -1039,23 +1055,6 @@ static void release_dev(struct file * filp)
                        (*p)->tty = NULL;
        }
 
-       /*
-        * Shutdown the current line discipline, and reset it to
-        * N_TTY.
-        */
-       if (tty->ldisc.close)
-               (tty->ldisc.close)(tty);
-       tty->ldisc = ldiscs[N_TTY];
-       tty->termios->c_line = N_TTY;
-       if (o_tty) {
-               if (o_tty->ldisc.close)
-                       (o_tty->ldisc.close)(o_tty);
-               o_tty->ldisc = ldiscs[N_TTY];
-#if 0 /* No way! We just released the termios struct! */
-               o_tty->termios->c_line = N_TTY;
-#endif
-       }
-       
        tty->driver.table[idx] = NULL;
        if (tty->driver.flags & TTY_DRIVER_RESET_TERMIOS) {
                tty->driver.termios[idx] = NULL;
index 5eb20c09a5adbdc250cfbc25a269578e660b9d03..2c3ab0351647f1e73656f868137cc17f5e68311e 100644 (file)
@@ -317,6 +317,7 @@ el2_close(struct device *dev)
     outb(EGACFR_IRQOFF, E33G_GACFR);   /* disable interrupts. */
 
     NS8390_init(dev, 0);
+    dev->start = 0;
 
     return 0;
 }
index 55db9f08595f222b95ff2ce4482c64adfc69de3f..74f8efb4dbae5fc1b16c2ae5fed7a04576eeeaef 100644 (file)
   This is the chip-specific code for many 8390-based ethernet adaptors.
   This is not a complete driver, it must be combined with board-specific
   code such as ne.c, wd.c, 3c503.c, etc.
+
+  13/04/95 -- Don't blindly swallow ENISR_RDC interrupts for non-shared
+  memory cards. We need to follow these closely for neX000 cards.
+  Plus other minor cleanups.   -- Paul Gortmaker
+
   */
 
 static char *version =
@@ -83,7 +88,7 @@ int ei_debug = 1;
 #endif
 
 /* Max number of packets received at one Intr.
-   Current this may only be examined by a kernel debugger. */
+   Currently this may only be examined by a kernel debugger. */
 static int high_water_mark = 0;
 
 /* Index to functions. */
@@ -124,16 +129,18 @@ static int ei_start_xmit(struct sk_buff *skb, struct device *dev)
     int e8390_base = dev->base_addr;
     struct ei_device *ei_local = (struct ei_device *) dev->priv;
     int length, send_length;
+    unsigned long flags;
     
-       /* We normally shouldn't be called if dev->tbusy is set, but the
-          existing code does anyway.
-          If it has been too long (> 100 or 150ms.) since the last Tx we assume
-          the board has died and kick it. */
-
+/*
+ *  We normally shouldn't be called if dev->tbusy is set, but the
+ *  existing code does anyway. If it has been too long since the
+ *  last Tx, we assume the board has died and kick it.
+ */
     if (dev->tbusy) {  /* Do timeouts, just like the 8003 driver. */
                int txsr = inb(e8390_base+EN0_TSR), isr;
                int tickssofar = jiffies - dev->trans_start;
-               if (tickssofar < 10     ||      (tickssofar < 15 && ! (txsr & ENTSR_PTX))) {
+               if (tickssofar < TX_TIMEOUT ||  (tickssofar < (TX_TIMEOUT+5) && ! (txsr & ENTSR_PTX))) {
                        return 1;
                }
                isr = inb(e8390_base+EN0_ISR);
@@ -170,15 +177,22 @@ static int ei_start_xmit(struct sk_buff *skb, struct device *dev)
     if (skb->len <= 0)
                return 0;
 
-       /* Block a timer-based transmit from overlapping. */
-       if (set_bit(0, (void*)&dev->tbusy) != 0) {
-               printk("%s: Transmitter access conflict.\n", dev->name);
-               return 1;
-       }
+    save_flags(flags);
+    cli();
+
+    /* Block a timer-based transmit from overlapping. */
+    if ((set_bit(0, (void*)&dev->tbusy) != 0) || ei_local->irqlock) {
+       printk("%s: Tx access conflict. irq=%d lock=%d tx1=%d tx2=%d last=%d\n",
+               dev->name, dev->interrupt, ei_local->irqlock, ei_local->tx1,
+               ei_local->tx2, ei_local->lasttx);
+       restore_flags(flags);
+       return 1;
+    }
 
     /* Mask interrupts from the ethercard. */
-    outb(0x00, e8390_base + EN0_IMR);
+    outb(0x00, e8390_base + EN0_IMR);
     ei_local->irqlock = 1;
+    restore_flags(flags);
 
     send_length = ETH_ZLEN < length ? length : ETH_ZLEN;
 
@@ -200,28 +214,30 @@ static int ei_start_xmit(struct sk_buff *skb, struct device *dev)
                                           ei_local->txing);
                } else {        /* We should never get here. */
                        if (ei_debug)
-                               printk("%s: No packet buffer space for ping-pong use.\n",
-                                          dev->name);
+                               printk("%s: No Tx buffers free. irq=%d tx1=%d tx2=%d last=%d\n",
+                                       dev->name, dev->interrupt, ei_local->tx1, 
+                                       ei_local->tx2, ei_local->lasttx);
                        ei_local->irqlock = 0;
                        dev->tbusy = 1;
-                       outb_p(ENISR_ALL,  e8390_base + EN0_IMR);
+                       outb_p(ENISR_ALL, e8390_base + EN0_IMR);
                        return 1;
                }
                ei_block_output(dev, length, skb->data, output_page);
                if (! ei_local->txing) {
+                       ei_local->txing = 1;
                        NS8390_trigger_send(dev, send_length, output_page);
                        dev->trans_start = jiffies;
                        if (output_page == ei_local->tx_start_page)
                                ei_local->tx1 = -1, ei_local->lasttx = -1;
                        else
                                ei_local->tx2 = -1, ei_local->lasttx = -2;
-                       ei_local->txing = 1;
                } else
                        ei_local->txqueue++;
 
                dev->tbusy = (ei_local->tx1  &&  ei_local->tx2);
     } else {  /* No pingpong, just a single Tx buffer. */
                ei_block_output(dev, length, skb->data, ei_local->tx_start_page);
+               ei_local->txing = 1;
                NS8390_trigger_send(dev, send_length, ei_local->tx_start_page);
                dev->trans_start = jiffies;
                dev->tbusy = 1;
@@ -242,7 +258,7 @@ void ei_interrupt(int irq, struct pt_regs * regs)
 {
     struct device *dev = (struct device *)(irq2dev_map[irq]);
     int e8390_base;
-    int interrupts, boguscount = 0;
+    int interrupts, nr_serviced = 0;
     struct ei_device *ei_local;
     
     if (dev == NULL) {
@@ -253,7 +269,6 @@ void ei_interrupt(int irq, struct pt_regs * regs)
     ei_local = (struct ei_device *) dev->priv;
     if (dev->interrupt || ei_local->irqlock) {
                /* The "irqlock" check is only for testing. */
-               sti();
                printk(ei_local->irqlock
                           ? "%s: Interrupted while interrupts are masked! isr=%#2x imr=%#2x.\n"
                           : "%s: Reentering the interrupt handler! isr=%#2x imr=%#2x.\n",
@@ -263,7 +278,6 @@ void ei_interrupt(int irq, struct pt_regs * regs)
     }
     
     dev->interrupt = 1;
-    sti(); /* Allow other interrupts. */
     
     /* Change to page 0 and read the intr status reg. */
     outb_p(E8390_NODMA+E8390_PAGE0, e8390_base + E8390_CMD);
@@ -273,16 +287,12 @@ void ei_interrupt(int irq, struct pt_regs * regs)
     
     /* !!Assumption!! -- we stay in page 0.     Don't break this. */
     while ((interrupts = inb_p(e8390_base + EN0_ISR)) != 0
-                  && ++boguscount < 9) {
+                  && ++nr_serviced < MAX_SERVICE) {
                if (dev->start == 0) {
                        printk("%s: interrupt from stopped card\n", dev->name);
                        interrupts = 0;
                        break;
                }
-               if (interrupts & ENISR_RDC) {
-                       /* Ack meaningless DMA complete. */
-                       outb_p(ENISR_RDC, e8390_base + EN0_ISR);
-               }
                if (interrupts & ENISR_OVER) {
                        ei_rx_overrun(dev);
                } else if (interrupts & (ENISR_RX+ENISR_RX_ERR)) {
@@ -303,17 +313,25 @@ void ei_interrupt(int irq, struct pt_regs * regs)
                if (interrupts & ENISR_TX_ERR) {
                        outb_p(ENISR_TX_ERR, e8390_base + EN0_ISR); /* Ack intr. */
                }
+
+               if (interrupts & ENISR_RDC) {
+                       if (dev->mem_start)
+                               outb_p(ENISR_RDC, e8390_base + EN0_ISR);
+               }
+
                outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, e8390_base + E8390_CMD);
     }
     
-    if (interrupts && ei_debug) {
-               if (boguscount == 9)
+    if ((interrupts & ~ENISR_RDC) && ei_debug) {
+               outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, e8390_base + E8390_CMD);
+               if (nr_serviced == MAX_SERVICE) {
                        printk("%s: Too much work at interrupt, status %#2.2x\n",
                                   dev->name, interrupts);
-               else
+                       outb_p(ENISR_ALL, e8390_base + EN0_ISR); /* Ack. most intrs. */
+               } else {
                        printk("%s: unknown interrupt %#2x\n", dev->name, interrupts);
-               outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, e8390_base + E8390_CMD);
-               outb_p(0xff, e8390_base + EN0_ISR); /* Ack. all intrs. */
+                       outb_p(0xff, e8390_base + EN0_ISR); /* Ack. all intrs. */
+               }
     }
     dev->interrupt = 0;
     return;
@@ -338,9 +356,9 @@ static void ei_tx_intr(struct device *dev)
                        ei_local->tx1 = 0;
                        dev->tbusy = 0;
                        if (ei_local->tx2 > 0) {
+                               ei_local->txing = 1;
                                NS8390_trigger_send(dev, ei_local->tx2, ei_local->tx_start_page + 6);
                                dev->trans_start = jiffies;
-                               ei_local->txing = 1;
                                ei_local->tx2 = -1,
                                ei_local->lasttx = 2;
                        } else
@@ -352,9 +370,9 @@ static void ei_tx_intr(struct device *dev)
                        ei_local->tx2 = 0;
                        dev->tbusy = 0;
                        if (ei_local->tx1 > 0) {
+                               ei_local->txing = 1;
                                NS8390_trigger_send(dev, ei_local->tx1, ei_local->tx_start_page);
                                dev->trans_start = jiffies;
-                               ei_local->txing = 1;
                                ei_local->tx1 = -1;
                                ei_local->lasttx = 1;
                        } else
@@ -402,7 +420,7 @@ static void ei_receive(struct device *dev)
                rxing_page = inb_p(e8390_base + EN1_CURPAG);
                outb_p(E8390_NODMA+E8390_PAGE0, e8390_base + E8390_CMD);
                
-               /* Remove one frame from the ring.  Boundary is alway a page behind. */
+               /* Remove one frame from the ring.  Boundary is always a page behind. */
                this_frame = inb_p(e8390_base + EN0_BOUNDARY) + 1;
                if (this_frame >= ei_local->stop_page)
                        this_frame = ei_local->rx_start_page;
@@ -475,12 +493,12 @@ static void ei_receive(struct device *dev)
                
                /* This _should_ never happen: it's here for avoiding bad clones. */
                if (next_frame >= ei_local->stop_page) {
-                       printk("%s: next frame inconsistency, %#2x..", dev->name,
+                       printk("%s: next frame inconsistency, %#2x\n", dev->name,
                                   next_frame);
                        next_frame = ei_local->rx_start_page;
                }
                ei_local->current_page = next_frame;
-               outb(next_frame-1, e8390_base+EN0_BOUNDARY);
+               outb_p(next_frame-1, e8390_base+EN0_BOUNDARY);
     }
     /* If any worth-while packets have been received, dev_rint()
        has done a mark_bh(NET_BH) for us and will work on them
@@ -539,6 +557,9 @@ static struct enet_statistics *get_stats(struct device *dev)
     short ioaddr = dev->base_addr;
     struct ei_device *ei_local = (struct ei_device *) dev->priv;
     
+    /* If the card is stopped, just return the present stats. */
+    if (dev->start == 0) return &ei_local->stat;
+
     /* Read the counter registers, assuming we are in page 0. */
     ei_local->stat.rx_frame_errors += inb_p(ioaddr + EN0_COUNTER0);
     ei_local->stat.rx_crc_errors   += inb_p(ioaddr + EN0_COUNTER1);
@@ -610,6 +631,7 @@ void NS8390_init(struct device *dev, int startp)
     struct ei_device *ei_local = (struct ei_device *) dev->priv;
     int i;
     int endcfg = ei_local->word16 ? (0x48 | ENDCFG_WTS) : 0x48;
+    unsigned long flags;
     
     /* Follow National Semi's recommendations for initing the DP83902. */
     outb_p(E8390_NODMA+E8390_PAGE0+E8390_STOP, e8390_base); /* 0x21 */
@@ -633,6 +655,7 @@ void NS8390_init(struct device *dev, int startp)
     
     /* Copy the station address into the DS8390 registers,
        and set the multicast hash bitmap to receive all multicasts. */
+    save_flags(flags);
     cli();
     outb_p(E8390_NODMA + E8390_PAGE1 + E8390_STOP, e8390_base); /* 0x61 */
     for(i = 0; i < 6; i++) {
@@ -645,7 +668,7 @@ void NS8390_init(struct device *dev, int startp)
     
     outb_p(ei_local->rx_start_page,     e8390_base + EN1_CURPAG);
     outb_p(E8390_NODMA+E8390_PAGE0+E8390_STOP, e8390_base);
-    sti();
+    restore_flags(flags);
     dev->tbusy = 0;
     dev->interrupt = 0;
     ei_local->tx1 = ei_local->tx2 = 0;
@@ -667,7 +690,6 @@ static void NS8390_trigger_send(struct device *dev, unsigned int length,
 {
     int e8390_base = dev->base_addr;
     
-    ei_status.txing = 1;
     outb_p(E8390_NODMA+E8390_PAGE0, e8390_base);
     
     if (inb_p(e8390_base) & E8390_TRANS) {
index 72e63249264e7d0394973b1bc27f76012e6cf3ed..13b7b86a901195f15a85ec9576156be168a34522 100644 (file)
@@ -44,14 +44,13 @@ struct ei_device {
   unsigned open:1;
   unsigned word16:1;  /* We have the 16-bit (vs 8-bit) version of the card. */
   unsigned txing:1;            /* Transmit Active */
-  unsigned dmaing:2;           /* Remote DMA Active */
   unsigned irqlock:1;          /* 8390's intrs disabled when '1'. */
   unsigned pingpong:1;         /* Using the ping-pong driver */
   unsigned char tx_start_page, rx_start_page, stop_page;
   unsigned char current_page;  /* Read pointer in buffer  */
   unsigned char interface_num; /* Net port (AUI, 10bT.) to use. */
   unsigned char txqueue;       /* Tx Packet buffer queue length. */
-  unsigned char in_interrupt;
+  unsigned char dmaing;                /* Remote DMA (Tx/Rx/Active) */
   short tx1, tx2;              /* Packet lengths for ping-pong tx. */
   short lasttx;                        /* Alpha version consistency check. */
   unsigned char reg0;          /* Register '0' in a WD8013 */
@@ -61,6 +60,12 @@ struct ei_device {
   struct enet_statistics stat;
 };
 
+/* The maximum number of 8390 interrupt serivce routines called per IRQ. */
+#define MAX_SERVICE 12
+
+/* The maximum number of jiffies waited before assuming a Tx failed. */
+#define TX_TIMEOUT 20 
+
 #define ei_status (*(struct ei_device *)(dev->priv))
 
 /* Some generic ethernet register configurations. */
index 2637c424515d1e2ed6abbdfb8ba7a9e249ada50c..5a91f745f39f75ff18aef3b034a51666223d352e 100644 (file)
@@ -11,8 +11,8 @@ include CONFIG
 MODULES :=
 
 NETDRV_OBJS := Space.o auto_irq.o net_init.o loopback.o
-CFLAGS := $(CFLAGS) -I../../net/inet
-CPP := $(CPP) -I../../net/inet
+override CFLAGS := $(CFLAGS) -I../../net/inet
+override CPP := $(CPP) -I../../net/inet
 
 .c.o:
        $(CC) $(CFLAGS) -c $<
index fe50f8a70a8a903f09baeb619083b80bcd167f3f..7d224efc9285a1a85b76194babcb2342d0090157 100644 (file)
@@ -1,4 +1,3 @@
-#define rw_bugfix
 /* ne.c: A general non-shared-memory NS8390 ethernet driver for linux. */
 /*
     Written 1992-94 by Donald Becker.
         Code 930.5, Goddard Space Flight Center, Greenbelt MD 20771
 
     This driver should work with many programmed-I/O 8390-based ethernet
-    boards.  Currently it support the NE1000, NE2000, many clones,
+    boards.  Currently it supports the NE1000, NE2000, many clones,
     and some Cabletron products.
+
+    13/04/95 -- Change in philosophy. We now monitor ENISR_RDC for
+    handshaking the Tx PIO xfers. If we don't get a RDC within a
+    reasonable period of time, we know the 8390 has gone south, and we
+    kick the board before it locks the system. Also use set_bit() to
+    create atomic locks on the PIO xfers, and added some defines
+    that the end user can play with to save memory.    -- Paul Gortmaker
+
 */
 
 /* Routines for the NatSemi-based designs (NE[12]000). */
@@ -31,6 +38,20 @@ static char *version =
 
 #include <linux/netdevice.h>
 #include "8390.h"
+
+/* Some defines that people can play with if so inclined. */
+
+/* Do we support clones that don't adhere to 14,15 of the SAprom ? */
+#define CONFIG_NE_BAD_CLONES
+
+/* Do we perform extra sanity checks on stuff ? */
+/* #define CONFIG_NE_SANITY */
+
+/* Do we implement the read before write bugfix ? */
+/* #define CONFIG_NE_RW_BUGFIX */
+
+/* ---- No user-servicable parts below ---- */
+
 extern struct device *init_etherdev(struct device *dev, int sizeof_private,
                                    unsigned long *mem_startp);
 
@@ -39,6 +60,7 @@ extern struct device *init_etherdev(struct device *dev, int sizeof_private,
 static unsigned int netcard_portlist[] =
 { 0x300, 0x280, 0x320, 0x340, 0x360, 0};
 
+#ifdef CONFIG_NE_BAD_CLONES
 /* A list of bad clones that we none-the-less recognize. */
 static struct { char *name8, *name16; unsigned char SAprefix[4];}
 bad_clone_list[] = {
@@ -46,8 +68,12 @@ bad_clone_list[] = {
     {"DE120", "DE220", {0x00, 0x80, 0xc8,}},
     {"DFI1000", "DFI2000", {'D', 'F', 'I',}}, /* Original, eh?  */
     {"EtherNext UTP8", "EtherNext UTP16", {0x00, 0x00, 0x79}},
+    {"NE1000","NE2000-invalid", {0x00, 0x00, 0xd8}}, /* Ancient real NE1000. */
+    {"NN1000", "NN2000",  {0x08, 0x03, 0x08}}, /* Outlaw no-name clone. */
+    {"4-DIM8","4-DIM16", {0x00,0x00,0x4d,}},  /* Outlaw 4-Dimension cards. */
     {0,}
 };
+#endif
 
 #define NE_BASE         (dev->base_addr)
 #define NE_CMD         0x00
@@ -60,6 +86,8 @@ bad_clone_list[] = {
 #define NESM_START_PG  0x40    /* First page of TX buffer */
 #define NESM_STOP_PG   0x80    /* Last page +1 of RX ring */
 
+#define NE_RDC_TIMEOUT 0x03    /* Max wait in jiffies for Tx RDC */
+
 int ne_probe(struct device *dev);
 static int ne_probe1(struct device *dev, int ioaddr);
 
@@ -126,9 +154,9 @@ static int ne_probe1(struct device *dev, int ioaddr)
     char *name = NULL;
     int start_page, stop_page;
     int neX000, ctron;
-    int reg0 = inb(ioaddr);
+    int reg0 = inb_p(ioaddr);
 
-    if ( reg0 == 0xFF)
+    if (reg0 == 0xFF)
        return ENODEV;
 
     /* Do a preliminary verification that we have a 8390. */
@@ -140,7 +168,7 @@ static int ne_probe1(struct device *dev, int ioaddr)
        inb_p(ioaddr + EN0_COUNTER0); /* Clear the counter by reading. */
        if (inb_p(ioaddr + EN0_COUNTER0) != 0) {
            outb_p(reg0, ioaddr);
-           outb(regd, ioaddr + 0x0d);  /* Restore the old values. */
+           outb_p(regd, ioaddr + 0x0d);        /* Restore the old values. */
            return ENODEV;
        }
     }
@@ -169,6 +197,7 @@ static int ne_probe1(struct device *dev, int ioaddr)
        };
        for (i = 0; i < sizeof(program_seq)/sizeof(program_seq[0]); i++)
            outb_p(program_seq[i].value, ioaddr + program_seq[i].offset);
+
     }
     for(i = 0; i < 32 /*sizeof(SA_prom)*/; i+=2) {
        SA_prom[i] = inb(ioaddr + NE_DATAPORT);
@@ -208,6 +237,7 @@ static int ne_probe1(struct device *dev, int ioaddr)
        start_page = 0x01;
        stop_page = (wordlength == 2) ? 0x40 : 0x20;
     } else {
+#ifdef CONFIG_NE_BAD_CLONES
        /* Ack!  Well, there might be a *bad* NE*000 clone there.
           Check for total bogus addresses. */
        for (i = 0; bad_clone_list[i].name8; i++) {
@@ -227,6 +257,11 @@ static int ne_probe1(struct device *dev, int ioaddr)
                   SA_prom[14], SA_prom[15]);
            return ENXIO;
        }
+#else
+       printk(" not found.\n");
+       return ENXIO;
+#endif
+
     }
 
 
@@ -242,7 +277,7 @@ static int ne_probe1(struct device *dev, int ioaddr)
        outb_p(0x00, ioaddr + EN0_IMR);                 /* Mask it again. */
        dev->irq = autoirq_report(0);
        if (ei_debug > 2)
-           printk(" autoirq is %d", dev->irq);
+           printk(" autoirq is %d\n", dev->irq);
     } else if (dev->irq == 2)
        /* Fixup for users that don't know that IRQ 2 is really IRQ 9,
           or don't know which one to set. */
@@ -251,7 +286,7 @@ static int ne_probe1(struct device *dev, int ioaddr)
     /* Snarf the interrupt now.  There's no point in waiting since we cannot
        share and the board will usually be enabled. */
     {
-       int irqval = request_irq (dev->irq, ei_interrupt, 0, "ne");
+       int irqval = request_irq (dev->irq, ei_interrupt, 0, wordlength==2 ? "ne2000":"ne1000");
        if (irqval) {
            printk (" unable to get IRQ %d (irqval=%d).\n", dev->irq, irqval);
            return EAGAIN;
@@ -260,7 +295,7 @@ static int ne_probe1(struct device *dev, int ioaddr)
 
     dev->base_addr = ioaddr;
 
-    request_region(ioaddr, NE_IO_EXTENT,"ne2000");
+    request_region(ioaddr, NE_IO_EXTENT, wordlength==2 ? "ne2000":"ne1000");
 
     for(i = 0; i < ETHER_ADDR_LEN; i++)
        dev->dev_addr[i] = SA_prom[i];
@@ -318,10 +353,13 @@ ne_reset_8390(struct device *dev)
 static int
 ne_block_input(struct device *dev, int count, char *buf, int ring_offset)
 {
+#ifdef CONFIG_NE_SANITY
     int xfer_count = count;
+#endif
     int nic_base = dev->base_addr;
 
-    if (ei_status.dmaing) {
+    /* This *shouldn't* happen. If it does, it's the last thing you'll see */
+    if (set_bit(0,(void*)&ei_status.dmaing)) {
        if (ei_debug > 0)
            printk("%s: DMAing conflict in ne_block_input "
                   "[DMAstat:%d][irqlock:%d][intr:%d].\n",
@@ -329,7 +367,7 @@ ne_block_input(struct device *dev, int count, char *buf, int ring_offset)
                   dev->interrupt);
        return 0;
     }
-    ei_status.dmaing |= 0x01;
+    ei_status.dmaing |= 0x02;
     outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, nic_base+ NE_CMD);
     outb_p(count & 0xff, nic_base + EN0_RCNTLO);
     outb_p(count >> 8, nic_base + EN0_RCNTHI);
@@ -338,14 +376,18 @@ ne_block_input(struct device *dev, int count, char *buf, int ring_offset)
     outb_p(E8390_RREAD+E8390_START, nic_base + NE_CMD);
     if (ei_status.word16) {
       insw(NE_BASE + NE_DATAPORT,buf,count>>1);
-      if (count & 0x01)
-       buf[count-1] = inb(NE_BASE + NE_DATAPORT), xfer_count++;
+      if (count & 0x01) {
+       buf[count-1] = inb(NE_BASE + NE_DATAPORT);
+#ifdef CONFIG_NE_SANITY
+       xfer_count++;
+#endif
+      }
     } else {
        insb(NE_BASE + NE_DATAPORT, buf, count);
     }
 
     /* This was for the ALPHA version only, but enough people have
-       encountering problems that it is still here.  If you see
+       been encountering problems so it is still here.  If you see
        this message you either 1) have a slightly incompatible clone
        or 2) have noise/speed problems with your bus. */
 #ifdef CONFIG_NE_SANITY
@@ -353,7 +395,7 @@ ne_block_input(struct device *dev, int count, char *buf, int ring_offset)
        int addr, tries = 20;
        do {
            /* DON'T check for 'inb_p(EN0_ISR) & ENISR_RDC' here
-              -- it's broken! Check the "DMA" address instead. */
+              -- it's broken for Rx on some cards! */
            int high = inb_p(nic_base + EN0_RSARHI);
            int low = inb_p(nic_base + EN0_RSARLO);
            addr = (high << 8) + low;
@@ -366,7 +408,8 @@ ne_block_input(struct device *dev, int count, char *buf, int ring_offset)
                   dev->name, ring_offset + xfer_count, addr);
     }
 #endif
-    ei_status.dmaing &= ~0x01;
+    outb_p(ENISR_RDC, nic_base + EN0_ISR);     /* Ack intr. */
+    ei_status.dmaing &= ~0x03;
     return ring_offset + count;
 }
 
@@ -374,15 +417,20 @@ static void
 ne_block_output(struct device *dev, int count,
                const unsigned char *buf, const int start_page)
 {
+#ifdef CONFIG_NE_SANITY
     int retries = 0;
+#endif
     int nic_base = NE_BASE;
+    unsigned long dma_start;
 
     /* Round the count up for word writes.  Do we need to do this?
        What effect will an odd byte count have on the 8390?
        I should check someday. */
     if (ei_status.word16 && (count & 0x01))
       count++;
-    if (ei_status.dmaing) {
+
+    /* This *shouldn't* happen. If it does, it's the last thing you'll see */
+    if (set_bit(0,(void*)&ei_status.dmaing)) {
        if (ei_debug > 0)
            printk("%s: DMAing conflict in ne_block_output."
                   "[DMAstat:%d][irqlock:%d][intr:%d]\n",
@@ -390,12 +438,15 @@ ne_block_output(struct device *dev, int count,
                   dev->interrupt);
        return;
     }
-    ei_status.dmaing |= 0x02;
+    ei_status.dmaing |= 0x04;
     /* We should already be in page 0, but to be safe... */
     outb_p(E8390_PAGE0+E8390_START+E8390_NODMA, nic_base + NE_CMD);
 
+#ifdef CONFIG_NE_SANITY
  retry:
-#if defined(rw_bugfix)
+#endif
+
+#ifdef CONFIG_NE_RW_BUGFIX 
     /* Handle the read-before-write bug the same way as the
        Crynwr packet driver -- the NatSemi method doesn't work.
        Actually this doesn't always work either, but if you have
@@ -411,6 +462,9 @@ ne_block_output(struct device *dev, int count,
     SLOW_DOWN_IO;
 #endif  /* rw_bugfix */
 
+    dma_start = jiffies;
+    outb_p(ENISR_RDC, nic_base + EN0_ISR);
+
    /* Now the normal output. */
     outb_p(count & 0xff, nic_base + EN0_RCNTLO);
     outb_p(count >> 8,   nic_base + EN0_RCNTHI);
@@ -426,12 +480,10 @@ ne_block_output(struct device *dev, int count,
 
 #ifdef CONFIG_NE_SANITY
     /* This was for the ALPHA version only, but enough people have
-       encountering problems that it is still here. */
+       been encountering problems so it is still here. */
     if (ei_debug > 1) {                /* DMA termination address check... */
        int addr, tries = 20;
        do {
-           /* DON'T check for 'inb_p(EN0_ISR) & ENISR_RDC' here
-              -- it's broken! Check the "DMA" address instead. */
            int high = inb_p(nic_base + EN0_RSARHI);
            int low = inb_p(nic_base + EN0_RSARLO);
            addr = (high << 8) + low;
@@ -447,7 +499,17 @@ ne_block_output(struct device *dev, int count,
        }
     }
 #endif
-    ei_status.dmaing &= ~0x02;
+
+    while ((inb_p(nic_base + EN0_ISR) & ENISR_RDC) == 0)
+       if (jiffies - dma_start > NE_RDC_TIMEOUT) {
+               printk("%s: timeout waiting for Tx RDC.\n", dev->name);
+               ne_reset_8390(dev);
+               NS8390_init(dev,1);
+               break;
+       }
+
+    outb_p(ENISR_RDC, nic_base + EN0_ISR);     /* Ack intr. */
+    ei_status.dmaing &= ~0x05;
     return;
 }
 
index 783d7a515afbad83641caf08fcaadc7c1772a000..d59a68ab8bbaeca258305fe8cabee665f8049756 100644 (file)
@@ -368,6 +368,7 @@ wd_close_card(struct device *dev)
        if (ei_debug > 1)
                printk("%s: Shutting down ethercard.\n", dev->name);
        NS8390_init(dev, 0);
+       dev->start = 0;
 
        /* Change from 16-bit to 8-bit shared memory so reboot works. */
        outb(ei_status.reg5, wd_cmdreg + WD_CMDREG5 );
index a03e1019d84f286dc265b6de48fb323e700722f9..100af346e891e3450a1ff8caa47ffc642384eeec 100644 (file)
@@ -740,7 +740,7 @@ static int normal_init (Scsi_Host_Template *tpnt, int board, int chip,
        So, we stick it past the end of our hostdata structure.
 
        ASSUMPTION : 
-                Irregardless of how many simultaenous SCSI commands we allow,
+                Regardless of how many simultaneous 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
@@ -2304,8 +2304,8 @@ NCR53c8x0_soft_reset (struct Scsi_Host *host) {
 /*
  * Function static struct NCR53c7x0_cmd *create_cmd (Scsi_Cmnd *cmd) 
  *
- * Purpose : If we have not allready allocated enough NCR53c7x0_cmd
- *     structures to satisfy any allowable number of simultaenous 
+ * Purpose : If we have not already allocated enough NCR53c7x0_cmd
+ *     structures to satisfy any allowable number of simultaneous 
  *     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, 
@@ -2339,9 +2339,9 @@ create_cmd (Scsi_Cmnd *cmd) {
     unsigned long flags;
     NCR53c7x0_local_setup(cmd->host);
 
-/* FIXME : when we start doing multiple simultaenous commands per LUN, 
+/* FIXME : when we start doing multiple simultaneous commands per LUN, 
    we will need to either
-       - Do an attach_slave() and detach_slave() the right way (alocate
+       - Do an attach_slave() and detach_slave() the right way (allocate
          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
@@ -2355,7 +2355,7 @@ create_cmd (Scsi_Cmnd *cmd) {
        !(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
+    /* scsi_malloc must allocate with a 512 byte granularity, but always
        returns buffers which are aligned on a 512 boundary */
            size = (hostdata->max_cmd_size + 511) / 512 * 512;
            tmp = (struct NCR53c7x0_cmd *) scsi_malloc (size);
@@ -3815,7 +3815,7 @@ NCR53c7xx_reset (Scsi_Cmnd *cmd) {
     save_flags(flags);
     halt (host);
     NCR53c7x0_write8(SCNTL1_REG, SCNTL1_RST);
-    udelay(25);        /* Minimum ammount of time to assert RST */
+    udelay(25);        /* Minimum amount 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)  {
@@ -3899,7 +3899,7 @@ shutdown (struct Scsi_Host *host) {
  *     reset.  
  */
     NCR53c7x0_write8(SCNTL1_REG, SCNTL1_RST);
-    udelay(25);        /* Minimum ammount of time to assert RST */
+    udelay(25);        /* Minimum amount of time to assert RST */
     NCR53c7x0_write8(SCNTL1_REG, SCNTL1_RST);
     restore_flags (flags);
     return 0;
index a216b02c5b1ab17233d6e89e9d813b82024127ef..6a36159140cbea5229c52a1bda57042d549fcf93 100644 (file)
@@ -59,7 +59,7 @@ extern int NCR53c7xx_release(struct Scsi_Host *);
 #endif
 
 #define NCR53c7xx {NULL, NULL, "NCR53c{7,8}xx (rel 4)", NCR53c7xx_detect,      \
-       NULL, /* info */ NULL, /* command, depricated */ NULL,          \
+       NULL, /* info */ NULL, /* command, deprecated */ 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 ,         \
index 7a381fef0ed9e02f5cf5de3a69b6db4a76b02182..7c81c77609a8b81abb4fb3af47a86efa1d22b69a 100644 (file)
@@ -89,7 +89,7 @@ Mon Feb 20 08:57:17 1995  Eric Youngdale  (eric@andante)
        * 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,
+         new memory allocation, extraneous diagnostic output suppressed,
          splx() replaced with save/restore flags. [ Drew ]
 
        * hosts.c, hosts.h, scsi_ioctl.c, sd.c, sd_ioctl.c, sg.c, sr.c,
@@ -111,7 +111,7 @@ Mon Feb 20 08:57:17 1995  Eric Youngdale  (eric@andante)
        * 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.
+       * st.c: Disable retries for write operations.
 
 Wed Feb 15 10:52:56 1995  Eric Youngdale  (eric@andante)
 
@@ -181,7 +181,7 @@ Wed Feb  1 09:20:45 1995  Eric Youngdale  (eric@andante)
 
        * Linux 1.1.89 released.
 
-       * Makefile, u14-34f.c: Modulariz.e
+       * Makefile, u14-34f.c: Modularize.
 
        * Makefile, eata.c: Modularize.  Now version 1.14
 
@@ -202,7 +202,7 @@ Wed Feb  1 09:20:45 1995  Eric Youngdale  (eric@andante)
 
        * scsi.h: Define QUEUE_FULL condition.
 
-       * sd.c: Do not check for non-existant partition until after
+       * sd.c: Do not check for non-existent partition until after
        new media check.
 
        * sg.c: Undo previous change which was wrong.
@@ -281,7 +281,7 @@ Wed Jan 18 23:33:09 1995  Eric Youngdale  (eric@andante)
 
        * scsi.c: Make RECOVERED_ERROR a SUGGEST_IS_OK.
 
-       * sd.c: Fail if we are opening a non-existant partition.
+       * sd.c: Fail if we are opening a non-existent partition.
 
        * sr.c: Bump SR_TIMEOUT to 15000.
        Do not probe for media size at boot time(hard on changers).
index 161a2ba39e69e0558f33b9ed910fb2f5e5cd3bd6..239e46e1b9e81b612541c49335350cc00d534833 100644 (file)
@@ -1849,7 +1849,7 @@ asmlinkage int sys_bdflush(int func, long data)
                /* If there are still a lot of dirty buffers around, skip the sleep
                   and flush some more */
                
-               if(nr_buffers_type[BUF_DIRTY] < (nr_buffers - nr_buffers_type[BUF_SHARED]) * 
+               if(nr_buffers_type[BUF_DIRTY] <= (nr_buffers - nr_buffers_type[BUF_SHARED]) * 
                   bdf_prm.b_un.nfract/100) {
                        if (current->signal & (1 << (SIGKILL-1))) {
                                bdflush_running--;
index c54bb983c653af5039fdf3aeccf9f81253a1c47f..02902df90ad4a3ea8628bd024d88637ff11a427d 100644 (file)
@@ -6,8 +6,13 @@
 #undef htonl
 #undef htons
 
+#ifndef LITTLE_ENDIAN
 #define LITTLE_ENDIAN
+#endif
+
+#ifndef LITTLE_ENDIAN_BITFIELD
 #define LITTLE_ENDIAN_BITFIELD
+#endif
 
 extern unsigned long int       ntohl(unsigned long int);
 extern unsigned short int      ntohs(unsigned short int);
index 600ce124d3f5d2d8da17cdbcae4abe7b025e5aa2..03eb42f8ebfbdd9472ccfacd11ce83ef326bc713 100644 (file)
@@ -6,8 +6,13 @@
 #undef htonl
 #undef htons
 
+#ifndef LITTLE_ENDIAN
 #define LITTLE_ENDIAN 1234
+#endif
+
+#ifndef LITTLE_ENDIAN_BITFIELD
 #define LITTLE_ENDIAN_BITFIELD
+#endif
 
 extern unsigned long int       ntohl(unsigned long int);
 extern unsigned short int      ntohs(unsigned short int);