Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
This commit is contained in:
commit
513b046c96
22
CREDITS
22
CREDITS
|
@ -2240,6 +2240,12 @@ D: tc: HFSC scheduler
|
|||
S: Freiburg
|
||||
S: Germany
|
||||
|
||||
N: Paul E. McKenney
|
||||
E: paulmck@us.ibm.com
|
||||
W: http://www.rdrop.com/users/paulmck/
|
||||
D: RCU and variants
|
||||
D: rcutorture module
|
||||
|
||||
N: Mike McLagan
|
||||
E: mike.mclagan@linux.org
|
||||
W: http://www.invlogic.com/~mmclagan
|
||||
|
@ -2981,6 +2987,10 @@ S: 69 rue Dunois
|
|||
S: 75013 Paris
|
||||
S: France
|
||||
|
||||
N: Dipankar Sarma
|
||||
E: dipankar@in.ibm.com
|
||||
D: RCU
|
||||
|
||||
N: Hannu Savolainen
|
||||
E: hannu@opensound.com
|
||||
D: Maintainer of the sound drivers until 2.1.x days.
|
||||
|
@ -3293,6 +3303,12 @@ S: 3 Ballow Crescent
|
|||
S: MacGregor A.C.T 2615
|
||||
S: Australia
|
||||
|
||||
N: Josh Triplett
|
||||
E: josh@freedesktop.org
|
||||
P: 1024D/D0FE7AFB B24A 65C9 1D71 2AC2 DE87 CA26 189B 9946 D0FE 7AFB
|
||||
D: rcutorture maintainer
|
||||
D: lock annotations, finding and fixing lock bugs
|
||||
|
||||
N: Winfried Trümper
|
||||
E: winni@xpilot.org
|
||||
W: http://www.shop.de/~winni/
|
||||
|
@ -3562,11 +3578,11 @@ S: Fargo, North Dakota 58122
|
|||
S: USA
|
||||
|
||||
N: Steven Whitehouse
|
||||
E: SteveW@ACM.org
|
||||
E: steve@chygwyn.com
|
||||
W: http://www.chygwyn.com/~steve
|
||||
D: Linux DECnet project: http://www.sucs.swan.ac.uk/~rohan/DECnet/index.html
|
||||
D: Linux DECnet project
|
||||
D: Minor debugging of other networking protocols.
|
||||
D: Misc bug fixes and filesystem development
|
||||
D: Misc bug fixes and GFS2 filesystem development
|
||||
|
||||
N: Hans-Joachim Widmaier
|
||||
E: hjw@zvw.de
|
||||
|
|
|
@ -158,6 +158,7 @@ X!Ilib/string.c
|
|||
!Emm/filemap.c
|
||||
!Emm/memory.c
|
||||
!Emm/vmalloc.c
|
||||
!Imm/page_alloc.c
|
||||
!Emm/mempool.c
|
||||
!Emm/page-writeback.c
|
||||
!Emm/truncate.c
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
</authorgroup>
|
||||
|
||||
<copyright>
|
||||
<year>2003-2005</year>
|
||||
<year>2003-2006</year>
|
||||
<holder>Jeff Garzik</holder>
|
||||
</copyright>
|
||||
|
||||
|
|
|
@ -395,6 +395,26 @@ bugme-janitor mailing list (every change in the bugzilla is mailed here)
|
|||
|
||||
|
||||
|
||||
Managing bug reports
|
||||
--------------------
|
||||
|
||||
One of the best ways to put into practice your hacking skills is by fixing
|
||||
bugs reported by other people. Not only you will help to make the kernel
|
||||
more stable, you'll learn to fix real world problems and you will improve
|
||||
your skills, and other developers will be aware of your presence. Fixing
|
||||
bugs is one of the best ways to get merits among other developers, because
|
||||
not many people like wasting time fixing other people's bugs.
|
||||
|
||||
To work in the already reported bug reports, go to http://bugzilla.kernel.org.
|
||||
If you want to be advised of the future bug reports, you can subscribe to the
|
||||
bugme-new mailing list (only new bug reports are mailed here) or to the
|
||||
bugme-janitor mailing list (every change in the bugzilla is mailed here)
|
||||
|
||||
http://lists.osdl.org/mailman/listinfo/bugme-new
|
||||
http://lists.osdl.org/mailman/listinfo/bugme-janitors
|
||||
|
||||
|
||||
|
||||
Mailing lists
|
||||
-------------
|
||||
|
||||
|
|
|
@ -470,7 +470,68 @@ LOC: 324553 325068
|
|||
ERR: 0
|
||||
MIS: 0
|
||||
|
||||
6. FAQ
|
||||
6. MSI quirks
|
||||
|
||||
Several PCI chipsets or devices are known to not support MSI.
|
||||
The PCI stack provides 3 possible levels of MSI disabling:
|
||||
* on a single device
|
||||
* on all devices behind a specific bridge
|
||||
* globally
|
||||
|
||||
6.1. Disabling MSI on a single device
|
||||
|
||||
Under some circumstances, it might be required to disable MSI on a
|
||||
single device, It may be achived by either not calling pci_enable_msi()
|
||||
or all, or setting the pci_dev->no_msi flag before (most of the time
|
||||
in a quirk).
|
||||
|
||||
6.2. Disabling MSI below a bridge
|
||||
|
||||
The vast majority of MSI quirks are required by PCI bridges not
|
||||
being able to route MSI between busses. In this case, MSI have to be
|
||||
disabled on all devices behind this bridge. It is achieves by setting
|
||||
the PCI_BUS_FLAGS_NO_MSI flag in the pci_bus->bus_flags of the bridge
|
||||
subordinate bus. There is no need to set the same flag on bridges that
|
||||
are below the broken brigde. When pci_enable_msi() is called to enable
|
||||
MSI on a device, pci_msi_supported() takes care of checking the NO_MSI
|
||||
flag in all parent busses of the device.
|
||||
|
||||
Some bridges actually support dynamic MSI support enabling/disabling
|
||||
by changing some bits in their PCI configuration space (especially
|
||||
the Hypertransport chipsets such as the nVidia nForce and Serverworks
|
||||
HT2000). It may then be required to update the NO_MSI flag on the
|
||||
corresponding devices in the sysfs hierarchy. To enable MSI support
|
||||
on device "0000:00:0e", do:
|
||||
|
||||
echo 1 > /sys/bus/pci/devices/0000:00:0e/msi_bus
|
||||
|
||||
To disable MSI support, echo 0 instead of 1. Note that it should be
|
||||
used with caution since changing this value might break interrupts.
|
||||
|
||||
6.3. Disabling MSI globally
|
||||
|
||||
Some extreme cases may require to disable MSI globally on the system.
|
||||
For now, the only known case is a Serverworks PCI-X chipsets (MSI are
|
||||
not supported on several busses that are not all connected to the
|
||||
chipset in the Linux PCI hierarchy). In the vast majority of other
|
||||
cases, disabling only behind a specific bridge is enough.
|
||||
|
||||
For debugging purpose, the user may also pass pci=nomsi on the kernel
|
||||
command-line to explicitly disable MSI globally. But, once the appro-
|
||||
priate quirks are added to the kernel, this option should not be
|
||||
required anymore.
|
||||
|
||||
6.4. Finding why MSI cannot be enabled on a device
|
||||
|
||||
Assuming that MSI are not enabled on a device, you should look at
|
||||
dmesg to find messages that quirks may output when disabling MSI
|
||||
on some devices, some bridges or even globally.
|
||||
Then, lspci -t gives the list of bridges above a device. Reading
|
||||
/sys/bus/pci/devices/0000:00:0e/msi_bus will tell you whether MSI
|
||||
are enabled (1) or disabled (0). In 0 is found in a single bridge
|
||||
msi_bus file above the device, MSI cannot be enabled.
|
||||
|
||||
7. FAQ
|
||||
|
||||
Q1. Are there any limitations on using the MSI?
|
||||
|
||||
|
|
|
@ -221,3 +221,41 @@ over a rather long period of time, but improvements are always welcome!
|
|||
disable irq on a given acquisition of that lock will result in
|
||||
deadlock as soon as the RCU callback happens to interrupt that
|
||||
acquisition's critical section.
|
||||
|
||||
13. SRCU (srcu_read_lock(), srcu_read_unlock(), and synchronize_srcu())
|
||||
may only be invoked from process context. Unlike other forms of
|
||||
RCU, it -is- permissible to block in an SRCU read-side critical
|
||||
section (demarked by srcu_read_lock() and srcu_read_unlock()),
|
||||
hence the "SRCU": "sleepable RCU". Please note that if you
|
||||
don't need to sleep in read-side critical sections, you should
|
||||
be using RCU rather than SRCU, because RCU is almost always
|
||||
faster and easier to use than is SRCU.
|
||||
|
||||
Also unlike other forms of RCU, explicit initialization
|
||||
and cleanup is required via init_srcu_struct() and
|
||||
cleanup_srcu_struct(). These are passed a "struct srcu_struct"
|
||||
that defines the scope of a given SRCU domain. Once initialized,
|
||||
the srcu_struct is passed to srcu_read_lock(), srcu_read_unlock()
|
||||
and synchronize_srcu(). A given synchronize_srcu() waits only
|
||||
for SRCU read-side critical sections governed by srcu_read_lock()
|
||||
and srcu_read_unlock() calls that have been passd the same
|
||||
srcu_struct. This property is what makes sleeping read-side
|
||||
critical sections tolerable -- a given subsystem delays only
|
||||
its own updates, not those of other subsystems using SRCU.
|
||||
Therefore, SRCU is less prone to OOM the system than RCU would
|
||||
be if RCU's read-side critical sections were permitted to
|
||||
sleep.
|
||||
|
||||
The ability to sleep in read-side critical sections does not
|
||||
come for free. First, corresponding srcu_read_lock() and
|
||||
srcu_read_unlock() calls must be passed the same srcu_struct.
|
||||
Second, grace-period-detection overhead is amortized only
|
||||
over those updates sharing a given srcu_struct, rather than
|
||||
being globally amortized as they are for other forms of RCU.
|
||||
Therefore, SRCU should be used in preference to rw_semaphore
|
||||
only in extremely read-intensive situations, or in situations
|
||||
requiring SRCU's read-side deadlock immunity or low read-side
|
||||
realtime latency.
|
||||
|
||||
Note that, rcu_assign_pointer() and rcu_dereference() relate to
|
||||
SRCU just as they do to other forms of RCU.
|
||||
|
|
|
@ -45,7 +45,8 @@ o How can I see where RCU is currently used in the Linux kernel?
|
|||
|
||||
Search for "rcu_read_lock", "rcu_read_unlock", "call_rcu",
|
||||
"rcu_read_lock_bh", "rcu_read_unlock_bh", "call_rcu_bh",
|
||||
"synchronize_rcu", and "synchronize_net".
|
||||
"srcu_read_lock", "srcu_read_unlock", "synchronize_rcu",
|
||||
"synchronize_net", and "synchronize_srcu".
|
||||
|
||||
o What guidelines should I follow when writing code that uses RCU?
|
||||
|
||||
|
|
|
@ -28,6 +28,15 @@ nreaders This is the number of RCU reading threads supported.
|
|||
To properly exercise RCU implementations with preemptible
|
||||
read-side critical sections.
|
||||
|
||||
nfakewriters This is the number of RCU fake writer threads to run. Fake
|
||||
writer threads repeatedly use the synchronous "wait for
|
||||
current readers" function of the interface selected by
|
||||
torture_type, with a delay between calls to allow for various
|
||||
different numbers of writers running in parallel.
|
||||
nfakewriters defaults to 4, which provides enough parallelism
|
||||
to trigger special cases caused by multiple writers, such as
|
||||
the synchronize_srcu() early return optimization.
|
||||
|
||||
stat_interval The number of seconds between output of torture
|
||||
statistics (via printk()). Regardless of the interval,
|
||||
statistics are printed when the module is unloaded.
|
||||
|
@ -44,9 +53,12 @@ test_no_idle_hz Whether or not to test the ability of RCU to operate in
|
|||
a kernel that disables the scheduling-clock interrupt to
|
||||
idle CPUs. Boolean parameter, "1" to test, "0" otherwise.
|
||||
|
||||
torture_type The type of RCU to test: "rcu" for the rcu_read_lock()
|
||||
API, "rcu_bh" for the rcu_read_lock_bh() API, and "srcu"
|
||||
for the "srcu_read_lock()" API.
|
||||
torture_type The type of RCU to test: "rcu" for the rcu_read_lock() API,
|
||||
"rcu_sync" for rcu_read_lock() with synchronous reclamation,
|
||||
"rcu_bh" for the rcu_read_lock_bh() API, "rcu_bh_sync" for
|
||||
rcu_read_lock_bh() with synchronous reclamation, "srcu" for
|
||||
the "srcu_read_lock()" API, and "sched" for the use of
|
||||
preempt_disable() together with synchronize_sched().
|
||||
|
||||
verbose Enable debug printk()s. Default is disabled.
|
||||
|
||||
|
@ -118,6 +130,21 @@ o "Free-Block Circulation": Shows the number of torture structures
|
|||
as it is only incremented if a torture structure's counter
|
||||
somehow gets incremented farther than it should.
|
||||
|
||||
Different implementations of RCU can provide implementation-specific
|
||||
additional information. For example, SRCU provides the following:
|
||||
|
||||
srcu-torture: rtc: f8cf46a8 ver: 355 tfle: 0 rta: 356 rtaf: 0 rtf: 346 rtmbe: 0
|
||||
srcu-torture: Reader Pipe: 559738 939 0 0 0 0 0 0 0 0 0
|
||||
srcu-torture: Reader Batch: 560434 243 0 0 0 0 0 0 0 0
|
||||
srcu-torture: Free-Block Circulation: 355 354 353 352 351 350 349 348 347 346 0
|
||||
srcu-torture: per-CPU(idx=1): 0(0,1) 1(0,1) 2(0,0) 3(0,1)
|
||||
|
||||
The first four lines are similar to those for RCU. The last line shows
|
||||
the per-CPU counter state. The numbers in parentheses are the values
|
||||
of the "old" and "current" counters for the corresponding CPU. The
|
||||
"idx" value maps the "old" and "current" values to the underlying array,
|
||||
and is useful for debugging.
|
||||
|
||||
|
||||
USAGE
|
||||
|
||||
|
|
|
@ -778,6 +778,8 @@ Markers for RCU read-side critical sections:
|
|||
rcu_read_unlock
|
||||
rcu_read_lock_bh
|
||||
rcu_read_unlock_bh
|
||||
srcu_read_lock
|
||||
srcu_read_unlock
|
||||
|
||||
RCU pointer/list traversal:
|
||||
|
||||
|
@ -804,6 +806,7 @@ RCU grace period:
|
|||
synchronize_net
|
||||
synchronize_sched
|
||||
synchronize_rcu
|
||||
synchronize_srcu
|
||||
call_rcu
|
||||
call_rcu_bh
|
||||
|
||||
|
|
|
@ -46,7 +46,7 @@ maxcpus=n Restrict boot time cpus to n. Say if you have 4 cpus, using
|
|||
maxcpus=2 will only boot 2. You can choose to bring the
|
||||
other cpus later online, read FAQ's for more info.
|
||||
|
||||
additional_cpus*=n Use this to limit hotpluggable cpus. This option sets
|
||||
additional_cpus=n (*) Use this to limit hotpluggable cpus. This option sets
|
||||
cpu_possible_map = cpu_present_map + additional_cpus
|
||||
|
||||
(*) Option valid only for following architectures
|
||||
|
@ -101,15 +101,15 @@ cpu_possible_map/for_each_possible_cpu() to iterate.
|
|||
|
||||
Never use anything other than cpumask_t to represent bitmap of CPUs.
|
||||
|
||||
#include <linux/cpumask.h>
|
||||
#include <linux/cpumask.h>
|
||||
|
||||
for_each_possible_cpu - Iterate over cpu_possible_map
|
||||
for_each_online_cpu - Iterate over cpu_online_map
|
||||
for_each_present_cpu - Iterate over cpu_present_map
|
||||
for_each_cpu_mask(x,mask) - Iterate over some random collection of cpu mask.
|
||||
for_each_possible_cpu - Iterate over cpu_possible_map
|
||||
for_each_online_cpu - Iterate over cpu_online_map
|
||||
for_each_present_cpu - Iterate over cpu_present_map
|
||||
for_each_cpu_mask(x,mask) - Iterate over some random collection of cpu mask.
|
||||
|
||||
#include <linux/cpu.h>
|
||||
lock_cpu_hotplug() and unlock_cpu_hotplug():
|
||||
#include <linux/cpu.h>
|
||||
lock_cpu_hotplug() and unlock_cpu_hotplug():
|
||||
|
||||
The above calls are used to inhibit cpu hotplug operations. While holding the
|
||||
cpucontrol mutex, cpu_online_map will not change. If you merely need to avoid
|
||||
|
@ -120,7 +120,7 @@ will work as long as stop_machine_run() is used to take a cpu down.
|
|||
|
||||
CPU Hotplug - Frequently Asked Questions.
|
||||
|
||||
Q: How to i enable my kernel to support CPU hotplug?
|
||||
Q: How to enable my kernel to support CPU hotplug?
|
||||
A: When doing make defconfig, Enable CPU hotplug support
|
||||
|
||||
"Processor type and Features" -> Support for Hotpluggable CPUs
|
||||
|
@ -141,39 +141,39 @@ A: You should now notice an entry in sysfs.
|
|||
Check if sysfs is mounted, using the "mount" command. You should notice
|
||||
an entry as shown below in the output.
|
||||
|
||||
....
|
||||
none on /sys type sysfs (rw)
|
||||
....
|
||||
....
|
||||
none on /sys type sysfs (rw)
|
||||
....
|
||||
|
||||
if this is not mounted, do the following.
|
||||
If this is not mounted, do the following.
|
||||
|
||||
#mkdir /sysfs
|
||||
#mount -t sysfs sys /sys
|
||||
#mkdir /sysfs
|
||||
#mount -t sysfs sys /sys
|
||||
|
||||
now you should see entries for all present cpu, the following is an example
|
||||
Now you should see entries for all present cpu, the following is an example
|
||||
in a 8-way system.
|
||||
|
||||
#pwd
|
||||
#/sys/devices/system/cpu
|
||||
#ls -l
|
||||
total 0
|
||||
drwxr-xr-x 10 root root 0 Sep 19 07:44 .
|
||||
drwxr-xr-x 13 root root 0 Sep 19 07:45 ..
|
||||
drwxr-xr-x 3 root root 0 Sep 19 07:44 cpu0
|
||||
drwxr-xr-x 3 root root 0 Sep 19 07:44 cpu1
|
||||
drwxr-xr-x 3 root root 0 Sep 19 07:44 cpu2
|
||||
drwxr-xr-x 3 root root 0 Sep 19 07:44 cpu3
|
||||
drwxr-xr-x 3 root root 0 Sep 19 07:44 cpu4
|
||||
drwxr-xr-x 3 root root 0 Sep 19 07:44 cpu5
|
||||
drwxr-xr-x 3 root root 0 Sep 19 07:44 cpu6
|
||||
drwxr-xr-x 3 root root 0 Sep 19 07:48 cpu7
|
||||
#pwd
|
||||
#/sys/devices/system/cpu
|
||||
#ls -l
|
||||
total 0
|
||||
drwxr-xr-x 10 root root 0 Sep 19 07:44 .
|
||||
drwxr-xr-x 13 root root 0 Sep 19 07:45 ..
|
||||
drwxr-xr-x 3 root root 0 Sep 19 07:44 cpu0
|
||||
drwxr-xr-x 3 root root 0 Sep 19 07:44 cpu1
|
||||
drwxr-xr-x 3 root root 0 Sep 19 07:44 cpu2
|
||||
drwxr-xr-x 3 root root 0 Sep 19 07:44 cpu3
|
||||
drwxr-xr-x 3 root root 0 Sep 19 07:44 cpu4
|
||||
drwxr-xr-x 3 root root 0 Sep 19 07:44 cpu5
|
||||
drwxr-xr-x 3 root root 0 Sep 19 07:44 cpu6
|
||||
drwxr-xr-x 3 root root 0 Sep 19 07:48 cpu7
|
||||
|
||||
Under each directory you would find an "online" file which is the control
|
||||
file to logically online/offline a processor.
|
||||
|
||||
Q: Does hot-add/hot-remove refer to physical add/remove of cpus?
|
||||
A: The usage of hot-add/remove may not be very consistently used in the code.
|
||||
CONFIG_CPU_HOTPLUG enables logical online/offline capability in the kernel.
|
||||
CONFIG_HOTPLUG_CPU enables logical online/offline capability in the kernel.
|
||||
To support physical addition/removal, one would need some BIOS hooks and
|
||||
the platform should have something like an attention button in PCI hotplug.
|
||||
CONFIG_ACPI_HOTPLUG_CPU enables ACPI support for physical add/remove of CPUs.
|
||||
|
@ -181,17 +181,17 @@ CONFIG_ACPI_HOTPLUG_CPU enables ACPI support for physical add/remove of CPUs.
|
|||
Q: How do i logically offline a CPU?
|
||||
A: Do the following.
|
||||
|
||||
#echo 0 > /sys/devices/system/cpu/cpuX/online
|
||||
#echo 0 > /sys/devices/system/cpu/cpuX/online
|
||||
|
||||
once the logical offline is successful, check
|
||||
Once the logical offline is successful, check
|
||||
|
||||
#cat /proc/interrupts
|
||||
#cat /proc/interrupts
|
||||
|
||||
you should now not see the CPU that you removed. Also online file will report
|
||||
You should now not see the CPU that you removed. Also online file will report
|
||||
the state as 0 when a cpu if offline and 1 when its online.
|
||||
|
||||
#To display the current cpu state.
|
||||
#cat /sys/devices/system/cpu/cpuX/online
|
||||
#To display the current cpu state.
|
||||
#cat /sys/devices/system/cpu/cpuX/online
|
||||
|
||||
Q: Why cant i remove CPU0 on some systems?
|
||||
A: Some architectures may have some special dependency on a certain CPU.
|
||||
|
@ -234,8 +234,8 @@ Q: If i have some kernel code that needs to be aware of CPU arrival and
|
|||
departure, how to i arrange for proper notification?
|
||||
A: This is what you would need in your kernel code to receive notifications.
|
||||
|
||||
#include <linux/cpu.h>
|
||||
static int __cpuinit foobar_cpu_callback(struct notifier_block *nfb,
|
||||
#include <linux/cpu.h>
|
||||
static int __cpuinit foobar_cpu_callback(struct notifier_block *nfb,
|
||||
unsigned long action, void *hcpu)
|
||||
{
|
||||
unsigned int cpu = (unsigned long)hcpu;
|
||||
|
@ -279,10 +279,10 @@ Q: I don't see my action being called for all CPUs already up and running?
|
|||
A: Yes, CPU notifiers are called only when new CPUs are on-lined or offlined.
|
||||
If you need to perform some action for each cpu already in the system, then
|
||||
|
||||
for_each_online_cpu(i) {
|
||||
for_each_online_cpu(i) {
|
||||
foobar_cpu_callback(&foobar_cpu_notifier, CPU_UP_PREPARE, i);
|
||||
foobar_cpu_callback(&foobar-cpu_notifier, CPU_ONLINE, i);
|
||||
}
|
||||
foobar_cpu_callback(&foobar_cpu_notifier, CPU_ONLINE, i);
|
||||
}
|
||||
|
||||
Q: If i would like to develop cpu hotplug support for a new architecture,
|
||||
what do i need at a minimum?
|
||||
|
@ -307,38 +307,38 @@ Q: I need to ensure that a particular cpu is not removed when there is some
|
|||
work specific to this cpu is in progress.
|
||||
A: First switch the current thread context to preferred cpu
|
||||
|
||||
int my_func_on_cpu(int cpu)
|
||||
{
|
||||
cpumask_t saved_mask, new_mask = CPU_MASK_NONE;
|
||||
int curr_cpu, err = 0;
|
||||
int my_func_on_cpu(int cpu)
|
||||
{
|
||||
cpumask_t saved_mask, new_mask = CPU_MASK_NONE;
|
||||
int curr_cpu, err = 0;
|
||||
|
||||
saved_mask = current->cpus_allowed;
|
||||
cpu_set(cpu, new_mask);
|
||||
err = set_cpus_allowed(current, new_mask);
|
||||
saved_mask = current->cpus_allowed;
|
||||
cpu_set(cpu, new_mask);
|
||||
err = set_cpus_allowed(current, new_mask);
|
||||
|
||||
if (err)
|
||||
return err;
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
/*
|
||||
* If we got scheduled out just after the return from
|
||||
* set_cpus_allowed() before running the work, this ensures
|
||||
* we stay locked.
|
||||
*/
|
||||
curr_cpu = get_cpu();
|
||||
/*
|
||||
* If we got scheduled out just after the return from
|
||||
* set_cpus_allowed() before running the work, this ensures
|
||||
* we stay locked.
|
||||
*/
|
||||
curr_cpu = get_cpu();
|
||||
|
||||
if (curr_cpu != cpu) {
|
||||
err = -EAGAIN;
|
||||
goto ret;
|
||||
} else {
|
||||
/*
|
||||
* Do work : But cant sleep, since get_cpu() disables preempt
|
||||
*/
|
||||
}
|
||||
ret:
|
||||
put_cpu();
|
||||
set_cpus_allowed(current, saved_mask);
|
||||
return err;
|
||||
}
|
||||
if (curr_cpu != cpu) {
|
||||
err = -EAGAIN;
|
||||
goto ret;
|
||||
} else {
|
||||
/*
|
||||
* Do work : But cant sleep, since get_cpu() disables preempt
|
||||
*/
|
||||
}
|
||||
ret:
|
||||
put_cpu();
|
||||
set_cpus_allowed(current, saved_mask);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
Q: How do we determine how many CPUs are available for hotplug.
|
||||
|
|
|
@ -0,0 +1,77 @@
|
|||
eCryptfs: A stacked cryptographic filesystem for Linux
|
||||
|
||||
eCryptfs is free software. Please see the file COPYING for details.
|
||||
For documentation, please see the files in the doc/ subdirectory. For
|
||||
building and installation instructions please see the INSTALL file.
|
||||
|
||||
Maintainer: Phillip Hellewell
|
||||
Lead developer: Michael A. Halcrow <mhalcrow@us.ibm.com>
|
||||
Developers: Michael C. Thompson
|
||||
Kent Yoder
|
||||
Web Site: http://ecryptfs.sf.net
|
||||
|
||||
This software is currently undergoing development. Make sure to
|
||||
maintain a backup copy of any data you write into eCryptfs.
|
||||
|
||||
eCryptfs requires the userspace tools downloadable from the
|
||||
SourceForge site:
|
||||
|
||||
http://sourceforge.net/projects/ecryptfs/
|
||||
|
||||
Userspace requirements include:
|
||||
- David Howells' userspace keyring headers and libraries (version
|
||||
1.0 or higher), obtainable from
|
||||
http://people.redhat.com/~dhowells/keyutils/
|
||||
- Libgcrypt
|
||||
|
||||
|
||||
NOTES
|
||||
|
||||
In the beta/experimental releases of eCryptfs, when you upgrade
|
||||
eCryptfs, you should copy the files to an unencrypted location and
|
||||
then copy the files back into the new eCryptfs mount to migrate the
|
||||
files.
|
||||
|
||||
|
||||
MOUNT-WIDE PASSPHRASE
|
||||
|
||||
Create a new directory into which eCryptfs will write its encrypted
|
||||
files (i.e., /root/crypt). Then, create the mount point directory
|
||||
(i.e., /mnt/crypt). Now it's time to mount eCryptfs:
|
||||
|
||||
mount -t ecryptfs /root/crypt /mnt/crypt
|
||||
|
||||
You should be prompted for a passphrase and a salt (the salt may be
|
||||
blank).
|
||||
|
||||
Try writing a new file:
|
||||
|
||||
echo "Hello, World" > /mnt/crypt/hello.txt
|
||||
|
||||
The operation will complete. Notice that there is a new file in
|
||||
/root/crypt that is at least 12288 bytes in size (depending on your
|
||||
host page size). This is the encrypted underlying file for what you
|
||||
just wrote. To test reading, from start to finish, you need to clear
|
||||
the user session keyring:
|
||||
|
||||
keyctl clear @u
|
||||
|
||||
Then umount /mnt/crypt and mount again per the instructions given
|
||||
above.
|
||||
|
||||
cat /mnt/crypt/hello.txt
|
||||
|
||||
|
||||
NOTES
|
||||
|
||||
eCryptfs version 0.1 should only be mounted on (1) empty directories
|
||||
or (2) directories containing files only created by eCryptfs. If you
|
||||
mount a directory that has pre-existing files not created by eCryptfs,
|
||||
then behavior is undefined. Do not run eCryptfs in higher verbosity
|
||||
levels unless you are doing so for the sole purpose of debugging or
|
||||
development, since secret values will be written out to the system log
|
||||
in that case.
|
||||
|
||||
|
||||
Mike Halcrow
|
||||
mhalcrow@us.ibm.com
|
|
@ -29,14 +29,6 @@ Who: Adrian Bunk <bunk@stusta.de>
|
|||
|
||||
---------------------------
|
||||
|
||||
What: drivers that were depending on OBSOLETE_OSS_DRIVER
|
||||
(config options already removed)
|
||||
When: before 2.6.19
|
||||
Why: OSS drivers with ALSA replacements
|
||||
Who: Adrian Bunk <bunk@stusta.de>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: raw1394: requests of type RAW1394_REQ_ISO_SEND, RAW1394_REQ_ISO_LISTEN
|
||||
When: November 2006
|
||||
Why: Deprecated in favour of the new ioctl-based rawiso interface, which is
|
||||
|
@ -263,7 +255,7 @@ Who: Stephen Hemminger <shemminger@osdl.org>
|
|||
|
||||
|
||||
What: PHYSDEVPATH, PHYSDEVBUS, PHYSDEVDRIVER in the uevent environment
|
||||
When: Oktober 2008
|
||||
When: October 2008
|
||||
Why: The stacking of class devices makes these values misleading and
|
||||
inconsistent.
|
||||
Class devices should not carry any of these properties, and bus
|
||||
|
|
|
@ -34,6 +34,8 @@ ext2.txt
|
|||
- info, mount options and specifications for the Ext2 filesystem.
|
||||
ext3.txt
|
||||
- info, mount options and specifications for the Ext3 filesystem.
|
||||
ext4.txt
|
||||
- info, mount options and specifications for the Ext4 filesystem.
|
||||
files.txt
|
||||
- info on file management in the Linux kernel.
|
||||
fuse.txt
|
||||
|
|
|
@ -0,0 +1,236 @@
|
|||
|
||||
Ext4 Filesystem
|
||||
===============
|
||||
|
||||
This is a development version of the ext4 filesystem, an advanced level
|
||||
of the ext3 filesystem which incorporates scalability and reliability
|
||||
enhancements for supporting large filesystems (64 bit) in keeping with
|
||||
increasing disk capacities and state-of-the-art feature requirements.
|
||||
|
||||
Mailing list: linux-ext4@vger.kernel.org
|
||||
|
||||
|
||||
1. Quick usage instructions:
|
||||
===========================
|
||||
|
||||
- Grab updated e2fsprogs from
|
||||
ftp://ftp.kernel.org/pub/linux/kernel/people/tytso/e2fsprogs-interim/
|
||||
This is a patchset on top of e2fsprogs-1.39, which can be found at
|
||||
ftp://ftp.kernel.org/pub/linux/kernel/people/tytso/e2fsprogs/
|
||||
|
||||
- It's still mke2fs -j /dev/hda1
|
||||
|
||||
- mount /dev/hda1 /wherever -t ext4dev
|
||||
|
||||
- To enable extents,
|
||||
|
||||
mount /dev/hda1 /wherever -t ext4dev -o extents
|
||||
|
||||
- The filesystem is compatible with the ext3 driver until you add a file
|
||||
which has extents (ie: `mount -o extents', then create a file).
|
||||
|
||||
NOTE: The "extents" mount flag is temporary. It will soon go away and
|
||||
extents will be enabled by the "-o extents" flag to mke2fs or tune2fs
|
||||
|
||||
- When comparing performance with other filesystems, remember that
|
||||
ext3/4 by default offers higher data integrity guarantees than most. So
|
||||
when comparing with a metadata-only journalling filesystem, use `mount -o
|
||||
data=writeback'. And you might as well use `mount -o nobh' too along
|
||||
with it. Making the journal larger than the mke2fs default often helps
|
||||
performance with metadata-intensive workloads.
|
||||
|
||||
2. Features
|
||||
===========
|
||||
|
||||
2.1 Currently available
|
||||
|
||||
* ability to use filesystems > 16TB
|
||||
* extent format reduces metadata overhead (RAM, IO for access, transactions)
|
||||
* extent format more robust in face of on-disk corruption due to magics,
|
||||
* internal redunancy in tree
|
||||
|
||||
2.1 Previously available, soon to be enabled by default by "mkefs.ext4":
|
||||
|
||||
* dir_index and resize inode will be on by default
|
||||
* large inodes will be used by default for fast EAs, nsec timestamps, etc
|
||||
|
||||
2.2 Candidate features for future inclusion
|
||||
|
||||
There are several under discussion, whether they all make it in is
|
||||
partly a function of how much time everyone has to work on them:
|
||||
|
||||
* improved file allocation (multi-block alloc, delayed alloc; basically done)
|
||||
* fix 32000 subdirectory limit (patch exists, needs some e2fsck work)
|
||||
* nsec timestamps for mtime, atime, ctime, create time (patch exists,
|
||||
needs some e2fsck work)
|
||||
* inode version field on disk (NFSv4, Lustre; prototype exists)
|
||||
* reduced mke2fs/e2fsck time via uninitialized groups (prototype exists)
|
||||
* journal checksumming for robustness, performance (prototype exists)
|
||||
* persistent file preallocation (e.g for streaming media, databases)
|
||||
|
||||
Features like metadata checksumming have been discussed and planned for
|
||||
a bit but no patches exist yet so I'm not sure they're in the near-term
|
||||
roadmap.
|
||||
|
||||
The big performance win will come with mballoc and delalloc. CFS has
|
||||
been using mballoc for a few years already with Lustre, and IBM + Bull
|
||||
did a lot of benchmarking on it. The reason it isn't in the first set of
|
||||
patches is partly a manageability issue, and partly because it doesn't
|
||||
directly affect the on-disk format (outside of much better allocation)
|
||||
so it isn't critical to get into the first round of changes. I believe
|
||||
Alex is working on a new set of patches right now.
|
||||
|
||||
3. Options
|
||||
==========
|
||||
|
||||
When mounting an ext4 filesystem, the following option are accepted:
|
||||
(*) == default
|
||||
|
||||
extents ext4 will use extents to address file data. The
|
||||
file system will no longer be mountable by ext3.
|
||||
|
||||
journal=update Update the ext4 file system's journal to the current
|
||||
format.
|
||||
|
||||
journal=inum When a journal already exists, this option is ignored.
|
||||
Otherwise, it specifies the number of the inode which
|
||||
will represent the ext4 file system's journal file.
|
||||
|
||||
journal_dev=devnum When the external journal device's major/minor numbers
|
||||
have changed, this option allows the user to specify
|
||||
the new journal location. The journal device is
|
||||
identified through its new major/minor numbers encoded
|
||||
in devnum.
|
||||
|
||||
noload Don't load the journal on mounting.
|
||||
|
||||
data=journal All data are committed into the journal prior to being
|
||||
written into the main file system.
|
||||
|
||||
data=ordered (*) All data are forced directly out to the main file
|
||||
system prior to its metadata being committed to the
|
||||
journal.
|
||||
|
||||
data=writeback Data ordering is not preserved, data may be written
|
||||
into the main file system after its metadata has been
|
||||
committed to the journal.
|
||||
|
||||
commit=nrsec (*) Ext4 can be told to sync all its data and metadata
|
||||
every 'nrsec' seconds. The default value is 5 seconds.
|
||||
This means that if you lose your power, you will lose
|
||||
as much as the latest 5 seconds of work (your
|
||||
filesystem will not be damaged though, thanks to the
|
||||
journaling). This default value (or any low value)
|
||||
will hurt performance, but it's good for data-safety.
|
||||
Setting it to 0 will have the same effect as leaving
|
||||
it at the default (5 seconds).
|
||||
Setting it to very large values will improve
|
||||
performance.
|
||||
|
||||
barrier=1 This enables/disables barriers. barrier=0 disables
|
||||
it, barrier=1 enables it.
|
||||
|
||||
orlov (*) This enables the new Orlov block allocator. It is
|
||||
enabled by default.
|
||||
|
||||
oldalloc This disables the Orlov block allocator and enables
|
||||
the old block allocator. Orlov should have better
|
||||
performance - we'd like to get some feedback if it's
|
||||
the contrary for you.
|
||||
|
||||
user_xattr Enables Extended User Attributes. Additionally, you
|
||||
need to have extended attribute support enabled in the
|
||||
kernel configuration (CONFIG_EXT4_FS_XATTR). See the
|
||||
attr(5) manual page and http://acl.bestbits.at/ to
|
||||
learn more about extended attributes.
|
||||
|
||||
nouser_xattr Disables Extended User Attributes.
|
||||
|
||||
acl Enables POSIX Access Control Lists support.
|
||||
Additionally, you need to have ACL support enabled in
|
||||
the kernel configuration (CONFIG_EXT4_FS_POSIX_ACL).
|
||||
See the acl(5) manual page and http://acl.bestbits.at/
|
||||
for more information.
|
||||
|
||||
noacl This option disables POSIX Access Control List
|
||||
support.
|
||||
|
||||
reservation
|
||||
|
||||
noreservation
|
||||
|
||||
bsddf (*) Make 'df' act like BSD.
|
||||
minixdf Make 'df' act like Minix.
|
||||
|
||||
check=none Don't do extra checking of bitmaps on mount.
|
||||
nocheck
|
||||
|
||||
debug Extra debugging information is sent to syslog.
|
||||
|
||||
errors=remount-ro(*) Remount the filesystem read-only on an error.
|
||||
errors=continue Keep going on a filesystem error.
|
||||
errors=panic Panic and halt the machine if an error occurs.
|
||||
|
||||
grpid Give objects the same group ID as their creator.
|
||||
bsdgroups
|
||||
|
||||
nogrpid (*) New objects have the group ID of their creator.
|
||||
sysvgroups
|
||||
|
||||
resgid=n The group ID which may use the reserved blocks.
|
||||
|
||||
resuid=n The user ID which may use the reserved blocks.
|
||||
|
||||
sb=n Use alternate superblock at this location.
|
||||
|
||||
quota
|
||||
noquota
|
||||
grpquota
|
||||
usrquota
|
||||
|
||||
bh (*) ext4 associates buffer heads to data pages to
|
||||
nobh (a) cache disk block mapping information
|
||||
(b) link pages into transaction to provide
|
||||
ordering guarantees.
|
||||
"bh" option forces use of buffer heads.
|
||||
"nobh" option tries to avoid associating buffer
|
||||
heads (supported only for "writeback" mode).
|
||||
|
||||
|
||||
Data Mode
|
||||
---------
|
||||
There are 3 different data modes:
|
||||
|
||||
* writeback mode
|
||||
In data=writeback mode, ext4 does not journal data at all. This mode provides
|
||||
a similar level of journaling as that of XFS, JFS, and ReiserFS in its default
|
||||
mode - metadata journaling. A crash+recovery can cause incorrect data to
|
||||
appear in files which were written shortly before the crash. This mode will
|
||||
typically provide the best ext4 performance.
|
||||
|
||||
* ordered mode
|
||||
In data=ordered mode, ext4 only officially journals metadata, but it logically
|
||||
groups metadata and data blocks into a single unit called a transaction. When
|
||||
it's time to write the new metadata out to disk, the associated data blocks
|
||||
are written first. In general, this mode performs slightly slower than
|
||||
writeback but significantly faster than journal mode.
|
||||
|
||||
* journal mode
|
||||
data=journal mode provides full data and metadata journaling. All new data is
|
||||
written to the journal first, and then to its final location.
|
||||
In the event of a crash, the journal can be replayed, bringing both data and
|
||||
metadata into a consistent state. This mode is the slowest except when data
|
||||
needs to be read from and written to disk at the same time where it
|
||||
outperforms all others modes.
|
||||
|
||||
References
|
||||
==========
|
||||
|
||||
kernel source: <file:fs/ext4/>
|
||||
<file:fs/jbd2/>
|
||||
|
||||
programs: http://e2fsprogs.sourceforge.net/
|
||||
http://ext2resize.sourceforge.net
|
||||
|
||||
useful links: http://fedoraproject.org/wiki/ext3-devel
|
||||
http://www.bullopensource.org/ext4/
|
|
@ -0,0 +1,43 @@
|
|||
Global File System
|
||||
------------------
|
||||
|
||||
http://sources.redhat.com/cluster/
|
||||
|
||||
GFS is a cluster file system. It allows a cluster of computers to
|
||||
simultaneously use a block device that is shared between them (with FC,
|
||||
iSCSI, NBD, etc). GFS reads and writes to the block device like a local
|
||||
file system, but also uses a lock module to allow the computers coordinate
|
||||
their I/O so file system consistency is maintained. One of the nifty
|
||||
features of GFS is perfect consistency -- changes made to the file system
|
||||
on one machine show up immediately on all other machines in the cluster.
|
||||
|
||||
GFS uses interchangable inter-node locking mechanisms. Different lock
|
||||
modules can plug into GFS and each file system selects the appropriate
|
||||
lock module at mount time. Lock modules include:
|
||||
|
||||
lock_nolock -- allows gfs to be used as a local file system
|
||||
|
||||
lock_dlm -- uses a distributed lock manager (dlm) for inter-node locking
|
||||
The dlm is found at linux/fs/dlm/
|
||||
|
||||
In addition to interfacing with an external locking manager, a gfs lock
|
||||
module is responsible for interacting with external cluster management
|
||||
systems. Lock_dlm depends on user space cluster management systems found
|
||||
at the URL above.
|
||||
|
||||
To use gfs as a local file system, no external clustering systems are
|
||||
needed, simply:
|
||||
|
||||
$ mkfs -t gfs2 -p lock_nolock -j 1 /dev/block_device
|
||||
$ mount -t gfs2 /dev/block_device /dir
|
||||
|
||||
GFS2 is not on-disk compatible with previous versions of GFS.
|
||||
|
||||
The following man pages can be found at the URL above:
|
||||
gfs2_fsck to repair a filesystem
|
||||
gfs2_grow to expand a filesystem online
|
||||
gfs2_jadd to add journals to a filesystem online
|
||||
gfs2_tool to manipulate, examine and tune a filesystem
|
||||
gfs2_quota to examine and change quota values in a filesystem
|
||||
mount.gfs2 to help mount(8) mount a filesystem
|
||||
mkfs.gfs2 to make a filesystem
|
|
@ -24,7 +24,7 @@ Authors:
|
|||
Frodo Looijaard <frodol@dds.nl>,
|
||||
Philip Edelbrock <phil@netroedge.com>,
|
||||
Michiel Rook <michiel@grendelproject.nl>,
|
||||
Grant Coady <gcoady@gmail.com> with guidance
|
||||
Grant Coady <gcoady.lk@gmail.com> with guidance
|
||||
from Jean Delvare <khali@linux-fr.org>
|
||||
|
||||
Interface
|
||||
|
|
|
@ -17,7 +17,7 @@ Thanks to Kris Chen from Fintek for answering technical questions and
|
|||
providing additional documentation.
|
||||
|
||||
Thanks to Chris Lin from Jetway for providing wiring schematics and
|
||||
anwsering technical questions.
|
||||
answering technical questions.
|
||||
|
||||
|
||||
Description
|
||||
|
|
|
@ -2,7 +2,7 @@ Kernel driver k8temp
|
|||
====================
|
||||
|
||||
Supported chips:
|
||||
* AMD K8 CPU
|
||||
* AMD Athlon64/FX or Opteron CPUs
|
||||
Prefix: 'k8temp'
|
||||
Addresses scanned: PCI space
|
||||
Datasheet: http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/32559.pdf
|
||||
|
@ -13,10 +13,13 @@ Contact: Rudolf Marek <r.marek@sh.cvut.cz>
|
|||
Description
|
||||
-----------
|
||||
|
||||
This driver permits reading temperature sensor(s) embedded inside AMD K8 CPUs.
|
||||
Official documentation says that it works from revision F of K8 core, but
|
||||
in fact it seems to be implemented for all revisions of K8 except the first
|
||||
two revisions (SH-B0 and SH-B3).
|
||||
This driver permits reading temperature sensor(s) embedded inside AMD K8
|
||||
family CPUs (Athlon64/FX, Opteron). Official documentation says that it works
|
||||
from revision F of K8 core, but in fact it seems to be implemented for all
|
||||
revisions of K8 except the first two revisions (SH-B0 and SH-B3).
|
||||
|
||||
Please note that you will need at least lm-sensors 2.10.1 for proper userspace
|
||||
support.
|
||||
|
||||
There can be up to four temperature sensors inside single CPU. The driver
|
||||
will auto-detect the sensors and will display only temperatures from
|
||||
|
|
|
@ -2,12 +2,14 @@ Kernel driver smsc47m1
|
|||
======================
|
||||
|
||||
Supported chips:
|
||||
* SMSC LPC47B27x, LPC47M10x, LPC47M13x, LPC47M14x, LPC47M15x and LPC47M192
|
||||
* SMSC LPC47B27x, LPC47M112, LPC47M10x, LPC47M13x, LPC47M14x,
|
||||
LPC47M15x and LPC47M192
|
||||
Addresses scanned: none, address read from Super I/O config space
|
||||
Prefix: 'smsc47m1'
|
||||
Datasheets:
|
||||
http://www.smsc.com/main/datasheets/47b27x.pdf
|
||||
http://www.smsc.com/main/datasheets/47m10x.pdf
|
||||
http://www.smsc.com/main/datasheets/47m112.pdf
|
||||
http://www.smsc.com/main/tools/discontinued/47m13x.pdf
|
||||
http://www.smsc.com/main/datasheets/47m14x.pdf
|
||||
http://www.smsc.com/main/tools/discontinued/47m15x.pdf
|
||||
|
|
|
@ -26,7 +26,7 @@ fan control mode).
|
|||
Temperatures are measured in degrees Celsius and measurement resolution is 1
|
||||
degC for temp1 and 0.5 degC for temp2 and temp3. An alarm is triggered when
|
||||
the temperature gets higher than high limit; it stays on until the temperature
|
||||
falls below the Hysteresis value.
|
||||
falls below the hysteresis value.
|
||||
|
||||
Fan rotation speeds are reported in RPM (rotations per minute). An alarm is
|
||||
triggered if the rotation speed has dropped below a programmable limit. Fan
|
||||
|
@ -67,9 +67,9 @@ Thermal Cruise mode
|
|||
|
||||
If the temperature is in the range defined by:
|
||||
|
||||
pwm[1-4]_target - set target temperature, unit millidegree Celcius
|
||||
pwm[1-4]_target - set target temperature, unit millidegree Celsius
|
||||
(range 0 - 127000)
|
||||
pwm[1-4]_tolerance - tolerance, unit millidegree Celcius (range 0 - 15000)
|
||||
pwm[1-4]_tolerance - tolerance, unit millidegree Celsius (range 0 - 15000)
|
||||
|
||||
there are no changes to fan speed. Once the temperature leaves the interval,
|
||||
fan speed increases (temp is higher) or decreases if lower than desired.
|
||||
|
|
|
@ -30,9 +30,10 @@ detailed description):
|
|||
- ACPI sounds
|
||||
- temperature sensors
|
||||
- Experimental: embedded controller register dump
|
||||
- Experimental: LCD brightness control
|
||||
- Experimental: volume control
|
||||
- LCD brightness control
|
||||
- Volume control
|
||||
- Experimental: fan speed, fan enable/disable
|
||||
- Experimental: WAN enable and disable
|
||||
|
||||
A compatibility table by model and feature is maintained on the web
|
||||
site, http://ibm-acpi.sf.net/. I appreciate any success or failure
|
||||
|
@ -52,40 +53,7 @@ Installation
|
|||
|
||||
If you are compiling this driver as included in the Linux kernel
|
||||
sources, simply enable the CONFIG_ACPI_IBM option (Power Management /
|
||||
ACPI / IBM ThinkPad Laptop Extras). The rest of this section describes
|
||||
how to install this driver when downloaded from the web site.
|
||||
|
||||
First, you need to get a kernel with ACPI support up and running.
|
||||
Please refer to http://acpi.sourceforge.net/ for help with this
|
||||
step. How successful you will be depends a lot on you ThinkPad model,
|
||||
the kernel you are using and any additional patches applied. The
|
||||
kernel provided with your distribution may not be good enough. I
|
||||
needed to compile a 2.6.7 kernel with the 20040715 ACPI patch to get
|
||||
ACPI working reliably on my ThinkPad X40. Old ThinkPad models may not
|
||||
be supported at all.
|
||||
|
||||
Assuming you have the basic ACPI support working (e.g. you can see the
|
||||
/proc/acpi directory), follow the following steps to install this
|
||||
driver:
|
||||
|
||||
- unpack the archive:
|
||||
|
||||
tar xzvf ibm-acpi-x.y.tar.gz; cd ibm-acpi-x.y
|
||||
|
||||
- compile the driver:
|
||||
|
||||
make
|
||||
|
||||
- install the module in your kernel modules directory:
|
||||
|
||||
make install
|
||||
|
||||
- load the module:
|
||||
|
||||
modprobe ibm_acpi
|
||||
|
||||
After loading the module, check the "dmesg" output for any error messages.
|
||||
|
||||
ACPI / IBM ThinkPad Laptop Extras).
|
||||
|
||||
Features
|
||||
--------
|
||||
|
@ -523,13 +491,8 @@ registers contain the current battery capacity, etc. If you experiment
|
|||
with this, do send me your results (including some complete dumps with
|
||||
a description of the conditions when they were taken.)
|
||||
|
||||
EXPERIMENTAL: LCD brightness control -- /proc/acpi/ibm/brightness
|
||||
-----------------------------------------------------------------
|
||||
|
||||
This feature is marked EXPERIMENTAL because the implementation
|
||||
directly accesses hardware registers and may not work as expected. USE
|
||||
WITH CAUTION! To use this feature, you need to supply the
|
||||
experimental=1 parameter when loading the module.
|
||||
LCD brightness control -- /proc/acpi/ibm/brightness
|
||||
---------------------------------------------------
|
||||
|
||||
This feature allows software control of the LCD brightness on ThinkPad
|
||||
models which don't have a hardware brightness slider. The available
|
||||
|
@ -542,13 +505,8 @@ commands are:
|
|||
The <level> number range is 0 to 7, although not all of them may be
|
||||
distinct. The current brightness level is shown in the file.
|
||||
|
||||
EXPERIMENTAL: Volume control -- /proc/acpi/ibm/volume
|
||||
-----------------------------------------------------
|
||||
|
||||
This feature is marked EXPERIMENTAL because the implementation
|
||||
directly accesses hardware registers and may not work as expected. USE
|
||||
WITH CAUTION! To use this feature, you need to supply the
|
||||
experimental=1 parameter when loading the module.
|
||||
Volume control -- /proc/acpi/ibm/volume
|
||||
---------------------------------------
|
||||
|
||||
This feature allows volume control on ThinkPad models which don't have
|
||||
a hardware volume knob. The available commands are:
|
||||
|
@ -611,6 +569,23 @@ with the following command:
|
|||
|
||||
echo 'level <level>' > /proc/acpi/ibm/thermal
|
||||
|
||||
EXPERIMENTAL: WAN -- /proc/acpi/ibm/wan
|
||||
---------------------------------------
|
||||
|
||||
This feature is marked EXPERIMENTAL because the implementation
|
||||
directly accesses hardware registers and may not work as expected. USE
|
||||
WITH CAUTION! To use this feature, you need to supply the
|
||||
experimental=1 parameter when loading the module.
|
||||
|
||||
This feature shows the presence and current state of a WAN (Sierra
|
||||
Wireless EV-DO) device. If WAN is installed, the following commands can
|
||||
be used:
|
||||
|
||||
echo enable > /proc/acpi/ibm/wan
|
||||
echo disable > /proc/acpi/ibm/wan
|
||||
|
||||
It was tested on a Lenovo Thinkpad X60. It should probably work on other
|
||||
Thinkpad models which come with this module installed.
|
||||
|
||||
Multiple Commands, Module Parameters
|
||||
------------------------------------
|
||||
|
|
|
@ -3,20 +3,37 @@ xpad - Linux USB driver for X-Box gamepads
|
|||
This is the very first release of a driver for X-Box gamepads.
|
||||
Basically, this was hacked away in just a few hours, so don't expect
|
||||
miracles.
|
||||
|
||||
In particular, there is currently NO support for the rumble pack.
|
||||
You won't find many ff-aware linux applications anyway.
|
||||
|
||||
|
||||
0. Status
|
||||
---------
|
||||
0. Notes
|
||||
--------
|
||||
|
||||
For now, this driver has only been tested on just one Linux-Box.
|
||||
This one is running a 2.4.18 kernel with usb-uhci on an amd athlon 600.
|
||||
Driver updated for kernel 2.6.17.11. (Based on a patch for 2.6.11.4.)
|
||||
|
||||
The jstest-program from joystick-1.2.15 (jstest-version 2.1.0) reports
|
||||
8 axes and 10 buttons.
|
||||
The number of buttons/axes reported varies based on 3 things:
|
||||
- if you are using a known controller
|
||||
- if you are using a known dance pad
|
||||
- if using an unknown device (one not listed below), what you set in the
|
||||
module configuration for "Map D-PAD to buttons rather than axes for unknown
|
||||
pads" (module option dpad_to_buttons)
|
||||
|
||||
Alls 8 axes work, though they all have the same range (-32768..32767)
|
||||
If you set dpad_to_buttons to 0 and you are using an unknown device (one
|
||||
not listed below), the driver will map the directional pad to axes (X/Y),
|
||||
if you said N it will map the d-pad to buttons, which is needed for dance
|
||||
style games to function correctly. The default is Y.
|
||||
|
||||
dpad_to_buttons has no effect for known pads.
|
||||
|
||||
0.1 Normal Controllers
|
||||
----------------------
|
||||
With a normal controller, the directional pad is mapped to its own X/Y axes.
|
||||
The jstest-program from joystick-1.2.15 (jstest-version 2.1.0) will report 8
|
||||
axes and 10 buttons.
|
||||
|
||||
All 8 axes work, though they all have the same range (-32768..32767)
|
||||
and the zero-setting is not correct for the triggers (I don't know if that
|
||||
is some limitation of jstest, since the input device setup should be fine. I
|
||||
didn't have a look at jstest itself yet).
|
||||
|
@ -30,16 +47,50 @@ in game functionality were OK. However, I find it rather difficult to
|
|||
play first person shooters with a pad. Your mileage may vary.
|
||||
|
||||
|
||||
0.2 Xbox Dance Pads
|
||||
-------------------
|
||||
When using a known dance pad, jstest will report 6 axes and 14 buttons.
|
||||
|
||||
For dance style pads (like the redoctane pad) several changes
|
||||
have been made. The old driver would map the d-pad to axes, resulting
|
||||
in the driver being unable to report when the user was pressing both
|
||||
left+right or up+down, making DDR style games unplayable.
|
||||
|
||||
Known dance pads automatically map the d-pad to buttons and will work
|
||||
correctly out of the box.
|
||||
|
||||
If your dance pad is recognized by the driver but is using axes instead
|
||||
of buttons, see section 0.3 - Unknown Controllers
|
||||
|
||||
I've tested this with Stepmania, and it works quite well.
|
||||
|
||||
|
||||
0.3 Unkown Controllers
|
||||
----------------------
|
||||
If you have an unkown xbox controller, it should work just fine with
|
||||
the default settings.
|
||||
|
||||
HOWEVER if you have an unknown dance pad not listed below, it will not
|
||||
work UNLESS you set "dpad_to_buttons" to 1 in the module configuration.
|
||||
|
||||
PLEASE if you have an unkown controller, email Dom <binary1230@yahoo.com> with
|
||||
a dump from /proc/bus/usb and a description of the pad (manufacturer, country,
|
||||
whether it is a dance pad or normal controller) so that we can add your pad
|
||||
to the list of supported devices, ensuring that it will work out of the
|
||||
box in the future.
|
||||
|
||||
|
||||
1. USB adapter
|
||||
--------------
|
||||
|
||||
Before you can actually use the driver, you need to get yourself an
|
||||
adapter cable to connect the X-Box controller to your Linux-Box.
|
||||
adapter cable to connect the X-Box controller to your Linux-Box. You
|
||||
can buy these online fairly cheap, or build your own.
|
||||
|
||||
Such a cable is pretty easy to build. The Controller itself is a USB compound
|
||||
device (a hub with three ports for two expansion slots and the controller
|
||||
device) with the only difference in a nonstandard connector (5 pins vs. 4 on
|
||||
standard USB connector).
|
||||
Such a cable is pretty easy to build. The Controller itself is a USB
|
||||
compound device (a hub with three ports for two expansion slots and
|
||||
the controller device) with the only difference in a nonstandard connector
|
||||
(5 pins vs. 4 on standard USB connector).
|
||||
|
||||
You just need to solder a USB connector onto the cable and keep the
|
||||
yellow wire unconnected. The other pins have the same order on both
|
||||
|
@ -51,36 +102,36 @@ original one. You can buy an extension cable and cut that instead. That way,
|
|||
you can still use the controller with your X-Box, if you have one ;)
|
||||
|
||||
|
||||
2. driver installation
|
||||
2. Driver Installation
|
||||
----------------------
|
||||
|
||||
Once you have the adapter cable and the controller is connected, you need
|
||||
to load your USB subsystem and should cat /proc/bus/usb/devices.
|
||||
There should be an entry like the one at the end [4].
|
||||
|
||||
Currently (as of version 0.0.4), the following three devices are included:
|
||||
Currently (as of version 0.0.6), the following devices are included:
|
||||
original Microsoft XBOX controller (US), vendor=0x045e, product=0x0202
|
||||
smaller Microsoft XBOX controller (US), vendor=0x045e, product=0x0289
|
||||
original Microsoft XBOX controller (Japan), vendor=0x045e, product=0x0285
|
||||
InterAct PowerPad Pro (Germany), vendor=0x05fd, product=0x107a
|
||||
RedOctane Xbox Dance Pad (US), vendor=0x0c12, product=0x8809
|
||||
|
||||
If you have another controller that is not listed above and is not recognized
|
||||
by the driver, please drop me a line with the appropriate info (that is, include
|
||||
the name, vendor and product ID, as well as the country where you bought it;
|
||||
sending the whole dump out of /proc/bus/usb/devices along would be even better).
|
||||
The driver should work with xbox pads not listed above as well, however
|
||||
you will need to do something extra for dance pads to work.
|
||||
|
||||
In theory, the driver should work with other controllers than mine
|
||||
(InterAct PowerPad pro, bought in Germany) just fine, but I cannot test this
|
||||
for I only have this one controller.
|
||||
If you have a controller not listed above, see 0.3 - Unknown Controllers
|
||||
|
||||
If you compiled and installed the driver, test the functionality:
|
||||
> modprobe xpad
|
||||
> modprobe joydev
|
||||
> jstest /dev/js0
|
||||
|
||||
There should be a single line showing 18 inputs (8 axes, 10 buttons), and
|
||||
it's values should change if you move the sticks and push the buttons.
|
||||
If you're using a normal controller, there should be a single line showing
|
||||
18 inputs (8 axes, 10 buttons), and its values should change if you move
|
||||
the sticks and push the buttons. If you're using a dance pad, it should
|
||||
show 20 inputs (6 axes, 14 buttons).
|
||||
|
||||
It works? Voila, your done ;)
|
||||
It works? Voila, you're done ;)
|
||||
|
||||
|
||||
3. Thanks
|
||||
|
@ -111,6 +162,22 @@ I: If#= 0 Alt= 0 #EPs= 2 Cls=58(unk. ) Sub=42 Prot=00 Driver=(none)
|
|||
E: Ad=81(I) Atr=03(Int.) MxPS= 32 Ivl= 10ms
|
||||
E: Ad=02(O) Atr=03(Int.) MxPS= 32 Ivl= 10ms
|
||||
|
||||
5. /proc/bus/usb/devices - dump from Redoctane Xbox Dance Pad (US):
|
||||
|
||||
T: Bus=01 Lev=02 Prnt=09 Port=00 Cnt=01 Dev#= 10 Spd=12 MxCh= 0
|
||||
D: Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1
|
||||
P: Vendor=0c12 ProdID=8809 Rev= 0.01
|
||||
S: Product=XBOX DDR
|
||||
C:* #Ifs= 1 Cfg#= 1 Atr=80 MxPwr=100mA
|
||||
I: If#= 0 Alt= 0 #EPs= 2 Cls=58(unk. ) Sub=42 Prot=00 Driver=xpad
|
||||
E: Ad=82(I) Atr=03(Int.) MxPS= 32 Ivl=4ms
|
||||
E: Ad=02(O) Atr=03(Int.) MxPS= 32 Ivl=4ms
|
||||
|
||||
--
|
||||
Marko Friedemann <mfr@bmx-chemnitz.de>
|
||||
2002-07-16
|
||||
- original doc
|
||||
|
||||
Dominic Cerquetti <binary1230@yahoo.com>
|
||||
2005-03-19
|
||||
- added stuff for dance pads, new d-pad->axes mappings
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
Introduction
|
||||
------------
|
||||
|
||||
The configuration database is collection of configuration options
|
||||
The configuration database is a collection of configuration options
|
||||
organized in a tree structure:
|
||||
|
||||
+- Code maturity level options
|
||||
|
|
|
@ -390,7 +390,7 @@ more details, with real examples.
|
|||
The kernel may be built with several different versions of
|
||||
$(CC), each supporting a unique set of features and options.
|
||||
kbuild provide basic support to check for valid options for $(CC).
|
||||
$(CC) is useally the gcc compiler, but other alternatives are
|
||||
$(CC) is usually the gcc compiler, but other alternatives are
|
||||
available.
|
||||
|
||||
as-option
|
||||
|
|
|
@ -289,9 +289,6 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
|
||||
autotest [IA64]
|
||||
|
||||
awe= [HW,OSS] AWE32/SB32/AWE64 wave table synth
|
||||
Format: <io>,<memsize>,<isapnp>
|
||||
|
||||
aztcd= [HW,CD] Aztech CD268 CDROM driver
|
||||
Format: <io>,0x79 (?)
|
||||
|
||||
|
@ -536,10 +533,6 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
Default value is 0.
|
||||
Value can be changed at runtime via /selinux/enforce.
|
||||
|
||||
es1370= [HW,OSS]
|
||||
Format: <lineout>[,<micbias>]
|
||||
See also header of sound/oss/es1370.c.
|
||||
|
||||
es1371= [HW,OSS]
|
||||
Format: <spdif>,[<nomix>,[<amplifier>]]
|
||||
See also header of sound/oss/es1371.c.
|
||||
|
@ -580,9 +573,6 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
gscd= [HW,CD]
|
||||
Format: <io>
|
||||
|
||||
gus= [HW,OSS]
|
||||
Format: <io>,<irq>,<dma>,<dma16>
|
||||
|
||||
gvp11= [HW,SCSI]
|
||||
|
||||
hashdist= [KNL,NUMA] Large hashes allocated during boot
|
||||
|
@ -841,12 +831,6 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
(machvec) in a generic kernel.
|
||||
Example: machvec=hpzx1_swiotlb
|
||||
|
||||
mad16= [HW,OSS] Format:
|
||||
<io>,<irq>,<dma>,<dma16>,<mpu_io>,<mpu_irq>,<joystick>
|
||||
|
||||
maui= [HW,OSS]
|
||||
Format: <io>,<irq>
|
||||
|
||||
max_loop= [LOOP] Maximum number of loopback devices that can
|
||||
be mounted
|
||||
Format: <1-256>
|
||||
|
@ -1114,9 +1098,6 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
opl3= [HW,OSS]
|
||||
Format: <io>
|
||||
|
||||
opl3sa= [HW,OSS]
|
||||
Format: <io>,<irq>,<dma>,<dma2>,<mpu_io>,<mpu_irq>
|
||||
|
||||
opl3sa2= [HW,OSS] Format:
|
||||
<io>,<irq>,<dma>,<dma2>,<mss_io>,<mpu_io>,<ymode>,<loopback>[,<isapnp>,<multiple]
|
||||
|
||||
|
@ -1250,6 +1231,11 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
machine check when some devices' config space
|
||||
is read. But various workarounds are disabled
|
||||
and some IOMMU drivers will not work.
|
||||
bfsort Sort PCI devices into breadth-first order.
|
||||
This sorting is done to get a device
|
||||
order compatible with older (<= 2.4) kernels.
|
||||
nobfsort Don't sort PCI devices into breadth-first order.
|
||||
|
||||
pcmv= [HW,PCMCIA] BadgePAD 4
|
||||
|
||||
pd. [PARIDE]
|
||||
|
@ -1357,10 +1343,6 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
rcu.qlowmark= [KNL,BOOT] Set threshold of queued
|
||||
RCU callbacks below which batch limiting is re-enabled.
|
||||
|
||||
rcu.rsinterval= [KNL,BOOT,SMP] Set the number of additional
|
||||
RCU callbacks to queued before forcing reschedule
|
||||
on all cpus.
|
||||
|
||||
rdinit= [KNL]
|
||||
Format: <full_path>
|
||||
Run specified binary instead of /init from the ramdisk,
|
||||
|
@ -1455,9 +1437,6 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
|
||||
sg_def_reserved_size= [SCSI]
|
||||
|
||||
sgalaxy= [HW,OSS]
|
||||
Format: <io>,<irq>,<dma>,<dma2>,<sgbase>
|
||||
|
||||
shapers= [NET]
|
||||
Maximal number of shapers.
|
||||
|
||||
|
@ -1598,9 +1577,6 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
|
||||
snd-ymfpci= [HW,ALSA]
|
||||
|
||||
sonicvibes= [HW,OSS]
|
||||
Format: <reverb>
|
||||
|
||||
sonycd535= [HW,CD]
|
||||
Format: <io>[,<irq>]
|
||||
|
||||
|
|
|
@ -50,10 +50,10 @@ The bit position indicates hardirq, softirq, hardirq-read,
|
|||
softirq-read respectively, and the character displayed in each
|
||||
indicates:
|
||||
|
||||
'.' acquired while irqs enabled
|
||||
'.' acquired while irqs disabled
|
||||
'+' acquired in irq context
|
||||
'-' acquired in process context with irqs disabled
|
||||
'?' read-acquired both with irqs enabled and in irq context
|
||||
'-' acquired with irqs enabled
|
||||
'?' read acquired in irq context with irqs enabled.
|
||||
|
||||
Unused mutexes cannot be part of the cause of an error.
|
||||
|
||||
|
|
|
@ -1898,7 +1898,7 @@ queue before processing any further requests:
|
|||
smp_wmb();
|
||||
<A:modify v=2> <C:busy>
|
||||
<C:queue v=2>
|
||||
p = &b; q = p;
|
||||
p = &v; q = p;
|
||||
<D:request p>
|
||||
<B:modify p=&v> <D:commit p=&v>
|
||||
<D:read p>
|
||||
|
|
|
@ -1440,6 +1440,258 @@ platforms are moved over to use the flattened-device-tree model.
|
|||
descriptor-types-mask = <012b0ebf>;
|
||||
};
|
||||
|
||||
h) Board Control and Status (BCSR)
|
||||
|
||||
Required properties:
|
||||
|
||||
- device_type : Should be "board-control"
|
||||
- reg : Offset and length of the register set for the device
|
||||
|
||||
Example:
|
||||
|
||||
bcsr@f8000000 {
|
||||
device_type = "board-control";
|
||||
reg = <f8000000 8000>;
|
||||
};
|
||||
|
||||
i) Freescale QUICC Engine module (QE)
|
||||
This represents qe module that is installed on PowerQUICC II Pro.
|
||||
Hopefully it will merge backward compatibility with CPM/CPM2.
|
||||
Basically, it is a bus of devices, that could act more or less
|
||||
as a complete entity (UCC, USB etc ). All of them should be siblings on
|
||||
the "root" qe node, using the common properties from there.
|
||||
The description below applies to the the qe of MPC8360 and
|
||||
more nodes and properties would be extended in the future.
|
||||
|
||||
i) Root QE device
|
||||
|
||||
Required properties:
|
||||
- device_type : should be "qe";
|
||||
- model : precise model of the QE, Can be "QE", "CPM", or "CPM2"
|
||||
- reg : offset and length of the device registers.
|
||||
- bus-frequency : the clock frequency for QUICC Engine.
|
||||
|
||||
Recommended properties
|
||||
- brg-frequency : the internal clock source frequency for baud-rate
|
||||
generators in Hz.
|
||||
|
||||
Example:
|
||||
qe@e0100000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
#interrupt-cells = <2>;
|
||||
device_type = "qe";
|
||||
model = "QE";
|
||||
ranges = <0 e0100000 00100000>;
|
||||
reg = <e0100000 480>;
|
||||
brg-frequency = <0>;
|
||||
bus-frequency = <179A7B00>;
|
||||
}
|
||||
|
||||
|
||||
ii) SPI (Serial Peripheral Interface)
|
||||
|
||||
Required properties:
|
||||
- device_type : should be "spi".
|
||||
- compatible : should be "fsl_spi".
|
||||
- mode : the spi operation mode, it can be "cpu" or "qe".
|
||||
- reg : Offset and length of the register set for the device
|
||||
- interrupts : <a b> where a is the interrupt number and b is a
|
||||
field that represents an encoding of the sense and level
|
||||
information for the interrupt. This should be encoded based on
|
||||
the information in section 2) depending on the type of interrupt
|
||||
controller you have.
|
||||
- interrupt-parent : the phandle for the interrupt controller that
|
||||
services interrupts for this device.
|
||||
|
||||
Example:
|
||||
spi@4c0 {
|
||||
device_type = "spi";
|
||||
compatible = "fsl_spi";
|
||||
reg = <4c0 40>;
|
||||
interrupts = <82 0>;
|
||||
interrupt-parent = <700>;
|
||||
mode = "cpu";
|
||||
};
|
||||
|
||||
|
||||
iii) USB (Universal Serial Bus Controller)
|
||||
|
||||
Required properties:
|
||||
- device_type : should be "usb".
|
||||
- compatible : could be "qe_udc" or "fhci-hcd".
|
||||
- mode : the could be "host" or "slave".
|
||||
- reg : Offset and length of the register set for the device
|
||||
- interrupts : <a b> where a is the interrupt number and b is a
|
||||
field that represents an encoding of the sense and level
|
||||
information for the interrupt. This should be encoded based on
|
||||
the information in section 2) depending on the type of interrupt
|
||||
controller you have.
|
||||
- interrupt-parent : the phandle for the interrupt controller that
|
||||
services interrupts for this device.
|
||||
|
||||
Example(slave):
|
||||
usb@6c0 {
|
||||
device_type = "usb";
|
||||
compatible = "qe_udc";
|
||||
reg = <6c0 40>;
|
||||
interrupts = <8b 0>;
|
||||
interrupt-parent = <700>;
|
||||
mode = "slave";
|
||||
};
|
||||
|
||||
|
||||
iv) UCC (Unified Communications Controllers)
|
||||
|
||||
Required properties:
|
||||
- device_type : should be "network", "hldc", "uart", "transparent"
|
||||
"bisync" or "atm".
|
||||
- compatible : could be "ucc_geth" or "fsl_atm" and so on.
|
||||
- model : should be "UCC".
|
||||
- device-id : the ucc number(1-8), corresponding to UCCx in UM.
|
||||
- reg : Offset and length of the register set for the device
|
||||
- interrupts : <a b> where a is the interrupt number and b is a
|
||||
field that represents an encoding of the sense and level
|
||||
information for the interrupt. This should be encoded based on
|
||||
the information in section 2) depending on the type of interrupt
|
||||
controller you have.
|
||||
- interrupt-parent : the phandle for the interrupt controller that
|
||||
services interrupts for this device.
|
||||
- pio-handle : The phandle for the Parallel I/O port configuration.
|
||||
- rx-clock : represents the UCC receive clock source.
|
||||
0x00 : clock source is disabled;
|
||||
0x1~0x10 : clock source is BRG1~BRG16 respectively;
|
||||
0x11~0x28: clock source is QE_CLK1~QE_CLK24 respectively.
|
||||
- tx-clock: represents the UCC transmit clock source;
|
||||
0x00 : clock source is disabled;
|
||||
0x1~0x10 : clock source is BRG1~BRG16 respectively;
|
||||
0x11~0x28: clock source is QE_CLK1~QE_CLK24 respectively.
|
||||
|
||||
Required properties for network device_type:
|
||||
- mac-address : list of bytes representing the ethernet address.
|
||||
- phy-handle : The phandle for the PHY connected to this controller.
|
||||
|
||||
Example:
|
||||
ucc@2000 {
|
||||
device_type = "network";
|
||||
compatible = "ucc_geth";
|
||||
model = "UCC";
|
||||
device-id = <1>;
|
||||
reg = <2000 200>;
|
||||
interrupts = <a0 0>;
|
||||
interrupt-parent = <700>;
|
||||
mac-address = [ 00 04 9f 00 23 23 ];
|
||||
rx-clock = "none";
|
||||
tx-clock = "clk9";
|
||||
phy-handle = <212000>;
|
||||
pio-handle = <140001>;
|
||||
};
|
||||
|
||||
|
||||
v) Parallel I/O Ports
|
||||
|
||||
This node configures Parallel I/O ports for CPUs with QE support.
|
||||
The node should reside in the "soc" node of the tree. For each
|
||||
device that using parallel I/O ports, a child node should be created.
|
||||
See the definition of the Pin configuration nodes below for more
|
||||
information.
|
||||
|
||||
Required properties:
|
||||
- device_type : should be "par_io".
|
||||
- reg : offset to the register set and its length.
|
||||
- num-ports : number of Parallel I/O ports
|
||||
|
||||
Example:
|
||||
par_io@1400 {
|
||||
reg = <1400 100>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
device_type = "par_io";
|
||||
num-ports = <7>;
|
||||
ucc_pin@01 {
|
||||
......
|
||||
};
|
||||
|
||||
|
||||
vi) Pin configuration nodes
|
||||
|
||||
Required properties:
|
||||
- linux,phandle : phandle of this node; likely referenced by a QE
|
||||
device.
|
||||
- pio-map : array of pin configurations. Each pin is defined by 6
|
||||
integers. The six numbers are respectively: port, pin, dir,
|
||||
open_drain, assignment, has_irq.
|
||||
- port : port number of the pin; 0-6 represent port A-G in UM.
|
||||
- pin : pin number in the port.
|
||||
- dir : direction of the pin, should encode as follows:
|
||||
|
||||
0 = The pin is disabled
|
||||
1 = The pin is an output
|
||||
2 = The pin is an input
|
||||
3 = The pin is I/O
|
||||
|
||||
- open_drain : indicates the pin is normal or wired-OR:
|
||||
|
||||
0 = The pin is actively driven as an output
|
||||
1 = The pin is an open-drain driver. As an output, the pin is
|
||||
driven active-low, otherwise it is three-stated.
|
||||
|
||||
- assignment : function number of the pin according to the Pin Assignment
|
||||
tables in User Manual. Each pin can have up to 4 possible functions in
|
||||
QE and two options for CPM.
|
||||
- has_irq : indicates if the pin is used as source of exteral
|
||||
interrupts.
|
||||
|
||||
Example:
|
||||
ucc_pin@01 {
|
||||
linux,phandle = <140001>;
|
||||
pio-map = <
|
||||
/* port pin dir open_drain assignment has_irq */
|
||||
0 3 1 0 1 0 /* TxD0 */
|
||||
0 4 1 0 1 0 /* TxD1 */
|
||||
0 5 1 0 1 0 /* TxD2 */
|
||||
0 6 1 0 1 0 /* TxD3 */
|
||||
1 6 1 0 3 0 /* TxD4 */
|
||||
1 7 1 0 1 0 /* TxD5 */
|
||||
1 9 1 0 2 0 /* TxD6 */
|
||||
1 a 1 0 2 0 /* TxD7 */
|
||||
0 9 2 0 1 0 /* RxD0 */
|
||||
0 a 2 0 1 0 /* RxD1 */
|
||||
0 b 2 0 1 0 /* RxD2 */
|
||||
0 c 2 0 1 0 /* RxD3 */
|
||||
0 d 2 0 1 0 /* RxD4 */
|
||||
1 1 2 0 2 0 /* RxD5 */
|
||||
1 0 2 0 2 0 /* RxD6 */
|
||||
1 4 2 0 2 0 /* RxD7 */
|
||||
0 7 1 0 1 0 /* TX_EN */
|
||||
0 8 1 0 1 0 /* TX_ER */
|
||||
0 f 2 0 1 0 /* RX_DV */
|
||||
0 10 2 0 1 0 /* RX_ER */
|
||||
0 0 2 0 1 0 /* RX_CLK */
|
||||
2 9 1 0 3 0 /* GTX_CLK - CLK10 */
|
||||
2 8 2 0 1 0>; /* GTX125 - CLK9 */
|
||||
};
|
||||
|
||||
vii) Multi-User RAM (MURAM)
|
||||
|
||||
Required properties:
|
||||
- device_type : should be "muram".
|
||||
- mode : the could be "host" or "slave".
|
||||
- ranges : Should be defined as specified in 1) to describe the
|
||||
translation of MURAM addresses.
|
||||
- data-only : sub-node which defines the address area under MURAM
|
||||
bus that can be allocated as data/parameter
|
||||
|
||||
Example:
|
||||
|
||||
muram@10000 {
|
||||
device_type = "muram";
|
||||
ranges = <0 00010000 0000c000>;
|
||||
|
||||
data-only@0{
|
||||
reg = <0 c000>;
|
||||
};
|
||||
};
|
||||
|
||||
More devices will be defined as this spec matures.
|
||||
|
||||
|
|
|
@ -66,7 +66,7 @@ Command line parameters
|
|||
|
||||
When a device is un-ignored, device recognition and sensing is performed and
|
||||
the device driver will be notified if possible, so the device will become
|
||||
available to the system.
|
||||
available to the system. Note that un-ignoring is performed asynchronously.
|
||||
|
||||
You can also add ranges of devices to be ignored by piping to
|
||||
/proc/cio_ignore; "add <device range>, <device range>, ..." will ignore the
|
||||
|
|
|
@ -174,14 +174,10 @@ read_dev_chars() - Read Device Characteristics
|
|||
|
||||
This routine returns the characteristics for the device specified.
|
||||
|
||||
The function is meant to be called with an irq handler in place; that is,
|
||||
The function is meant to be called with the device already enabled; that is,
|
||||
at earliest during set_online() processing.
|
||||
|
||||
While the request is processed synchronously, the device interrupt
|
||||
handler is called for final ending status. In case of error situations the
|
||||
interrupt handler may recover appropriately. The device irq handler can
|
||||
recognize the corresponding interrupts by the interruption parameter be
|
||||
0x00524443. The ccw_device must not be locked prior to calling read_dev_chars().
|
||||
The ccw_device must not be locked prior to calling read_dev_chars().
|
||||
|
||||
The function may be called enabled or disabled.
|
||||
|
||||
|
@ -410,26 +406,7 @@ individual flag meanings.
|
|||
|
||||
Usage Notes :
|
||||
|
||||
Prior to call ccw_device_start() the device driver must assure disabled state,
|
||||
i.e. the I/O mask value in the PSW must be disabled. This can be accomplished
|
||||
by calling local_save_flags( flags). The current PSW flags are preserved and
|
||||
can be restored by local_irq_restore( flags) at a later time.
|
||||
|
||||
If the device driver violates this rule while running in a uni-processor
|
||||
environment an interrupt might be presented prior to the ccw_device_start()
|
||||
routine returning to the device driver main path. In this case we will end in a
|
||||
deadlock situation as the interrupt handler will try to obtain the irq
|
||||
lock the device driver still owns (see below) !
|
||||
|
||||
The driver must assure to hold the device specific lock. This can be
|
||||
accomplished by
|
||||
|
||||
(i) spin_lock(get_ccwdev_lock(cdev)), or
|
||||
(ii) spin_lock_irqsave(get_ccwdev_lock(cdev), flags)
|
||||
|
||||
Option (i) should be used if the calling routine is running disabled for
|
||||
I/O interrupts (see above) already. Option (ii) obtains the device gate und
|
||||
puts the CPU into I/O disabled state by preserving the current PSW flags.
|
||||
ccw_device_start() must be called disabled and with the ccw device lock held.
|
||||
|
||||
The device driver is allowed to issue the next ccw_device_start() call from
|
||||
within its interrupt handler already. It is not required to schedule a
|
||||
|
@ -488,7 +465,7 @@ int ccw_device_resume(struct ccw_device *cdev);
|
|||
|
||||
cdev - ccw_device the resume operation is requested for
|
||||
|
||||
The resume_IO() function returns:
|
||||
The ccw_device_resume() function returns:
|
||||
|
||||
0 - suspended channel program is resumed
|
||||
-EBUSY - status pending
|
||||
|
@ -507,6 +484,8 @@ a long-running channel program or the device might require to initially issue
|
|||
a halt subchannel (HSCH) I/O command. For those purposes the ccw_device_halt()
|
||||
command is provided.
|
||||
|
||||
ccw_device_halt() must be called disabled and with the ccw device lock held.
|
||||
|
||||
int ccw_device_halt(struct ccw_device *cdev,
|
||||
unsigned long intparm);
|
||||
|
||||
|
@ -517,7 +496,7 @@ intparm : interruption parameter; value is only used if no I/O
|
|||
|
||||
The ccw_device_halt() function returns :
|
||||
|
||||
0 - successful completion or request successfully initiated
|
||||
0 - request successfully initiated
|
||||
-EBUSY - the device is currently busy, or status pending.
|
||||
-ENODEV - cdev invalid.
|
||||
-EINVAL - The device is not operational or the ccw device is not online.
|
||||
|
@ -533,6 +512,23 @@ can then perform an appropriate action. Prior to interrupt of an outstanding
|
|||
read to a network device (with or without PCI flag) a ccw_device_halt()
|
||||
is required to end the pending operation.
|
||||
|
||||
ccw_device_clear() - Terminage I/O Request Processing
|
||||
|
||||
In order to terminate all I/O processing at the subchannel, the clear subchannel
|
||||
(CSCH) command is used. It can be issued via ccw_device_clear().
|
||||
|
||||
ccw_device_clear() must be called disabled and with the ccw device lock held.
|
||||
|
||||
int ccw_device_clear(struct ccw_device *cdev, unsigned long intparm);
|
||||
|
||||
cdev: ccw_device the clear operation is requested for
|
||||
intparm: interruption parameter (see ccw_device_halt())
|
||||
|
||||
The ccw_device_clear() function returns:
|
||||
|
||||
0 - request successfully initiated
|
||||
-ENODEV - cdev invalid
|
||||
-EINVAL - The device is not operational or the ccw device is not online.
|
||||
|
||||
Miscellaneous Support Routines
|
||||
|
||||
|
|
|
@ -239,6 +239,9 @@ status - Can be 'online' or 'offline'.
|
|||
|
||||
type - The physical type of the channel path.
|
||||
|
||||
shared - Whether the channel path is shared.
|
||||
|
||||
cmg - The channel measurement group.
|
||||
|
||||
3. System devices
|
||||
-----------------
|
||||
|
|
|
@ -1,4 +1,49 @@
|
|||
|
||||
1 Release Date : Mon Oct 02 11:21:32 PDT 2006 - Sumant Patro <Sumant.Patro@lsil.com>
|
||||
2 Current Version : 00.00.03.05
|
||||
3 Older Version : 00.00.03.04
|
||||
|
||||
i. PCI_DEVICE macro used
|
||||
|
||||
Convert the pci_device_id-table of the megaraid_sas-driver to the PCI_DEVICE-macro, to safe some lines.
|
||||
|
||||
- Henrik Kretzschmar <henne@nachtwindheim.de>
|
||||
ii. All compiler warnings removed
|
||||
iii. megasas_ctrl_info struct reverted to 3.02 release
|
||||
iv. Default value of megasas_dbg_lvl set to 0
|
||||
v. Removing in megasas_exit the sysfs entry created for megasas_dbg_lvl
|
||||
vi. In megasas_teardown_frame_pool(), cmd->frame was passed instead of
|
||||
cmd->sense to pci_pool_free. Fixed. Bug was pointed out by
|
||||
Eric Sesterhenn
|
||||
|
||||
1 Release Date : Wed Sep 13 14:22:51 PDT 2006 - Sumant Patro <Sumant.Patro@lsil.com>
|
||||
2 Current Version : 00.00.03.04
|
||||
3 Older Version : 00.00.03.03
|
||||
|
||||
i. Added Reboot notify
|
||||
ii. Reduced by 1 max cmds sent to FW from Driver to make the reply_q_sz same
|
||||
as Max Cmds FW can support
|
||||
|
||||
1 Release Date : Tue Aug 22 16:33:14 PDT 2006 - Sumant Patro <Sumant.Patro@lsil.com>
|
||||
2 Current Version : 00.00.03.03
|
||||
3 Older Version : 00.00.03.02
|
||||
|
||||
i. Send stop adapter to FW & Dump pending FW cmds before declaring adapter dead.
|
||||
New varible added to set dbg level.
|
||||
ii. Disable interrupt made as fn pointer as they are different for 1068 / 1078
|
||||
iii. Frame count optimization. Main frame can contain 2 SGE for 64 bit SGLs and
|
||||
3 SGE for 32 bit SGL
|
||||
iv. Tasklet added for cmd completion
|
||||
v. If FW in operational state before firing INIT, now we send RESET Flag to FW instead of just READY. This is used to do soft reset.
|
||||
vi. megasas_ctrl_prop structure updated (based on FW struct)
|
||||
vii. Added print : FW now in Ready State during initialization
|
||||
|
||||
1 Release Date : Sun Aug 06 22:49:52 PDT 2006 - Sumant Patro <Sumant.Patro@lsil.com>
|
||||
2 Current Version : 00.00.03.02
|
||||
3 Older Version : 00.00.03.01
|
||||
|
||||
i. Added FW tranistion state for Hotplug scenario
|
||||
|
||||
1 Release Date : Sun May 14 22:49:52 PDT 2006 - Sumant Patro <Sumant.Patro@lsil.com>
|
||||
2 Current Version : 00.00.03.01
|
||||
3 Older Version : 00.00.02.04
|
||||
|
|
|
@ -1,76 +0,0 @@
|
|||
Installing and using Creative AWE midi sound under Linux.
|
||||
|
||||
This documentation is devoted to the Creative Sound Blaster AWE32, AWE64 and
|
||||
SB32.
|
||||
|
||||
1) Make sure you have an ORIGINAL Creative SB32, AWE32 or AWE64 card. This
|
||||
is important, because the driver works only with real Creative cards.
|
||||
|
||||
2) The first thing you need to do is re-compile your kernel with support for
|
||||
your sound card. Run your favourite tool to configure the kernel and when
|
||||
you get to the "Sound" menu you should enable support for the following:
|
||||
|
||||
Sound card support,
|
||||
OSS sound modules,
|
||||
100% Sound Blaster compatibles (SB16/32/64, ESS, Jazz16) support,
|
||||
AWE32 synth
|
||||
|
||||
If your card is "Plug and Play" you will also need to enable these two
|
||||
options, found under the "Plug and Play configuration" menu:
|
||||
|
||||
Plug and Play support
|
||||
ISA Plug and Play support
|
||||
|
||||
Now compile and install the kernel in normal fashion. If you don't know
|
||||
how to do this you can find instructions for this in the README file
|
||||
located in the root directory of the kernel source.
|
||||
|
||||
3) Before you can start playing midi files you will have to load a sound
|
||||
bank file. The utility needed for doing this is called "sfxload", and it
|
||||
is one of the utilities found in a package called "awesfx". If this
|
||||
package is not available in your distribution you can download the AWE
|
||||
snapshot from Creative Labs Open Source website:
|
||||
|
||||
http://www.opensource.creative.com/snapshot.html
|
||||
|
||||
Once you have unpacked the AWE snapshot you will see a "awesfx"
|
||||
directory. Follow the instructions in awesfx/docs/INSTALL to install the
|
||||
utilities in this package. After doing this, sfxload should be installed
|
||||
as:
|
||||
|
||||
/usr/local/bin/sfxload
|
||||
|
||||
To enable AWE general midi synthesis you should also get the sound bank
|
||||
file for general midi from:
|
||||
|
||||
http://members.xoom.com/yar/synthgm.sbk.gz
|
||||
|
||||
Copy it to a directory of your choice, and unpack it there.
|
||||
|
||||
4) Edit /etc/modprobe.conf, and insert the following lines at the end of the
|
||||
file:
|
||||
|
||||
alias sound-slot-0 sb
|
||||
alias sound-service-0-1 awe_wave
|
||||
install awe_wave /sbin/modprobe --first-time -i awe_wave && /usr/local/bin/sfxload PATH_TO_SOUND_BANK_FILE
|
||||
|
||||
You will of course have to change "PATH_TO_SOUND_BANK_FILE" to the full
|
||||
path of the sound bank file. That will enable the Sound Blaster and AWE
|
||||
wave synthesis. To play midi files you should get one of these programs if
|
||||
you don't already have them:
|
||||
|
||||
Playmidi: http://playmidi.openprojects.net
|
||||
|
||||
AWEMidi Player (drvmidi) Included in the previously mentioned AWE
|
||||
snapshot.
|
||||
|
||||
You will probably have to pass the "-e" switch to playmidi to have it use
|
||||
your midi device. drvmidi should work without switches.
|
||||
|
||||
If something goes wrong please e-mail me. All comments and suggestions are
|
||||
welcome.
|
||||
|
||||
Yaroslav Rosomakho (alons55@dialup.ptt.ru)
|
||||
http://www.yar.opennet.ru
|
||||
|
||||
Last Updated: Feb 3 2001
|
|
@ -1,85 +0,0 @@
|
|||
Audio driver for CM8338/CM8738 chips by Chen-Li Tien
|
||||
|
||||
|
||||
HARDWARE SUPPORTED
|
||||
================================================================================
|
||||
C-Media CMI8338
|
||||
C-Media CMI8738
|
||||
On-board C-Media chips
|
||||
|
||||
|
||||
STEPS TO BUILD DRIVER
|
||||
================================================================================
|
||||
|
||||
1. Backup the Config.in and Makefile in the sound driver directory
|
||||
(/usr/src/linux/driver/sound).
|
||||
The Configure.help provide help when you config driver in step
|
||||
4, please backup the original one (/usr/src/linux/Document) and
|
||||
copy this file.
|
||||
The cmpci is document for the driver in detail, please copy it
|
||||
to /usr/src/linux/Document/sound so you can refer it. Backup if
|
||||
there is already one.
|
||||
|
||||
2. Extract the tar file by 'tar xvzf cmpci-xx.tar.gz' in the above
|
||||
directory.
|
||||
|
||||
3. Change directory to /usr/src/linux
|
||||
|
||||
4. Config cm8338 driver by 'make menuconfig', 'make config' or
|
||||
'make xconfig' command.
|
||||
|
||||
5. Please select Sound Card (CONFIG_SOUND=m) support and CMPCI
|
||||
driver (CONFIG_SOUND_CMPCI=m) as modules. Resident mode not tested.
|
||||
For driver option, please refer 'DRIVER PARAMETER'
|
||||
|
||||
6. Compile the kernel if necessary.
|
||||
|
||||
7. Compile the modules by 'make modules'.
|
||||
|
||||
8. Install the modules by 'make modules_install'
|
||||
|
||||
|
||||
INSTALL DRIVER
|
||||
================================================================================
|
||||
|
||||
1. Before first time to run the driver, create module dependency by
|
||||
'depmod -a'
|
||||
|
||||
2. To install the driver manually, enter 'modprobe cmpci'.
|
||||
|
||||
3. Driver installation for various distributions:
|
||||
|
||||
a. Slackware 4.0
|
||||
Add the 'modprobe cmpci' command in your /etc/rc.d/rc.modules
|
||||
file.so you can start the driver automatically each time booting.
|
||||
|
||||
b. Caldera OpenLinux 2.2
|
||||
Use LISA to load the cmpci module.
|
||||
|
||||
c. RedHat 6.0 and S.u.S.E. 6.1
|
||||
Add following command in /etc/conf.modules:
|
||||
|
||||
alias sound cmpci
|
||||
|
||||
also visit http://www.cmedia.com.tw for installation instruction.
|
||||
|
||||
DRIVER PARAMETER
|
||||
================================================================================
|
||||
|
||||
Some functions for the cm8738 can be configured in Kernel Configuration
|
||||
or modules parameters. Set these parameters to 1 to enable.
|
||||
|
||||
mpuio: I/O ports base for MPU-401, 0 if disabled.
|
||||
fmio: I/O ports base for OPL-3, 0 if disabled.
|
||||
spdif_inverse:Inverse the S/PDIF-in signal, this depends on your
|
||||
CD-ROM or DVD-ROM.
|
||||
spdif_loop: Enable S/PDIF loop, this route S/PDIF-in to S/PDIF-out
|
||||
directly.
|
||||
speakers: Number of speakers used.
|
||||
use_line_as_rear:Enable this if you want to use line-in as
|
||||
rear-out.
|
||||
use_line_as_bass:Enable this if you want to use line-in as
|
||||
bass-out.
|
||||
joystick: Enable joystick. You will need to install Linux joystick
|
||||
driver.
|
||||
|
|
@ -1,134 +0,0 @@
|
|||
================================================================
|
||||
INSTALLATION OF AWE32 SOUND DRIVER FOR LINUX
|
||||
Takashi Iwai <iwai@ww.uni-erlangen.de>
|
||||
================================================================
|
||||
|
||||
----------------------------------------------------------------
|
||||
* Attention to SB-PnP Card Users
|
||||
|
||||
If you're using PnP cards, the initialization of PnP is required
|
||||
before loading this driver. You have now three options:
|
||||
1. Use isapnptools.
|
||||
2. Use in-kernel isapnp support.
|
||||
3. Initialize PnP on DOS/Windows, then boot linux by loadlin.
|
||||
In this document, only the case 1 case is treated.
|
||||
|
||||
----------------------------------------------------------------
|
||||
* Installation on Red Hat 5.0 Sound Driver
|
||||
|
||||
Please use install-rh.sh under RedHat5.0 directory.
|
||||
DO NOT USE install.sh below.
|
||||
See INSTALL.RH for more details.
|
||||
|
||||
----------------------------------------------------------------
|
||||
* Installation/Update by Shell Script
|
||||
|
||||
1. Become root
|
||||
|
||||
% su
|
||||
|
||||
2. If you have never configured the kernel tree yet, run make config
|
||||
once (to make dependencies and symlinks).
|
||||
|
||||
# cd /usr/src/linux
|
||||
# make xconfig
|
||||
|
||||
3. Run install.sh script
|
||||
|
||||
# sh ./install.sh
|
||||
|
||||
4. Configure your kernel
|
||||
|
||||
(for Linux 2.[01].x user)
|
||||
# cd /usr/src/linux
|
||||
# make xconfig (or make menuconfig)
|
||||
|
||||
(for Linux 1.2.x user)
|
||||
# cd /usr/src/linux
|
||||
# make config
|
||||
|
||||
Answer YES to both "lowlevel drivers" and "AWE32 wave synth" items
|
||||
in Sound menu. ("lowlevel drivers" will appear only in 2.x
|
||||
kernel.)
|
||||
|
||||
5. Make your kernel (and modules), and install them as usual.
|
||||
|
||||
5a. make kernel image
|
||||
# make zImage
|
||||
|
||||
5b. make modules and install them
|
||||
# make modules && make modules_install
|
||||
|
||||
5c. If you're using lilo, copy the kernel image and run lilo.
|
||||
Otherwise, copy the kernel image to suitable directory or
|
||||
media for your system.
|
||||
|
||||
6. Reboot the kernel if necessary.
|
||||
- If you updated only the modules, you don't have to reboot
|
||||
the system. Just remove the old sound modules here.
|
||||
in
|
||||
# rmmod sound.o (linux-2.0 or OSS/Free)
|
||||
# rmmod awe_wave.o (linux-2.1)
|
||||
|
||||
7. If your AWE card is a PnP and not initialized yet, you'll have to
|
||||
do it by isapnp tools. Otherwise, skip to 8.
|
||||
|
||||
This section described only a brief explanation. For more
|
||||
details, please see the AWE64-Mini-HOWTO or isapnp tools FAQ.
|
||||
|
||||
7a. If you have no isapnp.conf file, generate it by pnpdump.
|
||||
Otherwise, skip to 7d.
|
||||
# pnpdump > /etc/isapnp.conf
|
||||
|
||||
7b. Edit isapnp.conf file. Comment out the appropriate
|
||||
lines containing desirable I/O ports, DMA and IRQs.
|
||||
Don't forget to enable (ACT Y) line.
|
||||
|
||||
7c. Add two i/o ports (0xA20 and 0xE20) in WaveTable part.
|
||||
ex)
|
||||
(CONFIGURE CTL0048/58128 (LD 2
|
||||
# ANSI string -->WaveTable<--
|
||||
(IO 0 (BASE 0x0620))
|
||||
(IO 1 (BASE 0x0A20))
|
||||
(IO 2 (BASE 0x0E20))
|
||||
(ACT Y)
|
||||
))
|
||||
|
||||
7d. Load the config file.
|
||||
CAUTION: This will reset all PnP cards!
|
||||
|
||||
# isapnp /etc/isapnp.conf
|
||||
|
||||
8. Load the sound module (if you configured it as a module):
|
||||
|
||||
for 2.0 kernel or OSS/Free monolithic module:
|
||||
|
||||
# modprobe sound.o
|
||||
|
||||
for 2.1 kernel:
|
||||
|
||||
# modprobe sound
|
||||
# insmod uart401
|
||||
# insmod sb io=0x220 irq=5 dma=1 dma16=5 mpu_io=0x330
|
||||
(These values depend on your settings.)
|
||||
# insmod awe_wave
|
||||
(Be sure to load awe_wave after sb!)
|
||||
|
||||
See Documentation/sound/oss/AWE32 for
|
||||
more details.
|
||||
|
||||
9. (only for obsolete systems) If you don't have /dev/sequencer
|
||||
device file, make it according to Readme.linux file on
|
||||
/usr/src/linux/drivers/sound. (Run a shell script included in
|
||||
that file). <-- This file no longer exists in the recent kernels!
|
||||
|
||||
10. OK, load your own soundfont file, and enjoy MIDI!
|
||||
|
||||
% sfxload synthgm.sbk
|
||||
% drvmidi foo.mid
|
||||
|
||||
11. For more advanced use (eg. dynamic loading, virtual bank and
|
||||
etc.), please read the awedrv FAQ or the instructions in awesfx
|
||||
and awemidi packages.
|
||||
|
||||
Good luck!
|
|
@ -1,56 +0,0 @@
|
|||
(This recipe has been edited to update the configuration symbols,
|
||||
and change over to modprobe.conf for 2.6)
|
||||
|
||||
From: Shaw Carruthers <shaw@shawc.demon.co.uk>
|
||||
|
||||
I have been using mad16 sound for some time now with no problems, current
|
||||
kernel 2.1.89
|
||||
|
||||
lsmod shows:
|
||||
|
||||
mad16 5176 0
|
||||
sb 22044 0 [mad16]
|
||||
uart401 5576 0 [mad16 sb]
|
||||
ad1848 14176 1 [mad16]
|
||||
sound 61928 0 [mad16 sb uart401 ad1848]
|
||||
|
||||
.config has:
|
||||
|
||||
CONFIG_SOUND=m
|
||||
CONFIG_SOUND_ADLIB=m
|
||||
CONFIG_SOUND_MAD16=m
|
||||
CONFIG_SOUND_YM3812=m
|
||||
|
||||
modprobe.conf has:
|
||||
|
||||
alias char-major-14-* mad16
|
||||
options sb mad16=1
|
||||
options mad16 io=0x530 irq=7 dma=0 dma16=1 && /usr/local/bin/aumix -w 15 -p 20 -m 0 -1 0 -2 0 -3 0 -i 0
|
||||
|
||||
|
||||
To get the built in mixer to work this needs to be:
|
||||
|
||||
options adlib_card io=0x388 # FM synthesizer
|
||||
options sb mad16=1
|
||||
options mad16 io=0x530 irq=7 dma=0 dma16=1 mpu_io=816 mpu_irq=5 && /usr/local/bin/aumix -w 15 -p 20 -m 0 -1 0 -2 0 -3 0 -i 0
|
||||
|
||||
The addition of the "mpu_io=816 mpu_irq=5" to the mad16 options line is
|
||||
|
||||
------------------------------------------------------------------------
|
||||
The mad16 module in addition supports the following options:
|
||||
|
||||
option: meaning: default:
|
||||
joystick=0,1 disabled, enabled disabled
|
||||
cdtype=0x00,0x02,0x04, disabled, Sony CDU31A, disabled
|
||||
0x06,0x08,0x0a Mitsumi, Panasonic,
|
||||
Secondary IDE, Primary IDE
|
||||
cdport=0x340,0x320, 0x340
|
||||
0x330,0x360
|
||||
cdirq=0,3,5,7,9,10,11 disabled, IRQ3, ... disabled
|
||||
cddma=0,5,6,7 disabled, DMA5, ... DMA5 for Mitsumi or IDE
|
||||
cddma=0,1,2,3 disabled, DMA1, ... DMA3 for Sony or Panasonic
|
||||
opl4=0,1 OPL3, OPL4 OPL3
|
||||
|
||||
for more details see linux/drivers/sound/mad16.c
|
||||
|
||||
Rui Sousa
|
|
@ -1,123 +0,0 @@
|
|||
An OSS/Lite Driver for the ESS Maestro family of sound cards
|
||||
|
||||
Zach Brown, December 1999
|
||||
|
||||
Driver Status and Availability
|
||||
------------------------------
|
||||
|
||||
The most recent version of this driver will hopefully always be available at
|
||||
http://www.zabbo.net/maestro/
|
||||
|
||||
I will try and maintain the most recent stable version of the driver
|
||||
in both the stable and development kernel lines.
|
||||
|
||||
ESS Maestro Chip Family
|
||||
-----------------------
|
||||
|
||||
There are 3 main variants of the ESS Maestro PCI sound chip. The first
|
||||
is the Maestro 1. It was originally produced by Platform Tech as the
|
||||
'AGOGO'. It can be recognized by Platform Tech's PCI ID 0x1285 with
|
||||
0x0100 as the device ID. It was put on some sound boards and a few laptops.
|
||||
ESS bought the design and cleaned it up as the Maestro 2. This starts
|
||||
their marking with the ESS vendor ID 0x125D and the 'year' device IDs.
|
||||
The Maestro 2 claims 0x1968 while the Maestro 2e has 0x1978.
|
||||
|
||||
The various families of Maestro are mostly identical as far as this
|
||||
driver is concerned. It doesn't touch the DSP parts that differ (though
|
||||
it could for FM synthesis).
|
||||
|
||||
Driver OSS Behavior
|
||||
--------------------
|
||||
|
||||
This OSS driver exports /dev/mixer and /dev/dsp to applications, which
|
||||
mostly adhere to the OSS spec. This driver doesn't register itself
|
||||
with /dev/sndstat, so don't expect information to appear there.
|
||||
|
||||
The /dev/dsp device exported behaves almost as expected. Playback is
|
||||
supported in all the various lovely formats. 8/16bit stereo/mono from
|
||||
8khz to 48khz, and mmap()ing for playback behaves. Capture/recording
|
||||
is limited due to oddities with the Maestro hardware. One can only
|
||||
record in 16bit stereo. For recording the maestro uses non interleaved
|
||||
stereo buffers so that mmap()ing the incoming data does not result in
|
||||
a ring buffer of LRLR data. mmap()ing of the read buffers is therefore
|
||||
disallowed until this can be cleaned up.
|
||||
|
||||
/dev/mixer is an interface to the AC'97 codec on the Maestro. It is
|
||||
worth noting that there are a variety of AC'97s that can be wired to
|
||||
the Maestro. Which is used is entirely up to the hardware implementor.
|
||||
This should only be visible to the user by the presence, or lack, of
|
||||
'Bass' and 'Treble' sliders in the mixer. Not all AC'97s have them.
|
||||
|
||||
The driver doesn't support MIDI or FM playback at the moment. Typically
|
||||
the Maestro is wired to an MPU MIDI chip, but some hardware implementations
|
||||
don't. We need to assemble a white list of hardware implementations that
|
||||
have MIDI wired properly before we can claim to support it safely.
|
||||
|
||||
Compiling and Installing
|
||||
------------------------
|
||||
|
||||
With the drivers inclusion into the kernel, compiling and installing
|
||||
is the same as most OSS/Lite modular sound drivers. Compilation
|
||||
of the driver is enabled through the CONFIG_SOUND_MAESTRO variable
|
||||
in the config system.
|
||||
|
||||
It may be modular or statically linked. If it is modular it should be
|
||||
installed with the rest of the modules for the kernel on the system.
|
||||
Typically this will be in /lib/modules/ somewhere. 'alias sound maestro'
|
||||
should also be added to your module configs (typically /etc/conf.modules)
|
||||
if you're using modular OSS/Lite sound and want to default to using a
|
||||
maestro chip.
|
||||
|
||||
As this is a PCI device, the module does not need to be informed of
|
||||
any IO or IRQ resources it should use, it devines these from the
|
||||
system. Sometimes, on sucky PCs, the BIOS fails to allocated resources
|
||||
for the maestro. This will result in a message like:
|
||||
maestro: PCI subsystem reports IRQ 0, this might not be correct.
|
||||
from the kernel. Should this happen the sound chip most likely will
|
||||
not operate correctly. To solve this one has to dig through their BIOS
|
||||
(typically entered by hitting a hot key at boot time) and figure out
|
||||
what magic needs to happen so that the BIOS will reward the maestro with
|
||||
an IRQ. This operation is incredibly system specific, so you're on your
|
||||
own. Sometimes the magic lies in 'PNP Capable Operating System' settings.
|
||||
|
||||
There are very few options to the driver. One is 'debug' which will
|
||||
tell the driver to print minimal debugging information as it runs. This
|
||||
can be collected with 'dmesg' or through the klogd daemon.
|
||||
|
||||
The other, more interesting option, is 'dsps_order'. Typically at
|
||||
install time the driver will only register one available /dev/dsp device
|
||||
for its use. The 'dsps_order' module parameter allows for more devices
|
||||
to be allocated, as a power of two. Up to 4 devices can be registered
|
||||
( dsps_order=2 ). These devices act as fully distinct units and use
|
||||
separate channels in the maestro.
|
||||
|
||||
Power Management
|
||||
----------------
|
||||
|
||||
As of version 0.14, this driver has a minimal understanding of PCI
|
||||
Power Management. If it finds a valid power management capability
|
||||
on the PCI device it will attempt to use the power management
|
||||
functions of the maestro. It will only do this on Maestro 2Es and
|
||||
only on machines that are known to function well. You can
|
||||
force the use of power management by setting the 'use_pm' module
|
||||
option to 1, or can disable it entirely by setting it to 0.
|
||||
|
||||
When using power management, the driver does a few things
|
||||
differently. It will keep the chip in a lower power mode
|
||||
when the module is inserted but /dev/dsp is not open. This
|
||||
allows the mixer to function but turns off the clocks
|
||||
on other parts of the chip. When /dev/dsp is opened the chip
|
||||
is brought into full power mode, and brought back down
|
||||
when it is closed. It also powers down the chip entirely
|
||||
when the module is removed or the machine is shutdown. This
|
||||
can have nonobvious consequences. CD audio may not work
|
||||
after a power managing driver is removed. Also, software that
|
||||
doesn't understand power management may not be able to talk
|
||||
to the powered down chip until the machine goes through a hard
|
||||
reboot to bring it back.
|
||||
|
||||
.. more details ..
|
||||
------------------
|
||||
|
||||
drivers/sound/maestro.c contains comments that hopefully explain
|
||||
the maestro implementation.
|
|
@ -1,92 +0,0 @@
|
|||
An OSS/Lite Driver for the ESS Maestro3 family of sound chips
|
||||
|
||||
Zach Brown, January 2001
|
||||
|
||||
Driver Status and Availability
|
||||
------------------------------
|
||||
|
||||
The most recent version of this driver will hopefully always be available at
|
||||
http://www.zabbo.net/maestro3/
|
||||
|
||||
I will try and maintain the most recent stable version of the driver
|
||||
in both the stable and development kernel lines.
|
||||
|
||||
Historically I've sucked pretty hard at actually doing that, however.
|
||||
|
||||
ESS Maestro3 Chip Family
|
||||
-----------------------
|
||||
|
||||
The 'Maestro3' is much like the Maestro2 chip. The noted improvement
|
||||
is the removal of the silicon in the '2' that did PCM mixing. All that
|
||||
work is now done through a custom DSP called the ASSP, the Asynchronus
|
||||
Specific Signal Processor.
|
||||
|
||||
The 'Allegro' is a baby version of the Maestro3. I'm not entirely clear
|
||||
on the extent of the differences, but the driver supports them both :)
|
||||
|
||||
The 'Allegro' shows up as PCI ID 0x1988 and the Maestro3 as 0x1998,
|
||||
both under ESS's vendor ID of 0x125D. The Maestro3 can also show up as
|
||||
0x199a when hardware strapping is used.
|
||||
|
||||
The chip can also act as a multi function device. The modem IDs follow
|
||||
the audio multimedia device IDs. (so the modem part of an Allegro shows
|
||||
up as 0x1989)
|
||||
|
||||
Driver OSS Behavior
|
||||
--------------------
|
||||
|
||||
This OSS driver exports /dev/mixer and /dev/dsp to applications, which
|
||||
mostly adhere to the OSS spec. This driver doesn't register itself
|
||||
with /dev/sndstat, so don't expect information to appear there.
|
||||
|
||||
The /dev/dsp device exported behaves as expected. Playback is
|
||||
supported in all the various lovely formats. 8/16bit stereo/mono from
|
||||
8khz to 48khz, with both read()/write(), and mmap().
|
||||
|
||||
/dev/mixer is an interface to the AC'97 codec on the Maestro3. It is
|
||||
worth noting that there are a variety of AC'97s that can be wired to
|
||||
the Maestro3. Which is used is entirely up to the hardware implementor.
|
||||
This should only be visible to the user by the presence, or lack, of
|
||||
'Bass' and 'Treble' sliders in the mixer. Not all AC'97s have them.
|
||||
The Allegro has an onchip AC'97.
|
||||
|
||||
The driver doesn't support MIDI or FM playback at the moment.
|
||||
|
||||
Compiling and Installing
|
||||
------------------------
|
||||
|
||||
With the drivers inclusion into the kernel, compiling and installing
|
||||
is the same as most OSS/Lite modular sound drivers. Compilation
|
||||
of the driver is enabled through the CONFIG_SOUND_MAESTRO3 variable
|
||||
in the config system.
|
||||
|
||||
It may be modular or statically linked. If it is modular it should be
|
||||
installed with the rest of the modules for the kernel on the system.
|
||||
Typically this will be in /lib/modules/ somewhere. 'alias sound-slot-0
|
||||
maestro3' should also be added to your module configs (typically
|
||||
/etc/modprobe.conf) if you're using modular OSS/Lite sound and want to
|
||||
default to using a maestro3 chip.
|
||||
|
||||
There are very few options to the driver. One is 'debug' which will
|
||||
tell the driver to print minimal debugging information as it runs. This
|
||||
can be collected with 'dmesg' or through the klogd daemon.
|
||||
|
||||
One is 'external_amp', which tells the driver to attempt to enable
|
||||
an external amplifier. This defaults to '1', you can tell the driver
|
||||
not to bother enabling such an amplifier by setting it to '0'.
|
||||
|
||||
And the last is 'gpio_pin', which tells the driver which GPIO pin number
|
||||
the external amp uses (0-15), The Allegro uses 8 by default, all others 1.
|
||||
If everything loads correctly and seems to be working but you get no sound,
|
||||
try tweaking this value.
|
||||
|
||||
Systems known to need a different value
|
||||
Panasonic ToughBook CF-72: gpio_pin=13
|
||||
|
||||
Power Management
|
||||
----------------
|
||||
|
||||
This driver has a minimal understanding of PCI Power Management. It will
|
||||
try and power down the chip when the system is suspended, and power
|
||||
it up with it is resumed. It will also try and power down the chip
|
||||
when the machine is shut down.
|
|
@ -1,42 +0,0 @@
|
|||
Linux 2.4 Sound Changes
|
||||
2000-September-25
|
||||
Christoph Hellwig, <hch@infradead.org>
|
||||
|
||||
|
||||
|
||||
=== isapnp support
|
||||
|
||||
The Linux 2.4 Kernel does have reliable in-kernel isapnp support.
|
||||
Some drivers (sb.o, ad1816.o awe_wave.o) do now support automatically
|
||||
detecting and configuring isapnp devices.
|
||||
If you have a not yet supported isapnp soundcard, mail me the content
|
||||
of '/proc/isapnp' on your system and some information about your card
|
||||
and its driver(s) so I can try to get isapnp working for it.
|
||||
|
||||
|
||||
|
||||
=== soundcard resources on kernel commandline
|
||||
|
||||
Before Linux 2.4 you had to specify the resources for sounddrivers
|
||||
statically linked into the kernel at compile time
|
||||
(in make config/menuconfig/xconfig). In Linux 2.4 the resources are
|
||||
now specified at the boot-time kernel commandline (e.g. the lilo
|
||||
'append=' line or everything that's after the kernel name in grub).
|
||||
Read the Configure.help entry for your card for the parameters.
|
||||
|
||||
|
||||
=== softoss is gone
|
||||
|
||||
In Linux 2.4 the softoss in-kernel software synthesizer is no more aviable.
|
||||
Use a user space software synthesizer like timidity instead.
|
||||
|
||||
|
||||
|
||||
=== /dev/sndstat and /proc/sound are gone
|
||||
|
||||
In older Linux versions those files exported some information about the
|
||||
OSS/Free configuration to userspace. In Linux 2.3 they were removed because
|
||||
they did not support the growing number of pci soundcards and there were
|
||||
some general problems with this interface.
|
||||
|
||||
|
|
@ -1,52 +0,0 @@
|
|||
OPL3-SA1 sound driver (opl3sa.o)
|
||||
|
||||
---
|
||||
Note: This howto only describes how to setup the OPL3-SA1 chip; this info
|
||||
does not apply to the SA2, SA3, or SA4.
|
||||
---
|
||||
|
||||
The Yamaha OPL3-SA1 sound chip is usually found built into motherboards, and
|
||||
it's a decent little chip offering a WSS mode, a SB Pro emulation mode, MPU401
|
||||
and OPL3 FM Synth capabilities.
|
||||
|
||||
You can enable inclusion of the driver via CONFIG_SOUND_OPL3SA1=m, or
|
||||
CONFIG_SOUND_OPL3SA1=y through 'make config/xconfig/menuconfig'.
|
||||
|
||||
You'll need to know all of the relevant info (irq, dma, and io port) for the
|
||||
chip's WSS mode, since that is the mode the kernel sound driver uses, and of
|
||||
course you'll also need to know about where the MPU401 and OPL3 ports and
|
||||
IRQs are if you want to use those.
|
||||
|
||||
Here's the skinny on how to load it as a module:
|
||||
|
||||
modprobe opl3sa io=0x530 irq=11 dma=0 dma2=1 mpu_io=0x330 mpu_irq=5
|
||||
|
||||
Module options in detail:
|
||||
|
||||
io: This is the WSS's port base.
|
||||
irq: This is the WSS's IRQ.
|
||||
dma: This is the WSS's DMA line. In my BIOS setup screen this was
|
||||
listed as "WSS Play DMA"
|
||||
dma2: This is the WSS's secondary DMA line. My BIOS calls it the
|
||||
"WSS capture DMA"
|
||||
|
||||
mpu_io: This is the MPU401's port base.
|
||||
mpu_irq: This is the MPU401's IRQ.
|
||||
|
||||
If you'd like to use the OPL3 FM Synthesizer, make sure you enable
|
||||
CONFIG_SOUND_YM3812 (in 'make config'). That'll build the opl3.o module.
|
||||
|
||||
Then a simple 'insmod opl3 io=0x388', and you now have FM Synth.
|
||||
|
||||
You can also use the SoftOSS software synthesizer instead of the builtin OPL3.
|
||||
Here's how:
|
||||
|
||||
Say 'y' or 'm' to "SoftOSS software wave table engine" in make config.
|
||||
|
||||
If you said yes, the software synth is available once you boot your new
|
||||
kernel.
|
||||
|
||||
If you chose to build it as a module, just insmod the resulting softoss2.o
|
||||
|
||||
Questions? Comments?
|
||||
<stiker@northlink.com>
|
|
@ -1,218 +0,0 @@
|
|||
================================================================
|
||||
AWE32 Sound Driver for Linux / FreeBSD
|
||||
version 0.4.3; Nov. 1, 1998
|
||||
|
||||
Takashi Iwai <iwai@ww.uni-erlangen.de>
|
||||
================================================================
|
||||
|
||||
* GENERAL NOTES
|
||||
|
||||
This is a sound driver extension for SoundBlaster AWE32 and other
|
||||
compatible cards (AWE32-PnP, SB32, SB32-PnP, AWE64 & etc) to enable
|
||||
the wave synth operations. The driver is provided for Linux 1.2.x
|
||||
and 2.[012].x kernels, as well as FreeBSD, on Intel x86 and DEC
|
||||
Alpha systems.
|
||||
|
||||
This driver was written by Takashi Iwai <iwai@ww.uni-erlangen.de>,
|
||||
and provided "as is". The original source (awedrv-0.4.3.tar.gz) and
|
||||
binary packages are available on the following URL:
|
||||
http://bahamut.mm.t.u-tokyo.ac.jp/~iwai/awedrv/
|
||||
Note that since the author is apart from this web site, the update is
|
||||
not frequent now.
|
||||
|
||||
|
||||
* NOTE TO LINUX USERS
|
||||
|
||||
To enable this driver on linux-2.[01].x kernels, you need turn on
|
||||
"AWE32 synth" options in sound menu when configure your linux kernel
|
||||
and modules. The precise installation procedure is described in the
|
||||
AWE64-Mini-HOWTO and linux-kernel/Documetation/sound/AWE32.
|
||||
|
||||
If you're using PnP cards, the card must be initialized before loading
|
||||
the sound driver. There're several options to do this:
|
||||
- Initialize the card via ISA PnP tools, and load the sound module.
|
||||
- Initialize the card on DOS, and load linux by loadlin.exe
|
||||
- Use PnP kernel driver (for Linux-2.x.x)
|
||||
The detailed instruction for the solution using isapnp tools is found
|
||||
in many documents like above. A brief instruction is also included in
|
||||
the installation document of this package.
|
||||
For PnP driver project, please refer to the following URL:
|
||||
http://www-jcr.lmh.ox.ac.uk/~pnp/
|
||||
|
||||
|
||||
* USING THE DRIVER
|
||||
|
||||
The awedrv has several different playing modes to realize easy channel
|
||||
allocation for MIDI songs. To hear the exact sound quality, you need
|
||||
to obtain the extended sequencer program, drvmidi or playmidi-2.5.
|
||||
|
||||
For playing MIDI files, you *MUST* load the soundfont file on the
|
||||
driver previously by sfxload utility. Otherwise you'll here no sounds
|
||||
at all! All the utilities and driver source packages are found in the
|
||||
above URL. The sfxload program is included in the package
|
||||
awesfx-0.4.3.tgz. Binary packages are available there, too. See the
|
||||
instruction in each package for installation.
|
||||
|
||||
Loading a soundfont file is very simple. Just execute the command
|
||||
|
||||
% sfxload synthgm.sbk
|
||||
|
||||
Then, sfxload transfers the file "synthgm.sbk" to the driver.
|
||||
Both SF1 and SF2 formats are accepted.
|
||||
|
||||
Now you can hear midi musics by a midi player.
|
||||
|
||||
% drvmidi foo.mid
|
||||
|
||||
If you run MIDI player after MOD player, you need to load soundfont
|
||||
files again, since MOD player programs clear the previous loaded
|
||||
samples by their own data.
|
||||
|
||||
If you have only 512kb on the sound card, I recommend to use dynamic
|
||||
sample loading via -L option of drvmidi. 2MB GM/GS soundfont file is
|
||||
available in most midi files.
|
||||
|
||||
% sfxload synthgm
|
||||
% drvmidi -L 2mbgmgs foo.mid
|
||||
|
||||
This makes a big difference (believe me)! For more details, please
|
||||
refer to the FAQ list which is available on the URL above.
|
||||
|
||||
The current chorus, reverb and equalizer status can be changed by
|
||||
aweset utility program (included in awesfx package). Note that
|
||||
some awedrv-native programs (like drvmidi and xmp) will change the
|
||||
current settings by themselves. The aweset program is effective
|
||||
only for other programs like playmidi.
|
||||
|
||||
Enjoy.
|
||||
|
||||
|
||||
* COMPILE FLAGS
|
||||
|
||||
Compile conditions are defined in awe_config.h.
|
||||
|
||||
[Compatibility Conditions]
|
||||
The following flags are defined automatically when using installation
|
||||
shell script.
|
||||
|
||||
- AWE_MODULE_SUPPORT
|
||||
indicates your Linux kernel supports module for each sound card
|
||||
(in recent 2.1 or 2.2 kernels and unofficial patched 2.0 kernels
|
||||
as distributed in the RH5.0 package).
|
||||
This flag is automatically set when you're using 2.1.x kernels.
|
||||
You can pass the base address and memory size via the following
|
||||
module options,
|
||||
io = base I/O port address (eg. 0x620)
|
||||
memsize = DRAM size in kilobytes (eg. 512)
|
||||
As default, AWE driver probes these values automatically.
|
||||
|
||||
|
||||
[Hardware Conditions]
|
||||
You DON'T have to define the following two values.
|
||||
Define them only when the driver couldn't detect the card properly.
|
||||
|
||||
- AWE_DEFAULT_BASE_ADDR (default: not defined)
|
||||
specifies the base port address of your AWE32 card.
|
||||
0 means to autodetect the address.
|
||||
|
||||
- AWE_DEFAULT_MEM_SIZE (default: not defined)
|
||||
specifies the memory size of your AWE32 card in kilobytes.
|
||||
-1 means to autodetect its size.
|
||||
|
||||
|
||||
[Sample Table Size]
|
||||
From ver.0.4.0, sample tables are allocated dynamically (except
|
||||
Linux-1.2.x system), so you need NOT to touch these parameters.
|
||||
Linux-1.2.x users may need to increase these values to appropriate size
|
||||
if the sound card is equipped with more DRAM.
|
||||
|
||||
- AWE_MAX_SF_LISTS, AWE_MAX_SAMPLES, AWE_MAX_INFOS
|
||||
|
||||
|
||||
[Other Conditions]
|
||||
|
||||
- AWE_ALWAYS_INIT_FM (default: not defined)
|
||||
indicates the AWE driver always initialize FM passthrough even
|
||||
without DRAM on board. Emu8000 chip has a restriction for playing
|
||||
samples on DRAM that at least two channels must be occupied as
|
||||
passthrough channels.
|
||||
|
||||
- AWE_DEBUG_ON (default: defined)
|
||||
turns on debugging messages if defined.
|
||||
|
||||
- AWE_HAS_GUS_COMPATIBILITY (default: defined)
|
||||
Enables GUS compatibility mode if defined, reading GUS patches and
|
||||
GUS control commands. Define this option to use GMOD or other
|
||||
GUS module players.
|
||||
|
||||
- CONFIG_AWE32_MIDIEMU (default: defined)
|
||||
Adds a MIDI emulation device by Emu8000 wavetable. The emulation
|
||||
device can be accessed as an external MIDI, and sends the MIDI
|
||||
control codes directly. XG and GS sysex/NRPN are accepted.
|
||||
No MIDI input is supported.
|
||||
|
||||
- CONFIG_AWE32_MIXER (default: not defined)
|
||||
Adds a mixer device for AWE32 bass/treble equalizer control.
|
||||
You can access this device using /dev/mixer?? (usually mixer01).
|
||||
|
||||
- AWE_USE_NEW_VOLUME_CALC (default: defined)
|
||||
Use the new method to calculate the volume change as compatible
|
||||
with DOS/Win drivers. This option can be toggled via aweset
|
||||
program, or drvmidi player.
|
||||
|
||||
- AWE_CHECK_VTARGET (default: defined)
|
||||
Check the current volume target value when searching for an
|
||||
empty channel to allocate a new voice. This is experimentally
|
||||
implemented in this version. (probably, this option doesn't
|
||||
affect the sound quality severely...)
|
||||
|
||||
- AWE_ALLOW_SAMPLE_SHARING (default: defined)
|
||||
Allow sample sharing for differently loaded patches.
|
||||
This function is available only together with awesfx-0.4.3p3.
|
||||
Note that this is still an experimental option.
|
||||
|
||||
- DEF_FM_CHORUS_DEPTH (default: 0x10)
|
||||
The default strength to be sent to the chorus effect engine.
|
||||
From 0 to 0xff. Larger numbers may often cause weird sounds.
|
||||
|
||||
- DEF_FM_REVERB_DEPTH (default: 0x10)
|
||||
The default strength to be sent to the reverb effect engine.
|
||||
From 0 to 0xff. Larger numbers may often cause weird sounds.
|
||||
|
||||
|
||||
* ACKNOWLEDGMENTS
|
||||
|
||||
Thanks to Witold Jachimczyk (witek@xfactor.wpi.edu) for much advice
|
||||
on programming of AWE32. Much code is brought from his AWE32-native
|
||||
MOD player, ALMP.
|
||||
The port of awedrv to FreeBSD is done by Randall Hopper
|
||||
(rhh@ct.picker.com).
|
||||
The new volume calculation routine was derived from Mark Weaver's
|
||||
ADIP compatible routines.
|
||||
I also thank linux-awe-ml members for their efforts
|
||||
to reboot their system many times :-)
|
||||
|
||||
|
||||
* TODO'S
|
||||
|
||||
- Complete DOS/Win compatibility
|
||||
- DSP-like output
|
||||
|
||||
|
||||
* COPYRIGHT
|
||||
|
||||
Copyright (C) 1996-1998 Takashi Iwai
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
@ -1,339 +0,0 @@
|
|||
An OSS/Free Driver for WaveFront soundcards
|
||||
(Turtle Beach Maui, Tropez, Tropez Plus)
|
||||
|
||||
Paul Barton-Davis, July 1998
|
||||
|
||||
VERSION 0.2.5
|
||||
|
||||
Driver Status
|
||||
-------------
|
||||
|
||||
Requires: Kernel 2.1.106 or later (the driver is included with kernels
|
||||
2.1.109 and above)
|
||||
|
||||
As of 7/22/1998, this driver is currently in *BETA* state. This means
|
||||
that it compiles and runs, and that I use it on my system (Linux
|
||||
2.1.106) with some reasonably demanding applications and uses. I
|
||||
believe the code is approaching an initial "finished" state that
|
||||
provides bug-free support for the Tropez Plus.
|
||||
|
||||
Please note that to date, the driver has ONLY been tested on a Tropez
|
||||
Plus. I would very much like to hear (and help out) people with Tropez
|
||||
and Maui cards, since I think the driver can support those cards as
|
||||
well.
|
||||
|
||||
Finally, the driver has not been tested (or even compiled) as a static
|
||||
(non-modular) part of the kernel. Alan Cox's good work in modularizing
|
||||
OSS/Free for Linux makes this rather unnecessary.
|
||||
|
||||
Some Questions
|
||||
--------------
|
||||
|
||||
**********************************************************************
|
||||
0) What does this driver do that the maui driver did not ?
|
||||
**********************************************************************
|
||||
|
||||
* can fully initialize a WaveFront card from cold boot - no DOS
|
||||
utilities needed
|
||||
* working patch/sample/program loading and unloading (the maui
|
||||
driver didn't document how to make this work, and assumed
|
||||
user-level preparation of the patch data for writing
|
||||
to the board. ick.)
|
||||
* full user-level access to all WaveFront commands
|
||||
* for the Tropez Plus, (primitive) control of the YSS225 FX processor
|
||||
* Virtual MIDI mode supported - 2 MIDI devices accessible via the
|
||||
WaveFront's MPU401/UART emulation. One
|
||||
accesses the WaveFront synth, the other accesses the
|
||||
external MIDI connector. Full MIDI read/write semantics
|
||||
for both devices.
|
||||
* OSS-compliant /dev/sequencer interface for the WaveFront synth,
|
||||
including native and GUS-format patch downloading.
|
||||
* semi-intelligent patch management (prototypical at this point)
|
||||
|
||||
**********************************************************************
|
||||
1) What to do about MIDI interfaces ?
|
||||
**********************************************************************
|
||||
|
||||
The Tropez Plus (and perhaps other WF cards) can in theory support up
|
||||
to 2 physical MIDI interfaces. One of these is connected to the
|
||||
ICS2115 chip (the WaveFront synth itself) and is controlled by
|
||||
MPU/UART-401 emulation code running as part of the WaveFront OS. The
|
||||
other is controlled by the CS4232 chip present on the board. However,
|
||||
physical access to the CS4232 connector is difficult, and it is
|
||||
unlikely (though not impossible) that you will want to use it.
|
||||
|
||||
An older version of this driver introduced an additional kernel config
|
||||
variable which controlled whether or not the CS4232 MIDI interface was
|
||||
configured. Because of Alan Cox's work on modularizing the sound
|
||||
drivers, and now backporting them to 2.0.34 kernels, there seems to be
|
||||
little reason to support "static" configuration variables, and so this
|
||||
has been abandoned in favor of *only* module parameters. Specifying
|
||||
"mpuio" and "mpuirq" for the cs4232 parameter will result in the
|
||||
CS4232 MIDI interface being configured; leaving them unspecified will
|
||||
leave it unconfigured (and thus unusable).
|
||||
|
||||
BTW, I have heard from one Tropez+ user that the CS4232 interface is
|
||||
more reliable than the ICS2115 one. I have had no problems with the
|
||||
latter, and I don't have the right cable to test the former one
|
||||
out. Reports welcome.
|
||||
|
||||
**********************************************************************
|
||||
2) Why does line XXX of the code look like this .... ?
|
||||
**********************************************************************
|
||||
|
||||
Either because it's not finished yet, or because you're a better coder
|
||||
than I am, or because you don't understand some aspect of how the card
|
||||
or the code works.
|
||||
|
||||
I absolutely welcome comments, criticisms and suggestions about the
|
||||
design and implementation of the driver.
|
||||
|
||||
**********************************************************************
|
||||
3) What files are included ?
|
||||
**********************************************************************
|
||||
|
||||
drivers/sound/README.wavefront -- this file
|
||||
|
||||
drivers/sound/wavefront.patch -- patches for the 2.1.106 sound drivers
|
||||
needed to make the rest of this work
|
||||
DO NOT USE IF YOU'VE APPLIED THEM
|
||||
BEFORE, OR HAVE 2.1.109 OR ABOVE
|
||||
|
||||
drivers/sound/wavfront.c -- the driver
|
||||
drivers/sound/ys225.h -- data declarations for FX config
|
||||
drivers/sound/ys225.c -- data definitions for FX config
|
||||
drivers/sound/wf_midi.c -- the "uart401" driver
|
||||
to support virtual MIDI mode.
|
||||
include/wavefront.h -- the header file
|
||||
Documentation/sound/oss/Tropez+ -- short docs on configuration
|
||||
|
||||
**********************************************************************
|
||||
4) How do I compile/install/use it ?
|
||||
**********************************************************************
|
||||
|
||||
PART ONE: install the source code into your sound driver directory
|
||||
|
||||
cd <top-of-your-2.1.106-code-base-e.g.-/usr/src/linux>
|
||||
tar -zxvf <where-you-put/wavefront.tar.gz>
|
||||
|
||||
PART TWO: apply the patches
|
||||
|
||||
DO THIS ONLY IF YOU HAVE A KERNEL VERSION BELOW 2.1.109
|
||||
AND HAVE NOT ALREADY INSTALLED THE PATCH(ES).
|
||||
|
||||
cd drivers/sound
|
||||
patch < wavefront.patch
|
||||
|
||||
PART THREE: configure your kernel
|
||||
|
||||
cd <top of your kernel tree>
|
||||
make xconfig (or whichever config option you use)
|
||||
|
||||
- choose YES for Sound Support
|
||||
- choose MODULE (M) for OSS Sound Modules
|
||||
- choose MODULE(M) to YM3812/OPL3 support
|
||||
- choose MODULE(M) for WaveFront support
|
||||
- choose MODULE(M) for CS4232 support
|
||||
|
||||
- choose "N" for everything else (unless you have other
|
||||
soundcards you want support for)
|
||||
|
||||
|
||||
make boot
|
||||
.
|
||||
.
|
||||
.
|
||||
<whatever you normally do for a kernel install>
|
||||
make modules
|
||||
.
|
||||
.
|
||||
.
|
||||
make modules_install
|
||||
|
||||
Here's my autoconf.h SOUND section:
|
||||
|
||||
/*
|
||||
* Sound
|
||||
*/
|
||||
#define CONFIG_SOUND 1
|
||||
#undef CONFIG_SOUND_OSS
|
||||
#define CONFIG_SOUND_OSS_MODULE 1
|
||||
#undef CONFIG_SOUND_PAS
|
||||
#undef CONFIG_SOUND_SB
|
||||
#undef CONFIG_SOUND_ADLIB
|
||||
#undef CONFIG_SOUND_GUS
|
||||
#undef CONFIG_SOUND_MPU401
|
||||
#undef CONFIG_SOUND_PSS
|
||||
#undef CONFIG_SOUND_MSS
|
||||
#undef CONFIG_SOUND_SSCAPE
|
||||
#undef CONFIG_SOUND_TRIX
|
||||
#undef CONFIG_SOUND_MAD16
|
||||
#undef CONFIG_SOUND_WAVEFRONT
|
||||
#define CONFIG_SOUND_WAVEFRONT_MODULE 1
|
||||
#undef CONFIG_SOUND_CS4232
|
||||
#define CONFIG_SOUND_CS4232_MODULE 1
|
||||
#undef CONFIG_SOUND_MAUI
|
||||
#undef CONFIG_SOUND_SGALAXY
|
||||
#undef CONFIG_SOUND_OPL3SA1
|
||||
#undef CONFIG_SOUND_SOFTOSS
|
||||
#undef CONFIG_SOUND_YM3812
|
||||
#define CONFIG_SOUND_YM3812_MODULE 1
|
||||
#undef CONFIG_SOUND_VMIDI
|
||||
#undef CONFIG_SOUND_UART6850
|
||||
/*
|
||||
* Additional low level sound drivers
|
||||
*/
|
||||
#undef CONFIG_LOWLEVEL_SOUND
|
||||
|
||||
************************************************************
|
||||
6) How do I configure my card ?
|
||||
************************************************************
|
||||
|
||||
You need to edit /etc/modprobe.conf. Here's mine (edited to show the
|
||||
relevant details):
|
||||
|
||||
# Sound system
|
||||
alias char-major-14-* wavefront
|
||||
alias synth0 wavefront
|
||||
alias mixer0 cs4232
|
||||
alias audio0 cs4232
|
||||
install wavefront /sbin/modprobe cs4232 && /sbin/modprobe -i wavefront && /sbin/modprobe opl3
|
||||
options wavefront io=0x200 irq=9
|
||||
options cs4232 synthirq=9 synthio=0x200 io=0x530 irq=5 dma=1 dma2=0
|
||||
options opl3 io=0x388
|
||||
|
||||
Things to note:
|
||||
|
||||
the wavefront options "io" and "irq" ***MUST*** match the "synthio"
|
||||
and "synthirq" cs4232 options.
|
||||
|
||||
you can do without the opl3 module if you don't
|
||||
want to use the OPL/[34] FM synth on the soundcard
|
||||
|
||||
the opl3 io parameter is conventionally not adjustable.
|
||||
In theory, any not-in-use IO port address would work, but
|
||||
just use 0x388 and stick with the crowd.
|
||||
|
||||
**********************************************************************
|
||||
7) What about firmware ?
|
||||
**********************************************************************
|
||||
|
||||
Turtle Beach have not given me permission to distribute their firmware
|
||||
for the ICS2115. However, if you have a WaveFront card, then you
|
||||
almost certainly have the firmware, and if not, its freely available
|
||||
on their website, at:
|
||||
|
||||
http://www.tbeach.com/tbs/downloads/scardsdown.htm#tropezplus
|
||||
|
||||
The file is called WFOS2001.MOT (for the Tropez+).
|
||||
|
||||
This driver, however, doesn't use the pure firmware as distributed,
|
||||
but instead relies on a somewhat processed form of it. You can
|
||||
generate this very easily. Following an idea from Andrew Veliath's
|
||||
Pinnacle driver, the following flex program will generate the
|
||||
processed version:
|
||||
|
||||
---- cut here -------------------------
|
||||
%option main
|
||||
%%
|
||||
^S[28].*\r$ printf ("%c%.*s", yyleng-1,yyleng-1,yytext);
|
||||
<<EOF>> { fputc ('\0', stdout); return; }
|
||||
\n {}
|
||||
. {}
|
||||
---- cut here -------------------------
|
||||
|
||||
To use it, put the above in file (say, ws.l) compile it like this:
|
||||
|
||||
shell> flex -ows.c ws.l
|
||||
shell> cc -o ws ws.c
|
||||
|
||||
and then use it like this:
|
||||
|
||||
ws < my-copy-of-the-oswf.mot-file > /etc/sound/wavefront.os
|
||||
|
||||
If you put it somewhere else, you'll always have to use the wf_ospath
|
||||
module parameter (see below) or alter the source code.
|
||||
|
||||
**********************************************************************
|
||||
7) How do I get it working ?
|
||||
**********************************************************************
|
||||
|
||||
Optionally, you can reboot with the "new" kernel (even though the only
|
||||
changes have really been made to a module).
|
||||
|
||||
Then, as root do:
|
||||
|
||||
modprobe wavefront
|
||||
|
||||
You should get something like this in /var/log/messages:
|
||||
|
||||
WaveFront: firmware 1.20 already loaded.
|
||||
|
||||
or
|
||||
|
||||
WaveFront: no response to firmware probe, assume raw.
|
||||
|
||||
then:
|
||||
|
||||
WaveFront: waiting for memory configuration ...
|
||||
WaveFront: hardware version 1.64
|
||||
WaveFront: available DRAM 8191k
|
||||
WaveFront: 332 samples used (266 real, 13 aliases, 53 multi), 180 empty
|
||||
WaveFront: 128 programs slots in use
|
||||
WaveFront: 256 patch slots filled, 142 in use
|
||||
|
||||
The whole process takes about 16 seconds, the longest waits being
|
||||
after reporting the hardware version (during the firmware download),
|
||||
and after reporting program status (during patch status inquiry). Its
|
||||
shorter (about 10 secs) if the firmware is already loaded (i.e. only
|
||||
warm reboots since the last firmware load).
|
||||
|
||||
The "available DRAM" line will vary depending on how much added RAM
|
||||
your card has. Mine has 8MB.
|
||||
|
||||
To check basically functionality, use play(1) or splay(1) to send a
|
||||
.WAV or other audio file through the audio portion. Then use playmidi
|
||||
to play a General MIDI file. Try the "-D 0" to hear the
|
||||
difference between sending MIDI to the WaveFront and using the OPL/3,
|
||||
which is the default (I think ...). If you have an external synth(s)
|
||||
hooked to the soundcard, you can use "-e" to route to the
|
||||
external synth(s) (in theory, -D 1 should work as well, but I think
|
||||
there is a bug in playmidi which prevents this from doing what it
|
||||
should).
|
||||
|
||||
**********************************************************************
|
||||
8) What are the module parameters ?
|
||||
**********************************************************************
|
||||
|
||||
Its best to read wavefront.c for this, but here is a summary:
|
||||
|
||||
integers:
|
||||
wf_raw - if set, ignore apparent presence of firmware
|
||||
loaded onto the ICS2115, reset the whole
|
||||
board, and initialize it from scratch. (default = 0)
|
||||
|
||||
fx_raw - if set, always initialize the YSS225 processor
|
||||
on the Tropez plus. (default = 1)
|
||||
|
||||
< The next 4 are basically for kernel hackers to allow
|
||||
tweaking the driver for testing purposes. >
|
||||
|
||||
wait_usecs - loop timer used when waiting for
|
||||
status conditions on the board.
|
||||
The default is 150.
|
||||
|
||||
debug_default - debugging flags. See sound/wavefront.h
|
||||
for WF_DEBUG_* values. Default is zero.
|
||||
Setting this allows you to debug the
|
||||
driver during module installation.
|
||||
strings:
|
||||
ospath - path to get to the pre-processed OS firmware.
|
||||
(default: /etc/sound/wavefront.os)
|
||||
|
||||
**********************************************************************
|
||||
9) Who should I contact if I have problems?
|
||||
**********************************************************************
|
||||
|
||||
Just me: Paul Barton-Davis <pbd@op.net>
|
||||
|
||||
|
|
@ -1,70 +0,0 @@
|
|||
/proc/sound, /dev/sndstat
|
||||
-------------------------
|
||||
|
||||
/proc/sound and /dev/sndstat is not supported by the
|
||||
driver. To find out whether the driver succeeded loading,
|
||||
check the kernel log (dmesg).
|
||||
|
||||
|
||||
ALaw/uLaw sample formats
|
||||
------------------------
|
||||
|
||||
This driver does not support the ALaw/uLaw sample formats.
|
||||
ALaw is the default mode when opening a sound device
|
||||
using OSS/Free. The reason for the lack of support is
|
||||
that the hardware does not support these formats, and adding
|
||||
conversion routines to the kernel would lead to very ugly
|
||||
code in the presence of the mmap interface to the driver.
|
||||
And since xquake uses mmap, mmap is considered important :-)
|
||||
and no sane application uses ALaw/uLaw these days anyway.
|
||||
In short, playing a Sun .au file as follows:
|
||||
|
||||
cat my_file.au > /dev/dsp
|
||||
|
||||
does not work. Instead, you may use the play script from
|
||||
Chris Bagwell's sox-12.14 package (available from the URL
|
||||
below) to play many different audio file formats.
|
||||
The script automatically determines the audio format
|
||||
and does do audio conversions if necessary.
|
||||
http://home.sprynet.com/sprynet/cbagwell/projects.html
|
||||
|
||||
|
||||
Blocking vs. nonblocking IO
|
||||
---------------------------
|
||||
|
||||
Unlike OSS/Free this driver honours the O_NONBLOCK file flag
|
||||
not only during open, but also during read and write.
|
||||
This is an effort to make the sound driver interface more
|
||||
regular. Timidity has problems with this; a patch
|
||||
is available from http://www.ife.ee.ethz.ch/~sailer/linux/pciaudio.html.
|
||||
(Timidity patched will also run on OSS/Free).
|
||||
|
||||
|
||||
MIDI UART
|
||||
---------
|
||||
|
||||
The driver supports a simple MIDI UART interface, with
|
||||
no ioctl's supported.
|
||||
|
||||
|
||||
MIDI synthesizer
|
||||
----------------
|
||||
|
||||
This soundcard does not have any hardware MIDI synthesizer;
|
||||
MIDI synthesis has to be done in software. To allow this
|
||||
the driver/soundcard supports two PCM (/dev/dsp) interfaces.
|
||||
The second one goes to the mixer "synth" setting and supports
|
||||
only a limited set of sampling rates (44100, 22050, 11025, 5512).
|
||||
By setting lineout to 1 on the driver command line
|
||||
(eg. insmod es1370 lineout=1) it is even possible on some
|
||||
cards to convert the LINEIN jack into a second LINEOUT jack, thus
|
||||
making it possible to output four independent audio channels!
|
||||
|
||||
There is a freely available software package that allows
|
||||
MIDI file playback on this soundcard called Timidity.
|
||||
See http://www.cgs.fi/~tt/timidity/.
|
||||
|
||||
|
||||
|
||||
Thomas Sailer
|
||||
t.sailer@alumni.ethz.ch
|
|
@ -1,767 +0,0 @@
|
|||
Beta release of the rme96xx (driver for RME 96XX cards like the
|
||||
"Hammerfall" and the "Hammerfall light")
|
||||
|
||||
Important: The driver module has to be installed on a freshly rebooted system,
|
||||
otherwise the driver might not be able to acquire its buffers.
|
||||
|
||||
features:
|
||||
|
||||
- OSS programming interface (i.e. runs with standard OSS soundsoftware)
|
||||
- OSS/Multichannel interface (OSS multichannel is done by just aquiring
|
||||
more than 2 channels). The driver does not use more than one device
|
||||
( yet .. this feature may be implemented later )
|
||||
- more than one RME card supported
|
||||
|
||||
The driver uses a specific multichannel interface, which I will document
|
||||
when the driver gets stable. (take a look at the defines in rme96xx.h,
|
||||
which adds blocked multichannel formats i.e instead of
|
||||
lrlrlrlr --> llllrrrr etc.
|
||||
|
||||
Use the "rmectrl" programm to look at the status of the card ..
|
||||
or use xrmectrl, a GUI interface for the ctrl program.
|
||||
|
||||
What you can do with the rmectrl program is to set the stereo device for
|
||||
OSS emulation (e.g. if you use SPDIF out).
|
||||
|
||||
You do:
|
||||
|
||||
./ctrl offset 24 24
|
||||
|
||||
which makes the stereo device use channels 25 and 26.
|
||||
|
||||
Guenter Geiger <geiger@epy.co.at>
|
||||
|
||||
copy the first part of the attached source code into rmectrl.c
|
||||
and the second part into xrmectrl (or get the program from
|
||||
http://gige.xdv.org/pages/soft/pages/rme)
|
||||
|
||||
to compile: gcc -o rmectrl rmectrl.c
|
||||
------------------------------ snip ------------------------------------
|
||||
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <fcntl.h>
|
||||
#include <linux/soundcard.h>
|
||||
#include <math.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include "rme96xx.h"
|
||||
|
||||
/*
|
||||
remctrl.c
|
||||
(C) 2000 Guenter Geiger <geiger@debian.org>
|
||||
HP20020201 - Heiko Purnhagen <purnhage@tnt.uni-hannover.de>
|
||||
*/
|
||||
|
||||
/* # define DEVICE_NAME "/dev/mixer" */
|
||||
# define DEVICE_NAME "/dev/mixer1"
|
||||
|
||||
|
||||
void usage(void)
|
||||
{
|
||||
fprintf(stderr,"usage: rmectrl [/dev/mixer<n>] [command [options]]\n\n");
|
||||
fprintf(stderr,"where command is one of:\n");
|
||||
fprintf(stderr," help show this help\n");
|
||||
fprintf(stderr," status show status bits\n");
|
||||
fprintf(stderr," control show control bits\n");
|
||||
fprintf(stderr," mix show mixer/offset status\n");
|
||||
fprintf(stderr," master <n> set sync master\n");
|
||||
fprintf(stderr," pro <n> set spdif out pro\n");
|
||||
fprintf(stderr," emphasis <n> set spdif out emphasis\n");
|
||||
fprintf(stderr," dolby <n> set spdif out no audio\n");
|
||||
fprintf(stderr," optout <n> set spdif out optical\n");
|
||||
fprintf(stderr," wordclock <n> set sync wordclock\n");
|
||||
fprintf(stderr," spdifin <n> set spdif in (0=optical,1=coax,2=intern)\n");
|
||||
fprintf(stderr," syncref <n> set sync source (0=ADAT1,1=ADAT2,2=ADAT3,3=SPDIF)\n");
|
||||
fprintf(stderr," adat1cd <n> set ADAT1 on internal CD\n");
|
||||
fprintf(stderr," offset <devnr> <in> <out> set dev (0..3) offset (0..25)\n");
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
int cards;
|
||||
int ret;
|
||||
int i;
|
||||
double ft;
|
||||
int fd, fdwr;
|
||||
int param,orig;
|
||||
rme_status_t stat;
|
||||
rme_ctrl_t ctrl;
|
||||
char *device;
|
||||
int argidx;
|
||||
|
||||
if (argc < 2)
|
||||
usage();
|
||||
|
||||
if (*argv[1]=='/') {
|
||||
device = argv[1];
|
||||
argidx = 2;
|
||||
}
|
||||
else {
|
||||
device = DEVICE_NAME;
|
||||
argidx = 1;
|
||||
}
|
||||
|
||||
fprintf(stdout,"mixer device %s\n",device);
|
||||
if ((fd = open(device,O_RDONLY)) < 0) {
|
||||
fprintf(stdout,"opening device failed\n");
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
if ((fdwr = open(device,O_WRONLY)) < 0) {
|
||||
fprintf(stdout,"opening device failed\n");
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
if (argc < argidx+1)
|
||||
usage();
|
||||
|
||||
if (!strcmp(argv[argidx],"help"))
|
||||
usage();
|
||||
if (!strcmp(argv[argidx],"-h"))
|
||||
usage();
|
||||
if (!strcmp(argv[argidx],"--help"))
|
||||
usage();
|
||||
|
||||
if (!strcmp(argv[argidx],"status")) {
|
||||
ioctl(fd,SOUND_MIXER_PRIVATE2,&stat);
|
||||
fprintf(stdout,"stat.irq %d\n",stat.irq);
|
||||
fprintf(stdout,"stat.lockmask %d\n",stat.lockmask);
|
||||
fprintf(stdout,"stat.sr48 %d\n",stat.sr48);
|
||||
fprintf(stdout,"stat.wclock %d\n",stat.wclock);
|
||||
fprintf(stdout,"stat.bufpoint %d\n",stat.bufpoint);
|
||||
fprintf(stdout,"stat.syncmask %d\n",stat.syncmask);
|
||||
fprintf(stdout,"stat.doublespeed %d\n",stat.doublespeed);
|
||||
fprintf(stdout,"stat.tc_busy %d\n",stat.tc_busy);
|
||||
fprintf(stdout,"stat.tc_out %d\n",stat.tc_out);
|
||||
fprintf(stdout,"stat.crystalrate %d (0=64k 3=96k 4=88.2k 5=48k 6=44.1k 7=32k)\n",stat.crystalrate);
|
||||
fprintf(stdout,"stat.spdif_error %d\n",stat.spdif_error);
|
||||
fprintf(stdout,"stat.bufid %d\n",stat.bufid);
|
||||
fprintf(stdout,"stat.tc_valid %d\n",stat.tc_valid);
|
||||
exit (0);
|
||||
}
|
||||
|
||||
if (!strcmp(argv[argidx],"control")) {
|
||||
ioctl(fd,SOUND_MIXER_PRIVATE3,&ctrl);
|
||||
fprintf(stdout,"ctrl.start %d\n",ctrl.start);
|
||||
fprintf(stdout,"ctrl.latency %d (0=64 .. 7=8192)\n",ctrl.latency);
|
||||
fprintf(stdout,"ctrl.master %d\n",ctrl.master);
|
||||
fprintf(stdout,"ctrl.ie %d\n",ctrl.ie);
|
||||
fprintf(stdout,"ctrl.sr48 %d\n",ctrl.sr48);
|
||||
fprintf(stdout,"ctrl.spare %d\n",ctrl.spare);
|
||||
fprintf(stdout,"ctrl.doublespeed %d\n",ctrl.doublespeed);
|
||||
fprintf(stdout,"ctrl.pro %d\n",ctrl.pro);
|
||||
fprintf(stdout,"ctrl.emphasis %d\n",ctrl.emphasis);
|
||||
fprintf(stdout,"ctrl.dolby %d\n",ctrl.dolby);
|
||||
fprintf(stdout,"ctrl.opt_out %d\n",ctrl.opt_out);
|
||||
fprintf(stdout,"ctrl.wordclock %d\n",ctrl.wordclock);
|
||||
fprintf(stdout,"ctrl.spdif_in %d (0=optical,1=coax,2=intern)\n",ctrl.spdif_in);
|
||||
fprintf(stdout,"ctrl.sync_ref %d (0=ADAT1,1=ADAT2,2=ADAT3,3=SPDIF)\n",ctrl.sync_ref);
|
||||
fprintf(stdout,"ctrl.spdif_reset %d\n",ctrl.spdif_reset);
|
||||
fprintf(stdout,"ctrl.spdif_select %d\n",ctrl.spdif_select);
|
||||
fprintf(stdout,"ctrl.spdif_clock %d\n",ctrl.spdif_clock);
|
||||
fprintf(stdout,"ctrl.spdif_write %d\n",ctrl.spdif_write);
|
||||
fprintf(stdout,"ctrl.adat1_cd %d\n",ctrl.adat1_cd);
|
||||
exit (0);
|
||||
}
|
||||
|
||||
if (!strcmp(argv[argidx],"mix")) {
|
||||
rme_mixer mix;
|
||||
int i;
|
||||
|
||||
for (i=0; i<4; i++) {
|
||||
mix.devnr = i;
|
||||
ioctl(fd,SOUND_MIXER_PRIVATE1,&mix);
|
||||
if (mix.devnr == i) {
|
||||
fprintf(stdout,"devnr %d\n",mix.devnr);
|
||||
fprintf(stdout,"mix.i_offset %2d (0-25)\n",mix.i_offset);
|
||||
fprintf(stdout,"mix.o_offset %2d (0-25)\n",mix.o_offset);
|
||||
}
|
||||
}
|
||||
exit (0);
|
||||
}
|
||||
|
||||
/* the control flags */
|
||||
|
||||
if (argc < argidx+2)
|
||||
usage();
|
||||
|
||||
if (!strcmp(argv[argidx],"master")) {
|
||||
int val = atoi(argv[argidx+1]);
|
||||
ioctl(fd,SOUND_MIXER_PRIVATE3,&ctrl);
|
||||
printf("master = %d\n",val);
|
||||
ctrl.master = val;
|
||||
ioctl(fdwr,SOUND_MIXER_PRIVATE3,&ctrl);
|
||||
exit (0);
|
||||
}
|
||||
|
||||
if (!strcmp(argv[argidx],"pro")) {
|
||||
int val = atoi(argv[argidx+1]);
|
||||
ioctl(fd,SOUND_MIXER_PRIVATE3,&ctrl);
|
||||
printf("pro = %d\n",val);
|
||||
ctrl.pro = val;
|
||||
ioctl(fdwr,SOUND_MIXER_PRIVATE3,&ctrl);
|
||||
exit (0);
|
||||
}
|
||||
|
||||
if (!strcmp(argv[argidx],"emphasis")) {
|
||||
int val = atoi(argv[argidx+1]);
|
||||
ioctl(fd,SOUND_MIXER_PRIVATE3,&ctrl);
|
||||
printf("emphasis = %d\n",val);
|
||||
ctrl.emphasis = val;
|
||||
ioctl(fdwr,SOUND_MIXER_PRIVATE3,&ctrl);
|
||||
exit (0);
|
||||
}
|
||||
|
||||
if (!strcmp(argv[argidx],"dolby")) {
|
||||
int val = atoi(argv[argidx+1]);
|
||||
ioctl(fd,SOUND_MIXER_PRIVATE3,&ctrl);
|
||||
printf("dolby = %d\n",val);
|
||||
ctrl.dolby = val;
|
||||
ioctl(fdwr,SOUND_MIXER_PRIVATE3,&ctrl);
|
||||
exit (0);
|
||||
}
|
||||
|
||||
if (!strcmp(argv[argidx],"optout")) {
|
||||
int val = atoi(argv[argidx+1]);
|
||||
ioctl(fd,SOUND_MIXER_PRIVATE3,&ctrl);
|
||||
printf("optout = %d\n",val);
|
||||
ctrl.opt_out = val;
|
||||
ioctl(fdwr,SOUND_MIXER_PRIVATE3,&ctrl);
|
||||
exit (0);
|
||||
}
|
||||
|
||||
if (!strcmp(argv[argidx],"wordclock")) {
|
||||
int val = atoi(argv[argidx+1]);
|
||||
ioctl(fd,SOUND_MIXER_PRIVATE3,&ctrl);
|
||||
printf("wordclock = %d\n",val);
|
||||
ctrl.wordclock = val;
|
||||
ioctl(fdwr,SOUND_MIXER_PRIVATE3,&ctrl);
|
||||
exit (0);
|
||||
}
|
||||
|
||||
if (!strcmp(argv[argidx],"spdifin")) {
|
||||
int val = atoi(argv[argidx+1]);
|
||||
ioctl(fd,SOUND_MIXER_PRIVATE3,&ctrl);
|
||||
printf("spdifin = %d\n",val);
|
||||
ctrl.spdif_in = val;
|
||||
ioctl(fdwr,SOUND_MIXER_PRIVATE3,&ctrl);
|
||||
exit (0);
|
||||
}
|
||||
|
||||
if (!strcmp(argv[argidx],"syncref")) {
|
||||
int val = atoi(argv[argidx+1]);
|
||||
ioctl(fd,SOUND_MIXER_PRIVATE3,&ctrl);
|
||||
printf("syncref = %d\n",val);
|
||||
ctrl.sync_ref = val;
|
||||
ioctl(fdwr,SOUND_MIXER_PRIVATE3,&ctrl);
|
||||
exit (0);
|
||||
}
|
||||
|
||||
if (!strcmp(argv[argidx],"adat1cd")) {
|
||||
int val = atoi(argv[argidx+1]);
|
||||
ioctl(fd,SOUND_MIXER_PRIVATE3,&ctrl);
|
||||
printf("adat1cd = %d\n",val);
|
||||
ctrl.adat1_cd = val;
|
||||
ioctl(fdwr,SOUND_MIXER_PRIVATE3,&ctrl);
|
||||
exit (0);
|
||||
}
|
||||
|
||||
/* setting offset */
|
||||
|
||||
if (argc < argidx+4)
|
||||
usage();
|
||||
|
||||
if (!strcmp(argv[argidx],"offset")) {
|
||||
rme_mixer mix;
|
||||
|
||||
mix.devnr = atoi(argv[argidx+1]);
|
||||
|
||||
mix.i_offset = atoi(argv[argidx+2]);
|
||||
mix.o_offset = atoi(argv[argidx+3]);
|
||||
ioctl(fdwr,SOUND_MIXER_PRIVATE1,&mix);
|
||||
fprintf(stdout,"devnr %d\n",mix.devnr);
|
||||
fprintf(stdout,"mix.i_offset to %d\n",mix.i_offset);
|
||||
fprintf(stdout,"mix.o_offset to %d\n",mix.o_offset);
|
||||
exit (0);
|
||||
}
|
||||
|
||||
usage();
|
||||
exit (0); /* to avoid warning */
|
||||
}
|
||||
|
||||
|
||||
---------------------------- <snip> --------------------------------
|
||||
#!/usr/bin/wish
|
||||
|
||||
# xrmectrl
|
||||
# (C) 2000 Guenter Geiger <geiger@debian.org>
|
||||
# HP20020201 - Heiko Purnhagen <purnhage@tnt.uni-hannover.de>
|
||||
|
||||
#set defaults "-relief ridged"
|
||||
set CTRLPROG "./rmectrl"
|
||||
if {$argc} {
|
||||
set CTRLPROG "$CTRLPROG $argv"
|
||||
}
|
||||
puts "CTRLPROG $CTRLPROG"
|
||||
|
||||
frame .butts
|
||||
button .butts.exit -text "Exit" -command "exit" -relief ridge
|
||||
#button .butts.state -text "State" -command "get_all"
|
||||
|
||||
pack .butts.exit -side left
|
||||
pack .butts -side bottom
|
||||
|
||||
|
||||
#
|
||||
# STATUS
|
||||
#
|
||||
|
||||
frame .status
|
||||
|
||||
# Sampling Rate
|
||||
|
||||
frame .status.sr
|
||||
label .status.sr.text -text "Sampling Rate" -justify left
|
||||
radiobutton .status.sr.441 -selectcolor red -text "44.1 kHz" -width 10 -anchor nw -variable srate -value 44100 -font times
|
||||
radiobutton .status.sr.480 -selectcolor red -text "48 kHz" -width 10 -anchor nw -variable srate -value 48000 -font times
|
||||
radiobutton .status.sr.882 -selectcolor red -text "88.2 kHz" -width 10 -anchor nw -variable srate -value 88200 -font times
|
||||
radiobutton .status.sr.960 -selectcolor red -text "96 kHz" -width 10 -anchor nw -variable srate -value 96000 -font times
|
||||
|
||||
pack .status.sr.text .status.sr.441 .status.sr.480 .status.sr.882 .status.sr.960 -side top -padx 3
|
||||
|
||||
# Lock
|
||||
|
||||
frame .status.lock
|
||||
label .status.lock.text -text "Lock" -justify left
|
||||
checkbutton .status.lock.adat1 -selectcolor red -text "ADAT1" -anchor nw -width 10 -variable adatlock1 -font times
|
||||
checkbutton .status.lock.adat2 -selectcolor red -text "ADAT2" -anchor nw -width 10 -variable adatlock2 -font times
|
||||
checkbutton .status.lock.adat3 -selectcolor red -text "ADAT3" -anchor nw -width 10 -variable adatlock3 -font times
|
||||
|
||||
pack .status.lock.text .status.lock.adat1 .status.lock.adat2 .status.lock.adat3 -side top -padx 3
|
||||
|
||||
# Sync
|
||||
|
||||
frame .status.sync
|
||||
label .status.sync.text -text "Sync" -justify left
|
||||
checkbutton .status.sync.adat1 -selectcolor red -text "ADAT1" -anchor nw -width 10 -variable adatsync1 -font times
|
||||
checkbutton .status.sync.adat2 -selectcolor red -text "ADAT2" -anchor nw -width 10 -variable adatsync2 -font times
|
||||
checkbutton .status.sync.adat3 -selectcolor red -text "ADAT3" -anchor nw -width 10 -variable adatsync3 -font times
|
||||
|
||||
pack .status.sync.text .status.sync.adat1 .status.sync.adat2 .status.sync.adat3 -side top -padx 3
|
||||
|
||||
# Timecode
|
||||
|
||||
frame .status.tc
|
||||
label .status.tc.text -text "Timecode" -justify left
|
||||
checkbutton .status.tc.busy -selectcolor red -text "busy" -anchor nw -width 10 -variable tcbusy -font times
|
||||
checkbutton .status.tc.out -selectcolor red -text "out" -anchor nw -width 10 -variable tcout -font times
|
||||
checkbutton .status.tc.valid -selectcolor red -text "valid" -anchor nw -width 10 -variable tcvalid -font times
|
||||
|
||||
pack .status.tc.text .status.tc.busy .status.tc.out .status.tc.valid -side top -padx 3
|
||||
|
||||
# SPDIF In
|
||||
|
||||
frame .status.spdif
|
||||
label .status.spdif.text -text "SPDIF In" -justify left
|
||||
label .status.spdif.sr -text "--.- kHz" -anchor n -width 10 -font times
|
||||
checkbutton .status.spdif.error -selectcolor red -text "Input Lock" -anchor nw -width 10 -variable spdiferr -font times
|
||||
|
||||
pack .status.spdif.text .status.spdif.sr .status.spdif.error -side top -padx 3
|
||||
|
||||
pack .status.sr .status.lock .status.sync .status.tc .status.spdif -side left -fill x -anchor n -expand 1
|
||||
|
||||
|
||||
#
|
||||
# CONTROL
|
||||
#
|
||||
|
||||
proc setprof {} {
|
||||
global CTRLPROG
|
||||
global spprof
|
||||
exec $CTRLPROG pro $spprof
|
||||
}
|
||||
|
||||
proc setemph {} {
|
||||
global CTRLPROG
|
||||
global spemph
|
||||
exec $CTRLPROG emphasis $spemph
|
||||
}
|
||||
|
||||
proc setnoaud {} {
|
||||
global CTRLPROG
|
||||
global spnoaud
|
||||
exec $CTRLPROG dolby $spnoaud
|
||||
}
|
||||
|
||||
proc setoptical {} {
|
||||
global CTRLPROG
|
||||
global spoptical
|
||||
exec $CTRLPROG optout $spoptical
|
||||
}
|
||||
|
||||
proc setspdifin {} {
|
||||
global CTRLPROG
|
||||
global spdifin
|
||||
exec $CTRLPROG spdifin [expr $spdifin - 1]
|
||||
}
|
||||
|
||||
proc setsyncsource {} {
|
||||
global CTRLPROG
|
||||
global syncsource
|
||||
exec $CTRLPROG syncref [expr $syncsource -1]
|
||||
}
|
||||
|
||||
|
||||
proc setmaster {} {
|
||||
global CTRLPROG
|
||||
global master
|
||||
exec $CTRLPROG master $master
|
||||
}
|
||||
|
||||
proc setwordclock {} {
|
||||
global CTRLPROG
|
||||
global wordclock
|
||||
exec $CTRLPROG wordclock $wordclock
|
||||
}
|
||||
|
||||
proc setadat1cd {} {
|
||||
global CTRLPROG
|
||||
global adat1cd
|
||||
exec $CTRLPROG adat1cd $adat1cd
|
||||
}
|
||||
|
||||
|
||||
frame .control
|
||||
|
||||
# SPDIF In & SPDIF Out
|
||||
|
||||
|
||||
frame .control.spdif
|
||||
|
||||
frame .control.spdif.in
|
||||
label .control.spdif.in.text -text "SPDIF In" -justify left
|
||||
radiobutton .control.spdif.in.input1 -text "Optical" -anchor nw -width 13 -variable spdifin -value 1 -command setspdifin -selectcolor blue -font times
|
||||
radiobutton .control.spdif.in.input2 -text "Coaxial" -anchor nw -width 13 -variable spdifin -value 2 -command setspdifin -selectcolor blue -font times
|
||||
radiobutton .control.spdif.in.input3 -text "Intern " -anchor nw -width 13 -variable spdifin -command setspdifin -value 3 -selectcolor blue -font times
|
||||
|
||||
checkbutton .control.spdif.in.adat1cd -text "ADAT1 Intern" -anchor nw -width 13 -variable adat1cd -command setadat1cd -selectcolor blue -font times
|
||||
|
||||
pack .control.spdif.in.text .control.spdif.in.input1 .control.spdif.in.input2 .control.spdif.in.input3 .control.spdif.in.adat1cd
|
||||
|
||||
label .control.spdif.space
|
||||
|
||||
frame .control.spdif.out
|
||||
label .control.spdif.out.text -text "SPDIF Out" -justify left
|
||||
checkbutton .control.spdif.out.pro -text "Professional" -anchor nw -width 13 -variable spprof -command setprof -selectcolor blue -font times
|
||||
checkbutton .control.spdif.out.emphasis -text "Emphasis" -anchor nw -width 13 -variable spemph -command setemph -selectcolor blue -font times
|
||||
checkbutton .control.spdif.out.dolby -text "NoAudio" -anchor nw -width 13 -variable spnoaud -command setnoaud -selectcolor blue -font times
|
||||
checkbutton .control.spdif.out.optout -text "Optical Out" -anchor nw -width 13 -variable spoptical -command setoptical -selectcolor blue -font times
|
||||
|
||||
pack .control.spdif.out.optout .control.spdif.out.dolby .control.spdif.out.emphasis .control.spdif.out.pro .control.spdif.out.text -side bottom
|
||||
|
||||
pack .control.spdif.in .control.spdif.space .control.spdif.out -side top -fill y -padx 3 -expand 1
|
||||
|
||||
# Sync Mode & Sync Source
|
||||
|
||||
frame .control.sync
|
||||
frame .control.sync.mode
|
||||
label .control.sync.mode.text -text "Sync Mode" -justify left
|
||||
checkbutton .control.sync.mode.master -text "Master" -anchor nw -width 13 -variable master -command setmaster -selectcolor blue -font times
|
||||
checkbutton .control.sync.mode.wc -text "Wordclock" -anchor nw -width 13 -variable wordclock -command setwordclock -selectcolor blue -font times
|
||||
|
||||
pack .control.sync.mode.text .control.sync.mode.master .control.sync.mode.wc
|
||||
|
||||
label .control.sync.space
|
||||
|
||||
frame .control.sync.src
|
||||
label .control.sync.src.text -text "Sync Source" -justify left
|
||||
radiobutton .control.sync.src.input1 -text "ADAT1" -anchor nw -width 13 -variable syncsource -value 1 -command setsyncsource -selectcolor blue -font times
|
||||
radiobutton .control.sync.src.input2 -text "ADAT2" -anchor nw -width 13 -variable syncsource -value 2 -command setsyncsource -selectcolor blue -font times
|
||||
radiobutton .control.sync.src.input3 -text "ADAT3" -anchor nw -width 13 -variable syncsource -command setsyncsource -value 3 -selectcolor blue -font times
|
||||
radiobutton .control.sync.src.input4 -text "SPDIF" -anchor nw -width 13 -variable syncsource -command setsyncsource -value 4 -selectcolor blue -font times
|
||||
|
||||
pack .control.sync.src.input4 .control.sync.src.input3 .control.sync.src.input2 .control.sync.src.input1 .control.sync.src.text -side bottom
|
||||
|
||||
pack .control.sync.mode .control.sync.space .control.sync.src -side top -fill y -padx 3 -expand 1
|
||||
|
||||
label .control.space -text "" -width 10
|
||||
|
||||
# Buffer Size
|
||||
|
||||
frame .control.buf
|
||||
label .control.buf.text -text "Buffer Size (Latency)" -justify left
|
||||
radiobutton .control.buf.b1 -selectcolor red -text "64 (1.5 ms)" -width 13 -anchor nw -variable ssrate -value 1 -font times
|
||||
radiobutton .control.buf.b2 -selectcolor red -text "128 (3 ms)" -width 13 -anchor nw -variable ssrate -value 2 -font times
|
||||
radiobutton .control.buf.b3 -selectcolor red -text "256 (6 ms)" -width 13 -anchor nw -variable ssrate -value 3 -font times
|
||||
radiobutton .control.buf.b4 -selectcolor red -text "512 (12 ms)" -width 13 -anchor nw -variable ssrate -value 4 -font times
|
||||
radiobutton .control.buf.b5 -selectcolor red -text "1024 (23 ms)" -width 13 -anchor nw -variable ssrate -value 5 -font times
|
||||
radiobutton .control.buf.b6 -selectcolor red -text "2048 (46 ms)" -width 13 -anchor nw -variable ssrate -value 6 -font times
|
||||
radiobutton .control.buf.b7 -selectcolor red -text "4096 (93 ms)" -width 13 -anchor nw -variable ssrate -value 7 -font times
|
||||
radiobutton .control.buf.b8 -selectcolor red -text "8192 (186 ms)" -width 13 -anchor nw -variable ssrate -value 8 -font times
|
||||
|
||||
pack .control.buf.text .control.buf.b1 .control.buf.b2 .control.buf.b3 .control.buf.b4 .control.buf.b5 .control.buf.b6 .control.buf.b7 .control.buf.b8 -side top -padx 3
|
||||
|
||||
# Offset
|
||||
|
||||
frame .control.offset
|
||||
|
||||
frame .control.offset.in
|
||||
label .control.offset.in.text -text "Offset In" -justify left
|
||||
label .control.offset.in.off0 -text "dev\#0: -" -anchor nw -width 10 -font times
|
||||
label .control.offset.in.off1 -text "dev\#1: -" -anchor nw -width 10 -font times
|
||||
label .control.offset.in.off2 -text "dev\#2: -" -anchor nw -width 10 -font times
|
||||
label .control.offset.in.off3 -text "dev\#3: -" -anchor nw -width 10 -font times
|
||||
|
||||
pack .control.offset.in.text .control.offset.in.off0 .control.offset.in.off1 .control.offset.in.off2 .control.offset.in.off3
|
||||
|
||||
label .control.offset.space
|
||||
|
||||
frame .control.offset.out
|
||||
label .control.offset.out.text -text "Offset Out" -justify left
|
||||
label .control.offset.out.off0 -text "dev\#0: -" -anchor nw -width 10 -font times
|
||||
label .control.offset.out.off1 -text "dev\#1: -" -anchor nw -width 10 -font times
|
||||
label .control.offset.out.off2 -text "dev\#2: -" -anchor nw -width 10 -font times
|
||||
label .control.offset.out.off3 -text "dev\#3: -" -anchor nw -width 10 -font times
|
||||
|
||||
pack .control.offset.out.off3 .control.offset.out.off2 .control.offset.out.off1 .control.offset.out.off0 .control.offset.out.text -side bottom
|
||||
|
||||
pack .control.offset.in .control.offset.space .control.offset.out -side top -fill y -padx 3 -expand 1
|
||||
|
||||
|
||||
pack .control.spdif .control.sync .control.space .control.buf .control.offset -side left -fill both -anchor n -expand 1
|
||||
|
||||
|
||||
label .statustext -text Status -justify center -relief ridge
|
||||
label .controltext -text Control -justify center -relief ridge
|
||||
|
||||
label .statusspace
|
||||
label .controlspace
|
||||
|
||||
pack .statustext .status .statusspace .controltext .control .controlspace -side top -anchor nw -fill both -expand 1
|
||||
|
||||
|
||||
proc get_bit {output sstr} {
|
||||
set idx1 [string last [concat $sstr 1] $output]
|
||||
set idx1 [expr $idx1 != -1]
|
||||
return $idx1
|
||||
}
|
||||
|
||||
proc get_val {output sstr} {
|
||||
set val [string wordend $output [string last $sstr $output]]
|
||||
set val [string range $output $val [expr $val+1]]
|
||||
return $val
|
||||
}
|
||||
|
||||
proc get_val2 {output sstr} {
|
||||
set val [string wordend $output [string first $sstr $output]]
|
||||
set val [string range $output $val [expr $val+2]]
|
||||
return $val
|
||||
}
|
||||
|
||||
proc get_control {} {
|
||||
global spprof
|
||||
global spemph
|
||||
global spnoaud
|
||||
global spoptical
|
||||
global spdifin
|
||||
global ssrate
|
||||
global master
|
||||
global wordclock
|
||||
global syncsource
|
||||
global CTRLPROG
|
||||
|
||||
set f [open "| $CTRLPROG control" r+]
|
||||
set ooo [read $f 1000]
|
||||
close $f
|
||||
# puts $ooo
|
||||
|
||||
set spprof [ get_bit $ooo "pro"]
|
||||
set spemph [ get_bit $ooo "emphasis"]
|
||||
set spnoaud [ get_bit $ooo "dolby"]
|
||||
set spoptical [ get_bit $ooo "opt_out"]
|
||||
set spdifin [ expr [ get_val $ooo "spdif_in"] + 1]
|
||||
set ssrate [ expr [ get_val $ooo "latency"] + 1]
|
||||
set master [ expr [ get_val $ooo "master"]]
|
||||
set wordclock [ expr [ get_val $ooo "wordclock"]]
|
||||
set syncsource [ expr [ get_val $ooo "sync_ref"] + 1]
|
||||
}
|
||||
|
||||
proc get_status {} {
|
||||
global srate
|
||||
global ctrlcom
|
||||
|
||||
global adatlock1
|
||||
global adatlock2
|
||||
global adatlock3
|
||||
|
||||
global adatsync1
|
||||
global adatsync2
|
||||
global adatsync3
|
||||
|
||||
global tcbusy
|
||||
global tcout
|
||||
global tcvalid
|
||||
|
||||
global spdiferr
|
||||
global crystal
|
||||
global .status.spdif.text
|
||||
global CTRLPROG
|
||||
|
||||
|
||||
set f [open "| $CTRLPROG status" r+]
|
||||
set ooo [read $f 1000]
|
||||
close $f
|
||||
# puts $ooo
|
||||
|
||||
# samplerate
|
||||
|
||||
set idx1 [string last "sr48 1" $ooo]
|
||||
set idx2 [string last "doublespeed 1" $ooo]
|
||||
if {$idx1 >= 0} {
|
||||
set fact1 48000
|
||||
} else {
|
||||
set fact1 44100
|
||||
}
|
||||
|
||||
if {$idx2 >= 0} {
|
||||
set fact2 2
|
||||
} else {
|
||||
set fact2 1
|
||||
}
|
||||
set srate [expr $fact1 * $fact2]
|
||||
# ADAT lock
|
||||
|
||||
set val [get_val $ooo lockmask]
|
||||
set adatlock1 0
|
||||
set adatlock2 0
|
||||
set adatlock3 0
|
||||
if {[expr $val & 1]} {
|
||||
set adatlock3 1
|
||||
}
|
||||
if {[expr $val & 2]} {
|
||||
set adatlock2 1
|
||||
}
|
||||
if {[expr $val & 4]} {
|
||||
set adatlock1 1
|
||||
}
|
||||
|
||||
# ADAT sync
|
||||
set val [get_val $ooo syncmask]
|
||||
set adatsync1 0
|
||||
set adatsync2 0
|
||||
set adatsync3 0
|
||||
|
||||
if {[expr $val & 1]} {
|
||||
set adatsync3 1
|
||||
}
|
||||
if {[expr $val & 2]} {
|
||||
set adatsync2 1
|
||||
}
|
||||
if {[expr $val & 4]} {
|
||||
set adatsync1 1
|
||||
}
|
||||
|
||||
# TC busy
|
||||
|
||||
set tcbusy [get_bit $ooo "busy"]
|
||||
set tcout [get_bit $ooo "out"]
|
||||
set tcvalid [get_bit $ooo "valid"]
|
||||
set spdiferr [expr [get_bit $ooo "spdif_error"] == 0]
|
||||
|
||||
# 000=64kHz, 100=88.2kHz, 011=96kHz
|
||||
# 111=32kHz, 110=44.1kHz, 101=48kHz
|
||||
|
||||
set val [get_val $ooo crystalrate]
|
||||
|
||||
set crystal "--.- kHz"
|
||||
if {$val == 0} {
|
||||
set crystal "64 kHz"
|
||||
}
|
||||
if {$val == 4} {
|
||||
set crystal "88.2 kHz"
|
||||
}
|
||||
if {$val == 3} {
|
||||
set crystal "96 kHz"
|
||||
}
|
||||
if {$val == 7} {
|
||||
set crystal "32 kHz"
|
||||
}
|
||||
if {$val == 6} {
|
||||
set crystal "44.1 kHz"
|
||||
}
|
||||
if {$val == 5} {
|
||||
set crystal "48 kHz"
|
||||
}
|
||||
.status.spdif.sr configure -text $crystal
|
||||
}
|
||||
|
||||
proc get_offset {} {
|
||||
global inoffset
|
||||
global outoffset
|
||||
global CTRLPROG
|
||||
|
||||
set f [open "| $CTRLPROG mix" r+]
|
||||
set ooo [read $f 1000]
|
||||
close $f
|
||||
# puts $ooo
|
||||
|
||||
if { [string match "*devnr*" $ooo] } {
|
||||
set ooo [string range $ooo [string wordend $ooo [string first devnr $ooo]] end]
|
||||
set val [get_val2 $ooo i_offset]
|
||||
.control.offset.in.off0 configure -text "dev\#0: $val"
|
||||
set val [get_val2 $ooo o_offset]
|
||||
.control.offset.out.off0 configure -text "dev\#0: $val"
|
||||
} else {
|
||||
.control.offset.in.off0 configure -text "dev\#0: -"
|
||||
.control.offset.out.off0 configure -text "dev\#0: -"
|
||||
}
|
||||
if { [string match "*devnr*" $ooo] } {
|
||||
set ooo [string range $ooo [string wordend $ooo [string first devnr $ooo]] end]
|
||||
set val [get_val2 $ooo i_offset]
|
||||
.control.offset.in.off1 configure -text "dev\#1: $val"
|
||||
set val [get_val2 $ooo o_offset]
|
||||
.control.offset.out.off1 configure -text "dev\#1: $val"
|
||||
} else {
|
||||
.control.offset.in.off1 configure -text "dev\#1: -"
|
||||
.control.offset.out.off1 configure -text "dev\#1: -"
|
||||
}
|
||||
if { [string match "*devnr*" $ooo] } {
|
||||
set ooo [string range $ooo [string wordend $ooo [string first devnr $ooo]] end]
|
||||
set val [get_val2 $ooo i_offset]
|
||||
.control.offset.in.off2 configure -text "dev\#2: $val"
|
||||
set val [get_val2 $ooo o_offset]
|
||||
.control.offset.out.off2 configure -text "dev\#2: $val"
|
||||
} else {
|
||||
.control.offset.in.off2 configure -text "dev\#2: -"
|
||||
.control.offset.out.off2 configure -text "dev\#2: -"
|
||||
}
|
||||
if { [string match "*devnr*" $ooo] } {
|
||||
set ooo [string range $ooo [string wordend $ooo [string first devnr $ooo]] end]
|
||||
set val [get_val2 $ooo i_offset]
|
||||
.control.offset.in.off3 configure -text "dev\#3: $val"
|
||||
set val [get_val2 $ooo o_offset]
|
||||
.control.offset.out.off3 configure -text "dev\#3: $val"
|
||||
} else {
|
||||
.control.offset.in.off3 configure -text "dev\#3: -"
|
||||
.control.offset.out.off3 configure -text "dev\#3: -"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
proc get_all {} {
|
||||
get_status
|
||||
get_control
|
||||
get_offset
|
||||
}
|
||||
|
||||
# main
|
||||
while {1} {
|
||||
after 200
|
||||
get_all
|
||||
update
|
||||
}
|
|
@ -1,70 +0,0 @@
|
|||
Recording
|
||||
---------
|
||||
|
||||
Recording does not work on the author's card, but there
|
||||
is at least one report of it working on later silicon.
|
||||
The chip behaves differently than described in the data sheet,
|
||||
likely due to a chip bug. Working around this would require
|
||||
the help of ESS (for example by publishing an errata sheet),
|
||||
but ESS has not done so far.
|
||||
|
||||
Also, the chip only supports 24 bit addresses for recording,
|
||||
which means it cannot work on some Alpha mainboards.
|
||||
|
||||
|
||||
/proc/sound, /dev/sndstat
|
||||
-------------------------
|
||||
|
||||
/proc/sound and /dev/sndstat is not supported by the
|
||||
driver. To find out whether the driver succeeded loading,
|
||||
check the kernel log (dmesg).
|
||||
|
||||
|
||||
ALaw/uLaw sample formats
|
||||
------------------------
|
||||
|
||||
This driver does not support the ALaw/uLaw sample formats.
|
||||
ALaw is the default mode when opening a sound device
|
||||
using OSS/Free. The reason for the lack of support is
|
||||
that the hardware does not support these formats, and adding
|
||||
conversion routines to the kernel would lead to very ugly
|
||||
code in the presence of the mmap interface to the driver.
|
||||
And since xquake uses mmap, mmap is considered important :-)
|
||||
and no sane application uses ALaw/uLaw these days anyway.
|
||||
In short, playing a Sun .au file as follows:
|
||||
|
||||
cat my_file.au > /dev/dsp
|
||||
|
||||
does not work. Instead, you may use the play script from
|
||||
Chris Bagwell's sox-12.14 package (or later, available from the URL
|
||||
below) to play many different audio file formats.
|
||||
The script automatically determines the audio format
|
||||
and does do audio conversions if necessary.
|
||||
http://home.sprynet.com/sprynet/cbagwell/projects.html
|
||||
|
||||
|
||||
Blocking vs. nonblocking IO
|
||||
---------------------------
|
||||
|
||||
Unlike OSS/Free this driver honours the O_NONBLOCK file flag
|
||||
not only during open, but also during read and write.
|
||||
This is an effort to make the sound driver interface more
|
||||
regular. Timidity has problems with this; a patch
|
||||
is available from http://www.ife.ee.ethz.ch/~sailer/linux/pciaudio.html.
|
||||
(Timidity patched will also run on OSS/Free).
|
||||
|
||||
|
||||
MIDI UART
|
||||
---------
|
||||
|
||||
The driver supports a simple MIDI UART interface, with
|
||||
no ioctl's supported.
|
||||
|
||||
|
||||
MIDI synthesizer
|
||||
----------------
|
||||
|
||||
The card has an OPL compatible FM synthesizer.
|
||||
|
||||
Thomas Sailer
|
||||
t.sailer@alumni.ethz.ch
|
|
@ -1,81 +0,0 @@
|
|||
/proc/sound, /dev/sndstat
|
||||
-------------------------
|
||||
|
||||
/proc/sound and /dev/sndstat is not supported by the
|
||||
driver. To find out whether the driver succeeded loading,
|
||||
check the kernel log (dmesg).
|
||||
|
||||
|
||||
ALaw/uLaw sample formats
|
||||
------------------------
|
||||
|
||||
This driver does not support the ALaw/uLaw sample formats.
|
||||
ALaw is the default mode when opening a sound device
|
||||
using OSS/Free. The reason for the lack of support is
|
||||
that the hardware does not support these formats, and adding
|
||||
conversion routines to the kernel would lead to very ugly
|
||||
code in the presence of the mmap interface to the driver.
|
||||
And since xquake uses mmap, mmap is considered important :-)
|
||||
and no sane application uses ALaw/uLaw these days anyway.
|
||||
In short, playing a Sun .au file as follows:
|
||||
|
||||
cat my_file.au > /dev/dsp
|
||||
|
||||
does not work. Instead, you may use the play script from
|
||||
Chris Bagwell's sox-12.14 package (available from the URL
|
||||
below) to play many different audio file formats.
|
||||
The script automatically determines the audio format
|
||||
and does do audio conversions if necessary.
|
||||
http://home.sprynet.com/sprynet/cbagwell/projects.html
|
||||
|
||||
|
||||
Blocking vs. nonblocking IO
|
||||
---------------------------
|
||||
|
||||
Unlike OSS/Free this driver honours the O_NONBLOCK file flag
|
||||
not only during open, but also during read and write.
|
||||
This is an effort to make the sound driver interface more
|
||||
regular. Timidity has problems with this; a patch
|
||||
is available from http://www.ife.ee.ethz.ch/~sailer/linux/pciaudio.html.
|
||||
(Timidity patched will also run on OSS/Free).
|
||||
|
||||
|
||||
MIDI UART
|
||||
---------
|
||||
|
||||
The driver supports a simple MIDI UART interface, with
|
||||
no ioctl's supported.
|
||||
|
||||
|
||||
MIDI synthesizer
|
||||
----------------
|
||||
|
||||
The card both has an OPL compatible FM synthesizer as well as
|
||||
a wavetable synthesizer.
|
||||
|
||||
I haven't managed so far to get the OPL synth running.
|
||||
|
||||
Using the wavetable synthesizer requires allocating
|
||||
1-4MB of physically contiguous memory, which isn't possible
|
||||
currently on Linux without ugly hacks like the bigphysarea
|
||||
patch. Therefore, the driver doesn't support wavetable
|
||||
synthesis.
|
||||
|
||||
|
||||
No support from S3
|
||||
------------------
|
||||
|
||||
I do not get any support from S3. Therefore, the driver
|
||||
still has many problems. For example, although the manual
|
||||
states that the chip should be able to access the sample
|
||||
buffer anywhere in 32bit address space, I haven't managed to
|
||||
get it working with buffers above 16M. Therefore, the card
|
||||
has the same disadvantages as ISA soundcards.
|
||||
|
||||
Given that the card is also very noisy, and if you haven't
|
||||
already bought it, you should strongly opt for one of the
|
||||
comparatively priced Ensoniq products.
|
||||
|
||||
|
||||
Thomas Sailer
|
||||
t.sailer@alumni.ethz.ch
|
|
@ -86,7 +86,7 @@ valid for 30 seconds.
|
|||
core_pattern:
|
||||
|
||||
core_pattern is used to specify a core dumpfile pattern name.
|
||||
. max length 64 characters; default value is "core"
|
||||
. max length 128 characters; default value is "core"
|
||||
. core_pattern is used as a pattern template for the output filename;
|
||||
certain string patterns (beginning with '%') are substituted with
|
||||
their actual values.
|
||||
|
@ -105,6 +105,9 @@ core_pattern is used to specify a core dumpfile pattern name.
|
|||
%h hostname
|
||||
%e executable filename
|
||||
%<OTHER> both are dropped
|
||||
. If the first character of the pattern is a '|', the kernel will treat
|
||||
the rest of the pattern as a command to run. The core dump will be
|
||||
written to the standard input of that program instead of to a file.
|
||||
|
||||
==============================================================
|
||||
|
||||
|
|
|
@ -51,7 +51,7 @@
|
|||
50 -> NPG Tech Real TV FM Top 10 [14f1:0842]
|
||||
51 -> WinFast DTV2000 H [107d:665e]
|
||||
52 -> Geniatech DVB-S [14f1:0084]
|
||||
53 -> Hauppauge WinTV-HVR3000 TriMode Analog/DVB-S/DVB-T [0070:1404]
|
||||
53 -> Hauppauge WinTV-HVR3000 TriMode Analog/DVB-S/DVB-T [0070:1404,0070:1400,0070:1401,0070:1402]
|
||||
54 -> Norwood Micro TV Tuner
|
||||
55 -> Shenzhen Tungsten Ages Tech TE-DTV-250 / Swann OEM [c180:c980]
|
||||
56 -> Hauppauge WinTV-HVR1300 DVB-T/Hybrid MPEG Encoder [0070:9600,0070:9601,0070:9602]
|
||||
|
|
|
@ -98,3 +98,4 @@
|
|||
97 -> LifeView FlyDVB-S /Acorp TV134DS [5168:0300,4e42:0300]
|
||||
98 -> Proteus Pro 2309 [0919:2003]
|
||||
99 -> AVerMedia TV Hybrid A16AR [1461:2c00]
|
||||
100 -> Asus Europa2 OEM [1043:4860]
|
||||
|
|
125
MAINTAINERS
125
MAINTAINERS
|
@ -641,7 +641,7 @@ CALGARY x86-64 IOMMU
|
|||
P: Muli Ben-Yehuda
|
||||
M: muli@il.ibm.com
|
||||
P: Jon D. Mason
|
||||
M: jdmason@us.ibm.com
|
||||
M: jdmason@kudzu.us
|
||||
L: linux-kernel@vger.kernel.org
|
||||
L: discuss@x86-64.org
|
||||
S: Maintained
|
||||
|
@ -898,6 +898,17 @@ M: jack@suse.cz
|
|||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
DISTRIBUTED LOCK MANAGER
|
||||
P: Patrick Caulfield
|
||||
M: pcaulfie@redhat.com
|
||||
P: David Teigland
|
||||
M: teigland@redhat.com
|
||||
L: cluster-devel@redhat.com
|
||||
W: http://sources.redhat.com/cluster/
|
||||
T: git kernel.org:/pub/scm/linux/kernel/git/steve/gfs2-2.6-fixes.git
|
||||
T: git kernel.org:/pub/scm/linux/kernel/git/steve/gfs2-2.6-nmw.git
|
||||
S: Supported
|
||||
|
||||
DAVICOM FAST ETHERNET (DMFE) NETWORK DRIVER
|
||||
P: Tobias Ringstrom
|
||||
M: tori@unhappy.mine.nu
|
||||
|
@ -977,6 +988,13 @@ L: ebtables-devel@lists.sourceforge.net
|
|||
W: http://ebtables.sourceforge.net/
|
||||
S: Maintained
|
||||
|
||||
ECRYPT FILE SYSTEM
|
||||
P: Mike Halcrow, Phillip Hellewell
|
||||
M: mhalcrow@us.ibm.com, phillip@hellewell.homeip.net
|
||||
L: ecryptfs-devel@lists.sourceforge.net
|
||||
W: http://ecryptfs.sourceforge.net/
|
||||
S: Supported
|
||||
|
||||
EDAC-CORE
|
||||
P: Doug Thompson
|
||||
M: norsk5@xmission.com
|
||||
|
@ -1166,6 +1184,15 @@ M: khc@pm.waw.pl
|
|||
W: http://www.kernel.org/pub/linux/utils/net/hdlc/
|
||||
S: Maintained
|
||||
|
||||
GFS2 FILE SYSTEM
|
||||
P: Steven Whitehouse
|
||||
M: swhiteho@redhat.com
|
||||
L: cluster-devel@redhat.com
|
||||
W: http://sources.redhat.com/cluster/
|
||||
T: git kernel.org:/pub/scm/linux/kernel/git/steve/gfs2-2.6-fixes.git
|
||||
T: git kernel.org:/pub/scm/linux/kernel/git/steve/gfs2-2.6-nmw.git
|
||||
S: Supported
|
||||
|
||||
GIGASET ISDN DRIVERS
|
||||
P: Hansjoerg Lipp
|
||||
M: hjlipp@web.de
|
||||
|
@ -1641,6 +1668,12 @@ M: sct@redhat.com, akpm@osdl.org
|
|||
L: ext2-devel@lists.sourceforge.net
|
||||
S: Maintained
|
||||
|
||||
K8TEMP HARDWARE MONITORING DRIVER
|
||||
P: Rudolf Marek
|
||||
M: r.marek@assembler.cz
|
||||
L: lm-sensors@lm-sensors.org
|
||||
S: Maintained
|
||||
|
||||
KCONFIG
|
||||
P: Roman Zippel
|
||||
M: zippel@linux-m68k.org
|
||||
|
@ -1893,11 +1926,6 @@ M: rroesler@syskonnect.de
|
|||
W: http://www.syskonnect.com
|
||||
S: Supported
|
||||
|
||||
MAESTRO PCI SOUND DRIVERS
|
||||
P: Zach Brown
|
||||
M: zab@zabbo.net
|
||||
S: Odd Fixes
|
||||
|
||||
MAN-PAGES: MANUAL PAGES FOR LINUX -- Sections 2, 3, 4, 5, and 7
|
||||
P: Michael Kerrisk
|
||||
M: mtk-manpages@gmx.net
|
||||
|
@ -1976,6 +2004,13 @@ M: rubini@ipvvis.unipv.it
|
|||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
MSI LAPTOP SUPPORT
|
||||
P: Lennart Poettering
|
||||
M: mzxreary@0pointer.de
|
||||
L: https://tango.0pointer.de/mailman/listinfo/s270-linux
|
||||
W: http://0pointer.de/lennart/tchibo.html
|
||||
S: Maintained
|
||||
|
||||
MTRR AND SIMILAR SUPPORT [i386]
|
||||
P: Richard Gooch
|
||||
M: rgooch@atnf.csiro.au
|
||||
|
@ -1983,8 +2018,11 @@ L: linux-kernel@vger.kernel.org
|
|||
W: http://www.atnf.csiro.au/~rgooch/linux/kernel-patches.html
|
||||
S: Maintained
|
||||
|
||||
MULTIMEDIA CARD (MMC) SUBSYSTEM
|
||||
S: Orphan
|
||||
MULTIMEDIA CARD (MMC) AND SECURE DIGITAL (SD) SUBSYSTEM
|
||||
P: Pierre Ossman
|
||||
M: drzeus-mmc@drzeus.cx
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
MULTISOUND SOUND DRIVER
|
||||
P: Andrew Veliath
|
||||
|
@ -2020,11 +2058,13 @@ P: Marc Boucher
|
|||
P: James Morris
|
||||
P: Harald Welte
|
||||
P: Jozsef Kadlecsik
|
||||
M: coreteam@netfilter.org
|
||||
P: Patrick McHardy
|
||||
M: kaber@trash.net
|
||||
L: netfilter-devel@lists.netfilter.org
|
||||
L: netfilter@lists.netfilter.org
|
||||
L: coreteam@netfilter.org
|
||||
W: http://www.netfilter.org/
|
||||
W: http://www.iptables.org/
|
||||
L: netfilter@lists.netfilter.org
|
||||
L: netfilter-devel@lists.netfilter.org
|
||||
S: Supported
|
||||
|
||||
NETLABEL
|
||||
|
@ -2241,6 +2281,17 @@ T: git kernel.org:/pub/scm/linux/kernel/git/kyle/parisc-2.6.git
|
|||
T: cvs cvs.parisc-linux.org:/var/cvs/linux-2.6
|
||||
S: Maintained
|
||||
|
||||
PC87360 HARDWARE MONITORING DRIVER
|
||||
P: Jim Cromie
|
||||
M: jim.cromie@gmail.com
|
||||
L: lm-sensors@lm-sensors.org
|
||||
S: Maintained
|
||||
|
||||
PC8736x GPIO DRIVER
|
||||
P: Jim Cromie
|
||||
M: jim.cromie@gmail.com
|
||||
S: Maintained
|
||||
|
||||
PCI ERROR RECOVERY
|
||||
P: Linas Vepstas
|
||||
M: linas@austin.ibm.com
|
||||
|
@ -2264,8 +2315,8 @@ T: quilt kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/
|
|||
S: Supported
|
||||
|
||||
PCI HOTPLUG CORE
|
||||
P: Greg Kroah-Hartman
|
||||
M: gregkh@suse.de
|
||||
P: Kristen Carlson Accardi
|
||||
M: kristen.c.accardi@intel.com
|
||||
S: Supported
|
||||
|
||||
PCI HOTPLUG COMPAQ DRIVER
|
||||
|
@ -2434,6 +2485,19 @@ M: mporter@kernel.crashing.org
|
|||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
READ-COPY UPDATE (RCU)
|
||||
P: Dipankar Sarma
|
||||
M: dipankar@in.ibm.com
|
||||
W: http://www.rdrop.com/users/paulmck/rclock/
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Supported
|
||||
|
||||
RCUTORTURE MODULE
|
||||
P: Josh Triplett
|
||||
M: josh@freedesktop.org
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
REAL TIME CLOCK DRIVER
|
||||
P: Paul Gortmaker
|
||||
M: p_gortmaker@yahoo.com
|
||||
|
@ -2559,10 +2623,19 @@ L: lksctp-developers@lists.sourceforge.net
|
|||
S: Supported
|
||||
|
||||
SCx200 CPU SUPPORT
|
||||
P: Christer Weinigel
|
||||
M: christer@weinigel.se
|
||||
W: http://www.weinigel.se
|
||||
S: Supported
|
||||
P: Jim Cromie
|
||||
M: jim.cromie@gmail.com
|
||||
S: Odd Fixes
|
||||
|
||||
SCx200 GPIO DRIVER
|
||||
P: Jim Cromie
|
||||
M: jim.cromie@gmail.com
|
||||
S: Maintained
|
||||
|
||||
SCx200 HRT CLOCKSOURCE DRIVER
|
||||
P: Jim Cromie
|
||||
M: jim.cromie@gmail.com
|
||||
S: Maintained
|
||||
|
||||
SECURITY CONTACT
|
||||
P: Security Officers
|
||||
|
@ -2727,14 +2800,7 @@ S: Maintained
|
|||
UltraSPARC (sparc64):
|
||||
P: David S. Miller
|
||||
M: davem@davemloft.net
|
||||
P: Eddie C. Dost
|
||||
M: ecd@brainaid.de
|
||||
P: Jakub Jelinek
|
||||
M: jj@sunsite.ms.mff.cuni.cz
|
||||
P: Anton Blanchard
|
||||
M: anton@samba.org
|
||||
L: sparclinux@vger.kernel.org
|
||||
L: ultralinux@vger.kernel.org
|
||||
T: git kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6.git
|
||||
S: Maintained
|
||||
|
||||
|
@ -2854,6 +2920,11 @@ M: hlhung3i@gmail.com
|
|||
W: http://tcp-lp-mod.sourceforge.net/
|
||||
S: Maintained
|
||||
|
||||
TI FLASH MEDIA INTERFACE DRIVER
|
||||
P: Alex Dubov
|
||||
M: oakad@yahoo.com
|
||||
S: Maintained
|
||||
|
||||
TI OMAP RANDOM NUMBER GENERATOR SUPPORT
|
||||
P: Deepak Saxena
|
||||
M: dsaxena@plexity.net
|
||||
|
@ -3377,12 +3448,6 @@ M: Henk.Vergonet@gmail.com
|
|||
L: usbb2k-api-dev@nongnu.org
|
||||
S: Maintained
|
||||
|
||||
YMFPCI YAMAHA PCI SOUND (Use ALSA instead)
|
||||
P: Pete Zaitcev
|
||||
M: zaitcev@yahoo.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Obsolete
|
||||
|
||||
Z8530 DRIVER FOR AX.25
|
||||
P: Joerg Reuter
|
||||
M: jreuter@yaina.de
|
||||
|
|
16
Makefile
16
Makefile
|
@ -1,7 +1,7 @@
|
|||
VERSION = 2
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 18
|
||||
EXTRAVERSION =
|
||||
SUBLEVEL = 19
|
||||
EXTRAVERSION =-rc2
|
||||
NAME=Avast! A bilge rat!
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
@ -741,6 +741,9 @@ endif # ifdef CONFIG_KALLSYMS
|
|||
|
||||
# vmlinux image - including updated kernel symbols
|
||||
vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o) FORCE
|
||||
ifdef CONFIG_HEADERS_CHECK
|
||||
$(Q)$(MAKE) -f $(srctree)/Makefile headers_check
|
||||
endif
|
||||
$(call if_changed_rule,vmlinux__)
|
||||
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost $@
|
||||
$(Q)rm -f .old_version
|
||||
|
@ -932,7 +935,7 @@ headers_install_all: include/linux/version.h scripts_basic FORCE
|
|||
|
||||
PHONY += headers_install
|
||||
headers_install: include/linux/version.h scripts_basic FORCE
|
||||
@if [ ! -r include/asm-$(ARCH)/Kbuild ]; then \
|
||||
@if [ ! -r $(srctree)/include/asm-$(ARCH)/Kbuild ]; then \
|
||||
echo '*** Error: Headers not exportable for this architecture ($(ARCH))'; \
|
||||
exit 1 ; fi
|
||||
$(Q)$(MAKE) $(build)=scripts scripts/unifdef
|
||||
|
@ -1316,12 +1319,13 @@ define xtags
|
|||
$(all-sources) | xargs $1 -a \
|
||||
-I __initdata,__exitdata,__acquires,__releases \
|
||||
-I EXPORT_SYMBOL,EXPORT_SYMBOL_GPL \
|
||||
--extra=+f --c-kinds=+px; \
|
||||
--extra=+f --c-kinds=+px \
|
||||
--regex-asm='/ENTRY\(([^)]*)\).*/\1/'; \
|
||||
$(all-kconfigs) | xargs $1 -a \
|
||||
--langdef=kconfig \
|
||||
--language-force=kconfig \
|
||||
--regex-kconfig='/^[[:blank:]]*config[[:blank:]]+([[:alnum:]_]+)/\1/'; \
|
||||
$(all-defconfigs) | xargs $1 -a \
|
||||
$(all-defconfigs) | xargs -r $1 -a \
|
||||
--langdef=dotconfig \
|
||||
--language-force=dotconfig \
|
||||
--regex-dotconfig='/^#?[[:blank:]]*(CONFIG_[[:alnum:]_]+)/\1/'; \
|
||||
|
@ -1329,7 +1333,7 @@ define xtags
|
|||
$(all-sources) | xargs $1 -a; \
|
||||
$(all-kconfigs) | xargs $1 -a \
|
||||
--regex='/^[ \t]*config[ \t]+\([a-zA-Z0-9_]+\)/\1/'; \
|
||||
$(all-defconfigs) | xargs $1 -a \
|
||||
$(all-defconfigs) | xargs -r $1 -a \
|
||||
--regex='/^#?[ \t]?\(CONFIG_[a-zA-Z0-9_]+\)/\1/'; \
|
||||
else \
|
||||
$(all-sources) | xargs $1 -a; \
|
||||
|
|
|
@ -6,40 +6,13 @@
|
|||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/user.h>
|
||||
#include <linux/elfcore.h>
|
||||
#include <linux/socket.h>
|
||||
#include <linux/syscalls.h>
|
||||
#include <linux/in.h>
|
||||
#include <linux/in6.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/screen_info.h>
|
||||
#include <linux/tty.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/console.h>
|
||||
#include <asm/hwrpb.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/checksum.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <asm/fpu.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/machvec.h>
|
||||
#include <asm/pgalloc.h>
|
||||
#include <asm/semaphore.h>
|
||||
#include <asm/tlbflush.h>
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/vga.h>
|
||||
|
||||
#include <asm/unistd.h>
|
||||
|
||||
extern struct hwrpb_struct *hwrpb;
|
||||
extern spinlock_t rtc_lock;
|
||||
#include <linux/syscalls.h>
|
||||
|
||||
/* these are C runtime functions with special calling conventions: */
|
||||
extern void __divl (void);
|
||||
|
@ -52,14 +25,9 @@ extern void __divqu (void);
|
|||
extern void __remqu (void);
|
||||
|
||||
EXPORT_SYMBOL(alpha_mv);
|
||||
EXPORT_SYMBOL(screen_info);
|
||||
EXPORT_SYMBOL(perf_irq);
|
||||
EXPORT_SYMBOL(callback_getenv);
|
||||
EXPORT_SYMBOL(callback_setenv);
|
||||
EXPORT_SYMBOL(callback_save_env);
|
||||
#ifdef CONFIG_ALPHA_GENERIC
|
||||
EXPORT_SYMBOL(alpha_using_srm);
|
||||
#endif /* CONFIG_ALPHA_GENERIC */
|
||||
|
||||
/* platform dependent support */
|
||||
EXPORT_SYMBOL(strcat);
|
||||
|
@ -77,47 +45,14 @@ EXPORT_SYMBOL(__constant_c_memset);
|
|||
EXPORT_SYMBOL(copy_page);
|
||||
EXPORT_SYMBOL(clear_page);
|
||||
|
||||
EXPORT_SYMBOL(__direct_map_base);
|
||||
EXPORT_SYMBOL(__direct_map_size);
|
||||
|
||||
#ifdef CONFIG_PCI
|
||||
EXPORT_SYMBOL(pci_alloc_consistent);
|
||||
EXPORT_SYMBOL(pci_free_consistent);
|
||||
EXPORT_SYMBOL(pci_map_single);
|
||||
EXPORT_SYMBOL(pci_map_page);
|
||||
EXPORT_SYMBOL(pci_unmap_single);
|
||||
EXPORT_SYMBOL(pci_unmap_page);
|
||||
EXPORT_SYMBOL(pci_map_sg);
|
||||
EXPORT_SYMBOL(pci_unmap_sg);
|
||||
EXPORT_SYMBOL(pci_dma_supported);
|
||||
EXPORT_SYMBOL(pci_dac_dma_supported);
|
||||
EXPORT_SYMBOL(pci_dac_page_to_dma);
|
||||
EXPORT_SYMBOL(pci_dac_dma_to_page);
|
||||
EXPORT_SYMBOL(pci_dac_dma_to_offset);
|
||||
EXPORT_SYMBOL(alpha_gendev_to_pci);
|
||||
#endif
|
||||
EXPORT_SYMBOL(dma_set_mask);
|
||||
|
||||
EXPORT_SYMBOL(dump_thread);
|
||||
EXPORT_SYMBOL(dump_elf_thread);
|
||||
EXPORT_SYMBOL(dump_elf_task);
|
||||
EXPORT_SYMBOL(dump_elf_task_fp);
|
||||
EXPORT_SYMBOL(hwrpb);
|
||||
EXPORT_SYMBOL(start_thread);
|
||||
EXPORT_SYMBOL(alpha_read_fp_reg);
|
||||
EXPORT_SYMBOL(alpha_read_fp_reg_s);
|
||||
EXPORT_SYMBOL(alpha_write_fp_reg);
|
||||
EXPORT_SYMBOL(alpha_write_fp_reg_s);
|
||||
|
||||
/* In-kernel system calls. */
|
||||
/* entry.S */
|
||||
EXPORT_SYMBOL(kernel_thread);
|
||||
EXPORT_SYMBOL(sys_dup);
|
||||
EXPORT_SYMBOL(sys_exit);
|
||||
EXPORT_SYMBOL(sys_write);
|
||||
EXPORT_SYMBOL(sys_lseek);
|
||||
EXPORT_SYMBOL(kernel_execve);
|
||||
EXPORT_SYMBOL(sys_setsid);
|
||||
EXPORT_SYMBOL(sys_wait4);
|
||||
|
||||
/* Networking helper routines. */
|
||||
EXPORT_SYMBOL(csum_tcpudp_magic);
|
||||
|
@ -134,10 +69,6 @@ EXPORT_SYMBOL(alpha_fp_emul_imprecise);
|
|||
EXPORT_SYMBOL(alpha_fp_emul);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ALPHA_BROKEN_IRQ_MASK
|
||||
EXPORT_SYMBOL(__min_ipl);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* The following are specially called from the uaccess assembly stubs.
|
||||
*/
|
||||
|
@ -160,26 +91,9 @@ EXPORT_SYMBOL(up);
|
|||
*/
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
EXPORT_SYMBOL(flush_tlb_mm);
|
||||
EXPORT_SYMBOL(flush_tlb_range);
|
||||
EXPORT_SYMBOL(flush_tlb_page);
|
||||
EXPORT_SYMBOL(smp_imb);
|
||||
EXPORT_SYMBOL(cpu_data);
|
||||
EXPORT_SYMBOL(smp_num_cpus);
|
||||
EXPORT_SYMBOL(smp_call_function);
|
||||
EXPORT_SYMBOL(smp_call_function_on_cpu);
|
||||
EXPORT_SYMBOL(_atomic_dec_and_lock);
|
||||
#endif /* CONFIG_SMP */
|
||||
|
||||
/*
|
||||
* NUMA specific symbols
|
||||
*/
|
||||
#ifdef CONFIG_DISCONTIGMEM
|
||||
EXPORT_SYMBOL(node_data);
|
||||
#endif /* CONFIG_DISCONTIGMEM */
|
||||
|
||||
EXPORT_SYMBOL(rtc_lock);
|
||||
|
||||
/*
|
||||
* The following are special because they're not called
|
||||
* explicitly (the C compiler or assembler generates them in
|
||||
|
@ -200,8 +114,3 @@ EXPORT_SYMBOL(__remqu);
|
|||
EXPORT_SYMBOL(memcpy);
|
||||
EXPORT_SYMBOL(memset);
|
||||
EXPORT_SYMBOL(memchr);
|
||||
|
||||
#ifdef CONFIG_ALPHA_IRONGATE
|
||||
EXPORT_SYMBOL(irongate_ioremap);
|
||||
EXPORT_SYMBOL(irongate_iounmap);
|
||||
#endif
|
||||
|
|
|
@ -387,8 +387,7 @@ apecs_pci_clr_err(void)
|
|||
}
|
||||
|
||||
void
|
||||
apecs_machine_check(unsigned long vector, unsigned long la_ptr,
|
||||
struct pt_regs * regs)
|
||||
apecs_machine_check(unsigned long vector, unsigned long la_ptr)
|
||||
{
|
||||
struct el_common *mchk_header;
|
||||
struct el_apecs_procdata *mchk_procdata;
|
||||
|
@ -412,7 +411,7 @@ apecs_machine_check(unsigned long vector, unsigned long la_ptr,
|
|||
wrmces(0x7); /* reset machine check pending flag */
|
||||
mb();
|
||||
|
||||
process_mcheck_info(vector, la_ptr, regs, "APECS",
|
||||
process_mcheck_info(vector, la_ptr, "APECS",
|
||||
(mcheck_expected(0)
|
||||
&& (mchk_sysdata->epic_dcsr & 0x0c00UL)));
|
||||
}
|
||||
|
|
|
@ -1192,8 +1192,7 @@ cia_decode_mchk(unsigned long la_ptr)
|
|||
}
|
||||
|
||||
void
|
||||
cia_machine_check(unsigned long vector, unsigned long la_ptr,
|
||||
struct pt_regs * regs)
|
||||
cia_machine_check(unsigned long vector, unsigned long la_ptr)
|
||||
{
|
||||
int expected;
|
||||
|
||||
|
@ -1208,5 +1207,5 @@ cia_machine_check(unsigned long vector, unsigned long la_ptr,
|
|||
expected = mcheck_expected(0);
|
||||
if (!expected && vector == 0x660)
|
||||
expected = cia_decode_mchk(la_ptr);
|
||||
process_mcheck_info(vector, la_ptr, regs, "CIA", expected);
|
||||
process_mcheck_info(vector, la_ptr, "CIA", expected);
|
||||
}
|
||||
|
|
|
@ -404,6 +404,7 @@ irongate_ioremap(unsigned long addr, unsigned long size)
|
|||
#endif
|
||||
return (void __iomem *)vaddr;
|
||||
}
|
||||
EXPORT_SYMBOL(irongate_ioremap);
|
||||
|
||||
void
|
||||
irongate_iounmap(volatile void __iomem *xaddr)
|
||||
|
@ -414,3 +415,4 @@ irongate_iounmap(volatile void __iomem *xaddr)
|
|||
if (addr)
|
||||
return vfree((void *)(PAGE_MASK & addr));
|
||||
}
|
||||
EXPORT_SYMBOL(irongate_iounmap);
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
#include <linux/tty.h>
|
||||
|
||||
#include <asm/ptrace.h>
|
||||
#include <asm/irq_regs.h>
|
||||
#include <asm/smp.h>
|
||||
|
||||
#include "proto.h"
|
||||
|
@ -386,8 +387,7 @@ ioc_error(__u32 stat0, __u32 stat1)
|
|||
}
|
||||
|
||||
void
|
||||
lca_machine_check(unsigned long vector, unsigned long la_ptr,
|
||||
struct pt_regs *regs)
|
||||
lca_machine_check(unsigned long vector, unsigned long la_ptr)
|
||||
{
|
||||
const char * reason;
|
||||
union el_lca el;
|
||||
|
@ -397,7 +397,7 @@ lca_machine_check(unsigned long vector, unsigned long la_ptr,
|
|||
wrmces(rdmces()); /* reset machine check pending flag */
|
||||
|
||||
printk(KERN_CRIT "LCA machine check: vector=%#lx pc=%#lx code=%#x\n",
|
||||
vector, regs->pc, (unsigned int) el.c->code);
|
||||
vector, get_irq_regs()->pc, (unsigned int) el.c->code);
|
||||
|
||||
/*
|
||||
* The first quadword after the common header always seems to
|
||||
|
|
|
@ -572,8 +572,7 @@ mcpcia_print_system_area(unsigned long la_ptr)
|
|||
}
|
||||
|
||||
void
|
||||
mcpcia_machine_check(unsigned long vector, unsigned long la_ptr,
|
||||
struct pt_regs * regs)
|
||||
mcpcia_machine_check(unsigned long vector, unsigned long la_ptr)
|
||||
{
|
||||
struct el_common *mchk_header;
|
||||
struct el_MCPCIA_uncorrected_frame_mcheck *mchk_logout;
|
||||
|
@ -610,7 +609,7 @@ mcpcia_machine_check(unsigned long vector, unsigned long la_ptr,
|
|||
wrmces(0x7);
|
||||
mb();
|
||||
|
||||
process_mcheck_info(vector, la_ptr, regs, "MCPCIA", expected != 0);
|
||||
process_mcheck_info(vector, la_ptr, "MCPCIA", expected != 0);
|
||||
if (!expected && vector != 0x620 && vector != 0x630) {
|
||||
mcpcia_print_uncorrectable(mchk_logout);
|
||||
mcpcia_print_system_area(la_ptr);
|
||||
|
|
|
@ -187,8 +187,7 @@ polaris_pci_clr_err(void)
|
|||
}
|
||||
|
||||
void
|
||||
polaris_machine_check(unsigned long vector, unsigned long la_ptr,
|
||||
struct pt_regs * regs)
|
||||
polaris_machine_check(unsigned long vector, unsigned long la_ptr)
|
||||
{
|
||||
/* Clear the error before any reporting. */
|
||||
mb();
|
||||
|
@ -198,6 +197,6 @@ polaris_machine_check(unsigned long vector, unsigned long la_ptr,
|
|||
wrmces(0x7);
|
||||
mb();
|
||||
|
||||
process_mcheck_info(vector, la_ptr, regs, "POLARIS",
|
||||
process_mcheck_info(vector, la_ptr, "POLARIS",
|
||||
mcheck_expected(0));
|
||||
}
|
||||
|
|
|
@ -551,8 +551,7 @@ t2_clear_errors(int cpu)
|
|||
* Hence all the taken/expected/any_expected/last_taken stuff...
|
||||
*/
|
||||
void
|
||||
t2_machine_check(unsigned long vector, unsigned long la_ptr,
|
||||
struct pt_regs * regs)
|
||||
t2_machine_check(unsigned long vector, unsigned long la_ptr)
|
||||
{
|
||||
int cpu = smp_processor_id();
|
||||
#ifdef CONFIG_VERBOSE_MCHECK
|
||||
|
@ -618,5 +617,5 @@ t2_machine_check(unsigned long vector, unsigned long la_ptr,
|
|||
}
|
||||
#endif
|
||||
|
||||
process_mcheck_info(vector, la_ptr, regs, "T2", mcheck_expected(cpu));
|
||||
process_mcheck_info(vector, la_ptr, "T2", mcheck_expected(cpu));
|
||||
}
|
||||
|
|
|
@ -443,8 +443,7 @@ tsunami_pci_clr_err(void)
|
|||
}
|
||||
|
||||
void
|
||||
tsunami_machine_check(unsigned long vector, unsigned long la_ptr,
|
||||
struct pt_regs * regs)
|
||||
tsunami_machine_check(unsigned long vector, unsigned long la_ptr)
|
||||
{
|
||||
/* Clear error before any reporting. */
|
||||
mb();
|
||||
|
@ -454,6 +453,6 @@ tsunami_machine_check(unsigned long vector, unsigned long la_ptr,
|
|||
wrmces(0x7);
|
||||
mb();
|
||||
|
||||
process_mcheck_info(vector, la_ptr, regs, "TSUNAMI",
|
||||
process_mcheck_info(vector, la_ptr, "TSUNAMI",
|
||||
mcheck_expected(smp_processor_id()));
|
||||
}
|
||||
|
|
|
@ -322,8 +322,7 @@ wildfire_init_arch(void)
|
|||
}
|
||||
|
||||
void
|
||||
wildfire_machine_check(unsigned long vector, unsigned long la_ptr,
|
||||
struct pt_regs * regs)
|
||||
wildfire_machine_check(unsigned long vector, unsigned long la_ptr)
|
||||
{
|
||||
mb();
|
||||
mb(); /* magic */
|
||||
|
@ -332,7 +331,7 @@ wildfire_machine_check(unsigned long vector, unsigned long la_ptr,
|
|||
wrmces(0x7);
|
||||
mb();
|
||||
|
||||
process_mcheck_info(vector, la_ptr, regs, "WILDFIRE",
|
||||
process_mcheck_info(vector, la_ptr, "WILDFIRE",
|
||||
mcheck_expected(smp_processor_id()));
|
||||
}
|
||||
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
#include <linux/sched.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/irq_regs.h>
|
||||
#include <asm/hwrpb.h>
|
||||
#include <asm/smp.h>
|
||||
#include <asm/err_common.h>
|
||||
|
@ -229,7 +230,7 @@ ev6_process_logout_frame(struct el_common *mchk_header, int print)
|
|||
}
|
||||
|
||||
void
|
||||
ev6_machine_check(u64 vector, u64 la_ptr, struct pt_regs *regs)
|
||||
ev6_machine_check(u64 vector, u64 la_ptr)
|
||||
{
|
||||
struct el_common *mchk_header = (struct el_common *)la_ptr;
|
||||
|
||||
|
@ -260,7 +261,7 @@ ev6_machine_check(u64 vector, u64 la_ptr, struct pt_regs *regs)
|
|||
(unsigned int)vector, (int)smp_processor_id());
|
||||
|
||||
ev6_process_logout_frame(mchk_header, 1);
|
||||
dik_show_regs(regs, NULL);
|
||||
dik_show_regs(get_irq_regs(), NULL);
|
||||
|
||||
err_print_prefix = saved_err_prefix;
|
||||
}
|
||||
|
|
|
@ -118,7 +118,7 @@ ev7_collect_logout_frame_subpackets(struct el_subpacket *el_ptr,
|
|||
}
|
||||
|
||||
void
|
||||
ev7_machine_check(u64 vector, u64 la_ptr, struct pt_regs *regs)
|
||||
ev7_machine_check(u64 vector, u64 la_ptr)
|
||||
{
|
||||
struct el_subpacket *el_ptr = (struct el_subpacket *)la_ptr;
|
||||
char *saved_err_prefix = err_print_prefix;
|
||||
|
|
|
@ -60,26 +60,26 @@ extern struct ev7_lf_subpackets *
|
|||
ev7_collect_logout_frame_subpackets(struct el_subpacket *,
|
||||
struct ev7_lf_subpackets *);
|
||||
extern void ev7_register_error_handlers(void);
|
||||
extern void ev7_machine_check(u64, u64, struct pt_regs *);
|
||||
extern void ev7_machine_check(u64, u64);
|
||||
|
||||
/*
|
||||
* err_ev6.c
|
||||
*/
|
||||
extern void ev6_register_error_handlers(void);
|
||||
extern int ev6_process_logout_frame(struct el_common *, int);
|
||||
extern void ev6_machine_check(u64, u64, struct pt_regs *);
|
||||
extern void ev6_machine_check(u64, u64);
|
||||
|
||||
/*
|
||||
* err_marvel.c
|
||||
*/
|
||||
extern void marvel_machine_check(u64, u64, struct pt_regs *);
|
||||
extern void marvel_machine_check(u64, u64);
|
||||
extern void marvel_register_error_handlers(void);
|
||||
|
||||
/*
|
||||
* err_titan.c
|
||||
*/
|
||||
extern int titan_process_logout_frame(struct el_common *, int);
|
||||
extern void titan_machine_check(u64, u64, struct pt_regs *);
|
||||
extern void titan_machine_check(u64, u64);
|
||||
extern void titan_register_error_handlers(void);
|
||||
extern int privateer_process_logout_frame(struct el_common *, int);
|
||||
extern void privateer_machine_check(u64, u64, struct pt_regs *);
|
||||
extern void privateer_machine_check(u64, u64);
|
||||
|
|
|
@ -1042,7 +1042,7 @@ marvel_process_logout_frame(struct ev7_lf_subpackets *lf_subpackets, int print)
|
|||
}
|
||||
|
||||
void
|
||||
marvel_machine_check(u64 vector, u64 la_ptr, struct pt_regs *regs)
|
||||
marvel_machine_check(u64 vector, u64 la_ptr)
|
||||
{
|
||||
struct el_subpacket *el_ptr = (struct el_subpacket *)la_ptr;
|
||||
int (*process_frame)(struct ev7_lf_subpackets *, int) = NULL;
|
||||
|
@ -1077,7 +1077,7 @@ marvel_machine_check(u64 vector, u64 la_ptr, struct pt_regs *regs)
|
|||
|
||||
default:
|
||||
/* Don't know it - pass it up. */
|
||||
ev7_machine_check(vector, la_ptr, regs);
|
||||
ev7_machine_check(vector, la_ptr);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -379,7 +379,7 @@ titan_process_logout_frame(struct el_common *mchk_header, int print)
|
|||
}
|
||||
|
||||
void
|
||||
titan_machine_check(u64 vector, u64 la_ptr, struct pt_regs *regs)
|
||||
titan_machine_check(u64 vector, u64 la_ptr)
|
||||
{
|
||||
struct el_common *mchk_header = (struct el_common *)la_ptr;
|
||||
struct el_TITAN_sysdata_mcheck *tmchk =
|
||||
|
@ -408,7 +408,7 @@ titan_machine_check(u64 vector, u64 la_ptr, struct pt_regs *regs)
|
|||
* Only handle system errors here
|
||||
*/
|
||||
if ((vector != SCB_Q_SYSMCHK) && (vector != SCB_Q_SYSERR)) {
|
||||
ev6_machine_check(vector, la_ptr, regs);
|
||||
ev6_machine_check(vector, la_ptr);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -442,7 +442,7 @@ titan_machine_check(u64 vector, u64 la_ptr, struct pt_regs *regs)
|
|||
#ifdef CONFIG_VERBOSE_MCHECK
|
||||
titan_process_logout_frame(mchk_header, alpha_verbose_mcheck);
|
||||
if (alpha_verbose_mcheck)
|
||||
dik_show_regs(regs, NULL);
|
||||
dik_show_regs(get_irq_regs(), NULL);
|
||||
#endif /* CONFIG_VERBOSE_MCHECK */
|
||||
|
||||
err_print_prefix = saved_err_prefix;
|
||||
|
@ -452,7 +452,7 @@ titan_machine_check(u64 vector, u64 la_ptr, struct pt_regs *regs)
|
|||
* machine checks to interrupts
|
||||
*/
|
||||
irqmask = tmchk->c_dirx & TITAN_MCHECK_INTERRUPT_MASK;
|
||||
titan_dispatch_irqs(irqmask, regs);
|
||||
titan_dispatch_irqs(irqmask);
|
||||
}
|
||||
|
||||
|
||||
|
@ -701,7 +701,7 @@ privateer_process_logout_frame(struct el_common *mchk_header, int print)
|
|||
}
|
||||
|
||||
void
|
||||
privateer_machine_check(u64 vector, u64 la_ptr, struct pt_regs *regs)
|
||||
privateer_machine_check(u64 vector, u64 la_ptr)
|
||||
{
|
||||
struct el_common *mchk_header = (struct el_common *)la_ptr;
|
||||
struct el_TITAN_sysdata_mcheck *tmchk =
|
||||
|
@ -723,7 +723,7 @@ privateer_machine_check(u64 vector, u64 la_ptr, struct pt_regs *regs)
|
|||
* Only handle system events here.
|
||||
*/
|
||||
if (vector != SCB_Q_SYSEVENT)
|
||||
return titan_machine_check(vector, la_ptr, regs);
|
||||
return titan_machine_check(vector, la_ptr);
|
||||
|
||||
/*
|
||||
* Report the event - System Events should be reported even if no
|
||||
|
@ -746,7 +746,7 @@ privateer_machine_check(u64 vector, u64 la_ptr, struct pt_regs *regs)
|
|||
/*
|
||||
* Dispatch the interrupt(s).
|
||||
*/
|
||||
titan_dispatch_irqs(irqmask, regs);
|
||||
titan_dispatch_irqs(irqmask);
|
||||
|
||||
/*
|
||||
* Release the logout frame.
|
||||
|
|
|
@ -127,7 +127,7 @@ show_interrupts(struct seq_file *p, void *v)
|
|||
#define MAX_ILLEGAL_IRQS 16
|
||||
|
||||
void
|
||||
handle_irq(int irq, struct pt_regs * regs)
|
||||
handle_irq(int irq)
|
||||
{
|
||||
/*
|
||||
* We ack quickly, we don't want the irq controller
|
||||
|
@ -157,6 +157,6 @@ handle_irq(int irq, struct pt_regs * regs)
|
|||
* at IPL 0.
|
||||
*/
|
||||
local_irq_disable();
|
||||
__do_IRQ(irq, regs);
|
||||
__do_IRQ(irq);
|
||||
irq_exit();
|
||||
}
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
#include <linux/sched.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/kernel_stat.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
#include <asm/machvec.h>
|
||||
#include <asm/dma.h>
|
||||
|
@ -16,6 +17,7 @@
|
|||
/* Hack minimum IPL during interrupt processing for broken hardware. */
|
||||
#ifdef CONFIG_ALPHA_BROKEN_IRQ_MASK
|
||||
int __min_ipl;
|
||||
EXPORT_SYMBOL(__min_ipl);
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
@ -30,6 +32,7 @@ dummy_perf(unsigned long vector, struct pt_regs *regs)
|
|||
}
|
||||
|
||||
void (*perf_irq)(unsigned long, struct pt_regs *) = dummy_perf;
|
||||
EXPORT_SYMBOL(perf_irq);
|
||||
|
||||
/*
|
||||
* The main interrupt entry point.
|
||||
|
@ -39,6 +42,7 @@ asmlinkage void
|
|||
do_entInt(unsigned long type, unsigned long vector,
|
||||
unsigned long la_ptr, struct pt_regs *regs)
|
||||
{
|
||||
struct pt_regs *old_regs;
|
||||
switch (type) {
|
||||
case 0:
|
||||
#ifdef CONFIG_SMP
|
||||
|
@ -51,6 +55,7 @@ do_entInt(unsigned long type, unsigned long vector,
|
|||
#endif
|
||||
break;
|
||||
case 1:
|
||||
old_regs = set_irq_regs(regs);
|
||||
#ifdef CONFIG_SMP
|
||||
{
|
||||
long cpu;
|
||||
|
@ -61,18 +66,23 @@ do_entInt(unsigned long type, unsigned long vector,
|
|||
if (cpu != boot_cpuid) {
|
||||
kstat_cpu(cpu).irqs[RTC_IRQ]++;
|
||||
} else {
|
||||
handle_irq(RTC_IRQ, regs);
|
||||
handle_irq(RTC_IRQ);
|
||||
}
|
||||
}
|
||||
#else
|
||||
handle_irq(RTC_IRQ, regs);
|
||||
handle_irq(RTC_IRQ);
|
||||
#endif
|
||||
set_irq_regs(old_regs);
|
||||
return;
|
||||
case 2:
|
||||
alpha_mv.machine_check(vector, la_ptr, regs);
|
||||
old_regs = set_irq_regs(regs);
|
||||
alpha_mv.machine_check(vector, la_ptr);
|
||||
set_irq_regs(old_regs);
|
||||
return;
|
||||
case 3:
|
||||
alpha_mv.device_interrupt(vector, regs);
|
||||
old_regs = set_irq_regs(regs);
|
||||
alpha_mv.device_interrupt(vector);
|
||||
set_irq_regs(old_regs);
|
||||
return;
|
||||
case 4:
|
||||
perf_irq(la_ptr, regs);
|
||||
|
@ -120,8 +130,7 @@ struct mcheck_info __mcheck_info;
|
|||
|
||||
void
|
||||
process_mcheck_info(unsigned long vector, unsigned long la_ptr,
|
||||
struct pt_regs *regs, const char *machine,
|
||||
int expected)
|
||||
const char *machine, int expected)
|
||||
{
|
||||
struct el_common *mchk_header;
|
||||
const char *reason;
|
||||
|
@ -148,7 +157,7 @@ process_mcheck_info(unsigned long vector, unsigned long la_ptr,
|
|||
mchk_header = (struct el_common *)la_ptr;
|
||||
|
||||
printk(KERN_CRIT "%s machine check: vector=0x%lx pc=0x%lx code=0x%x\n",
|
||||
machine, vector, regs->pc, mchk_header->code);
|
||||
machine, vector, get_irq_regs()->pc, mchk_header->code);
|
||||
|
||||
switch (mchk_header->code) {
|
||||
/* Machine check reasons. Defined according to PALcode sources. */
|
||||
|
@ -189,7 +198,7 @@ process_mcheck_info(unsigned long vector, unsigned long la_ptr,
|
|||
printk(KERN_CRIT "machine check type: %s%s\n",
|
||||
reason, mchk_header->retry ? " (retryable)" : "");
|
||||
|
||||
dik_show_regs(regs, NULL);
|
||||
dik_show_regs(get_irq_regs(), NULL);
|
||||
|
||||
#ifdef CONFIG_VERBOSE_MCHECK
|
||||
if (alpha_verbose_mcheck > 1) {
|
||||
|
|
|
@ -137,7 +137,7 @@ init_i8259a_irqs(void)
|
|||
|
||||
#if defined(IACK_SC)
|
||||
void
|
||||
isa_device_interrupt(unsigned long vector, struct pt_regs *regs)
|
||||
isa_device_interrupt(unsigned long vector)
|
||||
{
|
||||
/*
|
||||
* Generate a PCI interrupt acknowledge cycle. The PIC will
|
||||
|
@ -147,13 +147,13 @@ isa_device_interrupt(unsigned long vector, struct pt_regs *regs)
|
|||
*/
|
||||
int j = *(vuip) IACK_SC;
|
||||
j &= 0xff;
|
||||
handle_irq(j, regs);
|
||||
handle_irq(j);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_ALPHA_GENERIC) || !defined(IACK_SC)
|
||||
void
|
||||
isa_no_iack_sc_device_interrupt(unsigned long vector, struct pt_regs *regs)
|
||||
isa_no_iack_sc_device_interrupt(unsigned long vector)
|
||||
{
|
||||
unsigned long pic;
|
||||
|
||||
|
@ -176,7 +176,7 @@ isa_no_iack_sc_device_interrupt(unsigned long vector, struct pt_regs *regs)
|
|||
while (pic) {
|
||||
int j = ffz(~pic);
|
||||
pic &= pic - 1;
|
||||
handle_irq(j, regs);
|
||||
handle_irq(j);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -15,10 +15,10 @@
|
|||
|
||||
#define RTC_IRQ 8
|
||||
|
||||
extern void isa_device_interrupt(unsigned long, struct pt_regs *);
|
||||
extern void isa_no_iack_sc_device_interrupt(unsigned long, struct pt_regs *);
|
||||
extern void srm_device_interrupt(unsigned long, struct pt_regs *);
|
||||
extern void pyxis_device_interrupt(unsigned long, struct pt_regs *);
|
||||
extern void isa_device_interrupt(unsigned long);
|
||||
extern void isa_no_iack_sc_device_interrupt(unsigned long);
|
||||
extern void srm_device_interrupt(unsigned long);
|
||||
extern void pyxis_device_interrupt(unsigned long);
|
||||
|
||||
extern struct irqaction timer_irqaction;
|
||||
extern struct irqaction isa_cascade_irqaction;
|
||||
|
@ -39,4 +39,4 @@ extern void i8259a_end_irq(unsigned int);
|
|||
extern struct hw_interrupt_type i8259a_irq_type;
|
||||
extern void init_i8259a_irqs(void);
|
||||
|
||||
extern void handle_irq(int irq, struct pt_regs * regs);
|
||||
extern void handle_irq(int irq);
|
||||
|
|
|
@ -81,7 +81,7 @@ static struct hw_interrupt_type pyxis_irq_type = {
|
|||
};
|
||||
|
||||
void
|
||||
pyxis_device_interrupt(unsigned long vector, struct pt_regs *regs)
|
||||
pyxis_device_interrupt(unsigned long vector)
|
||||
{
|
||||
unsigned long pld;
|
||||
unsigned int i;
|
||||
|
@ -98,9 +98,9 @@ pyxis_device_interrupt(unsigned long vector, struct pt_regs *regs)
|
|||
i = ffz(~pld);
|
||||
pld &= pld - 1; /* clear least bit set */
|
||||
if (i == 7)
|
||||
isa_device_interrupt(vector, regs);
|
||||
isa_device_interrupt(vector);
|
||||
else
|
||||
handle_irq(16+i, regs);
|
||||
handle_irq(16+i);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -72,8 +72,8 @@ init_srm_irqs(long max, unsigned long ignore_mask)
|
|||
}
|
||||
|
||||
void
|
||||
srm_device_interrupt(unsigned long vector, struct pt_regs * regs)
|
||||
srm_device_interrupt(unsigned long vector)
|
||||
{
|
||||
int irq = (vector - 0x800) >> 4;
|
||||
handle_irq(irq, regs);
|
||||
handle_irq(irq);
|
||||
}
|
||||
|
|
|
@ -201,6 +201,7 @@ dma_set_mask(struct device *dev, u64 mask)
|
|||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(dma_set_mask);
|
||||
|
||||
void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long maxlen)
|
||||
{
|
||||
|
|
|
@ -300,6 +300,7 @@ pci_map_single(struct pci_dev *pdev, void *cpu_addr, size_t size, int dir)
|
|||
dac_allowed = pdev ? pci_dac_dma_supported(pdev, pdev->dma_mask) : 0;
|
||||
return pci_map_single_1(pdev, cpu_addr, size, dac_allowed);
|
||||
}
|
||||
EXPORT_SYMBOL(pci_map_single);
|
||||
|
||||
dma_addr_t
|
||||
pci_map_page(struct pci_dev *pdev, struct page *page, unsigned long offset,
|
||||
|
@ -314,6 +315,7 @@ pci_map_page(struct pci_dev *pdev, struct page *page, unsigned long offset,
|
|||
return pci_map_single_1(pdev, (char *)page_address(page) + offset,
|
||||
size, dac_allowed);
|
||||
}
|
||||
EXPORT_SYMBOL(pci_map_page);
|
||||
|
||||
/* Unmap a single streaming mode DMA translation. The DMA_ADDR and
|
||||
SIZE must match what was provided for in a previous pci_map_single
|
||||
|
@ -379,6 +381,7 @@ pci_unmap_single(struct pci_dev *pdev, dma_addr_t dma_addr, size_t size,
|
|||
DBGA2("pci_unmap_single: sg [%lx,%lx] np %ld from %p\n",
|
||||
dma_addr, size, npages, __builtin_return_address(0));
|
||||
}
|
||||
EXPORT_SYMBOL(pci_unmap_single);
|
||||
|
||||
void
|
||||
pci_unmap_page(struct pci_dev *pdev, dma_addr_t dma_addr,
|
||||
|
@ -386,6 +389,7 @@ pci_unmap_page(struct pci_dev *pdev, dma_addr_t dma_addr,
|
|||
{
|
||||
pci_unmap_single(pdev, dma_addr, size, direction);
|
||||
}
|
||||
EXPORT_SYMBOL(pci_unmap_page);
|
||||
|
||||
/* Allocate and map kernel buffer using consistent mode DMA for PCI
|
||||
device. Returns non-NULL cpu-view pointer to the buffer if
|
||||
|
@ -427,6 +431,7 @@ pci_alloc_consistent(struct pci_dev *pdev, size_t size, dma_addr_t *dma_addrp)
|
|||
|
||||
return cpu_addr;
|
||||
}
|
||||
EXPORT_SYMBOL(pci_alloc_consistent);
|
||||
|
||||
/* Free and unmap a consistent DMA buffer. CPU_ADDR and DMA_ADDR must
|
||||
be values that were returned from pci_alloc_consistent. SIZE must
|
||||
|
@ -444,7 +449,7 @@ pci_free_consistent(struct pci_dev *pdev, size_t size, void *cpu_addr,
|
|||
DBGA2("pci_free_consistent: [%x,%lx] from %p\n",
|
||||
dma_addr, size, __builtin_return_address(0));
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(pci_free_consistent);
|
||||
|
||||
/* Classify the elements of the scatterlist. Write dma_address
|
||||
of each element with:
|
||||
|
@ -672,6 +677,7 @@ pci_map_sg(struct pci_dev *pdev, struct scatterlist *sg, int nents,
|
|||
pci_unmap_sg(pdev, start, out - start, direction);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(pci_map_sg);
|
||||
|
||||
/* Unmap a set of streaming mode DMA translations. Again, cpu read
|
||||
rules concerning calls here are the same as for pci_unmap_single()
|
||||
|
@ -752,6 +758,7 @@ pci_unmap_sg(struct pci_dev *pdev, struct scatterlist *sg, int nents,
|
|||
|
||||
DBGA("pci_unmap_sg: %ld entries\n", nents - (end - sg));
|
||||
}
|
||||
EXPORT_SYMBOL(pci_unmap_sg);
|
||||
|
||||
|
||||
/* Return whether the given PCI device DMA address mask can be
|
||||
|
@ -786,6 +793,7 @@ pci_dma_supported(struct pci_dev *pdev, u64 mask)
|
|||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(pci_dma_supported);
|
||||
|
||||
|
||||
/*
|
||||
|
@ -908,6 +916,7 @@ pci_dac_dma_supported(struct pci_dev *dev, u64 mask)
|
|||
|
||||
return ok;
|
||||
}
|
||||
EXPORT_SYMBOL(pci_dac_dma_supported);
|
||||
|
||||
dma64_addr_t
|
||||
pci_dac_page_to_dma(struct pci_dev *pdev, struct page *page,
|
||||
|
@ -917,6 +926,7 @@ pci_dac_page_to_dma(struct pci_dev *pdev, struct page *page,
|
|||
+ __pa(page_address(page))
|
||||
+ (dma64_addr_t) offset);
|
||||
}
|
||||
EXPORT_SYMBOL(pci_dac_page_to_dma);
|
||||
|
||||
struct page *
|
||||
pci_dac_dma_to_page(struct pci_dev *pdev, dma64_addr_t dma_addr)
|
||||
|
@ -924,13 +934,14 @@ pci_dac_dma_to_page(struct pci_dev *pdev, dma64_addr_t dma_addr)
|
|||
unsigned long paddr = (dma_addr & PAGE_MASK) - alpha_mv.pci_dac_offset;
|
||||
return virt_to_page(__va(paddr));
|
||||
}
|
||||
EXPORT_SYMBOL(pci_dac_dma_to_page);
|
||||
|
||||
unsigned long
|
||||
pci_dac_dma_to_offset(struct pci_dev *pdev, dma64_addr_t dma_addr)
|
||||
{
|
||||
return (dma_addr & ~PAGE_MASK);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(pci_dac_dma_to_offset);
|
||||
|
||||
/* Helper for generic DMA-mapping functions. */
|
||||
|
||||
|
@ -957,6 +968,7 @@ alpha_gendev_to_pci(struct device *dev)
|
|||
/* This assumes ISA bus master with dma_mask 0xffffff. */
|
||||
return NULL;
|
||||
}
|
||||
EXPORT_SYMBOL(alpha_gendev_to_pci);
|
||||
|
||||
int
|
||||
dma_set_mask(struct device *dev, u64 mask)
|
||||
|
@ -969,3 +981,4 @@ dma_set_mask(struct device *dev, u64 mask)
|
|||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(dma_set_mask);
|
||||
|
|
|
@ -205,6 +205,7 @@ start_thread(struct pt_regs * regs, unsigned long pc, unsigned long sp)
|
|||
regs->ps = 8;
|
||||
wrusp(sp);
|
||||
}
|
||||
EXPORT_SYMBOL(start_thread);
|
||||
|
||||
/*
|
||||
* Free current thread data structures etc..
|
||||
|
@ -376,6 +377,7 @@ dump_thread(struct pt_regs * pt, struct user * dump)
|
|||
dump->regs[EF_A2] = pt->r18;
|
||||
memcpy((char *)dump->regs + EF_SIZE, sw->fp, 32 * 8);
|
||||
}
|
||||
EXPORT_SYMBOL(dump_thread);
|
||||
|
||||
/*
|
||||
* Fill in the user structure for a ELF core dump.
|
||||
|
@ -424,6 +426,7 @@ dump_elf_thread(elf_greg_t *dest, struct pt_regs *pt, struct thread_info *ti)
|
|||
useful value of the thread's UNIQUE field. */
|
||||
dest[32] = ti->pcb.unique;
|
||||
}
|
||||
EXPORT_SYMBOL(dump_elf_thread);
|
||||
|
||||
int
|
||||
dump_elf_task(elf_greg_t *dest, struct task_struct *task)
|
||||
|
@ -431,6 +434,7 @@ dump_elf_task(elf_greg_t *dest, struct task_struct *task)
|
|||
dump_elf_thread(dest, task_pt_regs(task), task_thread_info(task));
|
||||
return 1;
|
||||
}
|
||||
EXPORT_SYMBOL(dump_elf_task);
|
||||
|
||||
int
|
||||
dump_elf_task_fp(elf_fpreg_t *dest, struct task_struct *task)
|
||||
|
@ -439,6 +443,7 @@ dump_elf_task_fp(elf_fpreg_t *dest, struct task_struct *task)
|
|||
memcpy(dest, sw->fp, 32 * 8);
|
||||
return 1;
|
||||
}
|
||||
EXPORT_SYMBOL(dump_elf_task_fp);
|
||||
|
||||
/*
|
||||
* sys_execve() executes a new program.
|
||||
|
|
|
@ -20,7 +20,7 @@ struct pci_controller;
|
|||
extern struct pci_ops apecs_pci_ops;
|
||||
extern void apecs_init_arch(void);
|
||||
extern void apecs_pci_clr_err(void);
|
||||
extern void apecs_machine_check(u64, u64, struct pt_regs *);
|
||||
extern void apecs_machine_check(u64, u64);
|
||||
extern void apecs_pci_tbi(struct pci_controller *, dma_addr_t, dma_addr_t);
|
||||
|
||||
/* core_cia.c */
|
||||
|
@ -29,27 +29,27 @@ extern void cia_init_pci(void);
|
|||
extern void cia_init_arch(void);
|
||||
extern void pyxis_init_arch(void);
|
||||
extern void cia_kill_arch(int);
|
||||
extern void cia_machine_check(u64, u64, struct pt_regs *);
|
||||
extern void cia_machine_check(u64, u64);
|
||||
extern void cia_pci_tbi(struct pci_controller *, dma_addr_t, dma_addr_t);
|
||||
|
||||
/* core_irongate.c */
|
||||
extern struct pci_ops irongate_pci_ops;
|
||||
extern int irongate_pci_clr_err(void);
|
||||
extern void irongate_init_arch(void);
|
||||
extern void irongate_machine_check(u64, u64, struct pt_regs *);
|
||||
extern void irongate_machine_check(u64, u64);
|
||||
#define irongate_pci_tbi ((void *)0)
|
||||
|
||||
/* core_lca.c */
|
||||
extern struct pci_ops lca_pci_ops;
|
||||
extern void lca_init_arch(void);
|
||||
extern void lca_machine_check(u64, u64, struct pt_regs *);
|
||||
extern void lca_machine_check(u64, u64);
|
||||
extern void lca_pci_tbi(struct pci_controller *, dma_addr_t, dma_addr_t);
|
||||
|
||||
/* core_marvel.c */
|
||||
extern struct pci_ops marvel_pci_ops;
|
||||
extern void marvel_init_arch(void);
|
||||
extern void marvel_kill_arch(int);
|
||||
extern void marvel_machine_check(u64, u64, struct pt_regs *);
|
||||
extern void marvel_machine_check(u64, u64);
|
||||
extern void marvel_pci_tbi(struct pci_controller *, dma_addr_t, dma_addr_t);
|
||||
extern int marvel_pa_to_nid(unsigned long);
|
||||
extern int marvel_cpuid_to_nid(int);
|
||||
|
@ -64,7 +64,7 @@ void io7_clear_errors(struct io7 *io7);
|
|||
extern struct pci_ops mcpcia_pci_ops;
|
||||
extern void mcpcia_init_arch(void);
|
||||
extern void mcpcia_init_hoses(void);
|
||||
extern void mcpcia_machine_check(u64, u64, struct pt_regs *);
|
||||
extern void mcpcia_machine_check(u64, u64);
|
||||
extern void mcpcia_pci_tbi(struct pci_controller *, dma_addr_t, dma_addr_t);
|
||||
|
||||
/* core_polaris.c */
|
||||
|
@ -72,21 +72,21 @@ extern struct pci_ops polaris_pci_ops;
|
|||
extern int polaris_read_config_dword(struct pci_dev *, int, u32 *);
|
||||
extern int polaris_write_config_dword(struct pci_dev *, int, u32);
|
||||
extern void polaris_init_arch(void);
|
||||
extern void polaris_machine_check(u64, u64, struct pt_regs *);
|
||||
extern void polaris_machine_check(u64, u64);
|
||||
#define polaris_pci_tbi ((void *)0)
|
||||
|
||||
/* core_t2.c */
|
||||
extern struct pci_ops t2_pci_ops;
|
||||
extern void t2_init_arch(void);
|
||||
extern void t2_kill_arch(int);
|
||||
extern void t2_machine_check(u64, u64, struct pt_regs *);
|
||||
extern void t2_machine_check(u64, u64);
|
||||
extern void t2_pci_tbi(struct pci_controller *, dma_addr_t, dma_addr_t);
|
||||
|
||||
/* core_titan.c */
|
||||
extern struct pci_ops titan_pci_ops;
|
||||
extern void titan_init_arch(void);
|
||||
extern void titan_kill_arch(int);
|
||||
extern void titan_machine_check(u64, u64, struct pt_regs *);
|
||||
extern void titan_machine_check(u64, u64);
|
||||
extern void titan_pci_tbi(struct pci_controller *, dma_addr_t, dma_addr_t);
|
||||
extern struct _alpha_agp_info *titan_agp_info(void);
|
||||
|
||||
|
@ -94,14 +94,14 @@ extern struct _alpha_agp_info *titan_agp_info(void);
|
|||
extern struct pci_ops tsunami_pci_ops;
|
||||
extern void tsunami_init_arch(void);
|
||||
extern void tsunami_kill_arch(int);
|
||||
extern void tsunami_machine_check(u64, u64, struct pt_regs *);
|
||||
extern void tsunami_machine_check(u64, u64);
|
||||
extern void tsunami_pci_tbi(struct pci_controller *, dma_addr_t, dma_addr_t);
|
||||
|
||||
/* core_wildfire.c */
|
||||
extern struct pci_ops wildfire_pci_ops;
|
||||
extern void wildfire_init_arch(void);
|
||||
extern void wildfire_kill_arch(int);
|
||||
extern void wildfire_machine_check(u64, u64, struct pt_regs *);
|
||||
extern void wildfire_machine_check(u64, u64);
|
||||
extern void wildfire_pci_tbi(struct pci_controller *, dma_addr_t, dma_addr_t);
|
||||
extern int wildfire_pa_to_nid(unsigned long);
|
||||
extern int wildfire_cpuid_to_nid(int);
|
||||
|
@ -133,7 +133,7 @@ extern void smp_percpu_timer_interrupt(struct pt_regs *);
|
|||
/* extern void reset_for_srm(void); */
|
||||
|
||||
/* time.c */
|
||||
extern irqreturn_t timer_interrupt(int irq, void *dev, struct pt_regs * regs);
|
||||
extern irqreturn_t timer_interrupt(int irq, void *dev);
|
||||
extern void common_init_rtc(void);
|
||||
extern unsigned long est_cycle_freq;
|
||||
|
||||
|
@ -177,7 +177,7 @@ extern void dik_show_regs(struct pt_regs *regs, unsigned long *r9_15);
|
|||
extern void die_if_kernel(char *, struct pt_regs *, long, unsigned long *);
|
||||
|
||||
/* sys_titan.c */
|
||||
extern void titan_dispatch_irqs(u64, struct pt_regs *);
|
||||
extern void titan_dispatch_irqs(u64);
|
||||
|
||||
/* ../mm/init.c */
|
||||
extern void switch_to_system_map(void);
|
||||
|
@ -214,5 +214,4 @@ extern struct mcheck_info
|
|||
#endif
|
||||
|
||||
extern void process_mcheck_info(unsigned long vector, unsigned long la_ptr,
|
||||
struct pt_regs *regs, const char *machine,
|
||||
int expected);
|
||||
const char *machine, int expected);
|
||||
|
|
|
@ -21,7 +21,6 @@
|
|||
#include <linux/a.out.h>
|
||||
#include <linux/screen_info.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/config.h> /* CONFIG_ALPHA_LCA etc */
|
||||
#include <linux/mc146818rtc.h>
|
||||
#include <linux/console.h>
|
||||
#include <linux/cpu.h>
|
||||
|
@ -67,6 +66,7 @@ static struct notifier_block alpha_panic_block = {
|
|||
|
||||
|
||||
struct hwrpb_struct *hwrpb;
|
||||
EXPORT_SYMBOL(hwrpb);
|
||||
unsigned long srm_hae;
|
||||
|
||||
int alpha_l1i_cacheshape;
|
||||
|
@ -112,6 +112,7 @@ unsigned long alpha_agpgart_size = DEFAULT_AGP_APER_SIZE;
|
|||
#ifdef CONFIG_ALPHA_GENERIC
|
||||
struct alpha_machine_vector alpha_mv;
|
||||
int alpha_using_srm;
|
||||
EXPORT_SYMBOL(alpha_using_srm);
|
||||
#endif
|
||||
|
||||
static struct alpha_machine_vector *get_sysvec(unsigned long, unsigned long,
|
||||
|
@ -138,6 +139,8 @@ struct screen_info screen_info = {
|
|||
.orig_video_points = 16
|
||||
};
|
||||
|
||||
EXPORT_SYMBOL(screen_info);
|
||||
|
||||
/*
|
||||
* The direct map I/O window, if any. This should be the same
|
||||
* for all busses, since it's used by virt_to_bus.
|
||||
|
@ -145,6 +148,8 @@ struct screen_info screen_info = {
|
|||
|
||||
unsigned long __direct_map_base;
|
||||
unsigned long __direct_map_size;
|
||||
EXPORT_SYMBOL(__direct_map_base);
|
||||
EXPORT_SYMBOL(__direct_map_size);
|
||||
|
||||
/*
|
||||
* Declare all of the machine vectors.
|
||||
|
|
|
@ -52,6 +52,7 @@
|
|||
|
||||
/* A collection of per-processor data. */
|
||||
struct cpuinfo_alpha cpu_data[NR_CPUS];
|
||||
EXPORT_SYMBOL(cpu_data);
|
||||
|
||||
/* A collection of single bit ipi messages. */
|
||||
static struct {
|
||||
|
@ -74,6 +75,7 @@ EXPORT_SYMBOL(cpu_online_map);
|
|||
|
||||
int smp_num_probed; /* Internal processor count */
|
||||
int smp_num_cpus = 1; /* Number that came online. */
|
||||
EXPORT_SYMBOL(smp_num_cpus);
|
||||
|
||||
extern void calibrate_delay(void);
|
||||
|
||||
|
@ -515,12 +517,15 @@ smp_cpus_done(unsigned int max_cpus)
|
|||
void
|
||||
smp_percpu_timer_interrupt(struct pt_regs *regs)
|
||||
{
|
||||
struct pt_regs *old_regs;
|
||||
int cpu = smp_processor_id();
|
||||
unsigned long user = user_mode(regs);
|
||||
struct cpuinfo_alpha *data = &cpu_data[cpu];
|
||||
|
||||
old_regs = set_irq_regs(regs);
|
||||
|
||||
/* Record kernel PC. */
|
||||
profile_tick(CPU_PROFILING, regs);
|
||||
profile_tick(CPU_PROFILING);
|
||||
|
||||
if (!--data->prof_counter) {
|
||||
/* We need to make like a normal interrupt -- otherwise
|
||||
|
@ -534,6 +539,7 @@ smp_percpu_timer_interrupt(struct pt_regs *regs)
|
|||
|
||||
irq_exit();
|
||||
}
|
||||
set_irq_regs(old_regs);
|
||||
}
|
||||
|
||||
int __init
|
||||
|
@ -786,6 +792,7 @@ smp_call_function_on_cpu (void (*func) (void *info), void *info, int retry,
|
|||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(smp_call_function_on_cpu);
|
||||
|
||||
int
|
||||
smp_call_function (void (*func) (void *info), void *info, int retry, int wait)
|
||||
|
@ -793,6 +800,7 @@ smp_call_function (void (*func) (void *info), void *info, int retry, int wait)
|
|||
return smp_call_function_on_cpu (func, info, retry, wait,
|
||||
cpu_online_map);
|
||||
}
|
||||
EXPORT_SYMBOL(smp_call_function);
|
||||
|
||||
static void
|
||||
ipi_imb(void *ignored)
|
||||
|
@ -807,6 +815,7 @@ smp_imb(void)
|
|||
if (on_each_cpu(ipi_imb, NULL, 1, 1))
|
||||
printk(KERN_CRIT "smp_imb: timed out\n");
|
||||
}
|
||||
EXPORT_SYMBOL(smp_imb);
|
||||
|
||||
static void
|
||||
ipi_flush_tlb_all(void *ignored)
|
||||
|
@ -862,6 +871,7 @@ flush_tlb_mm(struct mm_struct *mm)
|
|||
|
||||
preempt_enable();
|
||||
}
|
||||
EXPORT_SYMBOL(flush_tlb_mm);
|
||||
|
||||
struct flush_tlb_page_struct {
|
||||
struct vm_area_struct *vma;
|
||||
|
@ -914,6 +924,7 @@ flush_tlb_page(struct vm_area_struct *vma, unsigned long addr)
|
|||
|
||||
preempt_enable();
|
||||
}
|
||||
EXPORT_SYMBOL(flush_tlb_page);
|
||||
|
||||
void
|
||||
flush_tlb_range(struct vm_area_struct *vma, unsigned long start, unsigned long end)
|
||||
|
@ -921,6 +932,7 @@ flush_tlb_range(struct vm_area_struct *vma, unsigned long start, unsigned long e
|
|||
/* On the Alpha we always flush the whole user tlb. */
|
||||
flush_tlb_mm(vma->vm_mm);
|
||||
}
|
||||
EXPORT_SYMBOL(flush_tlb_range);
|
||||
|
||||
static void
|
||||
ipi_flush_icache_page(void *x)
|
||||
|
|
|
@ -100,7 +100,7 @@ static struct hw_interrupt_type alcor_irq_type = {
|
|||
};
|
||||
|
||||
static void
|
||||
alcor_device_interrupt(unsigned long vector, struct pt_regs *regs)
|
||||
alcor_device_interrupt(unsigned long vector)
|
||||
{
|
||||
unsigned long pld;
|
||||
unsigned int i;
|
||||
|
@ -116,9 +116,9 @@ alcor_device_interrupt(unsigned long vector, struct pt_regs *regs)
|
|||
i = ffz(~pld);
|
||||
pld &= pld - 1; /* clear least bit set */
|
||||
if (i == 31) {
|
||||
isa_device_interrupt(vector, regs);
|
||||
isa_device_interrupt(vector);
|
||||
} else {
|
||||
handle_irq(16 + i, regs);
|
||||
handle_irq(16 + i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -82,7 +82,7 @@ static struct hw_interrupt_type cabriolet_irq_type = {
|
|||
};
|
||||
|
||||
static void
|
||||
cabriolet_device_interrupt(unsigned long v, struct pt_regs *r)
|
||||
cabriolet_device_interrupt(unsigned long v)
|
||||
{
|
||||
unsigned long pld;
|
||||
unsigned int i;
|
||||
|
@ -98,15 +98,15 @@ cabriolet_device_interrupt(unsigned long v, struct pt_regs *r)
|
|||
i = ffz(~pld);
|
||||
pld &= pld - 1; /* clear least bit set */
|
||||
if (i == 4) {
|
||||
isa_device_interrupt(v, r);
|
||||
isa_device_interrupt(v);
|
||||
} else {
|
||||
handle_irq(16 + i, r);
|
||||
handle_irq(16 + i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void __init
|
||||
common_init_irq(void (*srm_dev_int)(unsigned long v, struct pt_regs *r))
|
||||
common_init_irq(void (*srm_dev_int)(unsigned long v))
|
||||
{
|
||||
init_i8259a_irqs();
|
||||
|
||||
|
@ -154,18 +154,18 @@ cabriolet_init_irq(void)
|
|||
too invasive though. */
|
||||
|
||||
static void
|
||||
pc164_srm_device_interrupt(unsigned long v, struct pt_regs *r)
|
||||
pc164_srm_device_interrupt(unsigned long v)
|
||||
{
|
||||
__min_ipl = getipl();
|
||||
srm_device_interrupt(v, r);
|
||||
srm_device_interrupt(v);
|
||||
__min_ipl = 0;
|
||||
}
|
||||
|
||||
static void
|
||||
pc164_device_interrupt(unsigned long v, struct pt_regs *r)
|
||||
pc164_device_interrupt(unsigned long v)
|
||||
{
|
||||
__min_ipl = getipl();
|
||||
cabriolet_device_interrupt(v, r);
|
||||
cabriolet_device_interrupt(v);
|
||||
__min_ipl = 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -217,7 +217,7 @@ static struct hw_interrupt_type clipper_irq_type = {
|
|||
};
|
||||
|
||||
static void
|
||||
dp264_device_interrupt(unsigned long vector, struct pt_regs * regs)
|
||||
dp264_device_interrupt(unsigned long vector)
|
||||
{
|
||||
#if 1
|
||||
printk("dp264_device_interrupt: NOT IMPLEMENTED YET!! \n");
|
||||
|
@ -236,9 +236,9 @@ dp264_device_interrupt(unsigned long vector, struct pt_regs * regs)
|
|||
i = ffz(~pld);
|
||||
pld &= pld - 1; /* clear least bit set */
|
||||
if (i == 55)
|
||||
isa_device_interrupt(vector, regs);
|
||||
isa_device_interrupt(vector);
|
||||
else
|
||||
handle_irq(16 + i, 16 + i, regs);
|
||||
handle_irq(16 + i);
|
||||
#if 0
|
||||
TSUNAMI_cchip->dir0.csr = 1UL << i; mb();
|
||||
tmp = TSUNAMI_cchip->dir0.csr;
|
||||
|
@ -248,7 +248,7 @@ dp264_device_interrupt(unsigned long vector, struct pt_regs * regs)
|
|||
}
|
||||
|
||||
static void
|
||||
dp264_srm_device_interrupt(unsigned long vector, struct pt_regs * regs)
|
||||
dp264_srm_device_interrupt(unsigned long vector)
|
||||
{
|
||||
int irq;
|
||||
|
||||
|
@ -268,11 +268,11 @@ dp264_srm_device_interrupt(unsigned long vector, struct pt_regs * regs)
|
|||
if (irq >= 32)
|
||||
irq -= 16;
|
||||
|
||||
handle_irq(irq, regs);
|
||||
handle_irq(irq);
|
||||
}
|
||||
|
||||
static void
|
||||
clipper_srm_device_interrupt(unsigned long vector, struct pt_regs * regs)
|
||||
clipper_srm_device_interrupt(unsigned long vector)
|
||||
{
|
||||
int irq;
|
||||
|
||||
|
@ -290,7 +290,7 @@ clipper_srm_device_interrupt(unsigned long vector, struct pt_regs * regs)
|
|||
*
|
||||
* Eg IRQ 24 is DRIR bit 8, etc, etc
|
||||
*/
|
||||
handle_irq(irq, regs);
|
||||
handle_irq(irq);
|
||||
}
|
||||
|
||||
static void __init
|
||||
|
|
|
@ -80,7 +80,7 @@ static struct hw_interrupt_type eb64p_irq_type = {
|
|||
};
|
||||
|
||||
static void
|
||||
eb64p_device_interrupt(unsigned long vector, struct pt_regs *regs)
|
||||
eb64p_device_interrupt(unsigned long vector)
|
||||
{
|
||||
unsigned long pld;
|
||||
unsigned int i;
|
||||
|
@ -97,9 +97,9 @@ eb64p_device_interrupt(unsigned long vector, struct pt_regs *regs)
|
|||
pld &= pld - 1; /* clear least bit set */
|
||||
|
||||
if (i == 5) {
|
||||
isa_device_interrupt(vector, regs);
|
||||
isa_device_interrupt(vector);
|
||||
} else {
|
||||
handle_irq(16 + i, regs);
|
||||
handle_irq(16 + i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -91,7 +91,7 @@ static struct hw_interrupt_type eiger_irq_type = {
|
|||
};
|
||||
|
||||
static void
|
||||
eiger_device_interrupt(unsigned long vector, struct pt_regs * regs)
|
||||
eiger_device_interrupt(unsigned long vector)
|
||||
{
|
||||
unsigned intstatus;
|
||||
|
||||
|
@ -118,20 +118,20 @@ eiger_device_interrupt(unsigned long vector, struct pt_regs * regs)
|
|||
* despatch an interrupt if it's set.
|
||||
*/
|
||||
|
||||
if (intstatus & 8) handle_irq(16+3, regs);
|
||||
if (intstatus & 4) handle_irq(16+2, regs);
|
||||
if (intstatus & 2) handle_irq(16+1, regs);
|
||||
if (intstatus & 1) handle_irq(16+0, regs);
|
||||
if (intstatus & 8) handle_irq(16+3);
|
||||
if (intstatus & 4) handle_irq(16+2);
|
||||
if (intstatus & 2) handle_irq(16+1);
|
||||
if (intstatus & 1) handle_irq(16+0);
|
||||
} else {
|
||||
isa_device_interrupt(vector, regs);
|
||||
isa_device_interrupt(vector);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
eiger_srm_device_interrupt(unsigned long vector, struct pt_regs * regs)
|
||||
eiger_srm_device_interrupt(unsigned long vector)
|
||||
{
|
||||
int irq = (vector - 0x800) >> 4;
|
||||
handle_irq(irq, regs);
|
||||
handle_irq(irq);
|
||||
}
|
||||
|
||||
static void __init
|
||||
|
|
|
@ -129,7 +129,7 @@ static struct hw_interrupt_type jensen_local_irq_type = {
|
|||
};
|
||||
|
||||
static void
|
||||
jensen_device_interrupt(unsigned long vector, struct pt_regs * regs)
|
||||
jensen_device_interrupt(unsigned long vector)
|
||||
{
|
||||
int irq;
|
||||
|
||||
|
@ -189,7 +189,7 @@ jensen_device_interrupt(unsigned long vector, struct pt_regs * regs)
|
|||
if (cc - last_msg > ((JENSEN_CYCLES_PER_SEC) * 3) ||
|
||||
irq != last_irq) {
|
||||
printk(KERN_CRIT " irq %d count %d cc %u @ %lx\n",
|
||||
irq, count, cc-last_cc, regs->pc);
|
||||
irq, count, cc-last_cc, get_irq_regs()->pc);
|
||||
count = 0;
|
||||
last_msg = cc;
|
||||
last_irq = irq;
|
||||
|
@ -198,7 +198,7 @@ jensen_device_interrupt(unsigned long vector, struct pt_regs * regs)
|
|||
}
|
||||
#endif
|
||||
|
||||
handle_irq(irq, regs);
|
||||
handle_irq(irq);
|
||||
}
|
||||
|
||||
static void __init
|
||||
|
@ -244,7 +244,7 @@ jensen_init_arch(void)
|
|||
}
|
||||
|
||||
static void
|
||||
jensen_machine_check (u64 vector, u64 la, struct pt_regs *regs)
|
||||
jensen_machine_check (u64 vector, u64 la)
|
||||
{
|
||||
printk(KERN_CRIT "Machine check\n");
|
||||
}
|
||||
|
|
|
@ -38,7 +38,7 @@
|
|||
* Interrupt handling.
|
||||
*/
|
||||
static void
|
||||
io7_device_interrupt(unsigned long vector, struct pt_regs * regs)
|
||||
io7_device_interrupt(unsigned long vector)
|
||||
{
|
||||
unsigned int pid;
|
||||
unsigned int irq;
|
||||
|
@ -64,7 +64,7 @@ io7_device_interrupt(unsigned long vector, struct pt_regs * regs)
|
|||
irq &= MARVEL_IRQ_VEC_IRQ_MASK; /* not too many bits */
|
||||
irq |= pid << MARVEL_IRQ_VEC_PE_SHIFT; /* merge the pid */
|
||||
|
||||
handle_irq(irq, regs);
|
||||
handle_irq(irq);
|
||||
}
|
||||
|
||||
static volatile unsigned long *
|
||||
|
|
|
@ -33,7 +33,7 @@
|
|||
|
||||
|
||||
static void
|
||||
miata_srm_device_interrupt(unsigned long vector, struct pt_regs * regs)
|
||||
miata_srm_device_interrupt(unsigned long vector)
|
||||
{
|
||||
int irq;
|
||||
|
||||
|
@ -56,7 +56,7 @@ miata_srm_device_interrupt(unsigned long vector, struct pt_regs * regs)
|
|||
if (irq >= 16)
|
||||
irq = irq + 8;
|
||||
|
||||
handle_irq(irq, regs);
|
||||
handle_irq(irq);
|
||||
}
|
||||
|
||||
static void __init
|
||||
|
|
|
@ -79,7 +79,7 @@ static struct hw_interrupt_type mikasa_irq_type = {
|
|||
};
|
||||
|
||||
static void
|
||||
mikasa_device_interrupt(unsigned long vector, struct pt_regs *regs)
|
||||
mikasa_device_interrupt(unsigned long vector)
|
||||
{
|
||||
unsigned long pld;
|
||||
unsigned int i;
|
||||
|
@ -97,9 +97,9 @@ mikasa_device_interrupt(unsigned long vector, struct pt_regs *regs)
|
|||
i = ffz(~pld);
|
||||
pld &= pld - 1; /* clear least bit set */
|
||||
if (i < 16) {
|
||||
isa_device_interrupt(vector, regs);
|
||||
isa_device_interrupt(vector);
|
||||
} else {
|
||||
handle_irq(i, regs);
|
||||
handle_irq(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -182,8 +182,7 @@ mikasa_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
|
|||
|
||||
#if defined(CONFIG_ALPHA_GENERIC) || !defined(CONFIG_ALPHA_PRIMO)
|
||||
static void
|
||||
mikasa_apecs_machine_check(unsigned long vector, unsigned long la_ptr,
|
||||
struct pt_regs * regs)
|
||||
mikasa_apecs_machine_check(unsigned long vector, unsigned long la_ptr)
|
||||
{
|
||||
#define MCHK_NO_DEVSEL 0x205U
|
||||
#define MCHK_NO_TABT 0x204U
|
||||
|
@ -202,7 +201,7 @@ mikasa_apecs_machine_check(unsigned long vector, unsigned long la_ptr,
|
|||
mb();
|
||||
|
||||
code = mchk_header->code;
|
||||
process_mcheck_info(vector, la_ptr, regs, "MIKASA APECS",
|
||||
process_mcheck_info(vector, la_ptr, "MIKASA APECS",
|
||||
(mcheck_expected(0)
|
||||
&& (code == MCHK_NO_DEVSEL
|
||||
|| code == MCHK_NO_TABT)));
|
||||
|
|
|
@ -124,8 +124,7 @@ naut_sys_machine_check(unsigned long vector, unsigned long la_ptr,
|
|||
in the system. They are analysed separately but all starts here. */
|
||||
|
||||
void
|
||||
nautilus_machine_check(unsigned long vector, unsigned long la_ptr,
|
||||
struct pt_regs *regs)
|
||||
nautilus_machine_check(unsigned long vector, unsigned long la_ptr)
|
||||
{
|
||||
char *mchk_class;
|
||||
|
||||
|
@ -165,7 +164,7 @@ nautilus_machine_check(unsigned long vector, unsigned long la_ptr,
|
|||
else if (vector == SCB_Q_SYSMCHK)
|
||||
mchk_class = "Fatal";
|
||||
else {
|
||||
ev6_machine_check(vector, la_ptr, regs);
|
||||
ev6_machine_check(vector, la_ptr);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -173,7 +172,7 @@ nautilus_machine_check(unsigned long vector, unsigned long la_ptr,
|
|||
"[%s System Machine Check (NMI)]\n",
|
||||
vector, mchk_class);
|
||||
|
||||
naut_sys_machine_check(vector, la_ptr, regs);
|
||||
naut_sys_machine_check(vector, la_ptr, get_irq_regs());
|
||||
|
||||
/* Tell the PALcode to clear the machine check */
|
||||
draina();
|
||||
|
|
|
@ -77,7 +77,7 @@ static struct hw_interrupt_type noritake_irq_type = {
|
|||
};
|
||||
|
||||
static void
|
||||
noritake_device_interrupt(unsigned long vector, struct pt_regs *regs)
|
||||
noritake_device_interrupt(unsigned long vector)
|
||||
{
|
||||
unsigned long pld;
|
||||
unsigned int i;
|
||||
|
@ -96,15 +96,15 @@ noritake_device_interrupt(unsigned long vector, struct pt_regs *regs)
|
|||
i = ffz(~pld);
|
||||
pld &= pld - 1; /* clear least bit set */
|
||||
if (i < 16) {
|
||||
isa_device_interrupt(vector, regs);
|
||||
isa_device_interrupt(vector);
|
||||
} else {
|
||||
handle_irq(i, regs);
|
||||
handle_irq(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
noritake_srm_device_interrupt(unsigned long vector, struct pt_regs * regs)
|
||||
noritake_srm_device_interrupt(unsigned long vector)
|
||||
{
|
||||
int irq;
|
||||
|
||||
|
@ -122,7 +122,7 @@ noritake_srm_device_interrupt(unsigned long vector, struct pt_regs * regs)
|
|||
if (irq >= 16)
|
||||
irq = irq + 1;
|
||||
|
||||
handle_irq(irq, regs);
|
||||
handle_irq(irq);
|
||||
}
|
||||
|
||||
static void __init
|
||||
|
@ -264,8 +264,7 @@ noritake_swizzle(struct pci_dev *dev, u8 *pinp)
|
|||
|
||||
#if defined(CONFIG_ALPHA_GENERIC) || !defined(CONFIG_ALPHA_PRIMO)
|
||||
static void
|
||||
noritake_apecs_machine_check(unsigned long vector, unsigned long la_ptr,
|
||||
struct pt_regs * regs)
|
||||
noritake_apecs_machine_check(unsigned long vector, unsigned long la_ptr)
|
||||
{
|
||||
#define MCHK_NO_DEVSEL 0x205U
|
||||
#define MCHK_NO_TABT 0x204U
|
||||
|
@ -284,7 +283,7 @@ noritake_apecs_machine_check(unsigned long vector, unsigned long la_ptr,
|
|||
mb();
|
||||
|
||||
code = mchk_header->code;
|
||||
process_mcheck_info(vector, la_ptr, regs, "NORITAKE APECS",
|
||||
process_mcheck_info(vector, la_ptr, "NORITAKE APECS",
|
||||
(mcheck_expected(0)
|
||||
&& (code == MCHK_NO_DEVSEL
|
||||
|| code == MCHK_NO_TABT)));
|
||||
|
|
|
@ -134,7 +134,7 @@ static struct hw_interrupt_type rawhide_irq_type = {
|
|||
};
|
||||
|
||||
static void
|
||||
rawhide_srm_device_interrupt(unsigned long vector, struct pt_regs * regs)
|
||||
rawhide_srm_device_interrupt(unsigned long vector)
|
||||
{
|
||||
int irq;
|
||||
|
||||
|
@ -158,7 +158,7 @@ rawhide_srm_device_interrupt(unsigned long vector, struct pt_regs * regs)
|
|||
/* Adjust by which hose it is from. */
|
||||
irq -= ((irq + 16) >> 2) & 0x38;
|
||||
|
||||
handle_irq(irq, regs);
|
||||
handle_irq(irq);
|
||||
}
|
||||
|
||||
static void __init
|
||||
|
|
|
@ -83,7 +83,7 @@ static struct hw_interrupt_type rx164_irq_type = {
|
|||
};
|
||||
|
||||
static void
|
||||
rx164_device_interrupt(unsigned long vector, struct pt_regs *regs)
|
||||
rx164_device_interrupt(unsigned long vector)
|
||||
{
|
||||
unsigned long pld;
|
||||
volatile unsigned int *dirr;
|
||||
|
@ -102,9 +102,9 @@ rx164_device_interrupt(unsigned long vector, struct pt_regs *regs)
|
|||
i = ffz(~pld);
|
||||
pld &= pld - 1; /* clear least bit set */
|
||||
if (i == 20) {
|
||||
isa_no_iack_sc_device_interrupt(vector, regs);
|
||||
isa_no_iack_sc_device_interrupt(vector);
|
||||
} else {
|
||||
handle_irq(16+i, regs);
|
||||
handle_irq(16+i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -512,7 +512,7 @@ static struct hw_interrupt_type sable_lynx_irq_type = {
|
|||
};
|
||||
|
||||
static void
|
||||
sable_lynx_srm_device_interrupt(unsigned long vector, struct pt_regs * regs)
|
||||
sable_lynx_srm_device_interrupt(unsigned long vector)
|
||||
{
|
||||
/* Note that the vector reported by the SRM PALcode corresponds
|
||||
to the interrupt mask bits, but we have to manage via the
|
||||
|
@ -526,7 +526,7 @@ sable_lynx_srm_device_interrupt(unsigned long vector, struct pt_regs * regs)
|
|||
printk("%s: vector 0x%lx bit 0x%x irq 0x%x\n",
|
||||
__FUNCTION__, vector, bit, irq);
|
||||
#endif
|
||||
handle_irq(irq, regs);
|
||||
handle_irq(irq);
|
||||
}
|
||||
|
||||
static void __init
|
||||
|
|
|
@ -85,7 +85,7 @@ static struct hw_interrupt_type takara_irq_type = {
|
|||
};
|
||||
|
||||
static void
|
||||
takara_device_interrupt(unsigned long vector, struct pt_regs *regs)
|
||||
takara_device_interrupt(unsigned long vector)
|
||||
{
|
||||
unsigned intstatus;
|
||||
|
||||
|
@ -112,20 +112,20 @@ takara_device_interrupt(unsigned long vector, struct pt_regs *regs)
|
|||
* despatch an interrupt if it's set.
|
||||
*/
|
||||
|
||||
if (intstatus & 8) handle_irq(16+3, regs);
|
||||
if (intstatus & 4) handle_irq(16+2, regs);
|
||||
if (intstatus & 2) handle_irq(16+1, regs);
|
||||
if (intstatus & 1) handle_irq(16+0, regs);
|
||||
if (intstatus & 8) handle_irq(16+3);
|
||||
if (intstatus & 4) handle_irq(16+2);
|
||||
if (intstatus & 2) handle_irq(16+1);
|
||||
if (intstatus & 1) handle_irq(16+0);
|
||||
} else {
|
||||
isa_device_interrupt (vector, regs);
|
||||
isa_device_interrupt (vector);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
takara_srm_device_interrupt(unsigned long vector, struct pt_regs * regs)
|
||||
takara_srm_device_interrupt(unsigned long vector)
|
||||
{
|
||||
int irq = (vector - 0x800) >> 4;
|
||||
handle_irq(irq, regs);
|
||||
handle_irq(irq);
|
||||
}
|
||||
|
||||
static void __init
|
||||
|
|
|
@ -167,18 +167,18 @@ titan_set_irq_affinity(unsigned int irq, cpumask_t affinity)
|
|||
}
|
||||
|
||||
static void
|
||||
titan_device_interrupt(unsigned long vector, struct pt_regs * regs)
|
||||
titan_device_interrupt(unsigned long vector)
|
||||
{
|
||||
printk("titan_device_interrupt: NOT IMPLEMENTED YET!! \n");
|
||||
}
|
||||
|
||||
static void
|
||||
titan_srm_device_interrupt(unsigned long vector, struct pt_regs * regs)
|
||||
titan_srm_device_interrupt(unsigned long vector)
|
||||
{
|
||||
int irq;
|
||||
|
||||
irq = (vector - 0x800) >> 4;
|
||||
handle_irq(irq, regs);
|
||||
handle_irq(irq);
|
||||
}
|
||||
|
||||
|
||||
|
@ -204,7 +204,7 @@ static struct hw_interrupt_type titan_irq_type = {
|
|||
};
|
||||
|
||||
static irqreturn_t
|
||||
titan_intr_nop(int irq, void *dev_id, struct pt_regs *regs)
|
||||
titan_intr_nop(int irq, void *dev_id)
|
||||
{
|
||||
/*
|
||||
* This is a NOP interrupt handler for the purposes of
|
||||
|
@ -243,7 +243,7 @@ titan_legacy_init_irq(void)
|
|||
}
|
||||
|
||||
void
|
||||
titan_dispatch_irqs(u64 mask, struct pt_regs *regs)
|
||||
titan_dispatch_irqs(u64 mask)
|
||||
{
|
||||
unsigned long vector;
|
||||
|
||||
|
@ -263,7 +263,7 @@ titan_dispatch_irqs(u64 mask, struct pt_regs *regs)
|
|||
vector = 0x900 + (vector << 4); /* convert to SRM vector */
|
||||
|
||||
/* dispatch it */
|
||||
alpha_mv.device_interrupt(vector, regs);
|
||||
alpha_mv.device_interrupt(vector);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -234,7 +234,7 @@ wildfire_init_irq(void)
|
|||
}
|
||||
|
||||
static void
|
||||
wildfire_device_interrupt(unsigned long vector, struct pt_regs * regs)
|
||||
wildfire_device_interrupt(unsigned long vector)
|
||||
{
|
||||
int irq;
|
||||
|
||||
|
@ -246,7 +246,7 @@ wildfire_device_interrupt(unsigned long vector, struct pt_regs * regs)
|
|||
* bits 5-0: irq in PCA
|
||||
*/
|
||||
|
||||
handle_irq(irq, regs);
|
||||
handle_irq(irq);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -4,7 +4,6 @@
|
|||
* The system call table.
|
||||
*/
|
||||
|
||||
#include <linux/config.h> /* CONFIG_OSF4_COMPAT */
|
||||
#include <asm/unistd.h>
|
||||
|
||||
.data
|
||||
|
|
|
@ -57,6 +57,7 @@
|
|||
static int set_rtc_mmss(unsigned long);
|
||||
|
||||
DEFINE_SPINLOCK(rtc_lock);
|
||||
EXPORT_SYMBOL(rtc_lock);
|
||||
|
||||
#define TICK_SIZE (tick_nsec / 1000)
|
||||
|
||||
|
@ -104,7 +105,7 @@ unsigned long long sched_clock(void)
|
|||
* timer_interrupt() needs to keep up the real-time clock,
|
||||
* as well as call the "do_timer()" routine every clocktick
|
||||
*/
|
||||
irqreturn_t timer_interrupt(int irq, void *dev, struct pt_regs * regs)
|
||||
irqreturn_t timer_interrupt(int irq, void *dev)
|
||||
{
|
||||
unsigned long delta;
|
||||
__u32 now;
|
||||
|
@ -112,7 +113,7 @@ irqreturn_t timer_interrupt(int irq, void *dev, struct pt_regs * regs)
|
|||
|
||||
#ifndef CONFIG_SMP
|
||||
/* Not SMP, do kernel PC profiling here. */
|
||||
profile_tick(CPU_PROFILING, regs);
|
||||
profile_tick(CPU_PROFILING);
|
||||
#endif
|
||||
|
||||
write_seqlock(&xtime_lock);
|
||||
|
@ -132,7 +133,7 @@ irqreturn_t timer_interrupt(int irq, void *dev, struct pt_regs * regs)
|
|||
while (nticks > 0) {
|
||||
do_timer(1);
|
||||
#ifndef CONFIG_SMP
|
||||
update_process_times(user_mode(regs));
|
||||
update_process_times(user_mode(get_irq_regs()));
|
||||
#endif
|
||||
nticks--;
|
||||
}
|
||||
|
|
|
@ -13,12 +13,14 @@
|
|||
#include <linux/swap.h>
|
||||
#include <linux/initrd.h>
|
||||
#include <linux/pfn.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
#include <asm/hwrpb.h>
|
||||
#include <asm/pgalloc.h>
|
||||
|
||||
pg_data_t node_data[MAX_NUMNODES];
|
||||
bootmem_data_t node_bdata[MAX_NUMNODES];
|
||||
EXPORT_SYMBOL(node_data);
|
||||
|
||||
#undef DEBUG_DISCONTIG
|
||||
#ifdef DEBUG_DISCONTIG
|
||||
|
|
|
@ -163,8 +163,7 @@ static struct locomo_dev_info locomo_devices[] = {
|
|||
#define LOCOMO_IRQ_LT_START (IRQ_LOCOMO_LT)
|
||||
#define LOCOMO_IRQ_SPI_START (IRQ_LOCOMO_SPI_RFR)
|
||||
|
||||
static void locomo_handler(unsigned int irq, struct irqdesc *desc,
|
||||
struct pt_regs *regs)
|
||||
static void locomo_handler(unsigned int irq, struct irqdesc *desc)
|
||||
{
|
||||
int req, i;
|
||||
struct irqdesc *d;
|
||||
|
@ -182,7 +181,7 @@ static void locomo_handler(unsigned int irq, struct irqdesc *desc,
|
|||
d = irq_desc + irq;
|
||||
for (i = 0; i <= 3; i++, d++, irq++) {
|
||||
if (req & (0x0100 << i)) {
|
||||
desc_handle_irq(irq, d, regs);
|
||||
desc_handle_irq(irq, d);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -218,15 +217,14 @@ static struct irq_chip locomo_chip = {
|
|||
.unmask = locomo_unmask_irq,
|
||||
};
|
||||
|
||||
static void locomo_key_handler(unsigned int irq, struct irqdesc *desc,
|
||||
struct pt_regs *regs)
|
||||
static void locomo_key_handler(unsigned int irq, struct irqdesc *desc)
|
||||
{
|
||||
struct irqdesc *d;
|
||||
void __iomem *mapbase = get_irq_chipdata(irq);
|
||||
|
||||
if (locomo_readl(mapbase + LOCOMO_KEYBOARD + LOCOMO_KIC) & 0x0001) {
|
||||
d = irq_desc + LOCOMO_IRQ_KEY_START;
|
||||
desc_handle_irq(LOCOMO_IRQ_KEY_START, d, regs);
|
||||
desc_handle_irq(LOCOMO_IRQ_KEY_START, d);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -264,8 +262,7 @@ static struct irq_chip locomo_key_chip = {
|
|||
.unmask = locomo_key_unmask_irq,
|
||||
};
|
||||
|
||||
static void locomo_gpio_handler(unsigned int irq, struct irqdesc *desc,
|
||||
struct pt_regs *regs)
|
||||
static void locomo_gpio_handler(unsigned int irq, struct irqdesc *desc)
|
||||
{
|
||||
int req, i;
|
||||
struct irqdesc *d;
|
||||
|
@ -280,7 +277,7 @@ static void locomo_gpio_handler(unsigned int irq, struct irqdesc *desc,
|
|||
d = irq_desc + LOCOMO_IRQ_GPIO_START;
|
||||
for (i = 0; i <= 15; i++, irq++, d++) {
|
||||
if (req & (0x0001 << i)) {
|
||||
desc_handle_irq(irq, d, regs);
|
||||
desc_handle_irq(irq, d);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -328,15 +325,14 @@ static struct irq_chip locomo_gpio_chip = {
|
|||
.unmask = locomo_gpio_unmask_irq,
|
||||
};
|
||||
|
||||
static void locomo_lt_handler(unsigned int irq, struct irqdesc *desc,
|
||||
struct pt_regs *regs)
|
||||
static void locomo_lt_handler(unsigned int irq, struct irqdesc *desc)
|
||||
{
|
||||
struct irqdesc *d;
|
||||
void __iomem *mapbase = get_irq_chipdata(irq);
|
||||
|
||||
if (locomo_readl(mapbase + LOCOMO_LTINT) & 0x0001) {
|
||||
d = irq_desc + LOCOMO_IRQ_LT_START;
|
||||
desc_handle_irq(LOCOMO_IRQ_LT_START, d, regs);
|
||||
desc_handle_irq(LOCOMO_IRQ_LT_START, d);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -374,8 +370,7 @@ static struct irq_chip locomo_lt_chip = {
|
|||
.unmask = locomo_lt_unmask_irq,
|
||||
};
|
||||
|
||||
static void locomo_spi_handler(unsigned int irq, struct irqdesc *desc,
|
||||
struct pt_regs *regs)
|
||||
static void locomo_spi_handler(unsigned int irq, struct irqdesc *desc)
|
||||
{
|
||||
int req, i;
|
||||
struct irqdesc *d;
|
||||
|
@ -388,7 +383,7 @@ static void locomo_spi_handler(unsigned int irq, struct irqdesc *desc,
|
|||
|
||||
for (i = 0; i <= 3; i++, irq++, d++) {
|
||||
if (req & (0x0001 << i)) {
|
||||
desc_handle_irq(irq, d, regs);
|
||||
desc_handle_irq(irq, d);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -147,7 +147,7 @@ void __init sa1111_adjust_zones(int node, unsigned long *size, unsigned long *ho
|
|||
* will call us again if there are more interrupts to process.
|
||||
*/
|
||||
static void
|
||||
sa1111_irq_handler(unsigned int irq, struct irqdesc *desc, struct pt_regs *regs)
|
||||
sa1111_irq_handler(unsigned int irq, struct irqdesc *desc)
|
||||
{
|
||||
unsigned int stat0, stat1, i;
|
||||
void __iomem *base = get_irq_data(irq);
|
||||
|
@ -162,17 +162,17 @@ sa1111_irq_handler(unsigned int irq, struct irqdesc *desc, struct pt_regs *regs)
|
|||
sa1111_writel(stat1, base + SA1111_INTSTATCLR1);
|
||||
|
||||
if (stat0 == 0 && stat1 == 0) {
|
||||
do_bad_IRQ(irq, desc, regs);
|
||||
do_bad_IRQ(irq, desc);
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = IRQ_SA1111_START; stat0; i++, stat0 >>= 1)
|
||||
if (stat0 & 1)
|
||||
handle_edge_irq(i, irq_desc + i, regs);
|
||||
handle_edge_irq(i, irq_desc + i);
|
||||
|
||||
for (i = IRQ_SA1111_START + 32; stat1; i++, stat1 >>= 1)
|
||||
if (stat1 & 1)
|
||||
handle_edge_irq(i, irq_desc + i, regs);
|
||||
handle_edge_irq(i, irq_desc + i);
|
||||
|
||||
/* For level-based interrupts */
|
||||
desc->chip->unmask(irq);
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue