home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC-Online 1996 May
/
PCOnline_05_1996.bin
/
linux
/
source
/
kernel-s
/
v1.2
/
patch-1.004
/
patch-1.2.9
Wrap
Text File
|
1995-06-01
|
42KB
|
1,248 lines
diff -u --recursive --new-file v1.2.8/linux/Makefile linux/Makefile
--- v1.2.8/linux/Makefile Mon May 29 11:16:03 1995
+++ linux/Makefile Thu May 4 20:43:31 1995
@@ -1,6 +1,6 @@
VERSION = 1
PATCHLEVEL = 2
-SUBLEVEL = 8
+SUBLEVEL = 9
ARCH = i386
diff -u --recursive --new-file v1.2.8/linux/arch/i386/kernel/process.c linux/arch/i386/kernel/process.c
--- v1.2.8/linux/arch/i386/kernel/process.c Wed Mar 1 08:43:07 1995
+++ linux/arch/i386/kernel/process.c Fri May 26 08:25:32 1995
@@ -45,13 +45,15 @@
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;
diff -u --recursive --new-file v1.2.8/linux/arch/i386/kernel/ptrace.c linux/arch/i386/kernel/ptrace.c
--- v1.2.8/linux/arch/i386/kernel/ptrace.c Sat Feb 25 15:36:18 1995
+++ linux/arch/i386/kernel/ptrace.c Tue May 30 12:17:18 1995
@@ -1,4 +1,3 @@
-#define THREE_LEVEL
/* ptrace.c */
/* By Ross Biro 1/23/92 */
/* edited by Linus Torvalds */
diff -u --recursive --new-file v1.2.8/linux/drivers/block/README.ide linux/drivers/block/README.ide
--- v1.2.8/linux/drivers/block/README.ide Sat Mar 18 12:45:45 1995
+++ linux/drivers/block/README.ide Thu Jun 1 11:23:04 1995
@@ -21,16 +21,34 @@
- 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
diff -u --recursive --new-file v1.2.8/linux/drivers/block/genhd.c linux/drivers/block/genhd.c
--- v1.2.8/linux/drivers/block/genhd.c Thu Jan 5 13:55:40 1995
+++ linux/drivers/block/genhd.c Fri May 26 08:23:33 1995
@@ -90,6 +90,7 @@
!(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);
diff -u --recursive --new-file v1.2.8/linux/drivers/block/ide-cd.c linux/drivers/block/ide-cd.c
--- v1.2.8/linux/drivers/block/ide-cd.c Sat Apr 29 12:42:21 1995
+++ linux/drivers/block/ide-cd.c Thu Jun 1 11:23:04 1995
@@ -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.
*
@@ -41,8 +41,13 @@
#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 @@
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. */
diff -u --recursive --new-file v1.2.8/linux/drivers/block/ide.c linux/drivers/block/ide.c
--- v1.2.8/linux/drivers/block/ide.c Tue Apr 4 09:05:34 1995
+++ linux/drivers/block/ide.c Thu Jun 1 11:23:04 1995
@@ -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)
*/
@@ -107,8 +107,22 @@
* 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
@@ -142,12 +156,15 @@
#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 */
@@ -158,9 +175,15 @@
#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
@@ -194,10 +217,17 @@
#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 @@
#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 @@
#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 @@
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 @@
{{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 */
/*
@@ -429,6 +466,50 @@
}
/*
+ * 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.
*/
static inline void start_ide_timer (byte hwif)
@@ -652,7 +733,7 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
} 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 @@
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 @@
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 @@
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 @@
{ \
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 @@
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 @@
} 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 @@
#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_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 @@
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 @@
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,10 +1731,20 @@
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 @@
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 @@
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 @@
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 @@
}
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 @@
#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 @@
{
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 @@
} 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 @@
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 */
diff -u --recursive --new-file v1.2.8/linux/drivers/char/cyclades.c linux/drivers/char/cyclades.c
--- v1.2.8/linux/drivers/char/cyclades.c Wed Mar 29 06:52:57 1995
+++ linux/drivers/char/cyclades.c Tue May 30 14:33:31 1995
@@ -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 @@
* 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>);
@@ -2637,6 +2640,17 @@
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);
diff -u --recursive --new-file v1.2.8/linux/drivers/net/loopback.c linux/drivers/net/loopback.c
--- v1.2.8/linux/drivers/net/loopback.c Wed Jan 4 21:16:05 1995
+++ linux/drivers/net/loopback.c Mon May 29 11:15:01 1995
@@ -71,12 +71,6 @@
dev->tbusy = 0;
- if (!intr_count && (bh_active & bh_mask)) {
- start_bh_atomic();
- do_bottom_half();
- end_bh_atomic();
- }
-
return(0);
}
diff -u --recursive --new-file v1.2.8/linux/drivers/scsi/ChangeLog linux/drivers/scsi/ChangeLog
--- v1.2.8/linux/drivers/scsi/ChangeLog Sat Apr 29 12:42:22 1995
+++ linux/drivers/scsi/ChangeLog Thu May 4 10:55:24 1995
@@ -2,7 +2,7 @@
* 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.
diff -u --recursive --new-file v1.2.8/linux/drivers/scsi/buslogic.c linux/drivers/scsi/buslogic.c
--- v1.2.8/linux/drivers/scsi/buslogic.c Mon May 29 11:16:08 1995
+++ linux/drivers/scsi/buslogic.c Tue May 30 14:33:32 1995
@@ -1555,7 +1555,7 @@
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
diff -u --recursive --new-file v1.2.8/linux/drivers/scsi/st.c linux/drivers/scsi/st.c
--- v1.2.8/linux/drivers/scsi/st.c Fri Apr 14 12:02:43 1995
+++ linux/drivers/scsi/st.c Tue May 30 14:33:31 1995
@@ -124,22 +124,22 @@
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
diff -u --recursive --new-file v1.2.8/linux/drivers/sound/.blurb linux/drivers/sound/.blurb
--- v1.2.8/linux/drivers/sound/.blurb Sun Nov 20 21:50:47 1994
+++ linux/drivers/sound/.blurb Tue May 30 13:20:32 1995
@@ -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 @@
* NEAREST LINUX FTP SITE AND CONTAINS ANSWER TO YOUR *
* PROBLEM. *
*********************************************************
-
-Hannu
diff -u --recursive --new-file v1.2.8/linux/fs/buffer.c linux/fs/buffer.c
--- v1.2.8/linux/fs/buffer.c Sat Apr 29 12:42:22 1995
+++ linux/fs/buffer.c Mon May 29 13:50:16 1995
@@ -973,7 +973,7 @@
}
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]);
}
diff -u --recursive --new-file v1.2.8/linux/fs/open.c linux/fs/open.c
--- v1.2.8/linux/fs/open.c Wed Feb 15 09:31:56 1995
+++ linux/fs/open.c Tue May 30 14:33:31 1995
@@ -277,6 +277,8 @@
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 @@
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 @@
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)
@@ -361,6 +369,10 @@
if (IS_RDONLY(inode)) {
iput(inode);
return -EROFS;
+ }
+ if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) {
+ iput(inode);
+ return -EPERM;
}
if (user == (uid_t) -1)
user = inode->i_uid;
diff -u --recursive --new-file v1.2.8/linux/fs/proc/array.c linux/fs/proc/array.c
--- v1.2.8/linux/fs/proc/array.c Sun Apr 9 11:59:57 1995
+++ linux/fs/proc/array.c Tue May 30 12:17:18 1995
@@ -1,4 +1,3 @@
-#define THREE_LEVEL
/*
* linux/fs/proc/array.c
*
diff -u --recursive --new-file v1.2.8/linux/fs/proc/mem.c linux/fs/proc/mem.c
--- v1.2.8/linux/fs/proc/mem.c Mon Feb 20 21:29:53 1995
+++ linux/fs/proc/mem.c Tue May 30 12:17:18 1995
@@ -1,4 +1,3 @@
-#define THREE_LEVEL
/*
* linux/fs/proc/mem.c
*
diff -u --recursive --new-file v1.2.8/linux/include/asm-i386/processor.h linux/include/asm-i386/processor.h
--- v1.2.8/linux/include/asm-i386/processor.h Fri Feb 24 16:41:01 1995
+++ linux/include/asm-i386/processor.h Mon May 29 11:13:40 1995
@@ -21,12 +21,6 @@
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.
diff -u --recursive --new-file v1.2.8/linux/include/linux/hdreg.h linux/include/linux/hdreg.h
--- v1.2.8/linux/include/linux/hdreg.h Thu Jan 5 13:47:08 1995
+++ linux/include/linux/hdreg.h Thu Jun 1 11:23:04 1995
@@ -78,12 +78,14 @@
#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 {
diff -u --recursive --new-file v1.2.8/linux/include/linux/interrupt.h linux/include/linux/interrupt.h
--- v1.2.8/linux/include/linux/interrupt.h Thu Jan 26 07:38:17 1995
+++ linux/include/linux/interrupt.h Mon May 29 11:13:51 1995
@@ -45,6 +45,18 @@
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:
*
diff -u --recursive --new-file v1.2.8/linux/include/linux/pci.h linux/include/linux/pci.h
--- v1.2.8/linux/include/linux/pci.h Sun Apr 9 11:59:57 1995
+++ linux/include/linux/pci.h Tue May 30 14:33:31 1995
@@ -388,7 +388,7 @@
{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"}, \
diff -u --recursive --new-file v1.2.8/linux/ipc/shm.c linux/ipc/shm.c
--- v1.2.8/linux/ipc/shm.c Wed Mar 29 06:53:00 1995
+++ linux/ipc/shm.c Tue May 30 12:17:18 1995
@@ -1,4 +1,3 @@
-#define THREE_LEVEL
/*
* linux/ipc/shm.c
* Copyright (C) 1992, 1993 Krishna Balasubramanian
diff -u --recursive --new-file v1.2.8/linux/kernel/module.c linux/kernel/module.c
--- v1.2.8/linux/kernel/module.c Tue Jan 31 09:36:21 1995
+++ linux/kernel/module.c Fri May 26 08:23:33 1995
@@ -745,7 +745,7 @@
link && (link != &kernel_module);
link = link->next) {
- if (link->ref->module == mp)
+ if (link->ref && (link->ref->module == mp))
link->ref = newref++;
}
diff -u --recursive --new-file v1.2.8/linux/kernel/resource.c linux/kernel/resource.c
--- v1.2.8/linux/kernel/resource.c Fri Jan 13 09:20:31 1995
+++ linux/kernel/resource.c Thu Jun 1 08:49:37 1995
@@ -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;
diff -u --recursive --new-file v1.2.8/linux/mm/filemap.c linux/mm/filemap.c
--- v1.2.8/linux/mm/filemap.c Tue Feb 14 08:39:06 1995
+++ linux/mm/filemap.c Tue May 30 12:17:18 1995
@@ -1,4 +1,3 @@
-#define THREE_LEVEL
/*
* linux/mm/filemmap.c
*
diff -u --recursive --new-file v1.2.8/linux/mm/memory.c linux/mm/memory.c
--- v1.2.8/linux/mm/memory.c Sun Apr 9 11:59:57 1995
+++ linux/mm/memory.c Tue May 30 12:17:18 1995
@@ -1,4 +1,3 @@
-#define THREE_LEVEL
/*
* linux/mm/memory.c
*
diff -u --recursive --new-file v1.2.8/linux/mm/mprotect.c linux/mm/mprotect.c
--- v1.2.8/linux/mm/mprotect.c Tue Feb 14 08:39:06 1995
+++ linux/mm/mprotect.c Tue May 30 12:17:18 1995
@@ -1,4 +1,3 @@
-#define THREE_LEVEL
/*
* linux/mm/mprotect.c
*
diff -u --recursive --new-file v1.2.8/linux/mm/swap.c linux/mm/swap.c
--- v1.2.8/linux/mm/swap.c Fri Apr 28 11:10:56 1995
+++ linux/mm/swap.c Tue May 30 12:17:18 1995
@@ -1,4 +1,3 @@
-#define THREE_LEVEL
/*
* linux/mm/swap.c
*
diff -u --recursive --new-file v1.2.8/linux/mm/vmalloc.c linux/mm/vmalloc.c
--- v1.2.8/linux/mm/vmalloc.c Thu Feb 9 18:22:18 1995
+++ linux/mm/vmalloc.c Tue May 30 12:17:18 1995
@@ -1,4 +1,3 @@
-#define THREE_LEVEL
/*
* linux/mm/vmalloc.c
*
diff -u --recursive --new-file v1.2.8/linux/net/inet/af_inet.c linux/net/inet/af_inet.c
--- v1.2.8/linux/net/inet/af_inet.c Thu Mar 9 20:37:36 1995
+++ linux/net/inet/af_inet.c Fri May 26 08:23:32 1995
@@ -815,8 +815,8 @@
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 @@
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)
{
diff -u --recursive --new-file v1.2.8/linux/net/inet/dev.c linux/net/inet/dev.c
--- v1.2.8/linux/net/inet/dev.c Thu Mar 9 20:37:37 1995
+++ linux/net/inet/dev.c Mon May 29 11:10:05 1995
@@ -337,7 +337,9 @@
* 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 @@
}
}
}
+ 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
diff -u --recursive --new-file v1.2.8/linux/net/inet/ip.c linux/net/inet/ip.c
--- v1.2.8/linux/net/inet/ip.c Sun Apr 9 11:59:58 1995
+++ linux/net/inet/ip.c Tue May 30 14:33:31 1995
@@ -1489,7 +1489,8 @@
* (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 @@
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;
}
diff -u --recursive --new-file v1.2.8/linux/net/inet/tcp.c linux/net/inet/tcp.c
--- v1.2.8/linux/net/inet/tcp.c Mon May 29 11:16:09 1995
+++ linux/net/inet/tcp.c Fri May 26 08:23:33 1995
@@ -934,6 +934,8 @@
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 @@
return 1;
case SEL_EX:
- if (sk->err || sk->urg_data)
+ if (sk->urg_data)
return 1;
break;
}
diff -u --recursive --new-file v1.2.8/linux/net/unix/sock.c linux/net/unix/sock.c
--- v1.2.8/linux/net/unix/sock.c Thu Mar 9 20:37:37 1995
+++ linux/net/unix/sock.c Tue May 30 12:23:57 1995
@@ -481,7 +481,7 @@
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)
{
diff -u --recursive --new-file v1.2.8/linux/versions.mk linux/versions.mk
--- v1.2.8/linux/versions.mk Mon Jan 23 10:38:28 1995
+++ linux/versions.mk Thu Jun 1 11:53:40 1995
@@ -11,11 +11,14 @@
.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