]> git.neil.brown.name Git - history.git/commitdiff
Import 1.2.9 1.2.9
authorLinus Torvalds <torvalds@linuxfoundation.org>
Fri, 23 Nov 2007 20:09:59 +0000 (15:09 -0500)
committerLinus Torvalds <torvalds@linuxfoundation.org>
Fri, 23 Nov 2007 20:09:59 +0000 (15:09 -0500)
35 files changed:
Makefile
arch/i386/kernel/process.c
arch/i386/kernel/ptrace.c
drivers/block/README.ide
drivers/block/genhd.c
drivers/block/ide-cd.c
drivers/block/ide.c
drivers/char/cyclades.c
drivers/net/loopback.c
drivers/scsi/ChangeLog
drivers/scsi/buslogic.c
drivers/scsi/st.c
drivers/sound/.blurb
fs/buffer.c
fs/open.c
fs/proc/array.c
fs/proc/mem.c
include/asm-i386/processor.h
include/linux/hdreg.h
include/linux/interrupt.h
include/linux/pci.h
ipc/shm.c
kernel/module.c
kernel/resource.c
mm/filemap.c
mm/memory.c
mm/mprotect.c
mm/swap.c
mm/vmalloc.c
net/inet/af_inet.c
net/inet/dev.c
net/inet/ip.c
net/inet/tcp.c
net/unix/sock.c
versions.mk

index 79fe061b881128bba89d6c40ebc740028ec2b999..19379b8895794d890514e0942191ad2216b5374c 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
 VERSION = 1
 PATCHLEVEL = 2
-SUBLEVEL = 8
+SUBLEVEL = 9
 
 ARCH = i386
 
index 5d532420b876f31114283a05bf9906dd84560dfe..77254751b7ace5e5fb5d50e80bc6f4c46d2bf162 100644 (file)
@@ -45,13 +45,15 @@ void enable_hlt(void)
 asmlinkage int sys_idle(void)
 {
        int i;
+       pmd_t * pmd;
 
        if (current->pid != 0)
                return -EPERM;
 
        /* Map out the low memory: it's no longer needed */
+       pmd = pmd_offset(swapper_pg_dir, 0);
        for (i = 0 ; i < 768 ; i++)
-               pgd_clear(swapper_pg_dir + i);
+               pmd_clear(pmd++);
 
        /* endless idle loop with no priority at all */
        current->counter = -100;
index 479a19282dca636560cfdea467ece8144c3e1e15..f32035edcd091093c42ed7ee00923674c356fa72 100644 (file)
@@ -1,4 +1,3 @@
-#define THREE_LEVEL
 /* ptrace.c */
 /* By Ross Biro 1/23/92 */
 /* edited by Linus Torvalds */
index f6255b8af2d4ef5b03db99cd00a0e67fc61b3099..b6dd867ee76ae79033ad0c136e514aca0728104e 100644 (file)
@@ -21,17 +21,35 @@ Major features of ide.c & ide-cd.c:
        - support for interrupt unmasking during I/O (better than hd.c)
        - improved handshaking and error detection/recovery
        - can co-exist with hd.c to control only the secondary interface
+NEW!   - support for reliable operation of buggy CMD-640 interfaces
+               - use kernel command line option:   hda=serialize
+NEW!   - experimental support for DTC-2278D interfaces
+               - use kernel command line option:  hda=dtc2278
+NEW!   - run-time selectible 32bit interface support (using hdparm-2.3)
 
 Under construction:
 
+       - improved CMD support:  tech info is supposedly "in the mail"
        - support for interface speed selection on jumperless interfaces
        - improved detection of non-standard IDE ATAPI cdrom drives
        - support for non-standard 3rd/4th drive interface on Promise cards
 
+***
+
+IMPORTANT NOTICE:  "CMD" EIDE Interfaces will not (by default) work *reliably*
+when drives are attached to the second interface.  To "fix" this, supply the
+special kernel "command line" parameter to LILO:    hda=serialize
+Failure to do so can cause severe data corruption!
+
+***
+
 To access devices on the second interface, device entries must first be
 created in /dev for them.  To create such entries, simply run the included
 shell script:   MAKEDEV.ide1
 
+Apparently the early releases of Slackware 2.2 have incorrect entries
+in /dev for hdc* and hdd* -- this can also be corrected by running MAKEDEV.ide1
+
 ide.c automatically probes for the primary and secondary interfaces,
 for the drives/geometries attached to those interfaces, and for the
 IRQ numbers being used by the interfaces (normally IRQ14 & IRQ15).
index f373c6c4a695622e07de413fea1d5d69049c059a..1108288fe57c8947a1fbc237632829d7302ef9d3 100644 (file)
@@ -90,6 +90,7 @@ static void extended_partition(struct gendisk *hd, int dev)
                            !(hd->part[current_minor].nr_sects = p->nr_sects))
                                goto done;  /* no more logicals in this partition */
                        hd->part[current_minor].start_sect = first_sector + p->start_sect;
+                       hd->sizes[current_minor] = p->nr_sects >> (BLOCK_SIZE_BITS - 9);
                        this_sector = first_sector + p->start_sect;
                        dev = ((hd->major) << 8) | current_minor;
                        brelse(bh);
index 15c646d6acbdf349a69e5005816fac093d834239..987fe429f6a65b6bc401a924891a272094e9768b 100644 (file)
@@ -24,7 +24,7 @@
  *                       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.
- *                       
+ * 2.04b May 30, 1995 -- Fix to match changes in ide.c version 3.16 -ml
  *
  * ATAPI cd-rom driver.  To be used with ide.c.
  *
 
 #define MIN(a,b) ((a) < (b) ? (a) : (b))
 
+#if 1  /* "old" method */
 #define OUT_WORDS(b,n)  outsw (IDE_PORT (HD_DATA, dev->hwif), (b), (n))
 #define IN_WORDS(b,n)   insw  (IDE_PORT (HD_DATA, dev->hwif), (b), (n))
+#else  /* "new" method -- should really fix each instance instead of this */
+#define OUT_WORDS(b,n) output_ide_data(dev,b,(n)/2)
+#define IN_WORDS(b,n)  input_ide_data(dev,b,(n)/2)
+#endif
 
 /* special command codes for strategy routine. */
 #define PACKET_COMMAND 4315
@@ -196,7 +201,7 @@ static int cdrom_decode_status (ide_dev_t *dev, int good_stat, int *stat_ret)
   stat = GET_STAT (dev->hwif);
   *stat_ret = stat;
 
-  if (OK_STAT (stat, good_stat, BAD_RW_STAT))
+  if (OK_STAT (stat, good_stat, BAD_R_STAT))
     return 0;
 
   /* Got an error. */
index 5638e1a73b922a17619fa5df07a38be89cbc9713..a72ea3b0a15520cf0d634ac5053877603c0b7c20 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/drivers/block/ide.c  Version 3.14  March 7, 1995
+ *  linux/drivers/block/ide.c  Version 3.16  May 30, 1995
  *
  *  Copyright (C) 1994, 1995  Linus Torvalds & authors (see below)
  */
  *  Version 3.14       fix ide_error() handling of BUSY_STAT
  *                     fix byte-swapped cdrom strings (again.. arghh!)
  *                     ignore INDEX bit when checking the ALTSTATUS reg
+ *  Version 3.15       add SINGLE_THREADED flag for use with dual-CMD i/f
+ *                     ignore WRERR_STAT for non-write operations
+ *                     added VLB_SYNC support for DC-2000A & others,
+ *                      (incl. some Promise chips), courtesy of Frank Gockel
+ *  Version 3.16       convert VLB_32BIT and VLB_SYNC into runtime flags
+ *                     add ioctls to get/set VLB flags (HDIO_[SG]ET_CHIPSET)
+ *                     rename SINGLE_THREADED to SUPPORT_SERIALIZE,
+ *                     add boot flag to "serialize" operation for CMD i/f
+ *                     add optional support for DTC2278 interfaces,
+ *                      courtesy of andy@cercle.cts.com (Dyan Wile).
+ *                     add boot flag to enable "dtc2278" probe
+ *                     add probe to avoid EATA (SCSI) interfaces,
+ *                      courtesy of neuffer@goofy.zdv.uni-mainz.de.
  *
  *  To do:
+ *     - improved CMD support:  tech info is supposedly "in the mail"
  *     - special 32-bit controller-type detection & support
  *     - figure out how to support oddball "intelligent" caching cards
  *     - reverse-engineer 3/4 drive support on fancy "Promise" cards
 #include <asm/io.h>
 
 #undef REALLY_FAST_IO                  /* define if ide ports are perfect */
-#define INITIAL_MULT_COUNT     0       /* use zero to disable block mode */
-#ifndef VLB_32BIT_IDE                  /* 0 for safety, 1 for 32-bit chipset:*/
-#define VLB_32BIT_IDE          0       /*   Winbond 83759F or OPTi 82C621 */
+#define INITIAL_MULT_COUNT     0       /* off=0; on=2,4,8,16,32, etc.. */
+#ifndef SUPPORT_VLB_32BIT              /* 1 to support 32bit I/O on VLB */
+#define SUPPORT_VLB_32BIT      1       /* 0 to reduce kernel size */
 #endif
-#ifndef DISK_RECOVERY_TIME             /* min. delay between IO for hardware */
-#define DISK_RECOVERY_TIME     0       /*  that needs it. */
+#ifndef SUPPORT_VLB_SYNC               /* 1 to support weird 32-bit chips */
+#define SUPPORT_VLB_SYNC       1       /* 0 to reduce kernel size */
+#endif
+#ifndef DISK_RECOVERY_TIME             /* off=0; on=access_delay_time */
+#define DISK_RECOVERY_TIME     0       /*  for hardware that needs it */
 #endif
 #ifndef OK_TO_RESET_CONTROLLER         /* 1 needed for good error recovery */
 #define OK_TO_RESET_CONTROLLER 1       /* 0 for use with AH2372A/B interface */
 #ifndef OPTIMIZE_IRQS                  /* 1 for slightly faster code */
 #define OPTIMIZE_IRQS          1       /* 0 to reduce kernel size */
 #endif
+#ifndef SUPPORT_SERIALIZE              /* 1 to support CMD dual interfaces */
+#define SUPPORT_SERIALIZE      1       /* 0 to reduce kernel size */
+#endif
 #ifndef SUPPORT_SHARING_IRQ            /* 1 to allow two IDE i/f on one IRQ */
 #define SUPPORT_SHARING_IRQ    1       /* 0 to reduce kernel size */
 #endif
+#ifndef SUPPORT_DTC2278                        /* 1 to support DTC2278 chipset */
+#define SUPPORT_DTC2278                1       /* 0 to reduce kernel size */
+#endif
 #ifndef FANCY_STATUS_DUMPS             /* 1 for human-readable drive errors */
 #define FANCY_STATUS_DUMPS     1       /* 0 to reduce kernel size */
 #endif
 #undef  SUPPORT_TWO_INTERFACES
 #define SUPPORT_TWO_INTERFACES 0
 #endif /* CONFIG_BLK_DEV_HD */
+
 #if SUPPORT_TWO_INTERFACES
 #define HWIF                   hwif
 #define DEV_HWIF               (dev->hwif)
+#if SUPPORT_SERIALIZE
+#undef SUPPORT_SHARING_IRQ
+#define        SUPPORT_SHARING_IRQ     1
+#endif
 #else
+#undef SUPPORT_SERIALIZE
+#define SUPPORT_SERIALIZE              0
 #undef OPTIMIZE_IRQS
 #define OPTIMIZE_IRQS          0
 #undef SUPPORT_SHARING_IRQ
@@ -224,19 +254,22 @@ typedef unsigned char             byte;   /* used everywhere */
 #define IN_BYTE(p,hwif)                (byte)inb_p(IDE_PORT(p,hwif))
 #endif /* REALLY_FAST_IO */
 
-#if VLB_32BIT_IDE
-#define OUT_SECTORS(b,n)       outsl(IDE_PORT(HD_DATA,DEV_HWIF),(b),(n)<<7)
-#define IN_SECTORS(b,n)                insl(IDE_PORT(HD_DATA,DEV_HWIF),(b),(n)<<7)
-#else
-#define OUT_SECTORS(b,n)       outsw(IDE_PORT(HD_DATA,DEV_HWIF),(b),(n)<<8)
-#define IN_SECTORS(b,n)                insw(IDE_PORT(HD_DATA,DEV_HWIF),(b),(n)<<8)
-#endif /* VLB_32BIT_IDE */
+#if SUPPORT_VLB_32BIT
+#if SUPPORT_VLB_SYNC
+#define VLB_SYNC __asm__ __volatile__ ("pusha\n movl $0x01f2,%edx\n inb (%dx),%al\n inb (%dx),%al\n inb (%dx),%al\n popa\n")
+#endif /* SUPPORT_VLB_SYNC */
+#endif /* SUPPORT_VLB_32BIT */
+
+#if SUPPORT_DTC2278
+static uint probe_dtc2278 = 0;
+#endif
 
 #define GET_ERR(hwif)          IN_BYTE(HD_ERROR,hwif)
 #define GET_STAT(hwif)         IN_BYTE(HD_STATUS,hwif)
 #define OK_STAT(stat,good,bad) (((stat)&((good)|(bad)))==(good))
-#define BAD_RW_STAT            (BUSY_STAT   | ERR_STAT  | WRERR_STAT)
-#define BAD_STAT               (BAD_RW_STAT | DRQ_STAT)
+#define BAD_R_STAT             (BUSY_STAT   | ERR_STAT)
+#define BAD_W_STAT             (BUSY_STAT   | ERR_STAT | WRERR_STAT)
+#define BAD_STAT               (BAD_R_STAT  | DRQ_STAT)
 #define DRIVE_READY            (READY_STAT  | SEEK_STAT)
 #define DATA_READY             (DRIVE_READY | DRQ_STAT)
 
@@ -248,6 +281,7 @@ typedef unsigned char               byte;   /* used everywhere */
 #define PARTN_BITS     6       /* number of minor dev bits for partitions */
 #define PARTN_MASK     ((1<<PARTN_BITS)-1)     /* a useful bit mask */
 #define MAX_DRIVES     2       /* per interface; 2 assumed by lots of code */
+#define SECTOR_WORDS   (512 / 4)       /* number of 32bit words per sector */
 
 /*
  * Timeouts for various operations:
@@ -296,10 +330,12 @@ typedef struct {
        unsigned dont_probe     : 1;    /* from:  hdx=noprobe */
        unsigned keep_settings  : 1;    /* restore settings after drive reset */
        unsigned busy           : 1;    /* mutex for ide_open, revalidate_.. */
-       unsigned reserved0      : 3;    /* unused */
+       unsigned vlb_32bit      : 1;    /* use 32bit in/out for data */
+       unsigned vlb_sync       : 1;    /* needed for some 32bit chip sets */
+       unsigned reserved0      : 1;    /* unused */
        special_t special;              /* special action flags */
        select_t  select;               /* basic drive/head select reg value */
-       byte mult_count, reserved1, reserved2;
+       byte mult_count, chipset, reserved2;
        byte usage, mult_req, wpcom, ctl;
        byte head, sect, bios_head, bios_sect;
        unsigned short cyl, bios_cyl;
@@ -329,9 +365,10 @@ static const char  *ide_devname [2][MAX_DRIVES] = /* for printk()'s */
        {{HD_NAME "a", HD_NAME "b"}, {HD_NAME "c", HD_NAME "d"}};
 static const char      *unsupported = " not supported by this kernel\n";
 
+static byte            single_threaded    = 0;
 #if SUPPORT_SHARING_IRQ
 static byte            sharing_single_irq = 0; /* for two i/f on one IRQ */
-static volatile byte   current_hwif = 0;       /* for two i/f on one IRQ */
+static volatile byte   current_hwif = 0;       /* for single_threaded==1 */
 #endif /* SUPPORT_SHARING_IRQ */
 
 /*
@@ -428,6 +465,50 @@ static void do_request (byte hwif);
        }                                                               \
 }
 
+/*
+ * This is used for all data transfers *from* the IDE interface
+ */
+void input_ide_data (ide_dev_t *dev, void *buffer, uint wcount)
+{
+#if SUPPORT_VLB_32BIT
+       if (dev->vlb_32bit) {
+#if SUPPORT_VLB_SYNC
+               if (dev->vlb_sync) {
+                       cli();
+                       VLB_SYNC;
+                       insl(IDE_PORT(HD_DATA,DEV_HWIF), buffer, wcount);
+                       if (dev->unmask)
+                               sti();
+               } else
+#endif /* SUPPORT_VLB_SYNC */
+                       insl(IDE_PORT(HD_DATA,DEV_HWIF), buffer, wcount);
+       } else
+#endif /* SUPPORT_VLB_32BIT */
+               insw(IDE_PORT(HD_DATA,DEV_HWIF), buffer, wcount<<1);
+}
+
+/*
+ * This is used for all data transfers *to* the IDE interface
+ */
+void output_ide_data (ide_dev_t *dev, void *buffer, uint wcount)
+{
+#if SUPPORT_VLB_32BIT
+       if (dev->vlb_32bit) {
+#if SUPPORT_VLB_SYNC
+               if (dev->vlb_sync) {
+                       cli();
+                       VLB_SYNC;
+                       outsl(IDE_PORT(HD_DATA,DEV_HWIF), buffer, wcount);
+                       if (dev->unmask)
+                               sti();
+               } else
+                       outsl(IDE_PORT(HD_DATA,DEV_HWIF), buffer, wcount);
+#endif /* SUPPORT_VLB_SYNC */
+       } else
+#endif /* SUPPORT_VLB_32BIT */
+               outsw(IDE_PORT(HD_DATA,DEV_HWIF), buffer, wcount<<1);
+}
+
 /*
  * This should get invoked on every exit path from the driver.
  */
@@ -652,7 +733,7 @@ static void read_intr (ide_dev_t *dev)
        unsigned int msect, nsect;
        struct request *rq;
 
-       if (!OK_STAT(stat=GET_STAT(DEV_HWIF),DATA_READY,BAD_RW_STAT)) {
+       if (!OK_STAT(stat=GET_STAT(DEV_HWIF),DATA_READY,BAD_R_STAT)) {
                sti();
                ide_error(dev, "read_intr", stat);
                DO_REQUEST;
@@ -667,7 +748,7 @@ read_next:
                msect -= nsect;
        } else
                nsect = 1;
-       IN_SECTORS(rq->buffer,nsect);
+       input_ide_data(dev, rq->buffer, nsect * SECTOR_WORDS);
 #ifdef DEBUG
        printk("%s:  read: sectors(%ld-%ld), buffer=0x%08lx, remaining=%ld\n",
                dev->name, rq->sector, rq->sector+nsect-1,
@@ -695,7 +776,7 @@ static void write_intr (ide_dev_t *dev)
        int i;
        struct request *rq = ide_cur_rq[DEV_HWIF];
 
-       if (OK_STAT(stat=GET_STAT(DEV_HWIF),DRIVE_READY,BAD_RW_STAT)) {
+       if (OK_STAT(stat=GET_STAT(DEV_HWIF),DRIVE_READY,BAD_W_STAT)) {
 #ifdef DEBUG
                printk("%s: write: sector %ld, buffer=0x%08lx, remaining=%ld\n",
                        dev->name, rq->sector, (unsigned long) rq->buffer,
@@ -711,7 +792,7 @@ static void write_intr (ide_dev_t *dev)
                                end_request(1, DEV_HWIF);
                        if (i > 0) {
                                ide_handler[DEV_HWIF] = &write_intr;
-                               OUT_SECTORS(rq->buffer,1);
+                               output_ide_data(dev, rq->buffer, SECTOR_WORDS);
                                return;
                        }
                        DO_REQUEST;
@@ -734,7 +815,7 @@ static void multwrite (ide_dev_t *dev)
                        nsect = mcount;
                mcount -= nsect;
 
-               OUT_SECTORS(rq->buffer,nsect);
+               output_ide_data(dev, rq->buffer, nsect<<7);
 #ifdef DEBUG
                printk("%s: multwrite: sector %ld, buffer=0x%08lx, count=%d, remaining=%ld\n",
                        dev->name, rq->sector, (unsigned long) rq->buffer,
@@ -762,7 +843,7 @@ static void multwrite_intr (ide_dev_t *dev)
        int i;
        struct request *rq = &ide_write_rq[DEV_HWIF];
 
-       if (OK_STAT(stat=GET_STAT(DEV_HWIF),DRIVE_READY,BAD_RW_STAT)) {
+       if (OK_STAT(stat=GET_STAT(DEV_HWIF),DRIVE_READY,BAD_W_STAT)) {
                if (stat & DRQ_STAT) {
                        if (rq->nr_sectors) {
                                if (dev->mult_count)
@@ -814,7 +895,7 @@ static void set_multmode_intr (ide_dev_t *dev)
                        printk ("  %s: enabled %d-sector multiple mode\n",
                                dev->name, dev->mult_count);
                else
-                       printk ("  %s: disabled multiple mode\n", dev->name);
+                       printk ("  %s: multiple mode turned off\n", dev->name);
        }
        DO_REQUEST;
 }
@@ -865,16 +946,24 @@ static void timer_expiry (byte hwif)
        } else {
                ide_handler[HWIF] = NULL;
                disable_irq(ide_irq[HWIF]);
+#if SUPPORT_SERIALIZE
+               if (single_threaded && ide_irq[HWIF] != ide_irq[HWIF^1])
+                       disable_irq(ide_irq[HWIF^1]);
+#endif /* SUPPORT_SERIALIZE */
                sti();
                ide_error(ide_cur_dev[HWIF], "timeout", GET_STAT(HWIF));
                do_request(HWIF);
 #if SUPPORT_SHARING_IRQ
-               if (sharing_single_irq) /* this line is indeed necessary */
+               if (single_threaded)    /* this line is indeed necessary */
                        hwif = current_hwif;
 #endif /* SUPPORT_SHARING_IRQ */
                cli();
                start_ide_timer(HWIF);
                enable_irq(ide_irq[HWIF]);
+#if SUPPORT_SERIALIZE
+               if (single_threaded && ide_irq[HWIF] != ide_irq[HWIF^1])
+                       enable_irq(ide_irq[HWIF^1]);
+#endif /* SUPPORT_SERIALIZE */
        }
        restore_flags(flags);
 }
@@ -983,7 +1072,7 @@ static inline int do_rw_disk (ide_dev_t *dev, struct request *rq, unsigned long
        if (rq->cmd == WRITE) {
                OUT_BYTE(dev->wpcom,HD_PRECOMP);        /* for ancient drives */
                OUT_BYTE(dev->mult_count ? WIN_MULTWRITE : WIN_WRITE, HD_COMMAND);
-               WAIT_STAT(dev, DATA_READY, BAD_RW_STAT, WAIT_DRQ, "DRQ", error);
+               WAIT_STAT(dev, DATA_READY, BAD_W_STAT, WAIT_DRQ, "DRQ", error);
                if (!dev->unmask)
                        cli();
                if (dev->mult_count) {
@@ -991,7 +1080,7 @@ static inline int do_rw_disk (ide_dev_t *dev, struct request *rq, unsigned long
                        multwrite(dev);
                        ide_handler[DEV_HWIF] = &multwrite_intr;
                } else {
-                       OUT_SECTORS(rq->buffer,1);
+                       output_ide_data(dev, rq->buffer, SECTOR_WORDS);
                        ide_handler[DEV_HWIF] = &write_intr;
                }
                return 0;
@@ -1040,14 +1129,14 @@ static void do_request (byte hwif)
 repeat:
        sti();
 #if SUPPORT_SHARING_IRQ
-       current_hwif = hwif;    /* used *only* when sharing_single_irq==1 */
+       current_hwif = hwif;    /* used *only* when single_threaded==1 */
 #endif /* SUPPORT_SHARING_IRQ */
        if ((rq = ide_cur_rq[HWIF]) == NULL) {
                rq = blk_dev[ide_major[HWIF]].current_request;
                if ((rq == NULL) || (rq->dev < 0)) {
 #if SUPPORT_SHARING_IRQ
-                       if (sharing_single_irq) {
-                               if ((dev = ide_cur_dev[hwif])) /* disable irq */
+                       if (single_threaded) {
+                               if (sharing_single_irq && (dev = ide_cur_dev[hwif])) /* disable irq */
                                        OUT_BYTE(dev->ctl|2,HD_CMD);
                                rq = blk_dev[ide_major[hwif^=1]].current_request;
                                if ((rq != NULL) && (rq->dev >= 0))
@@ -1121,10 +1210,14 @@ repeat:
 {                                              \
        if (ide_handler[hwif] == NULL) {        \
                disable_irq(ide_irq[hwif]);     \
+               if (single_threaded && ide_irq[hwif] != ide_irq[hwif^1]) \
+                       disable_irq(ide_irq[hwif^1]); \
                do_request(hwif);               \
                cli();                          \
                start_ide_timer(hwif);          \
                enable_irq(ide_irq[hwif]);      \
+               if (single_threaded && ide_irq[hwif] != ide_irq[hwif^1]) \
+                       enable_irq(ide_irq[hwif^1]); \
        }                                       \
 }
 
@@ -1169,10 +1262,12 @@ static void unexpected_intr (byte hwif)
 
        if (!OK_STAT(stat=GET_STAT(HWIF), DRIVE_READY, BAD_STAT))
                (void) dump_status(HWIF, "unexpected_intr", stat);
+       outb_p(2,IDE_PORT(HD_CMD,hwif));        /* disable device irq */
 #if SUPPORT_SHARING_IRQ
-       if (sharing_single_irq) {
+       if (single_threaded && ide_irq[hwif] == ide_irq[hwif^1]) {
                if (!OK_STAT(stat=GET_STAT(hwif^1), DRIVE_READY, BAD_STAT))
                        (void) dump_status(hwif^1, "unexpected_intr", stat);
+               outb_p(2,IDE_PORT(HD_CMD,hwif^1));      /* disable device irq */
        }
 #endif /* SUPPORT_SHARING_IRQ */
 }
@@ -1197,21 +1292,32 @@ static void unexpected_intr (byte hwif)
        } else                                          \
                unexpected_intr(hwif);                  \
        cli();                                          \
-       start_ide_timer(hwif);                          \
 }
 
+#if SUPPORT_SERIALIZE
+/* entry point for all interrupts when single_threaded==1 */
+static void ide_seq_intr (int irq, struct pt_regs *regs)
+{
+       byte hwif = (irq != ide_irq[0]);
+       IDE_INTR(HWIF);
+       start_ide_timer(current_hwif);
+}
+#endif /* SUPPORT_SERIALIZE */
+
 #if OPTIMIZE_IRQS
 
-/* entry point for all interrupts on ide0 when sharing_single_irq==0 */
+/* entry point for all interrupts on ide0 when single_threaded==0 */
 static void ide0_intr (int irq, struct pt_regs *regs)
 {
        IDE_INTR(0);
+       start_ide_timer(0);
 }
 
-/* entry point for all interrupts on ide1 when sharing_single_irq==0 */
+/* entry point for all interrupts on ide1 when single_threaded==0 */
 static void ide1_intr (int irq, struct pt_regs *regs)
 {
        IDE_INTR(1);
+       start_ide_timer(1);
 }
 
 #else  /* OPTIMIZE_IRQS */
@@ -1219,13 +1325,14 @@ static void ide1_intr (int irq, struct pt_regs *regs)
 #define ide0_intr      ide_intr
 #define ide1_intr      ide_intr
 
-/* entry point for all interrupts when sharing_single_irq==0 */
+/* entry point for all interrupts when single_threaded==0 */
 static void ide_intr (int irq, struct pt_regs *regs)
 {
 #if SUPPORT_TWO_INTERFACES
        byte hwif = (irq != ide_irq[0]);
 #endif /* SUPPORT_TWO_INTERFACES */
        IDE_INTR(HWIF);
+       start_ide_timer(HWIF);
 }
 
 #endif /* OPTIMIZE_IRQS */
@@ -1235,6 +1342,7 @@ static void ide_intr (int irq, struct pt_regs *regs)
 static void ide_shared_intr (int irq, struct pt_regs * regs)
 {
        IDE_INTR(current_hwif);
+       start_ide_timer(current_hwif);
 }
 #endif /* SUPPORT_SHARING_IRQ */
 
@@ -1454,6 +1562,9 @@ static int ide_ioctl (struct inode *inode, struct file *file,
                 case HDIO_GET_UNMASKINTR:
                        return write_fs_long(arg, dev->unmask);
 
+                case HDIO_GET_CHIPSET:
+                       return write_fs_long(arg, dev->chipset);
+
                 case HDIO_GET_MULTCOUNT:
                        return write_fs_long(arg, dev->mult_count);
 
@@ -1468,22 +1579,28 @@ static int ide_ioctl (struct inode *inode, struct file *file,
                        return 0;
 
                case HDIO_SET_KEEPSETTINGS:
+               case HDIO_SET_UNMASKINTR:
                        if (!suser()) return -EACCES;
                        if ((arg > 1) || (MINOR(inode->i_rdev) & PARTN_MASK))
                                return -EINVAL;
                        save_flags(flags);
                        cli();
-                       dev->keep_settings = arg;
+                       if (cmd == HDIO_SET_KEEPSETTINGS)
+                               dev->keep_settings = arg;
+                       else
+                               dev->unmask = arg;
                        restore_flags(flags);
                        return 0;
 
-               case HDIO_SET_UNMASKINTR:
+               case HDIO_SET_CHIPSET:
                        if (!suser()) return -EACCES;
-                       if ((arg > 1) || (MINOR(inode->i_rdev) & PARTN_MASK))
+                       if ((arg > 3) || (MINOR(inode->i_rdev) & PARTN_MASK))
                                return -EINVAL;
                        save_flags(flags);
                        cli();
-                       dev->unmask = arg;
+                       dev->chipset   = arg;
+                       dev->vlb_sync  = (arg & 2) >> 1;
+                       dev->vlb_32bit = (arg & 1);
                        restore_flags(flags);
                        return 0;
 
@@ -1614,9 +1731,19 @@ static void do_identify (ide_dev_t *dev, byte cmd)
 
        id = dev->id = (struct hd_driveid *) probe_mem_start; /* kmalloc() */
        probe_mem_start += 512;
-       IN_SECTORS(id,1);       /* read 512 bytes of id info */
+       input_ide_data(dev, id, SECTOR_WORDS);  /* read 512 bytes of id info */
        sti();
 
+       /*
+        * EATA SCSI controllers do a hardware ATA emulation:  ignore them
+        */
+       if ((id->model[0] == 'P' && id->model[1] == 'M')
+        || (id->model[0] == 'S' && id->model[1] == 'K')) {
+               printk("%s: EATA SCSI HBA %.10s\n", dev->name, id->model);
+               dev->present = 0;
+               return;
+       }
+
        /*
         *  WIN_IDENTIFY returns little-endian info,
         *  WIN_PIDENTIFY *usually* returns little-endian info.
@@ -1769,7 +1896,7 @@ static int try_to_identify (ide_dev_t *dev, byte cmd)
                delay_10ms();           /* give drive a breather */
        } while (IN_BYTE(hd_status,DEV_HWIF) & BUSY_STAT);
        delay_10ms();           /* wait for IRQ and DRQ_STAT */
-       if (OK_STAT(GET_STAT(DEV_HWIF),DRQ_STAT,BAD_RW_STAT)) {
+       if (OK_STAT(GET_STAT(DEV_HWIF),DRQ_STAT,BAD_R_STAT)) {
                cli();                  /* some systems need this */
                do_identify(dev, cmd);  /* drive returned ID */
                rc = 0;                 /* success */
@@ -1957,8 +2084,22 @@ void ide_setup(char *str, int *ints)
        if (dev->present)
                printk("(redefined) ");
        if (ints[0] == 0) {
+#if SUPPORT_DTC2278
+               if (!strcmp(str,"dtc2278")) {
+                       printk("%s\n",str);
+                       probe_dtc2278 = 1;      /* try to init DTC-2278 at boot */
+                       return;
+               }
+#endif /* SUPPORT_DTC2278 */
+#if SUPPORT_SERIALIZE
+               if (!strcmp(str,"serialize") || !strcmp(str,"cmd")) {
+                       printk("%s\n",str);
+                       single_threaded = 1;    /* serialize all drive access */
+                       return;
+               }
+#endif /* SUPPORT_SERIALIZE */
                if (!strcmp(str,"noprobe")) {
-                       printk("noprobe\n");
+                       printk("%s\n",str);
                        dev->dont_probe = 1;    /* don't probe for this drive */
                        return;
                }
@@ -2070,6 +2211,8 @@ static void init_ide_data (byte hwif)
                dev->mult_count                 = 0; /* set by do_identify() */
                dev->mult_req                   = 0; /* set by do_identify() */
                dev->usage                      = 0;
+               dev->vlb_32bit                  = 0;
+               dev->vlb_sync                   = 0;
                dev->id                         = NULL;
                dev->ctl                        = 0x08;
                dev->wqueue                     = NULL;
@@ -2103,6 +2246,13 @@ static byte setup_irq (byte hwif)
                }
                handler = &ide_shared_intr;
        }
+#if SUPPORT_SERIALIZE
+       else if (single_threaded) {
+               handler = &ide_seq_intr;
+               if (HWIF != 0)
+                       msg = " (single-threaded with ide0)";
+       }
+#endif /* SUPPORT_SERIALIZE */
 #endif /* SUPPORT_SHARING_IRQ */
        save_flags(flags);
        cli();
@@ -2160,6 +2310,54 @@ static struct file_operations ide_fops = {
 #endif CONFIG_BLK_DEV_IDECD
 };
 
+
+#if SUPPORT_DTC2278
+/*
+ * From: andy@cercle.cts.com (Dyan Wile)
+ *
+ * Below is a patch for DTC-2278 - alike software-programmable controllers
+ * The code enables the secondary IDE controller and the PIO4 (3?) timings on
+ * the primary (EIDE). You may probably have to enable the 32-bit support to
+ * get the full speed. You better get the disk interrupts disabled ( hdparm -u0 
+ * /dev/hd.. ) for the drives connected to the EIDE interface. (I get my 
+ * filesystem  corrupted with -u 1, but under heavy disk load only :-)  
+ */
+
+static void sub22 (char b, char c)
+{
+       int i;
+
+       for(i = 0; i < 3; i++) {
+               __inb(0x3f6);
+               outb_p(b,0xb0);
+               __inb(0x3f6);
+               outb_p(c,0xb4);
+               __inb(0x3f6);
+               if(__inb(0xb4) == c) {
+                       outb_p(7,0xb0);
+                       __inb(0x3f6);
+                       return; /* success */
+               }
+       }
+}
+
+static void try_to_init_dtc2278 (void)
+{
+/* This (presumably) enables PIO mode4 (3?) on the first interface */
+       cli();
+       sub22(1,0xc3);
+       sub22(0,0xa0);
+       sti();
+
+/* This enables the second interface */
+
+       outb_p(4,0xb0);
+       __inb(0x3f6);
+       outb_p(0x20,0xb4);
+       __inb(0x3f6);
+}
+#endif /* SUPPORT_DTC2278 */
+
 /*
  * This is gets invoked once during initialization, to set *everything* up
  */
@@ -2167,6 +2365,11 @@ unsigned long ide_init (unsigned long mem_start, unsigned long mem_end)
 {
        byte hwif;
 
+#if SUPPORT_DTC2278
+       if (probe_dtc2278)
+               try_to_init_dtc2278();
+#endif /* SUPPORT_DTC2278 */
+       /* single_threaded = 0; */      /* zero by default, override at boot */
        for (hwif = 0; hwif < 2; hwif++) {
                init_ide_data (hwif);
                if (SUPPORT_TWO_INTERFACES || hwif == HWIF) {
@@ -2191,6 +2394,7 @@ unsigned long ide_init (unsigned long mem_start, unsigned long mem_end)
                } else {
 #if SUPPORT_SHARING_IRQ
                        sharing_single_irq = 1;
+                       single_threaded = 1;
 #else /* SUPPORT_SHARING_IRQ */
                        printk("%s: ide irq-sharing%s", ide_name[1], unsupported);
                        return mem_start;
@@ -2218,7 +2422,7 @@ unsigned long ide_init (unsigned long mem_start, unsigned long mem_end)
                                timer_table[ide_timer[HWIF]].fn
                                        = HWIF ? ide1_timer_expiry : ide0_timer_expiry;
 #if SUPPORT_SHARING_IRQ
-                               if (sharing_single_irq)
+                               if (single_threaded)
                                        blk_dev[major].request_fn = &do_shared_request;
                                else
 #endif /* SUPPORT_SHARING_IRQ */
index 628720f93ba260094815eb30219aedf187b261d2..978b99ee4b6bffafa1e36dc90e58205c535b98de 100644 (file)
@@ -1,5 +1,5 @@
 static char rcsid[] =
-"$Revision: 1.36.1.3 $$Date: 1995/03/23 22:15:35 $";
+"$Revision: 1.36.1.4 $$Date: 1995/03/29 06:14:14 $";
 /*
  *  linux/kernel/cyclades.c
  *
@@ -18,6 +18,9 @@ static char rcsid[] =
  *   int  cy_open(struct tty_struct *tty, struct file *filp);
  *
  * $Log: cyclades.c,v $
+ * Revision 1.36.1.4  1995/03/29  06:14:14  bentson
+ * disambiguate between Cyclom-16Y and Cyclom-32Ye;
+ *
  * Revision 1.36.1.3  1995/03/23  22:15:35  bentson
  * add missing break in modem control block in ioctl switch statement
  * (discovered by Michael Edward Chastain <mec@jobe.shell.portal.com>);
@@ -2638,6 +2641,17 @@ cy_init_card(unsigned char *true_base_addr)
         base_addr[CyGFRCR] = 0;
         udelay(10L);
 
+        /* The Cyclom-16Y does not decode address bit 9 and therefore
+           cannot distinguish between references to chip 0 and a non-
+           existent chip 4.  If the preceeding clearing of the supposed
+           chip 4 GFRCR register appears at chip 0, there is no chip 4
+           and this must be a Cyclom-16Y, not a Cyclom-32Ye.
+        */
+        if (chip_number == 4
+        && *(true_base_addr + cy_chip_offset[0] + CyGFRCR) == 0){
+           return chip_number;
+        }
+
         base_addr[CyCCR] = CyCHIP_RESET;
         udelay(1000L);
 
index e4e441358a383a4a35474b4d51bb67b65a238480..40776d371ff592be491e2986fe52397bed54c248 100644 (file)
@@ -71,12 +71,6 @@ loopback_xmit(struct sk_buff *skb, struct device *dev)
 
   dev->tbusy = 0;
 
-  if (!intr_count && (bh_active & bh_mask)) {
-       start_bh_atomic();
-       do_bottom_half();
-       end_bh_atomic();
-  }
-
   return(0);
 }
 
index 7c81c77609a8b81abb4fb3af47a86efa1d22b69a..c3bf5af6dab132f5d46815d9c1a3e8ac41fea7fe 100644 (file)
@@ -2,7 +2,7 @@ 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).
+       * buslogic.c: Update to version 1.15 (From Leonard N. Zubkoff).
        Fixed interrupt routine to avoid races when handling multiple
        complete commands per interrupt.  Seems to come up with faster
        cards.
index 17ca6ef82b4c64cb135fb5109344d6575b484c1e..a5824b04be091350032207da10c72973a0d9766b 100644 (file)
@@ -1555,7 +1555,7 @@ void buslogic_setup(char *str, int *ints)
            bases[setup_idx] = 0;
            return;
        }
-    buslogic_printk("invalid base 0x%X specified.\n", ints[i]);
+    buslogic_printk("invalid base 0x%X specified.\n", ints[1]);
 }
 
 #ifdef MODULE
index 6fb810239699da8da158fb83d4e0be05179ce346..0112d5d7132b7a50dcc3033960d78b22c67ca503 100644 (file)
@@ -124,22 +124,22 @@ st_chk_result(Scsi_Cmnd * SCpnt)
           SCpnt->request_bufflen);
     if (driver_byte(result) & DRIVER_SENSE)
       print_sense("st", SCpnt);
-  } else
+  }
 #endif
-    scode = sense[2] & 0x0f;
-    if (!(driver_byte(result) & DRIVER_SENSE) ||
-       ((sense[0] & 0x70) == 0x70 &&
-        scode != NO_SENSE &&
-        scode != RECOVERED_ERROR &&
-        scode != UNIT_ATTENTION &&
-        scode != BLANK_CHECK &&
-        scode != VOLUME_OVERFLOW)) {  /* Abnormal conditions for tape */
-      printk("st%d: Error %x. ", dev, result);
-      if (driver_byte(result) & DRIVER_SENSE)
-       print_sense("st", SCpnt);
-      else
-       printk("\n");
-    }
+  scode = sense[2] & 0x0f;
+  if (!(driver_byte(result) & DRIVER_SENSE) ||
+      ((sense[0] & 0x70) == 0x70 &&
+       scode != NO_SENSE &&
+       scode != RECOVERED_ERROR &&
+       scode != UNIT_ATTENTION &&
+       scode != BLANK_CHECK &&
+       scode != VOLUME_OVERFLOW)) {  /* Abnormal conditions for tape */
+    printk("st%d: Error %x. ", dev, result);
+    if (driver_byte(result) & DRIVER_SENSE)
+      print_sense("st", SCpnt);
+    else
+      printk("\n");
+  }
 
   if ((sense[0] & 0x70) == 0x70 &&
       scode == RECOVERED_ERROR
index aac91a8d51b93c4b39c430ef42fbe8292230ccc1..acc3c1de237c9f0cb3a9d892416f17b2f8cc22dc 100644 (file)
@@ -1,28 +1,3 @@
-NOTE!
-
-       This is an ALPHA TEST VERSION (pre 3.0). The latest
-       released version of this driver is now part of
-       Linux kernel distribution. For other operating systems
-       use the snd-driv-2.5.tar.gz package.
-
-       This particular version contains lots of new features
-       BUT THERE ARE NO APPLICATIONS WHICH USE THEM. So there
-       is no need to install this version as long as you are
-       not developing the driver or applications which use it.
-       All new features are in the /dev/sequencer and /dev/midi
-       parts of the driver.
-
-       
-       This version is little bit incomplete. Some features have
-       not been implemented for each soundcards yet. All features
-       of v2.4 should work OK.
-
-CAUTION!
-       This version of driver works with applications written and
-       compiled for v2.*. The problem is that APPLICATIONS COMPILED
-       WITH soundcard.h OF THIS VERSION WILL NOT WORK WITH OLDER DRIVER.
-       Be careful when distributing applications compiled with this
-       version (just the apps using /dev/sequencer are incompatible).
 
        *********************************************************
        * IF YOU HAVE ANY PROBLEMS WITH THE SOUND DRIVER,       *
@@ -30,5 +5,3 @@ CAUTION!
        * NEAREST LINUX FTP SITE AND CONTAINS ANSWER TO YOUR    *
        * PROBLEM.                                              *
        *********************************************************
-
-Hannu
index 239e46e1b9e81b612541c49335350cc00d534833..21bc6d7e20f2130da4218bff2cb1322f1b7b608d 100644 (file)
@@ -973,7 +973,7 @@ static void read_buffers(struct buffer_head * bh[], int nrbuf)
        }
        if (bhnum)
                ll_rw_block(READ, bhnum, bhr);
-       for (i = 0 ; i < nrbuf ; i++) {
+       for (i = nrbuf ; --i >= 0 ; ) {
                if (bh[i]) {
                        wait_on_buffer(bh[i]);
                }
index 5962a6b5090ee48294d3226a347493c552721ead..23b36899a82150c0989ff6db7e7486716ca97ba5 100644 (file)
--- a/fs/open.c
+++ b/fs/open.c
@@ -277,6 +277,8 @@ asmlinkage int sys_fchmod(unsigned int fd, mode_t mode)
                return -ENOENT;
        if (IS_RDONLY(inode))
                return -EROFS;
+       if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
+               return -EPERM;
        if (mode == (mode_t) -1)
                mode = inode->i_mode;
        newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
@@ -299,6 +301,10 @@ asmlinkage int sys_chmod(const char * filename, mode_t mode)
                iput(inode);
                return -EROFS;
        }
+       if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) {
+               iput(inode);
+               return -EPERM;
+       }
        if (mode == (mode_t) -1)
                mode = inode->i_mode;
        newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
@@ -322,6 +328,8 @@ asmlinkage int sys_fchown(unsigned int fd, uid_t user, gid_t group)
                return -ENOENT;
        if (IS_RDONLY(inode))
                return -EROFS;
+       if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
+               return -EPERM;
        if (user == (uid_t) -1)
                user = inode->i_uid;
        if (group == (gid_t) -1)
@@ -362,6 +370,10 @@ asmlinkage int sys_chown(const char * filename, uid_t user, gid_t group)
                iput(inode);
                return -EROFS;
        }
+       if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) {
+               iput(inode);
+               return -EPERM;
+       }
        if (user == (uid_t) -1)
                user = inode->i_uid;
        if (group == (gid_t) -1)
index 284da291ec38a8440fb183499b99892b89a43e18..d4fc50d8152c367907146c5d73b4ae1691f76f2e 100644 (file)
@@ -1,4 +1,3 @@
-#define THREE_LEVEL
 /*
  *  linux/fs/proc/array.c
  *
index 2539975405beb3015c0b707a492bc6a83751d942..f44bd7fbc0daff82fce30e9d1fc9aca0f3f3a084 100644 (file)
@@ -1,4 +1,3 @@
-#define THREE_LEVEL
 /*
  *  linux/fs/proc/mem.c
  *
index 2c63a02e58d37081ce6960c2d9c2e01cfa8ff509..8acef7a197aeab13d3be9aa8aca23efdaed20071 100644 (file)
@@ -21,12 +21,6 @@ extern char ignore_irq13;
 extern char wp_works_ok;               /* doesn't work on a 386 */
 extern char hlt_works_ok;      /* problems on some 486Dx4's and old 386's */
 
-#define start_bh_atomic() \
-__asm__ __volatile__("incl _intr_count")
-
-#define end_bh_atomic() \
-__asm__ __volatile__("decl _intr_count")
-
 /*
  * Bus types (default is ISA, but people can check others with these..)
  * MCA_bus hardcoded to 0 for now.
index 6055b1e51d4abd443933e79c07ede3fd82d3cbcc..1640a3beb0a801ce1c0bcd8a1152c2fe1ce08624 100644 (file)
@@ -78,12 +78,14 @@ struct hd_geometry {
 #define HDIO_GET_MULTCOUNT     0x304   /* get current IDE blockmode setting */
 #define HDIO_GET_IDENTITY      0x307   /* get IDE identification info */
 #define HDIO_GET_KEEPSETTINGS  0x308   /* get keep-settings-on-reset flag */
+#define HDIO_GET_CHIPSET       0x309   /* get current interface type setting */
 #define HDIO_DRIVE_CMD         0x31f   /* execute a special drive command */
 
 /* hd/ide ctl's that pass (arg) non-ptr values are numbered 0x32n/0x33n */
 #define HDIO_SET_MULTCOUNT     0x321   /* set IDE blockmode */
 #define HDIO_SET_UNMASKINTR    0x322   /* permit other irqs during I/O */
 #define HDIO_SET_KEEPSETTINGS  0x323   /* keep ioctl settings on reset */
+#define HDIO_SET_CHIPSET       0x324   /* optimise driver for interface type */
 
 /* structure returned by HDIO_GET_IDENTITY, as per ANSI ATA2 rev.2f spec */
 struct hd_driveid {
index b3ef575baa44a733555dc9ab0356e4f6c92b6a0e..4c4edc82cb35fcf3b13021c7a93c71ee2ad5a5c8 100644 (file)
@@ -45,6 +45,18 @@ extern inline void enable_bh(int nr)
        set_bit(nr, &bh_mask);
 }
 
+extern inline void start_bh_atomic(void)
+{
+       intr_count++;
+}
+
+extern inline void end_bh_atomic(void)
+{
+       if (intr_count == 1 && (bh_active & bh_mask))
+               do_bottom_half();
+       intr_count--;
+}
+
 /*
  * Autoprobing for irqs:
  *
index 4ee1df6512c028c615318d9e3c1f5bb11ec0e7cb..9752429ad29e5c67c27d0c0c4599c762915abecb 100644 (file)
@@ -388,7 +388,7 @@ struct pci_vendor_type {
        {PCI_VENDOR_ID_CONTAQ,          "Contaq"}, \
        {PCI_VENDOR_ID_NS,              "NS"}, \
        {PCI_VENDOR_ID_VIA,             "VIA Technologies"}, \
-       {PCI_VENDOR_ID_SI,              "Silicon Integrated"}, \
+       {PCI_VENDOR_ID_SI,              "Silicon Integrated Systems"}, \
        {PCI_VENDOR_ID_LEADTEK,         "Leadtek Research"}, \
        {PCI_VENDOR_ID_IMS,             "IMS"}, \
        {PCI_VENDOR_ID_ZEINET,          "ZeiNet"}, \
index 7fbea6ba1596118b0ac6082b424f0953a9dcff4d..8d753861b112d7f7f349ab19f19a6a12d79f6116 100644 (file)
--- a/ipc/shm.c
+++ b/ipc/shm.c
@@ -1,4 +1,3 @@
-#define THREE_LEVEL
 /*
  * linux/ipc/shm.c
  * Copyright (C) 1992, 1993 Krishna Balasubramanian
index 6a60dcda5db3698d408ccf1287ec9f8f457b537a..e29a48ba5be33c8ad3b09ebc8d9d4a3a28522af9 100644 (file)
@@ -745,7 +745,7 @@ register_symtab(struct symbol_table *intab)
                link && (link != &kernel_module);
                link = link->next) {
 
-               if (link->ref->module == mp)
+               if (link->ref && (link->ref->module == mp))
                        link->ref = newref++;
        }
 
index 2e01f21fa0475ddbb5d52ee523d4acc3437d60c3..5a7999d73d163839c555cbcf05d851781d63aedc 100644 (file)
@@ -13,7 +13,7 @@
 #include <linux/types.h>
 #include <linux/ioport.h>
 
-#define IOTABLE_SIZE 32
+#define IOTABLE_SIZE 64
 
 typedef struct resource_entry_t {
        u_long from, num;
index 24a3372109ac9a7dcd36078ef30e179d0e570e5e..5a1e99142958d6181fb69d3a2a1210347e33f333 100644 (file)
@@ -1,4 +1,3 @@
-#define THREE_LEVEL
 /*
  *     linux/mm/filemmap.c
  *
index e0ccde2b0374e2a2596a257d6d0304c7a6a29948..c21aade8444657c243f4b7434bdefcca24630a1a 100644 (file)
@@ -1,4 +1,3 @@
-#define THREE_LEVEL
 /*
  *  linux/mm/memory.c
  *
index c16f86880e93add5e231d754921056026e175fcc..ecf73730c04511b8d6214b1e5dd039e14bedc136 100644 (file)
@@ -1,4 +1,3 @@
-#define THREE_LEVEL
 /*
  *     linux/mm/mprotect.c
  *
index e1a9ce15ad53cd2eca5fb8ce487bf166d797be1d..0e5af6e61b108ec2360a13c4111ac5cded427cba 100644 (file)
--- a/mm/swap.c
+++ b/mm/swap.c
@@ -1,4 +1,3 @@
-#define THREE_LEVEL
 /*
  *  linux/mm/swap.c
  *
index e4c4c968038e2d995ac9c709ec661576bbcb672a..107be5546c6b4b9b2e1cafcc7ecf1a2316875535 100644 (file)
@@ -1,4 +1,3 @@
-#define THREE_LEVEL
 /*
  *  linux/mm/vmalloc.c
  *
index a82b59c1898afab426e0014cfbcb5c6c52944193..04bb8d08fcba13871ea2252d8164f752aec46beb 100644 (file)
@@ -815,8 +815,8 @@ static int inet_release(struct socket *sock, struct socket *peer)
        sk->inuse = 1;
 
        /* This will destroy it. */
-       release_sock(sk);
        sock->data = NULL;
+       release_sock(sk);
        sk->socket = NULL;
        return(0);
 }
@@ -939,8 +939,12 @@ static int inet_connect(struct socket *sock, struct sockaddr * uaddr,
                return 0;       /* Rock and roll */
        }
 
-       if (sock->state == SS_CONNECTING && sk->protocol == IPPROTO_TCP && (flags & O_NONBLOCK))
-               return -EALREADY;       /* Connecting is currently in progress */
+       if (sock->state == SS_CONNECTING && sk->protocol == IPPROTO_TCP && (flags & O_NONBLOCK)) {
+               if (sk->err != 0)
+                       return -sk->err;        /* Connection must have failed */
+               else
+                       return -EALREADY;       /* Connecting is currently in progress */
+       }
        
        if (sock->state != SS_CONNECTING) 
        {
index d5a8062462bd140d2fbcec559dcc4c204b87968e..cd953f1dc8a47d2cae32e078bd22bd9bc32e14e6 100644 (file)
@@ -337,7 +337,9 @@ void dev_queue_xmit(struct sk_buff *skb, struct device *dev, int pri)
                 *      Make sure we haven't missed an interrupt. 
                 */
                printk("dev_queue_xmit: worked around a missed interrupt\n");
+               start_bh_atomic();
                dev->hard_start_xmit(NULL, dev);
+               end_bh_atomic();
                return;
        }
 
@@ -409,12 +411,15 @@ void dev_queue_xmit(struct sk_buff *skb, struct device *dev, int pri)
                        }
                }
        }
+       start_bh_atomic();
        if (dev->hard_start_xmit(skb, dev) == 0) {
+               end_bh_atomic();
                /*
                 *      Packet is now solely the responsibility of the driver
                 */
                return;
        }
+       end_bh_atomic();
 
        /*
         *      Transmission failed, put skb back into a list. Once on the list it's safe and
index dd188f54571a30de6ddece404c5fc050c4ebd604..0005966812a9dea8ac6f7eb4446ebdb160871795 100644 (file)
@@ -1489,7 +1489,8 @@ int ip_rcv(struct sk_buff *skb, struct device *dev, struct packet_type *pt)
         *      (4.     We ought to check for IP multicast addresses and undefined types.. does this matter ?)
         */
 
-       if (skb->len<sizeof(struct iphdr) || iph->ihl<5 || iph->version != 4 || ip_fast_csum((unsigned char *)iph, iph->ihl) !=0)
+       if (skb->len<sizeof(struct iphdr) || iph->ihl<5 || iph->version != 4 ||
+               skb->len<ntohs(iph->tot_len) || ip_fast_csum((unsigned char *)iph, iph->ihl) !=0)
        {
                ip_statistics.IpInHdrErrors++;
                kfree_skb(skb, FREE_WRITE);
@@ -2090,8 +2091,6 @@ int ip_setsockopt(struct sock *sk, int level, int optname, char *optval, int opt
                        unsigned char ucval;
 
                        ucval=get_fs_byte((unsigned char *)optval);
-                       if(ucval<1||ucval>255)
-                                return -EINVAL;
                        sk->ip_mc_ttl=(int)ucval;
                        return 0;
                }
index 0e9ff7852fe9675fbd5454aa9bc3a5a8d85b7078..7605511a49743ec904ab0e66e2aba8e94a8b8e79 100644 (file)
@@ -934,6 +934,8 @@ static int tcp_select(struct sock *sk, int sel_type, select_table *wait)
                break;
 
        case SEL_OUT:
+               if (sk->err)
+                       return 1;
                if (sk->shutdown & SEND_SHUTDOWN) 
                        return 0;
                if (sk->state == TCP_SYN_SENT || sk->state == TCP_SYN_RECV)
@@ -948,7 +950,7 @@ static int tcp_select(struct sock *sk, int sel_type, select_table *wait)
                return 1;
 
        case SEL_EX:
-               if (sk->err || sk->urg_data)
+               if (sk->urg_data)
                        return 1;
                break;
        }
index f949440469bde2b8f50455116d4c5a469c56604a..60628c6d60e0294cc78f79e8da8890f55023b05a 100644 (file)
@@ -481,7 +481,7 @@ static int unix_proto_connect(struct socket *sock, struct sockaddr *uservaddr,
        fname[sockaddr_len-UN_PATH_OFFSET] = '\0';
        old_fs = get_fs();
        set_fs(get_ds());
-       i = open_namei(fname, 0, S_IFSOCK, &inode, NULL);
+       i = open_namei(fname, 2, S_IFSOCK, &inode, NULL);
        set_fs(old_fs);
        if (i < 0) 
        {
index 2f722221d7ce0b56480ed96eebb84fe28dc8080b..3c71e9a377f012401a2d17ba7f9893e193b1d39c 100644 (file)
@@ -11,12 +11,15 @@ TOPINCL := $(TOPDIR)/include/linux
 .SUFFIXES: .ver
 
 .c.ver:
-       $(CC) $(CFLAGS) -E -D__GENKSYMS__ $< | genksyms -w $(TOPINCL)/modules
+       @if [ ! -x /sbin/genksyms ]; then echo "Please read: README.modules"; fi
+       $(CC) $(CFLAGS) -E -DCONFIG_MODVERSIONS -D__GENKSYMS__ $< | /sbin/genksyms -w $(TOPINCL)/modules
        @ln -sf $(TOPINCL)/modules/$@ .
 
 $(SYMTAB_OBJS):
        $(CC) $(CFLAGS) -DEXPORT_SYMTAB -c $(@:.o=.c)
 
+$(SYMTAB_OBJS:.o=.ver): $(TOPINCL)/autoconf.h
+
 $(TOPINCL)/modversions.h: $(SYMTAB_OBJS:.o=.ver)
        @echo updating $(TOPINCL)/modversions.h
        @(cd $(TOPINCL)/modules; for f in *.ver;\