Commit 67ad24e6 authored by Linus Torvalds's avatar Linus Torvalds

- pre5:

   - Rasmus Andersen: add proper "<linux/init.h>" for sound drivers
   - David Miller: sparc64 and networking updates
   - David Trcka: MOXA numbering starts from 0, not 1.
   - Jeff Garzik: sysctl.h standalone
   - Dag Brattli: IrDA finishing touches
   - Randy Dunlap: USB fixes
   - Gerd Knorr: big bttv update
   - Peter Anvin: x86 capabilities cleanup
   - Stephen Rothwell: apm initcall fix - smp poweroff should work
   - Andrew Morton: setscheduler() spinlock ordering fix
   - Stephen Rothwell: directory notification documentation
   - Petr Vandrovec: ncpfs capabilities check cleanup
   - David Woodhouse: fix jffs to use generic isxxxx() library
   - Chris Swiedler: oom_kill selection fix
   - Jens Axboe: re-merge after sleeping in ll_rw_block.
   - Randy Dunlap: USB updates (pegasus and ftdi_sio)
   - Kai Germaschewski: ISDN ppp header compression fixed
parent 079dff39
......@@ -2635,17 +2635,14 @@ S: Rockville, Maryland 20853
S: USA
N: Stephen Tweedie
E: sct@dcs.ed.ac.uk
E: sct@redhat.com
P: 1024/E7A417AD E2 FE A4 20 34 EC ED FC 7D 7E 67 8D E0 31 D1 69
P: 1024D/43BE7544 D2A4 8556 08E6 90E7 076C BA3F 243F 20A4 43BE 7544
D: Second extended file system developer
D: General filesystem hacker
D: kswap vm management code
S: Dept. of Computer Science
S: University of Edinburgh
S: JCMB, The King's Buildings
S: Mayfield Road
S: Edinburgh
S: EH9 3JZ
S: 44 Campbell Park Crescent
S: Edinburgh EH13 0HT
S: United Kingdom
N: Thomas Uhl
......
......@@ -43,6 +43,8 @@ digiboard.txt
- info on the Digiboard PC/X{i,e,eve} multiport boards.
digiepca.txt
- info on Digi Intl. {PC,PCI,EISA}Xx and Xem series cards.
dnotify.txt
- info about directory notification in Linux.
exception.txt
- how Linux v2.2 handles exceptions without verify_area etc.
fb/
......
Linux Directory Notification
============================
Stephen Rothwell <sfr@linuxcare.com.au>
The intention of directory notification is to allow user applications
to be notified when a directory, or any of the files in it, are changed.
The basic mechanism involves the application registering for notification
on a directory using a fcntl(2) call and the notifications themselves
being delivered using signals.
The application decides which "events" it wants to be notified about.
The currently defined events are:
DN_ACCESS A file in the directory was accessed (read)
DN_MODIFY A file in the directory was modified (write,truncate)
DN_CREATE A file was created in the directory
DN_DELETE A file was unlinked from directory
DN_RENAME A file in the directory was renamed
DN_ATTRIB A file in the directory had its attributes
changed (chmod,chown)
Usually, the application must reregister after each notification, but
if DN_MULTISHOT is or'ed with the event mask, then the registration will
remain until explicitly removed (by registering for no events).
By default, SIGIO will be delivered to the process and no other useful
information. However, if the F_SETSIG fcntl(2) call is used to let the
kernel know which signal to deliver, a siginfo structure will be passed to
the signal handler and the si_fd member of that structure will contain the
file descriptor associated with the direcory in which the event occured.
Preferably the application will choose one of the real time signals
(SIGRTMIN + <n>) so that the notifications may be queued. This is
especially important if DN_MULTISHOT is specified.
Implementation expectations (features and bugs :-))
---------------------------
The notification should work for any local access to files even if the
actual file system is on a remote server. This implies that remote
access to files served by local user mode servers should be notified.
Also, remote accesses to files served by a local kernel NFS server should
be notified.
In order to make the impact on the file system code as small as possible,
the problem of hard links to files has been ignored. So if a file (x)
exists in two directories (a and b) then a change to the file using the
name "a/x" should be notified to a program expecting notifications on
directory "a", but will not be notified to one expecting notifications on
directory "b".
Also, files that are unlinked, will still cause notifications in the
last directory that they were linked to.
Example
-------
#define _GNU_SOURCE /* needed to get the defines */
#include <fcntl.h> /* in glibc 2.2 this has the needed
values defined */
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
static volatile int event_fd;
static void handler(int sig, siginfo_t *si, void *data)
{
event_fd = si->si_fd;
}
int main(void)
{
struct sigaction act;
int fd;
act.sa_sigaction = handler;
sigemptyset(&act.sa_mask);
act.sa_flags = SA_SIGINFO;
sigaction(SIGRTMIN, &act, NULL);
fd = open(".", O_RDONLY);
fcntl(fd, F_SETSIG, SIGRTMIN);
fcntl(fd, F_NOTIFY, DN_MODIFY|DN_CREATE|DN_MULTISHOT);
/* we will now be notified if any of the files
in "." is modified or new files are created */
while (1) {
pause();
printf("Got event on fd=%d\n", event_fd);
}
}
USB HOTPLUGGING
In hotpluggable busses like USB (and Cardbus PCI), end-users plug devices
into the bus with power on. In most cases, users expect the devices to become
immediately usable. That means the system must do many things, including:
- Find a driver that can handle the device. That may involve
loading a kernel module; newer drivers can use modutils to
publish their device (and class) support to user utilities.
- Bind a driver to that device. That's done using the USB
device driver's probe() routine.
- Tell other subsystems to configure the new device. Print
queues may need to be enabled, networks brought up, disk
partitions mounted, and so on. In some cases these will
be driver-specific actions.
This involves a mix of kernel mode and user mode actions. Making devices
be immediately usable means that any user mode actions can't wait for an
administrator to do them: the kernel must trigger them, either passively
(triggering some monitoring daemon to invoke a helper program) or
actively (calling such a user mode helper program directly).
Those triggered actions must support a system's administrative policies;
such programs are called "policy agents" here. Typically they involve
shell scripts that dispatch to more familiar administration tools.
KERNEL HOTPLUG HELPER (/sbin/hotplug)
When you compile with CONFIG_HOTPLUG, you get a new kernel parameter:
/proc/sys/kernel/hotplug, which normally holds the pathname "/sbin/hotplug".
That parameter names a program which the kernel may invoke at various times.
The /sbin/hotplug program can be invoked by any subsystem as part of its
reaction to a configuration change, from a thread in that subsystem.
Only one parameter is required: the name of a subsystem being notified of
some kernel event. That name is used as the first key for further event
dispatch; any other argument and environment parameters are specified by
the subsystem making that invocation.
A reference implementation of a /sbin/hotplug script is available at the
http://www.linux-usb.org website, which works USB for but also knows how to
delegate to any /etc/hotplug/$TYPE.agent policy agent present.
USB POLICY AGENT
The USB subsystem currently invokes /sbin/hotplug when USB devices
are added or removed from system. The invocation is done by the kernel
hub daemon thread [khubd], or else as part of root hub initialization
(done by init, modprobe, kapmd, etc). Its single command line parameter
is the string "usb", and it passes these environment variables:
ACTION ... "add", "remove"
PRODUCT ... USB vendor, product, and version codes (hex)
TYPE ... device class codes (decimal)
INTERFACE ... interface 0 class codes (decimal)
If "usbdevfs" is configured, DEVICE and DEVFS are also passed. DEVICE is
the pathname of the device, and is useful for devices with multiple and/or
alternate interfaces that complicate driver selection.
Currently available policy agent implementations can load drivers for
modules, and can invoke driver-specific setup scripts. The newest ones
leverage USB modutils support. Later agents might unload drivers.
USB MODUTILS SUPPORT
Current versions of modutils will create a "modules.usbmap" file which
contains the entries from each driver's MODULE_DEVICE_TABLE. Such files
can be used by various user mode policy agents to make sure all the right
driver modules get loaded, either at boot time or later.
See <linux/usb.h> for full information about such table entries; or look
at existing drivers. Each table entry describes one or more criteria to
be used when matching a driver to a device or class of devices.
A short example, for a driver that supports several specific USB devices
and their quirks, might have a MODULE_DEVICE_TABLE like this:
static const struct usb_device_id mydriver_id_table = {
{ idVendor: 0x9999, idProduct 0xaaaa, driver_info: QUIRK_X },
{ idVendor: 0xbbbb, idProduct 0x8888, driver_info: QUIRK_Y|QUIRK_Z },
...
{ } /* end with an all-zeroes entry */
}
MODULE_DEVICE_TABLE (usb, mydriver_id_table);
Most USB device drivers should pass these tables to the USB subsystem as
well as to the module management subsystem. Not all, though: some driver
frameworks connect using interfaces layered over USB, and so they won't
need such a "struct usb_driver".
Drivers that connect directly to the USB subsystem should be declared
something like this:
static struct usb_driver mydriver = {
name: "mydriver",
id_table: mydriver_id_table,
probe: my_probe,
disconnect: my_disconnect,
/*
if using the usb chardev framework:
minor: MY_USB_MINOR_START,
fops: my_file_ops,
if exposing any operations through usbdevfs:
ioctl: my_ioctl,
*/
}
When the USB subsystem knows about a driver's device ID table, it's used when
choosing drivers to probe(). The thread doing new device processing checks
drivers' device ID entries from the MODULE_DEVICE_TABLE against interface and
device descriptors for the device. It will only call probe() if there is a
match, and the third argument to probe() will be the entry that matched.
If you don't provide an id_table for your driver, then your driver may get
probed for each new device; the third parameter to probe() will be null.
......@@ -5,22 +5,17 @@ Readme for Linux device driver for the OmniVision OV511 USB to camera bridge IC
Author: Mark McClelland
Homepage: http://alpha.dyndns.org/ov511
NEW IN THIS VERSION:
o Stability improvements
o Support for hue control
o 160x120 mostly working
o OV6620 color problems fixed
o More WebCam 3 detection improvements
INTRODUCTION:
This is a driver for the OV511, a USB-only chip used in many "webcam" devices.
Any camera using the OV511/OV511+ and the OV7610/20/20AE CCD should work. It
supports streaming and capture of color or monochrome video via the Video4Linux
API. Most V4L apps are compatible with it, but a few videoconferencing programs
API. Most V4L apps are compatible with it, but a few video-conferencing programs
do not work yet. The following resolutions are supported: 640x480, 448x336,
384x288, 352x288, and 320x240.
If you need more information, please visit the OV511 homepage at the above URL.
WHAT YOU NEED:
- If you want to help with the development, get the chip's specification docs at
......@@ -81,29 +76,6 @@ Now you should be able to run xawtv. Right click for the options dialog. If
you get a scrambled image it is likely that you made a mistake in Xawtv.ad.
Try setting the size to 320x240 if all else fails.
FAQ:
Q: "Why does the picture have noise and look grainy"
A: This is a problem at low light levels, and may be also due to subtle bugs in
the code. The cause is most likely the OV7610 settings we are currently
using. I am looking into this problem.
Q: "The driver sometimes says `Failed to read OV7610 ID.' What is the deal?"
A: The I2C code that allows the OV511 to communicate with the camera chip is a
bit flaky right now. This message means that the I2C bus never got
initialized properly, and the camera will most likely not work even if you
disable this warning. Try unloading/reloading the driver or unplugging/re-
plugging the camera if this happens. Also try increasing the i2c_detect_tries
parameter (see below).
Q: "Why do you bother with this phony camera detection crap? It doesn't do
anything useful!"
A: The main purpose of only supporting known camera models is to force people
with new camera models to tell me about them, so I can assemble the list
above, and so the code can know what CCD chip you have. Right now, nearly all
of the cameras use the OV7610 and consequently I have not put support for
other ones in, so the value of the detection code is questionable. Eventually
though, new CCDs might appear and we will be fortunate to have the detection.
MODULE PARAMETERS:
You can set these with: insmod ov511 NAME=VALUE
......@@ -136,7 +108,7 @@ MODULE PARAMETERS:
or so lines higher than the red component. This is only apparent in
images with white objects on black backgrounds at 640x480. Setting this
to 1 will realign the color planes correctly. NOTE: This is still
experimental and very buggy. You will likely need a fast (500 Mhz) CPU.
experimental and very buggy. You will likely need a fast (500 MHz) CPU.
NAME: snapshot
TYPE: integer (boolean)
......@@ -203,15 +175,21 @@ MODULE PARAMETERS:
DESC: Prevent apps from timing out if frame is not done in time. This is
useful if you are having problems with Xawtv getting "stuck" on a frame
when your system is under heavy load.
NAME: sensor_gbr
TYPE: boolean
DEFAULT: 0
DESC: This makes the sensor output GBR422 instead of YUV420. This saves the
driver the trouble of converting YUV to RGB, but it currently does not
work very well (the colors are not quite right)
WORKING FEATURES:
o Color streaming/capture at 640x480, 448x336, 384x288, 352x288, 320x240, and
160x120
o RGB24, YUV420, YUV422, YUYV, and YUV422P color
o Color streaming/capture at 640x480, 448x336, 384x288, 352x288, and 320x240
o RGB24, RGB565, YUV420, YUV422, YUYV, and YUV422P color
o Monochrome
o Setting/getting of saturation, contrast, brightness, and hue (only some of
them work the OV7620 and OV7620AE)
o proc status reporting
o /proc status reporting
EXPERIMENTAL FEATURES:
o fix_rgb_offset: Sometimes works, but other times causes errors with xawtv and
......@@ -219,6 +197,7 @@ EXPERIMENTAL FEATURES:
o Snapshot mode (only works with some read() based apps; see below for more)
o OV6620 sensor support
o GBR422 parsing
o 160x120
TODO:
o Fix the noise / grainy image problem.
......@@ -227,18 +206,19 @@ TODO:
so we can't really work on that yet. Please kindly inform OmniVision that you
would like them to release their specifications to the Linux community.
o YUV422
o Get snapshot mode working with mmap().
o Fix fixFrameRGBoffset(). It is not stable yet with streaming video.
o Get autoadjust disable working
o V4L2 support (Probably not until it goes into the kernel)
o Creative WebCam III has problems initializing its sensor. This should be
fixed now, but if you still have problems let me know.
o Get rid of the memory management functions (put them in videodev.c??)
o Setting of contrast and brightness not working with 7620/7620AE
o Driver/camera state save/restore for when USB supports suspend/resume
o Unstable on SMP systems
o OV7620/OV6620 experience frame corruption with moving objects
o OV6620 is too dark
o 176x144 support
o Driver sometimes hangs upon close() with OHCI
o The image should always be written properly to the mmap'ed buffer as long as
the requested image size is at least the minimum size. This will likely
require a rewrite of all the parsing code.
HOW TO CONTACT ME:
......
......@@ -48,6 +48,11 @@ bttv.o
card=46 - Zoltrix Genie TV
card=47 - Terratec TV/Radio+
card=48 - Dynalink Magic TView
card=49 - GV-BCTV3
card=50 - Prolink PV-BT878P+4E (PixelView PlayTV PAK)
card=51 - Eagle Wireless Capricorn2 (bt878A)
card=52 - Pinnacle Studio PCTV Pro
card=53 - Typhoon TView RDS
tuner.o
type=0 - Temic PAL
......@@ -65,3 +70,4 @@ tuner.o
type=12 - Alps TSBE5
type=13 - Alps TSBC5
type=14 - Temic 4006FH5
type=15 - Alps TSCH6
......@@ -23,11 +23,19 @@ bttv.o
at the hardware). default is 1.
bttv_debug=0/1 debug messages (for capture).
default is 0 (off).
irq_debug=0/1 irq handler debug messages.
default is 0 (off).
gbuffers=2-64 number of capture buffers for mmap'ed capture.
default is 2.
gbufsize= size of capture buffers. default and
maximum value is 0x208000 (~2MB)
bttv_gpio=0/1
gpiomask=
audioall=
audiomux=
See Sound-FAQ for a detailed description.
remap, card, radio and pll accept up to four comma-separated arguments
(for multiple boards).
......@@ -54,6 +62,19 @@ tvaudio.o
new, experimental module which is supported to provide a single
driver for all simple i2c audio control chips (tda/tea*).
insmod args:
tda8425 = 1 enable/disable the support for the
tda9840 = 1 various chips.
tda9850 = 1 The tea6300 can't be autodetected and is
tda9855 = 1 therefore off by default, if you have
tda9873 = 1 this one on your card (STB uses these)
tea6300 = 0 you have to enable it explicitly.
tea6420 = 1 The two tda985x chips use the same i2c
pic16c54 = 1 address and can't be disturgished from
each other, you might have to disable
the wrong one.
debug = 1 print debug messages
msp3400.o
The driver for the msp34xx sound processor chips. If you have a
stereo card, you probably want to insmod this one.
......@@ -72,7 +93,7 @@ msp3400.o
should improve things for french people, the
carrier autoscan seems to work with FM only...
tea6300.o
tea6300.o - OBSOLETE (use tvaudio instead)
The driver for the tea6300 fader chip. If you have a stereo
card and the msp3400.o doesn't work, you might want to try this
one. This chip is seen on most STB TV/FM cards (usually from
......@@ -81,7 +102,7 @@ tea6300.o
insmod args:
debug=1 print some debug info to the syslog.
tda8425.o
tda8425.o - OBSOLETE (use tvaudio instead)
The driver for the tda8425 fader chip. This driver used to be
part of bttv.c, so if your sound used to work but does not
anymore, try loading this module.
......@@ -89,7 +110,7 @@ tda8425.o
insmod args:
debug=1 print some debug info to the syslog.
tda985x.o
tda985x.o - OBSOLETE (use tvaudio instead)
The driver for the tda9850/55 audio chips.
insmod args:
......
IMPORTANT: Don't send me mails with images attached unless I ask you
to do so. Mails with images attached will go to /dev/null unseen.
Release notes for bttv-0.7.x
============================
......@@ -17,7 +21,7 @@ CONFIG_I2C=m
CONFIG_I2C_ALGOBIT=m
The latest bttv version is available here:
http://me.in-berlin.de/~kraxel/bttv.html
http://www.strusel007.de/linux/bttv/
You'll find Ralphs original (mostly outdated) documentation in the
ralphs-doc subdirectory.
......@@ -38,6 +42,8 @@ kernel at least once, you probably don't have do worry about this. If
not, go to /usr/src/linux and run at least "make config". Even
better, compile your own kernel, you'll never become a real hacker
else ;-)
Note that you have to turn on video4linux support (CONFIG_VIDEO_DEV)
in the kernel to get the videodev.o module which is required by bttv.
Make bttv work with your card
......@@ -66,7 +72,8 @@ correct card type. If you get video but no sound you've very likely
specified the wrong (or no) card type. A list of supported cards is
in CARDLIST.
If your card isn't listed in CARDLIST, you should read the Sound-FAQ.
If your card isn't listed in CARDLIST or if you have trouble making
audio work, you should read the Sound-FAQ.
Still doesn't work?
......
......@@ -8,12 +8,12 @@ completely by the bt8xx chip, which is common on all boards. But
sound is handled in slightly different ways on each board.
To handle the grabber boards correctly, there is a array tvcards[] in
bttv.c, which holds the informations required for each board. Sound
will work only, if the correct entry is used (for video it often makes
no difference). The bttv driver prints a line to the kernel log,
telling which card type is used. Like this one:
bttv-cards.c, which holds the informations required for each board.
Sound will work only, if the correct entry is used (for video it often
makes no difference). The bttv driver prints a line to the kernel
log, telling which card type is used. Like this one:
bttv0: model: BT848(Hauppauge old)
bttv0: model: BT848(Hauppauge old) [autodetected]
You should verify this is correct. If it is'nt, you have to pass the
correct board type as insmod argument, "insmod bttv card=2" for
......@@ -32,7 +32,7 @@ you might want to check the video4linux mailing list archive first...
Of course you need a correctly installed soundcard unless you have the
speakers connected directly to the grabber board. Hint: check the
mixer settings too...
mixer settings too. ALSA for example has everything muted by default.
How sound works in detail
......@@ -48,42 +48,64 @@ bt848 chip. Another one is the data register (BT848_GPIO_DATA), where
you can get/set the status if these pins. They can be used for input
and output.
All grabber board vendors use these pins to control an external chip
Most grabber board vendors use these pins to control an external chip
which does the sound routing. But every board is a little different.
These pins are also used by some companies to drive remote control
receiver chips.
receiver chips. Some boards use the i2c bus instead of the gpio pins
to connect the mux chip.
As mentioned above, there is a array which holds the required
informations for each known board. You basically have to create a new
line for your board. What is in there:
line for your board. The important fields are these two:
struct tvcard
{
char *name;
int inputs; /* number of video inputs */
int tuner; /* which of them is the tuner */
int svhs; /* which of them is the svhs input */
[ ... ]
u32 gpiomask;
u32 muxsel[8]; /* video mux */
u32 audiomux[6]; /* audio mux: Tuner, Radio, external, internal, mute, stereo */
u32 gpiomask2; /* GPIO MUX mask (this is video) */
u32 audiomux[5]; /* audio mux: tuner, radio, external, internal, mute */
};
gpiomask has all bits set which are used to control the audio mux.
This value basically goes to the gpio output enable register. It is
also used to mask bits when switching the audio mux (which is done by
read-modify-write on the gpio data register).
gpiomask specifies which pins are used to control the audio mux chip.
The corresponding bits in the output enable register
(BT848_GPIO_OUT_EN) will be set as these pins must be driven by the
bt848 chip.
The audiomux[] array holds the data values for the different inputs
(i.e. which pins must be high/low for tuner/mute/...). This will be
written to the data register (BT848_GPIO_DATA) to switch the audio
mux.
What you have to do is figure out the correct values for gpiomask and
the audiomux array. If you have Windows and the drivers four your
card installed, you might to check out if you can read these registers
values used by the windows driver. A tool to do this is available
from ftp://telepresence.dmem.strath.ac.uk/pub/bt848/winutil. There is
some #ifdef'ed code in bttv.c (search for "new card") which prints
these values before board initialization, this might help too: boot
win, start tv app, softboot (loadlin) into linux and load bttv with
this enabled. If you hav'nt Windows installed, this is a trial and
error game...
from ftp://telepresence.dmem.strath.ac.uk/pub/bt848/winutil (doesn't
work with bt878 boards according to some reports I received). You
might also dig around in the *.ini files of the Windows applications.
You can have a look at the board to see which of the gpio pins are
connected at all and then start trial-and-error ...
Starting with release 0.7.41 bttv has a number of insmod options to
make the gpio debugging easier:
bttv_gpio=0/1 enable/disable gpio debug messages
gpiomask=n set the gpiomask value
audiomux=i,j,... set the values of the audiomux array
audioall=a set the values of the audiomux array (one
value for all array elements, useful to check
out which effect the particular value has).
The messages printed with bttv_gpio=1 look like this:
bttv0: gpio: en=00000027, out=00000024 in=00ffffd8 [audio: off]
en = output _en_able register (BT848_GPIO_OUT_EN)
out = _out_put bits of the data register (BT848_GPIO_DATA),
i.e. BT848_GPIO_DATA & BT848_GPIO_OUT_EN
in = _in_put bits of the data register,
i.e. BT848_GPIO_DATA & ~BT848_GPIO_OUT_EN
Good luck,
......
Philips http://www.Semiconductors.COM/pip/
Conexant http://www.conexant.com/techinfo/default.asp
Micronas http://www.micronas.de/pages/product_documentation/index.html
......@@ -180,6 +180,52 @@ DRIVERS-$(CONFIG_MD) += drivers/md/mddev.o
DRIVERS += $(DRIVERS-y)
# files removed with 'make clean'
CLEAN_FILES = \
kernel/ksyms.lst include/linux/compile.h \
vmlinux System.map \
.tmp* \
drivers/char/consolemap_deftbl.c drivers/video/promcon_tbl.c \
drivers/char/conmakehash \
drivers/pci/devlist.h drivers/pci/classlist.h drivers/pci/gen-devlist \
drivers/zorro/devlist.h drivers/zorro/gen-devlist \
drivers/sound/bin2hex drivers/sound/hex2hex \
drivers/atm/fore200e_mkfirm drivers/atm/{pca,sba}*{.bin,.bin1,.bin2} \
net/khttpd/make_times_h \
net/khttpd/times.h \
submenu*
# directories removed with 'make clean'
CLEAN_DIRS = \
modules
# files removed with 'make mrproper'
MRPROPER_FILES = \
include/linux/autoconf.h include/linux/version.h \
drivers/net/hamradio/soundmodem/sm_tbl_{afsk1200,afsk2666,fsk9600}.h \
drivers/net/hamradio/soundmodem/sm_tbl_{hapn4800,psk4800}.h \
drivers/net/hamradio/soundmodem/sm_tbl_{afsk2400_7,afsk2400_8}.h \
drivers/net/hamradio/soundmodem/gentbl \
drivers/char/hfmodem/gentbl drivers/char/hfmodem/tables.h \
drivers/sound/*_boot.h drivers/sound/.*.boot \
drivers/sound/msndinit.c \
drivers/sound/msndperm.c \
drivers/sound/pndsperm.c \
drivers/sound/pndspini.c \
drivers/atm/fore200e_*_fw.c drivers/atm/.fore200e_*.fw \
.version .config* config.in config.old \
scripts/tkparse scripts/kconfig.tk scripts/kconfig.tmp \
scripts/lxdialog/*.o scripts/lxdialog/lxdialog \
.menuconfig.log \
include/asm \
.hdepend scripts/mkdep scripts/split-include scripts/docproc \
$(TOPDIR)/include/linux/modversions.h
# directories removed with 'make mrproper'
MRPROPER_DIRS = \
include/config \
$(TOPDIR)/include/linux/modules
include arch/$(ARCH)/Makefile
export CPPFLAGS CFLAGS AFLAGS
......@@ -355,47 +401,18 @@ modules modules_install: dummy
endif
clean: archclean
rm -f kernel/ksyms.lst include/linux/compile.h
find . \( -name '*.[oas]' -o -name core -o -name '.*.flags' \) -type f -print \
| grep -v lxdialog/ | xargs rm -f
rm -f vmlinux System.map
rm -f .tmp*
rm -f drivers/char/consolemap_deftbl.c drivers/video/promcon_tbl.c
rm -f drivers/char/conmakehash
rm -f drivers/pci/devlist.h drivers/pci/classlist.h drivers/pci/gen-devlist
rm -f drivers/zorro/devlist.h drivers/zorro/gen-devlist
rm -f drivers/sound/bin2hex drivers/sound/hex2hex
rm -f drivers/atm/fore200e_mkfirm drivers/atm/{pca,sba}*{.bin,.bin1,.bin2}
rm -f net/khttpd/make_times_h
rm -f net/khttpd/times.h
rm -f submenu*
rm -rf modules
rm -f $(CLEAN_FILES)
rm -rf $(CLEAN_DIRS)
$(MAKE) -C Documentation/DocBook clean
mrproper: clean archmrproper
rm -f include/linux/autoconf.h include/linux/version.h
rm -f drivers/net/hamradio/soundmodem/sm_tbl_{afsk1200,afsk2666,fsk9600}.h
rm -f drivers/net/hamradio/soundmodem/sm_tbl_{hapn4800,psk4800}.h
rm -f drivers/net/hamradio/soundmodem/sm_tbl_{afsk2400_7,afsk2400_8}.h
rm -f drivers/net/hamradio/soundmodem/gentbl
rm -f drivers/char/hfmodem/gentbl drivers/char/hfmodem/tables.h
rm -f drivers/sound/*_boot.h drivers/sound/.*.boot
rm -f drivers/sound/msndinit.c
rm -f drivers/sound/msndperm.c
rm -f drivers/sound/pndsperm.c
rm -f drivers/sound/pndspini.c
rm -f drivers/atm/fore200e_*_fw.c drivers/atm/.fore200e_*.fw
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.log
rm -f include/asm
rm -rf include/config
find . \( -size 0 -o -name .depend \) -type f -print | xargs rm -f
rm -f .hdepend scripts/mkdep scripts/split-include scripts/docproc
rm -f $(TOPDIR)/include/linux/modversions.h
rm -rf $(TOPDIR)/include/linux/modules
rm -f $(MRPROPER_FILES)
rm -rf $(MRPROPER_DIRS)
$(MAKE) -C Documentation/DocBook mrproper
distclean: mrproper
rm -f core `find . \( -name '*.orig' -o -name '*.rej' -o -name '*~' \
-o -name '*.bak' -o -name '#*#' -o -name '.*.orig' \
......
......@@ -361,21 +361,29 @@ CONFIG_NET_ETHERNET=y
CONFIG_NET_PCI=y
# CONFIG_PCNET32 is not set
# CONFIG_ADAPTEC_STARFIRE is not set
# CONFIG_AC3200 is not set
# CONFIG_APRICOT is not set
# CONFIG_CS89x0 is not set
# CONFIG_DE4X5 is not set
# CONFIG_TULIP is not set
# CONFIG_DE4X5 is not set
# CONFIG_DGRS is not set
# CONFIG_DM9102 is not set
CONFIG_EEPRO100=y
# CONFIG_EEPRO100_PM is not set
# CONFIG_LNE390 is not set
# CONFIG_NATSEMI is not set
# CONFIG_NE2K_PCI is not set
# CONFIG_NE3210 is not set
# CONFIG_ES3210 is not set
# CONFIG_8139TOO is not set
# CONFIG_RTL8129 is not set
# CONFIG_SIS900 is not set
# CONFIG_EPIC100 is not set
# CONFIG_SUNDANCE is not set
# CONFIG_TLAN is not set
# CONFIG_VIA_RHINE is not set
# CONFIG_WINBOND_840 is not set
# CONFIG_HAPPYMEAL is not set
# CONFIG_NET_POCKET is not set
#
......
......@@ -1571,8 +1571,6 @@ static struct miscdevice apm_device = {
&apm_bios_fops
};
#define APM_INIT_ERROR_RETURN return -1
/*
* Just start the APM thread. We do NOT want to do APM BIOS
* calls from anything but the APM thread, if for no other reason
......@@ -1587,7 +1585,7 @@ static int __init apm_init(void)
{
if (apm_bios_info.version == 0) {
printk(KERN_INFO "apm: BIOS not found.\n");
APM_INIT_ERROR_RETURN;
return -ENODEV;
}
printk(KERN_INFO
"apm: BIOS version %d.%d Flags 0x%02x (Driver version %s)\n",
......@@ -1597,7 +1595,7 @@ static int __init apm_init(void)
driver_version);
if ((apm_bios_info.flags & APM_32_BIT_SUPPORT) == 0) {
printk(KERN_INFO "apm: no 32 bit BIOS support\n");
APM_INIT_ERROR_RETURN;
return -ENODEV;
}
/*
......@@ -1626,15 +1624,15 @@ static int __init apm_init(void)
if (apm_disabled) {
printk(KERN_NOTICE "apm: disabled on user request.\n");
APM_INIT_ERROR_RETURN;
return -ENODEV;
}
if ((smp_num_cpus > 1) && !power_off) {
printk(KERN_NOTICE "apm: disabled - APM is not SMP safe.\n");
APM_INIT_ERROR_RETURN;
return -ENODEV;
}
if (PM_IS_ACTIVE()) {
printk(KERN_NOTICE "apm: overridden by ACPI.\n");
APM_INIT_ERROR_RETURN;
return -ENODEV;
}
pm_active = 1;
......@@ -1683,7 +1681,7 @@ static int __init apm_init(void)
if (smp_num_cpus > 1) {
printk(KERN_NOTICE
"apm: disabled - APM is not SMP safe (power off active).\n");
APM_INIT_ERROR_RETURN;
return 0;
}
misc_register(&apm_device);
......
......@@ -66,22 +66,19 @@ void do_machine_check(struct pt_regs * regs, long error_code)
* This has to be run for each processor
*/
void mcheck_init(void)
void mcheck_init(struct cpuinfo_x86 *c)
{
u32 l, h;
int i;
struct cpuinfo_x86 *c;
static int done;
c=cpu_data+smp_processor_id();
if(c->x86_vendor!=X86_VENDOR_INTEL)
if( c->x86_vendor != X86_VENDOR_INTEL )
return;
if(!(c->x86_capability&X86_FEATURE_MCE))
if( !test_bit(X86_FEATURE_TSC, &c->x86_capability) )
return;
if(!(c->x86_capability&X86_FEATURE_MCA))
if( !test_bit(X86_FEATURE_MCA, &c->x86_capability) )
return;
/* Ok machine check is available */
......
......@@ -378,7 +378,7 @@ static inline void __init construct_default_ISA_mptable(int mpc_default_type)
processor.mpc_cpufeature = (boot_cpu_data.x86 << 8) |
(boot_cpu_data.x86_model << 4) |
boot_cpu_data.x86_mask;
processor.mpc_featureflag = boot_cpu_data.x86_capability;
processor.mpc_featureflag = boot_cpu_data.x86_capability[0];
processor.mpc_reserved[0] = 0;
processor.mpc_reserved[1] = 0;
for (i = 0; i < 2; i++) {
......
......@@ -231,7 +231,7 @@ static int msr_open(struct inode *inode, struct file *file)
if ( !(cpu_online_map & (1UL << cpu)) )
return -ENXIO; /* No such CPU */
if ( !(c->x86_capability & X86_FEATURE_MSR) )
if ( !test_bit(X86_FEATURE_MSR, &c->x86_capability) )
return -EIO; /* MSR not supported */
return 0;
......
This diff is collapsed.
This diff is collapsed.
# $Id: config.in,v 1.104 2000/10/04 09:01:38 anton Exp $
# $Id: config.in,v 1.105 2000/11/12 10:01:41 davem Exp $
# For a description of the syntax of this configuration file,
# see Documentation/kbuild/config-language.txt.
#
......
/* $Id: init.c,v 1.94 2000/10/19 00:49:51 davem Exp $
/* $Id: init.c,v 1.95 2000/11/10 04:49:56 davem Exp $
* linux/arch/sparc/mm/init.c
*
* Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
......
/* $Id: dtlb_base.S,v 1.7 2000/03/26 09:13:48 davem Exp $
/* $Id: dtlb_base.S,v 1.8 2000/11/10 08:28:45 davem Exp $
* dtlb_base.S: Front end to DTLB miss replacement strategy.
* This is included directly into the trap table.
*
......@@ -57,7 +57,7 @@
srax %g4, VPTE_SHIFT, %g6 ! Create VPTE offset
ldxa [%g3 + %g6] ASI_S, %g5 ! Load VPTE
1: brlz,pt %g5, 9f ! Valid, load into TLB
and %g5, (_PAGE_PRESENT|_PAGE_READ), %g4 ! Mask readable bits
nop ! Delay-slot
ba,a,pt %xcc, 4f ! Invalid, branch out
/* DTLB ** ICACHE line 2: Quick kernel TLB misses */
......@@ -68,27 +68,27 @@
nop
9: stxa %g5, [%g0] ASI_DTLB_DATA_IN ! Reload TLB
retry ! Trap return
nop
4: rdpr %pstate, %g5 ! Move into alternate globals
/* DTLB ** ICACHE line 3: winfixups+real_faults */
4: cmp %g4, (_PAGE_PRESENT|_PAGE_READ) ! Readable page?
be,pn %xcc, 5f ! Yep, refbit update
sllx %g1, 60, %g4 ! Get valid bit
rdpr %pstate, %g5 ! Move into alternate globals
wrpr %g5, PSTATE_AG|PSTATE_MG, %pstate
rdpr %tl, %g4 ! See where we came from.
cmp %g4, 1 ! Is etrap/rtrap window fault?
mov TLB_TAG_ACCESS, %g4 ! Prepare for fault processing
/* DTLB ** ICACHE line 4: padding */
ldxa [%g4] ASI_DMMU, %g5 ! Load faulting VA page
be,pt %xcc, sparc64_realfault_common ! Jump to normal fault handling
mov FAULT_CODE_DTLB, %g4 ! It was read from DTLB
ba,a,pt %xcc, winfix_trampoline ! Call window fixup code
5: or %g5, _PAGE_ACCESSED, %g5 ! Indicate reference
or %g5, %g4, %g5 ! Set valid
stxa %g5, [%g3 + %g6] ASI_S ! Update PTE table (cant trap)
ba,a,pt %xcc, 9b ! Complete tlb miss
/* DTLB ** ICACHE line 4: Unused... */
nop
nop
nop
nop
nop
nop
nop
nop
#undef TAG_CONTEXT_BITS
#undef VPTE_SHIFT
......
/* $Id: dtlb_prot.S,v 1.20 2000/03/26 09:13:48 davem Exp $
/* $Id: dtlb_prot.S,v 1.21 2000/11/10 08:28:45 davem Exp $
* dtlb_prot.S: DTLB protection trap strategy.
* This is included directly into the trap table.
*
......@@ -6,10 +6,6 @@
* Copyright (C) 1997,1998 Jakub Jelinek (jj@ultra.linux.cz)
*/
#define TAG_CONTEXT_BITS 0x3ff
#define VPTE_SHIFT (PAGE_SHIFT - 3)
#define MODIFIED_BITS (_PAGE_WRITE | _PAGE_W | _PAGE_MODIFIED | _PAGE_ACCESSED)
/* Ways we can get here:
*
* [TL == 0] 1) User stores to readonly pages.
......@@ -18,45 +14,41 @@
*/
/* PROT ** ICACHE line 1: User DTLB protection trap */
ldxa [%g1] ASI_DMMU, %g6 ! Primary or Secondary ctx?
and %g6, 0x10, %g6 ! Get pri/sec ctx bit
stxa %g0, [%g1] ASI_DMMU ! Clear SFSR FaultValid bit
membar #Sync ! Synchronize ASI stores
ldxa [%g1 + %g1] ASI_DMMU, %g4 ! Load TAG_ACCESS
andn %g4, TAG_CONTEXT_BITS, %g4 ! Clear CTX bits
stxa %g0, [%g4 + %g6] ASI_DMMU_DEMAP ! Perform TLB flush of page
membar #Sync ! Synchronize ASI stores
/* PROT ** ICACHE line 2: Further normal processing */
srax %g4, VPTE_SHIFT, %g6 ! Compute VPTE offset
ldxa [%g3 + %g6] ASI_S, %g5 ! Load PTE entry
andcc %g5, _PAGE_WRITE, %g0 ! Writable page?
be,pt %xcc, 1f ! Nope, real fault
or %g5, (MODIFIED_BITS), %g5 ! Mark as writable/modified
stxa %g5, [%g3 + %g6] ASI_S ! Update PTE entry
stxa %g5, [%g0] ASI_DTLB_DATA_IN ! Load PTE into TLB
retry ! Trap return
/* PROT ** ICACHE line 3: Real user faults */
1: rdpr %pstate, %g5 ! Move into alternate globals
rdpr %pstate, %g5 ! Move into alternate globals
wrpr %g5, PSTATE_AG|PSTATE_MG, %pstate
rdpr %tl, %g1 ! Need to do a winfixup?
cmp %g1, 1 ! Trap level >1?
mov TLB_TAG_ACCESS, %g4 ! Prepare reload of vaddr
nop
/* PROT ** ICACHE line 2: More real fault processing */
bgu,pn %xcc, winfix_trampoline ! Yes, perform winfixup
ldxa [%g4] ASI_DMMU, %g5 ! Put tagaccess in %g5
ba,pt %xcc, sparc64_realfault_common ! Nope, normal fault
/* PROT ** ICACHE line 4: More real fault processing */
mov FAULT_CODE_DTLB | FAULT_CODE_WRITE, %g4
nop
nop
nop
nop
/* PROT ** ICACHE line 3: Unused... */
nop
nop
nop
nop
nop
nop
nop
nop
#undef TAG_CONTEXT_BITS
#undef VPTE_SHIFT
#undef MODIFIED_BITS
/* PROT ** ICACHE line 3: Unused... */
nop
nop
nop
nop
nop
nop
nop
nop
/* $Id: itlb_base.S,v 1.9 2000/03/26 09:13:48 davem Exp $
/* $Id: itlb_base.S,v 1.10 2000/11/10 08:28:45 davem Exp $
* itlb_base.S: Front end to ITLB miss replacement strategy.
* This is included directly into the trap table.
*
......@@ -23,22 +23,13 @@
srax %g4, VPTE_SHIFT, %g6 ! Create VPTE offset
ldxa [%g3 + %g6] ASI_P, %g5 ! Load VPTE
1: brgez,pn %g5, 3f ! Not valid, branch out
and %g5, (_PAGE_PRESENT|_PAGE_READ), %g4 ! Mask readable bits
nop ! Delay-slot
2: stxa %g5, [%g0] ASI_ITLB_DATA_IN ! Load PTE into TLB
retry ! Trap return
3: cmp %g4, (_PAGE_PRESENT|_PAGE_READ) ! Readable page?
3: rdpr %pstate, %g4 ! Move into alternate globals
/* ITLB ** ICACHE line 2: Quick user ref updates */
bne,pn %xcc, 4f ! Nope, real missing page
sllx %g1, 60, %g4 ! Sliiickkk...
or %g5, _PAGE_ACCESSED, %g5 ! Mark as touched
or %g5, %g4, %g5 ! Allow user to see it
ba,pt %xcc, 2b ! Branch to load TLB
stxa %g5, [%g3 + %g6] ASI_S ! Update PTE table
4: rdpr %pstate, %g4 ! Move into alternate globals
/* ITLB ** ICACHE line 2: Real faults */
wrpr %g4, PSTATE_AG|PSTATE_MG, %pstate
/* ITLB ** ICACHE line 3: Real faults */
rdpr %tpc, %g5 ! And load faulting VA
mov FAULT_CODE_ITLB, %g4 ! It was read from ITLB
sparc64_realfault_common: ! Called by TL0 dtlb_miss too
......@@ -46,10 +37,11 @@ sparc64_realfault_common: ! Called by TL0 dtlb_miss too
stx %g5, [%g6 + AOFF_task_thread + AOFF_thread_fault_address]
ba,pt %xcc, etrap ! Save state
1: rd %pc, %g7 ! ...
nop
/* ITLB ** ICACHE line 3: Finish faults + window fixups */
call do_sparc64_fault ! Call fault handler
add %sp, STACK_BIAS + REGWIN_SZ, %o0! Compute pt_regs arg
/* ITLB ** ICACHE line 4: Finish faults + window fixups */
ba,pt %xcc, rtrap_clr_l6 ! Restore cpu state
nop
winfix_trampoline:
......@@ -57,6 +49,14 @@ winfix_trampoline:
or %g3, 0x7c, %g3 ! Compute offset to branch
wrpr %g3, %tnpc ! Write it into TNPC
done ! Do it to it
/* ITLB ** ICACHE line 4: Unused... */
nop
nop
nop
nop
nop
nop
nop
nop
......
/* $Id: sys_sparc32.c,v 1.165 2000/10/10 04:47:31 davem Exp $
/* $Id: sys_sparc32.c,v 1.166 2000/11/10 04:49:56 davem Exp $
* sys_sparc32.c: Conversion between 32bit and 64bit native syscalls.
*
* Copyright (C) 1997,1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
......
......@@ -271,24 +271,8 @@ static struct atmdev_ops atm_ops =
proc_read: ns_proc_read
};
static struct timer_list ns_timer;
static char *mac[NS_MAX_CARDS] = { NULL
#if NS_MAX_CARDS > 1
, NULL
#endif /* NS_MAX_CARDS > 1 */
#if NS_MAX_CARDS > 2
, NULL
#endif /* NS_MAX_CARDS > 2 */
#if NS_MAX_CARDS > 3
, NULL
#endif /* NS_MAX_CARDS > 3 */
#if NS_MAX_CARDS > 4
, NULL
#endif /* NS_MAX_CARDS > 4 */
};
#ifdef MODULE
static char *mac[NS_MAX_CARDS];
MODULE_PARM(mac, "1-" __MODULE_STRING(NS_MAX_CARDS) "s");
#endif /* MODULE */
/* Functions*******************************************************************/
......
......@@ -683,7 +683,7 @@ static int __make_request(request_queue_t * q, int rw,
{
unsigned int sector, count;
int max_segments = MAX_SEGMENTS;
struct request * req = NULL;
struct request * req = NULL, *freereq = NULL;
int rw_ahead, max_sectors, el_ret;
struct list_head *head = &q->queue_head;
int latency;
......@@ -733,6 +733,7 @@ static int __make_request(request_queue_t * q, int rw,
* Now we acquire the request spinlock, we have to be mega careful
* not to schedule or do something nonatomic
*/
again:
spin_lock_irq(&io_request_lock);
/*
......@@ -791,19 +792,16 @@ static int __make_request(request_queue_t * q, int rw,
* are not crucial.
*/
get_rq:
if ((req = get_request(q, rw)) == NULL) {
if (freereq) {
req = freereq;
freereq = NULL;
} else if ((req = get_request(q, rw)) == NULL) {
spin_unlock_irq(&io_request_lock);
if (rw_ahead)
goto end_io;
req = __get_request_wait(q, rw);
spin_lock_irq(&io_request_lock);
if (q->head_active) {
head = &q->queue_head;
if (!q->plugged)
head = head->next;
}
freereq = __get_request_wait(q, rw);
goto again;
}
/* fill up the request-info, and add it to the queue */
......@@ -824,6 +822,8 @@ static int __make_request(request_queue_t * q, int rw,
out:
if (!q->plugged)
(q->request_fn)(q);
if (freereq)
blkdev_release_request(freereq);
spin_unlock_irq(&io_request_lock);
return 0;
end_io:
......@@ -1059,7 +1059,7 @@ int __init blk_dev_init(void)
#endif
#ifdef CONFIG_ISP16_CDI
isp16_init();
#endif CONFIG_ISP16_CDI
#endif
#if defined(CONFIG_IDE) && defined(CONFIG_BLK_DEV_IDE)
ide_init(); /* this MUST precede hd_init */
#endif
......@@ -1099,37 +1099,37 @@ int __init blk_dev_init(void)
#endif
#ifdef CONFIG_CDU31A
cdu31a_init();
#endif CONFIG_CDU31A
#endif
#ifdef CONFIG_ATARI_ACSI
acsi_init();
#endif CONFIG_ATARI_ACSI
#endif
#ifdef CONFIG_MCD
mcd_init();
#endif CONFIG_MCD
#endif
#ifdef CONFIG_MCDX
mcdx_init();
#endif CONFIG_MCDX
#endif
#ifdef CONFIG_SBPCD
sbpcd_init();
#endif CONFIG_SBPCD
#endif
#ifdef CONFIG_AZTCD
aztcd_init();
#endif CONFIG_AZTCD
#endif
#ifdef CONFIG_CDU535
sony535_init();
#endif CONFIG_CDU535
#endif
#ifdef CONFIG_GSCD
gscd_init();
#endif CONFIG_GSCD
#endif
#ifdef CONFIG_CM206
cm206_init();
#endif
#ifdef CONFIG_OPTCD
optcd_init();
#endif CONFIG_OPTCD
#endif
#ifdef CONFIG_SJCD
sjcd_init();
#endif CONFIG_SJCD
#endif
#ifdef CONFIG_APBLOCK
ap_init();
#endif
......@@ -1150,7 +1150,7 @@ int __init blk_dev_init(void)
#endif
#ifdef CONFIG_BLK_DEV_LVM
lvm_init();
#endif
#endif
return 0;
};
......
/* $Id: ffb_drv.c,v 1.6 2000/08/10 05:26:23 davem Exp $
/* $Id: ffb_drv.c,v 1.7 2000/11/12 10:01:41 davem Exp $
* ffb_drv.c: Creator/Creator3D direct rendering driver.
*
* Copyright (C) 2000 David S. Miller (davem@redhat.com)
......
......@@ -19,21 +19,21 @@
* best to be responsive. -- REW
* */
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/tty.h>
#include <linux/serial.h>
#include <linux/mm.h>
#include <linux/generic_serial.h>
#include <asm/semaphore.h>
#include <asm/uaccess.h>
#include <linux/version.h>
#include <linux/module.h>
#include <linux/generic_serial.h>
#define DEBUG
static char * tmp_buf;
static DECLARE_MUTEX(tmp_buf_sem);
int gs_debug;
static int gs_debug;
#ifdef DEBUG
......@@ -57,30 +57,7 @@ int gs_debug;
#define RS_EVENT_WRITE_WAKEUP 1
#ifdef MODULE
MODULE_PARM(gs_debug, "i");
#endif
#ifdef DEBUG
static void my_hd (unsigned char *addr, int len)
{
int i, j, ch;
for (i=0;i<len;i+=16) {
printk ("%08x ", (int) addr+i);
for (j=0;j<16;j++) {
printk ("%02x %s", addr[j+i], (j==7)?" ":"");
}
for (j=0;j<16;j++) {
ch = addr[j+i];
printk ("%c", (ch < 0x20)?'.':((ch > 0x7f)?'.':ch));
}
printk ("\n");
}
}
#else
#define my_hd(addr,len)
#endif
void gs_put_char(struct tty_struct * tty, unsigned char ch)
......@@ -1083,15 +1060,21 @@ void gs_getserial(struct gs_port *port, struct serial_struct *sp)
copy_to_user(sp, &sio, sizeof(struct serial_struct));
}
#ifdef MODULE
int init_module (void)
{
return 0;
}
int cleanup_module (void)
{
return 0;
}
#endif
EXPORT_SYMBOL(gs_put_char);
EXPORT_SYMBOL(gs_write);
EXPORT_SYMBOL(gs_write_room);
EXPORT_SYMBOL(gs_chars_in_buffer);
EXPORT_SYMBOL(gs_flush_buffer);
EXPORT_SYMBOL(gs_flush_chars);
EXPORT_SYMBOL(gs_stop);
EXPORT_SYMBOL(gs_start);
EXPORT_SYMBOL(gs_hangup);
EXPORT_SYMBOL(gs_do_softint);
EXPORT_SYMBOL(block_til_ready);
EXPORT_SYMBOL(gs_close);
EXPORT_SYMBOL(gs_set_termios);
EXPORT_SYMBOL(gs_init_port);
EXPORT_SYMBOL(gs_setserial);
EXPORT_SYMBOL(gs_getserial);
EXPORT_SYMBOL(gs_debug);
......@@ -41,17 +41,18 @@
#include <linux/gameport.h>
MODULE_AUTHOR("Vojtech Pavlik <vojtech@suse.cz>");
MODULE_DESCRIPTION("Analog joystick and gamepad driver for Linux");
/*
* Option parsing.
*/
MODULE_PARM(js,"1-16s");
#define ANALOG_PORTS 16
static char *js[ANALOG_PORTS];
static int analog_options[ANALOG_PORTS];
MODULE_PARM(js, "1-" __MODULE_STRING(ANALOG_PORTS) "s");
MODULE_PARM_DESC(js, "Analog joystick options");
/*
* Times, feature definitions.
......
......@@ -179,8 +179,11 @@ static inline int noncached_address(unsigned long addr)
* caching for the high addresses through the KEN pin, but
* we maintain the tradition of paranoia in this code.
*/
return !(boot_cpu_data.x86_capability & X86_FEATURE_MTRR)
&& addr >= __pa(high_memory);
return !( test_bit(X86_FEATURE_MTRR, &boot_cpu_data.x86_capability) ||
test_bit(X86_FEATURE_K6_MTRR, &boot_cpu_data.x86_capability) ||
test_bit(X86_FEATURE_CYRIX_ARR, &boot_cpu_data.x86_capability) ||
test_bit(X86_FEATURE_CENTAUR_MCR, &boot_cpu_data.x86_capability) )
&& addr >= __pa(high_memory);
#else
return addr >= __pa(high_memory);
#endif
......
......@@ -120,7 +120,7 @@
#define CI104J_ASIC_ID 5
enum {
MXSER_BOARD_C168_ISA = 1,
MXSER_BOARD_C168_ISA = 0,
MXSER_BOARD_C104_ISA,
MXSER_BOARD_CI104J,
MXSER_BOARD_C168_PCI,
......
......@@ -710,7 +710,7 @@ static void add_timer_randomness(struct timer_rand_state *state, unsigned num)
int entropy = 0;
#if defined (__i386__)
if (boot_cpu_data.x86_capability & X86_FEATURE_TSC) {
if ( test_bit(X86_FEATURE_TSC, &boot_cpu_data.x86_capability) ) {
__u32 high;
__asm__(".byte 0x0f,0x31"
:"=a" (time), "=d" (high));
......
......@@ -965,8 +965,7 @@ isdn_ppp_push_higher(isdn_net_dev * net_dev, isdn_net_local * lp, struct sk_buff
slot = lp->ppp_slot;
if (slot < 0 || slot > ISDN_MAX_CHANNELS) {
printk(KERN_ERR "isdn_ppp_push_higher: lp->ppp_slot %d\n", lp->ppp_slot);
kfree_skb(skb);
return;
goto drop_packet;
}
is = ippp_table[slot];
......@@ -974,14 +973,11 @@ isdn_ppp_push_higher(isdn_net_dev * net_dev, isdn_net_local * lp, struct sk_buff
slot = ((isdn_net_local *) (lp->master->priv))->ppp_slot;
if (slot < 0 || slot > ISDN_MAX_CHANNELS) {
printk(KERN_ERR "isdn_ppp_push_higher: master->ppp_slot %d\n", lp->ppp_slot);
kfree_skb(skb);
return;
goto drop_packet;
}
}
mis = ippp_table[slot];
if (mis != is) {
printk(KERN_WARNING __FUNCTION__ ": BUG: is != mis %d %d %p %p\n", slot, lp->ppp_slot, mis, is);
}
if (is->debug & 0x10) {
printk(KERN_DEBUG "push, skb %d %04x\n", (int) skb->len, proto);
isdn_ppp_frame_log("rpush", skb->data, skb->len, 32,is->unit,lp->ppp_slot);
......@@ -995,15 +991,11 @@ isdn_ppp_push_higher(isdn_net_dev * net_dev, isdn_net_local * lp, struct sk_buff
case PPP_IPX: /* untested */
if (is->debug & 0x20)
printk(KERN_DEBUG "isdn_ppp: IPX\n");
skb->dev = dev;
skb->mac.raw = skb->data;
skb->protocol = htons(ETH_P_IPX);
break;
case PPP_IP:
if (is->debug & 0x20)
printk(KERN_DEBUG "isdn_ppp: IP\n");
skb->dev = dev;
skb->mac.raw = skb->data;
skb->protocol = htons(ETH_P_IP);
break;
#ifdef CONFIG_ISDN_PPP_VJ
......@@ -1012,10 +1004,10 @@ isdn_ppp_push_higher(isdn_net_dev * net_dev, isdn_net_local * lp, struct sk_buff
printk(KERN_DEBUG "isdn_ppp: VJC_UNCOMP\n");
if (slhc_remember(ippp_table[net_dev->local->ppp_slot]->slcomp, skb->data, skb->len) <= 0) {
printk(KERN_WARNING "isdn_ppp: received illegal VJC_UNCOMP frame!\n");
net_dev->local->stats.rx_dropped++;
kfree_skb(skb);
return;
goto drop_packet;
}
skb->protocol = htons(ETH_P_IP);
break;
case PPP_VJC_COMP:
if (is->debug & 0x20)
printk(KERN_DEBUG "isdn_ppp: VJC_COMP\n");
......@@ -1026,22 +1018,17 @@ isdn_ppp_push_higher(isdn_net_dev * net_dev, isdn_net_local * lp, struct sk_buff
if (!skb) {
printk(KERN_WARNING "%s: Memory squeeze, dropping packet.\n", dev->name);
net_dev->local->stats.rx_dropped++;
kfree_skb(skb_old);
return;
skb = skb_old;
goto drop_packet;
}
skb->dev = dev;
skb_put(skb, skb_old->len + 128);
memcpy(skb->data, skb_old->data, skb_old->len);
skb->mac.raw = skb->data;
pkt_len = slhc_uncompress(ippp_table[net_dev->local->ppp_slot]->slcomp,
skb->data, skb_old->len);
kfree_skb(skb_old);
if (pkt_len < 0) {
kfree_skb(skb);
lp->stats.rx_dropped++;
return;
}
if (pkt_len < 0)
goto drop_packet;
skb_trim(skb, pkt_len);
skb->protocol = htons(ETH_P_IP);
}
......@@ -1058,16 +1045,22 @@ isdn_ppp_push_higher(isdn_net_dev * net_dev, isdn_net_local * lp, struct sk_buff
/* fall through */
default:
isdn_ppp_fill_rq(skb->data, skb->len, proto, lp->ppp_slot); /* push data to pppd device */
dev_kfree_skb(skb);
kfree_skb(skb);
return;
}
/* Reset hangup-timer */
lp->huptimer = 0;
netif_rx(skb);
/* net_dev->local->stats.rx_packets++; *//* done in isdn_net.c */
skb->dev = dev;
skb->mac.raw = skb->data;
netif_rx(skb);
/* net_dev->local->stats.rx_packets++; done in isdn_net.c */
return;
drop_packet:
net_dev->local->stats.rx_dropped++;
kfree_skb(skb);
}
/*
......
......@@ -30,8 +30,8 @@
#include <linux/module.h>
#include <linux/config.h>
#include <linux/sysctl.h>
#include <linux/raid/md.h>
#include <linux/sysctl.h>
#include <linux/raid/xor.h>
#include <linux/devfs_fs_kernel.h>
......
......@@ -39,8 +39,8 @@ zoran-objs := zr36120.o zr36120_i2c.o zr36120_mem.o
obj-$(CONFIG_VIDEO_DEV) += videodev.o
obj-$(CONFIG_BUS_I2C) += i2c-old.o
obj-$(CONFIG_VIDEO_BT848) += bttv.o msp3400.o \
tda7432.o tda8425.o tda985x.o tda9875.o tea6300.o tea6420.o tuner.o
obj-$(CONFIG_VIDEO_BT848) += bttv.o msp3400.o tvaudio.o \
tda7432.o tda9875.o tuner.o
obj-$(CONFIG_SOUND_TVMIXER) += tvmixer.o
obj-$(CONFIG_VIDEO_ZR36120) += zoran.o i2c-old.o tuner.o saa7110.o saa7111.o saa7185.o
......
......@@ -11,6 +11,16 @@
/* select from TV,radio,extern,MUTE */
#define AUDC_SET_INPUT _IOW('m',17,int)
/* audio inputs */
#define AUDIO_TUNER 0x00
#define AUDIO_RADIO 0x01
#define AUDIO_EXTERN 0x02
#define AUDIO_INTERN 0x03
#define AUDIO_OFF 0x04
#define AUDIO_ON 0x05
#define AUDIO_MUTE 0x80
#define AUDIO_UNMUTE 0x81
/* all the stuff below is obsolete and just here for reference. I'll
* remove it once the driver is tested and works fine.
*
......
This diff is collapsed.
This diff is collapsed.
......@@ -3,7 +3,6 @@
all the i2c code is here
also the gpio interface exported by bttv (used by lirc)
bttv - Bt848 frame grabber driver
Copyright (C) 1996,97,98 Ralph Metzler (rjkm@thp.uni-koeln.de)
......@@ -34,7 +33,7 @@
#include <asm/io.h>
#include "bttv.h"
#include "bttvp.h"
#include "tuner.h"
......@@ -79,6 +78,8 @@ int bttv_gpio_enable(unsigned int card, unsigned long mask, unsigned long data)
btv = &bttvs[card];
btaor(data, ~mask, BT848_GPIO_OUT_EN);
if (bttv_gpio)
bttv_gpio_tracking(btv,"extern enable");
return 0;
}
......@@ -115,6 +116,8 @@ int bttv_write_gpio(unsigned int card, unsigned long mask, unsigned long data)
/* prior setting BT848_GPIO_REG_INP is (probably) not needed
because direct input is set on init */
btaor(data & mask, ~mask, BT848_GPIO_DATA);
if (bttv_gpio)
bttv_gpio_tracking(btv,"extern write");
return 0;
}
......@@ -195,8 +198,7 @@ static int attach_inform(struct i2c_client *client)
int i;
for (i = 0; i < I2C_CLIENTS_MAX; i++) {
if (btv->i2c_clients[i] == NULL ||
btv->i2c_clients[i]->driver->id == client->driver->id) {
if (btv->i2c_clients[i] == NULL) {
btv->i2c_clients[i] = client;
break;
}
......@@ -216,8 +218,7 @@ static int detach_inform(struct i2c_client *client)
if (bttv_verbose)
printk("bttv%d: i2c detach [%s]\n",btv->nr,client->name);
for (i = 0; i < I2C_CLIENTS_MAX; i++) {
if (NULL != btv->i2c_clients[i] &&
btv->i2c_clients[i]->driver->id == client->driver->id) {
if (btv->i2c_clients[i] == client) {
btv->i2c_clients[i] = NULL;
break;
}
......@@ -240,33 +241,27 @@ void bttv_call_i2c_clients(struct bttv *btv, unsigned int cmd, void *arg)
}
struct i2c_algo_bit_data bttv_i2c_algo_template = {
NULL,
bttv_bit_setsda,
bttv_bit_setscl,
bttv_bit_getsda,
bttv_bit_getscl,
10, 10, 100,
setsda: bttv_bit_setsda,
setscl: bttv_bit_setscl,
getsda: bttv_bit_getsda,
getscl: bttv_bit_getscl,
udelay: 40,
mdelay: 10,
timeout: 200,
};
struct i2c_adapter bttv_i2c_adap_template = {
"bt848",
I2C_HW_B_BT848,
NULL,
NULL,
bttv_inc_use,
bttv_dec_use,
attach_inform,
detach_inform,
NULL,
name: "bt848",
id: I2C_HW_B_BT848,
inc_use: bttv_inc_use,
dec_use: bttv_dec_use,
client_register: attach_inform,
client_unregister: detach_inform,
};
struct i2c_client bttv_i2c_client_template = {
"bttv internal",
-1,
0,
0,
NULL,
NULL
name: "bttv internal use only",
id: -1,
};
......@@ -275,7 +270,7 @@ int bttv_I2CRead(struct bttv *btv, unsigned char addr, char *probe_for)
{
unsigned char buffer = 0;
if (0 != btv->i2c_ok)
if (0 != btv->i2c_rc)
return -1;
if (bttv_verbose && NULL != probe_for)
printk(KERN_INFO "bttv%d: i2c: checking for %s @ 0x%02x... ",
......@@ -302,7 +297,7 @@ int bttv_I2CWrite(struct bttv *btv, unsigned char addr, unsigned char b1,
unsigned char buffer[2];
int bytes = both ? 2 : 1;
if (0 != btv->i2c_ok)
if (0 != btv->i2c_rc)
return -1;
btv->i2c_client.addr = addr >> 1;
buffer[0] = b1;
......
This diff is collapsed.
This diff is collapsed.
/* FIXME: this temporarely, until these are included in linux/i2c-id.h */
/* drivers */
#ifndef I2C_DRIVERID_TVMIXER
# define I2C_DRIVERID_TVMIXER I2C_DRIVERID_EXP0
#endif
#ifndef I2C_DRIVERID_TVAUDIO
# define I2C_DRIVERID_TVAUDIO I2C_DRIVERID_EXP1
#endif
/* chips */
#ifndef I2C_DRIVERID_DPL3518
# define I2C_DRIVERID_DPL3518 I2C_DRIVERID_EXP2
#endif
#ifndef I2C_DRIVERID_TDA9873
# define I2C_DRIVERID_TDA9873 I2C_DRIVERID_EXP3
#endif
#ifndef I2C_DRIVERID_TDA9875
# define I2C_DRIVERID_TDA9875 I2C_DRIVERID_EXP0+4
#endif
#ifndef I2C_DRIVERID_PIC16C54_PV951
# define I2C_DRIVERID_PIC16C54_PV951 I2C_DRIVERID_EXP0+5
#endif
#ifndef I2C_DRIVERID_TDA7432
# define I2C_DRIVERID_TDA7432 I2C_DRIVERID_EXP0+6
#endif
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.
......@@ -36,6 +36,8 @@
#define TUNER_ALPS_TSBB5_PAL_I 11
#define TUNER_ALPS_TSBE5_PAL 12
#define TUNER_ALPS_TSBC5_PAL 13
#define TUNER_TEMIC_4006FH5_PAL 14
#define TUNER_ALPS_TSHC6_NTSC 15
#define NOTUNER 0
#define PAL 1
......
This diff is collapsed.
/*
* i2c bus addresses for the chips supported by tvaudio.c
*/
#define I2C_TDA8425 0x82
#define I2C_TDA9840 0x84
#define I2C_TDA985x_L 0xb4 /* also used by 9873 */
#define I2C_TDA985x_H 0xb6
#define I2C_TEA6300 0x80
#define I2C_TEA6420 0x98
#define I2C_PIC16C54 0x96 /* PV951 */
This diff is collapsed.
......@@ -26,8 +26,6 @@
#define DOC_PASSIVE_PROBE
*/
#include <linux/config.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <asm/errno.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.
#include <linux/config.h>
#include <linux/module.h>
#include <linux/delay.h>
#include <linux/signal.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.
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