From 83257356d1057ff60039430d09d7d2c338b55b0b Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Fri, 23 Nov 2007 15:11:10 -0500 Subject: [PATCH] Import 2.0.5 --- CREDITS | 14 ++--- Documentation/devices.tex | 28 ++++++++-- Documentation/devices.txt | 20 ++++++-- Makefile | 2 +- arch/alpha/boot/Makefile | 2 +- arch/alpha/config.in | 2 +- arch/alpha/kernel/apecs.c | 67 +++++++++++++++++------- arch/alpha/kernel/irq.c | 41 +++++++++++++-- arch/i386/boot/tools/build.c | 28 ++++++++-- drivers/block/ide-cd.c | 4 +- drivers/cdrom/cdrom.c | 6 +-- drivers/net/de4x5.c | 6 +-- drivers/scsi/README.ncr53c8xx | 18 +++++-- drivers/scsi/eata.c | 28 +++++++--- drivers/scsi/eata.h | 2 +- drivers/scsi/ncr53c8xx.c | 2 +- drivers/scsi/qlogicisp.c | 2 +- drivers/scsi/scsi.c | 31 ++++++++--- drivers/scsi/sd.c | 6 +-- drivers/scsi/u14-34f.c | 32 +++++++++--- drivers/scsi/u14-34f.h | 2 +- drivers/sound/gus_wave.c | 4 +- drivers/sound/sb_common.c | 13 ++--- fs/ext2/namei.c | 22 +++++--- fs/ncpfs/sock.c | 2 +- include/asm-alpha/apecs.h | 96 +++++++++++++++++++++++++++++++++++ include/linux/dirent.h | 2 +- include/linux/socket.h | 1 + mm/vmscan.c | 4 +- net/ipv4/ip_output.c | 2 + net/ipv4/ip_sockglue.c | 21 ++++---- scripts/Menuconfig | 22 +++++--- 32 files changed, 412 insertions(+), 120 deletions(-) diff --git a/CREDITS b/CREDITS index d7e1d2fe0ccf..963f2fe28ce2 100644 --- a/CREDITS +++ b/CREDITS @@ -26,9 +26,11 @@ S: CH-1015 Lausanne S: Switzerland N: H. Peter Anvin -E: Peter.Anvin@linux.org +E: hpa@zytor.com +W: http://www.zytor.com/~hpa/ +P: 2047/2A960705 BA 03 D3 2C 14 A8 A8 BD 1E DF FE 69 EE 35 BD 74 D: Author of the SYSLINUX boot loader, maintainer of the linux.* news -D: hierarchy, responsible for various console and other hacks +D: hierarchy and the Linux Device List; various kernel hacks S: 4390 Albany Dr. #46 S: San Jose CA 95129 S: USA @@ -886,11 +888,11 @@ S: Germany N: Nigel Metheringham E: Nigel.Metheringham@ThePLAnet.net +P: 1024/31455639 B7 99 BD B8 00 17 BD 46 C1 15 B8 AB 87 BC 25 FA D: IP Masquerading work and minor fixes S: Planet Online S: The White House, Melbourne Street, LEEDS S: LS2 7PS, UK -P: 1024/31455639 B7 99 BD B8 00 17 BD 46 C1 15 B8 AB 87 BC 25 FA N: Craig Metz E: cmetz@tjhsst.edu @@ -1242,8 +1244,8 @@ S: USA N: Leo Spiekman E: spiekman@et.tudelft.nl -D: Optics Storage 8000AT cdrom driver W: http://dutettk.et.tudelft.nl/~spiekman +D: Optics Storage 8000AT cdrom driver S: Utrecht S: The Netherlands @@ -1258,13 +1260,13 @@ S: DK-1860 Frederiksberg C S: Denmark N: Drew Sullivan -W: http://www.ss.org/ E: drew@ss.org +W: http://www.ss.org/ +P: 1024/ACFFA969 5A 9C 42 AB E4 24 82 31 99 56 00 BF D3 2B 25 46 D: iBCS2 developer S: 22 Irvington Cres. S: Willowdale, Ontario S: Canada M2N 2Z1 -P: 1024/ACFFA969 5A 9C 42 AB E4 24 82 31 99 56 00 BF D3 2B 25 46 N: Tommy Thorn E: Tommy.Thorn@irisa.fr diff --git a/Documentation/devices.tex b/Documentation/devices.tex index 6f933dd0e27e..4b5521b4813c 100644 --- a/Documentation/devices.tex +++ b/Documentation/devices.tex @@ -42,7 +42,7 @@ foo \kill}% % \title{{\bf Linux Allocated Devices}} \author{Maintained by H. Peter Anvin $<$hpa@zytor.com$>$} -\date{Last revised: June 9, 1996} +\date{Last revised: July 9, 1996} \maketitle % \noindent @@ -64,7 +64,9 @@ To have a major number allocated, or a minor number in situations where that applies (e.g.\ busmice), please contact me with the appropriate device information. Also, if you have additional information regarding any of the devices listed below, or if I have -made a mistake, I would greatly appreciate a note. +made a mistake, I would greatly appreciate a note. When sending me +mail, please include the word ``device'' in the subject so your mail +won't accidentally get buried! Allocations marked (68k/Amiga) apply to Linux/68k on the Amiga platform only. Allocations marked (68k/Atari) apply to Linux/68k on @@ -163,6 +165,7 @@ reply. \major{40}{}{char }{Matrox Meteor frame grabber} \major{ }{}{block}{Syquest EZ135 parallel port removable drive} \major{41}{}{char }{Yet Another Micro Monitor} +\major{ }{}{block}{MicroSolutions BackPack parallel port CD-ROM} \major{42}{}{}{Demo/sample use} \major{43}{}{char }{isdn4linux virtual modem} \major{44}{}{char }{isdn4linux virtual modem -- alternate devices} @@ -175,7 +178,8 @@ reply. \major{51}{}{char }{Baycom radio modem} \major{52}{}{char }{Spellcaster DataComm/BRI ISDN card} \major{53}{}{char }{BDM interface for remote debugging MC683xx microcontrollers} -\major{54}{--59}{}{Unallocated} +\major{54}{}{char }{Electrocardiognosis Holter serial card} +\major{55}{--59}{}{Unallocated} \major{60}{--63}{}{Local/experimental use} \major{64}{--119}{}{Unallocated} \major{120}{--127}{}{Local/experimental use} @@ -460,6 +464,7 @@ physical disks. \minor{136}{/dev/qcam0}{QuickCam on {\file lp0}} \minor{137}{/dev/qcam1}{QuickCam on {\file lp1}} \minor{138}{/dev/qcam2}{QuickCam on {\file lp2}} + \minor{139}{/dev/openprom}{SPARC OpenBoot PROM} \end{devicelist} \noindent @@ -989,6 +994,9 @@ Partitions are handled the same way as for IDE disks (see major number \begin{devicelist} \major{41}{}{char }{Yet Another Micro Monitor} \minor{0}{/dev/yamm}{Yet Another Micro Monitor} +\\ +\major{ }{}{block}{MicroSolutions BackPack parallel port CD-ROM} + \minor{0}{/dev/bpcd}{BackPack CD-ROM} \end{devicelist} \begin{devicelist} @@ -1096,7 +1104,19 @@ interface. PD is the Motorola Public Domain Interface and ICD is the commercial interface by P\&E. \begin{devicelist} -\major{54}{--59}{}{Unallocated} +\major{54}{Electrocardiognosis Holter serial card} + \minor{0}{/dev/holter0}{First Holter port} + \minor{1}{/dev/holter1}{Second Holter port} + \minor{2}{/dev/holter2}{Third Holter port} +\end{devicelist} + +\noindent +A custom serial card used by Electrocardiognosis SRL +$<$mseritan@ottonel.pub.ro$>$ to transfer data from Holter 24-hour +heart monitoring equipment. + +\begin{devicelist} +\major{55}{--59}{}{Unallocated} \end{devicelist} \begin{devicelist} diff --git a/Documentation/devices.txt b/Documentation/devices.txt index d56c6e175af2..81fbd64d58f7 100644 --- a/Documentation/devices.txt +++ b/Documentation/devices.txt @@ -2,7 +2,7 @@ Maintained by H. Peter Anvin - Last revised: June 9, 1996 + Last revised: July 9, 1996 This list is the successor to Rick Miller's Linux Device List, which he stopped maintaining when he got busy with other things in 1993. It @@ -21,7 +21,9 @@ To have a major number allocated, or a minor number in situations where that applies (e.g. busmice), please contact me with the appropriate device information. Also, if you have additional information regarding any of the devices listed below, or if I have -made a mistake, I would greatly appreciate a note. +made a mistake, I would greatly appreciate a note. When sending me +mail, please include the word "device" in the subject so your mail +won't accidentally get buried! Allocations marked (68k/Amiga) apply to Linux/68k on the Amiga platform only. Allocations marked (68k/Atari) apply to Linux/68k on @@ -278,6 +280,7 @@ reply. 136 = /dev/qcam0 QuickCam on lp0 137 = /dev/qcam1 QuickCam on lp1 138 = /dev/qcam2 QuickCam on lp2 + 139 = /dev/openprom SPARC OpenBoot PROM 11 char Raw keyboard device 0 = /dev/kbd Raw keyboard device @@ -689,6 +692,8 @@ reply. 41 char Yet Another Micro Monitor 0 = /dev/yamm Yet Another Micro Monitor + block MicroSolutions BackPack parallel port CD-ROM + 0 = /dev/bpcd BackPack CD-ROM 42 Demo/sample use @@ -771,7 +776,16 @@ reply. Domain Interface and ICD is the commercial interface by P&E. - 54-59 UNALLOCATED + 54 char Electrocardiognosis Holter serial card + 0 = /dev/holter0 First Holter port + 1 = /dev/holter1 Second Holter port + 2 = /dev/holter2 Third Holter port + + A custom serial card used by Electrocardiognosis SRL + to transfer data from Holter + 24-hour heart monitoring equipment. + + 55-59 UNALLOCATED 60-63 LOCAL/EXPERIMENTAL USE Allocated for local/experimental use. For devices not diff --git a/Makefile b/Makefile index 72e306793c5b..b06d45e486f9 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ VERSION = 2 PATCHLEVEL = 0 -SUBLEVEL = 4 +SUBLEVEL = 5 ARCH = i386 diff --git a/arch/alpha/boot/Makefile b/arch/alpha/boot/Makefile index eb4125f2e637..f962ce15fe50 100644 --- a/arch/alpha/boot/Makefile +++ b/arch/alpha/boot/Makefile @@ -56,7 +56,7 @@ vmlinux.nh: tools/build vmlinux: $(TOPDIR)/vmlinux cp $(TOPDIR)/vmlinux vmlinux - quickstrip vmlinux + strip vmlinux tools/lxboot: tools/build tools/build > tools/lxboot diff --git a/arch/alpha/config.in b/arch/alpha/config.in index 436eb43b022b..22c60b1e4207 100644 --- a/arch/alpha/config.in +++ b/arch/alpha/config.in @@ -82,7 +82,7 @@ then define_bool CONFIG_ALPHA_AVANTI y fi -bool 'Echo console messages on /dev/ttyS1' CONFIG_SERIAL_ECHO +bool 'Echo console messages on /dev/ttyS0 (COM1)' CONFIG_SERIAL_ECHO if [ "$CONFIG_PCI" = "y" ]; then bool 'TGA Console Support' CONFIG_TGA_CONSOLE if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then diff --git a/arch/alpha/kernel/apecs.c b/arch/alpha/kernel/apecs.c index 28840eb3bd96..f4554bcc13a7 100644 --- a/arch/alpha/kernel/apecs.c +++ b/arch/alpha/kernel/apecs.c @@ -491,27 +491,30 @@ void apecs_machine_check(unsigned long vector, unsigned long la_ptr, struct pt_regs * regs) { struct el_common *mchk_header; + struct el_procdata *mchk_procdata; struct el_apecs_sysdata_mcheck *mchk_sysdata; + unsigned long *ptr; + int i; - mchk_header = (struct el_common *)la_ptr; + mchk_header = (struct el_common *)la_ptr; + mchk_procdata = (struct el_procdata *) + (la_ptr + mchk_header->proc_offset - sizeof(mchk_procdata->paltemp)); mchk_sysdata = (struct el_apecs_sysdata_mcheck *)(la_ptr + mchk_header->sys_offset); - DBG(("apecs_machine_check: vector=0x%lx la_ptr=0x%lx\n", vector, la_ptr)); - DBG((" pc=0x%lx size=0x%x procoffset=0x%x sysoffset 0x%x\n", - regs->pc, mchk_header->size, mchk_header->proc_offset, mchk_header->sys_offset)); - DBG(("apecs_machine_check: expected %d DCSR 0x%lx PEAR 0x%lx\n", - apecs_mcheck_expected, mchk_sysdata->epic_dcsr, mchk_sysdata->epic_pear)); #ifdef DEBUG - { - unsigned long *ptr; - int i; - - ptr = (unsigned long *)la_ptr; - for (i = 0; i < mchk_header->size / sizeof(long); i += 2) { + printk("apecs_machine_check: vector=0x%lx la_ptr=0x%lx\n", + vector, la_ptr); + printk(" pc=0x%lx size=0x%x procoffset=0x%x sysoffset 0x%x\n", + regs->pc, mchk_header->size, mchk_header->proc_offset, + mchk_header->sys_offset); + printk("apecs_machine_check: expected %d DCSR 0x%lx PEAR 0x%lx\n", + apecs_mcheck_expected, mchk_sysdata->epic_dcsr, + mchk_sysdata->epic_pear); + ptr = (unsigned long *)la_ptr; + for (i = 0; i < mchk_header->size / sizeof(long); i += 2) { printk(" +%lx %lx %lx\n", i*sizeof(long), ptr[i], ptr[i+1]); - } } #endif /* DEBUG */ @@ -520,9 +523,13 @@ void apecs_machine_check(unsigned long vector, unsigned long la_ptr, * ignore the machine check. */ #ifdef CONFIG_ALPHA_MIKASA - /* for now on MIKASA, if it was expected, ignore it */ - /* we need the details of the mcheck frame to really know... */ - if (apecs_mcheck_expected) { +#define MCHK_NO_DEVSEL 0x205L +#define MCHK_NO_TABT 0x204L + if (apecs_mcheck_expected && + (((unsigned int)mchk_procdata->paltemp[0] == MCHK_NO_DEVSEL) || + ((unsigned int)mchk_procdata->paltemp[0] == MCHK_NO_TABT)) + ) + { #else if (apecs_mcheck_expected && (mchk_sysdata->epic_dcsr && 0x0c00UL)) { #endif @@ -534,7 +541,33 @@ void apecs_machine_check(unsigned long vector, unsigned long la_ptr, wrmces(0x7); mb(); draina(); + DBG(("apecs_machine_check: EXPECTED\n")); + } + else if (vector == 0x620 || vector == 0x630) { + wrmces(0x1f); /* disable correctable from now on */ + mb(); + draina(); + printk("apecs_machine_check: HW correctable (0x%lx)\n", vector); + } + else { + printk("APECS machine check:\n"); + printk(" vector=0x%lx la_ptr=0x%lx\n", + vector, la_ptr); + printk(" pc=0x%lx size=0x%x procoffset=0x%x sysoffset 0x%x\n", + regs->pc, mchk_header->size, mchk_header->proc_offset, + mchk_header->sys_offset); + printk(" expected %d DCSR 0x%lx PEAR 0x%lx\n", + apecs_mcheck_expected, mchk_sysdata->epic_dcsr, + mchk_sysdata->epic_pear); + + ptr = (unsigned long *)la_ptr; + for (i = 0; i < mchk_header->size / sizeof(long); i += 2) { + printk(" +%lx %lx %lx\n", i*sizeof(long), ptr[i], ptr[i+1]); + } +#if 0 + /* doesn't work with MILO */ + show_regs(regs); +#endif } } - #endif /* CONFIG_ALPHA_APECS */ diff --git a/arch/alpha/kernel/irq.c b/arch/alpha/kernel/irq.c index 799068bd2de9..77e21e828fd6 100644 --- a/arch/alpha/kernel/irq.c +++ b/arch/alpha/kernel/irq.c @@ -446,6 +446,41 @@ static inline void cabriolet_and_eb66p_device_interrupt(unsigned long vector, restore_flags(flags); } +static inline void mikasa_device_interrupt(unsigned long vector, + struct pt_regs * regs) +{ + unsigned long pld; + unsigned int i; + unsigned long flags; + + save_flags(flags); + cli(); + + /* read the interrupt summary registers */ + pld = (((unsigned long) (~inw(0x534)) & 0x0000ffffUL) << 16) | + (((unsigned long) inb(0xa0)) << 8) | + ((unsigned long) inb(0x20)); + +#if 0 + printk("[0x%08lx]", pld); +#endif + + /* + * Now for every possible bit set, work through them and call + * the appropriate interrupt handler. + */ + while (pld) { + i = ffz(~pld); + pld &= pld - 1; /* clear least bit set */ + if (i < 16) { + isa_device_interrupt(vector, regs); + } else { + device_interrupt(i, i, regs); + } + } + restore_flags(flags); +} + static inline void eb66_and_eb64p_device_interrupt(unsigned long vector, struct pt_regs * regs) { @@ -622,12 +657,10 @@ asmlinkage void do_entInt(unsigned long type, unsigned long vector, unsigned lon srm_device_interrupt(vector, ®s); #elif NR_IRQS == 33 cabriolet_and_eb66p_device_interrupt(vector, ®s); +#elif defined(CONFIG_ALPHA_MIKASA) + mikasa_device_interrupt(vector, ®s); #elif NR_IRQS == 32 -# ifdef CONFIG_ALPHA_MIKASA -# error we got a problem here Charlie MIKASA should be SRM console -# else eb66_and_eb64p_device_interrupt(vector, ®s); -# endif #elif NR_IRQS == 16 isa_device_interrupt(vector, ®s); #endif diff --git a/arch/i386/boot/tools/build.c b/arch/i386/boot/tools/build.c index 85b6a72c479a..a7e9d063fef7 100644 --- a/arch/i386/boot/tools/build.c +++ b/arch/i386/boot/tools/build.c @@ -19,6 +19,7 @@ /* * Changes by tytso to allow root device specification * High loaded stuff by Hans Lermen & Werner Almesberger, Feb. 1996 + * Cross compiling fixes by Gertjan van Wingerde, July 1996 */ #include /* fprintf */ @@ -56,6 +57,7 @@ static int GCC_HEADER = sizeof(struct exec); #define STRINGIFY(x) #x typedef union { + int i; long l; short s[2]; char b[4]; @@ -72,6 +74,17 @@ long intel_long(long l) return t.l; } +int intel_int(int i) +{ + conv t; + + t.b[0] = i & 0xff; i >>= 8; + t.b[1] = i & 0xff; i >>= 8; + t.b[2] = i & 0xff; i >>= 8; + t.b[3] = i & 0xff; i >>= 8; + return t.i; +} + short intel_short(short l) { conv t; @@ -94,8 +107,8 @@ void usage(void) int main(int argc, char ** argv) { - int i,c,id, sz; - unsigned long sys_size; + int i,c,id,sz,tmp_int; + unsigned long sys_size, tmp_long; char buf[1024]; #ifndef __BFD__ struct exec *ex = (struct exec *)buf; @@ -180,12 +193,17 @@ int main(int argc, char ** argv) #ifdef __BIG_KERNEL__ { if (!i) { - if (*((long *)(&buf[2])) != 0x53726448 ) + /* Working with memcpy because of alignment constraints + on Sparc - Gertjan */ + memcpy(&tmp_long, &buf[2], sizeof(long)); + if (tmp_long != intel_long(0x53726448) ) die("Wrong magic in loader header of 'setup'"); - if (*((int *)(&buf[6])) < 0x200 ) + memcpy(&tmp_int, &buf[6], sizeof(int)); + if (tmp_int < intel_int(0x200)) die("Wrong version of loader header of 'setup'"); buf[0x11] = 1; /* LOADED_HIGH */ - *((long *)(&buf[0x14])) = 0x100000; /* code32_start */ + tmp_long = intel_long(0x100000); + memcpy(&buf[0x14], &tmp_long, sizeof(long)); /* code32_start */ } #endif if (write(1,buf,c)!=c) diff --git a/drivers/block/ide-cd.c b/drivers/block/ide-cd.c index a3c528ea9b99..ff447ca36265 100644 --- a/drivers/block/ide-cd.c +++ b/drivers/block/ide-cd.c @@ -104,6 +104,7 @@ * from Ben Galliart with * special help from Jeff Lightfoot * + * 3.15a July 9, 1996 -- Improved Sanyo 3 CD changer identification * * NOTE: Direct audio reads will only work on some types of drive. * So far, i've received reports of success for Sony and Toshiba drives. @@ -2657,7 +2658,8 @@ void ide_cdrom_setup (ide_drive_t *drive) /* Sanyo 3 CD changer uses a non-standard command for CD changing */ - else if (strcmp (drive->id->model, "CD-ROM CDR-C3 G") == 0) { + else if ((strcmp(drive->id->model, "CD-ROM CDR-C3 G") == 0) || + (strcmp(drive->id->model, "CD-ROM CDR-C3G") == 0)) { /* uses CD in slot 0 when value is set to 3 */ CDROM_STATE_FLAGS (drive)->sanyo_slot = 3; } diff --git a/drivers/cdrom/cdrom.c b/drivers/cdrom/cdrom.c index 2dd5c4e13e1b..366fc31402bb 100644 --- a/drivers/cdrom/cdrom.c +++ b/drivers/cdrom/cdrom.c @@ -457,7 +457,7 @@ int cdrom_ioctl(struct inode *ip, struct file *fp, } case CDROMPLAYMSF: { struct cdrom_msf msf; - GETARG(struct cdrom_mdf, msf); + GETARG(struct cdrom_msf, msf); return cdo->audio_ioctl(dev, cmd, &msf); } case CDROMPLAYTRKIND: { @@ -467,13 +467,13 @@ int cdrom_ioctl(struct inode *ip, struct file *fp, } case CDROMVOLCTRL: { struct cdrom_volctrl volume; - GETARG(struct cdrom_volctl, volume); + GETARG(struct cdrom_volctrl, volume); return cdo->audio_ioctl(dev, cmd, &volume); } case CDROMVOLREAD: { struct cdrom_volctrl volume; if (!cdo->audio_ioctl(dev, cmd, &volume)) { - PUTARG(struct cdrom_volctl, volume); + PUTARG(struct cdrom_volctrl, volume); return 0; } return -EINVAL; diff --git a/drivers/net/de4x5.c b/drivers/net/de4x5.c index a853b963655c..ae6a3c63fbeb 100644 --- a/drivers/net/de4x5.c +++ b/drivers/net/de4x5.c @@ -1918,12 +1918,8 @@ dc21040_autoconf(struct device *dev) break; case NC: -#ifndef __alpha__ + /* default to TP for all */ reset_init_sia(dev, 0x8f01, 0xffff, 0x0000); -#else - /* JAE: for Alpha, default to BNC/AUI, *not* TP */ - reset_init_sia(dev, 0x8f09, 0x0705, 0x0006); -#endif /* i386 */ if (lp->media != lp->c_media) { de4x5_dbg_media(dev); lp->c_media = lp->media; diff --git a/drivers/scsi/README.ncr53c8xx b/drivers/scsi/README.ncr53c8xx index f2bc90d32f60..1dff910ed6eb 100644 --- a/drivers/scsi/README.ncr53c8xx +++ b/drivers/scsi/README.ncr53c8xx @@ -29,6 +29,7 @@ Written by Gerard Roudier 14. Control commands under linux-1.2.13 15. Known problems 15.1 Tagged commands with Iomega Jaz device + 15.2 Tagged command queueing cannot be disabled at run time =============================================================================== @@ -189,8 +190,9 @@ Chip Device id Revision Id The profiling informations are updated upon completion of scsi commands. The data structure is allocated and zeroed when the host adapter is -attached. So, if the driver is a module you can reset the profiling data -by unloading and reloading the driver. +attached. So, if the driver is a module, the profile counters are cleared each +time the driver is loaded. +The "clearprof" command allow to clear these counters at any time. The following counters are available: ("num" prefix means "number of", "ms" means milli-seconds) @@ -290,6 +292,7 @@ Available commands: target: target number tags: number of concurrent tagged commands must not be greater than SCSI_NCR_MAX_TAGS (default: 4) + must not be lower that 1 (see: known problems) 8.4 Set order type for tagged command @@ -316,10 +319,10 @@ Available commands: tiny: print minimal debugging informations timing: print timing informations of the ncr chip. nego: print informations about scsi negotiations - phase: printf informations on script interruptions + phase: print informations on script interruptions -8.5 Clear profile counters +8.6 Clear profile counters clearprof @@ -556,5 +559,12 @@ The other problems that may appear are timeouts. The only way to avoid timeouts seems to edit linux/drivers/scsi/sd.c and to increase the current timeout values. +15.2 Tagged command queuing cannot be disabled at run time + +Once Tagged command queuing has been enabled, the driver will not allow to +disable this feature ("settags 0" is not supported). +This problem is due to some limitations of the code added to the Linux version +of the driver. + =============================================================================== End of NCR53C8XX driver README file diff --git a/drivers/scsi/eata.c b/drivers/scsi/eata.c index d1a6e30e305a..258be2a5f51f 100644 --- a/drivers/scsi/eata.c +++ b/drivers/scsi/eata.c @@ -1,6 +1,9 @@ /* * eata.c - Low-level driver for EATA/DMA SCSI host adapters. * + * 09 Jul 1996 rev. 2.11 for linux 2.0.4 + * Number of internal retries is now limited. + * * 16 Apr 1996 rev. 2.10 for linux 1.3.90 * New argument "reset_flags" to the reset routine. * @@ -156,6 +159,7 @@ struct proc_dir_entry proc_scsi_eata2x = { #define MAX_BOARDS 18 #define MAX_MAILBOXES 64 #define MAX_SGLIST 64 +#define MAX_INTERNAL_RETRIES 64 #define MAX_CMD_PER_LUN 2 #define FALSE 0 @@ -313,6 +317,8 @@ struct hostdata { int in_reset; /* True if board is doing a reset */ int target_time_out[MAX_TARGET]; /* N. of timeout errors on target */ int target_reset[MAX_TARGET]; /* If TRUE redo operation on target */ + unsigned int retries; /* Number of internal retries */ + unsigned long last_retried_pid; /* Pid of last retried command */ unsigned char subversion; /* Bus type, either ISA or ESA */ unsigned char protocol_rev; /* EATA 2.0 rev., 'A' or 'B' or 'C' */ struct mssp sp[MAX_MAILBOXES]; /* Returned status for this board */ @@ -802,6 +808,8 @@ int eata2x_reset (Scsi_Cmnd *SCarg, unsigned int reset_flags) { return SCSI_RESET_ERROR; } + HD(j)->retries = 0; + for (k = 0; k < MAX_TARGET; k++) HD(j)->target_reset[k] = TRUE; for (k = 0; k < MAX_TARGET; k++) HD(j)->target_time_out[k] = 0; @@ -1008,6 +1016,8 @@ static void eata2x_interrupt_handler(int irq, void *dev_id, struct pt_regs * reg HD(j)->target_time_out[SCpnt->target] = 0; + if (HD(j)->last_retried_pid == SCpnt->pid) HD(j)->retries = 0; + break; case ASST: /* Selection Time Out */ case 0x02: /* Command Time Out */ @@ -1020,17 +1030,23 @@ static void eata2x_interrupt_handler(int irq, void *dev_id, struct pt_regs * reg } break; + + /* Perform a limited number of internal retries */ case 0x03: /* SCSI Bus Reset Received */ case 0x04: /* Initial Controller Power-up */ - if (SCpnt->device->type != TYPE_TAPE) - status = DID_BUS_BUSY << 16; - else - status = DID_ERROR << 16; - for (k = 0; k < MAX_TARGET; k++) HD(j)->target_reset[k] = TRUE; + if (SCpnt->device->type != TYPE_TAPE + && HD(j)->retries < MAX_INTERNAL_RETRIES) { + status = DID_BUS_BUSY << 16; + HD(j)->retries++; + HD(j)->last_retried_pid = SCpnt->pid; + } + else + status = DID_ERROR << 16; + break; case 0x07: /* Bus Parity Error */ case 0x0c: /* Controller Ram Parity */ @@ -1058,7 +1074,7 @@ static void eata2x_interrupt_handler(int irq, void *dev_id, struct pt_regs * reg spp->adapter_status != ASST && HD(j)->iocount <= 1000) || do_trace) #endif - printk("%s: ihdlr, mbox %d, err 0x%x:%x,"\ + printk("%s: ihdlr, mbox %2d, err 0x%x:%x,"\ " target %d:%d, pid %ld, count %d.\n", BN(j), i, spp->adapter_status, spp->target_status, SCpnt->target, SCpnt->lun, SCpnt->pid, HD(j)->iocount); diff --git a/drivers/scsi/eata.h b/drivers/scsi/eata.h index 139a88ec0015..00486c97f97d 100644 --- a/drivers/scsi/eata.h +++ b/drivers/scsi/eata.h @@ -11,7 +11,7 @@ int eata2x_queuecommand(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *)); int eata2x_abort(Scsi_Cmnd *); int eata2x_reset(Scsi_Cmnd *, unsigned int); -#define EATA_VERSION "2.10.00" +#define EATA_VERSION "2.11.00" #define EATA { \ diff --git a/drivers/scsi/ncr53c8xx.c b/drivers/scsi/ncr53c8xx.c index ee08fa11e7bb..02f6fecf65e9 100644 --- a/drivers/scsi/ncr53c8xx.c +++ b/drivers/scsi/ncr53c8xx.c @@ -8165,7 +8165,7 @@ printf("ncr_user_command: retv=%d\n", retv); #endif } else { - if (*start) + if (start) *start = buffer; retv = ncr_host_info(ncb, buffer, offset, length); } diff --git a/drivers/scsi/qlogicisp.c b/drivers/scsi/qlogicisp.c index c0537bc9c8f7..324969f7dddc 100644 --- a/drivers/scsi/qlogicisp.c +++ b/drivers/scsi/qlogicisp.c @@ -63,7 +63,7 @@ the latest firmware provided by QLogic. This may be an earlier/later revision than supplied by your board. */ -#define RELOAD_FIRMWARE 0 +#define RELOAD_FIRMWARE 1 /* Set the following macro to 1 to reload the ISP1020's defaults from nvram. If you are not sure of your settings, leave this alone, the driver will diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c index 62f35cbace32..24e5633ebe3d 100644 --- a/drivers/scsi/scsi.c +++ b/drivers/scsi/scsi.c @@ -92,7 +92,7 @@ static int update_timeout (Scsi_Cmnd *, int); static void print_inquiry(unsigned char *data); static void scsi_times_out (Scsi_Cmnd * SCpnt); static int scan_scsis_single (int channel,int dev,int lun,int * max_scsi_dev , - Scsi_Device ** SDpnt, Scsi_Cmnd * SCpnt, + int * sparse_lun, Scsi_Device ** SDpnt, Scsi_Cmnd * SCpnt, struct Scsi_Host *shpnt, char * scsi_result); void scsi_build_commandblocks(Scsi_Device * SDpnt); @@ -226,6 +226,7 @@ static void scsi_dump_status(void); #define BLIST_KEY 0x08 #define BLIST_SINGLELUN 0x10 #define BLIST_NOTQ 0x20 +#define BLIST_SPARSELUN 0x40 struct dev_info{ const char * vendor; @@ -292,7 +293,8 @@ static struct dev_info device_list[] = {"NRC","MBR-7","*", BLIST_FORCELUN | BLIST_SINGLELUN}, {"PIONEER","CD-ROM DRM-602X","*", BLIST_FORCELUN | BLIST_SINGLELUN}, {"PIONEER","CD-ROM DRM-604X","*", BLIST_FORCELUN | BLIST_SINGLELUN}, -{"EMULEX","MD21/S2 ESDI","*",BLIST_SINGLELUN}, +{"EMULEX","MD21/S2 ESDI","*", BLIST_SINGLELUN}, +{"CANON","IPUBJD","*", BLIST_SPARSELUN}, /* * Must be at end of list... */ @@ -415,7 +417,7 @@ static void scan_scsis (struct Scsi_Host *shpnt, unchar hardcoded, unsigned char scsi_result0[256]; unsigned char *scsi_result; Scsi_Device *SDpnt; - int max_dev_lun; + int max_dev_lun, sparse_lun; Scsi_Cmnd *SCpnt; SCpnt = (Scsi_Cmnd *) scsi_init_malloc (sizeof (Scsi_Cmnd), GFP_ATOMIC | GFP_DMA); @@ -449,8 +451,8 @@ static void scan_scsis (struct Scsi_Host *shpnt, unchar hardcoded, if(dev >= shpnt->max_id) goto leave; lun = hlun; if(lun >= shpnt->max_lun) goto leave; - scan_scsis_single (channel, dev, lun, &max_dev_lun, - &SDpnt, SCpnt, shpnt, scsi_result); + scan_scsis_single (channel, dev, lun, &max_dev_lun, &sparse_lun, + &SDpnt, SCpnt, shpnt, scsi_result); if(SDpnt!=oldSDpnt) { /* it could happen the blockdevice hasn't yet been inited */ @@ -483,9 +485,12 @@ static void scan_scsis (struct Scsi_Host *shpnt, unchar hardcoded, */ max_dev_lun = (max_scsi_luns < shpnt->max_lun ? max_scsi_luns : shpnt->max_lun); + sparse_lun = 0; for (lun = 0; lun < max_dev_lun; ++lun) { if (!scan_scsis_single (channel, dev, lun, &max_dev_lun, - &SDpnt, SCpnt, shpnt, scsi_result)) + &sparse_lun, &SDpnt, SCpnt, shpnt, + scsi_result) + && !sparse_lun) break; /* break means don't probe further for luns!=0 */ } /* for lun ends */ } /* if this_id != id ends */ @@ -528,8 +533,8 @@ static void scan_scsis (struct Scsi_Host *shpnt, unchar hardcoded, * Global variables used : scsi_devices(linked list) */ int scan_scsis_single (int channel, int dev, int lun, int *max_dev_lun, - Scsi_Device **SDpnt2, Scsi_Cmnd * SCpnt, struct Scsi_Host * shpnt, - char *scsi_result) + int *sparse_lun, Scsi_Device **SDpnt2, Scsi_Cmnd * SCpnt, + struct Scsi_Host * shpnt, char *scsi_result) { unsigned char scsi_cmd[12]; struct Scsi_Device_Template *sdtpnt; @@ -795,6 +800,16 @@ int scan_scsis_single (int channel, int dev, int lun, int *max_dev_lun, if (bflags & BLIST_SINGLELUN) SDpnt->single_lun = 1; + /* + * If this device is known to support sparse multiple units, override the + * other settings, and scan all of them. + */ + if (bflags & BLIST_SPARSELUN) { + *max_dev_lun = 8; + *sparse_lun = 1; + return 1; + } + /* * If this device is known to support multiple units, override the other * settings, and scan all of them. diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index c3eed8117d20..f6d991f1f557 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -1054,7 +1054,7 @@ static int sd_init_onedisk(int i) * Issue command to spin up drive for these cases. */ if(the_result && !rscsi_disks[i].device->removable && SCpnt->sense_buffer[2] == NOT_READY) { - int time1; + unsigned long time1; if(!spintime){ printk( "sd%c: Spinning up disk...", 'a' + i ); cmd[0] = START_STOP; @@ -1081,8 +1081,8 @@ static int sd_init_onedisk(int i) spintime = jiffies; } - time1 = jiffies; - while(jiffies < time1 + HZ); /* Wait 1 second for next try */ + time1 = jiffies + HZ; + while(jiffies < time1); /* Wait 1 second for next try */ printk( "." ); } } while(the_result && spintime && spintime+100*HZ > jiffies); diff --git a/drivers/scsi/u14-34f.c b/drivers/scsi/u14-34f.c index 8ef7aafb1dc6..ffd39202a3bc 100644 --- a/drivers/scsi/u14-34f.c +++ b/drivers/scsi/u14-34f.c @@ -1,6 +1,10 @@ /* * u14-34f.c - Low-level driver for UltraStor 14F/34F SCSI host adapters. * + * 09 Jul 1996 rev. 2.11 for linux 2.0.4 + * "Data over/under-run" no longer implies a redo on all targets. + * Number of internal retries is now limited. + * * 16 Apr 1996 rev. 2.10 for linux 1.3.90 * New argument "reset_flags" to the reset routine. * @@ -199,6 +203,7 @@ struct proc_dir_entry proc_scsi_u14_34f = { #define MAX_MAILBOXES 16 #define MAX_SGLIST 32 #define MAX_SAFE_SGLIST 16 +#define MAX_INTERNAL_RETRIES 64 #define MAX_CMD_PER_LUN 2 #define FALSE 0 @@ -280,6 +285,8 @@ struct hostdata { int in_reset; /* True if board is doing a reset */ int target_time_out[MAX_TARGET]; /* N. of timeout errors on target */ int target_reset[MAX_TARGET]; /* If TRUE redo operation on target */ + unsigned int retries; /* Number of internal retries */ + unsigned long last_retried_pid; /* Pid of last retried command */ unsigned char subversion; /* Bus type, either ISA or ESA */ unsigned char heads; unsigned char sectors; @@ -763,6 +770,8 @@ int u14_34f_reset(Scsi_Cmnd * SCarg, unsigned int reset_flags) { return SCSI_RESET_ERROR; } + HD(j)->retries = 0; + for (k = 0; k < MAX_TARGET; k++) HD(j)->target_reset[k] = TRUE; for (k = 0; k < MAX_TARGET; k++) HD(j)->target_time_out[k] = 0; @@ -972,6 +981,8 @@ static void u14_34f_interrupt_handler(int irq, void *dev_id, struct pt_regs * re HD(j)->target_time_out[SCpnt->target] = 0; + if (HD(j)->last_retried_pid == SCpnt->pid) HD(j)->retries = 0; + break; case ASST: /* Selection Time Out */ @@ -983,20 +994,27 @@ static void u14_34f_interrupt_handler(int irq, void *dev_id, struct pt_regs * re } break; - case 0x92: /* Data over/under-run */ + + /* Perform a limited number of internal retries */ case 0x93: /* Unexpected bus free */ case 0x94: /* Target bus phase sequence failure */ case 0x96: /* Illegal SCSI command */ case 0xa3: /* SCSI bus reset error */ - if (SCpnt->device->type != TYPE_TAPE) - status = DID_BUS_BUSY << 16; - else - status = DID_ERROR << 16; - for (k = 0; k < MAX_TARGET; k++) HD(j)->target_reset[k] = TRUE; + case 0x92: /* Data over/under-run */ + + if (SCpnt->device->type != TYPE_TAPE + && HD(j)->retries < MAX_INTERNAL_RETRIES) { + status = DID_BUS_BUSY << 16; + HD(j)->retries++; + HD(j)->last_retried_pid = SCpnt->pid; + } + else + status = DID_ERROR << 16; + break; case 0x01: /* Invalid command */ case 0x02: /* Invalid parameters */ @@ -1023,7 +1041,7 @@ static void u14_34f_interrupt_handler(int irq, void *dev_id, struct pt_regs * re spp->adapter_status != ASST && HD(j)->iocount <= 1000) || do_trace) #endif - printk("%s: ihdlr, mbox %d, err 0x%x:%x,"\ + printk("%s: ihdlr, mbox %2d, err 0x%x:%x,"\ " target %d:%d, pid %ld, count %d.\n", BN(j), i, spp->adapter_status, spp->target_status, SCpnt->target, SCpnt->lun, SCpnt->pid, HD(j)->iocount); diff --git a/drivers/scsi/u14-34f.h b/drivers/scsi/u14-34f.h index 17de5e536920..a4dc31e850b5 100644 --- a/drivers/scsi/u14-34f.h +++ b/drivers/scsi/u14-34f.h @@ -10,7 +10,7 @@ int u14_34f_abort(Scsi_Cmnd *); int u14_34f_reset(Scsi_Cmnd *, unsigned int); int u14_34f_biosparam(Disk *, kdev_t, int *); -#define U14_34F_VERSION "2.10.00" +#define U14_34F_VERSION "2.11.00" #define ULTRASTOR_14_34F { \ NULL, /* Ptr for modules */ \ diff --git a/drivers/sound/gus_wave.c b/drivers/sound/gus_wave.c index d09440e18b09..2e076b900766 100644 --- a/drivers/sound/gus_wave.c +++ b/drivers/sound/gus_wave.c @@ -1549,7 +1549,7 @@ guswave_start_note2 (int dev, int voice, int note_num, int volume) gus_write_addr (0x02, sample_ptrs[sample] + samples[sample].loop_start, samples[sample].fractions & 0x0f, is16bits); /* Loop start location */ - gus_write_addr (0x04, sample_ptrs[sample] + samples[sample].len, + gus_write_addr (0x04, sample_ptrs[sample] + samples[sample].loop_end, (samples[sample].fractions >> 4) & 0x0f, is16bits); /* Loop end location */ } @@ -1560,7 +1560,7 @@ guswave_start_note2 (int dev, int voice, int note_num, int volume) voices[voice].loop_irq_parm = 1; gus_write_addr (0x02, sample_ptrs[sample], 0, is16bits); /* Loop start location */ - gus_write_addr (0x04, sample_ptrs[sample] + samples[sample].loop_end - 1, + gus_write_addr (0x04, sample_ptrs[sample] + samples[sample].len - 1, (samples[sample].fractions >> 4) & 0x0f, is16bits); /* Loop end location */ } diff --git a/drivers/sound/sb_common.c b/drivers/sound/sb_common.c index 9093d8cae1b9..307977b4d905 100644 --- a/drivers/sound/sb_common.c +++ b/drivers/sound/sb_common.c @@ -130,14 +130,14 @@ sbintr (int irq, void *dev_id, struct pt_regs *dummy) sb_devc *devc = irq2devc[irq]; - devc->irq_ok = 1; - if (devc == NULL || devc->irq != irq) { DEB (printk ("sbintr: Bogus interrupt IRQ%d\n", irq)); return; } + devc->irq_ok = 1; + if (devc->model == MDL_SB16) { @@ -671,10 +671,14 @@ sb_dsp_init (struct address_info *hw_config) devc->dev = num_audiodevs; devc->caps = hw_config->driver_use_1; + irq2devc[hw_config->irq] = devc; + devc->irq_ok = 0; + if (snd_set_irq_handler (hw_config->irq, sbintr, "sound blaster", devc->osp) < 0) { printk ("SB: Can't allocate IRQ%d\n", hw_config->irq); + irq2devc[hw_config->irq] = NULL; return; } @@ -697,9 +701,6 @@ sb_dsp_init (struct address_info *hw_config) } } - irq2devc[hw_config->irq] = devc; - devc->irq_ok = 0; - for (n = 0; n < 3 && devc->irq_ok == 0; n++) if (sb_dsp_command (devc, 0xf2)) /* Cause interrupt immediately */ { @@ -1173,7 +1174,7 @@ probe_sbmpu (struct address_info *hw_config) } hw_config->name = "Sound Blaster 16"; hw_config->irq = -devc->irq; - sb16_set_mpu_port(devc, hw_config) + sb16_set_mpu_port(devc, hw_config); break; case MDL_ESS: diff --git a/fs/ext2/namei.c b/fs/ext2/namei.c index a222a35edb7c..f15b5969bf47 100644 --- a/fs/ext2/namei.c +++ b/fs/ext2/namei.c @@ -163,10 +163,12 @@ int ext2_lookup (struct inode * dir, const char * name, int len, return -ENOENT; if (!S_ISDIR(dir->i_mode)) { iput (dir); - return -ENOENT; + return -ENOTDIR; } - if (len > EXT2_NAME_LEN) + if (len > EXT2_NAME_LEN) { + iput (dir); return -ENAMETOOLONG; + } if (dcache_lookup(dir, name, len, &ino)) { if (!ino) { iput(dir); @@ -407,8 +409,10 @@ int ext2_mknod (struct inode * dir, const char * name, int len, int mode, if (!dir) return -ENOENT; - if (len > EXT2_NAME_LEN) + if (len > EXT2_NAME_LEN) { + iput (dir); return -ENAMETOOLONG; + } bh = ext2_find_entry (dir, name, len, &de); if (bh) { brelse (bh); @@ -472,8 +476,10 @@ int ext2_mkdir (struct inode * dir, const char * name, int len, int mode) if (!dir) return -ENOENT; - if (len > EXT2_NAME_LEN) + if (len > EXT2_NAME_LEN) { + iput (dir); return -ENAMETOOLONG; + } bh = ext2_find_entry (dir, name, len, &de); if (bh) { brelse (bh); @@ -611,8 +617,10 @@ repeat: if (!dir) return -ENOENT; inode = NULL; - if (len > EXT2_NAME_LEN) + if (len > EXT2_NAME_LEN) { + iput (dir); return -ENAMETOOLONG; + } bh = ext2_find_entry (dir, name, len, &de); retval = -ENOENT; if (!bh) @@ -699,8 +707,10 @@ repeat: return -ENOENT; retval = -ENOENT; inode = NULL; - if (len > EXT2_NAME_LEN) + if (len > EXT2_NAME_LEN) { + iput (dir); return -ENAMETOOLONG; + } bh = ext2_find_entry (dir, name, len, &de); if (!bh) goto end_unlink; diff --git a/fs/ncpfs/sock.c b/fs/ncpfs/sock.c index 19e81a145617..0a4695c3ceec 100644 --- a/fs/ncpfs/sock.c +++ b/fs/ncpfs/sock.c @@ -599,7 +599,7 @@ ncp_request(struct ncp_server *server, int function) if (server->has_subfunction != 0) { - *(__u16 *)&(h->data[0]) = request_size - 2; + *(__u16 *)&(h->data[0]) = htons(request_size - 2); } h->type = NCP_REQUEST; diff --git a/include/asm-alpha/apecs.h b/include/asm-alpha/apecs.h index ca30123206a3..0f38c8aac920 100644 --- a/include/asm-alpha/apecs.h +++ b/include/asm-alpha/apecs.h @@ -414,6 +414,77 @@ extern unsigned long apecs_init (unsigned long mem_start, /* * Data structure for handling APECS machine checks: */ +#ifdef CONFIG_ALPHA_MIKASA +struct el_apecs_sysdata_mcheck { + unsigned long coma_gcr; + unsigned long coma_edsr; + unsigned long coma_ter; + unsigned long coma_elar; + unsigned long coma_ehar; + unsigned long coma_ldlr; + unsigned long coma_ldhr; + unsigned long coma_base0; + unsigned long coma_base1; + unsigned long coma_base2; + unsigned long coma_base3; + unsigned long coma_cnfg0; + unsigned long coma_cnfg1; + unsigned long coma_cnfg2; + unsigned long coma_cnfg3; + unsigned long epic_dcsr; + unsigned long epic_pear; + unsigned long epic_sear; + unsigned long epic_tbr1; + unsigned long epic_tbr2; + unsigned long epic_pbr1; + unsigned long epic_pbr2; + unsigned long epic_pmr1; + unsigned long epic_pmr2; + unsigned long epic_harx1; + unsigned long epic_harx2; + unsigned long epic_pmlt; + unsigned long epic_tag0; + unsigned long epic_tag1; + unsigned long epic_tag2; + unsigned long epic_tag3; + unsigned long epic_tag4; + unsigned long epic_tag5; + unsigned long epic_tag6; + unsigned long epic_tag7; + unsigned long epic_data0; + unsigned long epic_data1; + unsigned long epic_data2; + unsigned long epic_data3; + unsigned long epic_data4; + unsigned long epic_data5; + unsigned long epic_data6; + unsigned long epic_data7; + + unsigned long pceb_vid; + unsigned long pceb_did; + unsigned long pceb_revision; + unsigned long pceb_command; + unsigned long pceb_status; + unsigned long pceb_latency; + unsigned long pceb_control; + unsigned long pceb_arbcon; + unsigned long pceb_arbpri; + + unsigned long esc_id; + unsigned long esc_revision; + unsigned long esc_int0; + unsigned long esc_int1; + unsigned long esc_elcr0; + unsigned long esc_elcr1; + unsigned long esc_last_eisa; + unsigned long esc_nmi_stat; + + unsigned long pci_ir; + unsigned long pci_imr; + unsigned long svr_mgr; +}; +#else /* CONFIG_ALPHA_MIKASA */ +/* this for the normal APECS machines */ struct el_apecs_sysdata_mcheck { unsigned long coma_gcr; unsigned long coma_edsr; @@ -457,6 +528,31 @@ struct el_apecs_sysdata_mcheck { unsigned long epic_data6; unsigned long epic_data7; }; +#endif /* CONFIG_ALPHA_MIKASA */ + +struct el_procdata { + unsigned long paltemp[32]; /* PAL TEMP REGS. */ + /* EV4-specific fields */ + unsigned long exc_addr; /* Address of excepting instruction. */ + unsigned long exc_sum; /* Summary of arithmetic traps. */ + unsigned long exc_mask; /* Exception mask (from exc_sum). */ + unsigned long iccsr; /* IBox hardware enables. */ + unsigned long pal_base; /* Base address for PALcode. */ + unsigned long hier; /* Hardware Interrupt Enable. */ + unsigned long hirr; /* Hardware Interrupt Request. */ + unsigned long csr; /* D-stream fault info. */ + unsigned long dc_stat; /* D-cache status (ECC/Parity Err). */ + unsigned long dc_addr; /* EV3 Phys Addr for ECC/DPERR. */ + unsigned long abox_ctl; /* ABox Control Register. */ + unsigned long biu_stat; /* BIU Status. */ + unsigned long biu_addr; /* BUI Address. */ + unsigned long biu_ctl; /* BIU Control. */ + unsigned long fill_syndrome;/* For correcting ECC errors. */ + unsigned long fill_addr; /* Cache block which was being read */ + unsigned long va; /* Effective VA of fault or miss. */ + unsigned long bc_tag; /* Backup Cache Tag Probe Results.*/ +}; + #define RTC_PORT(x) (0x70 + (x)) #define RTC_ADDR(x) (0x80 | (x)) diff --git a/include/linux/dirent.h b/include/linux/dirent.h index 85356d1dd7ef..a18f7e4630e0 100644 --- a/include/linux/dirent.h +++ b/include/linux/dirent.h @@ -3,7 +3,7 @@ struct dirent { long d_ino; - off_t d_off; + __kernel_off_t d_off; unsigned short d_reclen; char d_name[256]; /* We must not include limits.h! */ }; diff --git a/include/linux/socket.h b/include/linux/socket.h index eb9ca7d6335c..d63a9046d9ef 100644 --- a/include/linux/socket.h +++ b/include/linux/socket.h @@ -102,6 +102,7 @@ struct msghdr #define IPTOS_LOWDELAY 0x10 #define IPTOS_THROUGHPUT 0x08 #define IPTOS_RELIABILITY 0x04 +#define IPTOS_MINCOST 0x02 #define IP_TTL 2 #define IP_HDRINCL 3 #define IP_OPTIONS 4 diff --git a/mm/vmscan.c b/mm/vmscan.c index b57d549e6519..1dbf36c35e39 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -109,7 +109,7 @@ static inline int try_to_swap_out(struct task_struct * tsk, struct vm_area_struc if (page_map->count != 1) return 0; if (!(entry = get_swap_page())) - return 0; + return -1; /* Aieee!!! Out of swap space! */ vma->vm_mm->rss--; flush_cache_page(vma, address); set_pte(page_table, __pte(entry)); @@ -312,6 +312,8 @@ static int swap_out(unsigned int priority, int dma, int wait) if (!--p->swap_cnt) swap_task++; switch (swap_out_process(p, dma, wait)) { + case -1: + return 0; case 0: if (p->swap_cnt) swap_task++; diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index a2c552e9ef7c..5449ada55214 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c @@ -842,6 +842,8 @@ int ip_build_xmit(struct sock *sk, NULL, NULL, 0)>0) skb->arp=1; } + else + skb->arp = 1; /* * Find where to start putting bytes. diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c index 157366716089..64884a9ee4fd 100644 --- a/net/ipv4/ip_sockglue.c +++ b/net/ipv4/ip_sockglue.c @@ -178,17 +178,18 @@ int ip_setsockopt(struct sock *sk, int level, int optname, char *optval, int opt kfree_s(old_opt, sizeof(struct optlen) + old_opt->optlen); return 0; } - case IP_TOS: /* This sets both TOS and Precedence */ - if (val<0 || val>63) /* Reject setting of unused bits */ + case IP_TOS: /* This sets both TOS and Precedence */ + if (val & ~0xfe) /* Reject setting of unused bits */ return -EINVAL; - if ((val&7) > 4 && !suser()) /* Only root can set Prec>4 */ + if ((val>>5) > 4 && !suser()) /* Only root can set Prec>4 */ return -EPERM; sk->ip_tos=val; - switch (val & 0x38) { + switch (val & 0x1E) { case IPTOS_LOWDELAY: sk->priority=SOPRI_INTERACTIVE; break; case IPTOS_THROUGHPUT: + case IPTOS_MINCOST: sk->priority=SOPRI_BACKGROUND; break; default: @@ -270,7 +271,6 @@ int ip_setsockopt(struct sock *sk, int level, int optname, char *optval, int opt * FIXME: Add/Del membership should have a semaphore protecting them from re-entry */ struct ip_mreq mreq; - __u32 route_src; struct rtable *rt; struct device *dev=NULL; @@ -295,9 +295,8 @@ int ip_setsockopt(struct sock *sk, int level, int optname, char *optval, int opt */ if((rt=ip_rt_route(mreq.imr_multiaddr.s_addr,0))!=NULL) { - dev=rt->rt_dev; - route_src = rt->rt_src; - atomic_dec(&rt->rt_use); + dev=rt->u.dst.dev; + atomic_dec(&rt->u.dst.use); ip_rt_put(rt); } } @@ -328,7 +327,6 @@ int ip_setsockopt(struct sock *sk, int level, int optname, char *optval, int opt { struct ip_mreq mreq; struct rtable *rt; - __u32 route_src; struct device *dev=NULL; /* @@ -349,9 +347,8 @@ int ip_setsockopt(struct sock *sk, int level, int optname, char *optval, int opt { if((rt=ip_rt_route(mreq.imr_multiaddr.s_addr,0))!=NULL) { - dev=rt->rt_dev; - atomic_dec(&rt->rt_use); - route_src = rt->rt_src; + dev=rt->u.dst.dev; + atomic_dec(&rt->u.dst.use); ip_rt_put(rt); } } diff --git a/scripts/Menuconfig b/scripts/Menuconfig index e34c186b1653..69d450e816a0 100644 --- a/scripts/Menuconfig +++ b/scripts/Menuconfig @@ -733,7 +733,7 @@ EOM # Create a menu item to load an alternate configuration file. # g_alt_config () { - echo -n "get_alt_config 'Load an Alternate Configuration File' "\ + echo -n "get_alt_config 'Load an Alternate Configuration File' "\ >>MCmenu } @@ -742,6 +742,8 @@ g_alt_config () { # configuration from it. # get_alt_config () { + set -f ## Switch file expansion OFF + while true do ALT_CONFIG="${ALT_CONFIG:-$DEFAULTS}" @@ -759,9 +761,9 @@ last retrieved. Leave blank to abort."\ [ "_" = "_$ALT_CONFIG" ] && break - if [ -r "$ALT_CONFIG" ] + if eval [ -r "$ALT_CONFIG" ] then - load_config_file "$ALT_CONFIG" + eval load_config_file "$ALT_CONFIG" break else echo -ne "\007" @@ -789,6 +791,7 @@ EOM fi done + set +f ## Switch file expansion ON rm -f help.out MCdialog.out } @@ -796,7 +799,7 @@ EOM # Create a menu item to store an alternate config file. # s_alt_config () { - echo -n "save_alt_config 'Store an Alternate Configuration File' "\ + echo -n "save_alt_config 'Save Configuration to an Alternate File' "\ >>MCmenu } @@ -805,6 +808,8 @@ s_alt_config () { # configuration to it. # save_alt_config () { + set -f ## Switch file expansion OFF + while true do $DIALOG --backtitle "$backtitle" \ @@ -818,10 +823,10 @@ as an alternate. Leave blank to abort."\ ALT_CONFIG=`cat MCdialog.out` [ "_" = "_$ALT_CONFIG" ] && break - - if touch $ALT_CONFIG 2>/dev/null + + if eval touch $ALT_CONFIG 2>/dev/null then - save_configuration $ALT_CONFIG + eval save_configuration $ALT_CONFIG load_functions ## RELOAD break else @@ -844,11 +849,12 @@ If you are uncertain what all this means then you should probably leave this blank. EOM $DIALOG --backtitle "$backtitle"\ - --title "Store Alternate Configuration"\ + --title "Save Alternate Configuration"\ --textbox help.out $ROWS $COLS fi done + set +f ## Switch file expansion ON rm -f help.out MCdialog.out } -- 2.39.5