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 ...@@ -715,8 +715,8 @@ S: East Brunswick, New Jersey 08816
S: USA S: USA
N: Rick Miller N: Rick Miller
E: rick@digalogsys.com E: rdmiller@execpc.com
D: Linux Device Registrar (Major/minor numbers), "au-play", "bwBASIC" D: Original Linux Device Registrar (Major/minor numbers), au-play, bwBASIC
S: S78 W16203 Woods Road S: S78 W16203 Woods Road
S: Muskego, Wisconsin 53150 S: Muskego, Wisconsin 53150
S: USA S: USA
...@@ -810,7 +810,9 @@ D: IPX development and support ...@@ -810,7 +810,9 @@ D: IPX development and support
N: Avery Pennarun N: Avery Pennarun
E: apenwarr@foxnet.net 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: RR #5, 497 Pole Line Road
S: Thunder Bay, Ontario S: Thunder Bay, Ontario
S: CANADA P7C 5M9 S: CANADA P7C 5M9
......
...@@ -649,6 +649,21 @@ CONFIG_IPX ...@@ -649,6 +649,21 @@ CONFIG_IPX
your kernel by about 5 kB. Unless you have Novell computers on your your kernel by about 5 kB. Unless you have Novell computers on your
local network, say N. 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 Appletalk DDP
CONFIG_ATALK CONFIG_ATALK
Appletalk is the way Apple computers speak to each other on an 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 This README belongs to release 4.2 or newer of the SoundBlaster Pro
(Matsushita, Kotobuki, Panasonic, CreativeLabs, Longshine and TEAC) (Matsushita, Kotobuki, Panasonic, CreativeLabs, Longshine and Teac)
CD-ROM driver for Linux. 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! 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, So, you better have a look into README.ide if your port address is 0x1F0,
0x170, 0x1E8, 0x168 or similar. 0x170, 0x1E8, 0x168 or similar.
...@@ -46,7 +46,7 @@ playing audio should work, data access will result in errors. I need qualified ...@@ -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 feedback about the bugs within the data functions or a drive (I never saw a
CD200). 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 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 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 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). ...@@ -69,7 +69,7 @@ the IDE/ATAPI user questions disappear).
This driver will work with the soundcard interfaces (SB Pro, SB 16, Galaxy, 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, 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 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 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, ...@@ -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 because the register layout is different between the "SoundBlaster" and the
"LaserMate" type. "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 "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 0x300 and above. This is unusual, and it can't get covered by the auto
probing scheme. 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 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 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. 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 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 "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 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. ...@@ -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 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 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. XA (PhotoCD) disks with "old" drives give only 50 kB/sec.
This release consists of This release consists of
...@@ -193,7 +196,8 @@ To install: ...@@ -193,7 +196,8 @@ To install:
Most "compatible" sound cards (almost all "non-CreativeLabs" cards) Most "compatible" sound cards (almost all "non-CreativeLabs" cards)
need "SBPRO 0". need "SBPRO 0".
The "no-sound" board from OmniCd needs the "SBPRO 1" setup. 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. All other "no-sound" boards need the "SBPRO 0" setup.
The Spea Media FX and Ensoniq SoundScape cards need "SBPRO 2". The Spea Media FX and Ensoniq SoundScape cards need "SBPRO 2".
sbpcd.c holds some examples in its auto-probe list. sbpcd.c holds some examples in its auto-probe list.
...@@ -204,14 +208,17 @@ To install: ...@@ -204,14 +208,17 @@ To install:
a4. Set DISTRIBUTION to 0. a4. Set DISTRIBUTION to 0.
b. Additionally for 2.a1 and 2.a2, the setup may be done during b. Additionally for 2.a1 and 2.a2, the setup may be done during
boot time (via the "kernel command line" or "LILO option"): boot time (via the "kernel command line" or "LILO option"):
sbpcd=0x230,SoundBlaster
or
sbpcd=0x320,LaserMate sbpcd=0x320,LaserMate
or
sbpcd=0x230,SoundBlaster
or or
sbpcd=0x338,SoundScape sbpcd=0x338,SoundScape
or
sbpcd=0x2C0,Teac16bit
This is especially useful if you install a fresh distribution. This is especially useful if you install a fresh distribution.
If the second parameter is a number, it gets taken as the type 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 So, for example
sbpcd=0x230,1 sbpcd=0x230,1
is equivalent to is equivalent to
......
...@@ -42,7 +42,7 @@ foo \kill}% ...@@ -42,7 +42,7 @@ foo \kill}%
% %
\title{{\bf Linux Allocated Devices}} \title{{\bf Linux Allocated Devices}}
\author{Maintained by H. Peter Anvin $<$hpa@storm.net$>$} \author{Maintained by H. Peter Anvin $<$hpa@storm.net$>$}
\date{Last revised: January 5, 1996} \date{Last revised: February 3, 1996}
\maketitle \maketitle
% %
\noindent \noindent
...@@ -146,8 +146,8 @@ an unreasonable effort. ...@@ -146,8 +146,8 @@ an unreasonable effort.
\major{ }{}{block}{MCA ESDI hard disk} \major{ }{}{block}{MCA ESDI hard disk}
\major{37}{}{char }{IDE tape} \major{37}{}{char }{IDE tape}
\major{38}{}{char }{Myricom PCI Myrinet board} \major{38}{}{char }{Myricom PCI Myrinet board}
\major{39}{}{char }{Reserved for ncpfs $<$lendecke@namu01.gwdg.de$>$} \major{39}{--40}{}{Unallocated}
\major{40}{--41}{}{Unallocated} \major{41}{}{char}{Yet Another Micro Monitor}
\major{42}{}{}{Demo/sample use} \major{42}{}{}{Demo/sample use}
\major{43}{}{char }{isdn4linux virtual modem} \major{43}{}{char }{isdn4linux virtual modem}
\major{44}{}{char }{isdn4linux virtual modem -- alternate devices} \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} ...@@ -858,11 +858,12 @@ packet I/O''. The board is also accessible as a regular {\file eth}
networking device. networking device.
\begin{devicelist} \begin{devicelist}
\major{39}{}{char }{Reserved for ncpfs $<$lendecke@namu01.gwdg.de$>$} \major{39}{--40}{}{Unallocated}
\end{devicelist} \end{devicelist}
\begin{devicelist} \begin{devicelist}
\major{40}{--41}{}{Unallocated} \major{41}{}{char }{Yet Another Micro Monitor}
\minor{0}{/dev/yamm}{Yet Another Micro Monitor}
\end{devicelist} \end{devicelist}
\begin{devicelist} \begin{devicelist}
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
Maintained by H. Peter Anvin <hpa@storm.net> 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 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 he stopped maintaining when he lost network access in 1993. It is a
...@@ -581,9 +581,10 @@ an unreasonable effort. ...@@ -581,9 +581,10 @@ an unreasonable effort.
and "user level packet I/O." This board is also and "user level packet I/O." This board is also
accessible as a standard networking "eth" device. 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 42 Demo/sample use
......
...@@ -172,7 +172,7 @@ d) Compress the contents of the ramdisk. The level of compression ...@@ -172,7 +172,7 @@ d) Compress the contents of the ramdisk. The level of compression
e) Put the kernel onto the floppy 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 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 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 ...@@ -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 size would be reasonable. Make sure offset+size of ram_image.gz is
not larger than the total space on your floppy (usually 1440kB). 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. 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 For ramdisk_start=400, load_ramdisk=1, ramdisk_start=400, one would
......
VERSION = 1 VERSION = 1
PATCHLEVEL = 3 PATCHLEVEL = 3
SUBLEVEL = 59 SUBLEVEL = 60
ARCH = i386 ARCH = i386
...@@ -12,6 +12,9 @@ ARCH = i386 ...@@ -12,6 +12,9 @@ ARCH = i386
# NOTE! SMP is experimental. See the file Documentation/SMP.txt # NOTE! SMP is experimental. See the file Documentation/SMP.txt
# #
# SMP = 1 # SMP = 1
#
# SMP profiling options
# SMP_PROF = 1
.EXPORT_ALL_VARIABLES: .EXPORT_ALL_VARIABLES:
...@@ -20,17 +23,22 @@ CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \ ...@@ -20,17 +23,22 @@ CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
else echo sh; fi ; fi) else echo sh; fi ; fi)
TOPDIR := $(shell if [ "$$PWD" != "" ]; then echo $$PWD; else pwd; fi) TOPDIR := $(shell if [ "$$PWD" != "" ]; then echo $$PWD; else pwd; fi)
HPATH = $(TOPDIR)/include HPATH = $(TOPDIR)/include
AS =as
LD =ld HOSTCC =gcc -I$(HPATH)
HOSTCC =gcc -I$(HPATH) HOSTCFLAGS =
CC =gcc -D__KERNEL__ -I$(HPATH)
MAKE =make CROSS_COMPILE =
AS =$(CROSS_COMPILE)as
LD =$(CROSS_COMPILE)ld
CC =$(CROSS_COMPILE)gcc -D__KERNEL__ -I$(HPATH)
CPP =$(CC) -E CPP =$(CC) -E
AR =ar AR =$(CROSS_COMPILE)ar
NM =nm NM =$(CROSS_COMPILE)nm
STRIP =strip STRIP =$(CROSS_COMPILE)strip
AWK =awk MAKE =make
AWK =gawk
all: do-it-all all: do-it-all
...@@ -88,7 +96,7 @@ SVGA_MODE= -DSVGA_MODE=NORMAL_VGA ...@@ -88,7 +96,7 @@ SVGA_MODE= -DSVGA_MODE=NORMAL_VGA
# standard CFLAGS # standard CFLAGS
# #
CFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer CFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -fno-strength-reduce
ifdef CONFIG_CPP ifdef CONFIG_CPP
CFLAGS := $(CFLAGS) -x c++ CFLAGS := $(CFLAGS) -x c++
...@@ -96,6 +104,12 @@ endif ...@@ -96,6 +104,12 @@ endif
ifdef SMP ifdef SMP
CFLAGS += -D__SMP__ CFLAGS += -D__SMP__
AFLAGS += -D__SMP__
ifdef SMP_PROF
CFLAGS += -D__SMP_PROF__
AFLAGS += -D__SMP_PROF__
endif
endif endif
# #
...@@ -137,9 +151,9 @@ include arch/$(ARCH)/Makefile ...@@ -137,9 +151,9 @@ include arch/$(ARCH)/Makefile
ifdef SMP ifdef SMP
.S.s: .S.s:
$(CC) -D__ASSEMBLY__ -D__SMP__ -traditional -E -o $*.s $< $(CC) -D__ASSEMBLY__ $(AFLAGS) -traditional -E -o $*.s $<
.S.o: .S.o:
$(CC) -D__ASSEMBLY__ -D__SMP__ -traditional -c -o $*.o $< $(CC) -D__ASSEMBLY__ $(AFLAGS) -traditional -c -o $*.o $<
else else
...@@ -175,6 +189,11 @@ xconfig: symlinks ...@@ -175,6 +189,11 @@ xconfig: symlinks
$(MAKE) -C scripts kconfig.tk $(MAKE) -C scripts kconfig.tk
wish -f 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: symlinks
$(CONFIG_SHELL) scripts/Configure arch/$(ARCH)/config.in $(CONFIG_SHELL) scripts/Configure arch/$(ARCH)/config.in
...@@ -288,11 +307,12 @@ endif ...@@ -288,11 +307,12 @@ endif
clean: archclean clean: archclean
rm -f kernel/ksyms.lst include/linux/compile.h 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 core `find . -type f -name 'core' -print`
rm -f vmlinux System.map rm -f vmlinux System.map
rm -f .tmp* drivers/sound/configure rm -f .tmp* drivers/sound/configure
rm -fr modules/* rm -fr modules/*
rm -f submenu*
mrproper: clean mrproper: clean
rm -f include/linux/autoconf.h include/linux/version.h rm -f include/linux/autoconf.h include/linux/version.h
...@@ -301,11 +321,14 @@ mrproper: clean ...@@ -301,11 +321,14 @@ mrproper: clean
rm -f drivers/char/uni_hash.tbl drivers/char/conmakehash rm -f drivers/char/uni_hash.tbl drivers/char/conmakehash
rm -f .version .config* config.in config.old rm -f .version .config* config.in config.old
rm -f scripts/tkparse scripts/kconfig.tk scripts/kconfig.tmp 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 include/asm
rm -f .depend `find . -name .depend -print` rm -f .depend `find . -name .depend -print`
rm -f .hdepend rm -f .hdepend
rm -f $(TOPDIR)/include/linux/modversions.h rm -f $(TOPDIR)/include/linux/modversions.h
rm -f $(TOPDIR)/include/linux/modules/* rm -f $(TOPDIR)/include/linux/modules/*
distclean: mrproper distclean: mrproper
rm -f core `find . \( -name '*.orig' -o -name '*~' -o -name '*.bak' \ rm -f core `find . \( -name '*.orig' -o -name '*~' -o -name '*.bak' \
......
...@@ -105,6 +105,11 @@ CONFIGURING the kernel: ...@@ -105,6 +105,11 @@ CONFIGURING the kernel:
needs bash to work: it will search for bash in $BASH, /bin/bash and 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. /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": NOTES on "make config":
- having unnecessary drivers will make the kernel bigger, and can - having unnecessary drivers will make the kernel bigger, and can
under some circumstances lead to problems: probing for a under some circumstances lead to problems: probing for a
......
...@@ -25,9 +25,13 @@ ...@@ -25,9 +25,13 @@
ifdef CONFIG_KERNEL_ELF ifdef CONFIG_KERNEL_ELF
LD=ld -m elf_i386 LD=$(CROSS_COMPILE)ld -m elf_i386
CPP=$(CC) -E -D__ELF__ 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 OBJDUMP_FLAGS=-k -q
ZLDFLAGS=-e startup_32 ZLDFLAGS=-e startup_32
LDFLAGS=-e stext LDFLAGS=-e stext
......
...@@ -8,15 +8,12 @@ ...@@ -8,15 +8,12 @@
# Copyright (C) 1994 by Linus Torvalds # Copyright (C) 1994 by Linus Torvalds
# #
AS86 =as86 -0 -a
LD86 =ld86 -0
ifdef CONFIG_KERNEL_ELF ifdef CONFIG_KERNEL_ELF
CFLAGS := $(CFLAGS) -D__BFD__ HOSTCFLAGS := $(HOSTCFLAGS) -D__BFD__
endif endif
ifdef SMP ifdef SMP
CFLAGS := $(CFLAGS) -D__SMP__ HOSTCFLAGS := $(HOSTCFLAGS) -D__SMP__
endif endif
zImage: $(CONFIGURE) bootsect setup compressed/vmlinux tools/build zImage: $(CONFIGURE) bootsect setup compressed/vmlinux tools/build
...@@ -45,7 +42,7 @@ install: $(CONFIGURE) zImage ...@@ -45,7 +42,7 @@ install: $(CONFIGURE) zImage
sh ./install.sh $(VERSION).$(PATCHLEVEL).$(SUBLEVEL) zImage $(TOPDIR)/System.map "$(INSTALL_PATH)" sh ./install.sh $(VERSION).$(PATCHLEVEL).$(SUBLEVEL) zImage $(TOPDIR)/System.map "$(INSTALL_PATH)"
tools/build: tools/build.c tools/build: tools/build.c
$(HOSTCC) $(CFLAGS) -o $@ $< -I$(TOPDIR)/include $(HOSTCC) $(HOSTCFLAGS) -o $@ $< -I$(TOPDIR)/include
setup: setup.o setup: setup.o
$(LD86) -s -o $@ $< $(LD86) -s -o $@ $<
......
...@@ -47,7 +47,7 @@ piggy.o: $(SYSTEM) ...@@ -47,7 +47,7 @@ piggy.o: $(SYSTEM)
rm -f $$tmppiggy $$tmppiggy.gz; \ rm -f $$tmppiggy $$tmppiggy.gz; \
$(OBJDUMP) $(OBJDUMP_FLAGS) -o $(IMAGE_OFFSET) $(SYSTEM) > $$tmppiggy; \ $(OBJDUMP) $(OBJDUMP_FLAGS) -o $(IMAGE_OFFSET) $(SYSTEM) > $$tmppiggy; \
gzip -f -9 < $$tmppiggy > $$tmppiggy.gz; \ 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 rm -f $$tmppiggy $$tmppiggy.gz
else else
......
...@@ -8,7 +8,6 @@ mainmenu_option next_comment ...@@ -8,7 +8,6 @@ mainmenu_option next_comment
comment 'Loadable module support' comment 'Loadable module support'
bool 'Enable loadable module support' CONFIG_MODULES bool 'Enable loadable module support' CONFIG_MODULES
if [ "$CONFIG_MODULES" = "y" ]; then if [ "$CONFIG_MODULES" = "y" ]; then
MODULES=y
bool 'Set version information on all symbols for modules' CONFIG_MODVERSIONS bool 'Set version information on all symbols for modules' CONFIG_MODVERSIONS
bool 'Kernel daemon support (e.g. autoload of modules)' CONFIG_KERNELD bool 'Kernel daemon support (e.g. autoload of modules)' CONFIG_KERNELD
fi fi
......
...@@ -25,7 +25,7 @@ CONFIG_KERNEL_ELF=y ...@@ -25,7 +25,7 @@ CONFIG_KERNEL_ELF=y
CONFIG_M586=y CONFIG_M586=y
# #
# block devices # Block devices
# #
CONFIG_BLK_DEV_FD=y CONFIG_BLK_DEV_FD=y
# CONFIG_BLK_DEV_RAM is not set # CONFIG_BLK_DEV_RAM is not set
...@@ -61,6 +61,10 @@ CONFIG_INET=y ...@@ -61,6 +61,10 @@ CONFIG_INET=y
# CONFIG_TCP_NAGLE_OFF is not set # CONFIG_TCP_NAGLE_OFF is not set
CONFIG_IP_NOSR=y CONFIG_IP_NOSR=y
CONFIG_SKB_LARGE=y CONFIG_SKB_LARGE=y
#
#
#
# CONFIG_IPX is not set # CONFIG_IPX is not set
# CONFIG_ATALK is not set # CONFIG_ATALK is not set
# CONFIG_AX25 is not set # CONFIG_AX25 is not set
...@@ -108,7 +112,9 @@ CONFIG_MINIX_FS=y ...@@ -108,7 +112,9 @@ CONFIG_MINIX_FS=y
# CONFIG_EXT_FS is not set # CONFIG_EXT_FS is not set
CONFIG_EXT2_FS=y CONFIG_EXT2_FS=y
# CONFIG_XIA_FS is not set # CONFIG_XIA_FS is not set
CONFIG_FAT_FS=y
CONFIG_MSDOS_FS=y CONFIG_MSDOS_FS=y
# CONFIG_VFAT_FS is not set
# CONFIG_UMSDOS_FS is not set # CONFIG_UMSDOS_FS is not set
CONFIG_PROC_FS=y CONFIG_PROC_FS=y
CONFIG_NFS_FS=y CONFIG_NFS_FS=y
...@@ -119,7 +125,7 @@ CONFIG_ISO9660_FS=y ...@@ -119,7 +125,7 @@ CONFIG_ISO9660_FS=y
# CONFIG_SYSV_FS is not set # CONFIG_SYSV_FS is not set
# #
# character devices # Character devices
# #
# CONFIG_CYCLADES is not set # CONFIG_CYCLADES is not set
# CONFIG_STALDRV is not set # CONFIG_STALDRV is not set
......
...@@ -7,18 +7,13 @@ ...@@ -7,18 +7,13 @@
# #
# Note 2! The CFLAGS definitions are now in the main makefile... # Note 2! The CFLAGS definitions are now in the main makefile...
AS86 =as86 -0 -a
AS386 =as86 -3
LD86 =ld86 -0
#.S.s: #.S.s:
# $(CPP) -D__ASSEMBLY__ -traditional $< -o $*.s # $(CPP) -D__ASSEMBLY__ -traditional $< -o $*.s
ifdef SMP ifdef SMP
.S.o: .S.o:
$(CC) -D__ASSEMBLY__ -D__SMP__ -traditional -c $< -o $*.o $(CC) -D__ASSEMBLY__ $(AFLAGS) -traditional -c $< -o $*.o
else else
.S.o: .S.o:
$(CC) -D__ASSEMBLY__ -traditional -c $< -o $*.o $(CC) -D__ASSEMBLY__ -traditional -c $< -o $*.o
......
...@@ -148,18 +148,31 @@ ENOSYS = 38 ...@@ -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 \ #define ENTER_KERNEL \
pushl %eax; \ pushl %eax; \
pushl %edx; \ pushl %edx; \
pushfl; \ pushfl; \
cli; \ cli; \
GET_PROCESSOR_ID \ GET_PROCESSOR_ID \
SMP_PROF_A \
1: lock; \ 1: lock; \
btsl $0, SYMBOL_NAME(kernel_flag); \ btsl $0, SYMBOL_NAME(kernel_flag); \
jnc 3f; \ jnc 3f; \
cmpb SYMBOL_NAME(active_kernel_processor), %al; \ cmpb SYMBOL_NAME(active_kernel_processor), %al; \
je 4f; \ je 4f; \
2: incl SYMBOL_NAME(smp_spins); \ 2: SMP_PROF_B \
btl %al, SYMBOL_NAME(smp_invalidate_needed); \ btl %al, SYMBOL_NAME(smp_invalidate_needed); \
jnc 5f; \ jnc 5f; \
lock; \ lock; \
......
...@@ -36,6 +36,10 @@ ...@@ -36,6 +36,10 @@
static unsigned char cache_21 = 0xff; static unsigned char cache_21 = 0xff;
static unsigned char cache_A1 = 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) void disable_irq(unsigned int irq_nr)
{ {
unsigned long flags; unsigned long flags;
...@@ -188,15 +192,78 @@ int get_irq_list(char *buf) ...@@ -188,15 +192,78 @@ int get_irq_list(char *buf)
/* /*
* Linus - should you add NMI counts here ????? * Linus - should you add NMI counts here ?????
*/ */
#ifdef __SMP__ #ifdef __SMP_PROF__
len+=sprintf(buf+len, "IPI: %8lu received\n", len+=sprintf(buf+len, "IPI: %8lu received\n",
ipi_count); ipi_count);
len+=sprintf(buf+len, "LCK: %8lu spins\n",
smp_spins);
#endif #endif
return len; 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 * do_IRQ handles IRQ's that have been installed without the
* SA_INTERRUPT flag: it uses the full signal-handling return * SA_INTERRUPT flag: it uses the full signal-handling return
...@@ -213,6 +280,9 @@ asmlinkage void do_IRQ(int irq, struct pt_regs * regs) ...@@ -213,6 +280,9 @@ asmlinkage void do_IRQ(int irq, struct pt_regs * regs)
#endif #endif
kstat.interrupts[irq]++; kstat.interrupts[irq]++;
#ifdef __SMP_PROF__
int_count[smp_processor_id()][irq]++;
#endif
if (action->flags & SA_SAMPLE_RANDOM) if (action->flags & SA_SAMPLE_RANDOM)
add_interrupt_randomness(irq); add_interrupt_randomness(irq);
action->handler(irq, regs); action->handler(irq, regs);
...@@ -233,6 +303,9 @@ asmlinkage void do_fast_IRQ(int irq) ...@@ -233,6 +303,9 @@ asmlinkage void do_fast_IRQ(int irq)
#endif #endif
kstat.interrupts[irq]++; kstat.interrupts[irq]++;
#ifdef __SMP_PROF__
int_count[smp_processor_id()][irq]++;
#endif
if (action->flags & SA_SAMPLE_RANDOM) if (action->flags & SA_SAMPLE_RANDOM)
add_interrupt_randomness(irq); add_interrupt_randomness(irq);
action->handler(irq, NULL); action->handler(irq, NULL);
......
...@@ -130,6 +130,10 @@ asmlinkage int sys_idle(void) ...@@ -130,6 +130,10 @@ asmlinkage int sys_idle(void)
{ {
if(current->pid != 0) if(current->pid != 0)
return -EPERM; return -EPERM;
#ifdef __SMP_PROF__
smp_spins_sys_idle[smp_processor_id()]+=
smp_spins_syscall_cur[smp_processor_id()];
#endif
current->counter= -100; current->counter= -100;
schedule(); schedule();
return 0; return 0;
......
...@@ -63,9 +63,19 @@ volatile unsigned long kernel_flag=0; /* Kernel spinlock */ ...@@ -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 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 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 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 */ 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. * Checksum an MP configuration block.
...@@ -473,8 +483,10 @@ void smp_boot_cpus(void) ...@@ -473,8 +483,10 @@ void smp_boot_cpus(void)
/* /*
* Map the local APIC into kernel space * 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) if(apic_reg == NULL)
...@@ -518,45 +530,63 @@ void smp_boot_cpus(void) ...@@ -518,45 +530,63 @@ void smp_boot_cpus(void)
cfg|=(1<<8); /* Enable APIC */ cfg|=(1<<8); /* Enable APIC */
apic_write(APIC_SPIV,cfg); apic_write(APIC_SPIV,cfg);
/* 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.
*/
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++) /*
* 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)) cfg=apic_read(APIC_ICR2);
break; /* It has booted */ cfg&=0x00FFFFFF;
udelay(100); /* Wait 5s total for a response */ 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)) if(timeout==0||timeout==20001)
cpucount++;
else
{ {
/* cfg=apic_read(APIC_ICR);
* At this point we should set up a BIOS warm start and try cfg&=~0xFDFFF ; /* Clear bits */
* a RESTART IPI. The 486+82489 MP pair don't support STARTUP IPI's cfg|=APIC_DEST_FIELD|APIC_DEST_DM_STARTUP|(((unsigned long)stack)>>12); /* Boot on the stack */
*/ apic_write(APIC_ICR, cfg); /* Kick the second */
if(*((unsigned char *)8192)==0xA5) udelay(10); /* Masses of time */
printk("Stuck ??\n"); cfg=apic_read(APIC_ESR);
else if(cfg&4) /* Send accept error */
printk("Not responding.\n"); printk("Processor refused startup request.\n");
cpu_present_map&=~(1<<i);
} }
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) ...@@ -797,13 +827,14 @@ void smp_invalidate(void)
void smp_reschedule_irq(int cpl, struct pt_regs *regs) void smp_reschedule_irq(int cpl, struct pt_regs *regs)
{ {
#ifdef DEBUGGING_SMP_RESCHED
static int ct=0; static int ct=0;
if(ct==0) if(ct==0)
{ {
printk("Beginning scheduling on CPU#%d\n",smp_processor_id()); printk("Beginning scheduling on CPU#%d\n",smp_processor_id());
ct=1; ct=1;
} }
#endif
if(smp_processor_id()!=active_kernel_processor) if(smp_processor_id()!=active_kernel_processor)
panic("SMP Reschedule on CPU #%d, but #%d is active.\n", panic("SMP Reschedule on CPU #%d, but #%d is active.\n",
smp_processor_id(), active_kernel_processor); smp_processor_id(), active_kernel_processor);
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
# Block device driver configuration # Block device driver configuration
# #
mainmenu_option next_comment mainmenu_option next_comment
comment 'block devices' comment 'Block devices'
tristate 'Normal floppy disk support' CONFIG_BLK_DEV_FD tristate 'Normal floppy disk support' CONFIG_BLK_DEV_FD
tristate 'RAM disk support' CONFIG_BLK_DEV_RAM 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, ...@@ -3248,6 +3248,14 @@ static int fd_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
return 0; return 0;
case FDFMTBEG: 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; return 0;
case FDFMTTRK: case FDFMTTRK:
if (UDRS->fd_ref != 1) if (UDRS->fd_ref != 1)
...@@ -3671,30 +3679,33 @@ static char get_fdc_version(void) ...@@ -3671,30 +3679,33 @@ static char get_fdc_version(void)
return FDC_82077; /* Revised 82077AA passes all the tests */ return FDC_82077; /* Revised 82077AA passes all the tests */
} }
switch (reply_buffer[0] >> 5) { switch (reply_buffer[0] >> 5) {
case 0x0: case 0x0:
output_byte(FD_SAVE); output_byte(FD_SAVE);
r = result(); r = result();
if (r != 17) { if (r != 17) {
printk("FDC %d init: SAVE: unexpected return of %d bytes.\n",fdc,r); printk("FDC %d init: SAVE: unexpected return of %d bytes.\n", fdc, r);
return FDC_UNKNOWN; return FDC_UNKNOWN;
} }
if (!(reply_buffer[0] & 0x40)) { if (!(reply_buffer[0] & 0x40)) {
printk("FDC %d is a 3Volt 82078SL.\n",fdc); 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; return FDC_82078;
} case 0x2:
/* Either a 82078-1 or a 82078SL running at 5Volt */ printk("FDC %d is a S82078B\n", fdc);
printk("FDC %d is a 82078-1.\n",fdc); return FDC_S82078B;
return FDC_82078_1; case 0x3:
case 0x1: printk("FDC %d is a National Semiconductor PC87306\n", fdc);
printk("FDC %d is a 44pin 82078\n",fdc); return FDC_87306;
return FDC_82078; default:
case 0x3: printk("FDC %d init: 82077 variant with PARTID=%d.\n",
printk("FDC %d is a National Semiconductor PC87306\n",fdc); fdc, reply_buffer[0] >> 5);
return FDC_87306; return FDC_82077_UNKN;
default:
printk("FDC %d init: Unknown 82077 variant, PARTID = %d.\n",
fdc, reply_buffer[0] >> 5);
return FDC_82077_UNKN;
} }
} /* get_fdc_version */ } /* get_fdc_version */
......
...@@ -1959,6 +1959,7 @@ read_subcode(void) ...@@ -1959,6 +1959,7 @@ read_subcode(void)
static int static int
sony_get_subchnl_info(long arg) sony_get_subchnl_info(long arg)
{ {
int err;
struct cdrom_subchnl schi; struct cdrom_subchnl schi;
...@@ -1972,8 +1973,9 @@ sony_get_subchnl_info(long arg) ...@@ -1972,8 +1973,9 @@ sony_get_subchnl_info(long arg)
return -EIO; return -EIO;
} }
verify_area(VERIFY_READ, (char *) arg, sizeof(schi)); err = verify_area(VERIFY_READ, (char *) arg, sizeof(schi)) ||
verify_area(VERIFY_WRITE, (char *) arg, sizeof(schi)); verify_area(VERIFY_WRITE, (char *) arg, sizeof(schi));
if (err) return err;
memcpy_fromfs(&schi, (char *) arg, sizeof(schi)); 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> Tue Dec 5 13:21:27 1995 <tytso@rsts-11.mit.edu>
* serial.c (check_modem_status, rs_ioctl): Support the new * serial.c (check_modem_status, rs_ioctl): Support the new
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
# Character device configuration # Character device configuration
# #
mainmenu_option next_comment mainmenu_option next_comment
comment 'character devices' comment 'Character devices'
tristate 'Cyclades async mux support' CONFIG_CYCLADES tristate 'Cyclades async mux support' CONFIG_CYCLADES
bool 'Stallion multiport serial support' CONFIG_STALDRV bool 'Stallion multiport serial support' CONFIG_STALDRV
...@@ -37,8 +37,8 @@ if [ "$CONFIG_APM" = "y" ]; then ...@@ -37,8 +37,8 @@ if [ "$CONFIG_APM" = "y" ]; then
bool ' Enable console blanking using APM' CONFIG_APM_DISPLAY_BLANK bool ' Enable console blanking using APM' CONFIG_APM_DISPLAY_BLANK
fi fi
bool 'Watchdog Timer Support' CONFIG_WATCHDOG bool 'Watchdog Timer Support' CONFIG_WATCHDOG
if [ "$CONFIG_WATCHDOG" = "y" ]; then if [ "$CONFIG_WATCHDOG" != "n" ]; then
bool ' WDT Watchdog timer' CONFIG_WDT tristate ' WDT Watchdog timer' CONFIG_WDT
if [ "$CONFIG_WDT" = "y" ]; then if [ "$CONFIG_WDT" = "y" ]; then
bool ' WDT501 features' CONFIG_WDT_501 bool ' WDT501 features' CONFIG_WDT_501
if [ "$CONFIG_WDT_501" = "y" ]; then if [ "$CONFIG_WDT_501" = "y" ]; then
......
...@@ -98,6 +98,16 @@ M = y ...@@ -98,6 +98,16 @@ M = y
# This is not modularized, so if configured then "mouse.c" will be resident # This is not modularized, so if configured then "mouse.c" will be resident
endif 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 ifdef CONFIG_QIC02_TAPE
L_OBJS += tpqic02.o L_OBJS += tpqic02.o
endif endif
......
...@@ -14,6 +14,9 @@ ...@@ -14,6 +14,9 @@
* of the mouse drivers, as they are now completely independent. Linus. * of the mouse drivers, as they are now completely independent. Linus.
* *
* Support for loadable modules. 8-Sep-95 Philip Blundell <pjb27@cam.ac.uk> * 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> #include <linux/module.h>
...@@ -137,5 +140,10 @@ int mouse_init(void) ...@@ -137,5 +140,10 @@ int mouse_init(void)
return -EIO; 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) ...@@ -887,23 +887,32 @@ static int startup(struct async_struct * info)
unsigned long flags; unsigned long flags;
int retval; int retval;
void (*handler)(int, struct pt_regs *); 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; return 0;
}
if (!info->port || !info->type) { if (!info->port || !info->type) {
if (info->tty) if (info->tty)
set_bit(TTY_IO_ERROR, &info->tty->flags); set_bit(TTY_IO_ERROR, &info->tty->flags);
free_page(page);
restore_flags(flags);
return 0; return 0;
} }
if (info->xmit_buf)
if (!info->xmit_buf) { free_page(page);
info->xmit_buf = (unsigned char *) get_free_page(GFP_KERNEL); else
if (!info->xmit_buf) info->xmit_buf = (unsigned char *) page;
return -ENOMEM;
}
save_flags(flags); cli();
#ifdef SERIAL_DEBUG_OPEN #ifdef SERIAL_DEBUG_OPEN
printk("starting up ttys%d (irq %d)...", info->line, info->irq); 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, ...@@ -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 * If the device is in the middle of being closed, then block
* until it's done, and then try again. * 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); interruptible_sleep_on(&info->close_wait);
#ifdef SERIAL_DO_RESTART #ifdef SERIAL_DO_RESTART
if (info->flags & ASYNC_HUP_NOTIFY) if (info->flags & ASYNC_HUP_NOTIFY)
...@@ -2271,7 +2281,10 @@ static int block_til_ready(struct tty_struct *tty, struct file * filp, ...@@ -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", printk("block_til_ready before block: ttys%d, count = %d\n",
info->line, info->count); info->line, info->count);
#endif #endif
info->count--; cli();
if (!tty_hung_up_p(filp))
info->count--;
sti();
info->blocked_open++; info->blocked_open++;
while (1) { while (1) {
cli(); cli();
...@@ -2333,6 +2346,7 @@ int rs_open(struct tty_struct *tty, struct file * filp) ...@@ -2333,6 +2346,7 @@ int rs_open(struct tty_struct *tty, struct file * filp)
{ {
struct async_struct *info; struct async_struct *info;
int retval, line; int retval, line;
unsigned long page;
line = MINOR(tty->device) - tty->driver.minor_start; line = MINOR(tty->device) - tty->driver.minor_start;
if ((line < 0) || (line >= NR_PORTS)) if ((line < 0) || (line >= NR_PORTS))
...@@ -2350,9 +2364,13 @@ int rs_open(struct tty_struct *tty, struct file * filp) ...@@ -2350,9 +2364,13 @@ int rs_open(struct tty_struct *tty, struct file * filp)
info->tty = tty; info->tty = tty;
if (!tmp_buf) { if (!tmp_buf) {
tmp_buf = (unsigned char *) get_free_page(GFP_KERNEL); page = get_free_page(GFP_KERNEL);
if (!tmp_buf) if (!page)
return -ENOMEM; return -ENOMEM;
if (tmp_buf)
free_page(page);
else
tmp_buf = (unsigned char *) page;
} }
/* /*
......
...@@ -39,7 +39,7 @@ static int timer_alive = 0; ...@@ -39,7 +39,7 @@ static int timer_alive = 0;
* If the timer expires.. * If the timer expires..
*/ */
static void watchdog_fire(long data) static void watchdog_fire(unsigned long data)
{ {
extern void hard_reset_now(void); extern void hard_reset_now(void);
hard_reset_now(); hard_reset_now();
......
...@@ -2585,7 +2585,8 @@ static int qic02_tape_ioctl(struct inode * inode, struct file * filp, ...@@ -2585,7 +2585,8 @@ static int qic02_tape_ioctl(struct inode * inode, struct file * filp,
if (c == DDIOCSDBG) { if (c == DDIOCSDBG) {
if (!suser()) if (!suser())
return -EPERM; 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); c = get_user_long((int *) ioarg);
if (c==0) { if (c==0) {
QIC02_TAPE_DEBUG = 0; QIC02_TAPE_DEBUG = 0;
......
...@@ -15,8 +15,9 @@ ...@@ -15,8 +15,9 @@
* herein by reference. The driver is provided without warranty or * herein by reference. The driver is provided without warranty or
* support. * support.
* *
* Release 0.04. * Release 0.05.
* *
* Some changes by Dave Gregorich to fix modularisation and minor bugs.
*/ */
#include <linux/config.h> #include <linux/config.h>
...@@ -110,7 +111,7 @@ static int wdt_lseek(struct inode *inode, struct file *file, off_t offset, ...@@ -110,7 +111,7 @@ static int wdt_lseek(struct inode *inode, struct file *file, off_t offset,
return -ESPIPE; 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 */ /* Write a watchdog value */
inb_p(WDT_DC); inb_p(WDT_DC);
...@@ -138,7 +139,7 @@ static int wdt_read(struct inode *inode, struct file *file, char *buf, int count ...@@ -138,7 +139,7 @@ static int wdt_read(struct inode *inode, struct file *file, char *buf, int count
return err; return err;
c*=11; c*=11;
c/=15; c/=15;
cp=c; cp=c+7;
memcpy_tofs(buf,&cp,1); memcpy_tofs(buf,&cp,1);
return 1; return 1;
default: default:
...@@ -217,12 +218,14 @@ static struct mouse wdt_mouse= ...@@ -217,12 +218,14 @@ static struct mouse wdt_mouse=
&wdt_fops &wdt_fops
}; };
#ifdef CONFIG_WDT_501
static struct mouse temp_mouse= static struct mouse temp_mouse=
{ {
TEMP_MINOR, TEMP_MINOR,
"temperature", "temperature",
&wdt_fops &wdt_fops
}; };
#endif
#ifdef MODULE #ifdef MODULE
...@@ -263,7 +266,9 @@ int wdt_init(void) ...@@ -263,7 +266,9 @@ int wdt_init(void)
return -EIO; return -EIO;
} }
mouse_register(&wdt_mouse); mouse_register(&wdt_mouse);
#ifdef CONFIG_WDT_501
mouse_register(&temp_mouse); mouse_register(&temp_mouse);
#endif
request_region(io, 8, "wdt501"); request_region(io, 8, "wdt501");
return 0; return 0;
} }
......
...@@ -640,15 +640,15 @@ static void set_multicast_list(struct device *dev) ...@@ -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); printk("%s: Setting Rx mode to %d addresses.\n", dev->name, dev->mc_count);
} }
} }
if (dev->mc_count || (dev->flags&IFF_ALLMULTI)) if (dev->flags&IFF_PROMISC)
{
outw(SetRxFilter|RxStation|RxMulticast|RxBroadcast, ioaddr + EL3_CMD);
}
else if (dev->flags&IFF_PROMISC)
{ {
outw(SetRxFilter | RxStation | RxMulticast | RxBroadcast | RxProm, outw(SetRxFilter | RxStation | RxMulticast | RxBroadcast | RxProm,
ioaddr + EL3_CMD); ioaddr + EL3_CMD);
} }
else if (dev->mc_count || (dev->flags&IFF_ALLMULTI))
{
outw(SetRxFilter|RxStation|RxMulticast|RxBroadcast, ioaddr + EL3_CMD);
}
else else
outw(SetRxFilter | RxStation | RxBroadcast, ioaddr + EL3_CMD); outw(SetRxFilter | RxStation | RxBroadcast, ioaddr + EL3_CMD);
} }
......
...@@ -968,7 +968,8 @@ int arcnet_reset(struct device *dev) ...@@ -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> * but since there are three different ARCnet devices ANYWAY... <gargle>
* *
* Actually, the whole idea of having all this kernel-dependent stuff (ie. * Actually, the whole idea of having all this kernel-dependent stuff (ie.
...@@ -976,23 +977,25 @@ int arcnet_reset(struct device *dev) ...@@ -976,23 +977,25 @@ int arcnet_reset(struct device *dev)
* *
* Intelligent defaults?! Nah. * Intelligent defaults?! Nah.
*/ */
void arcnet_setup(struct device *dev) void arcnet_setup(struct device *dev)
{ {
int i; int i;
for (i=0; i<DEV_NUMBUFFS; i++) for (i=0; i<DEV_NUMBUFFS; i++)
skb_queue_head_init(&dev->buffs[i]); skb_queue_head_init(&dev->buffs[i]);
dev->broadcast[0]=0x00; /* broadcasts on ARCnet are address 0 */ dev->broadcast[0] = 0x00; /* broadcasts on ARCnet are address 0 */
dev->addr_len=1; dev->addr_len = 1;
dev->type=ARPHRD_ARCNET; dev->type = ARPHRD_ARCNET;
dev->tx_queue_len = 30; /* Fairly long queue, arcnet is quite speedy */
/* New-style flags. */ /* New-style flags. */
dev->flags = IFF_BROADCAST; dev->flags = IFF_BROADCAST;
dev->family = AF_INET; dev->family = AF_INET;
dev->pa_addr = 0; dev->pa_addr = 0;
dev->pa_brdaddr = 0; dev->pa_brdaddr = 0;
dev->pa_mask = 0; dev->pa_mask = 0;
dev->pa_alen = 4; dev->pa_alen = 4;
} }
......
This diff is collapsed.
...@@ -141,7 +141,8 @@ int loopback_init(struct device *dev) ...@@ -141,7 +141,8 @@ int loopback_init(struct device *dev)
dev->hard_header = eth_header; dev->hard_header = eth_header;
dev->hard_header_len = ETH_HLEN; /* 14 */ dev->hard_header_len = ETH_HLEN; /* 14 */
dev->addr_len = ETH_ALEN; /* 6 */ 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->rebuild_header = eth_rebuild_header;
dev->open = loopback_open; dev->open = loopback_open;
dev->flags = IFF_LOOPBACK|IFF_BROADCAST; dev->flags = IFF_LOOPBACK|IFF_BROADCAST;
......
...@@ -166,18 +166,18 @@ void ether_setup(struct device *dev) ...@@ -166,18 +166,18 @@ void ether_setup(struct device *dev)
} }
dev->hard_header = eth_header; dev->hard_header = eth_header;
dev->rebuild_header = eth_rebuild_header; dev->rebuild_header = eth_rebuild_header;
dev->set_mac_address = eth_mac_addr; dev->set_mac_address = eth_mac_addr;
dev->header_cache_bind = eth_header_cache_bind; dev->header_cache_bind = eth_header_cache_bind;
dev->header_cache_update = eth_header_cache_update; dev->header_cache_update= eth_header_cache_update;
dev->type = ARPHRD_ETHER; dev->type = ARPHRD_ETHER;
dev->hard_header_len = ETH_HLEN; dev->hard_header_len = ETH_HLEN;
dev->mtu = 1500; /* eth_mtu */ dev->mtu = 1500; /* eth_mtu */
dev->addr_len = ETH_ALEN; dev->addr_len = ETH_ALEN;
for (i = 0; i < ETH_ALEN; i++) { dev->tx_queue_len = 100; /* Ethernet wants good queues */
dev->broadcast[i]=0xff;
} memset(dev->broadcast,0xFF, ETH_ALEN);
/* New-style flags. */ /* New-style flags. */
dev->flags = IFF_BROADCAST|IFF_MULTICAST; dev->flags = IFF_BROADCAST|IFF_MULTICAST;
...@@ -199,15 +199,15 @@ void tr_setup(struct device *dev) ...@@ -199,15 +199,15 @@ void tr_setup(struct device *dev)
skb_queue_head_init(&dev->buffs[i]); skb_queue_head_init(&dev->buffs[i]);
dev->hard_header = tr_header; dev->hard_header = tr_header;
dev->rebuild_header = tr_rebuild_header; dev->rebuild_header = tr_rebuild_header;
dev->type = ARPHRD_IEEE802; dev->type = ARPHRD_IEEE802;
dev->hard_header_len = TR_HLEN; dev->hard_header_len = TR_HLEN;
dev->mtu = 2000; /* bug in fragmenter...*/ dev->mtu = 2000; /* bug in fragmenter...*/
dev->addr_len = TR_ALEN; dev->addr_len = TR_ALEN;
for (i = 0; i < TR_ALEN; i++) { dev->tx_queue_len = 100; /* Long queues on tr */
dev->broadcast[i]=0xff;
} memset(dev->broadcast,0xFF, TR_ALEN);
/* New-style flags. */ /* New-style flags. */
dev->flags = IFF_BROADCAST; dev->flags = IFF_BROADCAST;
...@@ -306,18 +306,18 @@ void unregister_netdev(struct device *dev) ...@@ -306,18 +306,18 @@ void unregister_netdev(struct device *dev)
*/ */
#ifdef CONFIG_NET_ALIAS #ifdef CONFIG_NET_ALIAS
if (dev_base == dev) if (dev_base == dev)
dev_base = net_alias_nextdev(dev); dev_base = net_alias_nextdev(dev);
else else
{ {
while(d && (net_alias_nextdev(d) != dev)) /* skip aliases */ while(d && (net_alias_nextdev(d) != dev)) /* skip aliases */
d = net_alias_nextdev(d); 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) * Critical: Bypass by consider devices as blocks (maindev+aliases)
*/ */
net_alias_nextdev_set(d, net_alias_nextdev(dev)); net_alias_nextdev_set(d, net_alias_nextdev(dev));
} }
#else #else
if (dev_base == dev) if (dev_base == dev)
...@@ -326,7 +326,7 @@ void unregister_netdev(struct device *dev) ...@@ -326,7 +326,7 @@ void unregister_netdev(struct device *dev)
{ {
while (d && (d->next != dev)) while (d && (d->next != dev))
d = d->next; d = d->next;
if (d && (d->next == dev)) if (d && (d->next == dev))
{ {
d->next = dev->next; d->next = dev->next;
...@@ -350,13 +350,15 @@ void unregister_netdev(struct device *dev) ...@@ -350,13 +350,15 @@ void unregister_netdev(struct device *dev)
restore_flags(flags); 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 * You can i.e use a interfaces in a route though it is not up.
dev->flags==0 (but it will not call dev->stop if IFF_UP * We call close_dev (which is changed: it will down a device even if
is not set). * dev->flags==0 (but it will not call dev->stop if IFF_UP
This will call notifier_call_chain(&netdev_chain, NETDEV_DOWN, dev), * is not set).
dev_mc_discard(dev), .... * This will call notifier_call_chain(&netdev_chain, NETDEV_DOWN, dev),
*/ * dev_mc_discard(dev), ....
*/
dev_close(dev); dev_close(dev);
} }
......
...@@ -126,8 +126,8 @@ typedef struct sk_buff sk_buff; ...@@ -126,8 +126,8 @@ typedef struct sk_buff sk_buff;
#define PPP_LQR 0xc025 /* Link Quality Reporting Protocol */ #define PPP_LQR 0xc025 /* Link Quality Reporting Protocol */
#endif #endif
static int ppp_register_compressor (struct compressor *cp); int ppp_register_compressor (struct compressor *cp);
static void ppp_unregister_compressor (struct compressor *cp); void ppp_unregister_compressor (struct compressor *cp);
/* /*
* Local functions * Local functions
...@@ -480,7 +480,8 @@ ppp_init_dev (struct device *dev) ...@@ -480,7 +480,8 @@ ppp_init_dev (struct device *dev)
dev->do_ioctl = ppp_dev_ioctl; dev->do_ioctl = ppp_dev_ioctl;
dev->addr_len = 0; dev->addr_len = 0;
dev->type = ARPHRD_PPP; dev->type = ARPHRD_PPP;
dev->tx_queue_len = 10;
for (indx = 0; indx < DEV_NUMBUFFS; indx++) for (indx = 0; indx < DEV_NUMBUFFS; indx++)
skb_queue_head_init (&dev->buffs[indx]); skb_queue_head_init (&dev->buffs[indx]);
...@@ -3465,7 +3466,7 @@ static struct compressor *find_compressor (int type) ...@@ -3465,7 +3466,7 @@ static struct compressor *find_compressor (int type)
return (struct compressor *) 0; return (struct compressor *) 0;
} }
static int ppp_register_compressor (struct compressor *cp) int ppp_register_compressor (struct compressor *cp)
{ {
struct compressor_link *new; struct compressor_link *new;
unsigned long flags; unsigned long flags;
...@@ -3492,7 +3493,7 @@ static int ppp_register_compressor (struct compressor *cp) ...@@ -3492,7 +3493,7 @@ static int ppp_register_compressor (struct compressor *cp)
return 0; 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 *prev = (struct compressor_link *) 0;
struct compressor_link *lnk; struct compressor_link *lnk;
......
...@@ -91,7 +91,6 @@ static long decode(unsigned char **cpp); ...@@ -91,7 +91,6 @@ static long decode(unsigned char **cpp);
static unsigned char * put16(unsigned char *cp, unsigned short x); static unsigned char * put16(unsigned char *cp, unsigned short x);
static unsigned short pull16(unsigned char **cpp); static unsigned short pull16(unsigned char **cpp);
static void export_slhc_syms(void); static void export_slhc_syms(void);
static has_exported = 0;
/* Initialize compression data structure /* Initialize compression data structure
* slots must be in range 0 to 255 (zero meaning no compression) * slots must be in range 0 to 255 (zero meaning no compression)
...@@ -103,9 +102,6 @@ slhc_init(int rslots, int tslots) ...@@ -103,9 +102,6 @@ slhc_init(int rslots, int tslots)
register struct cstate *ts; register struct cstate *ts;
struct slcompress *comp; struct slcompress *comp;
if (!has_exported)
export_slhc_syms();
comp = (struct slcompress *)kmalloc(sizeof(struct slcompress), comp = (struct slcompress *)kmalloc(sizeof(struct slcompress),
GFP_KERNEL); GFP_KERNEL);
if (! comp) if (! comp)
...@@ -748,7 +744,6 @@ static struct symbol_table slhc_syms = { ...@@ -748,7 +744,6 @@ static struct symbol_table slhc_syms = {
static void export_slhc_syms(void) static void export_slhc_syms(void)
{ {
register_symtab(&slhc_syms); register_symtab(&slhc_syms);
has_exported = 1;
} }
#ifdef MODULE #ifdef MODULE
...@@ -764,5 +759,11 @@ void cleanup_module(void) ...@@ -764,5 +759,11 @@ void cleanup_module(void)
{ {
return; return;
} }
#endif /* MODULE */ #else /* MODULE */
void slhc_install(void)
{
export_slhc_syms();
}
#endif
#endif /* CONFIG_INET */ #endif /* CONFIG_INET */
...@@ -1022,7 +1022,7 @@ slip_ioctl(struct tty_struct *tty, void *file, int cmd, void *arg) ...@@ -1022,7 +1022,7 @@ slip_ioctl(struct tty_struct *tty, void *file, int cmd, void *arg)
case SIOCGIFNAME: case SIOCGIFNAME:
err = verify_area(VERIFY_WRITE, arg, strlen(sl->dev->name) + 1); err = verify_area(VERIFY_WRITE, arg, strlen(sl->dev->name) + 1);
if (err) { if (err) {
return -err; return err;
} }
memcpy_tofs(arg, sl->dev->name, strlen(sl->dev->name) + 1); memcpy_tofs(arg, sl->dev->name, strlen(sl->dev->name) + 1);
return 0; return 0;
...@@ -1030,7 +1030,7 @@ slip_ioctl(struct tty_struct *tty, void *file, int cmd, void *arg) ...@@ -1030,7 +1030,7 @@ slip_ioctl(struct tty_struct *tty, void *file, int cmd, void *arg)
case SIOCGIFENCAP: case SIOCGIFENCAP:
err = verify_area(VERIFY_WRITE, arg, sizeof(int)); err = verify_area(VERIFY_WRITE, arg, sizeof(int));
if (err) { if (err) {
return -err; return err;
} }
put_user(sl->mode, (int *)arg); put_user(sl->mode, (int *)arg);
return 0; return 0;
...@@ -1038,7 +1038,7 @@ slip_ioctl(struct tty_struct *tty, void *file, int cmd, void *arg) ...@@ -1038,7 +1038,7 @@ slip_ioctl(struct tty_struct *tty, void *file, int cmd, void *arg)
case SIOCSIFENCAP: case SIOCSIFENCAP:
err = verify_area(VERIFY_READ, arg, sizeof(int)); err = verify_area(VERIFY_READ, arg, sizeof(int));
if (err) { if (err) {
return -err; return err;
} }
tmp = get_user((int *)arg); tmp = get_user((int *)arg);
#ifndef SL_INCLUDE_CSLIP #ifndef SL_INCLUDE_CSLIP
...@@ -1205,6 +1205,7 @@ slip_init(struct device *dev) ...@@ -1205,6 +1205,7 @@ slip_init(struct device *dev)
dev->hard_header_len = 0; dev->hard_header_len = 0;
dev->addr_len = 0; dev->addr_len = 0;
dev->type = ARPHRD_SLIP + SL_MODE_DEFAULT; dev->type = ARPHRD_SLIP + SL_MODE_DEFAULT;
dev->tx_queue_len = 10;
#ifdef CONFIG_AX25 #ifdef CONFIG_AX25
if (sl->dev->type == 260) { if (sl->dev->type == 260) {
sl->dev->type = ARPHRD_AX25; sl->dev->type = ARPHRD_AX25;
......
...@@ -82,10 +82,11 @@ int tunnel_init(struct device *dev) ...@@ -82,10 +82,11 @@ int tunnel_init(struct device *dev)
dev->stop = &tunnel_close; dev->stop = &tunnel_close;
#endif #endif
/* Now stomp the bits that are different */ /* 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_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->addr_len=0;
dev->tx_queue_len=2; /* Small queue - it should all run through */
dev->hard_header_len=0; dev->hard_header_len=0;
dev->hard_header=NULL; dev->hard_header=NULL;
dev->header_cache_bind=NULL; dev->header_cache_bind=NULL;
......
...@@ -70,6 +70,7 @@ struct pci_dev_info dev_info[] = { ...@@ -70,6 +70,7 @@ struct pci_dev_info dev_info[] = {
DEVICE( CIRRUS, CIRRUS_5434_4, "GD 5434"), DEVICE( CIRRUS, CIRRUS_5434_4, "GD 5434"),
DEVICE( CIRRUS, CIRRUS_5434_8, "GD 5434"), DEVICE( CIRRUS, CIRRUS_5434_8, "GD 5434"),
DEVICE( CIRRUS, CIRRUS_5436, "GD 5436"), DEVICE( CIRRUS, CIRRUS_5436, "GD 5436"),
DEVICE( CIRRUS, CIRRUS_6205, "GD 6205"),
DEVICE( CIRRUS, CIRRUS_6729, "CL 6729"), DEVICE( CIRRUS, CIRRUS_6729, "CL 6729"),
DEVICE( CIRRUS, CIRRUS_7542, "CL 7542"), DEVICE( CIRRUS, CIRRUS_7542, "CL 7542"),
DEVICE( CIRRUS, CIRRUS_7543, "CL 7543"), DEVICE( CIRRUS, CIRRUS_7543, "CL 7543"),
...@@ -105,6 +106,7 @@ struct pci_dev_info dev_info[] = { ...@@ -105,6 +106,7 @@ struct pci_dev_info dev_info[] = {
DEVICE( BUSLOGIC, BUSLOGIC_930, "BT-930"), DEVICE( BUSLOGIC, BUSLOGIC_930, "BT-930"),
DEVICE( PROMISE, PROMISE_5300, "DC5030"), DEVICE( PROMISE, PROMISE_5300, "DC5030"),
DEVICE( N9, N9_I128, "Imagine 128"), DEVICE( N9, N9_I128, "Imagine 128"),
DEVICE( N9, N9_I128_2, "Imagine 128v2"),
DEVICE( UMC, UMC_UM8673F, "UM8673F"), DEVICE( UMC, UMC_UM8673F, "UM8673F"),
BRIDGE( UMC, UMC_UM8891A, "UM8891A", 0x01), BRIDGE( UMC, UMC_UM8891A, "UM8891A", 0x01),
DEVICE( UMC, UMC_UM8886BF, "UM8886BF"), DEVICE( UMC, UMC_UM8886BF, "UM8886BF"),
...@@ -138,14 +140,18 @@ struct pci_dev_info dev_info[] = { ...@@ -138,14 +140,18 @@ struct pci_dev_info dev_info[] = {
DEVICE( ASP, ASP_ABP940, "ABP940"), DEVICE( ASP, ASP_ABP940, "ABP940"),
DEVICE( IMS, IMS_8849, "8849"), DEVICE( IMS, IMS_8849, "8849"),
DEVICE( TEKRAM2, TEKRAM2_690c, "DC690c"), DEVICE( TEKRAM2, TEKRAM2_690c, "DC690c"),
DEVICE( INTERG, INTERG_1680, "IGA-1680"),
DEVICE( REALTEK, REALTEK_8029, "8029"), DEVICE( REALTEK, REALTEK_8029, "8029"),
DEVICE( INIT, INIT_320P, "320 P"),
DEVICE( VIA, VIA_82C505, "VT 82C505"), DEVICE( VIA, VIA_82C505, "VT 82C505"),
DEVICE( VIA, VIA_82C561, "VT 82C561"), DEVICE( VIA, VIA_82C561, "VT 82C561"),
DEVICE( VIA, VIA_82C576, "VT 82C576 3V"), DEVICE( VIA, VIA_82C576, "VT 82C576 3V"),
DEVICE( VIA, VIA_82C416, "VT 82C416MV"),
DEVICE( VORTEX, VORTEX_GDT, "GDT 6000b"), DEVICE( VORTEX, VORTEX_GDT, "GDT 6000b"),
DEVICE( EF, EF_ATM_FPGA, "155P-MF1 (FPGA)"), DEVICE( EF, EF_ATM_FPGA, "155P-MF1 (FPGA)"),
DEVICE( EF, EF_ATM_ASIC, "155P-MF1 (ASIC)"), DEVICE( EF, EF_ATM_ASIC, "155P-MF1 (ASIC)"),
DEVICE( IMAGINGTECH, IMAGINGTECH_ICPCI, "MVC IC-PCI"), DEVICE( IMAGINGTECH, IMAGINGTECH_ICPCI, "MVC IC-PCI"),
DEVICE( FORE, FORE_PCA200PC, "PCA-200PC"),
DEVICE( PLX, PLX_9060, "PCI9060 i960 bridge"), DEVICE( PLX, PLX_9060, "PCI9060 i960 bridge"),
DEVICE( ALLIANCE, ALLIANCE_PROMOTIO, "Promotion-6410"), DEVICE( ALLIANCE, ALLIANCE_PROMOTIO, "Promotion-6410"),
DEVICE( ALLIANCE, ALLIANCE_PROVIDEO, "Provideo"), DEVICE( ALLIANCE, ALLIANCE_PROVIDEO, "Provideo"),
...@@ -217,7 +223,7 @@ struct optimization_type { ...@@ -217,7 +223,7 @@ struct optimization_type {
const char *off; const char *off;
const char *on; const char *on;
} bridge_optimization[] = { } bridge_optimization[] = {
{"Cache L2", "write trough", "write back"}, {"Cache L2", "write through", "write back"},
{"CPU-PCI posted write", "off", "on"}, {"CPU-PCI posted write", "off", "on"},
{"CPU-Memory posted write", "off", "on"}, {"CPU-Memory posted write", "off", "on"},
{"PCI-Memory posted write", "off", "on"}, {"PCI-Memory posted write", "off", "on"},
...@@ -409,11 +415,13 @@ const char *pci_strvendor(unsigned int vendor) ...@@ -409,11 +415,13 @@ const char *pci_strvendor(unsigned int vendor)
case PCI_VENDOR_ID_PCTECH: return "PCTECH"; case PCI_VENDOR_ID_PCTECH: return "PCTECH";
case PCI_VENDOR_ID_DPT: return "DPT"; case PCI_VENDOR_ID_DPT: return "DPT";
case PCI_VENDOR_ID_OPTI: return "OPTI"; 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_BUSLOGIC: return "BusLogic";
case PCI_VENDOR_ID_PROMISE: return "Promise Technology"; case PCI_VENDOR_ID_PROMISE: return "Promise Technology";
case PCI_VENDOR_ID_N9: return "Number Nine"; case PCI_VENDOR_ID_N9: return "Number Nine";
case PCI_VENDOR_ID_UMC: return "UMC"; case PCI_VENDOR_ID_UMC: return "UMC";
case PCI_VENDOR_ID_X: return "X TECHNOLOGY"; 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_QLOGIC: return "Q Logic";
case PCI_VENDOR_ID_LEADTEK: return "Leadtek Research"; case PCI_VENDOR_ID_LEADTEK: return "Leadtek Research";
case PCI_VENDOR_ID_CONTAQ: return "Contaq"; case PCI_VENDOR_ID_CONTAQ: return "Contaq";
...@@ -430,10 +438,13 @@ const char *pci_strvendor(unsigned int vendor) ...@@ -430,10 +438,13 @@ const char *pci_strvendor(unsigned int vendor)
case PCI_VENDOR_ID_IMS: return "IMS"; case PCI_VENDOR_ID_IMS: return "IMS";
case PCI_VENDOR_ID_TEKRAM2: return "Tekram"; case PCI_VENDOR_ID_TEKRAM2: return "Tekram";
case PCI_VENDOR_ID_AMCC: return "AMCC"; 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_REALTEK: return "Realtek";
case PCI_VENDOR_ID_INIT: return "Initio Corp";
case PCI_VENDOR_ID_VIA: return "VIA Technologies"; case PCI_VENDOR_ID_VIA: return "VIA Technologies";
case PCI_VENDOR_ID_VORTEX: return "VORTEX"; case PCI_VENDOR_ID_VORTEX: return "VORTEX";
case PCI_VENDOR_ID_EF: return "Efficient Networks"; 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_IMAGINGTECH: return "Imaging Technology";
case PCI_VENDOR_ID_PLX: return "PLX"; case PCI_VENDOR_ID_PLX: return "PLX";
case PCI_VENDOR_ID_ALLIANCE: return "Alliance"; case PCI_VENDOR_ID_ALLIANCE: return "Alliance";
......
...@@ -19,12 +19,18 @@ dep_tristate 'Adaptec AHA152X support' CONFIG_SCSI_AHA152X $CONFIG_SCSI ...@@ -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 AHA1542 support' CONFIG_SCSI_AHA1542 $CONFIG_SCSI
dep_tristate 'Adaptec AHA1740 support' CONFIG_SCSI_AHA1740 $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 '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-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 '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 '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 '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 if [ "$CONFIG_PCI" = "y" ]; then
dep_tristate 'NCR53c7,8xx SCSI support' CONFIG_SCSI_NCR53C7xx $CONFIG_SCSI dep_tristate 'NCR53c7,8xx SCSI support' CONFIG_SCSI_NCR53C7xx $CONFIG_SCSI
fi fi
......
...@@ -20,6 +20,9 @@ SCSI_SRCS = $(wildcard $(L_OBJS:%.o=%.c)) ...@@ -20,6 +20,9 @@ SCSI_SRCS = $(wildcard $(L_OBJS:%.o=%.c))
AHA152X = -DDEBUG_AHA152X -DAUTOCONF AHA152X = -DDEBUG_AHA152X -DAUTOCONF
.SUFFIXES:
.SUFFIXES: .c .o .h .a
ifeq (${CFLAGS},) ifeq (${CFLAGS},)
CFLAGS = -D__KERNEL__=1 \ CFLAGS = -D__KERNEL__=1 \
-DMODULE -Wall -Wstrict-prototypes -I. -I../../include \ -DMODULE -Wall -Wstrict-prototypes -I. -I../../include \
...@@ -183,8 +186,10 @@ endif ...@@ -183,8 +186,10 @@ endif
ifeq ($(CONFIG_SCSI_GENERIC_NCR5380),y) ifeq ($(CONFIG_SCSI_GENERIC_NCR5380),y)
L_OBJS += g_NCR5380.o L_OBJS += g_NCR5380.o
EXTRA_CFLAGS = -DGENERIC_NCR5380_OVERRIDE="{{(NCR5380_map_type)0x350,5,0, BOARD_NCR53C400}};"
else else
ifeq ($(CONFIG_SCSI_GENERIC_NCR5380),m) ifeq ($(CONFIG_SCSI_GENERIC_NCR5380),m)
EXTRA_CFLAGS = -DGENERIC_NCR5380_OVERRIDE="{{(NCR5380_map_type)0x350,5,0, BOARD_NCR53C400}};"
M_OBJS += g_NCR5380.o M_OBJS += g_NCR5380.o
endif endif
endif endif
......
This diff is collapsed.
...@@ -29,9 +29,7 @@ ...@@ -29,9 +29,7 @@
#define NCR5380_H #define NCR5380_H
#define NCR5380_PUBLIC_RELEASE 6 #define NCR5380_PUBLIC_RELEASE 6
#ifdef NCR53C400 #define NCR53C400_PUBLIC_RELEASE 2
#define NCR53C400_PUBLIC_RELEASE 1
#endif
#define NDEBUG_ARBITRATION 0x1 #define NDEBUG_ARBITRATION 0x1
#define NDEBUG_AUTOSENSE 0x2 #define NDEBUG_AUTOSENSE 0x2
...@@ -53,6 +51,9 @@ ...@@ -53,6 +51,9 @@
#define NDEBUG_LAST_BYTE_SENT 0x20000 #define NDEBUG_LAST_BYTE_SENT 0x20000
#define NDEBUG_RESTART_SELECT 0x40000 #define NDEBUG_RESTART_SELECT 0x40000
#define NDEBUG_EXTENDED 0x80000 #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 * The contents of the OUTPUT DATA register are asserted on the bus when
...@@ -158,31 +159,32 @@ ...@@ -158,31 +159,32 @@
/* Write any value to this register to start an ini mode DMA receive */ /* Write any value to this register to start an ini mode DMA receive */
#define START_DMA_INITIATOR_RECEIVE_REG 7 /* wo */ #define START_DMA_INITIATOR_RECEIVE_REG 7 /* wo */
#ifdef NCR53C400 #define C400_CONTROL_STATUS_REG NCR53C400_register_offset-8 /* rw */
#define C400_CONTROL_STATUS_REG -8 /* rw */
#define CSR_RESET 0x80 /* wo Resets 53c400 */ #define CSR_RESET 0x80 /* wo Resets 53c400 */
#define CSR_53C80_REG 0x80 /* ro 5380 registers busy */ #define CSR_53C80_REG 0x80 /* ro 5380 registers busy */
#define CSR_TRANS_DIR 0x40 /* rw Data transfer direction */ #define CSR_TRANS_DIR 0x40 /* rw Data transfer direction */
#define CSR_SCSI_BUFF_INTR 0x20 /* rw Enable int on transfer ready */ #define CSR_SCSI_BUFF_INTR 0x20 /* rw Enable int on transfer ready */
#define CSR_53C80_INTR 0x10 /* rw Enable 53c80 interrupts */ #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_HOST_BUF_NOT_RDY 0x04 /* ro Is Host buffer ready */
#define CSR_SCSI_BUF_RDY 0x02 /* ro SCSI buffer read */ #define CSR_SCSI_BUF_RDY 0x02 /* ro SCSI buffer read */
#define CSR_GATED_53C80_IRQ 0x01 /* ro Last block xferred */ #define CSR_GATED_53C80_IRQ 0x01 /* ro Last block xferred */
#if 0
#define CSR_BASE CSR_SCSI_BUFF_INTR | CSR_53C80_INTR #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 */ /* 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 */ /* 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 */ /* Access to host buffer stack */
#define C400_HOST_BUFFER -4 /* rw */ #define C400_HOST_BUFFER NCR53C400_register_offset-4 /* rw */
#endif /* NCR53C400 */
/* Note : PHASE_* macros are based on the values of the STATUS register */ /* Note : PHASE_* macros are based on the values of the STATUS register */
...@@ -237,6 +239,7 @@ ...@@ -237,6 +239,7 @@
#define FLAG_HAS_LAST_BYTE_SENT 1 /* NCR53c81 or better */ #define FLAG_HAS_LAST_BYTE_SENT 1 /* NCR53c81 or better */
#define FLAG_CHECK_LAST_BYTE_SENT 2 /* Only test once */ #define FLAG_CHECK_LAST_BYTE_SENT 2 /* Only test once */
#define FLAG_NCR53C400 4 /* NCR53c400 */ #define FLAG_NCR53C400 4 /* NCR53c400 */
#define FLAG_NO_PSEUDO_DMA 8 /* Inhibit DMA */
#ifndef ASM #ifndef ASM
struct NCR5380_hostdata { struct NCR5380_hostdata {
...@@ -275,6 +278,8 @@ static void NCR5380_information_transfer (struct Scsi_Host *instance); ...@@ -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_intr (int irq, struct pt_regs * regs);
static void NCR5380_main (void); static void NCR5380_main (void);
static void NCR5380_print_options (struct Scsi_Host *instance); 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 #ifndef NCR5380_abort
static static
#endif #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 @@ ...@@ -7,6 +7,9 @@
* drew@colorado.edu * drew@colorado.edu
* +1 (303) 440-4894 * +1 (303) 440-4894
* *
* NCR53C400 extensions (c) 1994,1995,1996, Kevin Lentin
* K.Lentin@cs.monash.edu.au
*
* ALPHA RELEASE 1. * ALPHA RELEASE 1.
* *
* For more information, please consult * For more information, please consult
...@@ -31,13 +34,24 @@ ...@@ -31,13 +34,24 @@
#define GENERIC_NCR5380_PUBLIC_RELEASE 1 #define GENERIC_NCR5380_PUBLIC_RELEASE 1
#ifdef NCR53C400
#define BIOSPARAM
#define NCR5380_BIOSPARAM generic_NCR5380_biosparam
#else
#define NCR5380_BIOSPARAM NULL
#endif
#ifndef ASM #ifndef ASM
int generic_NCR5380_abort(Scsi_Cmnd *); int generic_NCR5380_abort(Scsi_Cmnd *);
int generic_NCR5380_detect(Scsi_Host_Template *); 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_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
int generic_NCR5380_reset(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 #ifndef NULL
#define NULL 0 #define NULL 0
...@@ -53,36 +67,91 @@ int generic_NCR5380_reset(Scsi_Cmnd *); ...@@ -53,36 +67,91 @@ int generic_NCR5380_reset(Scsi_Cmnd *);
#if defined(HOSTS_C) || defined(MODULE) #if defined(HOSTS_C) || defined(MODULE)
#define GENERIC_NCR5380 {NULL, NULL, NULL, NULL, \ #define GENERIC_NCR5380 {NULL, NULL, NULL, \
"Trantor T128/T128F/T228", \ generic_NCR5380_proc_info, \
generic_NCR5380_detect, NULL, NULL, NULL, \ "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_queue_command, generic_NCR5380_abort, \
generic_NCR5380_reset, NULL, \ generic_NCR5380_reset, NULL, \
NULL, /* can queue */ CAN_QUEUE, /* id */ 7, SG_ALL, \ NCR5380_BIOSPARAM, \
/* can queue */ CAN_QUEUE, /* id */ 7, SG_ALL, \
/* cmd per lun */ CMD_PER_LUN , 0, 0, DISABLE_CLUSTERING} /* cmd per lun */ CMD_PER_LUN , 0, 0, DISABLE_CLUSTERING}
#endif #endif
#ifndef HOSTS_C #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 \ #define NCR5380_implementation_fields \
int port NCR5380_map_type NCR5380_map_name
#define NCR5380_local_declare() \ #define NCR5380_local_declare() \
register int port register NCR5380_implementation_fields
#define NCR5380_setup(instance) \ #define NCR5380_setup(instance) \
port = (instance)->io_port NCR5380_map_name = (NCR5380_map_type)((instance)->NCR5380_instance_name)
#define NCR5380_read(reg) (inb(port + (reg)))
#define NCR5380_write(reg, value) (outb((value), (port + (reg))))
#define NCR5380_intr generic_NCR5380_intr #define NCR5380_intr generic_NCR5380_intr
#define NCR5380_queue_command generic_NCR5380_queue_command #define NCR5380_queue_command generic_NCR5380_queue_command
#define NCR5380_abort generic_NCR5380_abort #define NCR5380_abort generic_NCR5380_abort
#define NCR5380_reset generic_NCR5380_reset #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 #define BOARD_NCR53C400 1
#endif /* else def HOSTS_C */ #endif /* else def HOSTS_C */
......
...@@ -82,8 +82,9 @@ static int scan_scsis_single (int channel,int dev,int lun,int * max_scsi_dev , ...@@ -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); struct Scsi_Host *shpnt, char * scsi_result);
void scsi_build_commandblocks(Scsi_Device * SDpnt); void scsi_build_commandblocks(Scsi_Device * SDpnt);
#ifdef CONFIG_MODULES
extern struct symbol_table scsi_symbol_table; extern struct symbol_table scsi_symbol_table;
#endif
static FreeSectorBitmap * dma_malloc_freelist = NULL; static FreeSectorBitmap * dma_malloc_freelist = NULL;
static int scsi_need_isa_bounce_buffers; static int scsi_need_isa_bounce_buffers;
...@@ -2331,7 +2332,9 @@ int scsi_dev_init(void) ...@@ -2331,7 +2332,9 @@ int scsi_dev_init(void)
timer_table[SCSI_TIMER].fn = scsi_main_timeout; timer_table[SCSI_TIMER].fn = scsi_main_timeout;
timer_table[SCSI_TIMER].expires = 0; timer_table[SCSI_TIMER].expires = 0;
#ifdef CONFIG_MODULES
register_symtab(&scsi_symbol_table); register_symtab(&scsi_symbol_table);
#endif
/* Register the /proc/scsi/scsi entry */ /* Register the /proc/scsi/scsi entry */
#if CONFIG_PROC_FS #if CONFIG_PROC_FS
......
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
#define _SCSI_H #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. * We include it here so that what came from where is transparent.
*/ */
#include <linux/scsi.h> #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