Commit 3a002fe4 authored by Linus Torvalds's avatar Linus Torvalds

Import 1.3.60

parent c04591a2
......@@ -715,8 +715,8 @@ S: East Brunswick, New Jersey 08816
S: USA
N: Rick Miller
E: rick@digalogsys.com
D: Linux Device Registrar (Major/minor numbers), "au-play", "bwBASIC"
E: rdmiller@execpc.com
D: Original Linux Device Registrar (Major/minor numbers), au-play, bwBASIC
S: S78 W16203 Woods Road
S: Muskego, Wisconsin 53150
S: USA
......@@ -810,7 +810,9 @@ D: IPX development and support
N: Avery Pennarun
E: apenwarr@foxnet.net
D: ARCnet driver, various small changes
D: ARCnet driver
D: "make xconfig" improvements
D: Various minor hacking
S: RR #5, 497 Pole Line Road
S: Thunder Bay, Ontario
S: CANADA P7C 5M9
......
......@@ -649,6 +649,21 @@ CONFIG_IPX
your kernel by about 5 kB. Unless you have Novell computers on your
local network, say N.
Full internal IPX network
CONFIG_IPX_INTERN
The full internal IPX network enables you to allocate sockets on
different virtual nodes of the internal network. This is done by
evaluating the field sipx_node of the socket address given to the bind
call. So applications should always initialize the node field to 0
when binding a socket on the primary network. In this case the socket
is assigned the default node that has been given to the kernel when
the internal network was created.
By enabling the full internal IPX network the cross-forwarding of
packets targeted at 'special' sockets to sockets listening on the
primary network is disabled. This might break existing applications,
especially RIP/SAP daemons. A RIP/SAP daemon that works well with the
full internal net can be found on linux01.gwdg.de:/pub/ncpfs.
Appletalk DDP
CONFIG_ATALK
Appletalk is the way Apple computers speak to each other on an
......
This README belongs to release 4.1 or newer of the SoundBlaster Pro
(Matsushita, Kotobuki, Panasonic, CreativeLabs, Longshine and TEAC)
This README belongs to release 4.2 or newer of the SoundBlaster Pro
(Matsushita, Kotobuki, Panasonic, CreativeLabs, Longshine and Teac)
CD-ROM driver for Linux.
Sbpcd really, really is NOT for ANY IDE/ATAPI drive!
sbpcd really, really is NOT for ANY IDE/ATAPI drive!
Not even if you have an "original" SoundBlaster card with an IDE interface!
So, you better have a look into README.ide if your port address is 0x1F0,
0x170, 0x1E8, 0x168 or similar.
......@@ -46,7 +46,7 @@ playing audio should work, data access will result in errors. I need qualified
feedback about the bugs within the data functions or a drive (I never saw a
CD200).
The quad-speed TEAC CD-55A drive is supported, but still does not reach "full
The quad-speed Teac CD-55A drive is supported, but still does not reach "full
speed". The data rate already reaches 500 kB/sec if you set SBP_BUFFER_FRAMES
to 64 (it is not recommended to do that for normal "file access" usage, but it
can speed up things a lot if you use something like "dd" to read from the
......@@ -69,7 +69,7 @@ the IDE/ATAPI user questions disappear).
This driver will work with the soundcard interfaces (SB Pro, SB 16, Galaxy,
SoundFX, Mozart, MAD16 ...) and with the "no-sound" cards (Panasonic CI-101P,
LaserMate, WDH-7001C, Longshine LCS-6853, TEAC ...).
LaserMate, WDH-7001C, Longshine LCS-6853, Teac ...).
It works with the "configurable" interface "Sequoia S-1000", too, which is
used on the Spea Media FX and Ensonic Soundscape sound cards. You have to
......@@ -92,15 +92,18 @@ The interface type has to get configured in /usr/include/linux/sbpcd.h,
because the register layout is different between the "SoundBlaster" and the
"LaserMate" type.
I got a report that the TEAC interface card "I/F E117098" is of type
I got a report that the Teac interface card "I/F E117098" is of type
"SoundBlaster" (i.e. you have to set SBPRO to 1) even with the addresses
0x300 and above. This is unusual, and it can't get covered by the auto
probing scheme.
The Teac 16-bit interface cards (like P/N E950228-00A, default address 0x2C0)
need the SBPRO 3 setup.
If auto-probing found the drive, the address is correct. The reported type
may be wrong. A "mount" will give success only if the interface type is set
right. Playing audio should work with a wrong set interface type, too.
With some TEAC and some CD200 drives I have seen interface cards which seem
With some Teac and some CD200 drives I have seen interface cards which seem
to lack the "drive select" lines; always drive 0 gets addressed. To avoid
"mirror drives" (four drives detected where you only have one) with such
interface cards, set MAX_DRIVES to 1 and jumper your drive to ID 0 (if
......@@ -166,7 +169,7 @@ convert photo CD image files and Gerd Knorr's viewing utility.
The transfer rate will reach 150 kB/sec with CR-52x drives, 300 kB/sec with
CR-56x drives, and currently not more than 500 kB/sec (usually less than
250 kB/sec) with the TEAC quad speed drives.
250 kB/sec) with the Teac quad speed drives.
XA (PhotoCD) disks with "old" drives give only 50 kB/sec.
This release consists of
......@@ -193,7 +196,8 @@ To install:
Most "compatible" sound cards (almost all "non-CreativeLabs" cards)
need "SBPRO 0".
The "no-sound" board from OmniCd needs the "SBPRO 1" setup.
Possibly some TEAC "no-sound" boards need the "SBPRO 1" setup.
The Teac 8-bit "no-sound" boards need the "SBPRO 1" setup.
The Teac 16-bit "no-sound" boards need the "SBPRO 3" setup.
All other "no-sound" boards need the "SBPRO 0" setup.
The Spea Media FX and Ensoniq SoundScape cards need "SBPRO 2".
sbpcd.c holds some examples in its auto-probe list.
......@@ -204,14 +208,17 @@ To install:
a4. Set DISTRIBUTION to 0.
b. Additionally for 2.a1 and 2.a2, the setup may be done during
boot time (via the "kernel command line" or "LILO option"):
sbpcd=0x230,SoundBlaster
or
sbpcd=0x320,LaserMate
or
sbpcd=0x230,SoundBlaster
or
sbpcd=0x338,SoundScape
or
sbpcd=0x2C0,Teac16bit
This is especially useful if you install a fresh distribution.
If the second parameter is a number, it gets taken as the type
setting; 0 is "LaserMate", 1 is "SoundBlaster", 2 is "SoundScape".
setting; 0 is "LaserMate", 1 is "SoundBlaster", 2 is "SoundScape",
3 is "Teac16bit".
So, for example
sbpcd=0x230,1
is equivalent to
......
......@@ -42,7 +42,7 @@ foo \kill}%
%
\title{{\bf Linux Allocated Devices}}
\author{Maintained by H. Peter Anvin $<$hpa@storm.net$>$}
\date{Last revised: January 5, 1996}
\date{Last revised: February 3, 1996}
\maketitle
%
\noindent
......@@ -146,8 +146,8 @@ an unreasonable effort.
\major{ }{}{block}{MCA ESDI hard disk}
\major{37}{}{char }{IDE tape}
\major{38}{}{char }{Myricom PCI Myrinet board}
\major{39}{}{char }{Reserved for ncpfs $<$lendecke@namu01.gwdg.de$>$}
\major{40}{--41}{}{Unallocated}
\major{39}{--40}{}{Unallocated}
\major{41}{}{char}{Yet Another Micro Monitor}
\major{42}{}{}{Demo/sample use}
\major{43}{}{char }{isdn4linux virtual modem}
\major{44}{}{char }{isdn4linux virtual modem -- alternate devices}
......@@ -858,11 +858,12 @@ packet I/O''. The board is also accessible as a regular {\file eth}
networking device.
\begin{devicelist}
\major{39}{}{char }{Reserved for ncpfs $<$lendecke@namu01.gwdg.de$>$}
\major{39}{--40}{}{Unallocated}
\end{devicelist}
\begin{devicelist}
\major{40}{--41}{}{Unallocated}
\major{41}{}{char }{Yet Another Micro Monitor}
\minor{0}{/dev/yamm}{Yet Another Micro Monitor}
\end{devicelist}
\begin{devicelist}
......
......@@ -2,7 +2,7 @@
Maintained by H. Peter Anvin <hpa@storm.net>
Last revised: January 5, 1996
Last revised: February 3, 1996
This list is the successor to Rick Miller's Linux Device List, which
he stopped maintaining when he lost network access in 1993. It is a
......@@ -581,9 +581,10 @@ an unreasonable effort.
and "user level packet I/O." This board is also
accessible as a standard networking "eth" device.
39 Reserved for ncpfs <lendecke@namu01.gwdg.de>
39-40 UNALLOCATED
40-41 UNALLOCATED
41 Yet Another Micro Monitor
0 = /dev/yamm Yet Another Micro Monitor
42 Demo/sample use
......
......@@ -172,7 +172,7 @@ d) Compress the contents of the ramdisk. The level of compression
e) Put the kernel onto the floppy
cat zImage > /dev/fd0
dd if=zImage of=/dev/fd0 bs=1k
f) Put the ramdisk image onto the floppy, after the kernel. Use an offset
that is slightly larger than the kernel, so that you can put another
......@@ -181,7 +181,7 @@ f) Put the ramdisk image onto the floppy, after the kernel. Use an offset
size would be reasonable. Make sure offset+size of ram_image.gz is
not larger than the total space on your floppy (usually 1440kB).
dd if=/tmp/ram_image.gz of=/dev/fd0 bs=1k skip=400
dd if=/tmp/ram_image.gz of=/dev/fd0 bs=1k seek=400
g) Use "rdev" to set the boot device, ramdisk offset, prompt flag, etc.
For ramdisk_start=400, load_ramdisk=1, ramdisk_start=400, one would
......
VERSION = 1
PATCHLEVEL = 3
SUBLEVEL = 59
SUBLEVEL = 60
ARCH = i386
......@@ -12,6 +12,9 @@ ARCH = i386
# NOTE! SMP is experimental. See the file Documentation/SMP.txt
#
# SMP = 1
#
# SMP profiling options
# SMP_PROF = 1
.EXPORT_ALL_VARIABLES:
......@@ -20,17 +23,22 @@ CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
else echo sh; fi ; fi)
TOPDIR := $(shell if [ "$$PWD" != "" ]; then echo $$PWD; else pwd; fi)
HPATH = $(TOPDIR)/include
AS =as
LD =ld
HOSTCC =gcc -I$(HPATH)
CC =gcc -D__KERNEL__ -I$(HPATH)
MAKE =make
HPATH = $(TOPDIR)/include
HOSTCC =gcc -I$(HPATH)
HOSTCFLAGS =
CROSS_COMPILE =
AS =$(CROSS_COMPILE)as
LD =$(CROSS_COMPILE)ld
CC =$(CROSS_COMPILE)gcc -D__KERNEL__ -I$(HPATH)
CPP =$(CC) -E
AR =ar
NM =nm
STRIP =strip
AWK =awk
AR =$(CROSS_COMPILE)ar
NM =$(CROSS_COMPILE)nm
STRIP =$(CROSS_COMPILE)strip
MAKE =make
AWK =gawk
all: do-it-all
......@@ -88,7 +96,7 @@ SVGA_MODE= -DSVGA_MODE=NORMAL_VGA
# standard CFLAGS
#
CFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
CFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -fno-strength-reduce
ifdef CONFIG_CPP
CFLAGS := $(CFLAGS) -x c++
......@@ -96,6 +104,12 @@ endif
ifdef SMP
CFLAGS += -D__SMP__
AFLAGS += -D__SMP__
ifdef SMP_PROF
CFLAGS += -D__SMP_PROF__
AFLAGS += -D__SMP_PROF__
endif
endif
#
......@@ -137,9 +151,9 @@ include arch/$(ARCH)/Makefile
ifdef SMP
.S.s:
$(CC) -D__ASSEMBLY__ -D__SMP__ -traditional -E -o $*.s $<
$(CC) -D__ASSEMBLY__ $(AFLAGS) -traditional -E -o $*.s $<
.S.o:
$(CC) -D__ASSEMBLY__ -D__SMP__ -traditional -c -o $*.o $<
$(CC) -D__ASSEMBLY__ $(AFLAGS) -traditional -c -o $*.o $<
else
......@@ -175,6 +189,11 @@ xconfig: symlinks
$(MAKE) -C scripts kconfig.tk
wish -f scripts/kconfig.tk
menuconfig: include/linux/version.h symlinks
$(MAKE) -C scripts/lxdialog all
$(CONFIG_SHELL) scripts/Menuconfig arch/$(ARCH)/config.in
config: symlinks
$(CONFIG_SHELL) scripts/Configure arch/$(ARCH)/config.in
......@@ -288,11 +307,12 @@ endif
clean: archclean
rm -f kernel/ksyms.lst include/linux/compile.h
rm -f core `find . -name '*.[oas]' -print`
rm -f core `find . -name '*.[oas]' ! -regex '.*lxdialog' -print`
rm -f core `find . -type f -name 'core' -print`
rm -f vmlinux System.map
rm -f .tmp* drivers/sound/configure
rm -fr modules/*
rm -f submenu*
mrproper: clean
rm -f include/linux/autoconf.h include/linux/version.h
......@@ -301,11 +321,14 @@ mrproper: clean
rm -f drivers/char/uni_hash.tbl drivers/char/conmakehash
rm -f .version .config* config.in config.old
rm -f scripts/tkparse scripts/kconfig.tk scripts/kconfig.tmp
rm -f scripts/lxdialog/*.o scripts/lxdialog/lxdialog
rm -f .menuconfig.in
rm -f include/asm
rm -f .depend `find . -name .depend -print`
rm -f .hdepend
rm -f $(TOPDIR)/include/linux/modversions.h
rm -f $(TOPDIR)/include/linux/modules/*
distclean: mrproper
rm -f core `find . \( -name '*.orig' -o -name '*~' -o -name '*.bak' \
......
......@@ -105,6 +105,11 @@ CONFIGURING the kernel:
needs bash to work: it will search for bash in $BASH, /bin/bash and
/bin/sh (in that order), so hopefully one of those is correct.
- Alternate configuration commands are:
"make menuconfig" Text based color menus, radiolists & dialogs.
"make xconfig" X windows based configuration tool.
NOTES on "make config":
- having unnecessary drivers will make the kernel bigger, and can
under some circumstances lead to problems: probing for a
......
......@@ -25,9 +25,13 @@
ifdef CONFIG_KERNEL_ELF
LD=ld -m elf_i386
LD=$(CROSS_COMPILE)ld -m elf_i386
CPP=$(CC) -E -D__ELF__
OBJDUMP =objdump
OBJDUMP =$(CROSS_COMPILE)objdump
ENCAPS=$(CROSS_COMPILE)encaps
AS86 =$(CROSS_COMPILE)as86 -0 -a
AS386 =$(CROSS_COMPILE)as86 -3
LD86 =$(CROSS_COMPILE)ld86 -0
OBJDUMP_FLAGS=-k -q
ZLDFLAGS=-e startup_32
LDFLAGS=-e stext
......
......@@ -8,15 +8,12 @@
# Copyright (C) 1994 by Linus Torvalds
#
AS86 =as86 -0 -a
LD86 =ld86 -0
ifdef CONFIG_KERNEL_ELF
CFLAGS := $(CFLAGS) -D__BFD__
HOSTCFLAGS := $(HOSTCFLAGS) -D__BFD__
endif
ifdef SMP
CFLAGS := $(CFLAGS) -D__SMP__
HOSTCFLAGS := $(HOSTCFLAGS) -D__SMP__
endif
zImage: $(CONFIGURE) bootsect setup compressed/vmlinux tools/build
......@@ -45,7 +42,7 @@ install: $(CONFIGURE) zImage
sh ./install.sh $(VERSION).$(PATCHLEVEL).$(SUBLEVEL) zImage $(TOPDIR)/System.map "$(INSTALL_PATH)"
tools/build: tools/build.c
$(HOSTCC) $(CFLAGS) -o $@ $< -I$(TOPDIR)/include
$(HOSTCC) $(HOSTCFLAGS) -o $@ $< -I$(TOPDIR)/include
setup: setup.o
$(LD86) -s -o $@ $<
......
......@@ -47,7 +47,7 @@ piggy.o: $(SYSTEM)
rm -f $$tmppiggy $$tmppiggy.gz; \
$(OBJDUMP) $(OBJDUMP_FLAGS) -o $(IMAGE_OFFSET) $(SYSTEM) > $$tmppiggy; \
gzip -f -9 < $$tmppiggy > $$tmppiggy.gz; \
encaps $(TARGET) piggy.o $$tmppiggy.gz $(INPUT_DATA) $(INPUT_LEN); \
$(ENCAPS) $(TARGET) piggy.o $$tmppiggy.gz $(INPUT_DATA) $(INPUT_LEN); \
rm -f $$tmppiggy $$tmppiggy.gz
else
......
......@@ -8,7 +8,6 @@ mainmenu_option next_comment
comment 'Loadable module support'
bool 'Enable loadable module support' CONFIG_MODULES
if [ "$CONFIG_MODULES" = "y" ]; then
MODULES=y
bool 'Set version information on all symbols for modules' CONFIG_MODVERSIONS
bool 'Kernel daemon support (e.g. autoload of modules)' CONFIG_KERNELD
fi
......
......@@ -25,7 +25,7 @@ CONFIG_KERNEL_ELF=y
CONFIG_M586=y
#
# block devices
# Block devices
#
CONFIG_BLK_DEV_FD=y
# CONFIG_BLK_DEV_RAM is not set
......@@ -61,6 +61,10 @@ CONFIG_INET=y
# CONFIG_TCP_NAGLE_OFF is not set
CONFIG_IP_NOSR=y
CONFIG_SKB_LARGE=y
#
#
#
# CONFIG_IPX is not set
# CONFIG_ATALK is not set
# CONFIG_AX25 is not set
......@@ -108,7 +112,9 @@ CONFIG_MINIX_FS=y
# CONFIG_EXT_FS is not set
CONFIG_EXT2_FS=y
# CONFIG_XIA_FS is not set
CONFIG_FAT_FS=y
CONFIG_MSDOS_FS=y
# CONFIG_VFAT_FS is not set
# CONFIG_UMSDOS_FS is not set
CONFIG_PROC_FS=y
CONFIG_NFS_FS=y
......@@ -119,7 +125,7 @@ CONFIG_ISO9660_FS=y
# CONFIG_SYSV_FS is not set
#
# character devices
# Character devices
#
# CONFIG_CYCLADES is not set
# CONFIG_STALDRV is not set
......
......@@ -7,18 +7,13 @@
#
# Note 2! The CFLAGS definitions are now in the main makefile...
AS86 =as86 -0 -a
AS386 =as86 -3
LD86 =ld86 -0
#.S.s:
# $(CPP) -D__ASSEMBLY__ -traditional $< -o $*.s
ifdef SMP
.S.o:
$(CC) -D__ASSEMBLY__ -D__SMP__ -traditional -c $< -o $*.o
$(CC) -D__ASSEMBLY__ $(AFLAGS) -traditional -c $< -o $*.o
else
.S.o:
$(CC) -D__ASSEMBLY__ -traditional -c $< -o $*.o
......
......@@ -148,18 +148,31 @@ ENOSYS = 38
*/
#ifndef __SMP_PROF__
#define SMP_PROF_A
#define SMP_PROF_B
#else
#define SMP_PROF_A movl $0,SYMBOL_NAME(smp_spins_syscall_cur)(,%eax,4);
#define SMP_PROF_B incl SYMBOL_NAME(smp_spins_syscall)(,%eax,4); \
incl SYMBOL_NAME(smp_spins_syscall_cur)(,%eax,4);
#endif
#define ENTER_KERNEL \
pushl %eax; \
pushl %edx; \
pushfl; \
cli; \
GET_PROCESSOR_ID \
SMP_PROF_A \
1: lock; \
btsl $0, SYMBOL_NAME(kernel_flag); \
jnc 3f; \
cmpb SYMBOL_NAME(active_kernel_processor), %al; \
je 4f; \
2: incl SYMBOL_NAME(smp_spins); \
2: SMP_PROF_B \
btl %al, SYMBOL_NAME(smp_invalidate_needed); \
jnc 5f; \
lock; \
......
......@@ -36,6 +36,10 @@
static unsigned char cache_21 = 0xff;
static unsigned char cache_A1 = 0xff;
#ifdef __SMP_PROF__
static unsigned int int_count[NR_CPUS][NR_IRQS] = {{0},};
#endif
void disable_irq(unsigned int irq_nr)
{
unsigned long flags;
......@@ -188,15 +192,78 @@ int get_irq_list(char *buf)
/*
* Linus - should you add NMI counts here ?????
*/
#ifdef __SMP__
#ifdef __SMP_PROF__
len+=sprintf(buf+len, "IPI: %8lu received\n",
ipi_count);
len+=sprintf(buf+len, "LCK: %8lu spins\n",
smp_spins);
#endif
return len;
}
#ifdef __SMP_PROF__
int get_smp_prof_list(char *buf) {
int i,j, len = 0;
struct irqaction * action = irq_action;
unsigned long sum_spins = 0;
unsigned long sum_spins_syscall = 0;
unsigned long sum_spins_sys_idle = 0;
unsigned long sum_smp_idle_count = 0;
for (i=0;i<=smp_num_cpus;i++) {
sum_spins+=smp_spins[i];
sum_spins_syscall+=smp_spins_syscall[i];
sum_spins_sys_idle+=smp_spins_sys_idle[i];
sum_smp_idle_count+=smp_idle_count[i];
}
len += sprintf(buf+len,"CPUS: %10i \n",
0==smp_num_cpus?1:smp_num_cpus);
len += sprintf(buf+len," SUM ");
for (i=0;i<smp_num_cpus;i++)
len += sprintf(buf+len," P%1d ",i);
len += sprintf(buf+len,"\n");
for (i = 0 ; i < NR_IRQS ; i++, action++) {
if (!action->handler)
continue;
len += sprintf(buf+len, "%3d: %10d ",
i, kstat.interrupts[i]);
for (j=0;j<smp_num_cpus;j++)
len+=sprintf(buf+len, "%10d ",int_count[j][i]);
len += sprintf(buf+len, "%c %s\n",
(action->flags & SA_INTERRUPT) ? '+' : ' ',
action->name);
}
len+=sprintf(buf+len, "LCK: %10lu",
sum_spins);
for (i=0;i<smp_num_cpus;i++)
len+=sprintf(buf+len," %10lu",smp_spins[i]);
len +=sprintf(buf+len," spins from int\n");
len+=sprintf(buf+len, "LCK: %10lu",
sum_spins_syscall);
for (i=0;i<smp_num_cpus;i++)
len+=sprintf(buf+len," %10lu",smp_spins_syscall[i]);
len +=sprintf(buf+len," spins from syscall\n");
len+=sprintf(buf+len, "LCK: %10lu",
sum_spins_sys_idle);
for (i=0;i<smp_num_cpus;i++)
len+=sprintf(buf+len," %10lu",smp_spins_sys_idle[i]);
len +=sprintf(buf+len," spins from sysidle\n");
len+=sprintf(buf+len,"IDLE %10lu",sum_smp_idle_count);
for (i=0;i<smp_num_cpus;i++)
len+=sprintf(buf+len," %10lu",smp_idle_count[i]);
len +=sprintf(buf+len," idle ticks\n");
len+=sprintf(buf+len, "IPI: %10lu received\n",
ipi_count);
return len;
}
#endif
/*
* do_IRQ handles IRQ's that have been installed without the
* SA_INTERRUPT flag: it uses the full signal-handling return
......@@ -213,6 +280,9 @@ asmlinkage void do_IRQ(int irq, struct pt_regs * regs)
#endif
kstat.interrupts[irq]++;
#ifdef __SMP_PROF__
int_count[smp_processor_id()][irq]++;
#endif
if (action->flags & SA_SAMPLE_RANDOM)
add_interrupt_randomness(irq);
action->handler(irq, regs);
......@@ -233,6 +303,9 @@ asmlinkage void do_fast_IRQ(int irq)
#endif
kstat.interrupts[irq]++;
#ifdef __SMP_PROF__
int_count[smp_processor_id()][irq]++;
#endif
if (action->flags & SA_SAMPLE_RANDOM)
add_interrupt_randomness(irq);
action->handler(irq, NULL);
......
......@@ -130,6 +130,10 @@ asmlinkage int sys_idle(void)
{
if(current->pid != 0)
return -EPERM;
#ifdef __SMP_PROF__
smp_spins_sys_idle[smp_processor_id()]+=
smp_spins_syscall_cur[smp_processor_id()];
#endif
current->counter= -100;
schedule();
return 0;
......
......@@ -63,9 +63,19 @@ volatile unsigned long kernel_flag=0; /* Kernel spinlock */
volatile unsigned char active_kernel_processor = NO_PROC_ID; /* Processor holding kernel spinlock */
volatile unsigned long kernel_counter=0; /* Number of times the processor holds the lock */
volatile unsigned long syscall_count=0; /* Number of times the processor holds the syscall lock */
volatile unsigned long smp_spins=0; /* Count of cycles wasted to spinning */
volatile unsigned long ipi_count; /* Number of IPI's delivered */
#ifdef __SMP_PROF__
volatile unsigned long smp_spins[NR_CPUS]={0}; /* Count interrupt spins */
volatile unsigned long smp_spins_syscall[NR_CPUS]={0}; /* Count syscall spins */
volatile unsigned long smp_spins_syscall_cur[NR_CPUS]={0};/* Count spins for the actual syscall */
volatile unsigned long smp_spins_sys_idle[NR_CPUS]={0}; /* Count spins for sys_idle */
volatile unsigned long smp_idle_count[1+NR_CPUS]={0,}; /* Count idle ticks */
#endif
#if defined (__SMP_PROF__)
volatile unsigned long smp_idle_map=0; /* Map for idle processors */
#endif
/*
* Checksum an MP configuration block.
......@@ -473,8 +483,10 @@ void smp_boot_cpus(void)
/*
* Map the local APIC into kernel space
*/
apic_reg = vremap(0xFEE00000,4096);
/* Mapping on non-Intel conforming platforms is a bad move. */
if (1<cpu_present_map)
apic_reg = vremap(0xFEE00000,4096);
if(apic_reg == NULL)
......@@ -518,45 +530,63 @@ void smp_boot_cpus(void)
cfg|=(1<<8); /* Enable APIC */
apic_write(APIC_SPIV,cfg);
/*
* This gunge sends an IPI (Inter Processor Interrupt) to the
* processor we wish to wake. When the startup IPI is received
* the target CPU does a real mode jump to the stack base.
*/
cfg=apic_read(APIC_ICR2);
cfg&=0x00FFFFFF;
apic_write(APIC_ICR2, cfg|SET_APIC_DEST_FIELD(i)); /* Target chip */
cfg=apic_read(APIC_ICR);
cfg&=~0xFDFFF ; /* Clear bits */
cfg|=APIC_DEST_FIELD|APIC_DEST_DM_STARTUP|(((unsigned long)stack)>>12); /* Boot on the stack */
apic_write(APIC_ICR, cfg); /* Kick the second */
udelay(10); /* Masses of time */
cfg=apic_read(APIC_ESR);
if(cfg&4) /* Send accept error */
printk("Processor refused startup request.\n");
else
for(timeout=0;timeout<50000;timeout++)
{
for(timeout=0;timeout<50000;timeout++)
/*
* This gunge sends an IPI (Inter Processor Interrupt) to the
* processor we wish to wake. When the startup IPI is received
* the target CPU does a real mode jump to the stack base.
*
* We do the following
*
* Time 0 : Send a STARTUP IPI (This is all that is needed).
* Time 20000 : Send an INIT IPI for broken boards.
* Time 20001 : Send a second STARTUP IPI for broken boards.
*
* We can't just do INIT/STARTUP - that breaks the correctly
* implemented ASUS boards.
*/
if(timeout==20000)
{
if(cpu_callin_map[0]&(1<<i))
break; /* It has booted */
udelay(100); /* Wait 5s total for a response */
cfg=apic_read(APIC_ICR2);
cfg&=0x00FFFFFF;
apic_write(APIC_ICR2, cfg|SET_APIC_DEST_FIELD(i)); /* Target chip */
cfg=apic_read(APIC_ICR);
cfg&=~0xFDFFF ; /* Clear bits */
cfg|=APIC_DEST_DM_INIT; /* INIT the CPU */
apic_write(APIC_ICR, cfg); /* Kick the second */
printk("\nBuggy motherboard ?, trying an INIT IPI: ");
udelay(10); /* Masses of time */
}
if(cpu_callin_map[0]&(1<<i))
cpucount++;
else
if(timeout==0||timeout==20001)
{
/*
* At this point we should set up a BIOS warm start and try
* a RESTART IPI. The 486+82489 MP pair don't support STARTUP IPI's
*/
if(*((unsigned char *)8192)==0xA5)
printk("Stuck ??\n");
else
printk("Not responding.\n");
cpu_present_map&=~(1<<i);
cfg=apic_read(APIC_ICR);
cfg&=~0xFDFFF ; /* Clear bits */
cfg|=APIC_DEST_FIELD|APIC_DEST_DM_STARTUP|(((unsigned long)stack)>>12); /* Boot on the stack */
apic_write(APIC_ICR, cfg); /* Kick the second */
udelay(10); /* Masses of time */
cfg=apic_read(APIC_ESR);
if(cfg&4) /* Send accept error */
printk("Processor refused startup request.\n");
}
if(cpu_callin_map[0]&(1<<i))
break; /* It has booted */
udelay(100); /* Wait 5s total for a response */
}
if(cpu_callin_map[0]&(1<<i))
cpucount++;
else
{
/*
* At this point we should set up a BIOS warm start and try
* a RESTART IPI. The 486+82489 MP pair don't support STARTUP IPI's
*/
if(*((unsigned char *)8192)==0xA5)
printk("Stuck ??\n");
else
printk("Not responding.\n");
cpu_present_map&=~(1<<i);
}
}
}
......@@ -797,13 +827,14 @@ void smp_invalidate(void)
void smp_reschedule_irq(int cpl, struct pt_regs *regs)
{
#ifdef DEBUGGING_SMP_RESCHED
static int ct=0;
if(ct==0)
{
printk("Beginning scheduling on CPU#%d\n",smp_processor_id());
ct=1;
}
#endif
if(smp_processor_id()!=active_kernel_processor)
panic("SMP Reschedule on CPU #%d, but #%d is active.\n",
smp_processor_id(), active_kernel_processor);
......
......@@ -2,7 +2,7 @@
# Block device driver configuration
#
mainmenu_option next_comment
comment 'block devices'
comment 'Block devices'
tristate 'Normal floppy disk support' CONFIG_BLK_DEV_FD
tristate 'RAM disk support' CONFIG_BLK_DEV_RAM
......
......@@ -3248,6 +3248,14 @@ static int fd_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
return 0;
case FDFMTBEG:
LOCK_FDC(drive,1);
CALL(poll_drive(1, FD_RAW_NEED_DISK));
ret = UDRS->flags;
process_fd_request();
if(ret & FD_VERIFY)
return -ENODEV;
if(!(ret & FD_DISK_WRITABLE))
return -EROFS;
return 0;
case FDFMTTRK:
if (UDRS->fd_ref != 1)
......@@ -3671,30 +3679,33 @@ static char get_fdc_version(void)
return FDC_82077; /* Revised 82077AA passes all the tests */
}
switch (reply_buffer[0] >> 5) {
case 0x0:
output_byte(FD_SAVE);
r = result();
if (r != 17) {
printk("FDC %d init: SAVE: unexpected return of %d bytes.\n",fdc,r);
return FDC_UNKNOWN;
}
if (!(reply_buffer[0] & 0x40)) {
printk("FDC %d is a 3Volt 82078SL.\n",fdc);
case 0x0:
output_byte(FD_SAVE);
r = result();
if (r != 17) {
printk("FDC %d init: SAVE: unexpected return of %d bytes.\n", fdc, r);
return FDC_UNKNOWN;
}
if (!(reply_buffer[0] & 0x40)) {
printk("FDC %d is a 3Volt 82078SL.\n",fdc);
return FDC_82078;
}
/* Either a 82078-1 or a 82078SL running at 5Volt */
printk("FDC %d is a 82078-1.\n",fdc);
return FDC_82078_1;
case 0x1:
printk("FDC %d is a 44pin 82078\n",fdc);
return FDC_82078;
}
/* Either a 82078-1 or a 82078SL running at 5Volt */
printk("FDC %d is a 82078-1.\n",fdc);
return FDC_82078_1;
case 0x1:
printk("FDC %d is a 44pin 82078\n",fdc);
return FDC_82078;
case 0x3:
printk("FDC %d is a National Semiconductor PC87306\n",fdc);
return FDC_87306;
default:
printk("FDC %d init: Unknown 82077 variant, PARTID = %d.\n",
fdc, reply_buffer[0] >> 5);
return FDC_82077_UNKN;
case 0x2:
printk("FDC %d is a S82078B\n", fdc);
return FDC_S82078B;
case 0x3:
printk("FDC %d is a National Semiconductor PC87306\n", fdc);
return FDC_87306;
default:
printk("FDC %d init: 82077 variant with PARTID=%d.\n",
fdc, reply_buffer[0] >> 5);
return FDC_82077_UNKN;
}
} /* get_fdc_version */
......
......@@ -1959,6 +1959,7 @@ read_subcode(void)
static int
sony_get_subchnl_info(long arg)
{
int err;
struct cdrom_subchnl schi;
......@@ -1972,8 +1973,9 @@ sony_get_subchnl_info(long arg)
return -EIO;
}
verify_area(VERIFY_READ, (char *) arg, sizeof(schi));
verify_area(VERIFY_WRITE, (char *) arg, sizeof(schi));
err = verify_area(VERIFY_READ, (char *) arg, sizeof(schi)) ||
verify_area(VERIFY_WRITE, (char *) arg, sizeof(schi));
if (err) return err;
memcpy_fromfs(&schi, (char *) arg, sizeof(schi));
......
This diff is collapsed.
Wed Jan 10 10:08:00 1996 <tytso@rsts-11.mit.edu>
* serial.c (block_til_ready): Remove race condition which happened
if a hangup condition happened during the setup of the
UART, before rs_open() called block_til_ready(). This
caused the info->count counter to be erroneously
decremented.
* serial.c (startup, rs_open): Remove race condition that could
cuase a memory leak of one page. (Fortunately, both race
conditions were relatively rare in practice.)
Tue Dec 5 13:21:27 1995 <tytso@rsts-11.mit.edu>
* serial.c (check_modem_status, rs_ioctl): Support the new
......
......@@ -2,7 +2,7 @@
# Character device configuration
#
mainmenu_option next_comment
comment 'character devices'
comment 'Character devices'
tristate 'Cyclades async mux support' CONFIG_CYCLADES
bool 'Stallion multiport serial support' CONFIG_STALDRV
......@@ -37,8 +37,8 @@ if [ "$CONFIG_APM" = "y" ]; then
bool ' Enable console blanking using APM' CONFIG_APM_DISPLAY_BLANK
fi
bool 'Watchdog Timer Support' CONFIG_WATCHDOG
if [ "$CONFIG_WATCHDOG" = "y" ]; then
bool ' WDT Watchdog timer' CONFIG_WDT
if [ "$CONFIG_WATCHDOG" != "n" ]; then
tristate ' WDT Watchdog timer' CONFIG_WDT
if [ "$CONFIG_WDT" = "y" ]; then
bool ' WDT501 features' CONFIG_WDT_501
if [ "$CONFIG_WDT_501" = "y" ]; then
......
......@@ -98,6 +98,16 @@ M = y
# This is not modularized, so if configured then "mouse.c" will be resident
endif
ifeq ($(CONFIG_WDT),y)
M = y
L_OBJS += wdt.o
else
ifeq ($(CONFIG_WDT),m)
M_OBJS += wdt.o
MM = m
endif
endif
ifdef CONFIG_QIC02_TAPE
L_OBJS += tpqic02.o
endif
......
......@@ -14,6 +14,9 @@
* of the mouse drivers, as they are now completely independent. Linus.
*
* Support for loadable modules. 8-Sep-95 Philip Blundell <pjb27@cam.ac.uk>
*
* Fixed a failing symbol register to free the device registration
* Alan Cox <alan@lxorguk.ukuu.org.uk> 21-Jan-96
*/
#include <linux/module.h>
......@@ -137,5 +140,10 @@ int mouse_init(void)
return -EIO;
}
return register_symtab(&mouse_syms);
if(register_symtab(&mouse_syms)!=0)
{
unregister_chrdev(MOUSE_MAJOR, "mouse");
return -EIO;
}
return 0;
}
......@@ -887,23 +887,32 @@ static int startup(struct async_struct * info)
unsigned long flags;
int retval;
void (*handler)(int, struct pt_regs *);
unsigned long page;
if (info->flags & ASYNC_INITIALIZED)
page = get_free_page(GFP_KERNEL);
if (!page)
return -ENOMEM;
save_flags(flags); cli();
if (info->flags & ASYNC_INITIALIZED) {
free_page(page);
restore_flags(flags);
return 0;
}
if (!info->port || !info->type) {
if (info->tty)
set_bit(TTY_IO_ERROR, &info->tty->flags);
free_page(page);
restore_flags(flags);
return 0;
}
if (!info->xmit_buf) {
info->xmit_buf = (unsigned char *) get_free_page(GFP_KERNEL);
if (!info->xmit_buf)
return -ENOMEM;
}
save_flags(flags); cli();
if (info->xmit_buf)
free_page(page);
else
info->xmit_buf = (unsigned char *) page;
#ifdef SERIAL_DEBUG_OPEN
printk("starting up ttys%d (irq %d)...", info->line, info->irq);
......@@ -2207,7 +2216,8 @@ static int block_til_ready(struct tty_struct *tty, struct file * filp,
* If the device is in the middle of being closed, then block
* until it's done, and then try again.
*/
if (info->flags & ASYNC_CLOSING) {
if (tty_hung_up_p(filp) ||
(info->flags & ASYNC_CLOSING)) {
interruptible_sleep_on(&info->close_wait);
#ifdef SERIAL_DO_RESTART
if (info->flags & ASYNC_HUP_NOTIFY)
......@@ -2271,7 +2281,10 @@ static int block_til_ready(struct tty_struct *tty, struct file * filp,
printk("block_til_ready before block: ttys%d, count = %d\n",
info->line, info->count);
#endif
info->count--;
cli();
if (!tty_hung_up_p(filp))
info->count--;
sti();
info->blocked_open++;
while (1) {
cli();
......@@ -2333,6 +2346,7 @@ int rs_open(struct tty_struct *tty, struct file * filp)
{
struct async_struct *info;
int retval, line;
unsigned long page;
line = MINOR(tty->device) - tty->driver.minor_start;
if ((line < 0) || (line >= NR_PORTS))
......@@ -2350,9 +2364,13 @@ int rs_open(struct tty_struct *tty, struct file * filp)
info->tty = tty;
if (!tmp_buf) {
tmp_buf = (unsigned char *) get_free_page(GFP_KERNEL);
if (!tmp_buf)
page = get_free_page(GFP_KERNEL);
if (!page)
return -ENOMEM;
if (tmp_buf)
free_page(page);
else
tmp_buf = (unsigned char *) page;
}
/*
......
......@@ -39,7 +39,7 @@ static int timer_alive = 0;
* If the timer expires..
*/
static void watchdog_fire(long data)
static void watchdog_fire(unsigned long data)
{
extern void hard_reset_now(void);
hard_reset_now();
......
......@@ -2585,7 +2585,8 @@ static int qic02_tape_ioctl(struct inode * inode, struct file * filp,
if (c == DDIOCSDBG) {
if (!suser())
return -EPERM;
verify_area(VERIFY_READ, (int *) ioarg, sizeof(int));
error = verify_area(VERIFY_READ, (int *) ioarg, sizeof(int));
if (error) return error;
c = get_user_long((int *) ioarg);
if (c==0) {
QIC02_TAPE_DEBUG = 0;
......
......@@ -15,8 +15,9 @@
* herein by reference. The driver is provided without warranty or
* support.
*
* Release 0.04.
* Release 0.05.
*
* Some changes by Dave Gregorich to fix modularisation and minor bugs.
*/
#include <linux/config.h>
......@@ -110,7 +111,7 @@ static int wdt_lseek(struct inode *inode, struct file *file, off_t offset,
return -ESPIPE;
}
static int wdt_write(struct inode *inode, struct file *file, char *buf, int count)
static int wdt_write(struct inode *inode, struct file *file, const char *buf, int count)
{
/* Write a watchdog value */
inb_p(WDT_DC);
......@@ -138,7 +139,7 @@ static int wdt_read(struct inode *inode, struct file *file, char *buf, int count
return err;
c*=11;
c/=15;
cp=c;
cp=c+7;
memcpy_tofs(buf,&cp,1);
return 1;
default:
......@@ -217,12 +218,14 @@ static struct mouse wdt_mouse=
&wdt_fops
};
#ifdef CONFIG_WDT_501
static struct mouse temp_mouse=
{
TEMP_MINOR,
"temperature",
&wdt_fops
};
#endif
#ifdef MODULE
......@@ -263,7 +266,9 @@ int wdt_init(void)
return -EIO;
}
mouse_register(&wdt_mouse);
#ifdef CONFIG_WDT_501
mouse_register(&temp_mouse);
#endif
request_region(io, 8, "wdt501");
return 0;
}
......
......@@ -640,15 +640,15 @@ static void set_multicast_list(struct device *dev)
printk("%s: Setting Rx mode to %d addresses.\n", dev->name, dev->mc_count);
}
}
if (dev->mc_count || (dev->flags&IFF_ALLMULTI))
{
outw(SetRxFilter|RxStation|RxMulticast|RxBroadcast, ioaddr + EL3_CMD);
}
else if (dev->flags&IFF_PROMISC)
if (dev->flags&IFF_PROMISC)
{
outw(SetRxFilter | RxStation | RxMulticast | RxBroadcast | RxProm,
ioaddr + EL3_CMD);
}
else if (dev->mc_count || (dev->flags&IFF_ALLMULTI))
{
outw(SetRxFilter|RxStation|RxMulticast|RxBroadcast, ioaddr + EL3_CMD);
}
else
outw(SetRxFilter | RxStation | RxBroadcast, ioaddr + EL3_CMD);
}
......
......@@ -968,7 +968,8 @@ int arcnet_reset(struct device *dev)
}
/* Setup a struct device for ARCnet. This should really be in net_init.c
/*
* Setup a struct device for ARCnet. This should really be in net_init.c
* but since there are three different ARCnet devices ANYWAY... <gargle>
*
* Actually, the whole idea of having all this kernel-dependent stuff (ie.
......@@ -976,23 +977,25 @@ int arcnet_reset(struct device *dev)
*
* Intelligent defaults?! Nah.
*/
void arcnet_setup(struct device *dev)
{
int i;
for (i=0; i<DEV_NUMBUFFS; i++)
skb_queue_head_init(&dev->buffs[i]);
dev->broadcast[0]=0x00; /* broadcasts on ARCnet are address 0 */
dev->addr_len=1;
dev->type=ARPHRD_ARCNET;
dev->broadcast[0] = 0x00; /* broadcasts on ARCnet are address 0 */
dev->addr_len = 1;
dev->type = ARPHRD_ARCNET;
dev->tx_queue_len = 30; /* Fairly long queue, arcnet is quite speedy */
/* New-style flags. */
dev->flags = IFF_BROADCAST;
dev->family = AF_INET;
dev->pa_addr = 0;
dev->pa_brdaddr = 0;
dev->pa_mask = 0;
dev->pa_alen = 4;
dev->flags = IFF_BROADCAST;
dev->family = AF_INET;
dev->pa_addr = 0;
dev->pa_brdaddr = 0;
dev->pa_mask = 0;
dev->pa_alen = 4;
}
......
This diff is collapsed.
......@@ -141,7 +141,8 @@ int loopback_init(struct device *dev)
dev->hard_header = eth_header;
dev->hard_header_len = ETH_HLEN; /* 14 */
dev->addr_len = ETH_ALEN; /* 6 */
dev->type = ARPHRD_ETHER; /* 0x0001 */
dev->tx_queue_len = 50000; /* No limit on loopback */
dev->type = ARPHRD_LOOPBACK; /* 0x0001 */
dev->rebuild_header = eth_rebuild_header;
dev->open = loopback_open;
dev->flags = IFF_LOOPBACK|IFF_BROADCAST;
......
......@@ -166,18 +166,18 @@ void ether_setup(struct device *dev)
}
dev->hard_header = eth_header;
dev->rebuild_header = eth_rebuild_header;
dev->set_mac_address = eth_mac_addr;
dev->header_cache_bind = eth_header_cache_bind;
dev->header_cache_update = eth_header_cache_update;
dev->rebuild_header = eth_rebuild_header;
dev->set_mac_address = eth_mac_addr;
dev->header_cache_bind = eth_header_cache_bind;
dev->header_cache_update= eth_header_cache_update;
dev->type = ARPHRD_ETHER;
dev->hard_header_len = ETH_HLEN;
dev->hard_header_len = ETH_HLEN;
dev->mtu = 1500; /* eth_mtu */
dev->addr_len = ETH_ALEN;
for (i = 0; i < ETH_ALEN; i++) {
dev->broadcast[i]=0xff;
}
dev->addr_len = ETH_ALEN;
dev->tx_queue_len = 100; /* Ethernet wants good queues */
memset(dev->broadcast,0xFF, ETH_ALEN);
/* New-style flags. */
dev->flags = IFF_BROADCAST|IFF_MULTICAST;
......@@ -199,15 +199,15 @@ void tr_setup(struct device *dev)
skb_queue_head_init(&dev->buffs[i]);
dev->hard_header = tr_header;
dev->rebuild_header = tr_rebuild_header;
dev->rebuild_header = tr_rebuild_header;
dev->type = ARPHRD_IEEE802;
dev->hard_header_len = TR_HLEN;
dev->hard_header_len = TR_HLEN;
dev->mtu = 2000; /* bug in fragmenter...*/
dev->addr_len = TR_ALEN;
for (i = 0; i < TR_ALEN; i++) {
dev->broadcast[i]=0xff;
}
dev->addr_len = TR_ALEN;
dev->tx_queue_len = 100; /* Long queues on tr */
memset(dev->broadcast,0xFF, TR_ALEN);
/* New-style flags. */
dev->flags = IFF_BROADCAST;
......@@ -306,18 +306,18 @@ void unregister_netdev(struct device *dev)
*/
#ifdef CONFIG_NET_ALIAS
if (dev_base == dev)
dev_base = net_alias_nextdev(dev);
dev_base = net_alias_nextdev(dev);
else
{
while(d && (net_alias_nextdev(d) != dev)) /* skip aliases */
d = net_alias_nextdev(d);
while(d && (net_alias_nextdev(d) != dev)) /* skip aliases */
d = net_alias_nextdev(d);
if (d && (net_alias_nextdev(d) == dev))
if (d && (net_alias_nextdev(d) == dev))
{
/*
* critical: bypass by consider devices as blocks (maindev+aliases)
*/
net_alias_nextdev_set(d, net_alias_nextdev(dev));
/*
* Critical: Bypass by consider devices as blocks (maindev+aliases)
*/
net_alias_nextdev_set(d, net_alias_nextdev(dev));
}
#else
if (dev_base == dev)
......@@ -326,7 +326,7 @@ void unregister_netdev(struct device *dev)
{
while (d && (d->next != dev))
d = d->next;
if (d && (d->next == dev))
{
d->next = dev->next;
......@@ -350,13 +350,15 @@ void unregister_netdev(struct device *dev)
restore_flags(flags);
/* You can i.e use a interfaces in a route though it is not up.
We call close_dev (which is changed: it will down a device even if
dev->flags==0 (but it will not call dev->stop if IFF_UP
is not set).
This will call notifier_call_chain(&netdev_chain, NETDEV_DOWN, dev),
dev_mc_discard(dev), ....
*/
/*
* You can i.e use a interfaces in a route though it is not up.
* We call close_dev (which is changed: it will down a device even if
* dev->flags==0 (but it will not call dev->stop if IFF_UP
* is not set).
* This will call notifier_call_chain(&netdev_chain, NETDEV_DOWN, dev),
* dev_mc_discard(dev), ....
*/
dev_close(dev);
}
......
......@@ -126,8 +126,8 @@ typedef struct sk_buff sk_buff;
#define PPP_LQR 0xc025 /* Link Quality Reporting Protocol */
#endif
static int ppp_register_compressor (struct compressor *cp);
static void ppp_unregister_compressor (struct compressor *cp);
int ppp_register_compressor (struct compressor *cp);
void ppp_unregister_compressor (struct compressor *cp);
/*
* Local functions
......@@ -480,7 +480,8 @@ ppp_init_dev (struct device *dev)
dev->do_ioctl = ppp_dev_ioctl;
dev->addr_len = 0;
dev->type = ARPHRD_PPP;
dev->tx_queue_len = 10;
for (indx = 0; indx < DEV_NUMBUFFS; indx++)
skb_queue_head_init (&dev->buffs[indx]);
......@@ -3465,7 +3466,7 @@ static struct compressor *find_compressor (int type)
return (struct compressor *) 0;
}
static int ppp_register_compressor (struct compressor *cp)
int ppp_register_compressor (struct compressor *cp)
{
struct compressor_link *new;
unsigned long flags;
......@@ -3492,7 +3493,7 @@ static int ppp_register_compressor (struct compressor *cp)
return 0;
}
static void ppp_unregister_compressor (struct compressor *cp)
void ppp_unregister_compressor (struct compressor *cp)
{
struct compressor_link *prev = (struct compressor_link *) 0;
struct compressor_link *lnk;
......
......@@ -91,7 +91,6 @@ static long decode(unsigned char **cpp);
static unsigned char * put16(unsigned char *cp, unsigned short x);
static unsigned short pull16(unsigned char **cpp);
static void export_slhc_syms(void);
static has_exported = 0;
/* Initialize compression data structure
* slots must be in range 0 to 255 (zero meaning no compression)
......@@ -103,9 +102,6 @@ slhc_init(int rslots, int tslots)
register struct cstate *ts;
struct slcompress *comp;
if (!has_exported)
export_slhc_syms();
comp = (struct slcompress *)kmalloc(sizeof(struct slcompress),
GFP_KERNEL);
if (! comp)
......@@ -748,7 +744,6 @@ static struct symbol_table slhc_syms = {
static void export_slhc_syms(void)
{
register_symtab(&slhc_syms);
has_exported = 1;
}
#ifdef MODULE
......@@ -764,5 +759,11 @@ void cleanup_module(void)
{
return;
}
#endif /* MODULE */
#else /* MODULE */
void slhc_install(void)
{
export_slhc_syms();
}
#endif
#endif /* CONFIG_INET */
......@@ -1022,7 +1022,7 @@ slip_ioctl(struct tty_struct *tty, void *file, int cmd, void *arg)
case SIOCGIFNAME:
err = verify_area(VERIFY_WRITE, arg, strlen(sl->dev->name) + 1);
if (err) {
return -err;
return err;
}
memcpy_tofs(arg, sl->dev->name, strlen(sl->dev->name) + 1);
return 0;
......@@ -1030,7 +1030,7 @@ slip_ioctl(struct tty_struct *tty, void *file, int cmd, void *arg)
case SIOCGIFENCAP:
err = verify_area(VERIFY_WRITE, arg, sizeof(int));
if (err) {
return -err;
return err;
}
put_user(sl->mode, (int *)arg);
return 0;
......@@ -1038,7 +1038,7 @@ slip_ioctl(struct tty_struct *tty, void *file, int cmd, void *arg)
case SIOCSIFENCAP:
err = verify_area(VERIFY_READ, arg, sizeof(int));
if (err) {
return -err;
return err;
}
tmp = get_user((int *)arg);
#ifndef SL_INCLUDE_CSLIP
......@@ -1205,6 +1205,7 @@ slip_init(struct device *dev)
dev->hard_header_len = 0;
dev->addr_len = 0;
dev->type = ARPHRD_SLIP + SL_MODE_DEFAULT;
dev->tx_queue_len = 10;
#ifdef CONFIG_AX25
if (sl->dev->type == 260) {
sl->dev->type = ARPHRD_AX25;
......
......@@ -82,10 +82,11 @@ int tunnel_init(struct device *dev)
dev->stop = &tunnel_close;
#endif
/* Now stomp the bits that are different */
dev->type = ARPHRD_TUNNEL; /* IP tunnel hardware type (Linux 1.1.89) */
dev->type = ARPHRD_TUNNEL; /* IP tunnel hardware type (Linux 1.1.89) */
dev->flags |= IFF_NOARP;
dev->flags |= IFF_LOOPBACK; /* Why doesn't tunnel work without this? [ should do now - AC]*/
dev->flags |= IFF_LOOPBACK; /* Why doesn't tunnel work without this? [ should do now - AC]*/
dev->addr_len=0;
dev->tx_queue_len=2; /* Small queue - it should all run through */
dev->hard_header_len=0;
dev->hard_header=NULL;
dev->header_cache_bind=NULL;
......
......@@ -70,6 +70,7 @@ struct pci_dev_info dev_info[] = {
DEVICE( CIRRUS, CIRRUS_5434_4, "GD 5434"),
DEVICE( CIRRUS, CIRRUS_5434_8, "GD 5434"),
DEVICE( CIRRUS, CIRRUS_5436, "GD 5436"),
DEVICE( CIRRUS, CIRRUS_6205, "GD 6205"),
DEVICE( CIRRUS, CIRRUS_6729, "CL 6729"),
DEVICE( CIRRUS, CIRRUS_7542, "CL 7542"),
DEVICE( CIRRUS, CIRRUS_7543, "CL 7543"),
......@@ -105,6 +106,7 @@ struct pci_dev_info dev_info[] = {
DEVICE( BUSLOGIC, BUSLOGIC_930, "BT-930"),
DEVICE( PROMISE, PROMISE_5300, "DC5030"),
DEVICE( N9, N9_I128, "Imagine 128"),
DEVICE( N9, N9_I128_2, "Imagine 128v2"),
DEVICE( UMC, UMC_UM8673F, "UM8673F"),
BRIDGE( UMC, UMC_UM8891A, "UM8891A", 0x01),
DEVICE( UMC, UMC_UM8886BF, "UM8886BF"),
......@@ -138,14 +140,18 @@ struct pci_dev_info dev_info[] = {
DEVICE( ASP, ASP_ABP940, "ABP940"),
DEVICE( IMS, IMS_8849, "8849"),
DEVICE( TEKRAM2, TEKRAM2_690c, "DC690c"),
DEVICE( INTERG, INTERG_1680, "IGA-1680"),
DEVICE( REALTEK, REALTEK_8029, "8029"),
DEVICE( INIT, INIT_320P, "320 P"),
DEVICE( VIA, VIA_82C505, "VT 82C505"),
DEVICE( VIA, VIA_82C561, "VT 82C561"),
DEVICE( VIA, VIA_82C576, "VT 82C576 3V"),
DEVICE( VIA, VIA_82C416, "VT 82C416MV"),
DEVICE( VORTEX, VORTEX_GDT, "GDT 6000b"),
DEVICE( EF, EF_ATM_FPGA, "155P-MF1 (FPGA)"),
DEVICE( EF, EF_ATM_ASIC, "155P-MF1 (ASIC)"),
DEVICE( IMAGINGTECH, IMAGINGTECH_ICPCI, "MVC IC-PCI"),
DEVICE( FORE, FORE_PCA200PC, "PCA-200PC"),
DEVICE( PLX, PLX_9060, "PCI9060 i960 bridge"),
DEVICE( ALLIANCE, ALLIANCE_PROMOTIO, "Promotion-6410"),
DEVICE( ALLIANCE, ALLIANCE_PROVIDEO, "Provideo"),
......@@ -217,7 +223,7 @@ struct optimization_type {
const char *off;
const char *on;
} bridge_optimization[] = {
{"Cache L2", "write trough", "write back"},
{"Cache L2", "write through", "write back"},
{"CPU-PCI posted write", "off", "on"},
{"CPU-Memory posted write", "off", "on"},
{"PCI-Memory posted write", "off", "on"},
......@@ -409,11 +415,13 @@ const char *pci_strvendor(unsigned int vendor)
case PCI_VENDOR_ID_PCTECH: return "PCTECH";
case PCI_VENDOR_ID_DPT: return "DPT";
case PCI_VENDOR_ID_OPTI: return "OPTI";
case PCI_VENDOR_ID_SGS: return "SGS Thomson";
case PCI_VENDOR_ID_BUSLOGIC: return "BusLogic";
case PCI_VENDOR_ID_PROMISE: return "Promise Technology";
case PCI_VENDOR_ID_N9: return "Number Nine";
case PCI_VENDOR_ID_UMC: return "UMC";
case PCI_VENDOR_ID_X: return "X TECHNOLOGY";
case PCI_VENDOR_ID_NEXGEN: return "Nexgen";
case PCI_VENDOR_ID_QLOGIC: return "Q Logic";
case PCI_VENDOR_ID_LEADTEK: return "Leadtek Research";
case PCI_VENDOR_ID_CONTAQ: return "Contaq";
......@@ -430,10 +438,13 @@ const char *pci_strvendor(unsigned int vendor)
case PCI_VENDOR_ID_IMS: return "IMS";
case PCI_VENDOR_ID_TEKRAM2: return "Tekram";
case PCI_VENDOR_ID_AMCC: return "AMCC";
case PCI_VENDOR_ID_INTERG: return "Intergraphics";
case PCI_VENDOR_ID_REALTEK: return "Realtek";
case PCI_VENDOR_ID_INIT: return "Initio Corp";
case PCI_VENDOR_ID_VIA: return "VIA Technologies";
case PCI_VENDOR_ID_VORTEX: return "VORTEX";
case PCI_VENDOR_ID_EF: return "Efficient Networks";
case PCI_VENDOR_ID_FORE: return "Fore Systems";
case PCI_VENDOR_ID_IMAGINGTECH: return "Imaging Technology";
case PCI_VENDOR_ID_PLX: return "PLX";
case PCI_VENDOR_ID_ALLIANCE: return "Alliance";
......
......@@ -19,12 +19,18 @@ dep_tristate 'Adaptec AHA152X support' CONFIG_SCSI_AHA152X $CONFIG_SCSI
dep_tristate 'Adaptec AHA1542 support' CONFIG_SCSI_AHA1542 $CONFIG_SCSI
dep_tristate 'Adaptec AHA1740 support' CONFIG_SCSI_AHA1740 $CONFIG_SCSI
dep_tristate 'Adaptec AHA274X/284X/294X support' CONFIG_SCSI_AIC7XXX $CONFIG_SCSI
dep_tristate 'BusLogic SCSI support' CONFIG_SCSI_BUSLOGIC $CONFIG.SCSI
dep_tristate 'BusLogic SCSI support' CONFIG_SCSI_BUSLOGIC $CONFIG_SCSI
dep_tristate 'EATA-DMA (DPT, NEC, ATT, Olivetti) support' CONFIG_SCSI_EATA_DMA $CONFIG_SCSI
dep_tristate 'EATA-PIO (old DPT PM2001, PM2012A) support' CONFIG_SCSI_EATA_PIO $CONFIG_SCSI
dep_tristate 'UltraStor 14F/34F support' CONFIG_SCSI_U14_34F $CONFIG_SCSI
dep_tristate 'Future Domain 16xx SCSI support' CONFIG_SCSI_FUTURE_DOMAIN $CONFIG_SCSI
dep_tristate 'Generic NCR5380 SCSI support' CONFIG_SCSI_GENERIC_NCR5380 $CONFIG_SCSI
dep_tristate 'Generic NCR5380/53c400 SCSI support' CONFIG_SCSI_GENERIC_NCR5380 $CONFIG_SCSI
if [ "$CONFIG_SCSI_GENERIC_NCR5380" != "n" ]; then
bool ' Enable NCR53c400 extensions' CONFIG_SCSI_GENERIC_NCR53C400
choice 'NCR5380/53c400 mapping method (use Port for T130B)' \
"Port CONFIG_SCSI_G_NCR5380_PORT \
Memory CONFIG_SCSI_G_NCR5380_MEM" Port
fi
if [ "$CONFIG_PCI" = "y" ]; then
dep_tristate 'NCR53c7,8xx SCSI support' CONFIG_SCSI_NCR53C7xx $CONFIG_SCSI
fi
......
......@@ -20,6 +20,9 @@ SCSI_SRCS = $(wildcard $(L_OBJS:%.o=%.c))
AHA152X = -DDEBUG_AHA152X -DAUTOCONF
.SUFFIXES:
.SUFFIXES: .c .o .h .a
ifeq (${CFLAGS},)
CFLAGS = -D__KERNEL__=1 \
-DMODULE -Wall -Wstrict-prototypes -I. -I../../include \
......@@ -183,8 +186,10 @@ endif
ifeq ($(CONFIG_SCSI_GENERIC_NCR5380),y)
L_OBJS += g_NCR5380.o
EXTRA_CFLAGS = -DGENERIC_NCR5380_OVERRIDE="{{(NCR5380_map_type)0x350,5,0, BOARD_NCR53C400}};"
else
ifeq ($(CONFIG_SCSI_GENERIC_NCR5380),m)
EXTRA_CFLAGS = -DGENERIC_NCR5380_OVERRIDE="{{(NCR5380_map_type)0x350,5,0, BOARD_NCR53C400}};"
M_OBJS += g_NCR5380.o
endif
endif
......
This diff is collapsed.
......@@ -29,9 +29,7 @@
#define NCR5380_H
#define NCR5380_PUBLIC_RELEASE 6
#ifdef NCR53C400
#define NCR53C400_PUBLIC_RELEASE 1
#endif
#define NCR53C400_PUBLIC_RELEASE 2
#define NDEBUG_ARBITRATION 0x1
#define NDEBUG_AUTOSENSE 0x2
......@@ -53,6 +51,9 @@
#define NDEBUG_LAST_BYTE_SENT 0x20000
#define NDEBUG_RESTART_SELECT 0x40000
#define NDEBUG_EXTENDED 0x80000
#define NDEBUG_C400_PREAD 0x100000
#define NDEBUG_C400_PWRITE 0x200000
#define NDEBUG_LISTS 0x400000
/*
* The contents of the OUTPUT DATA register are asserted on the bus when
......@@ -158,31 +159,32 @@
/* Write any value to this register to start an ini mode DMA receive */
#define START_DMA_INITIATOR_RECEIVE_REG 7 /* wo */
#ifdef NCR53C400
#define C400_CONTROL_STATUS_REG -8 /* rw */
#define C400_CONTROL_STATUS_REG NCR53C400_register_offset-8 /* rw */
#define CSR_RESET 0x80 /* wo Resets 53c400 */
#define CSR_53C80_REG 0x80 /* ro 5380 registers busy */
#define CSR_TRANS_DIR 0x40 /* rw Data transfer direction */
#define CSR_SCSI_BUFF_INTR 0x20 /* rw Enable int on transfer ready */
#define CSR_53C80_INTR 0x10 /* rw Enable 53c80 interrupts */
#define CSR_SHARED_INTR 0x08 /* rw Interrupt sharing */
#define CSR_SHARED_INTR 0x08 /* rw Interrupt sharing */
#define CSR_HOST_BUF_NOT_RDY 0x04 /* ro Is Host buffer ready */
#define CSR_SCSI_BUF_RDY 0x02 /* ro SCSI buffer read */
#define CSR_GATED_53C80_IRQ 0x01 /* ro Last block xferred */
#if 0
#define CSR_BASE CSR_SCSI_BUFF_INTR | CSR_53C80_INTR
#else
#define CSR_BASE CSR_53C80_INTR
#endif
/* Number of 128-byte blocks to be transferred */
#define C400_CLOCK_COUNTER_REG -7 /* rw */
#define C400_BLOCK_COUNTER_REG NCR53C400_register_offset-7 /* rw */
/* Resume transfer after disconnect */
#define C400_RESUME_TRANSFER_REG -6 /* wo */
#define C400_RESUME_TRANSFER_REG NCR53C400_register_offset-6 /* wo */
/* Access to host buffer stack */
#define C400_HOST_BUFFER -4 /* rw */
#endif /* NCR53C400 */
#define C400_HOST_BUFFER NCR53C400_register_offset-4 /* rw */
/* Note : PHASE_* macros are based on the values of the STATUS register */
......@@ -237,6 +239,7 @@
#define FLAG_HAS_LAST_BYTE_SENT 1 /* NCR53c81 or better */
#define FLAG_CHECK_LAST_BYTE_SENT 2 /* Only test once */
#define FLAG_NCR53C400 4 /* NCR53c400 */
#define FLAG_NO_PSEUDO_DMA 8 /* Inhibit DMA */
#ifndef ASM
struct NCR5380_hostdata {
......@@ -275,6 +278,8 @@ static void NCR5380_information_transfer (struct Scsi_Host *instance);
static void NCR5380_intr (int irq, struct pt_regs * regs);
static void NCR5380_main (void);
static void NCR5380_print_options (struct Scsi_Host *instance);
static void NCR5380_print_phase (struct Scsi_Host *instance);
static void NCR5380_print (struct Scsi_Host *instance);
#ifndef NCR5380_abort
static
#endif
......
REAME file for the Linux g_NCR5380 driver.
(c) 1993 Drew Eckhard
NCR53c400 extensions (c) 1994,1995,1996 Kevin Lentin
This file documents the NCR53c400 extensions by Kevin Lentin and some
enhancements to the NCR5380 core.
This driver supports both NCR5380 and NCR53c400 cards in port or memory
mapped modes. Currently this driver can only support one of those mapping
modes at a time but it does support both of these chips at the same time.
The next release of this driver will support port & memory mapped cards at
the same time. It should be able to handle multiple different cards in the
same machine.
The drivers/scsi/Makefile has an override in it for the most common
NCR53c400 card, the Trantor T130B in its default configuration:
Port: 0x350
IRQ : 5
The NCR53c400 does not support DMA but it does have Pseudo-DMA which is
supported by the driver.
If the default configuration does not work for you, you can use the kernel
command lines (eg using the lilo append command):
ncr5380=port,irq,dma
ncr53c400=port,irq
or
ncr5380=base,irq,dma
ncr53c400=base,irq
The driver does not probe for any addresses or ports other than those in
the OVERRIDE or given to the kernel as above.
This driver provides some information on what it has detected in
/proc/scsi/g_NCR5380/x where x is the scsi card number as detected at boot
time. More info to come in the future.
When NCR53c400 support is compiled in, BIOS paramaters will be returned by
the driver (the raw 5380 driver does not and I don't plan to fiddle with
it!).
This driver works as a module.
Kevin Lentin
K.Lentin@cs.monash.edu.au
This diff is collapsed.
......@@ -7,6 +7,9 @@
* drew@colorado.edu
* +1 (303) 440-4894
*
* NCR53C400 extensions (c) 1994,1995,1996, Kevin Lentin
* K.Lentin@cs.monash.edu.au
*
* ALPHA RELEASE 1.
*
* For more information, please consult
......@@ -31,13 +34,24 @@
#define GENERIC_NCR5380_PUBLIC_RELEASE 1
#ifdef NCR53C400
#define BIOSPARAM
#define NCR5380_BIOSPARAM generic_NCR5380_biosparam
#else
#define NCR5380_BIOSPARAM NULL
#endif
#ifndef ASM
int generic_NCR5380_abort(Scsi_Cmnd *);
int generic_NCR5380_detect(Scsi_Host_Template *);
int generic_NCR5380_release_resources(struct Scsi_Host *);
int generic_NCR5380_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
int generic_NCR5380_reset(Scsi_Cmnd *);
#ifdef BIOSPARAM
int generic_NCR5380_biosparam(Disk *, kdev_t, int *);
#endif
int generic_NCR5380_proc_info(char* buffer, char** start, off_t offset, int length, int hostno, int inout);
#ifndef NULL
#define NULL 0
......@@ -53,36 +67,91 @@ int generic_NCR5380_reset(Scsi_Cmnd *);
#if defined(HOSTS_C) || defined(MODULE)
#define GENERIC_NCR5380 {NULL, NULL, NULL, NULL, \
"Trantor T128/T128F/T228", \
generic_NCR5380_detect, NULL, NULL, NULL, \
#define GENERIC_NCR5380 {NULL, NULL, NULL, \
generic_NCR5380_proc_info, \
"Generic NCR5380/NCR53C400 Scsi Driver", \
generic_NCR5380_detect, generic_NCR5380_release_resources, \
generic_NCR5380_info, NULL, \
generic_NCR5380_queue_command, generic_NCR5380_abort, \
generic_NCR5380_reset, NULL, \
NULL, /* can queue */ CAN_QUEUE, /* id */ 7, SG_ALL, \
generic_NCR5380_reset, NULL, \
NCR5380_BIOSPARAM, \
/* can queue */ CAN_QUEUE, /* id */ 7, SG_ALL, \
/* cmd per lun */ CMD_PER_LUN , 0, 0, DISABLE_CLUSTERING}
#endif
#ifndef HOSTS_C
#define __STRVAL(x) #x
#define STRVAL(x) __STRVAL(x)
#ifdef CONFIG_SCSI_G_NCR5380_PORT
#define NCR5380_map_config port
#define NCR5380_map_type int
#define NCR5380_map_name port
#define NCR5380_instance_name io_port
#define NCR53C400_register_offset 0
#define NCR53C400_address_adjust 8
#ifdef NCR53C400
#define NCR5380_region_size 16
#else
#define NCR5380_region_size 8
#endif
#define NCR5380_read(reg) (inb(NCR5380_map_name + (reg)))
#define NCR5380_write(reg, value) (outb((value), (NCR5380_map_name + (reg))))
#else
/* therefore CONFIG_SCSI_G_NCR5380_MEM */
#define NCR5380_map_config memory
#define NCR5380_map_type volatile unsigned char*
#define NCR5380_map_name base
#define NCR5380_instance_name base
#define NCR53C400_register_offset 0x108
#define NCR53C400_address_adjust 0
#define NCR53C400_mem_base 0x3880
#define NCR53C400_host_buffer 0x3900
#define NCR5380_region_size 0x3a00
#define NCR5380_read(reg) (*(NCR5380_map_name + NCR53C400_mem_base + (reg)))
#define NCR5380_write(reg, value) (*(NCR5380_map_name + NCR53C400_mem_base + (reg)) = value)
#endif
#define NCR5380_implementation_fields \
int port
NCR5380_map_type NCR5380_map_name
#define NCR5380_local_declare() \
register int port
register NCR5380_implementation_fields
#define NCR5380_setup(instance) \
port = (instance)->io_port
#define NCR5380_read(reg) (inb(port + (reg)))
#define NCR5380_write(reg, value) (outb((value), (port + (reg))))
NCR5380_map_name = (NCR5380_map_type)((instance)->NCR5380_instance_name)
#define NCR5380_intr generic_NCR5380_intr
#define NCR5380_queue_command generic_NCR5380_queue_command
#define NCR5380_abort generic_NCR5380_abort
#define NCR5380_reset generic_NCR5380_reset
#define NCR5380_pread generic_NCR5380_pread
#define NCR5380_pwrite generic_NCR5380_pwrite
#define BOARD_NORMAL 0
#define BOARD_NCR5380 0
#define BOARD_NCR53C400 1
#endif /* else def HOSTS_C */
......
......@@ -82,8 +82,9 @@ static int scan_scsis_single (int channel,int dev,int lun,int * max_scsi_dev ,
struct Scsi_Host *shpnt, char * scsi_result);
void scsi_build_commandblocks(Scsi_Device * SDpnt);
#ifdef CONFIG_MODULES
extern struct symbol_table scsi_symbol_table;
#endif
static FreeSectorBitmap * dma_malloc_freelist = NULL;
static int scsi_need_isa_bounce_buffers;
......@@ -2331,7 +2332,9 @@ int scsi_dev_init(void)
timer_table[SCSI_TIMER].fn = scsi_main_timeout;
timer_table[SCSI_TIMER].expires = 0;
#ifdef CONFIG_MODULES
register_symtab(&scsi_symbol_table);
#endif
/* Register the /proc/scsi/scsi entry */
#if CONFIG_PROC_FS
......
......@@ -16,7 +16,7 @@
#define _SCSI_H
/*
* Some of the public constants are being movedd to this file.
* Some of the public constants are being moved to this file.
* We include it here so that what came from where is transparent.
*/
#include <linux/scsi.h>
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment