merge 2.6.13-rc4 with ACPI's to-linus tree
This commit is contained in:
commit
adbedd3424
@ -56,3 +56,12 @@ This file details changes in 2.6 which affect PCMCIA card driver authors:
|
|||||||
memory regions in-use. The name argument should be a pointer to
|
memory regions in-use. The name argument should be a pointer to
|
||||||
your driver name. Eg, for pcnet_cs, name should point to the
|
your driver name. Eg, for pcnet_cs, name should point to the
|
||||||
string "pcnet_cs".
|
string "pcnet_cs".
|
||||||
|
|
||||||
|
* CardServices is gone
|
||||||
|
CardServices() in 2.4 is just a big switch statement to call various
|
||||||
|
services. In 2.6, all of those entry points are exported and called
|
||||||
|
directly (except for pcmcia_report_error(), just use cs_error() instead).
|
||||||
|
|
||||||
|
* struct pcmcia_driver
|
||||||
|
You need to use struct pcmcia_driver and pcmcia_{un,}register_driver
|
||||||
|
instead of {un,}register_pccard_driver
|
||||||
|
@ -636,11 +636,16 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
|||||||
3stack-digout 3-jack in back, a HP out and a SPDIF out
|
3stack-digout 3-jack in back, a HP out and a SPDIF out
|
||||||
5stack 5-jack in back, 2-jack in front
|
5stack 5-jack in back, 2-jack in front
|
||||||
5stack-digout 5-jack in back, 2-jack in front, a SPDIF out
|
5stack-digout 5-jack in back, 2-jack in front, a SPDIF out
|
||||||
|
6stack 6-jack in back, 2-jack in front
|
||||||
|
6stack-digout 6-jack with a SPDIF out
|
||||||
w810 3-jack
|
w810 3-jack
|
||||||
z71v 3-jack (HP shared SPDIF)
|
z71v 3-jack (HP shared SPDIF)
|
||||||
asus 3-jack
|
asus 3-jack
|
||||||
uniwill 3-jack
|
uniwill 3-jack
|
||||||
F1734 2-jack
|
F1734 2-jack
|
||||||
|
test for testing/debugging purpose, almost all controls can be
|
||||||
|
adjusted. Appearing only when compiled with
|
||||||
|
$CONFIG_SND_DEBUG=y
|
||||||
|
|
||||||
CMI9880
|
CMI9880
|
||||||
minimal 3-jack in back
|
minimal 3-jack in back
|
||||||
@ -1054,6 +1059,13 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
|||||||
|
|
||||||
The power-management is supported.
|
The power-management is supported.
|
||||||
|
|
||||||
|
Module snd-pxa2xx-ac97 (on arm only)
|
||||||
|
------------------------------------
|
||||||
|
|
||||||
|
Module for AC97 driver for the Intel PXA2xx chip
|
||||||
|
|
||||||
|
For ARM architecture only.
|
||||||
|
|
||||||
Module snd-rme32
|
Module snd-rme32
|
||||||
----------------
|
----------------
|
||||||
|
|
||||||
@ -1173,6 +1185,13 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
|||||||
|
|
||||||
Module supports up to 8 cards.
|
Module supports up to 8 cards.
|
||||||
|
|
||||||
|
Module snd-sun-dbri (on sparc only)
|
||||||
|
-----------------------------------
|
||||||
|
|
||||||
|
Module for DBRI sound chips found on Sparcs.
|
||||||
|
|
||||||
|
Module supports up to 8 cards.
|
||||||
|
|
||||||
Module snd-wavefront
|
Module snd-wavefront
|
||||||
--------------------
|
--------------------
|
||||||
|
|
||||||
@ -1371,7 +1390,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
|||||||
Module snd-vxpocket
|
Module snd-vxpocket
|
||||||
-------------------
|
-------------------
|
||||||
|
|
||||||
Module for Digigram VX-Pocket VX2 PCMCIA card.
|
Module for Digigram VX-Pocket VX2 and 440 PCMCIA cards.
|
||||||
|
|
||||||
ibl - Capture IBL size. (default = 0, minimum size)
|
ibl - Capture IBL size. (default = 0, minimum size)
|
||||||
|
|
||||||
@ -1391,29 +1410,6 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
|||||||
|
|
||||||
Note: the driver is build only when CONFIG_ISA is set.
|
Note: the driver is build only when CONFIG_ISA is set.
|
||||||
|
|
||||||
Module snd-vxp440
|
|
||||||
-----------------
|
|
||||||
|
|
||||||
Module for Digigram VX-Pocket 440 PCMCIA card.
|
|
||||||
|
|
||||||
ibl - Capture IBL size. (default = 0, minimum size)
|
|
||||||
|
|
||||||
Module supports up to 8 cards. The module is compiled only when
|
|
||||||
PCMCIA is supported on kernel.
|
|
||||||
|
|
||||||
To activate the driver via the card manager, you'll need to set
|
|
||||||
up /etc/pcmcia/vxp440.conf. See the sound/pcmcia/vx/vxp440.c.
|
|
||||||
|
|
||||||
When the driver is compiled as a module and the hotplug firmware
|
|
||||||
is supported, the firmware data is loaded via hotplug automatically.
|
|
||||||
Install the necessary firmware files in alsa-firmware package.
|
|
||||||
When no hotplug fw loader is available, you need to load the
|
|
||||||
firmware via vxloader utility in alsa-tools package.
|
|
||||||
|
|
||||||
About capture IBL, see the description of snd-vx222 module.
|
|
||||||
|
|
||||||
Note: the driver is build only when CONFIG_ISA is set.
|
|
||||||
|
|
||||||
Module snd-ymfpci
|
Module snd-ymfpci
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
@ -132,7 +132,7 @@ to extra work for the USB developers. Since all Linux USB developers do
|
|||||||
their work on their own time, asking programmers to do extra work for no
|
their work on their own time, asking programmers to do extra work for no
|
||||||
gain, for free, is not a possibility.
|
gain, for free, is not a possibility.
|
||||||
|
|
||||||
Security issues are also a very important for Linux. When a
|
Security issues are also very important for Linux. When a
|
||||||
security issue is found, it is fixed in a very short amount of time. A
|
security issue is found, it is fixed in a very short amount of time. A
|
||||||
number of times this has caused internal kernel interfaces to be
|
number of times this has caused internal kernel interfaces to be
|
||||||
reworked to prevent the security problem from occurring. When this
|
reworked to prevent the security problem from occurring. When this
|
||||||
|
58
Documentation/stable_kernel_rules.txt
Normal file
58
Documentation/stable_kernel_rules.txt
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
Everything you ever wanted to know about Linux 2.6 -stable releases.
|
||||||
|
|
||||||
|
Rules on what kind of patches are accepted, and what ones are not, into
|
||||||
|
the "-stable" tree:
|
||||||
|
|
||||||
|
- It must be obviously correct and tested.
|
||||||
|
- It can not bigger than 100 lines, with context.
|
||||||
|
- It must fix only one thing.
|
||||||
|
- It must fix a real bug that bothers people (not a, "This could be a
|
||||||
|
problem..." type thing.)
|
||||||
|
- It must fix a problem that causes a build error (but not for things
|
||||||
|
marked CONFIG_BROKEN), an oops, a hang, data corruption, a real
|
||||||
|
security issue, or some "oh, that's not good" issue. In short,
|
||||||
|
something critical.
|
||||||
|
- No "theoretical race condition" issues, unless an explanation of how
|
||||||
|
the race can be exploited.
|
||||||
|
- It can not contain any "trivial" fixes in it (spelling changes,
|
||||||
|
whitespace cleanups, etc.)
|
||||||
|
- It must be accepted by the relevant subsystem maintainer.
|
||||||
|
- It must follow Documentation/SubmittingPatches rules.
|
||||||
|
|
||||||
|
|
||||||
|
Procedure for submitting patches to the -stable tree:
|
||||||
|
|
||||||
|
- Send the patch, after verifying that it follows the above rules, to
|
||||||
|
stable@kernel.org.
|
||||||
|
- The sender will receive an ack when the patch has been accepted into
|
||||||
|
the queue, or a nak if the patch is rejected. This response might
|
||||||
|
take a few days, according to the developer's schedules.
|
||||||
|
- If accepted, the patch will be added to the -stable queue, for review
|
||||||
|
by other developers.
|
||||||
|
- Security patches should not be sent to this alias, but instead to the
|
||||||
|
documented security@kernel.org.
|
||||||
|
|
||||||
|
|
||||||
|
Review cycle:
|
||||||
|
|
||||||
|
- When the -stable maintainers decide for a review cycle, the patches
|
||||||
|
will be sent to the review committee, and the maintainer of the
|
||||||
|
affected area of the patch (unless the submitter is the maintainer of
|
||||||
|
the area) and CC: to the linux-kernel mailing list.
|
||||||
|
- The review committee has 48 hours in which to ack or nak the patch.
|
||||||
|
- If the patch is rejected by a member of the committee, or linux-kernel
|
||||||
|
members object to the patch, bringing up issues that the maintainers
|
||||||
|
and members did not realize, the patch will be dropped from the
|
||||||
|
queue.
|
||||||
|
- At the end of the review cycle, the acked patches will be added to
|
||||||
|
the latest -stable release, and a new -stable release will happen.
|
||||||
|
- Security patches will be accepted into the -stable tree directly from
|
||||||
|
the security kernel team, and not go through the normal review cycle.
|
||||||
|
Contact the kernel security team for more details on this procedure.
|
||||||
|
|
||||||
|
|
||||||
|
Review committe:
|
||||||
|
|
||||||
|
- This will be made up of a number of kernel developers who have
|
||||||
|
volunteered for this task, and a few that haven't.
|
||||||
|
|
@ -47,7 +47,7 @@ Timing
|
|||||||
notsc
|
notsc
|
||||||
Don't use the CPU time stamp counter to read the wall time.
|
Don't use the CPU time stamp counter to read the wall time.
|
||||||
This can be used to work around timing problems on multiprocessor systems
|
This can be used to work around timing problems on multiprocessor systems
|
||||||
with not properly synchronized CPUs. Only useful with a SMP kernel
|
with not properly synchronized CPUs.
|
||||||
|
|
||||||
report_lost_ticks
|
report_lost_ticks
|
||||||
Report when timer interrupts are lost because some code turned off
|
Report when timer interrupts are lost because some code turned off
|
||||||
@ -74,6 +74,9 @@ Idle loop
|
|||||||
event. This will make the CPUs eat a lot more power, but may be useful
|
event. This will make the CPUs eat a lot more power, but may be useful
|
||||||
to get slightly better performance in multiprocessor benchmarks. It also
|
to get slightly better performance in multiprocessor benchmarks. It also
|
||||||
makes some profiling using performance counters more accurate.
|
makes some profiling using performance counters more accurate.
|
||||||
|
Please note that on systems with MONITOR/MWAIT support (like Intel EM64T
|
||||||
|
CPUs) this option has no performance advantage over the normal idle loop.
|
||||||
|
It may also interact badly with hyperthreading.
|
||||||
|
|
||||||
Rebooting
|
Rebooting
|
||||||
|
|
||||||
@ -178,6 +181,5 @@ Debugging
|
|||||||
Misc
|
Misc
|
||||||
|
|
||||||
noreplacement Don't replace instructions with more appropiate ones
|
noreplacement Don't replace instructions with more appropiate ones
|
||||||
for the CPU. This may be useful on asymmetric MP systems
|
for the CPU. This may be useful on asymmetric MP systems
|
||||||
where some CPU have less capabilities than the others.
|
where some CPU have less capabilities than the others.
|
||||||
|
|
||||||
|
2
Makefile
2
Makefile
@ -1,7 +1,7 @@
|
|||||||
VERSION = 2
|
VERSION = 2
|
||||||
PATCHLEVEL = 6
|
PATCHLEVEL = 6
|
||||||
SUBLEVEL = 13
|
SUBLEVEL = 13
|
||||||
EXTRAVERSION =-rc3
|
EXTRAVERSION =-rc4
|
||||||
NAME=Woozy Numbat
|
NAME=Woozy Numbat
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
|
@ -176,6 +176,7 @@ asmlinkage void __cpuinit secondary_start_kernel(void)
|
|||||||
cpu_set(cpu, mm->cpu_vm_mask);
|
cpu_set(cpu, mm->cpu_vm_mask);
|
||||||
cpu_switch_mm(mm->pgd, mm);
|
cpu_switch_mm(mm->pgd, mm);
|
||||||
enter_lazy_tlb(mm, current);
|
enter_lazy_tlb(mm, current);
|
||||||
|
local_flush_tlb_all();
|
||||||
|
|
||||||
cpu_init();
|
cpu_init();
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
1: ldrexb r2, [r1]
|
1: ldrexb r2, [r1]
|
||||||
\instr r2, r2, r3
|
\instr r2, r2, r3
|
||||||
strexb r0, r2, [r1]
|
strexb r0, r2, [r1]
|
||||||
cmpne r0, #0
|
cmp r0, #0
|
||||||
bne 1b
|
bne 1b
|
||||||
mov pc, lr
|
mov pc, lr
|
||||||
.endm
|
.endm
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
|
|
||||||
#include <asm/atomic.h>
|
#include <asm/atomic.h>
|
||||||
|
#include <asm/cacheflush.h>
|
||||||
#include <asm/delay.h>
|
#include <asm/delay.h>
|
||||||
#include <asm/mmu_context.h>
|
#include <asm/mmu_context.h>
|
||||||
#include <asm/procinfo.h>
|
#include <asm/procinfo.h>
|
||||||
@ -80,6 +81,7 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)
|
|||||||
* "cpu" is Linux's internal ID.
|
* "cpu" is Linux's internal ID.
|
||||||
*/
|
*/
|
||||||
pen_release = cpu;
|
pen_release = cpu;
|
||||||
|
flush_cache_all();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* XXX
|
* XXX
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* (c) 2003, 2004 Advanced Micro Devices, Inc.
|
* (c) 2003, 2004, 2005 Advanced Micro Devices, Inc.
|
||||||
* Your use of this code is subject to the terms and conditions of the
|
* Your use of this code is subject to the terms and conditions of the
|
||||||
* GNU general public license version 2. See "COPYING" or
|
* GNU general public license version 2. See "COPYING" or
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
@ -44,7 +44,7 @@
|
|||||||
|
|
||||||
#define PFX "powernow-k8: "
|
#define PFX "powernow-k8: "
|
||||||
#define BFX PFX "BIOS error: "
|
#define BFX PFX "BIOS error: "
|
||||||
#define VERSION "version 1.40.2"
|
#define VERSION "version 1.50.3"
|
||||||
#include "powernow-k8.h"
|
#include "powernow-k8.h"
|
||||||
|
|
||||||
/* serialize freq changes */
|
/* serialize freq changes */
|
||||||
@ -231,7 +231,7 @@ static int write_new_vid(struct powernow_k8_data *data, u32 vid)
|
|||||||
/*
|
/*
|
||||||
* Reduce the vid by the max of step or reqvid.
|
* Reduce the vid by the max of step or reqvid.
|
||||||
* Decreasing vid codes represent increasing voltages:
|
* Decreasing vid codes represent increasing voltages:
|
||||||
* vid of 0 is 1.550V, vid of 0x1e is 0.800V, vid of 0x1f is off.
|
* vid of 0 is 1.550V, vid of 0x1e is 0.800V, vid of VID_OFF is off.
|
||||||
*/
|
*/
|
||||||
static int decrease_vid_code_by_step(struct powernow_k8_data *data, u32 reqvid, u32 step)
|
static int decrease_vid_code_by_step(struct powernow_k8_data *data, u32 reqvid, u32 step)
|
||||||
{
|
{
|
||||||
@ -466,7 +466,7 @@ static int check_supported_cpu(unsigned int cpu)
|
|||||||
eax = cpuid_eax(CPUID_PROCESSOR_SIGNATURE);
|
eax = cpuid_eax(CPUID_PROCESSOR_SIGNATURE);
|
||||||
if (((eax & CPUID_USE_XFAM_XMOD) != CPUID_USE_XFAM_XMOD) ||
|
if (((eax & CPUID_USE_XFAM_XMOD) != CPUID_USE_XFAM_XMOD) ||
|
||||||
((eax & CPUID_XFAM) != CPUID_XFAM_K8) ||
|
((eax & CPUID_XFAM) != CPUID_XFAM_K8) ||
|
||||||
((eax & CPUID_XMOD) > CPUID_XMOD_REV_E)) {
|
((eax & CPUID_XMOD) > CPUID_XMOD_REV_F)) {
|
||||||
printk(KERN_INFO PFX "Processor cpuid %x not supported\n", eax);
|
printk(KERN_INFO PFX "Processor cpuid %x not supported\n", eax);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
@ -695,6 +695,7 @@ static void powernow_k8_acpi_pst_values(struct powernow_k8_data *data, unsigned
|
|||||||
|
|
||||||
data->irt = (data->acpi_data.states[index].control >> IRT_SHIFT) & IRT_MASK;
|
data->irt = (data->acpi_data.states[index].control >> IRT_SHIFT) & IRT_MASK;
|
||||||
data->rvo = (data->acpi_data.states[index].control >> RVO_SHIFT) & RVO_MASK;
|
data->rvo = (data->acpi_data.states[index].control >> RVO_SHIFT) & RVO_MASK;
|
||||||
|
data->exttype = (data->acpi_data.states[index].control >> EXT_TYPE_SHIFT) & EXT_TYPE_MASK;
|
||||||
data->plllock = (data->acpi_data.states[index].control >> PLL_L_SHIFT) & PLL_L_MASK;
|
data->plllock = (data->acpi_data.states[index].control >> PLL_L_SHIFT) & PLL_L_MASK;
|
||||||
data->vidmvs = 1 << ((data->acpi_data.states[index].control >> MVS_SHIFT) & MVS_MASK);
|
data->vidmvs = 1 << ((data->acpi_data.states[index].control >> MVS_SHIFT) & MVS_MASK);
|
||||||
data->vstable = (data->acpi_data.states[index].control >> VST_SHIFT) & VST_MASK;
|
data->vstable = (data->acpi_data.states[index].control >> VST_SHIFT) & VST_MASK;
|
||||||
@ -734,8 +735,16 @@ static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < data->acpi_data.state_count; i++) {
|
for (i = 0; i < data->acpi_data.state_count; i++) {
|
||||||
u32 fid = data->acpi_data.states[i].control & FID_MASK;
|
u32 fid;
|
||||||
u32 vid = (data->acpi_data.states[i].control >> VID_SHIFT) & VID_MASK;
|
u32 vid;
|
||||||
|
|
||||||
|
if (data->exttype) {
|
||||||
|
fid = data->acpi_data.states[i].status & FID_MASK;
|
||||||
|
vid = (data->acpi_data.states[i].status >> VID_SHIFT) & VID_MASK;
|
||||||
|
} else {
|
||||||
|
fid = data->acpi_data.states[i].control & FID_MASK;
|
||||||
|
vid = (data->acpi_data.states[i].control >> VID_SHIFT) & VID_MASK;
|
||||||
|
}
|
||||||
|
|
||||||
dprintk(" %d : fid 0x%x, vid 0x%x\n", i, fid, vid);
|
dprintk(" %d : fid 0x%x, vid 0x%x\n", i, fid, vid);
|
||||||
|
|
||||||
@ -752,7 +761,7 @@ static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* verify voltage is OK - BIOSs are using "off" to indicate invalid */
|
/* verify voltage is OK - BIOSs are using "off" to indicate invalid */
|
||||||
if (vid == 0x1f) {
|
if (vid == VID_OFF) {
|
||||||
dprintk("invalid vid %u, ignoring\n", vid);
|
dprintk("invalid vid %u, ignoring\n", vid);
|
||||||
powernow_table[i].frequency = CPUFREQ_ENTRY_INVALID;
|
powernow_table[i].frequency = CPUFREQ_ENTRY_INVALID;
|
||||||
continue;
|
continue;
|
||||||
@ -929,15 +938,6 @@ static int powernowk8_target(struct cpufreq_policy *pol, unsigned targfreq, unsi
|
|||||||
|
|
||||||
down(&fidvid_sem);
|
down(&fidvid_sem);
|
||||||
|
|
||||||
for_each_cpu_mask(i, cpu_core_map[pol->cpu]) {
|
|
||||||
/* make sure the sibling is initialized */
|
|
||||||
if (!powernow_data[i]) {
|
|
||||||
ret = 0;
|
|
||||||
up(&fidvid_sem);
|
|
||||||
goto err_out;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
powernow_k8_acpi_pst_values(data, newstate);
|
powernow_k8_acpi_pst_values(data, newstate);
|
||||||
|
|
||||||
if (transition_frequency(data, newstate)) {
|
if (transition_frequency(data, newstate)) {
|
||||||
@ -977,7 +977,7 @@ static int __init powernowk8_cpu_init(struct cpufreq_policy *pol)
|
|||||||
{
|
{
|
||||||
struct powernow_k8_data *data;
|
struct powernow_k8_data *data;
|
||||||
cpumask_t oldmask = CPU_MASK_ALL;
|
cpumask_t oldmask = CPU_MASK_ALL;
|
||||||
int rc;
|
int rc, i;
|
||||||
|
|
||||||
if (!check_supported_cpu(pol->cpu))
|
if (!check_supported_cpu(pol->cpu))
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
@ -1063,7 +1063,9 @@ static int __init powernowk8_cpu_init(struct cpufreq_policy *pol)
|
|||||||
printk("cpu_init done, current fid 0x%x, vid 0x%x\n",
|
printk("cpu_init done, current fid 0x%x, vid 0x%x\n",
|
||||||
data->currfid, data->currvid);
|
data->currfid, data->currvid);
|
||||||
|
|
||||||
powernow_data[pol->cpu] = data;
|
for_each_cpu_mask(i, cpu_core_map[pol->cpu]) {
|
||||||
|
powernow_data[i] = data;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* (c) 2003, 2004 Advanced Micro Devices, Inc.
|
* (c) 2003, 2004, 2005 Advanced Micro Devices, Inc.
|
||||||
* Your use of this code is subject to the terms and conditions of the
|
* Your use of this code is subject to the terms and conditions of the
|
||||||
* GNU general public license version 2. See "COPYING" or
|
* GNU general public license version 2. See "COPYING" or
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
@ -19,6 +19,7 @@ struct powernow_k8_data {
|
|||||||
u32 vidmvs; /* usable value calculated from mvs */
|
u32 vidmvs; /* usable value calculated from mvs */
|
||||||
u32 vstable; /* voltage stabilization time, units 20 us */
|
u32 vstable; /* voltage stabilization time, units 20 us */
|
||||||
u32 plllock; /* pll lock time, units 1 us */
|
u32 plllock; /* pll lock time, units 1 us */
|
||||||
|
u32 exttype; /* extended interface = 1 */
|
||||||
|
|
||||||
/* keep track of the current fid / vid */
|
/* keep track of the current fid / vid */
|
||||||
u32 currvid, currfid;
|
u32 currvid, currfid;
|
||||||
@ -41,7 +42,7 @@ struct powernow_k8_data {
|
|||||||
#define CPUID_XFAM 0x0ff00000 /* extended family */
|
#define CPUID_XFAM 0x0ff00000 /* extended family */
|
||||||
#define CPUID_XFAM_K8 0
|
#define CPUID_XFAM_K8 0
|
||||||
#define CPUID_XMOD 0x000f0000 /* extended model */
|
#define CPUID_XMOD 0x000f0000 /* extended model */
|
||||||
#define CPUID_XMOD_REV_E 0x00020000
|
#define CPUID_XMOD_REV_F 0x00040000
|
||||||
#define CPUID_USE_XFAM_XMOD 0x00000f00
|
#define CPUID_USE_XFAM_XMOD 0x00000f00
|
||||||
#define CPUID_GET_MAX_CAPABILITIES 0x80000000
|
#define CPUID_GET_MAX_CAPABILITIES 0x80000000
|
||||||
#define CPUID_FREQ_VOLT_CAPABILITIES 0x80000007
|
#define CPUID_FREQ_VOLT_CAPABILITIES 0x80000007
|
||||||
@ -57,25 +58,26 @@ struct powernow_k8_data {
|
|||||||
|
|
||||||
/* Field definitions within the FID VID Low Control MSR : */
|
/* Field definitions within the FID VID Low Control MSR : */
|
||||||
#define MSR_C_LO_INIT_FID_VID 0x00010000
|
#define MSR_C_LO_INIT_FID_VID 0x00010000
|
||||||
#define MSR_C_LO_NEW_VID 0x00001f00
|
#define MSR_C_LO_NEW_VID 0x00003f00
|
||||||
#define MSR_C_LO_NEW_FID 0x0000002f
|
#define MSR_C_LO_NEW_FID 0x0000003f
|
||||||
#define MSR_C_LO_VID_SHIFT 8
|
#define MSR_C_LO_VID_SHIFT 8
|
||||||
|
|
||||||
/* Field definitions within the FID VID High Control MSR : */
|
/* Field definitions within the FID VID High Control MSR : */
|
||||||
#define MSR_C_HI_STP_GNT_TO 0x000fffff
|
#define MSR_C_HI_STP_GNT_TO 0x000fffff
|
||||||
|
|
||||||
/* Field definitions within the FID VID Low Status MSR : */
|
/* Field definitions within the FID VID Low Status MSR : */
|
||||||
#define MSR_S_LO_CHANGE_PENDING 0x80000000 /* cleared when completed */
|
#define MSR_S_LO_CHANGE_PENDING 0x80000000 /* cleared when completed */
|
||||||
#define MSR_S_LO_MAX_RAMP_VID 0x1f000000
|
#define MSR_S_LO_MAX_RAMP_VID 0x3f000000
|
||||||
#define MSR_S_LO_MAX_FID 0x003f0000
|
#define MSR_S_LO_MAX_FID 0x003f0000
|
||||||
#define MSR_S_LO_START_FID 0x00003f00
|
#define MSR_S_LO_START_FID 0x00003f00
|
||||||
#define MSR_S_LO_CURRENT_FID 0x0000003f
|
#define MSR_S_LO_CURRENT_FID 0x0000003f
|
||||||
|
|
||||||
/* Field definitions within the FID VID High Status MSR : */
|
/* Field definitions within the FID VID High Status MSR : */
|
||||||
#define MSR_S_HI_MAX_WORKING_VID 0x001f0000
|
#define MSR_S_HI_MIN_WORKING_VID 0x3f000000
|
||||||
#define MSR_S_HI_START_VID 0x00001f00
|
#define MSR_S_HI_MAX_WORKING_VID 0x003f0000
|
||||||
#define MSR_S_HI_CURRENT_VID 0x0000001f
|
#define MSR_S_HI_START_VID 0x00003f00
|
||||||
#define MSR_C_HI_STP_GNT_BENIGN 0x00000001
|
#define MSR_S_HI_CURRENT_VID 0x0000003f
|
||||||
|
#define MSR_C_HI_STP_GNT_BENIGN 0x00000001
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* There are restrictions frequencies have to follow:
|
* There are restrictions frequencies have to follow:
|
||||||
@ -99,13 +101,15 @@ struct powernow_k8_data {
|
|||||||
#define MIN_FREQ_RESOLUTION 200 /* fids jump by 2 matching freq jumps by 200 */
|
#define MIN_FREQ_RESOLUTION 200 /* fids jump by 2 matching freq jumps by 200 */
|
||||||
|
|
||||||
#define MAX_FID 0x2a /* Spec only gives FID values as far as 5 GHz */
|
#define MAX_FID 0x2a /* Spec only gives FID values as far as 5 GHz */
|
||||||
#define LEAST_VID 0x1e /* Lowest (numerically highest) useful vid value */
|
#define LEAST_VID 0x3e /* Lowest (numerically highest) useful vid value */
|
||||||
|
|
||||||
#define MIN_FREQ 800 /* Min and max freqs, per spec */
|
#define MIN_FREQ 800 /* Min and max freqs, per spec */
|
||||||
#define MAX_FREQ 5000
|
#define MAX_FREQ 5000
|
||||||
|
|
||||||
#define INVALID_FID_MASK 0xffffffc1 /* not a valid fid if these bits are set */
|
#define INVALID_FID_MASK 0xffffffc1 /* not a valid fid if these bits are set */
|
||||||
#define INVALID_VID_MASK 0xffffffe0 /* not a valid vid if these bits are set */
|
#define INVALID_VID_MASK 0xffffffc0 /* not a valid vid if these bits are set */
|
||||||
|
|
||||||
|
#define VID_OFF 0x3f
|
||||||
|
|
||||||
#define STOP_GRANT_5NS 1 /* min poss memory access latency for voltage change */
|
#define STOP_GRANT_5NS 1 /* min poss memory access latency for voltage change */
|
||||||
|
|
||||||
@ -121,12 +125,14 @@ struct powernow_k8_data {
|
|||||||
|
|
||||||
#define IRT_SHIFT 30
|
#define IRT_SHIFT 30
|
||||||
#define RVO_SHIFT 28
|
#define RVO_SHIFT 28
|
||||||
|
#define EXT_TYPE_SHIFT 27
|
||||||
#define PLL_L_SHIFT 20
|
#define PLL_L_SHIFT 20
|
||||||
#define MVS_SHIFT 18
|
#define MVS_SHIFT 18
|
||||||
#define VST_SHIFT 11
|
#define VST_SHIFT 11
|
||||||
#define VID_SHIFT 6
|
#define VID_SHIFT 6
|
||||||
#define IRT_MASK 3
|
#define IRT_MASK 3
|
||||||
#define RVO_MASK 3
|
#define RVO_MASK 3
|
||||||
|
#define EXT_TYPE_MASK 1
|
||||||
#define PLL_L_MASK 0x7f
|
#define PLL_L_MASK 0x7f
|
||||||
#define MVS_MASK 3
|
#define MVS_MASK 3
|
||||||
#define VST_MASK 0x7f
|
#define VST_MASK 0x7f
|
||||||
|
@ -128,7 +128,7 @@ static int __devinit cpuid4_cache_lookup(int index, struct _cpuid4_info *this_le
|
|||||||
cpuid_count(4, index, &eax, &ebx, &ecx, &edx);
|
cpuid_count(4, index, &eax, &ebx, &ecx, &edx);
|
||||||
cache_eax.full = eax;
|
cache_eax.full = eax;
|
||||||
if (cache_eax.split.type == CACHE_TYPE_NULL)
|
if (cache_eax.split.type == CACHE_TYPE_NULL)
|
||||||
return -1;
|
return -EIO; /* better error ? */
|
||||||
|
|
||||||
this_leaf->eax.full = eax;
|
this_leaf->eax.full = eax;
|
||||||
this_leaf->ebx.full = ebx;
|
this_leaf->ebx.full = ebx;
|
||||||
@ -334,6 +334,7 @@ static int __devinit detect_cache_attributes(unsigned int cpu)
|
|||||||
struct _cpuid4_info *this_leaf;
|
struct _cpuid4_info *this_leaf;
|
||||||
unsigned long j;
|
unsigned long j;
|
||||||
int retval;
|
int retval;
|
||||||
|
cpumask_t oldmask;
|
||||||
|
|
||||||
if (num_cache_leaves == 0)
|
if (num_cache_leaves == 0)
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
@ -345,19 +346,26 @@ static int __devinit detect_cache_attributes(unsigned int cpu)
|
|||||||
memset(cpuid4_info[cpu], 0,
|
memset(cpuid4_info[cpu], 0,
|
||||||
sizeof(struct _cpuid4_info) * num_cache_leaves);
|
sizeof(struct _cpuid4_info) * num_cache_leaves);
|
||||||
|
|
||||||
|
oldmask = current->cpus_allowed;
|
||||||
|
retval = set_cpus_allowed(current, cpumask_of_cpu(cpu));
|
||||||
|
if (retval)
|
||||||
|
goto out;
|
||||||
|
|
||||||
/* Do cpuid and store the results */
|
/* Do cpuid and store the results */
|
||||||
|
retval = 0;
|
||||||
for (j = 0; j < num_cache_leaves; j++) {
|
for (j = 0; j < num_cache_leaves; j++) {
|
||||||
this_leaf = CPUID4_INFO_IDX(cpu, j);
|
this_leaf = CPUID4_INFO_IDX(cpu, j);
|
||||||
retval = cpuid4_cache_lookup(j, this_leaf);
|
retval = cpuid4_cache_lookup(j, this_leaf);
|
||||||
if (unlikely(retval < 0))
|
if (unlikely(retval < 0))
|
||||||
goto err_out;
|
break;
|
||||||
cache_shared_cpu_map_setup(cpu, j);
|
cache_shared_cpu_map_setup(cpu, j);
|
||||||
}
|
}
|
||||||
return 0;
|
set_cpus_allowed(current, oldmask);
|
||||||
|
|
||||||
err_out:
|
out:
|
||||||
free_cache_attributes(cpu);
|
if (retval)
|
||||||
return -ENOMEM;
|
free_cache_attributes(cpu);
|
||||||
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_SYSFS
|
#ifdef CONFIG_SYSFS
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <asm/apic.h>
|
#include <asm/apic.h>
|
||||||
#include <asm/cpufeature.h>
|
#include <asm/cpufeature.h>
|
||||||
|
#include <asm/desc.h>
|
||||||
|
|
||||||
static inline unsigned long read_cr3(void)
|
static inline unsigned long read_cr3(void)
|
||||||
{
|
{
|
||||||
@ -90,33 +91,32 @@ static void identity_map_page(unsigned long address)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
static void set_idt(void *newidt, __u16 limit)
|
static void set_idt(void *newidt, __u16 limit)
|
||||||
{
|
{
|
||||||
unsigned char curidt[6];
|
struct Xgt_desc_struct curidt;
|
||||||
|
|
||||||
/* ia32 supports unaliged loads & stores */
|
/* ia32 supports unaliged loads & stores */
|
||||||
(*(__u16 *)(curidt)) = limit;
|
curidt.size = limit;
|
||||||
(*(__u32 *)(curidt +2)) = (unsigned long)(newidt);
|
curidt.address = (unsigned long)newidt;
|
||||||
|
|
||||||
__asm__ __volatile__ (
|
__asm__ __volatile__ (
|
||||||
"lidt %0\n"
|
"lidtl %0\n"
|
||||||
: "=m" (curidt)
|
: : "m" (curidt)
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
static void set_gdt(void *newgdt, __u16 limit)
|
static void set_gdt(void *newgdt, __u16 limit)
|
||||||
{
|
{
|
||||||
unsigned char curgdt[6];
|
struct Xgt_desc_struct curgdt;
|
||||||
|
|
||||||
/* ia32 supports unaligned loads & stores */
|
/* ia32 supports unaligned loads & stores */
|
||||||
(*(__u16 *)(curgdt)) = limit;
|
curgdt.size = limit;
|
||||||
(*(__u32 *)(curgdt +2)) = (unsigned long)(newgdt);
|
curgdt.address = (unsigned long)newgdt;
|
||||||
|
|
||||||
__asm__ __volatile__ (
|
__asm__ __volatile__ (
|
||||||
"lgdt %0\n"
|
"lgdtl %0\n"
|
||||||
: "=m" (curgdt)
|
: : "m" (curgdt)
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1116,7 +1116,15 @@ int mp_register_gsi (u32 gsi, int edge_level, int active_high_low)
|
|||||||
*/
|
*/
|
||||||
int irq = gsi;
|
int irq = gsi;
|
||||||
if (gsi < MAX_GSI_NUM) {
|
if (gsi < MAX_GSI_NUM) {
|
||||||
gsi = pci_irq++;
|
if (gsi > 15)
|
||||||
|
gsi = pci_irq++;
|
||||||
|
#ifdef CONFIG_ACPI_BUS
|
||||||
|
/*
|
||||||
|
* Don't assign IRQ used by ACPI SCI
|
||||||
|
*/
|
||||||
|
if (gsi == acpi_fadt.sci_int)
|
||||||
|
gsi = pci_irq++;
|
||||||
|
#endif
|
||||||
gsi_to_irq[irq] = gsi;
|
gsi_to_irq[irq] = gsi;
|
||||||
} else {
|
} else {
|
||||||
printk(KERN_ERR "GSI %u is too high\n", gsi);
|
printk(KERN_ERR "GSI %u is too high\n", gsi);
|
||||||
|
@ -31,6 +31,7 @@
|
|||||||
#include <linux/nodemask.h>
|
#include <linux/nodemask.h>
|
||||||
#include <asm/numaq.h>
|
#include <asm/numaq.h>
|
||||||
#include <asm/topology.h>
|
#include <asm/topology.h>
|
||||||
|
#include <asm/processor.h>
|
||||||
|
|
||||||
#define MB_TO_PAGES(addr) ((addr) << (20 - PAGE_SHIFT))
|
#define MB_TO_PAGES(addr) ((addr) << (20 - PAGE_SHIFT))
|
||||||
|
|
||||||
@ -77,3 +78,11 @@ int __init get_memcfg_numaq(void)
|
|||||||
smp_dump_qct();
|
smp_dump_qct();
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int __init numaq_dsc_disable(void)
|
||||||
|
{
|
||||||
|
printk(KERN_DEBUG "NUMAQ: disabling TSC\n");
|
||||||
|
tsc_disable = 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
core_initcall(numaq_dsc_disable);
|
||||||
|
@ -243,6 +243,14 @@ static unsigned long calculate_numa_remap_pages(void)
|
|||||||
/* now the roundup is correct, convert to PAGE_SIZE pages */
|
/* now the roundup is correct, convert to PAGE_SIZE pages */
|
||||||
size = size * PTRS_PER_PTE;
|
size = size * PTRS_PER_PTE;
|
||||||
|
|
||||||
|
if (node_end_pfn[nid] & (PTRS_PER_PTE-1)) {
|
||||||
|
/*
|
||||||
|
* Adjust size if node_end_pfn is not on a proper
|
||||||
|
* pmd boundary. remap_numa_kva will barf otherwise.
|
||||||
|
*/
|
||||||
|
size += node_end_pfn[nid] & (PTRS_PER_PTE-1);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Validate the region we are allocating only contains valid
|
* Validate the region we are allocating only contains valid
|
||||||
* pages.
|
* pages.
|
||||||
|
@ -551,6 +551,13 @@ static __init int intel_router_probe(struct irq_router *r, struct pci_dev *route
|
|||||||
static __init int via_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
|
static __init int via_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
|
||||||
{
|
{
|
||||||
/* FIXME: We should move some of the quirk fixup stuff here */
|
/* FIXME: We should move some of the quirk fixup stuff here */
|
||||||
|
|
||||||
|
if (router->device == PCI_DEVICE_ID_VIA_82C686 &&
|
||||||
|
device == PCI_DEVICE_ID_VIA_82C586_0) {
|
||||||
|
/* Asus k7m bios wrongly reports 82C686A as 586-compatible */
|
||||||
|
device = PCI_DEVICE_ID_VIA_82C686;
|
||||||
|
}
|
||||||
|
|
||||||
switch(device)
|
switch(device)
|
||||||
{
|
{
|
||||||
case PCI_DEVICE_ID_VIA_82C586_0:
|
case PCI_DEVICE_ID_VIA_82C586_0:
|
||||||
|
@ -232,7 +232,11 @@ static int appldata_diag(char record_nr, u16 function, unsigned long buffer,
|
|||||||
ry = -1;
|
ry = -1;
|
||||||
asm volatile(
|
asm volatile(
|
||||||
"diag %1,%0,0xDC\n\t"
|
"diag %1,%0,0xDC\n\t"
|
||||||
: "=d" (ry) : "d" (&(appldata_parameter_list)) : "cc");
|
: "=d" (ry)
|
||||||
|
: "d" (&appldata_parameter_list),
|
||||||
|
"m" (appldata_parameter_list),
|
||||||
|
"m" (appldata_product_id)
|
||||||
|
: "cc");
|
||||||
return (int) ry;
|
return (int) ry;
|
||||||
}
|
}
|
||||||
/************************ timer, work, DIAG <END> ****************************/
|
/************************ timer, work, DIAG <END> ****************************/
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#
|
#
|
||||||
# Automatically generated make config: don't edit
|
# Automatically generated make config: don't edit
|
||||||
# Linux kernel version: 2.6.12-rc3
|
# Linux kernel version: 2.6.13-rc4
|
||||||
# Fri Apr 22 15:30:58 2005
|
# Fri Jul 29 14:49:30 2005
|
||||||
#
|
#
|
||||||
CONFIG_MMU=y
|
CONFIG_MMU=y
|
||||||
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
|
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
|
||||||
@ -23,10 +23,11 @@ CONFIG_INIT_ENV_ARG_LIMIT=32
|
|||||||
CONFIG_LOCALVERSION=""
|
CONFIG_LOCALVERSION=""
|
||||||
CONFIG_SWAP=y
|
CONFIG_SWAP=y
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
# CONFIG_POSIX_MQUEUE is not set
|
CONFIG_POSIX_MQUEUE=y
|
||||||
# CONFIG_BSD_PROCESS_ACCT is not set
|
# CONFIG_BSD_PROCESS_ACCT is not set
|
||||||
CONFIG_SYSCTL=y
|
CONFIG_SYSCTL=y
|
||||||
# CONFIG_AUDIT is not set
|
CONFIG_AUDIT=y
|
||||||
|
# CONFIG_AUDITSYSCALL is not set
|
||||||
CONFIG_HOTPLUG=y
|
CONFIG_HOTPLUG=y
|
||||||
CONFIG_KOBJECT_UEVENT=y
|
CONFIG_KOBJECT_UEVENT=y
|
||||||
CONFIG_IKCONFIG=y
|
CONFIG_IKCONFIG=y
|
||||||
@ -36,6 +37,8 @@ CONFIG_IKCONFIG_PROC=y
|
|||||||
CONFIG_KALLSYMS=y
|
CONFIG_KALLSYMS=y
|
||||||
# CONFIG_KALLSYMS_ALL is not set
|
# CONFIG_KALLSYMS_ALL is not set
|
||||||
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
||||||
|
CONFIG_PRINTK=y
|
||||||
|
CONFIG_BUG=y
|
||||||
CONFIG_BASE_FULL=y
|
CONFIG_BASE_FULL=y
|
||||||
CONFIG_FUTEX=y
|
CONFIG_FUTEX=y
|
||||||
CONFIG_EPOLL=y
|
CONFIG_EPOLL=y
|
||||||
@ -51,9 +54,10 @@ CONFIG_BASE_SMALL=0
|
|||||||
# Loadable module support
|
# Loadable module support
|
||||||
#
|
#
|
||||||
CONFIG_MODULES=y
|
CONFIG_MODULES=y
|
||||||
# CONFIG_MODULE_UNLOAD is not set
|
CONFIG_MODULE_UNLOAD=y
|
||||||
|
# CONFIG_MODULE_FORCE_UNLOAD is not set
|
||||||
CONFIG_OBSOLETE_MODPARM=y
|
CONFIG_OBSOLETE_MODPARM=y
|
||||||
# CONFIG_MODVERSIONS is not set
|
CONFIG_MODVERSIONS=y
|
||||||
# CONFIG_MODULE_SRCVERSION_ALL is not set
|
# CONFIG_MODULE_SRCVERSION_ALL is not set
|
||||||
CONFIG_KMOD=y
|
CONFIG_KMOD=y
|
||||||
CONFIG_STOP_MACHINE=y
|
CONFIG_STOP_MACHINE=y
|
||||||
@ -81,8 +85,15 @@ CONFIG_MARCH_G5=y
|
|||||||
# CONFIG_MARCH_Z990 is not set
|
# CONFIG_MARCH_Z990 is not set
|
||||||
CONFIG_PACK_STACK=y
|
CONFIG_PACK_STACK=y
|
||||||
# CONFIG_SMALL_STACK is not set
|
# CONFIG_SMALL_STACK is not set
|
||||||
# CONFIG_CHECK_STACK is not set
|
CONFIG_CHECK_STACK=y
|
||||||
|
CONFIG_STACK_GUARD=256
|
||||||
# CONFIG_WARN_STACK is not set
|
# CONFIG_WARN_STACK is not set
|
||||||
|
CONFIG_SELECT_MEMORY_MODEL=y
|
||||||
|
CONFIG_FLATMEM_MANUAL=y
|
||||||
|
# CONFIG_DISCONTIGMEM_MANUAL is not set
|
||||||
|
# CONFIG_SPARSEMEM_MANUAL is not set
|
||||||
|
CONFIG_FLATMEM=y
|
||||||
|
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||||
|
|
||||||
#
|
#
|
||||||
# I/O subsystem configuration
|
# I/O subsystem configuration
|
||||||
@ -95,7 +106,7 @@ CONFIG_QDIO=y
|
|||||||
#
|
#
|
||||||
# Misc
|
# Misc
|
||||||
#
|
#
|
||||||
# CONFIG_PREEMPT is not set
|
CONFIG_PREEMPT=y
|
||||||
CONFIG_IPL=y
|
CONFIG_IPL=y
|
||||||
# CONFIG_IPL_TAPE is not set
|
# CONFIG_IPL_TAPE is not set
|
||||||
CONFIG_IPL_VM=y
|
CONFIG_IPL_VM=y
|
||||||
@ -105,9 +116,110 @@ CONFIG_BINFMT_MISC=m
|
|||||||
CONFIG_PFAULT=y
|
CONFIG_PFAULT=y
|
||||||
# CONFIG_SHARED_KERNEL is not set
|
# CONFIG_SHARED_KERNEL is not set
|
||||||
# CONFIG_CMM is not set
|
# CONFIG_CMM is not set
|
||||||
# CONFIG_VIRT_TIMER is not set
|
CONFIG_VIRT_TIMER=y
|
||||||
|
CONFIG_VIRT_CPU_ACCOUNTING=y
|
||||||
|
# CONFIG_APPLDATA_BASE is not set
|
||||||
CONFIG_NO_IDLE_HZ=y
|
CONFIG_NO_IDLE_HZ=y
|
||||||
CONFIG_NO_IDLE_HZ_INIT=y
|
CONFIG_NO_IDLE_HZ_INIT=y
|
||||||
|
# CONFIG_KEXEC is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Networking
|
||||||
|
#
|
||||||
|
CONFIG_NET=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# Networking options
|
||||||
|
#
|
||||||
|
CONFIG_PACKET=y
|
||||||
|
# CONFIG_PACKET_MMAP is not set
|
||||||
|
CONFIG_UNIX=y
|
||||||
|
CONFIG_XFRM=y
|
||||||
|
# CONFIG_XFRM_USER is not set
|
||||||
|
CONFIG_NET_KEY=y
|
||||||
|
CONFIG_INET=y
|
||||||
|
CONFIG_IP_MULTICAST=y
|
||||||
|
# CONFIG_IP_ADVANCED_ROUTER is not set
|
||||||
|
CONFIG_IP_FIB_HASH=y
|
||||||
|
# CONFIG_IP_PNP is not set
|
||||||
|
# CONFIG_NET_IPIP is not set
|
||||||
|
# CONFIG_NET_IPGRE is not set
|
||||||
|
# CONFIG_IP_MROUTE is not set
|
||||||
|
# CONFIG_ARPD is not set
|
||||||
|
# CONFIG_SYN_COOKIES is not set
|
||||||
|
# CONFIG_INET_AH is not set
|
||||||
|
# CONFIG_INET_ESP is not set
|
||||||
|
# CONFIG_INET_IPCOMP is not set
|
||||||
|
# CONFIG_INET_TUNNEL is not set
|
||||||
|
CONFIG_IP_TCPDIAG=y
|
||||||
|
CONFIG_IP_TCPDIAG_IPV6=y
|
||||||
|
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||||
|
CONFIG_TCP_CONG_BIC=y
|
||||||
|
CONFIG_IPV6=y
|
||||||
|
# CONFIG_IPV6_PRIVACY is not set
|
||||||
|
# CONFIG_INET6_AH is not set
|
||||||
|
# CONFIG_INET6_ESP is not set
|
||||||
|
# CONFIG_INET6_IPCOMP is not set
|
||||||
|
# CONFIG_INET6_TUNNEL is not set
|
||||||
|
# CONFIG_IPV6_TUNNEL is not set
|
||||||
|
# CONFIG_NETFILTER is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# SCTP Configuration (EXPERIMENTAL)
|
||||||
|
#
|
||||||
|
# CONFIG_IP_SCTP is not set
|
||||||
|
# CONFIG_ATM is not set
|
||||||
|
# CONFIG_BRIDGE is not set
|
||||||
|
# CONFIG_VLAN_8021Q is not set
|
||||||
|
# CONFIG_DECNET is not set
|
||||||
|
# CONFIG_LLC2 is not set
|
||||||
|
# CONFIG_IPX is not set
|
||||||
|
# CONFIG_ATALK is not set
|
||||||
|
# CONFIG_X25 is not set
|
||||||
|
# CONFIG_LAPB is not set
|
||||||
|
# CONFIG_NET_DIVERT is not set
|
||||||
|
# CONFIG_ECONET is not set
|
||||||
|
# CONFIG_WAN_ROUTER is not set
|
||||||
|
CONFIG_NET_SCHED=y
|
||||||
|
CONFIG_NET_SCH_CLK_JIFFIES=y
|
||||||
|
# CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set
|
||||||
|
# CONFIG_NET_SCH_CLK_CPU is not set
|
||||||
|
CONFIG_NET_SCH_CBQ=m
|
||||||
|
# CONFIG_NET_SCH_HTB is not set
|
||||||
|
# CONFIG_NET_SCH_HFSC is not set
|
||||||
|
CONFIG_NET_SCH_PRIO=m
|
||||||
|
CONFIG_NET_SCH_RED=m
|
||||||
|
CONFIG_NET_SCH_SFQ=m
|
||||||
|
CONFIG_NET_SCH_TEQL=m
|
||||||
|
CONFIG_NET_SCH_TBF=m
|
||||||
|
CONFIG_NET_SCH_GRED=m
|
||||||
|
CONFIG_NET_SCH_DSMARK=m
|
||||||
|
# CONFIG_NET_SCH_NETEM is not set
|
||||||
|
# CONFIG_NET_SCH_INGRESS is not set
|
||||||
|
CONFIG_NET_QOS=y
|
||||||
|
CONFIG_NET_ESTIMATOR=y
|
||||||
|
CONFIG_NET_CLS=y
|
||||||
|
# CONFIG_NET_CLS_BASIC is not set
|
||||||
|
CONFIG_NET_CLS_TCINDEX=m
|
||||||
|
CONFIG_NET_CLS_ROUTE4=m
|
||||||
|
CONFIG_NET_CLS_ROUTE=y
|
||||||
|
CONFIG_NET_CLS_FW=m
|
||||||
|
CONFIG_NET_CLS_U32=m
|
||||||
|
# CONFIG_CLS_U32_PERF is not set
|
||||||
|
# CONFIG_NET_CLS_IND is not set
|
||||||
|
CONFIG_NET_CLS_RSVP=m
|
||||||
|
CONFIG_NET_CLS_RSVP6=m
|
||||||
|
# CONFIG_NET_EMATCH is not set
|
||||||
|
# CONFIG_NET_CLS_ACT is not set
|
||||||
|
CONFIG_NET_CLS_POLICE=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# Network testing
|
||||||
|
#
|
||||||
|
# CONFIG_NET_PKTGEN is not set
|
||||||
|
# CONFIG_HAMRADIO is not set
|
||||||
|
# CONFIG_IRDA is not set
|
||||||
|
# CONFIG_BT is not set
|
||||||
# CONFIG_PCMCIA is not set
|
# CONFIG_PCMCIA is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -133,6 +245,7 @@ CONFIG_CHR_DEV_ST=y
|
|||||||
CONFIG_BLK_DEV_SR=y
|
CONFIG_BLK_DEV_SR=y
|
||||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||||
CONFIG_CHR_DEV_SG=y
|
CONFIG_CHR_DEV_SG=y
|
||||||
|
# CONFIG_CHR_DEV_SCH is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
|
# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
|
||||||
@ -205,7 +318,13 @@ CONFIG_MD_RAID5=m
|
|||||||
# CONFIG_MD_RAID6 is not set
|
# CONFIG_MD_RAID6 is not set
|
||||||
CONFIG_MD_MULTIPATH=m
|
CONFIG_MD_MULTIPATH=m
|
||||||
# CONFIG_MD_FAULTY is not set
|
# CONFIG_MD_FAULTY is not set
|
||||||
# CONFIG_BLK_DEV_DM is not set
|
CONFIG_BLK_DEV_DM=y
|
||||||
|
CONFIG_DM_CRYPT=y
|
||||||
|
CONFIG_DM_SNAPSHOT=y
|
||||||
|
CONFIG_DM_MIRROR=y
|
||||||
|
CONFIG_DM_ZERO=y
|
||||||
|
CONFIG_DM_MULTIPATH=y
|
||||||
|
# CONFIG_DM_MULTIPATH_EMC is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Character device drivers
|
# Character device drivers
|
||||||
@ -231,7 +350,8 @@ CONFIG_CCW_CONSOLE=y
|
|||||||
CONFIG_SCLP=y
|
CONFIG_SCLP=y
|
||||||
CONFIG_SCLP_TTY=y
|
CONFIG_SCLP_TTY=y
|
||||||
CONFIG_SCLP_CONSOLE=y
|
CONFIG_SCLP_CONSOLE=y
|
||||||
# CONFIG_SCLP_VT220_TTY is not set
|
CONFIG_SCLP_VT220_TTY=y
|
||||||
|
CONFIG_SCLP_VT220_CONSOLE=y
|
||||||
CONFIG_SCLP_CPI=m
|
CONFIG_SCLP_CPI=m
|
||||||
CONFIG_S390_TAPE=m
|
CONFIG_S390_TAPE=m
|
||||||
|
|
||||||
@ -255,105 +375,8 @@ CONFIG_S390_TAPE_34XX=m
|
|||||||
CONFIG_Z90CRYPT=m
|
CONFIG_Z90CRYPT=m
|
||||||
|
|
||||||
#
|
#
|
||||||
# Networking support
|
# Network device support
|
||||||
#
|
#
|
||||||
CONFIG_NET=y
|
|
||||||
|
|
||||||
#
|
|
||||||
# Networking options
|
|
||||||
#
|
|
||||||
CONFIG_PACKET=y
|
|
||||||
# CONFIG_PACKET_MMAP is not set
|
|
||||||
CONFIG_UNIX=y
|
|
||||||
CONFIG_NET_KEY=y
|
|
||||||
CONFIG_INET=y
|
|
||||||
CONFIG_IP_MULTICAST=y
|
|
||||||
# CONFIG_IP_ADVANCED_ROUTER is not set
|
|
||||||
# CONFIG_IP_PNP is not set
|
|
||||||
# CONFIG_NET_IPIP is not set
|
|
||||||
# CONFIG_NET_IPGRE is not set
|
|
||||||
# CONFIG_IP_MROUTE is not set
|
|
||||||
# CONFIG_ARPD is not set
|
|
||||||
# CONFIG_SYN_COOKIES is not set
|
|
||||||
# CONFIG_INET_AH is not set
|
|
||||||
# CONFIG_INET_ESP is not set
|
|
||||||
# CONFIG_INET_IPCOMP is not set
|
|
||||||
# CONFIG_INET_TUNNEL is not set
|
|
||||||
CONFIG_IP_TCPDIAG=y
|
|
||||||
CONFIG_IP_TCPDIAG_IPV6=y
|
|
||||||
CONFIG_IPV6=y
|
|
||||||
# CONFIG_IPV6_PRIVACY is not set
|
|
||||||
# CONFIG_INET6_AH is not set
|
|
||||||
# CONFIG_INET6_ESP is not set
|
|
||||||
# CONFIG_INET6_IPCOMP is not set
|
|
||||||
# CONFIG_INET6_TUNNEL is not set
|
|
||||||
# CONFIG_IPV6_TUNNEL is not set
|
|
||||||
# CONFIG_NETFILTER is not set
|
|
||||||
CONFIG_XFRM=y
|
|
||||||
# CONFIG_XFRM_USER is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# SCTP Configuration (EXPERIMENTAL)
|
|
||||||
#
|
|
||||||
# CONFIG_IP_SCTP is not set
|
|
||||||
# CONFIG_ATM is not set
|
|
||||||
# CONFIG_BRIDGE is not set
|
|
||||||
# CONFIG_VLAN_8021Q is not set
|
|
||||||
# CONFIG_DECNET is not set
|
|
||||||
# CONFIG_LLC2 is not set
|
|
||||||
# CONFIG_IPX is not set
|
|
||||||
# CONFIG_ATALK is not set
|
|
||||||
# CONFIG_X25 is not set
|
|
||||||
# CONFIG_LAPB is not set
|
|
||||||
# CONFIG_NET_DIVERT is not set
|
|
||||||
# CONFIG_ECONET is not set
|
|
||||||
# CONFIG_WAN_ROUTER is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# QoS and/or fair queueing
|
|
||||||
#
|
|
||||||
CONFIG_NET_SCHED=y
|
|
||||||
CONFIG_NET_SCH_CLK_JIFFIES=y
|
|
||||||
# CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set
|
|
||||||
# CONFIG_NET_SCH_CLK_CPU is not set
|
|
||||||
CONFIG_NET_SCH_CBQ=m
|
|
||||||
# CONFIG_NET_SCH_HTB is not set
|
|
||||||
# CONFIG_NET_SCH_HFSC is not set
|
|
||||||
CONFIG_NET_SCH_PRIO=m
|
|
||||||
CONFIG_NET_SCH_RED=m
|
|
||||||
CONFIG_NET_SCH_SFQ=m
|
|
||||||
CONFIG_NET_SCH_TEQL=m
|
|
||||||
CONFIG_NET_SCH_TBF=m
|
|
||||||
CONFIG_NET_SCH_GRED=m
|
|
||||||
CONFIG_NET_SCH_DSMARK=m
|
|
||||||
# CONFIG_NET_SCH_NETEM is not set
|
|
||||||
# CONFIG_NET_SCH_INGRESS is not set
|
|
||||||
CONFIG_NET_QOS=y
|
|
||||||
CONFIG_NET_ESTIMATOR=y
|
|
||||||
CONFIG_NET_CLS=y
|
|
||||||
# CONFIG_NET_CLS_BASIC is not set
|
|
||||||
CONFIG_NET_CLS_TCINDEX=m
|
|
||||||
CONFIG_NET_CLS_ROUTE4=m
|
|
||||||
CONFIG_NET_CLS_ROUTE=y
|
|
||||||
CONFIG_NET_CLS_FW=m
|
|
||||||
CONFIG_NET_CLS_U32=m
|
|
||||||
# CONFIG_CLS_U32_PERF is not set
|
|
||||||
# CONFIG_NET_CLS_IND is not set
|
|
||||||
CONFIG_NET_CLS_RSVP=m
|
|
||||||
CONFIG_NET_CLS_RSVP6=m
|
|
||||||
# CONFIG_NET_EMATCH is not set
|
|
||||||
# CONFIG_NET_CLS_ACT is not set
|
|
||||||
CONFIG_NET_CLS_POLICE=y
|
|
||||||
|
|
||||||
#
|
|
||||||
# Network testing
|
|
||||||
#
|
|
||||||
# CONFIG_NET_PKTGEN is not set
|
|
||||||
# CONFIG_NETPOLL is not set
|
|
||||||
# CONFIG_NET_POLL_CONTROLLER is not set
|
|
||||||
# CONFIG_HAMRADIO is not set
|
|
||||||
# CONFIG_IRDA is not set
|
|
||||||
# CONFIG_BT is not set
|
|
||||||
CONFIG_NETDEVICES=y
|
CONFIG_NETDEVICES=y
|
||||||
CONFIG_DUMMY=m
|
CONFIG_DUMMY=m
|
||||||
CONFIG_BONDING=m
|
CONFIG_BONDING=m
|
||||||
@ -411,12 +434,15 @@ CONFIG_CCWGROUP=y
|
|||||||
# CONFIG_SLIP is not set
|
# CONFIG_SLIP is not set
|
||||||
# CONFIG_SHAPER is not set
|
# CONFIG_SHAPER is not set
|
||||||
# CONFIG_NETCONSOLE is not set
|
# CONFIG_NETCONSOLE is not set
|
||||||
|
# CONFIG_NETPOLL is not set
|
||||||
|
# CONFIG_NET_POLL_CONTROLLER is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# File systems
|
# File systems
|
||||||
#
|
#
|
||||||
CONFIG_EXT2_FS=y
|
CONFIG_EXT2_FS=y
|
||||||
# CONFIG_EXT2_FS_XATTR is not set
|
# CONFIG_EXT2_FS_XATTR is not set
|
||||||
|
# CONFIG_EXT2_FS_XIP is not set
|
||||||
CONFIG_EXT3_FS=y
|
CONFIG_EXT3_FS=y
|
||||||
CONFIG_EXT3_FS_XATTR=y
|
CONFIG_EXT3_FS_XATTR=y
|
||||||
# CONFIG_EXT3_FS_POSIX_ACL is not set
|
# CONFIG_EXT3_FS_POSIX_ACL is not set
|
||||||
@ -426,6 +452,7 @@ CONFIG_JBD=y
|
|||||||
CONFIG_FS_MBCACHE=y
|
CONFIG_FS_MBCACHE=y
|
||||||
# CONFIG_REISERFS_FS is not set
|
# CONFIG_REISERFS_FS is not set
|
||||||
# CONFIG_JFS_FS is not set
|
# CONFIG_JFS_FS is not set
|
||||||
|
# CONFIG_FS_POSIX_ACL is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# XFS support
|
# XFS support
|
||||||
@ -433,6 +460,7 @@ CONFIG_FS_MBCACHE=y
|
|||||||
# CONFIG_XFS_FS is not set
|
# CONFIG_XFS_FS is not set
|
||||||
# CONFIG_MINIX_FS is not set
|
# CONFIG_MINIX_FS is not set
|
||||||
# CONFIG_ROMFS_FS is not set
|
# CONFIG_ROMFS_FS is not set
|
||||||
|
CONFIG_INOTIFY=y
|
||||||
# CONFIG_QUOTA is not set
|
# CONFIG_QUOTA is not set
|
||||||
CONFIG_DNOTIFY=y
|
CONFIG_DNOTIFY=y
|
||||||
# CONFIG_AUTOFS_FS is not set
|
# CONFIG_AUTOFS_FS is not set
|
||||||
@ -457,7 +485,6 @@ CONFIG_DNOTIFY=y
|
|||||||
CONFIG_PROC_FS=y
|
CONFIG_PROC_FS=y
|
||||||
CONFIG_PROC_KCORE=y
|
CONFIG_PROC_KCORE=y
|
||||||
CONFIG_SYSFS=y
|
CONFIG_SYSFS=y
|
||||||
# CONFIG_DEVFS_FS is not set
|
|
||||||
# CONFIG_DEVPTS_FS_XATTR is not set
|
# CONFIG_DEVPTS_FS_XATTR is not set
|
||||||
CONFIG_TMPFS=y
|
CONFIG_TMPFS=y
|
||||||
# CONFIG_TMPFS_XATTR is not set
|
# CONFIG_TMPFS_XATTR is not set
|
||||||
@ -486,15 +513,18 @@ CONFIG_RAMFS=y
|
|||||||
#
|
#
|
||||||
CONFIG_NFS_FS=y
|
CONFIG_NFS_FS=y
|
||||||
CONFIG_NFS_V3=y
|
CONFIG_NFS_V3=y
|
||||||
|
# CONFIG_NFS_V3_ACL is not set
|
||||||
# CONFIG_NFS_V4 is not set
|
# CONFIG_NFS_V4 is not set
|
||||||
# CONFIG_NFS_DIRECTIO is not set
|
# CONFIG_NFS_DIRECTIO is not set
|
||||||
CONFIG_NFSD=y
|
CONFIG_NFSD=y
|
||||||
CONFIG_NFSD_V3=y
|
CONFIG_NFSD_V3=y
|
||||||
|
# CONFIG_NFSD_V3_ACL is not set
|
||||||
# CONFIG_NFSD_V4 is not set
|
# CONFIG_NFSD_V4 is not set
|
||||||
CONFIG_NFSD_TCP=y
|
CONFIG_NFSD_TCP=y
|
||||||
CONFIG_LOCKD=y
|
CONFIG_LOCKD=y
|
||||||
CONFIG_LOCKD_V4=y
|
CONFIG_LOCKD_V4=y
|
||||||
CONFIG_EXPORTFS=y
|
CONFIG_EXPORTFS=y
|
||||||
|
CONFIG_NFS_COMMON=y
|
||||||
CONFIG_SUNRPC=y
|
CONFIG_SUNRPC=y
|
||||||
# CONFIG_RPCSEC_GSS_KRB5 is not set
|
# CONFIG_RPCSEC_GSS_KRB5 is not set
|
||||||
# CONFIG_RPCSEC_GSS_SPKM3 is not set
|
# CONFIG_RPCSEC_GSS_SPKM3 is not set
|
||||||
@ -544,11 +574,12 @@ CONFIG_MAGIC_SYSRQ=y
|
|||||||
CONFIG_LOG_BUF_SHIFT=17
|
CONFIG_LOG_BUF_SHIFT=17
|
||||||
# CONFIG_SCHEDSTATS is not set
|
# CONFIG_SCHEDSTATS is not set
|
||||||
# CONFIG_DEBUG_SLAB is not set
|
# CONFIG_DEBUG_SLAB is not set
|
||||||
|
CONFIG_DEBUG_PREEMPT=y
|
||||||
# CONFIG_DEBUG_SPINLOCK is not set
|
# CONFIG_DEBUG_SPINLOCK is not set
|
||||||
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
|
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
|
||||||
# CONFIG_DEBUG_KOBJECT is not set
|
# CONFIG_DEBUG_KOBJECT is not set
|
||||||
# CONFIG_DEBUG_INFO is not set
|
# CONFIG_DEBUG_INFO is not set
|
||||||
# CONFIG_DEBUG_FS is not set
|
CONFIG_DEBUG_FS=y
|
||||||
|
|
||||||
#
|
#
|
||||||
# Security options
|
# Security options
|
||||||
|
@ -346,6 +346,13 @@ iplstart:
|
|||||||
la %r2,.Lreset
|
la %r2,.Lreset
|
||||||
lhi %r3,26
|
lhi %r3,26
|
||||||
diag %r2,%r3,8
|
diag %r2,%r3,8
|
||||||
|
la %r5,.Lirb
|
||||||
|
stsch 0(%r5) # check if irq is pending
|
||||||
|
tm 30(%r5),0x0f # by verifying if any of the
|
||||||
|
bnz .Lwaitforirq # activity or status control
|
||||||
|
tm 31(%r5),0xff # bits is set in the schib
|
||||||
|
bz .Lnoreset
|
||||||
|
.Lwaitforirq:
|
||||||
mvc 0x78(8),.Lrdrnewpsw # set up IO interrupt psw
|
mvc 0x78(8),.Lrdrnewpsw # set up IO interrupt psw
|
||||||
.Lwaitrdrirq:
|
.Lwaitrdrirq:
|
||||||
lpsw .Lrdrwaitpsw
|
lpsw .Lrdrwaitpsw
|
||||||
|
@ -345,6 +345,13 @@ iplstart:
|
|||||||
la %r2,.Lreset
|
la %r2,.Lreset
|
||||||
lhi %r3,26
|
lhi %r3,26
|
||||||
diag %r2,%r3,8
|
diag %r2,%r3,8
|
||||||
|
la %r5,.Lirb
|
||||||
|
stsch 0(%r5) # check if irq is pending
|
||||||
|
tm 30(%r5),0x0f # by verifying if any of the
|
||||||
|
bnz .Lwaitforirq # activity or status control
|
||||||
|
tm 31(%r5),0xff # bits is set in the schib
|
||||||
|
bz .Lnoreset
|
||||||
|
.Lwaitforirq:
|
||||||
mvc 0x78(8),.Lrdrnewpsw # set up IO interrupt psw
|
mvc 0x78(8),.Lrdrnewpsw # set up IO interrupt psw
|
||||||
.Lwaitrdrirq:
|
.Lwaitrdrirq:
|
||||||
lpsw .Lrdrwaitpsw
|
lpsw .Lrdrwaitpsw
|
||||||
|
@ -19,6 +19,8 @@ harddog-objs := harddog_kern.o harddog_user.o
|
|||||||
|
|
||||||
LDFLAGS_pcap.o := -r $(shell $(CC) $(CFLAGS) -print-file-name=libpcap.a)
|
LDFLAGS_pcap.o := -r $(shell $(CC) $(CFLAGS) -print-file-name=libpcap.a)
|
||||||
|
|
||||||
|
targets := pcap_kern.o pcap_user.o
|
||||||
|
|
||||||
$(obj)/pcap.o: $(obj)/pcap_kern.o $(obj)/pcap_user.o
|
$(obj)/pcap.o: $(obj)/pcap_kern.o $(obj)/pcap_user.o
|
||||||
$(LD) -r -dp -o $@ $^ $(LDFLAGS) $(LDFLAGS_pcap.o)
|
$(LD) -r -dp -o $@ $^ $(LDFLAGS) $(LDFLAGS_pcap.o)
|
||||||
#XXX: The call below does not work because the flags are added before the
|
#XXX: The call below does not work because the flags are added before the
|
||||||
@ -26,7 +28,7 @@ $(obj)/pcap.o: $(obj)/pcap_kern.o $(obj)/pcap_user.o
|
|||||||
#$(call if_changed,ld)
|
#$(call if_changed,ld)
|
||||||
|
|
||||||
# When the above is fixed, don't forget to add this too!
|
# When the above is fixed, don't forget to add this too!
|
||||||
#targets := $(obj)/pcap.o
|
#targets += $(obj)/pcap.o
|
||||||
|
|
||||||
obj-y := stdio_console.o fd.o chan_kern.o chan_user.o line.o
|
obj-y := stdio_console.o fd.o chan_kern.o chan_user.o line.o
|
||||||
obj-$(CONFIG_SSL) += ssl.o
|
obj-$(CONFIG_SSL) += ssl.o
|
||||||
|
@ -557,7 +557,7 @@ static int create_proc_mconsole(void)
|
|||||||
|
|
||||||
ent = create_proc_entry("mconsole", S_IFREG | 0200, NULL);
|
ent = create_proc_entry("mconsole", S_IFREG | 0200, NULL);
|
||||||
if(ent == NULL){
|
if(ent == NULL){
|
||||||
printk("create_proc_mconsole : create_proc_entry failed\n");
|
printk(KERN_INFO "create_proc_mconsole : create_proc_entry failed\n");
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,7 +48,7 @@ static int make_proc_exitcode(void)
|
|||||||
|
|
||||||
ent = create_proc_entry("exitcode", 0600, &proc_root);
|
ent = create_proc_entry("exitcode", 0600, &proc_root);
|
||||||
if(ent == NULL){
|
if(ent == NULL){
|
||||||
printk("make_proc_exitcode : Failed to register "
|
printk(KERN_WARNING "make_proc_exitcode : Failed to register "
|
||||||
"/proc/exitcode\n");
|
"/proc/exitcode\n");
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
@ -131,7 +131,7 @@ int start_fork_tramp(void *thread_arg, unsigned long temp_stack,
|
|||||||
return(arg.pid);
|
return(arg.pid);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ptrace_child(void)
|
static int ptrace_child(void *arg)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
int pid = os_getpid(), ppid = getppid();
|
int pid = os_getpid(), ppid = getppid();
|
||||||
@ -160,16 +160,20 @@ static int ptrace_child(void)
|
|||||||
_exit(ret);
|
_exit(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int start_ptraced_child(void)
|
static int start_ptraced_child(void **stack_out)
|
||||||
{
|
{
|
||||||
|
void *stack;
|
||||||
|
unsigned long sp;
|
||||||
int pid, n, status;
|
int pid, n, status;
|
||||||
|
|
||||||
pid = fork();
|
stack = mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE | PROT_EXEC,
|
||||||
if(pid == 0)
|
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
|
||||||
ptrace_child();
|
if(stack == MAP_FAILED)
|
||||||
|
panic("check_ptrace : mmap failed, errno = %d", errno);
|
||||||
|
sp = (unsigned long) stack + PAGE_SIZE - sizeof(void *);
|
||||||
|
pid = clone(ptrace_child, (void *) sp, SIGCHLD, NULL);
|
||||||
if(pid < 0)
|
if(pid < 0)
|
||||||
panic("check_ptrace : fork failed, errno = %d", errno);
|
panic("check_ptrace : clone failed, errno = %d", errno);
|
||||||
CATCH_EINTR(n = waitpid(pid, &status, WUNTRACED));
|
CATCH_EINTR(n = waitpid(pid, &status, WUNTRACED));
|
||||||
if(n < 0)
|
if(n < 0)
|
||||||
panic("check_ptrace : wait failed, errno = %d", errno);
|
panic("check_ptrace : wait failed, errno = %d", errno);
|
||||||
@ -177,6 +181,7 @@ static int start_ptraced_child(void)
|
|||||||
panic("check_ptrace : expected SIGSTOP, got status = %d",
|
panic("check_ptrace : expected SIGSTOP, got status = %d",
|
||||||
status);
|
status);
|
||||||
|
|
||||||
|
*stack_out = stack;
|
||||||
return(pid);
|
return(pid);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -184,12 +189,12 @@ static int start_ptraced_child(void)
|
|||||||
* just avoid using sysemu, not panic, but only if SYSEMU features are broken.
|
* just avoid using sysemu, not panic, but only if SYSEMU features are broken.
|
||||||
* So only for SYSEMU features we test mustpanic, while normal host features
|
* So only for SYSEMU features we test mustpanic, while normal host features
|
||||||
* must work anyway!*/
|
* must work anyway!*/
|
||||||
static int stop_ptraced_child(int pid, int exitcode, int mustexit)
|
static int stop_ptraced_child(int pid, void *stack, int exitcode, int mustpanic)
|
||||||
{
|
{
|
||||||
int status, n, ret = 0;
|
int status, n, ret = 0;
|
||||||
|
|
||||||
if(ptrace(PTRACE_CONT, pid, 0, 0) < 0)
|
if(ptrace(PTRACE_CONT, pid, 0, 0) < 0)
|
||||||
panic("stop_ptraced_child : ptrace failed, errno = %d", errno);
|
panic("check_ptrace : ptrace failed, errno = %d", errno);
|
||||||
CATCH_EINTR(n = waitpid(pid, &status, 0));
|
CATCH_EINTR(n = waitpid(pid, &status, 0));
|
||||||
if(!WIFEXITED(status) || (WEXITSTATUS(status) != exitcode)) {
|
if(!WIFEXITED(status) || (WEXITSTATUS(status) != exitcode)) {
|
||||||
int exit_with = WEXITSTATUS(status);
|
int exit_with = WEXITSTATUS(status);
|
||||||
@ -200,13 +205,15 @@ static int stop_ptraced_child(int pid, int exitcode, int mustexit)
|
|||||||
printk("check_ptrace : child exited with exitcode %d, while "
|
printk("check_ptrace : child exited with exitcode %d, while "
|
||||||
"expecting %d; status 0x%x", exit_with,
|
"expecting %d; status 0x%x", exit_with,
|
||||||
exitcode, status);
|
exitcode, status);
|
||||||
if (mustexit)
|
if (mustpanic)
|
||||||
panic("\n");
|
panic("\n");
|
||||||
else
|
else
|
||||||
printk("\n");
|
printk("\n");
|
||||||
ret = -1;
|
ret = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(munmap(stack, PAGE_SIZE) < 0)
|
||||||
|
panic("check_ptrace : munmap failed, errno = %d", errno);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -242,11 +249,12 @@ __uml_setup("nosysemu", nosysemu_cmd_param,
|
|||||||
|
|
||||||
static void __init check_sysemu(void)
|
static void __init check_sysemu(void)
|
||||||
{
|
{
|
||||||
|
void *stack;
|
||||||
int pid, syscall, n, status, count=0;
|
int pid, syscall, n, status, count=0;
|
||||||
|
|
||||||
printk("Checking syscall emulation patch for ptrace...");
|
printk("Checking syscall emulation patch for ptrace...");
|
||||||
sysemu_supported = 0;
|
sysemu_supported = 0;
|
||||||
pid = start_ptraced_child();
|
pid = start_ptraced_child(&stack);
|
||||||
|
|
||||||
if(ptrace(PTRACE_SYSEMU, pid, 0, 0) < 0)
|
if(ptrace(PTRACE_SYSEMU, pid, 0, 0) < 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
@ -264,7 +272,7 @@ static void __init check_sysemu(void)
|
|||||||
panic("check_sysemu : failed to modify system "
|
panic("check_sysemu : failed to modify system "
|
||||||
"call return, errno = %d", errno);
|
"call return, errno = %d", errno);
|
||||||
|
|
||||||
if (stop_ptraced_child(pid, 0, 0) < 0)
|
if (stop_ptraced_child(pid, stack, 0, 0) < 0)
|
||||||
goto fail_stopped;
|
goto fail_stopped;
|
||||||
|
|
||||||
sysemu_supported = 1;
|
sysemu_supported = 1;
|
||||||
@ -272,7 +280,7 @@ static void __init check_sysemu(void)
|
|||||||
set_using_sysemu(!force_sysemu_disabled);
|
set_using_sysemu(!force_sysemu_disabled);
|
||||||
|
|
||||||
printk("Checking advanced syscall emulation patch for ptrace...");
|
printk("Checking advanced syscall emulation patch for ptrace...");
|
||||||
pid = start_ptraced_child();
|
pid = start_ptraced_child(&stack);
|
||||||
while(1){
|
while(1){
|
||||||
count++;
|
count++;
|
||||||
if(ptrace(PTRACE_SYSEMU_SINGLESTEP, pid, 0, 0) < 0)
|
if(ptrace(PTRACE_SYSEMU_SINGLESTEP, pid, 0, 0) < 0)
|
||||||
@ -297,7 +305,7 @@ static void __init check_sysemu(void)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (stop_ptraced_child(pid, 0, 0) < 0)
|
if (stop_ptraced_child(pid, stack, 0, 0) < 0)
|
||||||
goto fail_stopped;
|
goto fail_stopped;
|
||||||
|
|
||||||
sysemu_supported = 2;
|
sysemu_supported = 2;
|
||||||
@ -308,17 +316,18 @@ static void __init check_sysemu(void)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
stop_ptraced_child(pid, 1, 0);
|
stop_ptraced_child(pid, stack, 1, 0);
|
||||||
fail_stopped:
|
fail_stopped:
|
||||||
printk("missing\n");
|
printk("missing\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
void __init check_ptrace(void)
|
void __init check_ptrace(void)
|
||||||
{
|
{
|
||||||
|
void *stack;
|
||||||
int pid, syscall, n, status;
|
int pid, syscall, n, status;
|
||||||
|
|
||||||
printk("Checking that ptrace can change system call numbers...");
|
printk("Checking that ptrace can change system call numbers...");
|
||||||
pid = start_ptraced_child();
|
pid = start_ptraced_child(&stack);
|
||||||
|
|
||||||
if (ptrace(PTRACE_OLDSETOPTIONS, pid, 0, (void *)PTRACE_O_TRACESYSGOOD) < 0)
|
if (ptrace(PTRACE_OLDSETOPTIONS, pid, 0, (void *)PTRACE_O_TRACESYSGOOD) < 0)
|
||||||
panic("check_ptrace: PTRACE_SETOPTIONS failed, errno = %d", errno);
|
panic("check_ptrace: PTRACE_SETOPTIONS failed, errno = %d", errno);
|
||||||
@ -345,7 +354,7 @@ void __init check_ptrace(void)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
stop_ptraced_child(pid, 0, 1);
|
stop_ptraced_child(pid, stack, 0, 1);
|
||||||
printk("OK\n");
|
printk("OK\n");
|
||||||
check_sysemu();
|
check_sysemu();
|
||||||
}
|
}
|
||||||
@ -380,10 +389,11 @@ extern void *__syscall_stub_start, __syscall_stub_end;
|
|||||||
static inline void check_skas3_ptrace_support(void)
|
static inline void check_skas3_ptrace_support(void)
|
||||||
{
|
{
|
||||||
struct ptrace_faultinfo fi;
|
struct ptrace_faultinfo fi;
|
||||||
|
void *stack;
|
||||||
int pid, n;
|
int pid, n;
|
||||||
|
|
||||||
printf("Checking for the skas3 patch in the host...");
|
printf("Checking for the skas3 patch in the host...");
|
||||||
pid = start_ptraced_child();
|
pid = start_ptraced_child(&stack);
|
||||||
|
|
||||||
n = ptrace(PTRACE_FAULTINFO, pid, 0, &fi);
|
n = ptrace(PTRACE_FAULTINFO, pid, 0, &fi);
|
||||||
if (n < 0) {
|
if (n < 0) {
|
||||||
@ -402,7 +412,7 @@ static inline void check_skas3_ptrace_support(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
init_registers(pid);
|
init_registers(pid);
|
||||||
stop_ptraced_child(pid, 1, 1);
|
stop_ptraced_child(pid, stack, 1, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int can_do_skas(void)
|
int can_do_skas(void)
|
||||||
|
@ -412,7 +412,7 @@ int __init make_proc_sysemu(void)
|
|||||||
|
|
||||||
if (ent == NULL)
|
if (ent == NULL)
|
||||||
{
|
{
|
||||||
printk("Failed to register /proc/sysemu\n");
|
printk(KERN_WARNING "Failed to register /proc/sysemu\n");
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -64,7 +64,7 @@ void wait_stub_done(int pid, int sig, char * fname)
|
|||||||
(WSTOPSIG(status) == SIGVTALRM));
|
(WSTOPSIG(status) == SIGVTALRM));
|
||||||
|
|
||||||
if((n < 0) || !WIFSTOPPED(status) ||
|
if((n < 0) || !WIFSTOPPED(status) ||
|
||||||
(WSTOPSIG(status) != SIGUSR1 && WSTOPSIG(status != SIGTRAP))){
|
(WSTOPSIG(status) != SIGUSR1 && WSTOPSIG(status) != SIGTRAP)){
|
||||||
panic("%s : failed to wait for SIGUSR1/SIGTRAP, "
|
panic("%s : failed to wait for SIGUSR1/SIGTRAP, "
|
||||||
"pid = %d, n = %d, errno = %d, status = 0x%x\n",
|
"pid = %d, n = %d, errno = %d, status = 0x%x\n",
|
||||||
fname, pid, n, errno, status);
|
fname, pid, n, errno, status);
|
||||||
|
@ -58,7 +58,6 @@ void user_signal(int sig, union uml_pt_regs *regs, int pid)
|
|||||||
int segv = ((sig == SIGFPE) || (sig == SIGSEGV) || (sig == SIGBUS) ||
|
int segv = ((sig == SIGFPE) || (sig == SIGSEGV) || (sig == SIGBUS) ||
|
||||||
(sig == SIGILL) || (sig == SIGTRAP));
|
(sig == SIGILL) || (sig == SIGTRAP));
|
||||||
|
|
||||||
regs->skas.is_user = 1;
|
|
||||||
if (segv)
|
if (segv)
|
||||||
get_skas_faultinfo(pid, ®s->skas.faultinfo);
|
get_skas_faultinfo(pid, ®s->skas.faultinfo);
|
||||||
info = &sig_info[sig];
|
info = &sig_info[sig];
|
||||||
|
@ -137,7 +137,10 @@ long um_stime(int __user *tptr)
|
|||||||
void timer_handler(int sig, union uml_pt_regs *regs)
|
void timer_handler(int sig, union uml_pt_regs *regs)
|
||||||
{
|
{
|
||||||
local_irq_disable();
|
local_irq_disable();
|
||||||
update_process_times(CHOOSE_MODE(user_context(UPT_SP(regs)), (regs)->skas.is_user));
|
irq_enter();
|
||||||
|
update_process_times(CHOOSE_MODE(user_context(UPT_SP(regs)),
|
||||||
|
(regs)->skas.is_user));
|
||||||
|
irq_exit();
|
||||||
local_irq_enable();
|
local_irq_enable();
|
||||||
if(current_thread->cpu == 0)
|
if(current_thread->cpu == 0)
|
||||||
timer_irq(regs);
|
timer_irq(regs);
|
||||||
|
@ -9,9 +9,10 @@
|
|||||||
*/
|
*/
|
||||||
#include <elf.h>
|
#include <elf.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
#include <asm/elf.h>
|
||||||
#include "init.h"
|
#include "init.h"
|
||||||
#include "elf_user.h"
|
#include "elf_user.h"
|
||||||
#include <asm/elf.h>
|
#include "mem_user.h"
|
||||||
|
|
||||||
#if ELF_CLASS == ELFCLASS32
|
#if ELF_CLASS == ELFCLASS32
|
||||||
typedef Elf32_auxv_t elf_auxv_t;
|
typedef Elf32_auxv_t elf_auxv_t;
|
||||||
@ -41,6 +42,9 @@ __init void scan_elf_aux( char **envp)
|
|||||||
break;
|
break;
|
||||||
case AT_SYSINFO_EHDR:
|
case AT_SYSINFO_EHDR:
|
||||||
vsyscall_ehdr = auxv->a_un.a_val;
|
vsyscall_ehdr = auxv->a_un.a_val;
|
||||||
|
/* See if the page is under TASK_SIZE */
|
||||||
|
if (vsyscall_ehdr < (unsigned long) envp)
|
||||||
|
vsyscall_ehdr = 0;
|
||||||
break;
|
break;
|
||||||
case AT_HWCAP:
|
case AT_HWCAP:
|
||||||
elf_aux_hwcap = auxv->a_un.a_val;
|
elf_aux_hwcap = auxv->a_un.a_val;
|
||||||
|
@ -83,6 +83,9 @@ EXPORT_SYMBOL_PROTO(statfs64);
|
|||||||
|
|
||||||
EXPORT_SYMBOL_PROTO(getuid);
|
EXPORT_SYMBOL_PROTO(getuid);
|
||||||
|
|
||||||
|
EXPORT_SYMBOL_PROTO(fsync);
|
||||||
|
EXPORT_SYMBOL_PROTO(fdatasync);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Overrides for Emacs so that we follow Linus's tabbing style.
|
* Overrides for Emacs so that we follow Linus's tabbing style.
|
||||||
* Emacs will notice this stuff at the end of the file and automatically
|
* Emacs will notice this stuff at the end of the file and automatically
|
||||||
|
@ -21,10 +21,10 @@ stub_segv_handler(int sig)
|
|||||||
__asm__("movl %0, %%eax ; int $0x80": : "g" (__NR_getpid));
|
__asm__("movl %0, %%eax ; int $0x80": : "g" (__NR_getpid));
|
||||||
__asm__("movl %%eax, %%ebx ; movl %0, %%eax ; movl %1, %%ecx ;"
|
__asm__("movl %%eax, %%ebx ; movl %0, %%eax ; movl %1, %%ecx ;"
|
||||||
"int $0x80": : "g" (__NR_kill), "g" (SIGUSR1));
|
"int $0x80": : "g" (__NR_kill), "g" (SIGUSR1));
|
||||||
/* Pop the frame pointer and return address since we need to leave
|
/* Load pointer to sigcontext into esp, since we need to leave
|
||||||
* the stack in its original form when we do the sigreturn here, by
|
* the stack in its original form when we do the sigreturn here, by
|
||||||
* hand.
|
* hand.
|
||||||
*/
|
*/
|
||||||
__asm__("popl %%eax ; popl %%eax ; popl %%eax ; movl %0, %%eax ; "
|
__asm__("mov %0,%%esp ; movl %1, %%eax ; "
|
||||||
"int $0x80" : : "g" (__NR_sigreturn));
|
"int $0x80" : : "a" (sc), "g" (__NR_sigreturn));
|
||||||
}
|
}
|
||||||
|
@ -329,12 +329,15 @@ config HPET_EMULATE_RTC
|
|||||||
|
|
||||||
config GART_IOMMU
|
config GART_IOMMU
|
||||||
bool "IOMMU support"
|
bool "IOMMU support"
|
||||||
|
default y
|
||||||
depends on PCI
|
depends on PCI
|
||||||
help
|
help
|
||||||
Support the K8 IOMMU. Needed to run systems with more than 4GB of memory
|
Support the IOMMU. Needed to run systems with more than 3GB of memory
|
||||||
properly with 32-bit PCI devices that do not support DAC (Double Address
|
properly with 32-bit PCI devices that do not support DAC (Double Address
|
||||||
Cycle). The IOMMU can be turned off at runtime with the iommu=off parameter.
|
Cycle). The IOMMU can be turned off at runtime with the iommu=off parameter.
|
||||||
Normally the kernel will take the right choice by itself.
|
Normally the kernel will take the right choice by itself.
|
||||||
|
This option includes a driver for the AMD Opteron/Athlon64 IOMMU
|
||||||
|
and a software emulation used on some other systems.
|
||||||
If unsure, say Y.
|
If unsure, say Y.
|
||||||
|
|
||||||
# need this always enabled with GART_IOMMU for the VIA workaround
|
# need this always enabled with GART_IOMMU for the VIA workaround
|
||||||
|
@ -21,18 +21,6 @@
|
|||||||
#
|
#
|
||||||
# $Id: Makefile,v 1.31 2002/03/22 15:56:07 ak Exp $
|
# $Id: Makefile,v 1.31 2002/03/22 15:56:07 ak Exp $
|
||||||
|
|
||||||
#
|
|
||||||
# early bootup linking needs 32bit. You can either use real 32bit tools
|
|
||||||
# here or 64bit tools in 32bit mode.
|
|
||||||
#
|
|
||||||
IA32_CC := $(CC) $(CPPFLAGS) -m32 -O2 -fomit-frame-pointer
|
|
||||||
IA32_LD := $(LD) -m elf_i386
|
|
||||||
IA32_AS := $(CC) $(AFLAGS) -m32 -Wa,--32 -traditional -c
|
|
||||||
IA32_OBJCOPY := $(CROSS_COMPILE)objcopy
|
|
||||||
IA32_CPP := $(CROSS_COMPILE)gcc -m32 -E
|
|
||||||
export IA32_CC IA32_LD IA32_AS IA32_OBJCOPY IA32_CPP
|
|
||||||
|
|
||||||
|
|
||||||
LDFLAGS := -m elf_x86_64
|
LDFLAGS := -m elf_x86_64
|
||||||
OBJCOPYFLAGS := -O binary -R .note -R .comment -S
|
OBJCOPYFLAGS := -O binary -R .note -R .comment -S
|
||||||
LDFLAGS_vmlinux :=
|
LDFLAGS_vmlinux :=
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#
|
#
|
||||||
# Automatically generated make config: don't edit
|
# Automatically generated make config: don't edit
|
||||||
# Linux kernel version: 2.6.12-rc4
|
# Linux kernel version: 2.6.13-rc3
|
||||||
# Fri May 13 06:39:11 2005
|
# Fri Jul 22 16:47:31 2005
|
||||||
#
|
#
|
||||||
CONFIG_X86_64=y
|
CONFIG_X86_64=y
|
||||||
CONFIG_64BIT=y
|
CONFIG_64BIT=y
|
||||||
@ -84,14 +84,27 @@ CONFIG_X86_IO_APIC=y
|
|||||||
CONFIG_X86_LOCAL_APIC=y
|
CONFIG_X86_LOCAL_APIC=y
|
||||||
CONFIG_MTRR=y
|
CONFIG_MTRR=y
|
||||||
CONFIG_SMP=y
|
CONFIG_SMP=y
|
||||||
# CONFIG_PREEMPT is not set
|
|
||||||
CONFIG_SCHED_SMT=y
|
CONFIG_SCHED_SMT=y
|
||||||
|
CONFIG_PREEMPT_NONE=y
|
||||||
|
# CONFIG_PREEMPT_VOLUNTARY is not set
|
||||||
|
# CONFIG_PREEMPT is not set
|
||||||
|
CONFIG_PREEMPT_BKL=y
|
||||||
CONFIG_K8_NUMA=y
|
CONFIG_K8_NUMA=y
|
||||||
# CONFIG_NUMA_EMU is not set
|
# CONFIG_NUMA_EMU is not set
|
||||||
CONFIG_DISCONTIGMEM=y
|
CONFIG_ARCH_DISCONTIGMEM_ENABLE=y
|
||||||
CONFIG_NUMA=y
|
CONFIG_NUMA=y
|
||||||
|
CONFIG_ARCH_DISCONTIGMEM_DEFAULT=y
|
||||||
|
CONFIG_ARCH_SPARSEMEM_ENABLE=y
|
||||||
|
CONFIG_SELECT_MEMORY_MODEL=y
|
||||||
|
# CONFIG_FLATMEM_MANUAL is not set
|
||||||
|
CONFIG_DISCONTIGMEM_MANUAL=y
|
||||||
|
# CONFIG_SPARSEMEM_MANUAL is not set
|
||||||
|
CONFIG_DISCONTIGMEM=y
|
||||||
|
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||||
|
CONFIG_NEED_MULTIPLE_NODES=y
|
||||||
|
CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID=y
|
||||||
CONFIG_HAVE_DEC_LOCK=y
|
CONFIG_HAVE_DEC_LOCK=y
|
||||||
CONFIG_NR_CPUS=8
|
CONFIG_NR_CPUS=32
|
||||||
CONFIG_HPET_TIMER=y
|
CONFIG_HPET_TIMER=y
|
||||||
CONFIG_X86_PM_TIMER=y
|
CONFIG_X86_PM_TIMER=y
|
||||||
CONFIG_HPET_EMULATE_RTC=y
|
CONFIG_HPET_EMULATE_RTC=y
|
||||||
@ -99,7 +112,13 @@ CONFIG_GART_IOMMU=y
|
|||||||
CONFIG_SWIOTLB=y
|
CONFIG_SWIOTLB=y
|
||||||
CONFIG_X86_MCE=y
|
CONFIG_X86_MCE=y
|
||||||
CONFIG_X86_MCE_INTEL=y
|
CONFIG_X86_MCE_INTEL=y
|
||||||
|
CONFIG_PHYSICAL_START=0x100000
|
||||||
|
# CONFIG_KEXEC is not set
|
||||||
CONFIG_SECCOMP=y
|
CONFIG_SECCOMP=y
|
||||||
|
# CONFIG_HZ_100 is not set
|
||||||
|
CONFIG_HZ_250=y
|
||||||
|
# CONFIG_HZ_1000 is not set
|
||||||
|
CONFIG_HZ=250
|
||||||
CONFIG_GENERIC_HARDIRQS=y
|
CONFIG_GENERIC_HARDIRQS=y
|
||||||
CONFIG_GENERIC_IRQ_PROBE=y
|
CONFIG_GENERIC_IRQ_PROBE=y
|
||||||
CONFIG_ISA_DMA_API=y
|
CONFIG_ISA_DMA_API=y
|
||||||
@ -118,12 +137,11 @@ CONFIG_PM_STD_PARTITION=""
|
|||||||
CONFIG_ACPI=y
|
CONFIG_ACPI=y
|
||||||
CONFIG_ACPI_BOOT=y
|
CONFIG_ACPI_BOOT=y
|
||||||
CONFIG_ACPI_INTERPRETER=y
|
CONFIG_ACPI_INTERPRETER=y
|
||||||
CONFIG_ACPI_SLEEP=y
|
|
||||||
CONFIG_ACPI_SLEEP_PROC_FS=y
|
|
||||||
CONFIG_ACPI_AC=y
|
CONFIG_ACPI_AC=y
|
||||||
CONFIG_ACPI_BATTERY=y
|
CONFIG_ACPI_BATTERY=y
|
||||||
CONFIG_ACPI_BUTTON=y
|
CONFIG_ACPI_BUTTON=y
|
||||||
# CONFIG_ACPI_VIDEO is not set
|
# CONFIG_ACPI_VIDEO is not set
|
||||||
|
CONFIG_ACPI_HOTKEY=m
|
||||||
CONFIG_ACPI_FAN=y
|
CONFIG_ACPI_FAN=y
|
||||||
CONFIG_ACPI_PROCESSOR=y
|
CONFIG_ACPI_PROCESSOR=y
|
||||||
CONFIG_ACPI_THERMAL=y
|
CONFIG_ACPI_THERMAL=y
|
||||||
@ -154,6 +172,7 @@ CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
|
|||||||
# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set
|
# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set
|
||||||
CONFIG_CPU_FREQ_GOV_USERSPACE=y
|
CONFIG_CPU_FREQ_GOV_USERSPACE=y
|
||||||
CONFIG_CPU_FREQ_GOV_ONDEMAND=y
|
CONFIG_CPU_FREQ_GOV_ONDEMAND=y
|
||||||
|
# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# CPUFreq processor drivers
|
# CPUFreq processor drivers
|
||||||
@ -203,6 +222,76 @@ CONFIG_COMPAT=y
|
|||||||
CONFIG_SYSVIPC_COMPAT=y
|
CONFIG_SYSVIPC_COMPAT=y
|
||||||
CONFIG_UID16=y
|
CONFIG_UID16=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# Networking
|
||||||
|
#
|
||||||
|
CONFIG_NET=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# Networking options
|
||||||
|
#
|
||||||
|
CONFIG_PACKET=y
|
||||||
|
# CONFIG_PACKET_MMAP is not set
|
||||||
|
CONFIG_UNIX=y
|
||||||
|
# CONFIG_NET_KEY is not set
|
||||||
|
CONFIG_INET=y
|
||||||
|
CONFIG_IP_MULTICAST=y
|
||||||
|
# CONFIG_IP_ADVANCED_ROUTER is not set
|
||||||
|
CONFIG_IP_FIB_HASH=y
|
||||||
|
# CONFIG_IP_PNP is not set
|
||||||
|
# CONFIG_NET_IPIP is not set
|
||||||
|
# CONFIG_NET_IPGRE is not set
|
||||||
|
# CONFIG_IP_MROUTE is not set
|
||||||
|
# CONFIG_ARPD is not set
|
||||||
|
# CONFIG_SYN_COOKIES is not set
|
||||||
|
# CONFIG_INET_AH is not set
|
||||||
|
# CONFIG_INET_ESP is not set
|
||||||
|
# CONFIG_INET_IPCOMP is not set
|
||||||
|
# CONFIG_INET_TUNNEL is not set
|
||||||
|
CONFIG_IP_TCPDIAG=y
|
||||||
|
CONFIG_IP_TCPDIAG_IPV6=y
|
||||||
|
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||||
|
CONFIG_TCP_CONG_BIC=y
|
||||||
|
CONFIG_IPV6=y
|
||||||
|
# CONFIG_IPV6_PRIVACY is not set
|
||||||
|
# CONFIG_INET6_AH is not set
|
||||||
|
# CONFIG_INET6_ESP is not set
|
||||||
|
# CONFIG_INET6_IPCOMP is not set
|
||||||
|
# CONFIG_INET6_TUNNEL is not set
|
||||||
|
# CONFIG_IPV6_TUNNEL is not set
|
||||||
|
# CONFIG_NETFILTER is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# SCTP Configuration (EXPERIMENTAL)
|
||||||
|
#
|
||||||
|
# CONFIG_IP_SCTP is not set
|
||||||
|
# CONFIG_ATM is not set
|
||||||
|
# CONFIG_BRIDGE is not set
|
||||||
|
# CONFIG_VLAN_8021Q is not set
|
||||||
|
# CONFIG_DECNET is not set
|
||||||
|
# CONFIG_LLC2 is not set
|
||||||
|
# CONFIG_IPX is not set
|
||||||
|
# CONFIG_ATALK is not set
|
||||||
|
# CONFIG_X25 is not set
|
||||||
|
# CONFIG_LAPB is not set
|
||||||
|
# CONFIG_NET_DIVERT is not set
|
||||||
|
# CONFIG_ECONET is not set
|
||||||
|
# CONFIG_WAN_ROUTER is not set
|
||||||
|
# CONFIG_NET_SCHED is not set
|
||||||
|
# CONFIG_NET_CLS_ROUTE is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Network testing
|
||||||
|
#
|
||||||
|
# CONFIG_NET_PKTGEN is not set
|
||||||
|
CONFIG_NETPOLL=y
|
||||||
|
# CONFIG_NETPOLL_RX is not set
|
||||||
|
# CONFIG_NETPOLL_TRAP is not set
|
||||||
|
CONFIG_NET_POLL_CONTROLLER=y
|
||||||
|
# CONFIG_HAMRADIO is not set
|
||||||
|
# CONFIG_IRDA is not set
|
||||||
|
# CONFIG_BT is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Device Drivers
|
# Device Drivers
|
||||||
#
|
#
|
||||||
@ -308,6 +397,7 @@ CONFIG_BLK_DEV_AMD74XX=y
|
|||||||
# CONFIG_BLK_DEV_HPT366 is not set
|
# CONFIG_BLK_DEV_HPT366 is not set
|
||||||
# CONFIG_BLK_DEV_SC1200 is not set
|
# CONFIG_BLK_DEV_SC1200 is not set
|
||||||
CONFIG_BLK_DEV_PIIX=y
|
CONFIG_BLK_DEV_PIIX=y
|
||||||
|
# CONFIG_BLK_DEV_IT821X is not set
|
||||||
# CONFIG_BLK_DEV_NS87415 is not set
|
# CONFIG_BLK_DEV_NS87415 is not set
|
||||||
# CONFIG_BLK_DEV_PDC202XX_OLD is not set
|
# CONFIG_BLK_DEV_PDC202XX_OLD is not set
|
||||||
CONFIG_BLK_DEV_PDC202XX_NEW=y
|
CONFIG_BLK_DEV_PDC202XX_NEW=y
|
||||||
@ -338,6 +428,7 @@ CONFIG_BLK_DEV_SD=y
|
|||||||
# CONFIG_CHR_DEV_OSST is not set
|
# CONFIG_CHR_DEV_OSST is not set
|
||||||
# CONFIG_BLK_DEV_SR is not set
|
# CONFIG_BLK_DEV_SR is not set
|
||||||
# CONFIG_CHR_DEV_SG is not set
|
# CONFIG_CHR_DEV_SG is not set
|
||||||
|
# CONFIG_CHR_DEV_SCH is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
|
# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
|
||||||
@ -372,7 +463,6 @@ CONFIG_AIC79XX_DEBUG_MASK=0
|
|||||||
# CONFIG_MEGARAID_NEWGEN is not set
|
# CONFIG_MEGARAID_NEWGEN is not set
|
||||||
# CONFIG_MEGARAID_LEGACY is not set
|
# CONFIG_MEGARAID_LEGACY is not set
|
||||||
CONFIG_SCSI_SATA=y
|
CONFIG_SCSI_SATA=y
|
||||||
# CONFIG_SCSI_SATA_AHCI is not set
|
|
||||||
# CONFIG_SCSI_SATA_SVW is not set
|
# CONFIG_SCSI_SATA_SVW is not set
|
||||||
CONFIG_SCSI_ATA_PIIX=y
|
CONFIG_SCSI_ATA_PIIX=y
|
||||||
# CONFIG_SCSI_SATA_NV is not set
|
# CONFIG_SCSI_SATA_NV is not set
|
||||||
@ -410,14 +500,21 @@ CONFIG_SCSI_QLA2XXX=y
|
|||||||
#
|
#
|
||||||
# Multi-device support (RAID and LVM)
|
# Multi-device support (RAID and LVM)
|
||||||
#
|
#
|
||||||
# CONFIG_MD is not set
|
CONFIG_MD=y
|
||||||
|
# CONFIG_BLK_DEV_MD is not set
|
||||||
|
CONFIG_BLK_DEV_DM=y
|
||||||
|
# CONFIG_DM_CRYPT is not set
|
||||||
|
# CONFIG_DM_SNAPSHOT is not set
|
||||||
|
# CONFIG_DM_MIRROR is not set
|
||||||
|
# CONFIG_DM_ZERO is not set
|
||||||
|
# CONFIG_DM_MULTIPATH is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Fusion MPT device support
|
# Fusion MPT device support
|
||||||
#
|
#
|
||||||
CONFIG_FUSION=y
|
# CONFIG_FUSION is not set
|
||||||
CONFIG_FUSION_MAX_SGE=40
|
# CONFIG_FUSION_SPI is not set
|
||||||
# CONFIG_FUSION_CTL is not set
|
# CONFIG_FUSION_FC is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# IEEE 1394 (FireWire) support
|
# IEEE 1394 (FireWire) support
|
||||||
@ -430,75 +527,8 @@ CONFIG_FUSION_MAX_SGE=40
|
|||||||
# CONFIG_I2O is not set
|
# CONFIG_I2O is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Networking support
|
# Network device support
|
||||||
#
|
#
|
||||||
CONFIG_NET=y
|
|
||||||
|
|
||||||
#
|
|
||||||
# Networking options
|
|
||||||
#
|
|
||||||
CONFIG_PACKET=y
|
|
||||||
# CONFIG_PACKET_MMAP is not set
|
|
||||||
CONFIG_UNIX=y
|
|
||||||
# CONFIG_NET_KEY is not set
|
|
||||||
CONFIG_INET=y
|
|
||||||
CONFIG_IP_MULTICAST=y
|
|
||||||
# CONFIG_IP_ADVANCED_ROUTER is not set
|
|
||||||
# CONFIG_IP_PNP is not set
|
|
||||||
# CONFIG_NET_IPIP is not set
|
|
||||||
# CONFIG_NET_IPGRE is not set
|
|
||||||
# CONFIG_IP_MROUTE is not set
|
|
||||||
# CONFIG_ARPD is not set
|
|
||||||
# CONFIG_SYN_COOKIES is not set
|
|
||||||
# CONFIG_INET_AH is not set
|
|
||||||
# CONFIG_INET_ESP is not set
|
|
||||||
# CONFIG_INET_IPCOMP is not set
|
|
||||||
# CONFIG_INET_TUNNEL is not set
|
|
||||||
CONFIG_IP_TCPDIAG=y
|
|
||||||
CONFIG_IP_TCPDIAG_IPV6=y
|
|
||||||
CONFIG_IPV6=y
|
|
||||||
# CONFIG_IPV6_PRIVACY is not set
|
|
||||||
# CONFIG_INET6_AH is not set
|
|
||||||
# CONFIG_INET6_ESP is not set
|
|
||||||
# CONFIG_INET6_IPCOMP is not set
|
|
||||||
# CONFIG_INET6_TUNNEL is not set
|
|
||||||
# CONFIG_IPV6_TUNNEL is not set
|
|
||||||
# CONFIG_NETFILTER is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# SCTP Configuration (EXPERIMENTAL)
|
|
||||||
#
|
|
||||||
# CONFIG_IP_SCTP is not set
|
|
||||||
# CONFIG_ATM is not set
|
|
||||||
# CONFIG_BRIDGE is not set
|
|
||||||
# CONFIG_VLAN_8021Q is not set
|
|
||||||
# CONFIG_DECNET is not set
|
|
||||||
# CONFIG_LLC2 is not set
|
|
||||||
# CONFIG_IPX is not set
|
|
||||||
# CONFIG_ATALK is not set
|
|
||||||
# CONFIG_X25 is not set
|
|
||||||
# CONFIG_LAPB is not set
|
|
||||||
# CONFIG_NET_DIVERT is not set
|
|
||||||
# CONFIG_ECONET is not set
|
|
||||||
# CONFIG_WAN_ROUTER is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# QoS and/or fair queueing
|
|
||||||
#
|
|
||||||
# CONFIG_NET_SCHED is not set
|
|
||||||
# CONFIG_NET_CLS_ROUTE is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# Network testing
|
|
||||||
#
|
|
||||||
# CONFIG_NET_PKTGEN is not set
|
|
||||||
CONFIG_NETPOLL=y
|
|
||||||
# CONFIG_NETPOLL_RX is not set
|
|
||||||
# CONFIG_NETPOLL_TRAP is not set
|
|
||||||
CONFIG_NET_POLL_CONTROLLER=y
|
|
||||||
# CONFIG_HAMRADIO is not set
|
|
||||||
# CONFIG_IRDA is not set
|
|
||||||
# CONFIG_BT is not set
|
|
||||||
CONFIG_NETDEVICES=y
|
CONFIG_NETDEVICES=y
|
||||||
# CONFIG_DUMMY is not set
|
# CONFIG_DUMMY is not set
|
||||||
# CONFIG_BONDING is not set
|
# CONFIG_BONDING is not set
|
||||||
@ -517,7 +547,9 @@ CONFIG_NET_ETHERNET=y
|
|||||||
CONFIG_MII=y
|
CONFIG_MII=y
|
||||||
# CONFIG_HAPPYMEAL is not set
|
# CONFIG_HAPPYMEAL is not set
|
||||||
# CONFIG_SUNGEM is not set
|
# CONFIG_SUNGEM is not set
|
||||||
# CONFIG_NET_VENDOR_3COM is not set
|
CONFIG_NET_VENDOR_3COM=y
|
||||||
|
CONFIG_VORTEX=y
|
||||||
|
# CONFIG_TYPHOON is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Tulip family network device support
|
# Tulip family network device support
|
||||||
@ -532,7 +564,7 @@ CONFIG_NET_PCI=y
|
|||||||
CONFIG_FORCEDETH=y
|
CONFIG_FORCEDETH=y
|
||||||
# CONFIG_DGRS is not set
|
# CONFIG_DGRS is not set
|
||||||
# CONFIG_EEPRO100 is not set
|
# CONFIG_EEPRO100 is not set
|
||||||
# CONFIG_E100 is not set
|
CONFIG_E100=y
|
||||||
# CONFIG_FEALNX is not set
|
# CONFIG_FEALNX is not set
|
||||||
# CONFIG_NATSEMI is not set
|
# CONFIG_NATSEMI is not set
|
||||||
# CONFIG_NE2K_PCI is not set
|
# CONFIG_NE2K_PCI is not set
|
||||||
@ -553,14 +585,15 @@ CONFIG_8139TOO=y
|
|||||||
# CONFIG_ACENIC is not set
|
# CONFIG_ACENIC is not set
|
||||||
# CONFIG_DL2K is not set
|
# CONFIG_DL2K is not set
|
||||||
CONFIG_E1000=y
|
CONFIG_E1000=y
|
||||||
# CONFIG_E1000_NAPI is not set
|
|
||||||
# CONFIG_NS83820 is not set
|
# CONFIG_NS83820 is not set
|
||||||
# CONFIG_HAMACHI is not set
|
# CONFIG_HAMACHI is not set
|
||||||
# CONFIG_YELLOWFIN is not set
|
# CONFIG_YELLOWFIN is not set
|
||||||
# CONFIG_R8169 is not set
|
# CONFIG_R8169 is not set
|
||||||
|
# CONFIG_SKGE is not set
|
||||||
# CONFIG_SK98LIN is not set
|
# CONFIG_SK98LIN is not set
|
||||||
# CONFIG_VIA_VELOCITY is not set
|
# CONFIG_VIA_VELOCITY is not set
|
||||||
CONFIG_TIGON3=y
|
CONFIG_TIGON3=y
|
||||||
|
# CONFIG_BNX2 is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Ethernet (10000 Mbit)
|
# Ethernet (10000 Mbit)
|
||||||
@ -647,7 +680,6 @@ CONFIG_SERIO_I8042=y
|
|||||||
CONFIG_SERIO_LIBPS2=y
|
CONFIG_SERIO_LIBPS2=y
|
||||||
# CONFIG_SERIO_RAW is not set
|
# CONFIG_SERIO_RAW is not set
|
||||||
# CONFIG_GAMEPORT is not set
|
# CONFIG_GAMEPORT is not set
|
||||||
CONFIG_SOUND_GAMEPORT=y
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Character devices
|
# Character devices
|
||||||
@ -716,12 +748,19 @@ CONFIG_MAX_RAW_DEVS=256
|
|||||||
# I2C support
|
# I2C support
|
||||||
#
|
#
|
||||||
# CONFIG_I2C is not set
|
# CONFIG_I2C is not set
|
||||||
|
# CONFIG_I2C_SENSOR is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Dallas's 1-wire bus
|
# Dallas's 1-wire bus
|
||||||
#
|
#
|
||||||
# CONFIG_W1 is not set
|
# CONFIG_W1 is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Hardware Monitoring support
|
||||||
|
#
|
||||||
|
CONFIG_HWMON=y
|
||||||
|
# CONFIG_HWMON_DEBUG_CHIP is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Misc devices
|
# Misc devices
|
||||||
#
|
#
|
||||||
@ -808,6 +847,7 @@ CONFIG_USB_DEVICEFS=y
|
|||||||
CONFIG_USB_EHCI_HCD=y
|
CONFIG_USB_EHCI_HCD=y
|
||||||
# CONFIG_USB_EHCI_SPLIT_ISO is not set
|
# CONFIG_USB_EHCI_SPLIT_ISO is not set
|
||||||
# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
|
# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
|
||||||
|
# CONFIG_USB_ISP116X_HCD is not set
|
||||||
CONFIG_USB_OHCI_HCD=y
|
CONFIG_USB_OHCI_HCD=y
|
||||||
# CONFIG_USB_OHCI_BIG_ENDIAN is not set
|
# CONFIG_USB_OHCI_BIG_ENDIAN is not set
|
||||||
CONFIG_USB_OHCI_LITTLE_ENDIAN=y
|
CONFIG_USB_OHCI_LITTLE_ENDIAN=y
|
||||||
@ -846,12 +886,15 @@ CONFIG_USB_HIDINPUT=y
|
|||||||
# CONFIG_USB_HIDDEV is not set
|
# CONFIG_USB_HIDDEV is not set
|
||||||
# CONFIG_USB_AIPTEK is not set
|
# CONFIG_USB_AIPTEK is not set
|
||||||
# CONFIG_USB_WACOM is not set
|
# CONFIG_USB_WACOM is not set
|
||||||
|
# CONFIG_USB_ACECAD is not set
|
||||||
# CONFIG_USB_KBTAB is not set
|
# CONFIG_USB_KBTAB is not set
|
||||||
# CONFIG_USB_POWERMATE is not set
|
# CONFIG_USB_POWERMATE is not set
|
||||||
# CONFIG_USB_MTOUCH is not set
|
# CONFIG_USB_MTOUCH is not set
|
||||||
|
# CONFIG_USB_ITMTOUCH is not set
|
||||||
# CONFIG_USB_EGALAX is not set
|
# CONFIG_USB_EGALAX is not set
|
||||||
# CONFIG_USB_XPAD is not set
|
# CONFIG_USB_XPAD is not set
|
||||||
# CONFIG_USB_ATI_REMOTE is not set
|
# CONFIG_USB_ATI_REMOTE is not set
|
||||||
|
# CONFIG_USB_KEYSPAN_REMOTE is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# USB Imaging devices
|
# USB Imaging devices
|
||||||
@ -902,10 +945,11 @@ CONFIG_USB_MON=y
|
|||||||
# CONFIG_USB_PHIDGETSERVO is not set
|
# CONFIG_USB_PHIDGETSERVO is not set
|
||||||
# CONFIG_USB_IDMOUSE is not set
|
# CONFIG_USB_IDMOUSE is not set
|
||||||
# CONFIG_USB_SISUSBVGA is not set
|
# CONFIG_USB_SISUSBVGA is not set
|
||||||
|
# CONFIG_USB_LD is not set
|
||||||
# CONFIG_USB_TEST is not set
|
# CONFIG_USB_TEST is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# USB ATM/DSL drivers
|
# USB DSL modem support
|
||||||
#
|
#
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -923,6 +967,10 @@ CONFIG_USB_MON=y
|
|||||||
#
|
#
|
||||||
# CONFIG_INFINIBAND is not set
|
# CONFIG_INFINIBAND is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# SN Devices
|
||||||
|
#
|
||||||
|
|
||||||
#
|
#
|
||||||
# Firmware Drivers
|
# Firmware Drivers
|
||||||
#
|
#
|
||||||
@ -935,6 +983,7 @@ CONFIG_EXT2_FS=y
|
|||||||
CONFIG_EXT2_FS_XATTR=y
|
CONFIG_EXT2_FS_XATTR=y
|
||||||
CONFIG_EXT2_FS_POSIX_ACL=y
|
CONFIG_EXT2_FS_POSIX_ACL=y
|
||||||
# CONFIG_EXT2_FS_SECURITY is not set
|
# CONFIG_EXT2_FS_SECURITY is not set
|
||||||
|
# CONFIG_EXT2_FS_XIP is not set
|
||||||
CONFIG_EXT3_FS=y
|
CONFIG_EXT3_FS=y
|
||||||
CONFIG_EXT3_FS_XATTR=y
|
CONFIG_EXT3_FS_XATTR=y
|
||||||
CONFIG_EXT3_FS_POSIX_ACL=y
|
CONFIG_EXT3_FS_POSIX_ACL=y
|
||||||
@ -957,6 +1006,7 @@ CONFIG_FS_POSIX_ACL=y
|
|||||||
# CONFIG_XFS_FS is not set
|
# CONFIG_XFS_FS is not set
|
||||||
# CONFIG_MINIX_FS is not set
|
# CONFIG_MINIX_FS is not set
|
||||||
# CONFIG_ROMFS_FS is not set
|
# CONFIG_ROMFS_FS is not set
|
||||||
|
CONFIG_INOTIFY=y
|
||||||
# CONFIG_QUOTA is not set
|
# CONFIG_QUOTA is not set
|
||||||
CONFIG_DNOTIFY=y
|
CONFIG_DNOTIFY=y
|
||||||
CONFIG_AUTOFS_FS=y
|
CONFIG_AUTOFS_FS=y
|
||||||
@ -986,7 +1036,6 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
|
|||||||
CONFIG_PROC_FS=y
|
CONFIG_PROC_FS=y
|
||||||
CONFIG_PROC_KCORE=y
|
CONFIG_PROC_KCORE=y
|
||||||
CONFIG_SYSFS=y
|
CONFIG_SYSFS=y
|
||||||
# CONFIG_DEVFS_FS is not set
|
|
||||||
# CONFIG_DEVPTS_FS_XATTR is not set
|
# CONFIG_DEVPTS_FS_XATTR is not set
|
||||||
CONFIG_TMPFS=y
|
CONFIG_TMPFS=y
|
||||||
# CONFIG_TMPFS_XATTR is not set
|
# CONFIG_TMPFS_XATTR is not set
|
||||||
@ -1016,15 +1065,18 @@ CONFIG_RAMFS=y
|
|||||||
#
|
#
|
||||||
CONFIG_NFS_FS=y
|
CONFIG_NFS_FS=y
|
||||||
CONFIG_NFS_V3=y
|
CONFIG_NFS_V3=y
|
||||||
|
# CONFIG_NFS_V3_ACL is not set
|
||||||
# CONFIG_NFS_V4 is not set
|
# CONFIG_NFS_V4 is not set
|
||||||
# CONFIG_NFS_DIRECTIO is not set
|
# CONFIG_NFS_DIRECTIO is not set
|
||||||
CONFIG_NFSD=y
|
CONFIG_NFSD=y
|
||||||
CONFIG_NFSD_V3=y
|
CONFIG_NFSD_V3=y
|
||||||
|
# CONFIG_NFSD_V3_ACL is not set
|
||||||
# CONFIG_NFSD_V4 is not set
|
# CONFIG_NFSD_V4 is not set
|
||||||
CONFIG_NFSD_TCP=y
|
CONFIG_NFSD_TCP=y
|
||||||
CONFIG_LOCKD=y
|
CONFIG_LOCKD=y
|
||||||
CONFIG_LOCKD_V4=y
|
CONFIG_LOCKD_V4=y
|
||||||
CONFIG_EXPORTFS=y
|
CONFIG_EXPORTFS=y
|
||||||
|
CONFIG_NFS_COMMON=y
|
||||||
CONFIG_SUNRPC=y
|
CONFIG_SUNRPC=y
|
||||||
# CONFIG_RPCSEC_GSS_KRB5 is not set
|
# CONFIG_RPCSEC_GSS_KRB5 is not set
|
||||||
# CONFIG_RPCSEC_GSS_SPKM3 is not set
|
# CONFIG_RPCSEC_GSS_SPKM3 is not set
|
||||||
|
@ -4,14 +4,14 @@
|
|||||||
|
|
||||||
obj-$(CONFIG_IA32_EMULATION) := ia32entry.o sys_ia32.o ia32_ioctl.o \
|
obj-$(CONFIG_IA32_EMULATION) := ia32entry.o sys_ia32.o ia32_ioctl.o \
|
||||||
ia32_signal.o tls32.o \
|
ia32_signal.o tls32.o \
|
||||||
ia32_binfmt.o fpu32.o ptrace32.o syscall32.o
|
ia32_binfmt.o fpu32.o ptrace32.o syscall32.o syscall32_syscall.o
|
||||||
|
|
||||||
sysv-$(CONFIG_SYSVIPC) := ipc32.o
|
sysv-$(CONFIG_SYSVIPC) := ipc32.o
|
||||||
obj-$(CONFIG_IA32_EMULATION) += $(sysv-y)
|
obj-$(CONFIG_IA32_EMULATION) += $(sysv-y)
|
||||||
|
|
||||||
obj-$(CONFIG_IA32_AOUT) += ia32_aout.o
|
obj-$(CONFIG_IA32_AOUT) += ia32_aout.o
|
||||||
|
|
||||||
$(obj)/syscall32.o: $(src)/syscall32.c \
|
$(obj)/syscall32_syscall.o: \
|
||||||
$(foreach F,sysenter syscall,$(obj)/vsyscall-$F.so)
|
$(foreach F,sysenter syscall,$(obj)/vsyscall-$F.so)
|
||||||
|
|
||||||
# Teach kbuild about targets
|
# Teach kbuild about targets
|
||||||
|
@ -14,16 +14,6 @@
|
|||||||
#include <asm/tlbflush.h>
|
#include <asm/tlbflush.h>
|
||||||
#include <asm/ia32_unistd.h>
|
#include <asm/ia32_unistd.h>
|
||||||
|
|
||||||
/* 32bit VDSOs mapped into user space. */
|
|
||||||
asm(".section \".init.data\",\"aw\"\n"
|
|
||||||
"syscall32_syscall:\n"
|
|
||||||
".incbin \"arch/x86_64/ia32/vsyscall-syscall.so\"\n"
|
|
||||||
"syscall32_syscall_end:\n"
|
|
||||||
"syscall32_sysenter:\n"
|
|
||||||
".incbin \"arch/x86_64/ia32/vsyscall-sysenter.so\"\n"
|
|
||||||
"syscall32_sysenter_end:\n"
|
|
||||||
".previous");
|
|
||||||
|
|
||||||
extern unsigned char syscall32_syscall[], syscall32_syscall_end[];
|
extern unsigned char syscall32_syscall[], syscall32_syscall_end[];
|
||||||
extern unsigned char syscall32_sysenter[], syscall32_sysenter_end[];
|
extern unsigned char syscall32_sysenter[], syscall32_sysenter_end[];
|
||||||
extern int sysctl_vsyscall32;
|
extern int sysctl_vsyscall32;
|
||||||
|
17
arch/x86_64/ia32/syscall32_syscall.S
Normal file
17
arch/x86_64/ia32/syscall32_syscall.S
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
/* 32bit VDSOs mapped into user space. */
|
||||||
|
|
||||||
|
.section ".init.data","aw"
|
||||||
|
|
||||||
|
.globl syscall32_syscall
|
||||||
|
.globl syscall32_syscall_end
|
||||||
|
|
||||||
|
syscall32_syscall:
|
||||||
|
.incbin "arch/x86_64/ia32/vsyscall-syscall.so"
|
||||||
|
syscall32_syscall_end:
|
||||||
|
|
||||||
|
.globl syscall32_sysenter
|
||||||
|
.globl syscall32_sysenter_end
|
||||||
|
|
||||||
|
syscall32_sysenter:
|
||||||
|
.incbin "arch/x86_64/ia32/vsyscall-sysenter.so"
|
||||||
|
syscall32_sysenter_end:
|
@ -76,7 +76,7 @@
|
|||||||
|
|
||||||
.macro FAKE_STACK_FRAME child_rip
|
.macro FAKE_STACK_FRAME child_rip
|
||||||
/* push in order ss, rsp, eflags, cs, rip */
|
/* push in order ss, rsp, eflags, cs, rip */
|
||||||
xorq %rax, %rax
|
xorl %eax, %eax
|
||||||
pushq %rax /* ss */
|
pushq %rax /* ss */
|
||||||
CFI_ADJUST_CFA_OFFSET 8
|
CFI_ADJUST_CFA_OFFSET 8
|
||||||
pushq %rax /* rsp */
|
pushq %rax /* rsp */
|
||||||
@ -423,7 +423,7 @@ ENTRY(stub_rt_sigreturn)
|
|||||||
testl $3,CS(%rdi)
|
testl $3,CS(%rdi)
|
||||||
je 1f
|
je 1f
|
||||||
swapgs
|
swapgs
|
||||||
1: addl $1,%gs:pda_irqcount # RED-PEN should check preempt count
|
1: incl %gs:pda_irqcount # RED-PEN should check preempt count
|
||||||
movq %gs:pda_irqstackptr,%rax
|
movq %gs:pda_irqstackptr,%rax
|
||||||
cmoveq %rax,%rsp
|
cmoveq %rax,%rsp
|
||||||
pushq %rdi # save old stack
|
pushq %rdi # save old stack
|
||||||
@ -436,7 +436,7 @@ ENTRY(common_interrupt)
|
|||||||
ret_from_intr:
|
ret_from_intr:
|
||||||
popq %rdi
|
popq %rdi
|
||||||
cli
|
cli
|
||||||
subl $1,%gs:pda_irqcount
|
decl %gs:pda_irqcount
|
||||||
#ifdef CONFIG_DEBUG_INFO
|
#ifdef CONFIG_DEBUG_INFO
|
||||||
movq RBP(%rdi),%rbp
|
movq RBP(%rdi),%rbp
|
||||||
#endif
|
#endif
|
||||||
@ -494,7 +494,7 @@ retint_signal:
|
|||||||
sti
|
sti
|
||||||
SAVE_REST
|
SAVE_REST
|
||||||
movq $-1,ORIG_RAX(%rsp)
|
movq $-1,ORIG_RAX(%rsp)
|
||||||
xorq %rsi,%rsi # oldset
|
xorl %esi,%esi # oldset
|
||||||
movq %rsp,%rdi # &pt_regs
|
movq %rsp,%rdi # &pt_regs
|
||||||
call do_notify_resume
|
call do_notify_resume
|
||||||
RESTORE_REST
|
RESTORE_REST
|
||||||
@ -752,7 +752,7 @@ child_rip:
|
|||||||
movq %rsi, %rdi
|
movq %rsi, %rdi
|
||||||
call *%rax
|
call *%rax
|
||||||
# exit
|
# exit
|
||||||
xorq %rdi, %rdi
|
xorl %edi, %edi
|
||||||
call do_exit
|
call do_exit
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -918,3 +918,15 @@ ENTRY(machine_check)
|
|||||||
ENTRY(call_debug)
|
ENTRY(call_debug)
|
||||||
zeroentry do_call_debug
|
zeroentry do_call_debug
|
||||||
|
|
||||||
|
ENTRY(call_softirq)
|
||||||
|
movq %gs:pda_irqstackptr,%rax
|
||||||
|
pushq %r15
|
||||||
|
movq %rsp,%r15
|
||||||
|
incl %gs:pda_irqcount
|
||||||
|
cmove %rax,%rsp
|
||||||
|
call __do_softirq
|
||||||
|
movq %r15,%rsp
|
||||||
|
decl %gs:pda_irqcount
|
||||||
|
popq %r15
|
||||||
|
ret
|
||||||
|
|
||||||
|
@ -31,6 +31,7 @@ u8 x86_cpu_to_log_apicid[NR_CPUS] = { [0 ... NR_CPUS-1] = BAD_APICID };
|
|||||||
|
|
||||||
extern struct genapic apic_cluster;
|
extern struct genapic apic_cluster;
|
||||||
extern struct genapic apic_flat;
|
extern struct genapic apic_flat;
|
||||||
|
extern struct genapic apic_physflat;
|
||||||
|
|
||||||
struct genapic *genapic = &apic_flat;
|
struct genapic *genapic = &apic_flat;
|
||||||
|
|
||||||
@ -44,12 +45,7 @@ void __init clustered_apic_check(void)
|
|||||||
u8 clusters, max_cluster;
|
u8 clusters, max_cluster;
|
||||||
u8 id;
|
u8 id;
|
||||||
u8 cluster_cnt[NUM_APIC_CLUSTERS];
|
u8 cluster_cnt[NUM_APIC_CLUSTERS];
|
||||||
|
int num_cpus = 0;
|
||||||
if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD) {
|
|
||||||
/* AMD always uses flat mode right now */
|
|
||||||
genapic = &apic_flat;
|
|
||||||
goto print;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(CONFIG_ACPI_BUS)
|
#if defined(CONFIG_ACPI_BUS)
|
||||||
/*
|
/*
|
||||||
@ -64,15 +60,34 @@ void __init clustered_apic_check(void)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
memset(cluster_cnt, 0, sizeof(cluster_cnt));
|
memset(cluster_cnt, 0, sizeof(cluster_cnt));
|
||||||
|
|
||||||
for (i = 0; i < NR_CPUS; i++) {
|
for (i = 0; i < NR_CPUS; i++) {
|
||||||
id = bios_cpu_apicid[i];
|
id = bios_cpu_apicid[i];
|
||||||
if (id != BAD_APICID)
|
if (id == BAD_APICID)
|
||||||
cluster_cnt[APIC_CLUSTERID(id)]++;
|
continue;
|
||||||
|
num_cpus++;
|
||||||
|
cluster_cnt[APIC_CLUSTERID(id)]++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Don't use clustered mode on AMD platforms. */
|
||||||
|
if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD) {
|
||||||
|
genapic = &apic_physflat;
|
||||||
|
#ifndef CONFIG_CPU_HOTPLUG
|
||||||
|
/* In the CPU hotplug case we cannot use broadcast mode
|
||||||
|
because that opens a race when a CPU is removed.
|
||||||
|
Stay at physflat mode in this case.
|
||||||
|
It is bad to do this unconditionally though. Once
|
||||||
|
we have ACPI platform support for CPU hotplug
|
||||||
|
we should detect hotplug capablity from ACPI tables and
|
||||||
|
only do this when really needed. -AK */
|
||||||
|
if (num_cpus <= 8)
|
||||||
|
genapic = &apic_flat;
|
||||||
|
#endif
|
||||||
|
goto print;
|
||||||
|
}
|
||||||
|
|
||||||
clusters = 0;
|
clusters = 0;
|
||||||
max_cluster = 0;
|
max_cluster = 0;
|
||||||
|
|
||||||
for (i = 0; i < NUM_APIC_CLUSTERS; i++) {
|
for (i = 0; i < NUM_APIC_CLUSTERS; i++) {
|
||||||
if (cluster_cnt[i] > 0) {
|
if (cluster_cnt[i] > 0) {
|
||||||
++clusters;
|
++clusters;
|
||||||
|
@ -2,13 +2,11 @@
|
|||||||
* Copyright 2004 James Cleverdon, IBM.
|
* Copyright 2004 James Cleverdon, IBM.
|
||||||
* Subject to the GNU Public License, v.2
|
* Subject to the GNU Public License, v.2
|
||||||
*
|
*
|
||||||
* Flat APIC subarch code. Maximum 8 CPUs, logical delivery.
|
* Flat APIC subarch code.
|
||||||
*
|
*
|
||||||
* Hacked for x86-64 by James Cleverdon from i386 architecture code by
|
* Hacked for x86-64 by James Cleverdon from i386 architecture code by
|
||||||
* Martin Bligh, Andi Kleen, James Bottomley, John Stultz, and
|
* Martin Bligh, Andi Kleen, James Bottomley, John Stultz, and
|
||||||
* James Cleverdon.
|
* James Cleverdon.
|
||||||
* Ashok Raj <ashok.raj@intel.com>
|
|
||||||
* Removed IPI broadcast shortcut to support CPU hotplug
|
|
||||||
*/
|
*/
|
||||||
#include <linux/config.h>
|
#include <linux/config.h>
|
||||||
#include <linux/threads.h>
|
#include <linux/threads.h>
|
||||||
@ -20,47 +18,6 @@
|
|||||||
#include <asm/smp.h>
|
#include <asm/smp.h>
|
||||||
#include <asm/ipi.h>
|
#include <asm/ipi.h>
|
||||||
|
|
||||||
/*
|
|
||||||
* The following permit choosing broadcast IPI shortcut v.s sending IPI only
|
|
||||||
* to online cpus via the send_IPI_mask varient.
|
|
||||||
* The mask version is my preferred option, since it eliminates a lot of
|
|
||||||
* other extra code that would need to be written to cleanup intrs sent
|
|
||||||
* to a CPU while offline.
|
|
||||||
*
|
|
||||||
* Sending broadcast introduces lots of trouble in CPU hotplug situations.
|
|
||||||
* These IPI's are delivered to cpu's irrespective of their offline status
|
|
||||||
* and could pickup stale intr data when these CPUS are turned online.
|
|
||||||
*
|
|
||||||
* Not using broadcast is a cleaner approach IMO, but Andi Kleen disagrees with
|
|
||||||
* the idea of not using broadcast IPI's anymore. Hence the run time check
|
|
||||||
* is introduced, on his request so we can choose an alternate mechanism.
|
|
||||||
*
|
|
||||||
* Initial wacky performance tests that collect cycle counts show
|
|
||||||
* no increase in using mask v.s broadcast version. In fact they seem
|
|
||||||
* identical in terms of cycle counts.
|
|
||||||
*
|
|
||||||
* if we need to use broadcast, we need to do the following.
|
|
||||||
*
|
|
||||||
* cli;
|
|
||||||
* hold call_lock;
|
|
||||||
* clear any pending IPI, just ack and clear all pending intr
|
|
||||||
* set cpu_online_map;
|
|
||||||
* release call_lock;
|
|
||||||
* sti;
|
|
||||||
*
|
|
||||||
* The complicated dummy irq processing shown above is not required if
|
|
||||||
* we didnt sent IPI's to wrong CPU's in the first place.
|
|
||||||
*
|
|
||||||
* - Ashok Raj <ashok.raj@intel.com>
|
|
||||||
*/
|
|
||||||
#ifdef CONFIG_HOTPLUG_CPU
|
|
||||||
#define DEFAULT_SEND_IPI (1)
|
|
||||||
#else
|
|
||||||
#define DEFAULT_SEND_IPI (0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static int no_broadcast=DEFAULT_SEND_IPI;
|
|
||||||
|
|
||||||
static cpumask_t flat_target_cpus(void)
|
static cpumask_t flat_target_cpus(void)
|
||||||
{
|
{
|
||||||
return cpu_online_map;
|
return cpu_online_map;
|
||||||
@ -119,37 +76,15 @@ static void flat_send_IPI_mask(cpumask_t cpumask, int vector)
|
|||||||
local_irq_restore(flags);
|
local_irq_restore(flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void __local_flat_send_IPI_allbutself(int vector)
|
|
||||||
{
|
|
||||||
if (no_broadcast) {
|
|
||||||
cpumask_t mask = cpu_online_map;
|
|
||||||
int this_cpu = get_cpu();
|
|
||||||
|
|
||||||
cpu_clear(this_cpu, mask);
|
|
||||||
flat_send_IPI_mask(mask, vector);
|
|
||||||
put_cpu();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
__send_IPI_shortcut(APIC_DEST_ALLBUT, vector, APIC_DEST_LOGICAL);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void __local_flat_send_IPI_all(int vector)
|
|
||||||
{
|
|
||||||
if (no_broadcast)
|
|
||||||
flat_send_IPI_mask(cpu_online_map, vector);
|
|
||||||
else
|
|
||||||
__send_IPI_shortcut(APIC_DEST_ALLINC, vector, APIC_DEST_LOGICAL);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void flat_send_IPI_allbutself(int vector)
|
static void flat_send_IPI_allbutself(int vector)
|
||||||
{
|
{
|
||||||
if (((num_online_cpus()) - 1) >= 1)
|
if (((num_online_cpus()) - 1) >= 1)
|
||||||
__local_flat_send_IPI_allbutself(vector);
|
__send_IPI_shortcut(APIC_DEST_ALLBUT, vector,APIC_DEST_LOGICAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void flat_send_IPI_all(int vector)
|
static void flat_send_IPI_all(int vector)
|
||||||
{
|
{
|
||||||
__local_flat_send_IPI_all(vector);
|
__send_IPI_shortcut(APIC_DEST_ALLINC, vector, APIC_DEST_LOGICAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int flat_apic_id_registered(void)
|
static int flat_apic_id_registered(void)
|
||||||
@ -170,16 +105,6 @@ static unsigned int phys_pkg_id(int index_msb)
|
|||||||
return ((ebx >> 24) & 0xFF) >> index_msb;
|
return ((ebx >> 24) & 0xFF) >> index_msb;
|
||||||
}
|
}
|
||||||
|
|
||||||
static __init int no_ipi_broadcast(char *str)
|
|
||||||
{
|
|
||||||
get_option(&str, &no_broadcast);
|
|
||||||
printk ("Using %s mode\n", no_broadcast ? "No IPI Broadcast" :
|
|
||||||
"IPI Broadcast");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
__setup("no_ipi_broadcast", no_ipi_broadcast);
|
|
||||||
|
|
||||||
struct genapic apic_flat = {
|
struct genapic apic_flat = {
|
||||||
.name = "flat",
|
.name = "flat",
|
||||||
.int_delivery_mode = dest_LowestPrio,
|
.int_delivery_mode = dest_LowestPrio,
|
||||||
@ -195,11 +120,62 @@ struct genapic apic_flat = {
|
|||||||
.phys_pkg_id = phys_pkg_id,
|
.phys_pkg_id = phys_pkg_id,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init print_ipi_mode(void)
|
/*
|
||||||
|
* Physflat mode is used when there are more than 8 CPUs on a AMD system.
|
||||||
|
* We cannot use logical delivery in this case because the mask
|
||||||
|
* overflows, so use physical mode.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static cpumask_t physflat_target_cpus(void)
|
||||||
{
|
{
|
||||||
printk ("Using IPI %s mode\n", no_broadcast ? "No-Shortcut" :
|
return cpumask_of_cpu(0);
|
||||||
"Shortcut");
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
late_initcall(print_ipi_mode);
|
static void physflat_send_IPI_mask(cpumask_t cpumask, int vector)
|
||||||
|
{
|
||||||
|
send_IPI_mask_sequence(cpumask, vector);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void physflat_send_IPI_allbutself(int vector)
|
||||||
|
{
|
||||||
|
cpumask_t allbutme = cpu_online_map;
|
||||||
|
int me = get_cpu();
|
||||||
|
cpu_clear(me, allbutme);
|
||||||
|
physflat_send_IPI_mask(allbutme, vector);
|
||||||
|
put_cpu();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void physflat_send_IPI_all(int vector)
|
||||||
|
{
|
||||||
|
physflat_send_IPI_mask(cpu_online_map, vector);
|
||||||
|
}
|
||||||
|
|
||||||
|
static unsigned int physflat_cpu_mask_to_apicid(cpumask_t cpumask)
|
||||||
|
{
|
||||||
|
int cpu;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We're using fixed IRQ delivery, can only return one phys APIC ID.
|
||||||
|
* May as well be the first.
|
||||||
|
*/
|
||||||
|
cpu = first_cpu(cpumask);
|
||||||
|
if ((unsigned)cpu < NR_CPUS)
|
||||||
|
return x86_cpu_to_apicid[cpu];
|
||||||
|
else
|
||||||
|
return BAD_APICID;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct genapic apic_physflat = {
|
||||||
|
.name = "physical flat",
|
||||||
|
.int_delivery_mode = dest_LowestPrio,
|
||||||
|
.int_dest_mode = (APIC_DEST_PHYSICAL != 0),
|
||||||
|
.int_delivery_dest = APIC_DEST_PHYSICAL | APIC_DM_LOWEST,
|
||||||
|
.target_cpus = physflat_target_cpus,
|
||||||
|
.apic_id_registered = flat_apic_id_registered,
|
||||||
|
.init_apic_ldr = flat_init_apic_ldr,/*not needed, but shouldn't hurt*/
|
||||||
|
.send_IPI_all = physflat_send_IPI_all,
|
||||||
|
.send_IPI_allbutself = physflat_send_IPI_allbutself,
|
||||||
|
.send_IPI_mask = physflat_send_IPI_mask,
|
||||||
|
.cpu_mask_to_apicid = physflat_cpu_mask_to_apicid,
|
||||||
|
.phys_pkg_id = phys_pkg_id,
|
||||||
|
};
|
||||||
|
@ -137,14 +137,14 @@ startup_64:
|
|||||||
wrmsr
|
wrmsr
|
||||||
|
|
||||||
/* Setup cr0 */
|
/* Setup cr0 */
|
||||||
xorq %rax, %rax
|
#define CR0_PM 1 /* protected mode */
|
||||||
btsq $31, %rax /* Enable paging */
|
#define CR0_MP (1<<1)
|
||||||
btsq $0, %rax /* Enable protected mode */
|
#define CR0_ET (1<<4)
|
||||||
btsq $1, %rax /* Enable MP */
|
#define CR0_NE (1<<5)
|
||||||
btsq $4, %rax /* Enable ET */
|
#define CR0_WP (1<<16)
|
||||||
btsq $5, %rax /* Enable NE */
|
#define CR0_AM (1<<18)
|
||||||
btsq $16, %rax /* Enable WP */
|
#define CR0_PAGING (1<<31)
|
||||||
btsq $18, %rax /* Enable AM */
|
movl $CR0_PM|CR0_MP|CR0_ET|CR0_NE|CR0_WP|CR0_AM|CR0_PAGING,%eax
|
||||||
/* Make changes effective */
|
/* Make changes effective */
|
||||||
movq %rax, %cr0
|
movq %rax, %cr0
|
||||||
|
|
||||||
|
@ -135,3 +135,22 @@ void fixup_irqs(cpumask_t map)
|
|||||||
local_irq_disable();
|
local_irq_disable();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
extern void call_softirq(void);
|
||||||
|
|
||||||
|
asmlinkage void do_softirq(void)
|
||||||
|
{
|
||||||
|
__u32 pending;
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
|
if (in_interrupt())
|
||||||
|
return;
|
||||||
|
|
||||||
|
local_irq_save(flags);
|
||||||
|
pending = local_softirq_pending();
|
||||||
|
/* Switch to interrupt stack */
|
||||||
|
if (pending)
|
||||||
|
call_softirq();
|
||||||
|
local_irq_restore(flags);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(do_softirq);
|
||||||
|
@ -8,43 +8,26 @@
|
|||||||
|
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/kexec.h>
|
#include <linux/kexec.h>
|
||||||
#include <linux/delay.h>
|
|
||||||
#include <linux/string.h>
|
#include <linux/string.h>
|
||||||
#include <linux/reboot.h>
|
#include <linux/reboot.h>
|
||||||
#include <asm/pda.h>
|
|
||||||
#include <asm/pgtable.h>
|
#include <asm/pgtable.h>
|
||||||
#include <asm/pgalloc.h>
|
|
||||||
#include <asm/tlbflush.h>
|
#include <asm/tlbflush.h>
|
||||||
#include <asm/mmu_context.h>
|
#include <asm/mmu_context.h>
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <asm/apic.h>
|
|
||||||
#include <asm/cpufeature.h>
|
|
||||||
#include <asm/hw_irq.h>
|
|
||||||
|
|
||||||
#define LEVEL0_SIZE (1UL << 12UL)
|
static void init_level2_page(pmd_t *level2p, unsigned long addr)
|
||||||
#define LEVEL1_SIZE (1UL << 21UL)
|
|
||||||
#define LEVEL2_SIZE (1UL << 30UL)
|
|
||||||
#define LEVEL3_SIZE (1UL << 39UL)
|
|
||||||
#define LEVEL4_SIZE (1UL << 48UL)
|
|
||||||
|
|
||||||
#define L0_ATTR (_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | _PAGE_DIRTY)
|
|
||||||
#define L1_ATTR (_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | _PAGE_DIRTY | _PAGE_PSE)
|
|
||||||
#define L2_ATTR (_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | _PAGE_DIRTY)
|
|
||||||
#define L3_ATTR (_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | _PAGE_DIRTY)
|
|
||||||
|
|
||||||
static void init_level2_page(u64 *level2p, unsigned long addr)
|
|
||||||
{
|
{
|
||||||
unsigned long end_addr;
|
unsigned long end_addr;
|
||||||
|
|
||||||
addr &= PAGE_MASK;
|
addr &= PAGE_MASK;
|
||||||
end_addr = addr + LEVEL2_SIZE;
|
end_addr = addr + PUD_SIZE;
|
||||||
while (addr < end_addr) {
|
while (addr < end_addr) {
|
||||||
*(level2p++) = addr | L1_ATTR;
|
set_pmd(level2p++, __pmd(addr | __PAGE_KERNEL_LARGE_EXEC));
|
||||||
addr += LEVEL1_SIZE;
|
addr += PMD_SIZE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int init_level3_page(struct kimage *image, u64 *level3p,
|
static int init_level3_page(struct kimage *image, pud_t *level3p,
|
||||||
unsigned long addr, unsigned long last_addr)
|
unsigned long addr, unsigned long last_addr)
|
||||||
{
|
{
|
||||||
unsigned long end_addr;
|
unsigned long end_addr;
|
||||||
@ -52,32 +35,32 @@ static int init_level3_page(struct kimage *image, u64 *level3p,
|
|||||||
|
|
||||||
result = 0;
|
result = 0;
|
||||||
addr &= PAGE_MASK;
|
addr &= PAGE_MASK;
|
||||||
end_addr = addr + LEVEL3_SIZE;
|
end_addr = addr + PGDIR_SIZE;
|
||||||
while ((addr < last_addr) && (addr < end_addr)) {
|
while ((addr < last_addr) && (addr < end_addr)) {
|
||||||
struct page *page;
|
struct page *page;
|
||||||
u64 *level2p;
|
pmd_t *level2p;
|
||||||
|
|
||||||
page = kimage_alloc_control_pages(image, 0);
|
page = kimage_alloc_control_pages(image, 0);
|
||||||
if (!page) {
|
if (!page) {
|
||||||
result = -ENOMEM;
|
result = -ENOMEM;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
level2p = (u64 *)page_address(page);
|
level2p = (pmd_t *)page_address(page);
|
||||||
init_level2_page(level2p, addr);
|
init_level2_page(level2p, addr);
|
||||||
*(level3p++) = __pa(level2p) | L2_ATTR;
|
set_pud(level3p++, __pud(__pa(level2p) | _KERNPG_TABLE));
|
||||||
addr += LEVEL2_SIZE;
|
addr += PUD_SIZE;
|
||||||
}
|
}
|
||||||
/* clear the unused entries */
|
/* clear the unused entries */
|
||||||
while (addr < end_addr) {
|
while (addr < end_addr) {
|
||||||
*(level3p++) = 0;
|
pud_clear(level3p++);
|
||||||
addr += LEVEL2_SIZE;
|
addr += PUD_SIZE;
|
||||||
}
|
}
|
||||||
out:
|
out:
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int init_level4_page(struct kimage *image, u64 *level4p,
|
static int init_level4_page(struct kimage *image, pgd_t *level4p,
|
||||||
unsigned long addr, unsigned long last_addr)
|
unsigned long addr, unsigned long last_addr)
|
||||||
{
|
{
|
||||||
unsigned long end_addr;
|
unsigned long end_addr;
|
||||||
@ -85,28 +68,28 @@ static int init_level4_page(struct kimage *image, u64 *level4p,
|
|||||||
|
|
||||||
result = 0;
|
result = 0;
|
||||||
addr &= PAGE_MASK;
|
addr &= PAGE_MASK;
|
||||||
end_addr = addr + LEVEL4_SIZE;
|
end_addr = addr + (PTRS_PER_PGD * PGDIR_SIZE);
|
||||||
while ((addr < last_addr) && (addr < end_addr)) {
|
while ((addr < last_addr) && (addr < end_addr)) {
|
||||||
struct page *page;
|
struct page *page;
|
||||||
u64 *level3p;
|
pud_t *level3p;
|
||||||
|
|
||||||
page = kimage_alloc_control_pages(image, 0);
|
page = kimage_alloc_control_pages(image, 0);
|
||||||
if (!page) {
|
if (!page) {
|
||||||
result = -ENOMEM;
|
result = -ENOMEM;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
level3p = (u64 *)page_address(page);
|
level3p = (pud_t *)page_address(page);
|
||||||
result = init_level3_page(image, level3p, addr, last_addr);
|
result = init_level3_page(image, level3p, addr, last_addr);
|
||||||
if (result) {
|
if (result) {
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
*(level4p++) = __pa(level3p) | L3_ATTR;
|
set_pgd(level4p++, __pgd(__pa(level3p) | _KERNPG_TABLE));
|
||||||
addr += LEVEL3_SIZE;
|
addr += PGDIR_SIZE;
|
||||||
}
|
}
|
||||||
/* clear the unused entries */
|
/* clear the unused entries */
|
||||||
while (addr < end_addr) {
|
while (addr < end_addr) {
|
||||||
*(level4p++) = 0;
|
pgd_clear(level4p++);
|
||||||
addr += LEVEL3_SIZE;
|
addr += PGDIR_SIZE;
|
||||||
}
|
}
|
||||||
out:
|
out:
|
||||||
return result;
|
return result;
|
||||||
@ -115,52 +98,50 @@ out:
|
|||||||
|
|
||||||
static int init_pgtable(struct kimage *image, unsigned long start_pgtable)
|
static int init_pgtable(struct kimage *image, unsigned long start_pgtable)
|
||||||
{
|
{
|
||||||
u64 *level4p;
|
pgd_t *level4p;
|
||||||
level4p = (u64 *)__va(start_pgtable);
|
level4p = (pgd_t *)__va(start_pgtable);
|
||||||
return init_level4_page(image, level4p, 0, end_pfn << PAGE_SHIFT);
|
return init_level4_page(image, level4p, 0, end_pfn << PAGE_SHIFT);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void set_idt(void *newidt, u16 limit)
|
static void set_idt(void *newidt, u16 limit)
|
||||||
{
|
{
|
||||||
unsigned char curidt[10];
|
struct desc_ptr curidt;
|
||||||
|
|
||||||
/* x86-64 supports unaliged loads & stores */
|
/* x86-64 supports unaliged loads & stores */
|
||||||
(*(u16 *)(curidt)) = limit;
|
curidt.size = limit;
|
||||||
(*(u64 *)(curidt +2)) = (unsigned long)(newidt);
|
curidt.address = (unsigned long)newidt;
|
||||||
|
|
||||||
__asm__ __volatile__ (
|
__asm__ __volatile__ (
|
||||||
"lidt %0\n"
|
"lidtq %0\n"
|
||||||
: "=m" (curidt)
|
: : "m" (curidt)
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
static void set_gdt(void *newgdt, u16 limit)
|
static void set_gdt(void *newgdt, u16 limit)
|
||||||
{
|
{
|
||||||
unsigned char curgdt[10];
|
struct desc_ptr curgdt;
|
||||||
|
|
||||||
/* x86-64 supports unaligned loads & stores */
|
/* x86-64 supports unaligned loads & stores */
|
||||||
(*(u16 *)(curgdt)) = limit;
|
curgdt.size = limit;
|
||||||
(*(u64 *)(curgdt +2)) = (unsigned long)(newgdt);
|
curgdt.address = (unsigned long)newgdt;
|
||||||
|
|
||||||
__asm__ __volatile__ (
|
__asm__ __volatile__ (
|
||||||
"lgdt %0\n"
|
"lgdtq %0\n"
|
||||||
: "=m" (curgdt)
|
: : "m" (curgdt)
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
static void load_segments(void)
|
static void load_segments(void)
|
||||||
{
|
{
|
||||||
__asm__ __volatile__ (
|
__asm__ __volatile__ (
|
||||||
"\tmovl $"STR(__KERNEL_DS)",%eax\n"
|
"\tmovl %0,%%ds\n"
|
||||||
"\tmovl %eax,%ds\n"
|
"\tmovl %0,%%es\n"
|
||||||
"\tmovl %eax,%es\n"
|
"\tmovl %0,%%ss\n"
|
||||||
"\tmovl %eax,%ss\n"
|
"\tmovl %0,%%fs\n"
|
||||||
"\tmovl %eax,%fs\n"
|
"\tmovl %0,%%gs\n"
|
||||||
"\tmovl %eax,%gs\n"
|
: : "a" (__KERNEL_DS)
|
||||||
);
|
);
|
||||||
#undef STR
|
|
||||||
#undef __STR
|
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef NORET_TYPE void (*relocate_new_kernel_t)(unsigned long indirection_page,
|
typedef NORET_TYPE void (*relocate_new_kernel_t)(unsigned long indirection_page,
|
||||||
@ -178,7 +159,7 @@ int machine_kexec_prepare(struct kimage *image)
|
|||||||
|
|
||||||
/* Calculate the offsets */
|
/* Calculate the offsets */
|
||||||
start_pgtable = page_to_pfn(image->control_code_page) << PAGE_SHIFT;
|
start_pgtable = page_to_pfn(image->control_code_page) << PAGE_SHIFT;
|
||||||
control_code_buffer = start_pgtable + 4096UL;
|
control_code_buffer = start_pgtable + PAGE_SIZE;
|
||||||
|
|
||||||
/* Setup the identity mapped 64bit page table */
|
/* Setup the identity mapped 64bit page table */
|
||||||
result = init_pgtable(image, start_pgtable);
|
result = init_pgtable(image, start_pgtable);
|
||||||
@ -214,7 +195,7 @@ NORET_TYPE void machine_kexec(struct kimage *image)
|
|||||||
/* Calculate the offsets */
|
/* Calculate the offsets */
|
||||||
page_list = image->head;
|
page_list = image->head;
|
||||||
start_pgtable = page_to_pfn(image->control_code_page) << PAGE_SHIFT;
|
start_pgtable = page_to_pfn(image->control_code_page) << PAGE_SHIFT;
|
||||||
control_code_buffer = start_pgtable + 4096UL;
|
control_code_buffer = start_pgtable + PAGE_SIZE;
|
||||||
|
|
||||||
/* Set the low half of the page table to my identity mapped
|
/* Set the low half of the page table to my identity mapped
|
||||||
* page table for kexec. Leave the high half pointing at the
|
* page table for kexec. Leave the high half pointing at the
|
||||||
|
@ -15,6 +15,8 @@
|
|||||||
#include <linux/sysdev.h>
|
#include <linux/sysdev.h>
|
||||||
#include <linux/miscdevice.h>
|
#include <linux/miscdevice.h>
|
||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
|
#include <linux/cpu.h>
|
||||||
|
#include <linux/percpu.h>
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
#include <asm/msr.h>
|
#include <asm/msr.h>
|
||||||
#include <asm/mce.h>
|
#include <asm/mce.h>
|
||||||
@ -514,10 +516,7 @@ static struct sysdev_class mce_sysclass = {
|
|||||||
set_kset_name("machinecheck"),
|
set_kset_name("machinecheck"),
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct sys_device device_mce = {
|
static DEFINE_PER_CPU(struct sys_device, device_mce);
|
||||||
.id = 0,
|
|
||||||
.cls = &mce_sysclass,
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Why are there no generic functions for this? */
|
/* Why are there no generic functions for this? */
|
||||||
#define ACCESSOR(name, var, start) \
|
#define ACCESSOR(name, var, start) \
|
||||||
@ -542,27 +541,83 @@ ACCESSOR(bank4ctl,bank[4],mce_restart())
|
|||||||
ACCESSOR(tolerant,tolerant,)
|
ACCESSOR(tolerant,tolerant,)
|
||||||
ACCESSOR(check_interval,check_interval,mce_restart())
|
ACCESSOR(check_interval,check_interval,mce_restart())
|
||||||
|
|
||||||
static __cpuinit int mce_init_device(void)
|
/* Per cpu sysdev init. All of the cpus still share the same ctl bank */
|
||||||
|
static __cpuinit int mce_create_device(unsigned int cpu)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
|
if (!mce_available(&cpu_data[cpu]))
|
||||||
|
return -EIO;
|
||||||
|
|
||||||
|
per_cpu(device_mce,cpu).id = cpu;
|
||||||
|
per_cpu(device_mce,cpu).cls = &mce_sysclass;
|
||||||
|
|
||||||
|
err = sysdev_register(&per_cpu(device_mce,cpu));
|
||||||
|
|
||||||
|
if (!err) {
|
||||||
|
sysdev_create_file(&per_cpu(device_mce,cpu), &attr_bank0ctl);
|
||||||
|
sysdev_create_file(&per_cpu(device_mce,cpu), &attr_bank1ctl);
|
||||||
|
sysdev_create_file(&per_cpu(device_mce,cpu), &attr_bank2ctl);
|
||||||
|
sysdev_create_file(&per_cpu(device_mce,cpu), &attr_bank3ctl);
|
||||||
|
sysdev_create_file(&per_cpu(device_mce,cpu), &attr_bank4ctl);
|
||||||
|
sysdev_create_file(&per_cpu(device_mce,cpu), &attr_tolerant);
|
||||||
|
sysdev_create_file(&per_cpu(device_mce,cpu), &attr_check_interval);
|
||||||
|
}
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_HOTPLUG_CPU
|
||||||
|
static __cpuinit void mce_remove_device(unsigned int cpu)
|
||||||
|
{
|
||||||
|
sysdev_remove_file(&per_cpu(device_mce,cpu), &attr_bank0ctl);
|
||||||
|
sysdev_remove_file(&per_cpu(device_mce,cpu), &attr_bank1ctl);
|
||||||
|
sysdev_remove_file(&per_cpu(device_mce,cpu), &attr_bank2ctl);
|
||||||
|
sysdev_remove_file(&per_cpu(device_mce,cpu), &attr_bank3ctl);
|
||||||
|
sysdev_remove_file(&per_cpu(device_mce,cpu), &attr_bank4ctl);
|
||||||
|
sysdev_remove_file(&per_cpu(device_mce,cpu), &attr_tolerant);
|
||||||
|
sysdev_remove_file(&per_cpu(device_mce,cpu), &attr_check_interval);
|
||||||
|
sysdev_unregister(&per_cpu(device_mce,cpu));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Get notified when a cpu comes on/off. Be hotplug friendly. */
|
||||||
|
static __cpuinit int
|
||||||
|
mce_cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu)
|
||||||
|
{
|
||||||
|
unsigned int cpu = (unsigned long)hcpu;
|
||||||
|
|
||||||
|
switch (action) {
|
||||||
|
case CPU_ONLINE:
|
||||||
|
mce_create_device(cpu);
|
||||||
|
break;
|
||||||
|
#ifdef CONFIG_HOTPLUG_CPU
|
||||||
|
case CPU_DEAD:
|
||||||
|
mce_remove_device(cpu);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
return NOTIFY_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct notifier_block mce_cpu_notifier = {
|
||||||
|
.notifier_call = mce_cpu_callback,
|
||||||
|
};
|
||||||
|
|
||||||
|
static __init int mce_init_device(void)
|
||||||
|
{
|
||||||
|
int err;
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
if (!mce_available(&boot_cpu_data))
|
if (!mce_available(&boot_cpu_data))
|
||||||
return -EIO;
|
return -EIO;
|
||||||
err = sysdev_class_register(&mce_sysclass);
|
err = sysdev_class_register(&mce_sysclass);
|
||||||
if (!err)
|
|
||||||
err = sysdev_register(&device_mce);
|
for_each_online_cpu(i) {
|
||||||
if (!err) {
|
mce_create_device(i);
|
||||||
/* could create per CPU objects, but it is not worth it. */
|
}
|
||||||
sysdev_create_file(&device_mce, &attr_bank0ctl);
|
|
||||||
sysdev_create_file(&device_mce, &attr_bank1ctl);
|
register_cpu_notifier(&mce_cpu_notifier);
|
||||||
sysdev_create_file(&device_mce, &attr_bank2ctl);
|
|
||||||
sysdev_create_file(&device_mce, &attr_bank3ctl);
|
|
||||||
sysdev_create_file(&device_mce, &attr_bank4ctl);
|
|
||||||
sysdev_create_file(&device_mce, &attr_tolerant);
|
|
||||||
sysdev_create_file(&device_mce, &attr_check_interval);
|
|
||||||
}
|
|
||||||
|
|
||||||
misc_register(&mce_log_device);
|
misc_register(&mce_log_device);
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
device_initcall(mce_init_device);
|
device_initcall(mce_init_device);
|
||||||
|
@ -109,7 +109,7 @@ static int __init mpf_checksum(unsigned char *mp, int len)
|
|||||||
|
|
||||||
static void __init MP_processor_info (struct mpc_config_processor *m)
|
static void __init MP_processor_info (struct mpc_config_processor *m)
|
||||||
{
|
{
|
||||||
int ver;
|
int ver, cpu;
|
||||||
static int found_bsp=0;
|
static int found_bsp=0;
|
||||||
|
|
||||||
if (!(m->mpc_cpuflag & CPU_ENABLED))
|
if (!(m->mpc_cpuflag & CPU_ENABLED))
|
||||||
@ -131,7 +131,7 @@ static void __init MP_processor_info (struct mpc_config_processor *m)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
num_processors++;
|
cpu = num_processors++;
|
||||||
|
|
||||||
if (m->mpc_apicid > MAX_APICS) {
|
if (m->mpc_apicid > MAX_APICS) {
|
||||||
printk(KERN_ERR "Processor #%d INVALID. (Max ID: %d).\n",
|
printk(KERN_ERR "Processor #%d INVALID. (Max ID: %d).\n",
|
||||||
@ -155,13 +155,18 @@ static void __init MP_processor_info (struct mpc_config_processor *m)
|
|||||||
* in same order as logical cpu numbers. Hence the first
|
* in same order as logical cpu numbers. Hence the first
|
||||||
* entry is BSP, and so on.
|
* entry is BSP, and so on.
|
||||||
*/
|
*/
|
||||||
|
cpu = 0;
|
||||||
|
|
||||||
bios_cpu_apicid[0] = m->mpc_apicid;
|
bios_cpu_apicid[0] = m->mpc_apicid;
|
||||||
x86_cpu_to_apicid[0] = m->mpc_apicid;
|
x86_cpu_to_apicid[0] = m->mpc_apicid;
|
||||||
found_bsp = 1;
|
found_bsp = 1;
|
||||||
} else {
|
} else
|
||||||
bios_cpu_apicid[num_processors - found_bsp] = m->mpc_apicid;
|
cpu = num_processors - found_bsp;
|
||||||
x86_cpu_to_apicid[num_processors - found_bsp] = m->mpc_apicid;
|
bios_cpu_apicid[cpu] = m->mpc_apicid;
|
||||||
}
|
x86_cpu_to_apicid[cpu] = m->mpc_apicid;
|
||||||
|
|
||||||
|
cpu_set(cpu, cpu_possible_map);
|
||||||
|
cpu_set(cpu, cpu_present_map);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init MP_bus_info (struct mpc_config_bus *m)
|
static void __init MP_bus_info (struct mpc_config_bus *m)
|
||||||
|
@ -765,8 +765,6 @@ static void __init amd_detect_cmp(struct cpuinfo_x86 *c)
|
|||||||
int cpu = smp_processor_id();
|
int cpu = smp_processor_id();
|
||||||
int node = 0;
|
int node = 0;
|
||||||
unsigned bits;
|
unsigned bits;
|
||||||
if (c->x86_num_cores == 1)
|
|
||||||
return;
|
|
||||||
|
|
||||||
bits = 0;
|
bits = 0;
|
||||||
while ((1 << bits) < c->x86_num_cores)
|
while ((1 << bits) < c->x86_num_cores)
|
||||||
@ -1081,8 +1079,7 @@ void __cpuinit identify_cpu(struct cpuinfo_x86 *c)
|
|||||||
else
|
else
|
||||||
mtrr_ap_init();
|
mtrr_ap_init();
|
||||||
#ifdef CONFIG_NUMA
|
#ifdef CONFIG_NUMA
|
||||||
if (c != &boot_cpu_data)
|
numa_add_cpu(smp_processor_id());
|
||||||
numa_add_cpu(c - cpu_data);
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
#include <linux/string.h>
|
#include <linux/string.h>
|
||||||
#include <linux/bootmem.h>
|
#include <linux/bootmem.h>
|
||||||
#include <linux/bitops.h>
|
#include <linux/bitops.h>
|
||||||
|
#include <linux/module.h>
|
||||||
#include <asm/bootsetup.h>
|
#include <asm/bootsetup.h>
|
||||||
#include <asm/pda.h>
|
#include <asm/pda.h>
|
||||||
#include <asm/pgtable.h>
|
#include <asm/pgtable.h>
|
||||||
@ -22,10 +23,8 @@
|
|||||||
#include <asm/smp.h>
|
#include <asm/smp.h>
|
||||||
#include <asm/i387.h>
|
#include <asm/i387.h>
|
||||||
#include <asm/percpu.h>
|
#include <asm/percpu.h>
|
||||||
#include <asm/mtrr.h>
|
|
||||||
#include <asm/proto.h>
|
#include <asm/proto.h>
|
||||||
#include <asm/mman.h>
|
#include <asm/sections.h>
|
||||||
#include <asm/numa.h>
|
|
||||||
|
|
||||||
char x86_boot_params[BOOT_PARAM_SIZE] __initdata = {0,};
|
char x86_boot_params[BOOT_PARAM_SIZE] __initdata = {0,};
|
||||||
|
|
||||||
@ -33,11 +32,6 @@ cpumask_t cpu_initialized __cpuinitdata = CPU_MASK_NONE;
|
|||||||
|
|
||||||
struct x8664_pda cpu_pda[NR_CPUS] __cacheline_aligned;
|
struct x8664_pda cpu_pda[NR_CPUS] __cacheline_aligned;
|
||||||
|
|
||||||
extern struct task_struct init_task;
|
|
||||||
|
|
||||||
extern unsigned char __per_cpu_start[], __per_cpu_end[];
|
|
||||||
|
|
||||||
extern struct desc_ptr cpu_gdt_descr[];
|
|
||||||
struct desc_ptr idt_descr = { 256 * 16, (unsigned long) idt_table };
|
struct desc_ptr idt_descr = { 256 * 16, (unsigned long) idt_table };
|
||||||
|
|
||||||
char boot_cpu_stack[IRQSTACKSIZE] __attribute__((section(".bss.page_aligned")));
|
char boot_cpu_stack[IRQSTACKSIZE] __attribute__((section(".bss.page_aligned")));
|
||||||
@ -101,7 +95,7 @@ void __init setup_per_cpu_areas(void)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
for (i = 0; i < NR_CPUS; i++) {
|
for (i = 0; i < NR_CPUS; i++) {
|
||||||
unsigned char *ptr;
|
char *ptr;
|
||||||
|
|
||||||
if (!NODE_DATA(cpu_to_node(i))) {
|
if (!NODE_DATA(cpu_to_node(i))) {
|
||||||
printk("cpu with no node %d, num_online_nodes %d\n",
|
printk("cpu with no node %d, num_online_nodes %d\n",
|
||||||
@ -190,11 +184,7 @@ void __cpuinit check_efer(void)
|
|||||||
*/
|
*/
|
||||||
void __cpuinit cpu_init (void)
|
void __cpuinit cpu_init (void)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_SMP
|
|
||||||
int cpu = stack_smp_processor_id();
|
int cpu = stack_smp_processor_id();
|
||||||
#else
|
|
||||||
int cpu = smp_processor_id();
|
|
||||||
#endif
|
|
||||||
struct tss_struct *t = &per_cpu(init_tss, cpu);
|
struct tss_struct *t = &per_cpu(init_tss, cpu);
|
||||||
unsigned long v;
|
unsigned long v;
|
||||||
char *estacks = NULL;
|
char *estacks = NULL;
|
||||||
@ -214,7 +204,7 @@ void __cpuinit cpu_init (void)
|
|||||||
|
|
||||||
printk("Initializing CPU#%d\n", cpu);
|
printk("Initializing CPU#%d\n", cpu);
|
||||||
|
|
||||||
clear_in_cr4(X86_CR4_VME|X86_CR4_PVI|X86_CR4_TSD|X86_CR4_DE);
|
clear_in_cr4(X86_CR4_VME|X86_CR4_PVI|X86_CR4_TSD|X86_CR4_DE);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initialize the per-CPU GDT with the boot GDT,
|
* Initialize the per-CPU GDT with the boot GDT,
|
||||||
|
@ -129,10 +129,9 @@ asmlinkage void smp_invalidate_interrupt (void)
|
|||||||
} else
|
} else
|
||||||
leave_mm(cpu);
|
leave_mm(cpu);
|
||||||
}
|
}
|
||||||
|
out:
|
||||||
ack_APIC_irq();
|
ack_APIC_irq();
|
||||||
cpu_clear(cpu, flush_cpumask);
|
cpu_clear(cpu, flush_cpumask);
|
||||||
|
|
||||||
out:
|
|
||||||
put_cpu_no_resched();
|
put_cpu_no_resched();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -293,6 +292,69 @@ void unlock_ipi_call_lock(void)
|
|||||||
spin_unlock_irq(&call_lock);
|
spin_unlock_irq(&call_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* this function sends a 'generic call function' IPI to one other CPU
|
||||||
|
* in the system.
|
||||||
|
*/
|
||||||
|
static void __smp_call_function_single (int cpu, void (*func) (void *info), void *info,
|
||||||
|
int nonatomic, int wait)
|
||||||
|
{
|
||||||
|
struct call_data_struct data;
|
||||||
|
int cpus = 1;
|
||||||
|
|
||||||
|
data.func = func;
|
||||||
|
data.info = info;
|
||||||
|
atomic_set(&data.started, 0);
|
||||||
|
data.wait = wait;
|
||||||
|
if (wait)
|
||||||
|
atomic_set(&data.finished, 0);
|
||||||
|
|
||||||
|
call_data = &data;
|
||||||
|
wmb();
|
||||||
|
/* Send a message to all other CPUs and wait for them to respond */
|
||||||
|
send_IPI_mask(cpumask_of_cpu(cpu), CALL_FUNCTION_VECTOR);
|
||||||
|
|
||||||
|
/* Wait for response */
|
||||||
|
while (atomic_read(&data.started) != cpus)
|
||||||
|
cpu_relax();
|
||||||
|
|
||||||
|
if (!wait)
|
||||||
|
return;
|
||||||
|
|
||||||
|
while (atomic_read(&data.finished) != cpus)
|
||||||
|
cpu_relax();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* smp_call_function_single - Run a function on another CPU
|
||||||
|
* @func: The function to run. This must be fast and non-blocking.
|
||||||
|
* @info: An arbitrary pointer to pass to the function.
|
||||||
|
* @nonatomic: Currently unused.
|
||||||
|
* @wait: If true, wait until function has completed on other CPUs.
|
||||||
|
*
|
||||||
|
* Retrurns 0 on success, else a negative status code.
|
||||||
|
*
|
||||||
|
* Does not return until the remote CPU is nearly ready to execute <func>
|
||||||
|
* or is or has executed.
|
||||||
|
*/
|
||||||
|
|
||||||
|
int smp_call_function_single (int cpu, void (*func) (void *info), void *info,
|
||||||
|
int nonatomic, int wait)
|
||||||
|
{
|
||||||
|
/* prevent preemption and reschedule on another processor */
|
||||||
|
int me = get_cpu();
|
||||||
|
if (cpu == me) {
|
||||||
|
WARN_ON(1);
|
||||||
|
put_cpu();
|
||||||
|
return -EBUSY;
|
||||||
|
}
|
||||||
|
spin_lock_bh(&call_lock);
|
||||||
|
__smp_call_function_single(cpu, func, info, nonatomic, wait);
|
||||||
|
spin_unlock_bh(&call_lock);
|
||||||
|
put_cpu();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* this function sends a 'generic call function' IPI to all other CPUs
|
* this function sends a 'generic call function' IPI to all other CPUs
|
||||||
* in the system.
|
* in the system.
|
||||||
|
@ -112,24 +112,6 @@ struct task_struct *idle_thread_array[NR_CPUS] __cpuinitdata ;
|
|||||||
#define get_idle_for_cpu(x) (idle_thread_array[(x)])
|
#define get_idle_for_cpu(x) (idle_thread_array[(x)])
|
||||||
#define set_idle_for_cpu(x,p) (idle_thread_array[(x)] = (p))
|
#define set_idle_for_cpu(x,p) (idle_thread_array[(x)] = (p))
|
||||||
|
|
||||||
/*
|
|
||||||
* cpu_possible_map should be static, it cannot change as cpu's
|
|
||||||
* are onlined, or offlined. The reason is per-cpu data-structures
|
|
||||||
* are allocated by some modules at init time, and dont expect to
|
|
||||||
* do this dynamically on cpu arrival/departure.
|
|
||||||
* cpu_present_map on the other hand can change dynamically.
|
|
||||||
* In case when cpu_hotplug is not compiled, then we resort to current
|
|
||||||
* behaviour, which is cpu_possible == cpu_present.
|
|
||||||
* If cpu-hotplug is supported, then we need to preallocate for all
|
|
||||||
* those NR_CPUS, hence cpu_possible_map represents entire NR_CPUS range.
|
|
||||||
* - Ashok Raj
|
|
||||||
*/
|
|
||||||
#ifdef CONFIG_HOTPLUG_CPU
|
|
||||||
#define fixup_cpu_possible_map(x) cpu_set((x), cpu_possible_map)
|
|
||||||
#else
|
|
||||||
#define fixup_cpu_possible_map(x)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Currently trivial. Write the real->protected mode
|
* Currently trivial. Write the real->protected mode
|
||||||
* bootstrap into the page concerned. The caller
|
* bootstrap into the page concerned. The caller
|
||||||
@ -229,9 +211,6 @@ static __cpuinit void sync_master(void *arg)
|
|||||||
{
|
{
|
||||||
unsigned long flags, i;
|
unsigned long flags, i;
|
||||||
|
|
||||||
if (smp_processor_id() != 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
go[MASTER] = 0;
|
go[MASTER] = 0;
|
||||||
|
|
||||||
local_irq_save(flags);
|
local_irq_save(flags);
|
||||||
@ -280,7 +259,7 @@ get_delta(long *rt, long *master)
|
|||||||
return tcenter - best_tm;
|
return tcenter - best_tm;
|
||||||
}
|
}
|
||||||
|
|
||||||
static __cpuinit void sync_tsc(void)
|
static __cpuinit void sync_tsc(unsigned int master)
|
||||||
{
|
{
|
||||||
int i, done = 0;
|
int i, done = 0;
|
||||||
long delta, adj, adjust_latency = 0;
|
long delta, adj, adjust_latency = 0;
|
||||||
@ -294,9 +273,17 @@ static __cpuinit void sync_tsc(void)
|
|||||||
} t[NUM_ROUNDS] __cpuinitdata;
|
} t[NUM_ROUNDS] __cpuinitdata;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
printk(KERN_INFO "CPU %d: Syncing TSC to CPU %u.\n",
|
||||||
|
smp_processor_id(), master);
|
||||||
|
|
||||||
go[MASTER] = 1;
|
go[MASTER] = 1;
|
||||||
|
|
||||||
smp_call_function(sync_master, NULL, 1, 0);
|
/* It is dangerous to broadcast IPI as cpus are coming up,
|
||||||
|
* as they may not be ready to accept them. So since
|
||||||
|
* we only need to send the ipi to the boot cpu direct
|
||||||
|
* the message, and avoid the race.
|
||||||
|
*/
|
||||||
|
smp_call_function_single(master, sync_master, NULL, 1, 0);
|
||||||
|
|
||||||
while (go[MASTER]) /* wait for master to be ready */
|
while (go[MASTER]) /* wait for master to be ready */
|
||||||
no_cpu_relax();
|
no_cpu_relax();
|
||||||
@ -340,16 +327,14 @@ static __cpuinit void sync_tsc(void)
|
|||||||
printk(KERN_INFO
|
printk(KERN_INFO
|
||||||
"CPU %d: synchronized TSC with CPU %u (last diff %ld cycles, "
|
"CPU %d: synchronized TSC with CPU %u (last diff %ld cycles, "
|
||||||
"maxerr %lu cycles)\n",
|
"maxerr %lu cycles)\n",
|
||||||
smp_processor_id(), boot_cpu_id, delta, rt);
|
smp_processor_id(), master, delta, rt);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __cpuinit tsc_sync_wait(void)
|
static void __cpuinit tsc_sync_wait(void)
|
||||||
{
|
{
|
||||||
if (notscsync || !cpu_has_tsc)
|
if (notscsync || !cpu_has_tsc)
|
||||||
return;
|
return;
|
||||||
printk(KERN_INFO "CPU %d: Syncing TSC to CPU %u.\n", smp_processor_id(),
|
sync_tsc(boot_cpu_id);
|
||||||
boot_cpu_id);
|
|
||||||
sync_tsc();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static __init int notscsync_setup(char *s)
|
static __init int notscsync_setup(char *s)
|
||||||
@ -773,8 +758,9 @@ do_rest:
|
|||||||
initial_code = start_secondary;
|
initial_code = start_secondary;
|
||||||
clear_ti_thread_flag(c_idle.idle->thread_info, TIF_FORK);
|
clear_ti_thread_flag(c_idle.idle->thread_info, TIF_FORK);
|
||||||
|
|
||||||
printk(KERN_INFO "Booting processor %d/%d rip %lx rsp %lx\n", cpu, apicid,
|
printk(KERN_INFO "Booting processor %d/%d APIC 0x%x\n", cpu,
|
||||||
start_rip, init_rsp);
|
cpus_weight(cpu_present_map),
|
||||||
|
apicid);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This grunge runs the startup process for
|
* This grunge runs the startup process for
|
||||||
@ -924,6 +910,27 @@ static __init void enforce_max_cpus(unsigned max_cpus)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_HOTPLUG_CPU
|
||||||
|
/*
|
||||||
|
* cpu_possible_map should be static, it cannot change as cpu's
|
||||||
|
* are onlined, or offlined. The reason is per-cpu data-structures
|
||||||
|
* are allocated by some modules at init time, and dont expect to
|
||||||
|
* do this dynamically on cpu arrival/departure.
|
||||||
|
* cpu_present_map on the other hand can change dynamically.
|
||||||
|
* In case when cpu_hotplug is not compiled, then we resort to current
|
||||||
|
* behaviour, which is cpu_possible == cpu_present.
|
||||||
|
* If cpu-hotplug is supported, then we need to preallocate for all
|
||||||
|
* those NR_CPUS, hence cpu_possible_map represents entire NR_CPUS range.
|
||||||
|
* - Ashok Raj
|
||||||
|
*/
|
||||||
|
static void prefill_possible_map(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < NR_CPUS; i++)
|
||||||
|
cpu_set(i, cpu_possible_map);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Various sanity checks.
|
* Various sanity checks.
|
||||||
*/
|
*/
|
||||||
@ -987,25 +994,15 @@ static int __init smp_sanity_check(unsigned max_cpus)
|
|||||||
*/
|
*/
|
||||||
void __init smp_prepare_cpus(unsigned int max_cpus)
|
void __init smp_prepare_cpus(unsigned int max_cpus)
|
||||||
{
|
{
|
||||||
int i;
|
|
||||||
|
|
||||||
nmi_watchdog_default();
|
nmi_watchdog_default();
|
||||||
current_cpu_data = boot_cpu_data;
|
current_cpu_data = boot_cpu_data;
|
||||||
current_thread_info()->cpu = 0; /* needed? */
|
current_thread_info()->cpu = 0; /* needed? */
|
||||||
|
|
||||||
enforce_max_cpus(max_cpus);
|
enforce_max_cpus(max_cpus);
|
||||||
|
|
||||||
/*
|
#ifdef CONFIG_HOTPLUG_CPU
|
||||||
* Fill in cpu_present_mask
|
prefill_possible_map();
|
||||||
*/
|
#endif
|
||||||
for (i = 0; i < NR_CPUS; i++) {
|
|
||||||
int apicid = cpu_present_to_apicid(i);
|
|
||||||
if (physid_isset(apicid, phys_cpu_present_map)) {
|
|
||||||
cpu_set(i, cpu_present_map);
|
|
||||||
cpu_set(i, cpu_possible_map);
|
|
||||||
}
|
|
||||||
fixup_cpu_possible_map(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (smp_sanity_check(max_cpus) < 0) {
|
if (smp_sanity_check(max_cpus) < 0) {
|
||||||
printk(KERN_INFO "SMP disabled\n");
|
printk(KERN_INFO "SMP disabled\n");
|
||||||
@ -1189,8 +1186,7 @@ void __cpu_die(unsigned int cpu)
|
|||||||
printk ("CPU %d is now offline\n", cpu);
|
printk ("CPU %d is now offline\n", cpu);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
current->state = TASK_UNINTERRUPTIBLE;
|
msleep(100);
|
||||||
schedule_timeout(HZ/10);
|
|
||||||
}
|
}
|
||||||
printk(KERN_ERR "CPU %u didn't die...\n", cpu);
|
printk(KERN_ERR "CPU %u didn't die...\n", cpu);
|
||||||
}
|
}
|
||||||
|
@ -594,9 +594,6 @@ asmlinkage void default_do_nmi(struct pt_regs *regs)
|
|||||||
if (!cpu)
|
if (!cpu)
|
||||||
reason = get_nmi_reason();
|
reason = get_nmi_reason();
|
||||||
|
|
||||||
if (!cpu_online(cpu))
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!(reason & 0xc0)) {
|
if (!(reason & 0xc0)) {
|
||||||
if (notify_die(DIE_NMI_IPI, "nmi_ipi", regs, reason, 0, SIGINT)
|
if (notify_die(DIE_NMI_IPI, "nmi_ipi", regs, reason, 0, SIGINT)
|
||||||
== NOTIFY_STOP)
|
== NOTIFY_STOP)
|
||||||
|
@ -18,8 +18,6 @@
|
|||||||
#include <asm/smp.h>
|
#include <asm/smp.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int x86_udelay_tsc = 0; /* Delay via TSC */
|
|
||||||
|
|
||||||
int read_current_timer(unsigned long *timer_value)
|
int read_current_timer(unsigned long *timer_value)
|
||||||
{
|
{
|
||||||
rdtscll(*timer_value);
|
rdtscll(*timer_value);
|
||||||
|
@ -23,7 +23,6 @@
|
|||||||
#include <linux/vt_kern.h> /* For unblank_screen() */
|
#include <linux/vt_kern.h> /* For unblank_screen() */
|
||||||
#include <linux/compiler.h>
|
#include <linux/compiler.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/kprobes.h>
|
|
||||||
|
|
||||||
#include <asm/system.h>
|
#include <asm/system.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
|
@ -36,34 +36,36 @@ int numa_off __initdata;
|
|||||||
int __init compute_hash_shift(struct node *nodes, int numnodes)
|
int __init compute_hash_shift(struct node *nodes, int numnodes)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int shift = 24;
|
int shift = 20;
|
||||||
u64 addr;
|
unsigned long addr,maxend=0;
|
||||||
|
|
||||||
/* When in doubt use brute force. */
|
for (i = 0; i < numnodes; i++)
|
||||||
while (shift < 48) {
|
if ((nodes[i].start != nodes[i].end) && (nodes[i].end > maxend))
|
||||||
memset(memnodemap,0xff,sizeof(*memnodemap) * NODEMAPSIZE);
|
maxend = nodes[i].end;
|
||||||
for (i = 0; i < numnodes; i++) {
|
|
||||||
if (nodes[i].start == nodes[i].end)
|
while ((1UL << shift) < (maxend / NODEMAPSIZE))
|
||||||
continue;
|
shift++;
|
||||||
for (addr = nodes[i].start;
|
|
||||||
addr < nodes[i].end;
|
printk (KERN_DEBUG"Using %d for the hash shift. Max adder is %lx \n",
|
||||||
addr += (1UL << shift)) {
|
shift,maxend);
|
||||||
if (memnodemap[addr >> shift] != 0xff &&
|
memset(memnodemap,0xff,sizeof(*memnodemap) * NODEMAPSIZE);
|
||||||
memnodemap[addr >> shift] != i) {
|
for (i = 0; i < numnodes; i++) {
|
||||||
printk(KERN_INFO
|
if (nodes[i].start == nodes[i].end)
|
||||||
"node %d shift %d addr %Lx conflict %d\n",
|
continue;
|
||||||
i, shift, addr, memnodemap[addr>>shift]);
|
for (addr = nodes[i].start;
|
||||||
goto next;
|
addr < nodes[i].end;
|
||||||
}
|
addr += (1UL << shift)) {
|
||||||
memnodemap[addr >> shift] = i;
|
if (memnodemap[addr >> shift] != 0xff) {
|
||||||
|
printk(KERN_INFO
|
||||||
|
"Your memory is not aligned you need to rebuild your kernel "
|
||||||
|
"with a bigger NODEMAPSIZE shift=%d adder=%lu\n",
|
||||||
|
shift,addr);
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
memnodemap[addr >> shift] = i;
|
||||||
}
|
}
|
||||||
return shift;
|
|
||||||
next:
|
|
||||||
shift++;
|
|
||||||
}
|
}
|
||||||
memset(memnodemap,0,sizeof(*memnodemap) * NODEMAPSIZE);
|
return shift;
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_SPARSEMEM
|
#ifdef CONFIG_SPARSEMEM
|
||||||
|
@ -20,6 +20,9 @@
|
|||||||
|
|
||||||
static struct acpi_table_slit *acpi_slit;
|
static struct acpi_table_slit *acpi_slit;
|
||||||
|
|
||||||
|
/* Internal processor count */
|
||||||
|
static unsigned int __initdata num_processors = 0;
|
||||||
|
|
||||||
static nodemask_t nodes_parsed __initdata;
|
static nodemask_t nodes_parsed __initdata;
|
||||||
static nodemask_t nodes_found __initdata;
|
static nodemask_t nodes_found __initdata;
|
||||||
static struct node nodes[MAX_NUMNODES] __initdata;
|
static struct node nodes[MAX_NUMNODES] __initdata;
|
||||||
@ -101,16 +104,18 @@ acpi_numa_processor_affinity_init(struct acpi_table_processor_affinity *pa)
|
|||||||
bad_srat();
|
bad_srat();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (pa->apic_id >= NR_CPUS) {
|
if (num_processors >= NR_CPUS) {
|
||||||
printk(KERN_ERR "SRAT: lapic %u too large.\n",
|
printk(KERN_ERR "SRAT: Processor #%d (lapic %u) INVALID. (Max ID: %d).\n",
|
||||||
pa->apic_id);
|
num_processors, pa->apic_id, NR_CPUS);
|
||||||
bad_srat();
|
bad_srat();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
cpu_to_node[pa->apic_id] = node;
|
cpu_to_node[num_processors] = node;
|
||||||
acpi_numa = 1;
|
acpi_numa = 1;
|
||||||
printk(KERN_INFO "SRAT: PXM %u -> APIC %u -> Node %u\n",
|
printk(KERN_INFO "SRAT: PXM %u -> APIC %u -> CPU %u -> Node %u\n",
|
||||||
pxm, pa->apic_id, node);
|
pxm, pa->apic_id, num_processors, node);
|
||||||
|
|
||||||
|
num_processors++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Callback for parsing of the Proximity Domain <-> Memory Area mappings */
|
/* Callback for parsing of the Proximity Domain <-> Memory Area mappings */
|
||||||
@ -124,7 +129,6 @@ acpi_numa_memory_affinity_init(struct acpi_table_memory_affinity *ma)
|
|||||||
|
|
||||||
if (srat_disabled() || ma->flags.enabled == 0)
|
if (srat_disabled() || ma->flags.enabled == 0)
|
||||||
return;
|
return;
|
||||||
/* hotplug bit is ignored for now */
|
|
||||||
pxm = ma->proximity_domain;
|
pxm = ma->proximity_domain;
|
||||||
node = setup_node(pxm);
|
node = setup_node(pxm);
|
||||||
if (node < 0) {
|
if (node < 0) {
|
||||||
@ -134,6 +138,10 @@ acpi_numa_memory_affinity_init(struct acpi_table_memory_affinity *ma)
|
|||||||
}
|
}
|
||||||
start = ma->base_addr_lo | ((u64)ma->base_addr_hi << 32);
|
start = ma->base_addr_lo | ((u64)ma->base_addr_hi << 32);
|
||||||
end = start + (ma->length_lo | ((u64)ma->length_hi << 32));
|
end = start + (ma->length_lo | ((u64)ma->length_hi << 32));
|
||||||
|
/* It is fine to add this area to the nodes data it will be used later*/
|
||||||
|
if (ma->flags.hot_pluggable == 1)
|
||||||
|
printk(KERN_INFO "SRAT: hot plug zone found %lx - %lx \n",
|
||||||
|
start, end);
|
||||||
i = conflicting_nodes(start, end);
|
i = conflicting_nodes(start, end);
|
||||||
if (i >= 0) {
|
if (i >= 0) {
|
||||||
printk(KERN_ERR
|
printk(KERN_ERR
|
||||||
|
@ -29,7 +29,7 @@ __init static int
|
|||||||
fill_mp_bus_to_cpumask(void)
|
fill_mp_bus_to_cpumask(void)
|
||||||
{
|
{
|
||||||
struct pci_dev *nb_dev = NULL;
|
struct pci_dev *nb_dev = NULL;
|
||||||
int i, j, printed;
|
int i, j;
|
||||||
u32 ldtbus, nid;
|
u32 ldtbus, nid;
|
||||||
static int lbnr[3] = {
|
static int lbnr[3] = {
|
||||||
LDT_BUS_NUMBER_REGISTER_0,
|
LDT_BUS_NUMBER_REGISTER_0,
|
||||||
|
@ -1135,7 +1135,7 @@ static int revalidate_allvol(ctlr_info_t *host)
|
|||||||
/* this is for the online array utilities */
|
/* this is for the online array utilities */
|
||||||
if (!drv->heads && i)
|
if (!drv->heads && i)
|
||||||
continue;
|
continue;
|
||||||
blk_queue_hardsect_size(host->queue, drv->block_size);
|
blk_queue_hardsect_size(drv->queue, drv->block_size);
|
||||||
set_capacity(disk, drv->nr_blocks);
|
set_capacity(disk, drv->nr_blocks);
|
||||||
add_disk(disk);
|
add_disk(disk);
|
||||||
}
|
}
|
||||||
@ -1691,7 +1691,7 @@ static int cciss_revalidate(struct gendisk *disk)
|
|||||||
cciss_read_capacity(h->ctlr, logvol, size_buff, 1, &total_size, &block_size);
|
cciss_read_capacity(h->ctlr, logvol, size_buff, 1, &total_size, &block_size);
|
||||||
cciss_geometry_inquiry(h->ctlr, logvol, 1, total_size, block_size, inq_buff, drv);
|
cciss_geometry_inquiry(h->ctlr, logvol, 1, total_size, block_size, inq_buff, drv);
|
||||||
|
|
||||||
blk_queue_hardsect_size(h->queue, drv->block_size);
|
blk_queue_hardsect_size(drv->queue, drv->block_size);
|
||||||
set_capacity(disk, drv->nr_blocks);
|
set_capacity(disk, drv->nr_blocks);
|
||||||
|
|
||||||
kfree(size_buff);
|
kfree(size_buff);
|
||||||
@ -2248,12 +2248,12 @@ static irqreturn_t do_cciss_intr(int irq, void *dev_id, struct pt_regs *regs)
|
|||||||
* them up. We will also keep track of the next queue to run so
|
* them up. We will also keep track of the next queue to run so
|
||||||
* that every queue gets a chance to be started first.
|
* that every queue gets a chance to be started first.
|
||||||
*/
|
*/
|
||||||
for (j=0; j < NWD; j++){
|
for (j=0; j < h->highest_lun + 1; j++){
|
||||||
int curr_queue = (start_queue + j) % NWD;
|
int curr_queue = (start_queue + j) % (h->highest_lun + 1);
|
||||||
/* make sure the disk has been added and the drive is real
|
/* make sure the disk has been added and the drive is real
|
||||||
* because this can be called from the middle of init_one.
|
* because this can be called from the middle of init_one.
|
||||||
*/
|
*/
|
||||||
if(!(h->gendisk[curr_queue]->queue) ||
|
if(!(h->drv[curr_queue].queue) ||
|
||||||
!(h->drv[curr_queue].heads))
|
!(h->drv[curr_queue].heads))
|
||||||
continue;
|
continue;
|
||||||
blk_start_queue(h->gendisk[curr_queue]->queue);
|
blk_start_queue(h->gendisk[curr_queue]->queue);
|
||||||
@ -2264,14 +2264,14 @@ static irqreturn_t do_cciss_intr(int irq, void *dev_id, struct pt_regs *regs)
|
|||||||
if ((find_first_zero_bit(h->cmd_pool_bits, NR_CMDS)) == NR_CMDS)
|
if ((find_first_zero_bit(h->cmd_pool_bits, NR_CMDS)) == NR_CMDS)
|
||||||
{
|
{
|
||||||
if (curr_queue == start_queue){
|
if (curr_queue == start_queue){
|
||||||
h->next_to_run = (start_queue + 1) % NWD;
|
h->next_to_run = (start_queue + 1) % (h->highest_lun + 1);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
} else {
|
} else {
|
||||||
h->next_to_run = curr_queue;
|
h->next_to_run = curr_queue;
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
curr_queue = (curr_queue + 1) % NWD;
|
curr_queue = (curr_queue + 1) % (h->highest_lun + 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2279,7 +2279,6 @@ cleanup:
|
|||||||
spin_unlock_irqrestore(CCISS_LOCK(h->ctlr), flags);
|
spin_unlock_irqrestore(CCISS_LOCK(h->ctlr), flags);
|
||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We cannot read the structure directly, for portablity we must use
|
* We cannot read the structure directly, for portablity we must use
|
||||||
* the io functions.
|
* the io functions.
|
||||||
@ -2789,13 +2788,6 @@ static int __devinit cciss_init_one(struct pci_dev *pdev,
|
|||||||
}
|
}
|
||||||
|
|
||||||
spin_lock_init(&hba[i]->lock);
|
spin_lock_init(&hba[i]->lock);
|
||||||
q = blk_init_queue(do_cciss_request, &hba[i]->lock);
|
|
||||||
if (!q)
|
|
||||||
goto clean4;
|
|
||||||
|
|
||||||
q->backing_dev_info.ra_pages = READ_AHEAD;
|
|
||||||
hba[i]->queue = q;
|
|
||||||
q->queuedata = hba[i];
|
|
||||||
|
|
||||||
/* Initialize the pdev driver private data.
|
/* Initialize the pdev driver private data.
|
||||||
have it point to hba[i]. */
|
have it point to hba[i]. */
|
||||||
@ -2817,6 +2809,20 @@ static int __devinit cciss_init_one(struct pci_dev *pdev,
|
|||||||
|
|
||||||
cciss_procinit(i);
|
cciss_procinit(i);
|
||||||
|
|
||||||
|
for(j=0; j < NWD; j++) { /* mfm */
|
||||||
|
drive_info_struct *drv = &(hba[i]->drv[j]);
|
||||||
|
struct gendisk *disk = hba[i]->gendisk[j];
|
||||||
|
|
||||||
|
q = blk_init_queue(do_cciss_request, &hba[i]->lock);
|
||||||
|
if (!q) {
|
||||||
|
printk(KERN_ERR
|
||||||
|
"cciss: unable to allocate queue for disk %d\n",
|
||||||
|
j);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
drv->queue = q;
|
||||||
|
|
||||||
|
q->backing_dev_info.ra_pages = READ_AHEAD;
|
||||||
blk_queue_bounce_limit(q, hba[i]->pdev->dma_mask);
|
blk_queue_bounce_limit(q, hba[i]->pdev->dma_mask);
|
||||||
|
|
||||||
/* This is a hardware imposed limit. */
|
/* This is a hardware imposed limit. */
|
||||||
@ -2827,26 +2833,23 @@ static int __devinit cciss_init_one(struct pci_dev *pdev,
|
|||||||
|
|
||||||
blk_queue_max_sectors(q, 512);
|
blk_queue_max_sectors(q, 512);
|
||||||
|
|
||||||
|
q->queuedata = hba[i];
|
||||||
for(j=0; j<NWD; j++) {
|
|
||||||
drive_info_struct *drv = &(hba[i]->drv[j]);
|
|
||||||
struct gendisk *disk = hba[i]->gendisk[j];
|
|
||||||
|
|
||||||
sprintf(disk->disk_name, "cciss/c%dd%d", i, j);
|
sprintf(disk->disk_name, "cciss/c%dd%d", i, j);
|
||||||
sprintf(disk->devfs_name, "cciss/host%d/target%d", i, j);
|
sprintf(disk->devfs_name, "cciss/host%d/target%d", i, j);
|
||||||
disk->major = hba[i]->major;
|
disk->major = hba[i]->major;
|
||||||
disk->first_minor = j << NWD_SHIFT;
|
disk->first_minor = j << NWD_SHIFT;
|
||||||
disk->fops = &cciss_fops;
|
disk->fops = &cciss_fops;
|
||||||
disk->queue = hba[i]->queue;
|
disk->queue = q;
|
||||||
disk->private_data = drv;
|
disk->private_data = drv;
|
||||||
/* we must register the controller even if no disks exist */
|
/* we must register the controller even if no disks exist */
|
||||||
/* this is for the online array utilities */
|
/* this is for the online array utilities */
|
||||||
if(!drv->heads && j)
|
if(!drv->heads && j)
|
||||||
continue;
|
continue;
|
||||||
blk_queue_hardsect_size(hba[i]->queue, drv->block_size);
|
blk_queue_hardsect_size(q, drv->block_size);
|
||||||
set_capacity(disk, drv->nr_blocks);
|
set_capacity(disk, drv->nr_blocks);
|
||||||
add_disk(disk);
|
add_disk(disk);
|
||||||
}
|
}
|
||||||
|
|
||||||
return(1);
|
return(1);
|
||||||
|
|
||||||
clean4:
|
clean4:
|
||||||
@ -2912,10 +2915,10 @@ static void __devexit cciss_remove_one (struct pci_dev *pdev)
|
|||||||
for (j = 0; j < NWD; j++) {
|
for (j = 0; j < NWD; j++) {
|
||||||
struct gendisk *disk = hba[i]->gendisk[j];
|
struct gendisk *disk = hba[i]->gendisk[j];
|
||||||
if (disk->flags & GENHD_FL_UP)
|
if (disk->flags & GENHD_FL_UP)
|
||||||
|
blk_cleanup_queue(disk->queue);
|
||||||
del_gendisk(disk);
|
del_gendisk(disk);
|
||||||
}
|
}
|
||||||
|
|
||||||
blk_cleanup_queue(hba[i]->queue);
|
|
||||||
pci_free_consistent(hba[i]->pdev, NR_CMDS * sizeof(CommandList_struct),
|
pci_free_consistent(hba[i]->pdev, NR_CMDS * sizeof(CommandList_struct),
|
||||||
hba[i]->cmd_pool, hba[i]->cmd_pool_dhandle);
|
hba[i]->cmd_pool, hba[i]->cmd_pool_dhandle);
|
||||||
pci_free_consistent(hba[i]->pdev, NR_CMDS * sizeof( ErrorInfo_struct),
|
pci_free_consistent(hba[i]->pdev, NR_CMDS * sizeof( ErrorInfo_struct),
|
||||||
|
@ -29,6 +29,7 @@ typedef struct _drive_info_struct
|
|||||||
{
|
{
|
||||||
__u32 LunID;
|
__u32 LunID;
|
||||||
int usage_count;
|
int usage_count;
|
||||||
|
struct request_queue *queue;
|
||||||
sector_t nr_blocks;
|
sector_t nr_blocks;
|
||||||
int block_size;
|
int block_size;
|
||||||
int heads;
|
int heads;
|
||||||
@ -72,7 +73,6 @@ struct ctlr_info
|
|||||||
unsigned int maxQsinceinit;
|
unsigned int maxQsinceinit;
|
||||||
unsigned int maxSG;
|
unsigned int maxSG;
|
||||||
spinlock_t lock;
|
spinlock_t lock;
|
||||||
struct request_queue *queue;
|
|
||||||
|
|
||||||
//* pointers to command and error info pool */
|
//* pointers to command and error info pool */
|
||||||
CommandList_struct *cmd_pool;
|
CommandList_struct *cmd_pool;
|
||||||
@ -260,7 +260,7 @@ struct board_type {
|
|||||||
struct access_method *access;
|
struct access_method *access;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define CCISS_LOCK(i) (hba[i]->queue->queue_lock)
|
#define CCISS_LOCK(i) (&hba[i]->lock)
|
||||||
|
|
||||||
#endif /* CCISS_H */
|
#endif /* CCISS_H */
|
||||||
|
|
||||||
|
@ -143,6 +143,7 @@ struct agp_bridge_data {
|
|||||||
char major_version;
|
char major_version;
|
||||||
char minor_version;
|
char minor_version;
|
||||||
struct list_head list;
|
struct list_head list;
|
||||||
|
u32 apbase_config;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define KB(x) ((x) * 1024)
|
#define KB(x) ((x) * 1024)
|
||||||
|
@ -1047,9 +1047,15 @@ static int intel_845_configure(void)
|
|||||||
/* aperture size */
|
/* aperture size */
|
||||||
pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
|
pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
|
||||||
|
|
||||||
/* address to map to */
|
if (agp_bridge->apbase_config != 0) {
|
||||||
pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp);
|
pci_write_config_dword(agp_bridge->dev, AGP_APBASE,
|
||||||
agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
|
agp_bridge->apbase_config);
|
||||||
|
} else {
|
||||||
|
/* address to map to */
|
||||||
|
pci_read_config_dword(agp_bridge->dev, AGP_APBASE, &temp);
|
||||||
|
agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
|
||||||
|
agp_bridge->apbase_config = temp;
|
||||||
|
}
|
||||||
|
|
||||||
/* attbase - aperture base */
|
/* attbase - aperture base */
|
||||||
pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
|
pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
|
||||||
|
@ -198,10 +198,10 @@ int setkeycode(unsigned int scancode, unsigned int keycode)
|
|||||||
|
|
||||||
if (scancode >= dev->keycodemax)
|
if (scancode >= dev->keycodemax)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
if (keycode > KEY_MAX)
|
|
||||||
return -EINVAL;
|
|
||||||
if (keycode < 0 || keycode > KEY_MAX)
|
if (keycode < 0 || keycode > KEY_MAX)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
if (keycode >> (dev->keycodesize * 8))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
oldkey = SET_INPUT_KEYCODE(dev, scancode, keycode);
|
oldkey = SET_INPUT_KEYCODE(dev, scancode, keycode);
|
||||||
|
|
||||||
|
@ -439,6 +439,11 @@ static struct {
|
|||||||
{ 0, 0 },
|
{ 0, 0 },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct sonypi_keypress {
|
||||||
|
struct input_dev *dev;
|
||||||
|
int key;
|
||||||
|
};
|
||||||
|
|
||||||
static struct sonypi_device {
|
static struct sonypi_device {
|
||||||
struct pci_dev *dev;
|
struct pci_dev *dev;
|
||||||
struct platform_device *pdev;
|
struct platform_device *pdev;
|
||||||
@ -710,22 +715,61 @@ static void sonypi_setbluetoothpower(u8 state)
|
|||||||
|
|
||||||
static void input_keyrelease(void *data)
|
static void input_keyrelease(void *data)
|
||||||
{
|
{
|
||||||
struct input_dev *input_dev;
|
struct sonypi_keypress kp;
|
||||||
int key;
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
if (kfifo_get(sonypi_device.input_fifo,
|
|
||||||
(unsigned char *)&input_dev,
|
|
||||||
sizeof(input_dev)) != sizeof(input_dev))
|
|
||||||
return;
|
|
||||||
if (kfifo_get(sonypi_device.input_fifo,
|
|
||||||
(unsigned char *)&key,
|
|
||||||
sizeof(key)) != sizeof(key))
|
|
||||||
return;
|
|
||||||
|
|
||||||
|
while (kfifo_get(sonypi_device.input_fifo, (unsigned char *)&kp,
|
||||||
|
sizeof(kp)) == sizeof(kp)) {
|
||||||
msleep(10);
|
msleep(10);
|
||||||
input_report_key(input_dev, key, 0);
|
input_report_key(kp.dev, kp.key, 0);
|
||||||
input_sync(input_dev);
|
input_sync(kp.dev);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void sonypi_report_input_event(u8 event)
|
||||||
|
{
|
||||||
|
struct input_dev *jog_dev = &sonypi_device.input_jog_dev;
|
||||||
|
struct input_dev *key_dev = &sonypi_device.input_key_dev;
|
||||||
|
struct sonypi_keypress kp = { NULL };
|
||||||
|
int i;
|
||||||
|
|
||||||
|
switch (event) {
|
||||||
|
case SONYPI_EVENT_JOGDIAL_UP:
|
||||||
|
case SONYPI_EVENT_JOGDIAL_UP_PRESSED:
|
||||||
|
input_report_rel(jog_dev, REL_WHEEL, 1);
|
||||||
|
input_sync(jog_dev);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SONYPI_EVENT_JOGDIAL_DOWN:
|
||||||
|
case SONYPI_EVENT_JOGDIAL_DOWN_PRESSED:
|
||||||
|
input_report_rel(jog_dev, REL_WHEEL, -1);
|
||||||
|
input_sync(jog_dev);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SONYPI_EVENT_JOGDIAL_PRESSED:
|
||||||
|
kp.key = BTN_MIDDLE;
|
||||||
|
kp.dev = jog_dev;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SONYPI_EVENT_FNKEY_RELEASED:
|
||||||
|
/* Nothing, not all VAIOs generate this event */
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
for (i = 0; sonypi_inputkeys[i].sonypiev; i++)
|
||||||
|
if (event == sonypi_inputkeys[i].sonypiev) {
|
||||||
|
kp.dev = key_dev;
|
||||||
|
kp.key = sonypi_inputkeys[i].inputev;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (kp.dev) {
|
||||||
|
input_report_key(kp.dev, kp.key, 1);
|
||||||
|
input_sync(kp.dev);
|
||||||
|
kfifo_put(sonypi_device.input_fifo,
|
||||||
|
(unsigned char *)&kp, sizeof(kp));
|
||||||
|
schedule_work(&sonypi_device.input_work);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -768,51 +812,8 @@ found:
|
|||||||
printk(KERN_INFO
|
printk(KERN_INFO
|
||||||
"sonypi: event port1=0x%02x,port2=0x%02x\n", v1, v2);
|
"sonypi: event port1=0x%02x,port2=0x%02x\n", v1, v2);
|
||||||
|
|
||||||
if (useinput) {
|
if (useinput)
|
||||||
struct input_dev *input_jog_dev = &sonypi_device.input_jog_dev;
|
sonypi_report_input_event(event);
|
||||||
struct input_dev *input_key_dev = &sonypi_device.input_key_dev;
|
|
||||||
switch (event) {
|
|
||||||
case SONYPI_EVENT_JOGDIAL_UP:
|
|
||||||
case SONYPI_EVENT_JOGDIAL_UP_PRESSED:
|
|
||||||
input_report_rel(input_jog_dev, REL_WHEEL, 1);
|
|
||||||
break;
|
|
||||||
case SONYPI_EVENT_JOGDIAL_DOWN:
|
|
||||||
case SONYPI_EVENT_JOGDIAL_DOWN_PRESSED:
|
|
||||||
input_report_rel(input_jog_dev, REL_WHEEL, -1);
|
|
||||||
break;
|
|
||||||
case SONYPI_EVENT_JOGDIAL_PRESSED: {
|
|
||||||
int key = BTN_MIDDLE;
|
|
||||||
input_report_key(input_jog_dev, key, 1);
|
|
||||||
kfifo_put(sonypi_device.input_fifo,
|
|
||||||
(unsigned char *)&input_jog_dev,
|
|
||||||
sizeof(input_jog_dev));
|
|
||||||
kfifo_put(sonypi_device.input_fifo,
|
|
||||||
(unsigned char *)&key, sizeof(key));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case SONYPI_EVENT_FNKEY_RELEASED:
|
|
||||||
/* Nothing, not all VAIOs generate this event */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
input_sync(input_jog_dev);
|
|
||||||
|
|
||||||
for (i = 0; sonypi_inputkeys[i].sonypiev; i++) {
|
|
||||||
int key;
|
|
||||||
|
|
||||||
if (event != sonypi_inputkeys[i].sonypiev)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
key = sonypi_inputkeys[i].inputev;
|
|
||||||
input_report_key(input_key_dev, key, 1);
|
|
||||||
kfifo_put(sonypi_device.input_fifo,
|
|
||||||
(unsigned char *)&input_key_dev,
|
|
||||||
sizeof(input_key_dev));
|
|
||||||
kfifo_put(sonypi_device.input_fifo,
|
|
||||||
(unsigned char *)&key, sizeof(key));
|
|
||||||
}
|
|
||||||
input_sync(input_key_dev);
|
|
||||||
schedule_work(&sonypi_device.input_work);
|
|
||||||
}
|
|
||||||
|
|
||||||
kfifo_put(sonypi_device.fifo, (unsigned char *)&event, sizeof(event));
|
kfifo_put(sonypi_device.fifo, (unsigned char *)&event, sizeof(event));
|
||||||
kill_fasync(&sonypi_device.fifo_async, SIGIO, POLL_IN);
|
kill_fasync(&sonypi_device.fifo_async, SIGIO, POLL_IN);
|
||||||
@ -1227,14 +1228,7 @@ static int __devinit sonypi_probe(void)
|
|||||||
sonypi_device.input_jog_dev.keybit[LONG(BTN_MOUSE)] =
|
sonypi_device.input_jog_dev.keybit[LONG(BTN_MOUSE)] =
|
||||||
BIT(BTN_MIDDLE);
|
BIT(BTN_MIDDLE);
|
||||||
sonypi_device.input_jog_dev.relbit[0] = BIT(REL_WHEEL);
|
sonypi_device.input_jog_dev.relbit[0] = BIT(REL_WHEEL);
|
||||||
sonypi_device.input_jog_dev.name =
|
sonypi_device.input_jog_dev.name = SONYPI_JOG_INPUTNAME;
|
||||||
kmalloc(sizeof(SONYPI_JOG_INPUTNAME), GFP_KERNEL);
|
|
||||||
if (!sonypi_device.input_jog_dev.name) {
|
|
||||||
printk(KERN_ERR "sonypi: kmalloc failed\n");
|
|
||||||
ret = -ENOMEM;
|
|
||||||
goto out_inkmallocinput1;
|
|
||||||
}
|
|
||||||
sprintf(sonypi_device.input_jog_dev.name, SONYPI_JOG_INPUTNAME);
|
|
||||||
sonypi_device.input_jog_dev.id.bustype = BUS_ISA;
|
sonypi_device.input_jog_dev.id.bustype = BUS_ISA;
|
||||||
sonypi_device.input_jog_dev.id.vendor = PCI_VENDOR_ID_SONY;
|
sonypi_device.input_jog_dev.id.vendor = PCI_VENDOR_ID_SONY;
|
||||||
|
|
||||||
@ -1248,14 +1242,7 @@ static int __devinit sonypi_probe(void)
|
|||||||
if (sonypi_inputkeys[i].inputev)
|
if (sonypi_inputkeys[i].inputev)
|
||||||
set_bit(sonypi_inputkeys[i].inputev,
|
set_bit(sonypi_inputkeys[i].inputev,
|
||||||
sonypi_device.input_key_dev.keybit);
|
sonypi_device.input_key_dev.keybit);
|
||||||
sonypi_device.input_key_dev.name =
|
sonypi_device.input_key_dev.name = SONYPI_KEY_INPUTNAME;
|
||||||
kmalloc(sizeof(SONYPI_KEY_INPUTNAME), GFP_KERNEL);
|
|
||||||
if (!sonypi_device.input_key_dev.name) {
|
|
||||||
printk(KERN_ERR "sonypi: kmalloc failed\n");
|
|
||||||
ret = -ENOMEM;
|
|
||||||
goto out_inkmallocinput2;
|
|
||||||
}
|
|
||||||
sprintf(sonypi_device.input_key_dev.name, SONYPI_KEY_INPUTNAME);
|
|
||||||
sonypi_device.input_key_dev.id.bustype = BUS_ISA;
|
sonypi_device.input_key_dev.id.bustype = BUS_ISA;
|
||||||
sonypi_device.input_key_dev.id.vendor = PCI_VENDOR_ID_SONY;
|
sonypi_device.input_key_dev.id.vendor = PCI_VENDOR_ID_SONY;
|
||||||
|
|
||||||
@ -1313,11 +1300,7 @@ out_platformdev:
|
|||||||
kfifo_free(sonypi_device.input_fifo);
|
kfifo_free(sonypi_device.input_fifo);
|
||||||
out_infifo:
|
out_infifo:
|
||||||
input_unregister_device(&sonypi_device.input_key_dev);
|
input_unregister_device(&sonypi_device.input_key_dev);
|
||||||
kfree(sonypi_device.input_key_dev.name);
|
|
||||||
out_inkmallocinput2:
|
|
||||||
input_unregister_device(&sonypi_device.input_jog_dev);
|
input_unregister_device(&sonypi_device.input_jog_dev);
|
||||||
kfree(sonypi_device.input_jog_dev.name);
|
|
||||||
out_inkmallocinput1:
|
|
||||||
free_irq(sonypi_device.irq, sonypi_irq);
|
free_irq(sonypi_device.irq, sonypi_irq);
|
||||||
out_reqirq:
|
out_reqirq:
|
||||||
release_region(sonypi_device.ioport1, sonypi_device.region_size);
|
release_region(sonypi_device.ioport1, sonypi_device.region_size);
|
||||||
@ -1337,13 +1320,14 @@ static void __devexit sonypi_remove(void)
|
|||||||
{
|
{
|
||||||
sonypi_disable();
|
sonypi_disable();
|
||||||
|
|
||||||
|
synchronize_sched(); /* Allow sonypi interrupt to complete. */
|
||||||
|
flush_scheduled_work();
|
||||||
|
|
||||||
platform_device_unregister(sonypi_device.pdev);
|
platform_device_unregister(sonypi_device.pdev);
|
||||||
|
|
||||||
if (useinput) {
|
if (useinput) {
|
||||||
input_unregister_device(&sonypi_device.input_key_dev);
|
input_unregister_device(&sonypi_device.input_key_dev);
|
||||||
kfree(sonypi_device.input_key_dev.name);
|
|
||||||
input_unregister_device(&sonypi_device.input_jog_dev);
|
input_unregister_device(&sonypi_device.input_jog_dev);
|
||||||
kfree(sonypi_device.input_jog_dev.name);
|
|
||||||
kfifo_free(sonypi_device.input_fifo);
|
kfifo_free(sonypi_device.input_fifo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1130,7 +1130,7 @@ int cpufreq_driver_target(struct cpufreq_policy *policy,
|
|||||||
unsigned int target_freq,
|
unsigned int target_freq,
|
||||||
unsigned int relation)
|
unsigned int relation)
|
||||||
{
|
{
|
||||||
unsigned int ret;
|
int ret;
|
||||||
|
|
||||||
policy = cpufreq_cpu_get(policy->cpu);
|
policy = cpufreq_cpu_get(policy->cpu);
|
||||||
if (!policy)
|
if (!policy)
|
||||||
@ -1151,7 +1151,7 @@ EXPORT_SYMBOL_GPL(cpufreq_driver_target);
|
|||||||
|
|
||||||
static int __cpufreq_governor(struct cpufreq_policy *policy, unsigned int event)
|
static int __cpufreq_governor(struct cpufreq_policy *policy, unsigned int event)
|
||||||
{
|
{
|
||||||
int ret = -EINVAL;
|
int ret;
|
||||||
|
|
||||||
if (!try_module_get(policy->governor->owner))
|
if (!try_module_get(policy->governor->owner))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -25,14 +25,22 @@ setup_serial_console(struct pcdp_uart *uart)
|
|||||||
#ifdef CONFIG_SERIAL_8250_CONSOLE
|
#ifdef CONFIG_SERIAL_8250_CONSOLE
|
||||||
int mmio;
|
int mmio;
|
||||||
static char options[64], *p = options;
|
static char options[64], *p = options;
|
||||||
|
char parity;
|
||||||
|
|
||||||
mmio = (uart->addr.address_space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY);
|
mmio = (uart->addr.address_space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY);
|
||||||
p += sprintf(p, "console=uart,%s,0x%lx",
|
p += sprintf(p, "console=uart,%s,0x%lx",
|
||||||
mmio ? "mmio" : "io", uart->addr.address);
|
mmio ? "mmio" : "io", uart->addr.address);
|
||||||
if (uart->baud)
|
if (uart->baud) {
|
||||||
p += sprintf(p, ",%lu", uart->baud);
|
p += sprintf(p, ",%lu", uart->baud);
|
||||||
if (uart->bits)
|
if (uart->bits) {
|
||||||
p += sprintf(p, "n%d", uart->bits);
|
switch (uart->parity) {
|
||||||
|
case 0x2: parity = 'e'; break;
|
||||||
|
case 0x3: parity = 'o'; break;
|
||||||
|
default: parity = 'n';
|
||||||
|
}
|
||||||
|
p += sprintf(p, "%c%d", parity, uart->bits);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return early_serial_console_init(options);
|
return early_serial_console_init(options);
|
||||||
#else
|
#else
|
||||||
|
@ -393,7 +393,7 @@ void adm1026_init_client(struct i2c_client *client)
|
|||||||
|
|
||||||
value = data->config3;
|
value = data->config3;
|
||||||
if (data->config3 & CFG3_GPIO16_ENABLE) {
|
if (data->config3 & CFG3_GPIO16_ENABLE) {
|
||||||
dev_dbg(&client->dev, "GPIO16 enabled. THERM"
|
dev_dbg(&client->dev, "GPIO16 enabled. THERM "
|
||||||
"pin disabled.\n");
|
"pin disabled.\n");
|
||||||
} else {
|
} else {
|
||||||
dev_dbg(&client->dev, "THERM pin enabled. "
|
dev_dbg(&client->dev, "THERM pin enabled. "
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
|
#include <linux/jiffies.h>
|
||||||
#include <linux/i2c.h>
|
#include <linux/i2c.h>
|
||||||
#include <linux/i2c-sensor.h>
|
#include <linux/i2c-sensor.h>
|
||||||
#include <linux/i2c-vid.h>
|
#include <linux/i2c-vid.h>
|
||||||
@ -80,9 +81,7 @@ static struct atxp1_data * atxp1_update_device(struct device *dev)
|
|||||||
|
|
||||||
down(&data->update_lock);
|
down(&data->update_lock);
|
||||||
|
|
||||||
if ((jiffies - data->last_updated > HZ) ||
|
if (time_after(jiffies, data->last_updated + HZ) || !data->valid) {
|
||||||
(jiffies < data->last_updated) ||
|
|
||||||
!data->valid) {
|
|
||||||
|
|
||||||
/* Update local register data */
|
/* Update local register data */
|
||||||
data->reg.vid = i2c_smbus_read_byte_data(client, ATXP1_VID);
|
data->reg.vid = i2c_smbus_read_byte_data(client, ATXP1_VID);
|
||||||
|
@ -32,6 +32,7 @@
|
|||||||
|
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
|
#include <linux/jiffies.h>
|
||||||
#include <linux/i2c.h>
|
#include <linux/i2c.h>
|
||||||
#include <linux/i2c-sensor.h>
|
#include <linux/i2c-sensor.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
@ -572,8 +573,7 @@ static struct fscpos_data *fscpos_update_device(struct device *dev)
|
|||||||
|
|
||||||
down(&data->update_lock);
|
down(&data->update_lock);
|
||||||
|
|
||||||
if ((jiffies - data->last_updated > 2 * HZ) ||
|
if (time_after(jiffies, data->last_updated + 2 * HZ) || !data->valid) {
|
||||||
(jiffies < data->last_updated) || !data->valid) {
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
dev_dbg(&client->dev, "Starting fscpos update\n");
|
dev_dbg(&client->dev, "Starting fscpos update\n");
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
|
#include <linux/jiffies.h>
|
||||||
#include <linux/i2c.h>
|
#include <linux/i2c.h>
|
||||||
#include <linux/i2c-sensor.h>
|
#include <linux/i2c-sensor.h>
|
||||||
#include <linux/i2c-vid.h>
|
#include <linux/i2c-vid.h>
|
||||||
@ -678,8 +679,7 @@ static struct gl520_data *gl520_update_device(struct device *dev)
|
|||||||
|
|
||||||
down(&data->update_lock);
|
down(&data->update_lock);
|
||||||
|
|
||||||
if ((jiffies - data->last_updated > 2 * HZ) ||
|
if (time_after(jiffies, data->last_updated + 2 * HZ) || !data->valid) {
|
||||||
(jiffies < data->last_updated) || !data->valid) {
|
|
||||||
|
|
||||||
dev_dbg(&client->dev, "Starting gl520sm update\n");
|
dev_dbg(&client->dev, "Starting gl520sm update\n");
|
||||||
|
|
||||||
|
@ -363,7 +363,7 @@ static void __exit sensors_max1619_exit(void)
|
|||||||
i2c_del_driver(&max1619_driver);
|
i2c_del_driver(&max1619_driver);
|
||||||
}
|
}
|
||||||
|
|
||||||
MODULE_AUTHOR("Alexey Fisher <fishor@mail.ru> and"
|
MODULE_AUTHOR("Alexey Fisher <fishor@mail.ru> and "
|
||||||
"Jean Delvare <khali@linux-fr.org>");
|
"Jean Delvare <khali@linux-fr.org>");
|
||||||
MODULE_DESCRIPTION("MAX1619 sensor driver");
|
MODULE_DESCRIPTION("MAX1619 sensor driver");
|
||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
|
@ -1043,7 +1043,7 @@ static void pc87360_init_client(struct i2c_client *client, int use_thermistors)
|
|||||||
if (init >= 2 && data->innr) {
|
if (init >= 2 && data->innr) {
|
||||||
reg = pc87360_read_value(data, LD_IN, NO_BANK,
|
reg = pc87360_read_value(data, LD_IN, NO_BANK,
|
||||||
PC87365_REG_IN_CONVRATE);
|
PC87365_REG_IN_CONVRATE);
|
||||||
dev_info(&client->dev, "VLM conversion set to"
|
dev_info(&client->dev, "VLM conversion set to "
|
||||||
"1s period, 160us delay\n");
|
"1s period, 160us delay\n");
|
||||||
pc87360_write_value(data, LD_IN, NO_BANK,
|
pc87360_write_value(data, LD_IN, NO_BANK,
|
||||||
PC87365_REG_IN_CONVRATE,
|
PC87365_REG_IN_CONVRATE,
|
||||||
|
@ -137,7 +137,7 @@ static int i801_setup(struct pci_dev *dev)
|
|||||||
pci_read_config_word(I801_dev, SMBBA, &i801_smba);
|
pci_read_config_word(I801_dev, SMBBA, &i801_smba);
|
||||||
i801_smba &= 0xfff0;
|
i801_smba &= 0xfff0;
|
||||||
if(i801_smba == 0) {
|
if(i801_smba == 0) {
|
||||||
dev_err(&dev->dev, "SMB base address uninitialized"
|
dev_err(&dev->dev, "SMB base address uninitialized "
|
||||||
"- upgrade BIOS or use force_addr=0xaddr\n");
|
"- upgrade BIOS or use force_addr=0xaddr\n");
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
@ -186,7 +186,7 @@ static int i801_transaction(void)
|
|||||||
int result = 0;
|
int result = 0;
|
||||||
int timeout = 0;
|
int timeout = 0;
|
||||||
|
|
||||||
dev_dbg(&I801_dev->dev, "Transaction (pre): CNT=%02x, CMD=%02x,"
|
dev_dbg(&I801_dev->dev, "Transaction (pre): CNT=%02x, CMD=%02x, "
|
||||||
"ADD=%02x, DAT0=%02x, DAT1=%02x\n", inb_p(SMBHSTCNT),
|
"ADD=%02x, DAT0=%02x, DAT1=%02x\n", inb_p(SMBHSTCNT),
|
||||||
inb_p(SMBHSTCMD), inb_p(SMBHSTADD), inb_p(SMBHSTDAT0),
|
inb_p(SMBHSTCMD), inb_p(SMBHSTADD), inb_p(SMBHSTDAT0),
|
||||||
inb_p(SMBHSTDAT1));
|
inb_p(SMBHSTDAT1));
|
||||||
@ -240,7 +240,7 @@ static int i801_transaction(void)
|
|||||||
outb_p(inb(SMBHSTSTS), SMBHSTSTS);
|
outb_p(inb(SMBHSTSTS), SMBHSTSTS);
|
||||||
|
|
||||||
if ((temp = (0x1f & inb_p(SMBHSTSTS))) != 0x00) {
|
if ((temp = (0x1f & inb_p(SMBHSTSTS))) != 0x00) {
|
||||||
dev_dbg(&I801_dev->dev, "Failed reset at end of transaction"
|
dev_dbg(&I801_dev->dev, "Failed reset at end of transaction "
|
||||||
"(%02x)\n", temp);
|
"(%02x)\n", temp);
|
||||||
}
|
}
|
||||||
dev_dbg(&I801_dev->dev, "Transaction (post): CNT=%02x, CMD=%02x, "
|
dev_dbg(&I801_dev->dev, "Transaction (post): CNT=%02x, CMD=%02x, "
|
||||||
|
@ -382,6 +382,100 @@ static void __exit fsl_i2c_exit(void)
|
|||||||
module_init(fsl_i2c_init);
|
module_init(fsl_i2c_init);
|
||||||
module_exit(fsl_i2c_exit);
|
module_exit(fsl_i2c_exit);
|
||||||
|
|
||||||
|
static int fsl_i2c_probe(struct device *device)
|
||||||
|
{
|
||||||
|
int result = 0;
|
||||||
|
struct mpc_i2c *i2c;
|
||||||
|
struct platform_device *pdev = to_platform_device(device);
|
||||||
|
struct fsl_i2c_platform_data *pdata;
|
||||||
|
struct resource *r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||||
|
|
||||||
|
pdata = (struct fsl_i2c_platform_data *) pdev->dev.platform_data;
|
||||||
|
|
||||||
|
if (!(i2c = kmalloc(sizeof(*i2c), GFP_KERNEL))) {
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
memset(i2c, 0, sizeof(*i2c));
|
||||||
|
|
||||||
|
i2c->irq = platform_get_irq(pdev, 0);
|
||||||
|
i2c->flags = pdata->device_flags;
|
||||||
|
init_waitqueue_head(&i2c->queue);
|
||||||
|
|
||||||
|
i2c->base = ioremap((phys_addr_t)r->start, MPC_I2C_REGION);
|
||||||
|
|
||||||
|
if (!i2c->base) {
|
||||||
|
printk(KERN_ERR "i2c-mpc - failed to map controller\n");
|
||||||
|
result = -ENOMEM;
|
||||||
|
goto fail_map;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i2c->irq != 0)
|
||||||
|
if ((result = request_irq(i2c->irq, mpc_i2c_isr,
|
||||||
|
SA_SHIRQ, "i2c-mpc", i2c)) < 0) {
|
||||||
|
printk(KERN_ERR
|
||||||
|
"i2c-mpc - failed to attach interrupt\n");
|
||||||
|
goto fail_irq;
|
||||||
|
}
|
||||||
|
|
||||||
|
mpc_i2c_setclock(i2c);
|
||||||
|
dev_set_drvdata(device, i2c);
|
||||||
|
|
||||||
|
i2c->adap = mpc_ops;
|
||||||
|
i2c_set_adapdata(&i2c->adap, i2c);
|
||||||
|
i2c->adap.dev.parent = &pdev->dev;
|
||||||
|
if ((result = i2c_add_adapter(&i2c->adap)) < 0) {
|
||||||
|
printk(KERN_ERR "i2c-mpc - failed to add adapter\n");
|
||||||
|
goto fail_add;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
|
||||||
|
fail_add:
|
||||||
|
if (i2c->irq != 0)
|
||||||
|
free_irq(i2c->irq, NULL);
|
||||||
|
fail_irq:
|
||||||
|
iounmap(i2c->base);
|
||||||
|
fail_map:
|
||||||
|
kfree(i2c);
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
|
||||||
|
static int fsl_i2c_remove(struct device *device)
|
||||||
|
{
|
||||||
|
struct mpc_i2c *i2c = dev_get_drvdata(device);
|
||||||
|
|
||||||
|
i2c_del_adapter(&i2c->adap);
|
||||||
|
dev_set_drvdata(device, NULL);
|
||||||
|
|
||||||
|
if (i2c->irq != 0)
|
||||||
|
free_irq(i2c->irq, i2c);
|
||||||
|
|
||||||
|
iounmap(i2c->base);
|
||||||
|
kfree(i2c);
|
||||||
|
return 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Structure for a device driver */
|
||||||
|
static struct device_driver fsl_i2c_driver = {
|
||||||
|
.name = "fsl-i2c",
|
||||||
|
.bus = &platform_bus_type,
|
||||||
|
.probe = fsl_i2c_probe,
|
||||||
|
.remove = fsl_i2c_remove,
|
||||||
|
};
|
||||||
|
|
||||||
|
static int __init fsl_i2c_init(void)
|
||||||
|
{
|
||||||
|
return driver_register(&fsl_i2c_driver);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __exit fsl_i2c_exit(void)
|
||||||
|
{
|
||||||
|
driver_unregister(&fsl_i2c_driver);
|
||||||
|
}
|
||||||
|
|
||||||
|
module_init(fsl_i2c_init);
|
||||||
|
module_exit(fsl_i2c_exit);
|
||||||
|
|
||||||
MODULE_AUTHOR("Adrian Cox <adrian@humboldt.co.uk>");
|
MODULE_AUTHOR("Adrian Cox <adrian@humboldt.co.uk>");
|
||||||
MODULE_DESCRIPTION
|
MODULE_DESCRIPTION
|
||||||
("I2C-Bus adapter for MPC107 bridge and MPC824x/85xx/52xx processors");
|
("I2C-Bus adapter for MPC107 bridge and MPC824x/85xx/52xx processors");
|
||||||
|
@ -165,7 +165,7 @@ static int ds1337_set_datetime(struct i2c_client *client, struct rtc_time *dt)
|
|||||||
buf[0] = 0; /* reg offset */
|
buf[0] = 0; /* reg offset */
|
||||||
buf[1] = BIN2BCD(dt->tm_sec);
|
buf[1] = BIN2BCD(dt->tm_sec);
|
||||||
buf[2] = BIN2BCD(dt->tm_min);
|
buf[2] = BIN2BCD(dt->tm_min);
|
||||||
buf[3] = BIN2BCD(dt->tm_hour) | (1 << 6);
|
buf[3] = BIN2BCD(dt->tm_hour);
|
||||||
buf[4] = BIN2BCD(dt->tm_wday) + 1;
|
buf[4] = BIN2BCD(dt->tm_wday) + 1;
|
||||||
buf[5] = BIN2BCD(dt->tm_mday);
|
buf[5] = BIN2BCD(dt->tm_mday);
|
||||||
buf[6] = BIN2BCD(dt->tm_mon) + 1;
|
buf[6] = BIN2BCD(dt->tm_mon) + 1;
|
||||||
@ -344,9 +344,9 @@ static void ds1337_init_client(struct i2c_client *client)
|
|||||||
|
|
||||||
/* Ensure that device is set in 24-hour mode */
|
/* Ensure that device is set in 24-hour mode */
|
||||||
val = i2c_smbus_read_byte_data(client, DS1337_REG_HOUR);
|
val = i2c_smbus_read_byte_data(client, DS1337_REG_HOUR);
|
||||||
if ((val >= 0) && (val & (1 << 6)) == 0)
|
if ((val >= 0) && (val & (1 << 6)))
|
||||||
i2c_smbus_write_byte_data(client, DS1337_REG_HOUR,
|
i2c_smbus_write_byte_data(client, DS1337_REG_HOUR,
|
||||||
val | (1 << 6));
|
val & 0x3f);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ds1337_detach_client(struct i2c_client *client)
|
static int ds1337_detach_client(struct i2c_client *client)
|
||||||
|
@ -163,6 +163,11 @@ int eeprom_detect(struct i2c_adapter *adapter, int address, int kind)
|
|||||||
struct eeprom_data *data;
|
struct eeprom_data *data;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
||||||
|
/* prevent 24RF08 corruption */
|
||||||
|
if (kind < 0)
|
||||||
|
i2c_smbus_xfer(adapter, address, 0, 0, 0,
|
||||||
|
I2C_SMBUS_QUICK, NULL);
|
||||||
|
|
||||||
/* There are three ways we can read the EEPROM data:
|
/* There are three ways we can read the EEPROM data:
|
||||||
(1) I2C block reads (faster, but unsupported by most adapters)
|
(1) I2C block reads (faster, but unsupported by most adapters)
|
||||||
(2) Consecutive byte reads (100% overhead)
|
(2) Consecutive byte reads (100% overhead)
|
||||||
@ -187,9 +192,6 @@ int eeprom_detect(struct i2c_adapter *adapter, int address, int kind)
|
|||||||
new_client->driver = &eeprom_driver;
|
new_client->driver = &eeprom_driver;
|
||||||
new_client->flags = 0;
|
new_client->flags = 0;
|
||||||
|
|
||||||
/* prevent 24RF08 corruption */
|
|
||||||
i2c_smbus_write_quick(new_client, 0);
|
|
||||||
|
|
||||||
/* Fill in the remaining client fields */
|
/* Fill in the remaining client fields */
|
||||||
strlcpy(new_client->name, "eeprom", I2C_NAME_SIZE);
|
strlcpy(new_client->name, "eeprom", I2C_NAME_SIZE);
|
||||||
data->valid = 0;
|
data->valid = 0;
|
||||||
|
@ -343,6 +343,11 @@ static int max6875_detect(struct i2c_adapter *adapter, int address, int kind)
|
|||||||
struct max6875_data *data;
|
struct max6875_data *data;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
||||||
|
/* Prevent 24RF08 corruption (in case of user error) */
|
||||||
|
if (kind < 0)
|
||||||
|
i2c_smbus_xfer(adapter, address, 0, 0, 0,
|
||||||
|
I2C_SMBUS_QUICK, NULL);
|
||||||
|
|
||||||
/* There are three ways we can read the EEPROM data:
|
/* There are three ways we can read the EEPROM data:
|
||||||
(1) I2C block reads (faster, but unsupported by most adapters)
|
(1) I2C block reads (faster, but unsupported by most adapters)
|
||||||
(2) Consecutive byte reads (100% overhead)
|
(2) Consecutive byte reads (100% overhead)
|
||||||
@ -370,9 +375,6 @@ static int max6875_detect(struct i2c_adapter *adapter, int address, int kind)
|
|||||||
new_client->driver = &max6875_driver;
|
new_client->driver = &max6875_driver;
|
||||||
new_client->flags = 0;
|
new_client->flags = 0;
|
||||||
|
|
||||||
/* Prevent 24RF08 corruption */
|
|
||||||
i2c_smbus_write_quick(new_client, 0);
|
|
||||||
|
|
||||||
/* Setup the user section */
|
/* Setup the user section */
|
||||||
data->blocks[max6875_eeprom_user].type = max6875_eeprom_user;
|
data->blocks[max6875_eeprom_user].type = max6875_eeprom_user;
|
||||||
data->blocks[max6875_eeprom_user].slices = USER_EEPROM_SLICES;
|
data->blocks[max6875_eeprom_user].slices = USER_EEPROM_SLICES;
|
||||||
|
@ -231,8 +231,8 @@ int i2c_del_adapter(struct i2c_adapter *adap)
|
|||||||
if (driver->detach_adapter)
|
if (driver->detach_adapter)
|
||||||
if ((res = driver->detach_adapter(adap))) {
|
if ((res = driver->detach_adapter(adap))) {
|
||||||
dev_warn(&adap->dev, "can't detach adapter "
|
dev_warn(&adap->dev, "can't detach adapter "
|
||||||
"while detaching driver %s: driver not "
|
"while detaching driver %s: driver "
|
||||||
"detached!", driver->name);
|
"not detached!\n", driver->name);
|
||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -456,8 +456,8 @@ int i2c_detach_client(struct i2c_client *client)
|
|||||||
res = adapter->client_unregister(client);
|
res = adapter->client_unregister(client);
|
||||||
if (res) {
|
if (res) {
|
||||||
dev_err(&client->dev,
|
dev_err(&client->dev,
|
||||||
"client_unregister [%s] failed, "
|
"client_unregister [%s] failed, "
|
||||||
"client not detached", client->name);
|
"client not detached\n", client->name);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -465,7 +465,7 @@ static struct pcmcia_device_id ide_ids[] = {
|
|||||||
PCMCIA_DEVICE_PROD_ID12("CNF CD-M", "CD-ROM", 0x7d93b852, 0x66536591),
|
PCMCIA_DEVICE_PROD_ID12("CNF CD-M", "CD-ROM", 0x7d93b852, 0x66536591),
|
||||||
PCMCIA_DEVICE_PROD_ID12("Creative Technology Ltd.", "PCMCIA CD-ROM Interface Card", 0xff8c8a45, 0xfe8020c4),
|
PCMCIA_DEVICE_PROD_ID12("Creative Technology Ltd.", "PCMCIA CD-ROM Interface Card", 0xff8c8a45, 0xfe8020c4),
|
||||||
PCMCIA_DEVICE_PROD_ID12("Digital Equipment Corporation.", "Digital Mobile Media CD-ROM", 0x17692a66, 0xef1dcbde),
|
PCMCIA_DEVICE_PROD_ID12("Digital Equipment Corporation.", "Digital Mobile Media CD-ROM", 0x17692a66, 0xef1dcbde),
|
||||||
PCMCIA_DEVICE_PROD_ID12("EXP", "CD", 0x6f58c983, 0xaae5994f),
|
PCMCIA_DEVICE_PROD_ID12("EXP", "CD+GAME", 0x6f58c983, 0x63c13aaf),
|
||||||
PCMCIA_DEVICE_PROD_ID12("EXP ", "CD-ROM", 0x0a5c52fd, 0x66536591),
|
PCMCIA_DEVICE_PROD_ID12("EXP ", "CD-ROM", 0x0a5c52fd, 0x66536591),
|
||||||
PCMCIA_DEVICE_PROD_ID12("EXP ", "PnPIDE", 0x0a5c52fd, 0x0c694728),
|
PCMCIA_DEVICE_PROD_ID12("EXP ", "PnPIDE", 0x0a5c52fd, 0x0c694728),
|
||||||
PCMCIA_DEVICE_PROD_ID12("FREECOM", "PCCARD-IDE", 0x5714cbf7, 0x48e0ab8e),
|
PCMCIA_DEVICE_PROD_ID12("FREECOM", "PCCARD-IDE", 0x5714cbf7, 0x48e0ab8e),
|
||||||
@ -481,6 +481,7 @@ static struct pcmcia_device_id ide_ids[] = {
|
|||||||
PCMCIA_DEVICE_PROD_ID12("TOSHIBA", "MK2001MPL", 0xb4585a1a, 0x3489e003),
|
PCMCIA_DEVICE_PROD_ID12("TOSHIBA", "MK2001MPL", 0xb4585a1a, 0x3489e003),
|
||||||
PCMCIA_DEVICE_PROD_ID12("WIT", "IDE16", 0x244e5994, 0x3e232852),
|
PCMCIA_DEVICE_PROD_ID12("WIT", "IDE16", 0x244e5994, 0x3e232852),
|
||||||
PCMCIA_DEVICE_PROD_ID1("STI Flash", 0xe4a13209),
|
PCMCIA_DEVICE_PROD_ID1("STI Flash", 0xe4a13209),
|
||||||
|
PCMCIA_MFC_DEVICE_PROD_ID12(1, "SanDisk", "ConnectPlus", 0x7a954bd9, 0x74be00c6),
|
||||||
PCMCIA_DEVICE_NULL,
|
PCMCIA_DEVICE_NULL,
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(pcmcia, ide_ids);
|
MODULE_DEVICE_TABLE(pcmcia, ide_ids);
|
||||||
|
@ -320,6 +320,7 @@ static long evdev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
|||||||
if (t < 0 || t >= dev->keycodemax || !dev->keycodesize) return -EINVAL;
|
if (t < 0 || t >= dev->keycodemax || !dev->keycodesize) return -EINVAL;
|
||||||
if (get_user(v, ip + 1)) return -EFAULT;
|
if (get_user(v, ip + 1)) return -EFAULT;
|
||||||
if (v < 0 || v > KEY_MAX) return -EINVAL;
|
if (v < 0 || v > KEY_MAX) return -EINVAL;
|
||||||
|
if (v >> (dev->keycodesize * 8)) return -EINVAL;
|
||||||
u = SET_INPUT_KEYCODE(dev, t, v);
|
u = SET_INPUT_KEYCODE(dev, t, v);
|
||||||
clear_bit(u, dev->keybit);
|
clear_bit(u, dev->keybit);
|
||||||
set_bit(v, dev->keybit);
|
set_bit(v, dev->keybit);
|
||||||
|
@ -48,12 +48,6 @@ static LIST_HEAD(input_handler_list);
|
|||||||
|
|
||||||
static struct input_handler *input_table[8];
|
static struct input_handler *input_table[8];
|
||||||
|
|
||||||
#ifdef CONFIG_PROC_FS
|
|
||||||
static struct proc_dir_entry *proc_bus_input_dir;
|
|
||||||
static DECLARE_WAIT_QUEUE_HEAD(input_devices_poll_wait);
|
|
||||||
static int input_devices_state;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
|
void input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
|
||||||
{
|
{
|
||||||
struct input_handle *handle;
|
struct input_handle *handle;
|
||||||
@ -312,6 +306,7 @@ static struct input_device_id *input_match_device(struct input_device_id *id, st
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Input hotplugging interface - loading event handlers based on
|
* Input hotplugging interface - loading event handlers based on
|
||||||
* device bitfields.
|
* device bitfields.
|
||||||
@ -428,162 +423,27 @@ static void input_call_hotplug(char *verb, struct input_dev *dev)
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void input_register_device(struct input_dev *dev)
|
|
||||||
{
|
|
||||||
struct input_handle *handle;
|
|
||||||
struct input_handler *handler;
|
|
||||||
struct input_device_id *id;
|
|
||||||
|
|
||||||
set_bit(EV_SYN, dev->evbit);
|
|
||||||
|
|
||||||
init_MUTEX(&dev->sem);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If delay and period are pre-set by the driver, then autorepeating
|
|
||||||
* is handled by the driver itself and we don't do it in input.c.
|
|
||||||
*/
|
|
||||||
|
|
||||||
init_timer(&dev->timer);
|
|
||||||
if (!dev->rep[REP_DELAY] && !dev->rep[REP_PERIOD]) {
|
|
||||||
dev->timer.data = (long) dev;
|
|
||||||
dev->timer.function = input_repeat_key;
|
|
||||||
dev->rep[REP_DELAY] = 250;
|
|
||||||
dev->rep[REP_PERIOD] = 33;
|
|
||||||
}
|
|
||||||
|
|
||||||
INIT_LIST_HEAD(&dev->h_list);
|
|
||||||
list_add_tail(&dev->node, &input_dev_list);
|
|
||||||
|
|
||||||
list_for_each_entry(handler, &input_handler_list, node)
|
|
||||||
if (!handler->blacklist || !input_match_device(handler->blacklist, dev))
|
|
||||||
if ((id = input_match_device(handler->id_table, dev)))
|
|
||||||
if ((handle = handler->connect(handler, dev, id)))
|
|
||||||
input_link_handle(handle);
|
|
||||||
|
|
||||||
#ifdef CONFIG_HOTPLUG
|
|
||||||
input_call_hotplug("add", dev);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef CONFIG_PROC_FS
|
#ifdef CONFIG_PROC_FS
|
||||||
|
|
||||||
|
static struct proc_dir_entry *proc_bus_input_dir;
|
||||||
|
static DECLARE_WAIT_QUEUE_HEAD(input_devices_poll_wait);
|
||||||
|
static int input_devices_state;
|
||||||
|
|
||||||
|
static inline void input_wakeup_procfs_readers(void)
|
||||||
|
{
|
||||||
input_devices_state++;
|
input_devices_state++;
|
||||||
wake_up(&input_devices_poll_wait);
|
wake_up(&input_devices_poll_wait);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void input_unregister_device(struct input_dev *dev)
|
static unsigned int input_devices_poll(struct file *file, poll_table *wait)
|
||||||
{
|
{
|
||||||
struct list_head * node, * next;
|
int state = input_devices_state;
|
||||||
|
poll_wait(file, &input_devices_poll_wait, wait);
|
||||||
if (!dev) return;
|
if (state != input_devices_state)
|
||||||
|
return POLLIN | POLLRDNORM;
|
||||||
del_timer_sync(&dev->timer);
|
return 0;
|
||||||
|
|
||||||
list_for_each_safe(node, next, &dev->h_list) {
|
|
||||||
struct input_handle * handle = to_handle(node);
|
|
||||||
list_del_init(&handle->d_node);
|
|
||||||
list_del_init(&handle->h_node);
|
|
||||||
handle->handler->disconnect(handle);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef CONFIG_HOTPLUG
|
|
||||||
input_call_hotplug("remove", dev);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
list_del_init(&dev->node);
|
|
||||||
|
|
||||||
#ifdef CONFIG_PROC_FS
|
|
||||||
input_devices_state++;
|
|
||||||
wake_up(&input_devices_poll_wait);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void input_register_handler(struct input_handler *handler)
|
|
||||||
{
|
|
||||||
struct input_dev *dev;
|
|
||||||
struct input_handle *handle;
|
|
||||||
struct input_device_id *id;
|
|
||||||
|
|
||||||
if (!handler) return;
|
|
||||||
|
|
||||||
INIT_LIST_HEAD(&handler->h_list);
|
|
||||||
|
|
||||||
if (handler->fops != NULL)
|
|
||||||
input_table[handler->minor >> 5] = handler;
|
|
||||||
|
|
||||||
list_add_tail(&handler->node, &input_handler_list);
|
|
||||||
|
|
||||||
list_for_each_entry(dev, &input_dev_list, node)
|
|
||||||
if (!handler->blacklist || !input_match_device(handler->blacklist, dev))
|
|
||||||
if ((id = input_match_device(handler->id_table, dev)))
|
|
||||||
if ((handle = handler->connect(handler, dev, id)))
|
|
||||||
input_link_handle(handle);
|
|
||||||
|
|
||||||
#ifdef CONFIG_PROC_FS
|
|
||||||
input_devices_state++;
|
|
||||||
wake_up(&input_devices_poll_wait);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void input_unregister_handler(struct input_handler *handler)
|
|
||||||
{
|
|
||||||
struct list_head * node, * next;
|
|
||||||
|
|
||||||
list_for_each_safe(node, next, &handler->h_list) {
|
|
||||||
struct input_handle * handle = to_handle_h(node);
|
|
||||||
list_del_init(&handle->h_node);
|
|
||||||
list_del_init(&handle->d_node);
|
|
||||||
handler->disconnect(handle);
|
|
||||||
}
|
|
||||||
|
|
||||||
list_del_init(&handler->node);
|
|
||||||
|
|
||||||
if (handler->fops != NULL)
|
|
||||||
input_table[handler->minor >> 5] = NULL;
|
|
||||||
|
|
||||||
#ifdef CONFIG_PROC_FS
|
|
||||||
input_devices_state++;
|
|
||||||
wake_up(&input_devices_poll_wait);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static int input_open_file(struct inode *inode, struct file *file)
|
|
||||||
{
|
|
||||||
struct input_handler *handler = input_table[iminor(inode) >> 5];
|
|
||||||
struct file_operations *old_fops, *new_fops = NULL;
|
|
||||||
int err;
|
|
||||||
|
|
||||||
/* No load-on-demand here? */
|
|
||||||
if (!handler || !(new_fops = fops_get(handler->fops)))
|
|
||||||
return -ENODEV;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* That's _really_ odd. Usually NULL ->open means "nothing special",
|
|
||||||
* not "no device". Oh, well...
|
|
||||||
*/
|
|
||||||
if (!new_fops->open) {
|
|
||||||
fops_put(new_fops);
|
|
||||||
return -ENODEV;
|
|
||||||
}
|
|
||||||
old_fops = file->f_op;
|
|
||||||
file->f_op = new_fops;
|
|
||||||
|
|
||||||
err = new_fops->open(inode, file);
|
|
||||||
|
|
||||||
if (err) {
|
|
||||||
fops_put(file->f_op);
|
|
||||||
file->f_op = fops_get(old_fops);
|
|
||||||
}
|
|
||||||
fops_put(old_fops);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct file_operations input_fops = {
|
|
||||||
.owner = THIS_MODULE,
|
|
||||||
.open = input_open_file,
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifdef CONFIG_PROC_FS
|
|
||||||
|
|
||||||
#define SPRINTF_BIT_B(bit, name, max) \
|
#define SPRINTF_BIT_B(bit, name, max) \
|
||||||
do { \
|
do { \
|
||||||
len += sprintf(buf + len, "B: %s", name); \
|
len += sprintf(buf + len, "B: %s", name); \
|
||||||
@ -600,16 +460,6 @@ static struct file_operations input_fops = {
|
|||||||
SPRINTF_BIT_B(bit, name, max); \
|
SPRINTF_BIT_B(bit, name, max); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
static unsigned int input_devices_poll(struct file *file, poll_table *wait)
|
|
||||||
{
|
|
||||||
int state = input_devices_state;
|
|
||||||
poll_wait(file, &input_devices_poll_wait, wait);
|
|
||||||
if (state != input_devices_state)
|
|
||||||
return POLLIN | POLLRDNORM;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int input_devices_read(char *buf, char **start, off_t pos, int count, int *eof, void *data)
|
static int input_devices_read(char *buf, char **start, off_t pos, int count, int *eof, void *data)
|
||||||
{
|
{
|
||||||
struct input_dev *dev;
|
struct input_dev *dev;
|
||||||
@ -704,68 +554,225 @@ static int __init input_proc_init(void)
|
|||||||
struct proc_dir_entry *entry;
|
struct proc_dir_entry *entry;
|
||||||
|
|
||||||
proc_bus_input_dir = proc_mkdir("input", proc_bus);
|
proc_bus_input_dir = proc_mkdir("input", proc_bus);
|
||||||
if (proc_bus_input_dir == NULL)
|
if (!proc_bus_input_dir)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
proc_bus_input_dir->owner = THIS_MODULE;
|
proc_bus_input_dir->owner = THIS_MODULE;
|
||||||
|
|
||||||
entry = create_proc_read_entry("devices", 0, proc_bus_input_dir, input_devices_read, NULL);
|
entry = create_proc_read_entry("devices", 0, proc_bus_input_dir, input_devices_read, NULL);
|
||||||
if (entry == NULL) {
|
if (!entry)
|
||||||
remove_proc_entry("input", proc_bus);
|
goto fail1;
|
||||||
return -ENOMEM;
|
|
||||||
}
|
|
||||||
entry->owner = THIS_MODULE;
|
entry->owner = THIS_MODULE;
|
||||||
input_fileops = *entry->proc_fops;
|
input_fileops = *entry->proc_fops;
|
||||||
entry->proc_fops = &input_fileops;
|
entry->proc_fops = &input_fileops;
|
||||||
entry->proc_fops->poll = input_devices_poll;
|
entry->proc_fops->poll = input_devices_poll;
|
||||||
|
|
||||||
entry = create_proc_read_entry("handlers", 0, proc_bus_input_dir, input_handlers_read, NULL);
|
entry = create_proc_read_entry("handlers", 0, proc_bus_input_dir, input_handlers_read, NULL);
|
||||||
if (entry == NULL) {
|
if (!entry)
|
||||||
remove_proc_entry("devices", proc_bus_input_dir);
|
goto fail2;
|
||||||
remove_proc_entry("input", proc_bus);
|
|
||||||
return -ENOMEM;
|
|
||||||
}
|
|
||||||
entry->owner = THIS_MODULE;
|
entry->owner = THIS_MODULE;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
fail2: remove_proc_entry("devices", proc_bus_input_dir);
|
||||||
|
fail1: remove_proc_entry("input", proc_bus);
|
||||||
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void input_proc_exit(void)
|
||||||
|
{
|
||||||
|
remove_proc_entry("devices", proc_bus_input_dir);
|
||||||
|
remove_proc_entry("handlers", proc_bus_input_dir);
|
||||||
|
remove_proc_entry("input", proc_bus);
|
||||||
|
}
|
||||||
|
|
||||||
#else /* !CONFIG_PROC_FS */
|
#else /* !CONFIG_PROC_FS */
|
||||||
|
static inline void input_wakeup_procfs_readers(void) { }
|
||||||
static inline int input_proc_init(void) { return 0; }
|
static inline int input_proc_init(void) { return 0; }
|
||||||
|
static inline void input_proc_exit(void) { }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
void input_register_device(struct input_dev *dev)
|
||||||
|
{
|
||||||
|
struct input_handle *handle;
|
||||||
|
struct input_handler *handler;
|
||||||
|
struct input_device_id *id;
|
||||||
|
|
||||||
|
set_bit(EV_SYN, dev->evbit);
|
||||||
|
|
||||||
|
init_MUTEX(&dev->sem);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If delay and period are pre-set by the driver, then autorepeating
|
||||||
|
* is handled by the driver itself and we don't do it in input.c.
|
||||||
|
*/
|
||||||
|
|
||||||
|
init_timer(&dev->timer);
|
||||||
|
if (!dev->rep[REP_DELAY] && !dev->rep[REP_PERIOD]) {
|
||||||
|
dev->timer.data = (long) dev;
|
||||||
|
dev->timer.function = input_repeat_key;
|
||||||
|
dev->rep[REP_DELAY] = 250;
|
||||||
|
dev->rep[REP_PERIOD] = 33;
|
||||||
|
}
|
||||||
|
|
||||||
|
INIT_LIST_HEAD(&dev->h_list);
|
||||||
|
list_add_tail(&dev->node, &input_dev_list);
|
||||||
|
|
||||||
|
list_for_each_entry(handler, &input_handler_list, node)
|
||||||
|
if (!handler->blacklist || !input_match_device(handler->blacklist, dev))
|
||||||
|
if ((id = input_match_device(handler->id_table, dev)))
|
||||||
|
if ((handle = handler->connect(handler, dev, id)))
|
||||||
|
input_link_handle(handle);
|
||||||
|
|
||||||
|
#ifdef CONFIG_HOTPLUG
|
||||||
|
input_call_hotplug("add", dev);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
input_wakeup_procfs_readers();
|
||||||
|
}
|
||||||
|
|
||||||
|
void input_unregister_device(struct input_dev *dev)
|
||||||
|
{
|
||||||
|
struct list_head * node, * next;
|
||||||
|
|
||||||
|
if (!dev) return;
|
||||||
|
|
||||||
|
del_timer_sync(&dev->timer);
|
||||||
|
|
||||||
|
list_for_each_safe(node, next, &dev->h_list) {
|
||||||
|
struct input_handle * handle = to_handle(node);
|
||||||
|
list_del_init(&handle->d_node);
|
||||||
|
list_del_init(&handle->h_node);
|
||||||
|
handle->handler->disconnect(handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_HOTPLUG
|
||||||
|
input_call_hotplug("remove", dev);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
list_del_init(&dev->node);
|
||||||
|
|
||||||
|
input_wakeup_procfs_readers();
|
||||||
|
}
|
||||||
|
|
||||||
|
void input_register_handler(struct input_handler *handler)
|
||||||
|
{
|
||||||
|
struct input_dev *dev;
|
||||||
|
struct input_handle *handle;
|
||||||
|
struct input_device_id *id;
|
||||||
|
|
||||||
|
if (!handler) return;
|
||||||
|
|
||||||
|
INIT_LIST_HEAD(&handler->h_list);
|
||||||
|
|
||||||
|
if (handler->fops != NULL)
|
||||||
|
input_table[handler->minor >> 5] = handler;
|
||||||
|
|
||||||
|
list_add_tail(&handler->node, &input_handler_list);
|
||||||
|
|
||||||
|
list_for_each_entry(dev, &input_dev_list, node)
|
||||||
|
if (!handler->blacklist || !input_match_device(handler->blacklist, dev))
|
||||||
|
if ((id = input_match_device(handler->id_table, dev)))
|
||||||
|
if ((handle = handler->connect(handler, dev, id)))
|
||||||
|
input_link_handle(handle);
|
||||||
|
|
||||||
|
input_wakeup_procfs_readers();
|
||||||
|
}
|
||||||
|
|
||||||
|
void input_unregister_handler(struct input_handler *handler)
|
||||||
|
{
|
||||||
|
struct list_head * node, * next;
|
||||||
|
|
||||||
|
list_for_each_safe(node, next, &handler->h_list) {
|
||||||
|
struct input_handle * handle = to_handle_h(node);
|
||||||
|
list_del_init(&handle->h_node);
|
||||||
|
list_del_init(&handle->d_node);
|
||||||
|
handler->disconnect(handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
list_del_init(&handler->node);
|
||||||
|
|
||||||
|
if (handler->fops != NULL)
|
||||||
|
input_table[handler->minor >> 5] = NULL;
|
||||||
|
|
||||||
|
input_wakeup_procfs_readers();
|
||||||
|
}
|
||||||
|
|
||||||
|
static int input_open_file(struct inode *inode, struct file *file)
|
||||||
|
{
|
||||||
|
struct input_handler *handler = input_table[iminor(inode) >> 5];
|
||||||
|
struct file_operations *old_fops, *new_fops = NULL;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
/* No load-on-demand here? */
|
||||||
|
if (!handler || !(new_fops = fops_get(handler->fops)))
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* That's _really_ odd. Usually NULL ->open means "nothing special",
|
||||||
|
* not "no device". Oh, well...
|
||||||
|
*/
|
||||||
|
if (!new_fops->open) {
|
||||||
|
fops_put(new_fops);
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
old_fops = file->f_op;
|
||||||
|
file->f_op = new_fops;
|
||||||
|
|
||||||
|
err = new_fops->open(inode, file);
|
||||||
|
|
||||||
|
if (err) {
|
||||||
|
fops_put(file->f_op);
|
||||||
|
file->f_op = fops_get(old_fops);
|
||||||
|
}
|
||||||
|
fops_put(old_fops);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct file_operations input_fops = {
|
||||||
|
.owner = THIS_MODULE,
|
||||||
|
.open = input_open_file,
|
||||||
|
};
|
||||||
|
|
||||||
struct class *input_class;
|
struct class *input_class;
|
||||||
|
|
||||||
static int __init input_init(void)
|
static int __init input_init(void)
|
||||||
{
|
{
|
||||||
int retval = -ENOMEM;
|
int err;
|
||||||
|
|
||||||
input_class = class_create(THIS_MODULE, "input");
|
input_class = class_create(THIS_MODULE, "input");
|
||||||
if (IS_ERR(input_class))
|
if (IS_ERR(input_class)) {
|
||||||
|
printk(KERN_ERR "input: unable to register input class\n");
|
||||||
return PTR_ERR(input_class);
|
return PTR_ERR(input_class);
|
||||||
input_proc_init();
|
|
||||||
retval = register_chrdev(INPUT_MAJOR, "input", &input_fops);
|
|
||||||
if (retval) {
|
|
||||||
printk(KERN_ERR "input: unable to register char major %d", INPUT_MAJOR);
|
|
||||||
remove_proc_entry("devices", proc_bus_input_dir);
|
|
||||||
remove_proc_entry("handlers", proc_bus_input_dir);
|
|
||||||
remove_proc_entry("input", proc_bus);
|
|
||||||
class_destroy(input_class);
|
|
||||||
return retval;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
retval = devfs_mk_dir("input");
|
err = input_proc_init();
|
||||||
if (retval) {
|
if (err)
|
||||||
remove_proc_entry("devices", proc_bus_input_dir);
|
goto fail1;
|
||||||
remove_proc_entry("handlers", proc_bus_input_dir);
|
|
||||||
remove_proc_entry("input", proc_bus);
|
err = register_chrdev(INPUT_MAJOR, "input", &input_fops);
|
||||||
unregister_chrdev(INPUT_MAJOR, "input");
|
if (err) {
|
||||||
class_destroy(input_class);
|
printk(KERN_ERR "input: unable to register char major %d", INPUT_MAJOR);
|
||||||
|
goto fail2;
|
||||||
}
|
}
|
||||||
return retval;
|
|
||||||
|
err = devfs_mk_dir("input");
|
||||||
|
if (err)
|
||||||
|
goto fail3;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
fail3: unregister_chrdev(INPUT_MAJOR, "input");
|
||||||
|
fail2: input_proc_exit();
|
||||||
|
fail1: class_destroy(input_class);
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __exit input_exit(void)
|
static void __exit input_exit(void)
|
||||||
{
|
{
|
||||||
remove_proc_entry("devices", proc_bus_input_dir);
|
input_proc_exit();
|
||||||
remove_proc_entry("handlers", proc_bus_input_dir);
|
|
||||||
remove_proc_entry("input", proc_bus);
|
|
||||||
|
|
||||||
devfs_remove("input");
|
devfs_remove("input");
|
||||||
unregister_chrdev(INPUT_MAJOR, "input");
|
unregister_chrdev(INPUT_MAJOR, "input");
|
||||||
class_destroy(input_class);
|
class_destroy(input_class);
|
||||||
|
@ -37,8 +37,6 @@ MODULE_LICENSE("GPL");
|
|||||||
#define JOYDEV_MINORS 16
|
#define JOYDEV_MINORS 16
|
||||||
#define JOYDEV_BUFFER_SIZE 64
|
#define JOYDEV_BUFFER_SIZE 64
|
||||||
|
|
||||||
#define MSECS(t) (1000 * ((t) / HZ) + 1000 * ((t) % HZ) / HZ)
|
|
||||||
|
|
||||||
struct joydev {
|
struct joydev {
|
||||||
int exist;
|
int exist;
|
||||||
int open;
|
int open;
|
||||||
@ -117,7 +115,7 @@ static void joydev_event(struct input_handle *handle, unsigned int type, unsigne
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
event.time = MSECS(jiffies);
|
event.time = jiffies_to_msecs(jiffies);
|
||||||
|
|
||||||
list_for_each_entry(list, &joydev->list, node) {
|
list_for_each_entry(list, &joydev->list, node) {
|
||||||
|
|
||||||
@ -245,7 +243,7 @@ static ssize_t joydev_read(struct file *file, char __user *buf, size_t count, lo
|
|||||||
|
|
||||||
struct js_event event;
|
struct js_event event;
|
||||||
|
|
||||||
event.time = MSECS(jiffies);
|
event.time = jiffies_to_msecs(jiffies);
|
||||||
|
|
||||||
if (list->startup < joydev->nkey) {
|
if (list->startup < joydev->nkey) {
|
||||||
event.type = JS_EVENT_BUTTON | JS_EVENT_INIT;
|
event.type = JS_EVENT_BUTTON | JS_EVENT_INIT;
|
||||||
|
@ -36,16 +36,6 @@
|
|||||||
#include <linux/miscdevice.h>
|
#include <linux/miscdevice.h>
|
||||||
#include <linux/uinput.h>
|
#include <linux/uinput.h>
|
||||||
|
|
||||||
static int uinput_dev_open(struct input_dev *dev)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void uinput_dev_close(struct input_dev *dev)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
static int uinput_dev_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
|
static int uinput_dev_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
|
||||||
{
|
{
|
||||||
struct uinput_device *udev;
|
struct uinput_device *udev;
|
||||||
@ -63,22 +53,24 @@ static int uinput_dev_event(struct input_dev *dev, unsigned int type, unsigned i
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int uinput_request_alloc_id(struct input_dev *dev, struct uinput_request *request)
|
static int uinput_request_alloc_id(struct uinput_device *udev, struct uinput_request *request)
|
||||||
{
|
{
|
||||||
/* Atomically allocate an ID for the given request. Returns 0 on success. */
|
/* Atomically allocate an ID for the given request. Returns 0 on success. */
|
||||||
struct uinput_device *udev = dev->private;
|
|
||||||
int id;
|
int id;
|
||||||
|
int err = -1;
|
||||||
|
|
||||||
down(&udev->requests_sem);
|
spin_lock(&udev->requests_lock);
|
||||||
for (id=0; id<UINPUT_NUM_REQUESTS; id++)
|
|
||||||
|
for (id = 0; id < UINPUT_NUM_REQUESTS; id++)
|
||||||
if (!udev->requests[id]) {
|
if (!udev->requests[id]) {
|
||||||
udev->requests[id] = request;
|
|
||||||
request->id = id;
|
request->id = id;
|
||||||
up(&udev->requests_sem);
|
udev->requests[id] = request;
|
||||||
return 0;
|
err = 0;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
up(&udev->requests_sem);
|
|
||||||
return -1;
|
spin_unlock(&udev->requests_lock);
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct uinput_request* uinput_request_find(struct uinput_device *udev, int id)
|
static struct uinput_request* uinput_request_find(struct uinput_device *udev, int id)
|
||||||
@ -86,70 +78,78 @@ static struct uinput_request* uinput_request_find(struct uinput_device *udev, in
|
|||||||
/* Find an input request, by ID. Returns NULL if the ID isn't valid. */
|
/* Find an input request, by ID. Returns NULL if the ID isn't valid. */
|
||||||
if (id >= UINPUT_NUM_REQUESTS || id < 0)
|
if (id >= UINPUT_NUM_REQUESTS || id < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
if (udev->requests[id]->completed)
|
|
||||||
return NULL;
|
|
||||||
return udev->requests[id];
|
return udev->requests[id];
|
||||||
}
|
}
|
||||||
|
|
||||||
static void uinput_request_init(struct input_dev *dev, struct uinput_request *request, int code)
|
static inline int uinput_request_reserve_slot(struct uinput_device *udev, struct uinput_request *request)
|
||||||
{
|
{
|
||||||
struct uinput_device *udev = dev->private;
|
/* Allocate slot. If none are available right away, wait. */
|
||||||
|
return wait_event_interruptible(udev->requests_waitq,
|
||||||
memset(request, 0, sizeof(struct uinput_request));
|
!uinput_request_alloc_id(udev, request));
|
||||||
request->code = code;
|
|
||||||
init_waitqueue_head(&request->waitq);
|
|
||||||
|
|
||||||
/* Allocate an ID. If none are available right away, wait. */
|
|
||||||
request->retval = wait_event_interruptible(udev->requests_waitq,
|
|
||||||
!uinput_request_alloc_id(dev, request));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void uinput_request_submit(struct input_dev *dev, struct uinput_request *request)
|
static void uinput_request_done(struct uinput_device *udev, struct uinput_request *request)
|
||||||
|
{
|
||||||
|
complete(&request->done);
|
||||||
|
|
||||||
|
/* Mark slot as available */
|
||||||
|
udev->requests[request->id] = NULL;
|
||||||
|
wake_up_interruptible(&udev->requests_waitq);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int uinput_request_submit(struct input_dev *dev, struct uinput_request *request)
|
||||||
{
|
{
|
||||||
struct uinput_device *udev = dev->private;
|
|
||||||
int retval;
|
int retval;
|
||||||
|
|
||||||
/* Tell our userspace app about this new request by queueing an input event */
|
/* Tell our userspace app about this new request by queueing an input event */
|
||||||
uinput_dev_event(dev, EV_UINPUT, request->code, request->id);
|
uinput_dev_event(dev, EV_UINPUT, request->code, request->id);
|
||||||
|
|
||||||
/* Wait for the request to complete */
|
/* Wait for the request to complete */
|
||||||
retval = wait_event_interruptible(request->waitq, request->completed);
|
retval = wait_for_completion_interruptible(&request->done);
|
||||||
if (retval)
|
if (!retval)
|
||||||
request->retval = retval;
|
retval = request->retval;
|
||||||
|
|
||||||
/* Release this request's ID, let others know it's available */
|
return retval;
|
||||||
udev->requests[request->id] = NULL;
|
|
||||||
wake_up_interruptible(&udev->requests_waitq);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int uinput_dev_upload_effect(struct input_dev *dev, struct ff_effect *effect)
|
static int uinput_dev_upload_effect(struct input_dev *dev, struct ff_effect *effect)
|
||||||
{
|
{
|
||||||
struct uinput_request request;
|
struct uinput_request request;
|
||||||
|
int retval;
|
||||||
|
|
||||||
if (!test_bit(EV_FF, dev->evbit))
|
if (!test_bit(EV_FF, dev->evbit))
|
||||||
return -ENOSYS;
|
return -ENOSYS;
|
||||||
|
|
||||||
uinput_request_init(dev, &request, UI_FF_UPLOAD);
|
request.id = -1;
|
||||||
if (request.retval)
|
init_completion(&request.done);
|
||||||
return request.retval;
|
request.code = UI_FF_UPLOAD;
|
||||||
request.u.effect = effect;
|
request.u.effect = effect;
|
||||||
uinput_request_submit(dev, &request);
|
|
||||||
return request.retval;
|
retval = uinput_request_reserve_slot(dev->private, &request);
|
||||||
|
if (!retval)
|
||||||
|
retval = uinput_request_submit(dev, &request);
|
||||||
|
|
||||||
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int uinput_dev_erase_effect(struct input_dev *dev, int effect_id)
|
static int uinput_dev_erase_effect(struct input_dev *dev, int effect_id)
|
||||||
{
|
{
|
||||||
struct uinput_request request;
|
struct uinput_request request;
|
||||||
|
int retval;
|
||||||
|
|
||||||
if (!test_bit(EV_FF, dev->evbit))
|
if (!test_bit(EV_FF, dev->evbit))
|
||||||
return -ENOSYS;
|
return -ENOSYS;
|
||||||
|
|
||||||
uinput_request_init(dev, &request, UI_FF_ERASE);
|
request.id = -1;
|
||||||
if (request.retval)
|
init_completion(&request.done);
|
||||||
return request.retval;
|
request.code = UI_FF_ERASE;
|
||||||
request.u.effect_id = effect_id;
|
request.u.effect_id = effect_id;
|
||||||
uinput_request_submit(dev, &request);
|
|
||||||
return request.retval;
|
retval = uinput_request_reserve_slot(dev->private, &request);
|
||||||
|
if (!retval)
|
||||||
|
retval = uinput_request_submit(dev, &request);
|
||||||
|
|
||||||
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int uinput_create_device(struct uinput_device *udev)
|
static int uinput_create_device(struct uinput_device *udev)
|
||||||
@ -159,32 +159,30 @@ static int uinput_create_device(struct uinput_device *udev)
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
udev->dev->open = uinput_dev_open;
|
|
||||||
udev->dev->close = uinput_dev_close;
|
|
||||||
udev->dev->event = uinput_dev_event;
|
udev->dev->event = uinput_dev_event;
|
||||||
udev->dev->upload_effect = uinput_dev_upload_effect;
|
udev->dev->upload_effect = uinput_dev_upload_effect;
|
||||||
udev->dev->erase_effect = uinput_dev_erase_effect;
|
udev->dev->erase_effect = uinput_dev_erase_effect;
|
||||||
udev->dev->private = udev;
|
udev->dev->private = udev;
|
||||||
|
|
||||||
init_waitqueue_head(&(udev->waitq));
|
init_waitqueue_head(&udev->waitq);
|
||||||
|
|
||||||
input_register_device(udev->dev);
|
input_register_device(udev->dev);
|
||||||
|
|
||||||
set_bit(UIST_CREATED, &(udev->state));
|
set_bit(UIST_CREATED, &udev->state);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int uinput_destroy_device(struct uinput_device *udev)
|
static int uinput_destroy_device(struct uinput_device *udev)
|
||||||
{
|
{
|
||||||
if (!test_bit(UIST_CREATED, &(udev->state))) {
|
if (!test_bit(UIST_CREATED, &udev->state)) {
|
||||||
printk(KERN_WARNING "%s: create the device first\n", UINPUT_NAME);
|
printk(KERN_WARNING "%s: create the device first\n", UINPUT_NAME);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
input_unregister_device(udev->dev);
|
input_unregister_device(udev->dev);
|
||||||
|
|
||||||
clear_bit(UIST_CREATED, &(udev->state));
|
clear_bit(UIST_CREATED, &udev->state);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -198,7 +196,7 @@ static int uinput_open(struct inode *inode, struct file *file)
|
|||||||
if (!newdev)
|
if (!newdev)
|
||||||
goto error;
|
goto error;
|
||||||
memset(newdev, 0, sizeof(struct uinput_device));
|
memset(newdev, 0, sizeof(struct uinput_device));
|
||||||
init_MUTEX(&newdev->requests_sem);
|
spin_lock_init(&newdev->requests_lock);
|
||||||
init_waitqueue_head(&newdev->requests_waitq);
|
init_waitqueue_head(&newdev->requests_waitq);
|
||||||
|
|
||||||
newinput = kmalloc(sizeof(struct input_dev), GFP_KERNEL);
|
newinput = kmalloc(sizeof(struct input_dev), GFP_KERNEL);
|
||||||
@ -253,15 +251,16 @@ static int uinput_alloc_device(struct file *file, const char __user *buffer, siz
|
|||||||
struct uinput_user_dev *user_dev;
|
struct uinput_user_dev *user_dev;
|
||||||
struct input_dev *dev;
|
struct input_dev *dev;
|
||||||
struct uinput_device *udev;
|
struct uinput_device *udev;
|
||||||
int size,
|
char *name;
|
||||||
retval;
|
int size;
|
||||||
|
int retval;
|
||||||
|
|
||||||
retval = count;
|
retval = count;
|
||||||
|
|
||||||
udev = file->private_data;
|
udev = file->private_data;
|
||||||
dev = udev->dev;
|
dev = udev->dev;
|
||||||
|
|
||||||
user_dev = kmalloc(sizeof(*user_dev), GFP_KERNEL);
|
user_dev = kmalloc(sizeof(struct uinput_user_dev), GFP_KERNEL);
|
||||||
if (!user_dev) {
|
if (!user_dev) {
|
||||||
retval = -ENOMEM;
|
retval = -ENOMEM;
|
||||||
goto exit;
|
goto exit;
|
||||||
@ -272,17 +271,17 @@ static int uinput_alloc_device(struct file *file, const char __user *buffer, siz
|
|||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (NULL != dev->name)
|
if (dev->name)
|
||||||
kfree(dev->name);
|
kfree(dev->name);
|
||||||
|
|
||||||
size = strnlen(user_dev->name, UINPUT_MAX_NAME_SIZE) + 1;
|
size = strnlen(user_dev->name, UINPUT_MAX_NAME_SIZE) + 1;
|
||||||
dev->name = kmalloc(size, GFP_KERNEL);
|
dev->name = name = kmalloc(size, GFP_KERNEL);
|
||||||
if (!dev->name) {
|
if (!name) {
|
||||||
retval = -ENOMEM;
|
retval = -ENOMEM;
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
strlcpy(name, user_dev->name, size);
|
||||||
|
|
||||||
strlcpy(dev->name, user_dev->name, size);
|
|
||||||
dev->id.bustype = user_dev->id.bustype;
|
dev->id.bustype = user_dev->id.bustype;
|
||||||
dev->id.vendor = user_dev->id.vendor;
|
dev->id.vendor = user_dev->id.vendor;
|
||||||
dev->id.product = user_dev->id.product;
|
dev->id.product = user_dev->id.product;
|
||||||
@ -314,14 +313,13 @@ static ssize_t uinput_write(struct file *file, const char __user *buffer, size_t
|
|||||||
{
|
{
|
||||||
struct uinput_device *udev = file->private_data;
|
struct uinput_device *udev = file->private_data;
|
||||||
|
|
||||||
if (test_bit(UIST_CREATED, &(udev->state))) {
|
if (test_bit(UIST_CREATED, &udev->state)) {
|
||||||
struct input_event ev;
|
struct input_event ev;
|
||||||
|
|
||||||
if (copy_from_user(&ev, buffer, sizeof(struct input_event)))
|
if (copy_from_user(&ev, buffer, sizeof(struct input_event)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
input_event(udev->dev, ev.type, ev.code, ev.value);
|
input_event(udev->dev, ev.type, ev.code, ev.value);
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
count = uinput_alloc_device(file, buffer, count);
|
count = uinput_alloc_device(file, buffer, count);
|
||||||
|
|
||||||
return count;
|
return count;
|
||||||
@ -332,26 +330,24 @@ static ssize_t uinput_read(struct file *file, char __user *buffer, size_t count,
|
|||||||
struct uinput_device *udev = file->private_data;
|
struct uinput_device *udev = file->private_data;
|
||||||
int retval = 0;
|
int retval = 0;
|
||||||
|
|
||||||
if (!test_bit(UIST_CREATED, &(udev->state)))
|
if (!test_bit(UIST_CREATED, &udev->state))
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
if ((udev->head == udev->tail) && (file->f_flags & O_NONBLOCK))
|
if (udev->head == udev->tail && (file->f_flags & O_NONBLOCK))
|
||||||
return -EAGAIN;
|
return -EAGAIN;
|
||||||
|
|
||||||
retval = wait_event_interruptible(udev->waitq,
|
retval = wait_event_interruptible(udev->waitq,
|
||||||
(udev->head != udev->tail) ||
|
udev->head != udev->tail || !test_bit(UIST_CREATED, &udev->state));
|
||||||
!test_bit(UIST_CREATED, &(udev->state)));
|
|
||||||
|
|
||||||
if (retval)
|
if (retval)
|
||||||
return retval;
|
return retval;
|
||||||
|
|
||||||
if (!test_bit(UIST_CREATED, &(udev->state)))
|
if (!test_bit(UIST_CREATED, &udev->state))
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
while ((udev->head != udev->tail) &&
|
while ((udev->head != udev->tail) &&
|
||||||
(retval + sizeof(struct input_event) <= count)) {
|
(retval + sizeof(struct input_event) <= count)) {
|
||||||
if (copy_to_user(buffer + retval, &(udev->buff[udev->tail]),
|
if (copy_to_user(buffer + retval, &udev->buff[udev->tail], sizeof(struct input_event)))
|
||||||
sizeof(struct input_event))) return -EFAULT;
|
return -EFAULT;
|
||||||
udev->tail = (udev->tail + 1) % UINPUT_BUFFER_SIZE;
|
udev->tail = (udev->tail + 1) % UINPUT_BUFFER_SIZE;
|
||||||
retval += sizeof(struct input_event);
|
retval += sizeof(struct input_event);
|
||||||
}
|
}
|
||||||
@ -373,12 +369,12 @@ static unsigned int uinput_poll(struct file *file, poll_table *wait)
|
|||||||
|
|
||||||
static int uinput_burn_device(struct uinput_device *udev)
|
static int uinput_burn_device(struct uinput_device *udev)
|
||||||
{
|
{
|
||||||
if (test_bit(UIST_CREATED, &(udev->state)))
|
if (test_bit(UIST_CREATED, &udev->state))
|
||||||
uinput_destroy_device(udev);
|
uinput_destroy_device(udev);
|
||||||
|
|
||||||
if (NULL != udev->dev->name)
|
if (udev->dev->name)
|
||||||
kfree(udev->dev->name);
|
kfree(udev->dev->name);
|
||||||
if (NULL != udev->dev->phys)
|
if (udev->dev->phys)
|
||||||
kfree(udev->dev->phys);
|
kfree(udev->dev->phys);
|
||||||
|
|
||||||
kfree(udev->dev);
|
kfree(udev->dev);
|
||||||
@ -389,7 +385,8 @@ static int uinput_burn_device(struct uinput_device *udev)
|
|||||||
|
|
||||||
static int uinput_close(struct inode *inode, struct file *file)
|
static int uinput_close(struct inode *inode, struct file *file)
|
||||||
{
|
{
|
||||||
return uinput_burn_device(file->private_data);
|
uinput_burn_device(file->private_data);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int uinput_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
|
static int uinput_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
|
||||||
@ -401,6 +398,7 @@ static int uinput_ioctl(struct inode *inode, struct file *file, unsigned int cmd
|
|||||||
struct uinput_ff_erase ff_erase;
|
struct uinput_ff_erase ff_erase;
|
||||||
struct uinput_request *req;
|
struct uinput_request *req;
|
||||||
int length;
|
int length;
|
||||||
|
char *phys;
|
||||||
|
|
||||||
udev = file->private_data;
|
udev = file->private_data;
|
||||||
|
|
||||||
@ -415,7 +413,7 @@ static int uinput_ioctl(struct inode *inode, struct file *file, unsigned int cmd
|
|||||||
case UI_SET_SNDBIT:
|
case UI_SET_SNDBIT:
|
||||||
case UI_SET_FFBIT:
|
case UI_SET_FFBIT:
|
||||||
case UI_SET_PHYS:
|
case UI_SET_PHYS:
|
||||||
if (test_bit(UIST_CREATED, &(udev->state)))
|
if (test_bit(UIST_CREATED, &udev->state))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -498,20 +496,19 @@ static int uinput_ioctl(struct inode *inode, struct file *file, unsigned int cmd
|
|||||||
retval = -EFAULT;
|
retval = -EFAULT;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (NULL != udev->dev->phys)
|
kfree(udev->dev->phys);
|
||||||
kfree(udev->dev->phys);
|
udev->dev->phys = phys = kmalloc(length, GFP_KERNEL);
|
||||||
udev->dev->phys = kmalloc(length, GFP_KERNEL);
|
if (!phys) {
|
||||||
if (!udev->dev->phys) {
|
|
||||||
retval = -ENOMEM;
|
retval = -ENOMEM;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (copy_from_user(udev->dev->phys, p, length)) {
|
if (copy_from_user(phys, p, length)) {
|
||||||
retval = -EFAULT;
|
|
||||||
kfree(udev->dev->phys);
|
|
||||||
udev->dev->phys = NULL;
|
udev->dev->phys = NULL;
|
||||||
|
kfree(phys);
|
||||||
|
retval = -EFAULT;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
udev->dev->phys[length-1] = '\0';
|
phys[length - 1] = '\0';
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case UI_BEGIN_FF_UPLOAD:
|
case UI_BEGIN_FF_UPLOAD:
|
||||||
@ -520,7 +517,7 @@ static int uinput_ioctl(struct inode *inode, struct file *file, unsigned int cmd
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
req = uinput_request_find(udev, ff_up.request_id);
|
req = uinput_request_find(udev, ff_up.request_id);
|
||||||
if (!(req && req->code==UI_FF_UPLOAD && req->u.effect)) {
|
if (!(req && req->code == UI_FF_UPLOAD && req->u.effect)) {
|
||||||
retval = -EINVAL;
|
retval = -EINVAL;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -538,7 +535,7 @@ static int uinput_ioctl(struct inode *inode, struct file *file, unsigned int cmd
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
req = uinput_request_find(udev, ff_erase.request_id);
|
req = uinput_request_find(udev, ff_erase.request_id);
|
||||||
if (!(req && req->code==UI_FF_ERASE)) {
|
if (!(req && req->code == UI_FF_ERASE)) {
|
||||||
retval = -EINVAL;
|
retval = -EINVAL;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -556,14 +553,13 @@ static int uinput_ioctl(struct inode *inode, struct file *file, unsigned int cmd
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
req = uinput_request_find(udev, ff_up.request_id);
|
req = uinput_request_find(udev, ff_up.request_id);
|
||||||
if (!(req && req->code==UI_FF_UPLOAD && req->u.effect)) {
|
if (!(req && req->code == UI_FF_UPLOAD && req->u.effect)) {
|
||||||
retval = -EINVAL;
|
retval = -EINVAL;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
req->retval = ff_up.retval;
|
req->retval = ff_up.retval;
|
||||||
memcpy(req->u.effect, &ff_up.effect, sizeof(struct ff_effect));
|
memcpy(req->u.effect, &ff_up.effect, sizeof(struct ff_effect));
|
||||||
req->completed = 1;
|
uinput_request_done(udev, req);
|
||||||
wake_up_interruptible(&req->waitq);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case UI_END_FF_ERASE:
|
case UI_END_FF_ERASE:
|
||||||
@ -572,13 +568,12 @@ static int uinput_ioctl(struct inode *inode, struct file *file, unsigned int cmd
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
req = uinput_request_find(udev, ff_erase.request_id);
|
req = uinput_request_find(udev, ff_erase.request_id);
|
||||||
if (!(req && req->code==UI_FF_ERASE)) {
|
if (!(req && req->code == UI_FF_ERASE)) {
|
||||||
retval = -EINVAL;
|
retval = -EINVAL;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
req->retval = ff_erase.retval;
|
req->retval = ff_erase.retval;
|
||||||
req->completed = 1;
|
uinput_request_done(udev, req);
|
||||||
wake_up_interruptible(&req->waitq);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
* ALPS touchpad PS/2 mouse driver
|
* ALPS touchpad PS/2 mouse driver
|
||||||
*
|
*
|
||||||
* Copyright (c) 2003 Neil Brown <neilb@cse.unsw.edu.au>
|
* Copyright (c) 2003 Neil Brown <neilb@cse.unsw.edu.au>
|
||||||
* Copyright (c) 2003 Peter Osterlund <petero2@telia.com>
|
* Copyright (c) 2003-2005 Peter Osterlund <petero2@telia.com>
|
||||||
* Copyright (c) 2004 Dmitry Torokhov <dtor@mail.ru>
|
* Copyright (c) 2004 Dmitry Torokhov <dtor@mail.ru>
|
||||||
* Copyright (c) 2005 Vojtech Pavlik <vojtech@suse.cz>
|
* Copyright (c) 2005 Vojtech Pavlik <vojtech@suse.cz>
|
||||||
*
|
*
|
||||||
@ -350,7 +350,6 @@ static int alps_tap_mode(struct psmouse *psmouse, int enable)
|
|||||||
static int alps_reconnect(struct psmouse *psmouse)
|
static int alps_reconnect(struct psmouse *psmouse)
|
||||||
{
|
{
|
||||||
struct alps_data *priv = psmouse->private;
|
struct alps_data *priv = psmouse->private;
|
||||||
unsigned char param[4];
|
|
||||||
int version;
|
int version;
|
||||||
|
|
||||||
psmouse_reset(psmouse);
|
psmouse_reset(psmouse);
|
||||||
@ -358,21 +357,20 @@ static int alps_reconnect(struct psmouse *psmouse)
|
|||||||
if (!(priv->i = alps_get_model(psmouse, &version)))
|
if (!(priv->i = alps_get_model(psmouse, &version)))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (priv->i->flags & ALPS_PASS && alps_passthrough_mode(psmouse, 1))
|
if ((priv->i->flags & ALPS_PASS) && alps_passthrough_mode(psmouse, 1))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (alps_get_status(psmouse, param))
|
if (alps_tap_mode(psmouse, 1)) {
|
||||||
return -1;
|
printk(KERN_WARNING "alps.c: Failed to reenable hardware tapping\n");
|
||||||
|
|
||||||
if (!(param[0] & 0x04))
|
|
||||||
alps_tap_mode(psmouse, 1);
|
|
||||||
|
|
||||||
if (alps_absolute_mode(psmouse)) {
|
|
||||||
printk(KERN_ERR "alps.c: Failed to enable absolute mode\n");
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (priv->i->flags == ALPS_PASS && alps_passthrough_mode(psmouse, 0))
|
if (alps_absolute_mode(psmouse)) {
|
||||||
|
printk(KERN_ERR "alps.c: Failed to reenable absolute mode\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((priv->i->flags & ALPS_PASS) && alps_passthrough_mode(psmouse, 0))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -389,7 +387,6 @@ static void alps_disconnect(struct psmouse *psmouse)
|
|||||||
int alps_init(struct psmouse *psmouse)
|
int alps_init(struct psmouse *psmouse)
|
||||||
{
|
{
|
||||||
struct alps_data *priv;
|
struct alps_data *priv;
|
||||||
unsigned char param[4];
|
|
||||||
int version;
|
int version;
|
||||||
|
|
||||||
psmouse->private = priv = kmalloc(sizeof(struct alps_data), GFP_KERNEL);
|
psmouse->private = priv = kmalloc(sizeof(struct alps_data), GFP_KERNEL);
|
||||||
@ -403,16 +400,8 @@ int alps_init(struct psmouse *psmouse)
|
|||||||
if ((priv->i->flags & ALPS_PASS) && alps_passthrough_mode(psmouse, 1))
|
if ((priv->i->flags & ALPS_PASS) && alps_passthrough_mode(psmouse, 1))
|
||||||
goto init_fail;
|
goto init_fail;
|
||||||
|
|
||||||
if (alps_get_status(psmouse, param)) {
|
if (alps_tap_mode(psmouse, 1))
|
||||||
printk(KERN_ERR "alps.c: touchpad status report request failed\n");
|
printk(KERN_WARNING "alps.c: Failed to enable hardware tapping\n");
|
||||||
goto init_fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (param[0] & 0x04) {
|
|
||||||
printk(KERN_INFO "alps.c: Enabling hardware tapping\n");
|
|
||||||
if (alps_tap_mode(psmouse, 1))
|
|
||||||
printk(KERN_WARNING "alps.c: Failed to enable hardware tapping\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (alps_absolute_mode(psmouse)) {
|
if (alps_absolute_mode(psmouse)) {
|
||||||
printk(KERN_ERR "alps.c: Failed to enable absolute mode\n");
|
printk(KERN_ERR "alps.c: Failed to enable absolute mode\n");
|
||||||
|
@ -385,8 +385,6 @@ int ps2pp_init(struct psmouse *psmouse, int set_properties)
|
|||||||
|
|
||||||
if (buttons < 3)
|
if (buttons < 3)
|
||||||
clear_bit(BTN_MIDDLE, psmouse->dev.keybit);
|
clear_bit(BTN_MIDDLE, psmouse->dev.keybit);
|
||||||
if (buttons < 2)
|
|
||||||
clear_bit(BTN_RIGHT, psmouse->dev.keybit);
|
|
||||||
|
|
||||||
if (model_info)
|
if (model_info)
|
||||||
ps2pp_set_model_properties(psmouse, model_info, use_ps2pp);
|
ps2pp_set_model_properties(psmouse, model_info, use_ps2pp);
|
||||||
|
@ -344,6 +344,7 @@ static int intellimouse_detect(struct psmouse *psmouse, int set_properties)
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (set_properties) {
|
if (set_properties) {
|
||||||
|
set_bit(BTN_MIDDLE, psmouse->dev.keybit);
|
||||||
set_bit(REL_WHEEL, psmouse->dev.relbit);
|
set_bit(REL_WHEEL, psmouse->dev.relbit);
|
||||||
|
|
||||||
if (!psmouse->vendor) psmouse->vendor = "Generic";
|
if (!psmouse->vendor) psmouse->vendor = "Generic";
|
||||||
@ -376,6 +377,7 @@ static int im_explorer_detect(struct psmouse *psmouse, int set_properties)
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (set_properties) {
|
if (set_properties) {
|
||||||
|
set_bit(BTN_MIDDLE, psmouse->dev.keybit);
|
||||||
set_bit(REL_WHEEL, psmouse->dev.relbit);
|
set_bit(REL_WHEEL, psmouse->dev.relbit);
|
||||||
set_bit(BTN_SIDE, psmouse->dev.keybit);
|
set_bit(BTN_SIDE, psmouse->dev.keybit);
|
||||||
set_bit(BTN_EXTRA, psmouse->dev.keybit);
|
set_bit(BTN_EXTRA, psmouse->dev.keybit);
|
||||||
|
@ -219,7 +219,7 @@ static void synaptics_pass_pt_packet(struct serio *ptport, unsigned char *packet
|
|||||||
serio_interrupt(ptport, packet[1], 0, NULL);
|
serio_interrupt(ptport, packet[1], 0, NULL);
|
||||||
serio_interrupt(ptport, packet[4], 0, NULL);
|
serio_interrupt(ptport, packet[4], 0, NULL);
|
||||||
serio_interrupt(ptport, packet[5], 0, NULL);
|
serio_interrupt(ptport, packet[5], 0, NULL);
|
||||||
if (child->type >= PSMOUSE_GENPS)
|
if (child->pktsize == 4)
|
||||||
serio_interrupt(ptport, packet[2], 0, NULL);
|
serio_interrupt(ptport, packet[2], 0, NULL);
|
||||||
} else
|
} else
|
||||||
serio_interrupt(ptport, packet[1], 0, NULL);
|
serio_interrupt(ptport, packet[1], 0, NULL);
|
||||||
@ -233,7 +233,7 @@ static void synaptics_pt_activate(struct psmouse *psmouse)
|
|||||||
|
|
||||||
/* adjust the touchpad to child's choice of protocol */
|
/* adjust the touchpad to child's choice of protocol */
|
||||||
if (child) {
|
if (child) {
|
||||||
if (child->type >= PSMOUSE_GENPS)
|
if (child->pktsize == 4)
|
||||||
priv->mode |= SYN_BIT_FOUR_BYTE_CLIENT;
|
priv->mode |= SYN_BIT_FOUR_BYTE_CLIENT;
|
||||||
else
|
else
|
||||||
priv->mode &= ~SYN_BIT_FOUR_BYTE_CLIENT;
|
priv->mode &= ~SYN_BIT_FOUR_BYTE_CLIENT;
|
||||||
@ -608,6 +608,13 @@ static struct dmi_system_id toshiba_dmi_table[] = {
|
|||||||
DMI_MATCH(DMI_PRODUCT_NAME , "Satellite"),
|
DMI_MATCH(DMI_PRODUCT_NAME , "Satellite"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.ident = "Toshiba Dynabook",
|
||||||
|
.matches = {
|
||||||
|
DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
|
||||||
|
DMI_MATCH(DMI_PRODUCT_NAME , "dynabook"),
|
||||||
|
},
|
||||||
|
},
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
@ -656,7 +663,8 @@ int synaptics_init(struct psmouse *psmouse)
|
|||||||
* thye same as rate of standard PS/2 mouse.
|
* thye same as rate of standard PS/2 mouse.
|
||||||
*/
|
*/
|
||||||
if (psmouse->rate >= 80 && dmi_check_system(toshiba_dmi_table)) {
|
if (psmouse->rate >= 80 && dmi_check_system(toshiba_dmi_table)) {
|
||||||
printk(KERN_INFO "synaptics: Toshiba Satellite detected, limiting rate to 40pps.\n");
|
printk(KERN_INFO "synaptics: Toshiba %s detected, limiting rate to 40pps.\n",
|
||||||
|
dmi_get_system_info(DMI_PRODUCT_NAME));
|
||||||
psmouse->rate = 40;
|
psmouse->rate = 40;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -175,7 +175,7 @@ config SERIO_RAW
|
|||||||
allocating minor 1 (that historically corresponds to /dev/psaux)
|
allocating minor 1 (that historically corresponds to /dev/psaux)
|
||||||
first. To bind this driver to a serio port use sysfs interface:
|
first. To bind this driver to a serio port use sysfs interface:
|
||||||
|
|
||||||
echo -n "serio_raw" > /sys/bus/serio/devices/serioX/driver
|
echo -n "serio_raw" > /sys/bus/serio/devices/serioX/drvctl
|
||||||
|
|
||||||
To compile this driver as a module, choose M here: the
|
To compile this driver as a module, choose M here: the
|
||||||
module will be called serio_raw.
|
module will be called serio_raw.
|
||||||
|
@ -130,6 +130,13 @@ static struct dmi_system_id __initdata i8042_dmi_nomux_table[] = {
|
|||||||
DMI_MATCH(DMI_PRODUCT_NAME, "FMVLT70H"),
|
DMI_MATCH(DMI_PRODUCT_NAME, "FMVLT70H"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.ident = "Fujitsu-Siemens Lifebook T3010",
|
||||||
|
.matches = {
|
||||||
|
DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
|
||||||
|
DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK T3010"),
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
.ident = "Toshiba P10",
|
.ident = "Toshiba P10",
|
||||||
.matches = {
|
.matches = {
|
||||||
@ -137,6 +144,13 @@ static struct dmi_system_id __initdata i8042_dmi_nomux_table[] = {
|
|||||||
DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P10"),
|
DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P10"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.ident = "Alienware Sentia",
|
||||||
|
.matches = {
|
||||||
|
DMI_MATCH(DMI_SYS_VENDOR, "ALIENWARE"),
|
||||||
|
DMI_MATCH(DMI_PRODUCT_NAME, "Sentia"),
|
||||||
|
},
|
||||||
|
},
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -100,7 +100,7 @@ struct i8042_port {
|
|||||||
static struct i8042_port i8042_ports[I8042_NUM_PORTS] = {
|
static struct i8042_port i8042_ports[I8042_NUM_PORTS] = {
|
||||||
{
|
{
|
||||||
.disable = I8042_CTR_KBDDIS,
|
.disable = I8042_CTR_KBDDIS,
|
||||||
.irqen = I8042_CTR_KBDINT,
|
.irqen = I8042_CTR_KBDINT,
|
||||||
.mux = -1,
|
.mux = -1,
|
||||||
.name = "KBD",
|
.name = "KBD",
|
||||||
},
|
},
|
||||||
@ -191,41 +191,45 @@ static int i8042_flush(void)
|
|||||||
static int i8042_command(unsigned char *param, int command)
|
static int i8042_command(unsigned char *param, int command)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
int retval = 0, i = 0;
|
int i, retval, auxerr = 0;
|
||||||
|
|
||||||
if (i8042_noloop && command == I8042_CMD_AUX_LOOP)
|
if (i8042_noloop && command == I8042_CMD_AUX_LOOP)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
spin_lock_irqsave(&i8042_lock, flags);
|
spin_lock_irqsave(&i8042_lock, flags);
|
||||||
|
|
||||||
retval = i8042_wait_write();
|
if ((retval = i8042_wait_write()))
|
||||||
if (!retval) {
|
goto out;
|
||||||
dbg("%02x -> i8042 (command)", command & 0xff);
|
|
||||||
i8042_write_command(command & 0xff);
|
dbg("%02x -> i8042 (command)", command & 0xff);
|
||||||
|
i8042_write_command(command & 0xff);
|
||||||
|
|
||||||
|
for (i = 0; i < ((command >> 12) & 0xf); i++) {
|
||||||
|
if ((retval = i8042_wait_write()))
|
||||||
|
goto out;
|
||||||
|
dbg("%02x -> i8042 (parameter)", param[i]);
|
||||||
|
i8042_write_data(param[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!retval)
|
for (i = 0; i < ((command >> 8) & 0xf); i++) {
|
||||||
for (i = 0; i < ((command >> 12) & 0xf); i++) {
|
if ((retval = i8042_wait_read()))
|
||||||
if ((retval = i8042_wait_write())) break;
|
goto out;
|
||||||
dbg("%02x -> i8042 (parameter)", param[i]);
|
|
||||||
i8042_write_data(param[i]);
|
if (command == I8042_CMD_AUX_LOOP &&
|
||||||
|
!(i8042_read_status() & I8042_STR_AUXDATA)) {
|
||||||
|
retval = auxerr = -1;
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!retval)
|
param[i] = i8042_read_data();
|
||||||
for (i = 0; i < ((command >> 8) & 0xf); i++) {
|
dbg("%02x <- i8042 (return)", param[i]);
|
||||||
if ((retval = i8042_wait_read())) break;
|
}
|
||||||
if (i8042_read_status() & I8042_STR_AUXDATA)
|
|
||||||
param[i] = ~i8042_read_data();
|
|
||||||
else
|
|
||||||
param[i] = i8042_read_data();
|
|
||||||
dbg("%02x <- i8042 (return)", param[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
spin_unlock_irqrestore(&i8042_lock, flags);
|
|
||||||
|
|
||||||
if (retval)
|
if (retval)
|
||||||
dbg(" -- i8042 (timeout)");
|
dbg(" -- i8042 (%s)", auxerr ? "auxerr" : "timeout");
|
||||||
|
|
||||||
|
out:
|
||||||
|
spin_unlock_irqrestore(&i8042_lock, flags);
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -507,17 +511,17 @@ static int i8042_set_mux_mode(unsigned int mode, unsigned char *mux_version)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
param = 0xf0;
|
param = 0xf0;
|
||||||
if (i8042_command(¶m, I8042_CMD_AUX_LOOP) || param != 0x0f)
|
if (i8042_command(¶m, I8042_CMD_AUX_LOOP) || param != 0xf0)
|
||||||
return -1;
|
return -1;
|
||||||
param = mode ? 0x56 : 0xf6;
|
param = mode ? 0x56 : 0xf6;
|
||||||
if (i8042_command(¶m, I8042_CMD_AUX_LOOP) || param != (mode ? 0xa9 : 0x09))
|
if (i8042_command(¶m, I8042_CMD_AUX_LOOP) || param != (mode ? 0x56 : 0xf6))
|
||||||
return -1;
|
return -1;
|
||||||
param = mode ? 0xa4 : 0xa5;
|
param = mode ? 0xa4 : 0xa5;
|
||||||
if (i8042_command(¶m, I8042_CMD_AUX_LOOP) || param == (mode ? 0x5b : 0x5a))
|
if (i8042_command(¶m, I8042_CMD_AUX_LOOP) || param == (mode ? 0xa4 : 0xa5))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (mux_version)
|
if (mux_version)
|
||||||
*mux_version = ~param;
|
*mux_version = param;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -619,7 +623,7 @@ static int __init i8042_check_aux(void)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
param = 0x5a;
|
param = 0x5a;
|
||||||
if (i8042_command(¶m, I8042_CMD_AUX_LOOP) || param != 0xa5) {
|
if (i8042_command(¶m, I8042_CMD_AUX_LOOP) || param != 0x5a) {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* External connection test - filters out AT-soldered PS/2 i8042's
|
* External connection test - filters out AT-soldered PS/2 i8042's
|
||||||
@ -630,7 +634,7 @@ static int __init i8042_check_aux(void)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
if (i8042_command(¶m, I8042_CMD_AUX_TEST)
|
if (i8042_command(¶m, I8042_CMD_AUX_TEST)
|
||||||
|| (param && param != 0xfa && param != 0xff))
|
|| (param && param != 0xfa && param != 0xff))
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -389,6 +389,14 @@ static ssize_t serio_show_description(struct device *dev, struct device_attribut
|
|||||||
return sprintf(buf, "%s\n", serio->name);
|
return sprintf(buf, "%s\n", serio->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static ssize_t serio_show_modalias(struct device *dev, struct device_attribute *attr, char *buf)
|
||||||
|
{
|
||||||
|
struct serio *serio = to_serio_port(dev);
|
||||||
|
|
||||||
|
return sprintf(buf, "serio:ty%02Xpr%02Xid%02Xex%02X\n",
|
||||||
|
serio->id.type, serio->id.proto, serio->id.id, serio->id.extra);
|
||||||
|
}
|
||||||
|
|
||||||
static ssize_t serio_show_id_type(struct device *dev, struct device_attribute *attr, char *buf)
|
static ssize_t serio_show_id_type(struct device *dev, struct device_attribute *attr, char *buf)
|
||||||
{
|
{
|
||||||
struct serio *serio = to_serio_port(dev);
|
struct serio *serio = to_serio_port(dev);
|
||||||
@ -487,6 +495,7 @@ static ssize_t serio_set_bind_mode(struct device *dev, struct device_attribute *
|
|||||||
|
|
||||||
static struct device_attribute serio_device_attrs[] = {
|
static struct device_attribute serio_device_attrs[] = {
|
||||||
__ATTR(description, S_IRUGO, serio_show_description, NULL),
|
__ATTR(description, S_IRUGO, serio_show_description, NULL),
|
||||||
|
__ATTR(modalias, S_IRUGO, serio_show_modalias, NULL),
|
||||||
__ATTR(drvctl, S_IWUSR, NULL, serio_rebind_driver),
|
__ATTR(drvctl, S_IWUSR, NULL, serio_rebind_driver),
|
||||||
__ATTR(bind_mode, S_IWUSR | S_IRUGO, serio_show_bind_mode, serio_set_bind_mode),
|
__ATTR(bind_mode, S_IWUSR | S_IRUGO, serio_show_bind_mode, serio_set_bind_mode),
|
||||||
__ATTR_NULL
|
__ATTR_NULL
|
||||||
@ -785,36 +794,37 @@ static int serio_bus_match(struct device *dev, struct device_driver *drv)
|
|||||||
|
|
||||||
#ifdef CONFIG_HOTPLUG
|
#ifdef CONFIG_HOTPLUG
|
||||||
|
|
||||||
#define PUT_ENVP(fmt, val) \
|
#define SERIO_ADD_HOTPLUG_VAR(fmt, val...) \
|
||||||
do { \
|
do { \
|
||||||
envp[i++] = buffer; \
|
int err = add_hotplug_env_var(envp, num_envp, &i, \
|
||||||
length += snprintf(buffer, buffer_size - length, fmt, val); \
|
buffer, buffer_size, &len, \
|
||||||
if (buffer_size - length <= 0 || i >= num_envp) \
|
fmt, val); \
|
||||||
return -ENOMEM; \
|
if (err) \
|
||||||
length++; \
|
return err; \
|
||||||
buffer += length; \
|
} while (0)
|
||||||
} while (0)
|
|
||||||
static int serio_hotplug(struct device *dev, char **envp, int num_envp, char *buffer, int buffer_size)
|
static int serio_hotplug(struct device *dev, char **envp, int num_envp, char *buffer, int buffer_size)
|
||||||
{
|
{
|
||||||
struct serio *serio;
|
struct serio *serio;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
int length = 0;
|
int len = 0;
|
||||||
|
|
||||||
if (!dev)
|
if (!dev)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
serio = to_serio_port(dev);
|
serio = to_serio_port(dev);
|
||||||
|
|
||||||
PUT_ENVP("SERIO_TYPE=%02x", serio->id.type);
|
SERIO_ADD_HOTPLUG_VAR("SERIO_TYPE=%02x", serio->id.type);
|
||||||
PUT_ENVP("SERIO_PROTO=%02x", serio->id.proto);
|
SERIO_ADD_HOTPLUG_VAR("SERIO_PROTO=%02x", serio->id.proto);
|
||||||
PUT_ENVP("SERIO_ID=%02x", serio->id.id);
|
SERIO_ADD_HOTPLUG_VAR("SERIO_ID=%02x", serio->id.id);
|
||||||
PUT_ENVP("SERIO_EXTRA=%02x", serio->id.extra);
|
SERIO_ADD_HOTPLUG_VAR("SERIO_EXTRA=%02x", serio->id.extra);
|
||||||
|
SERIO_ADD_HOTPLUG_VAR("MODALIAS=serio:ty%02Xpr%02Xid%02Xex%02X",
|
||||||
|
serio->id.type, serio->id.proto, serio->id.id, serio->id.extra);
|
||||||
envp[i] = NULL;
|
envp[i] = NULL;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#undef PUT_ENVP
|
#undef SERIO_ADD_HOTPLUG_VAR
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
|
@ -299,6 +299,7 @@ static int serio_raw_connect(struct serio *serio, struct serio_driver *drv)
|
|||||||
|
|
||||||
serio_raw->dev.minor = PSMOUSE_MINOR;
|
serio_raw->dev.minor = PSMOUSE_MINOR;
|
||||||
serio_raw->dev.name = serio_raw->name;
|
serio_raw->dev.name = serio_raw->name;
|
||||||
|
serio_raw->dev.dev = &serio->dev;
|
||||||
serio_raw->dev.fops = &serio_raw_fops;
|
serio_raw->dev.fops = &serio_raw_fops;
|
||||||
|
|
||||||
err = misc_register(&serio_raw->dev);
|
err = misc_register(&serio_raw->dev);
|
||||||
|
@ -58,7 +58,7 @@ config TOUCHSCREEN_ELO
|
|||||||
If unsure, say N.
|
If unsure, say N.
|
||||||
|
|
||||||
To compile this driver as a module, choose M here: the
|
To compile this driver as a module, choose M here: the
|
||||||
module will be called gunze.
|
module will be called elo.
|
||||||
|
|
||||||
config TOUCHSCREEN_MTOUCH
|
config TOUCHSCREEN_MTOUCH
|
||||||
tristate "MicroTouch serial touchscreens"
|
tristate "MicroTouch serial touchscreens"
|
||||||
|
@ -869,11 +869,17 @@ static void suspend_targets(struct dm_table *t, unsigned postsuspend)
|
|||||||
|
|
||||||
void dm_table_presuspend_targets(struct dm_table *t)
|
void dm_table_presuspend_targets(struct dm_table *t)
|
||||||
{
|
{
|
||||||
|
if (!t)
|
||||||
|
return;
|
||||||
|
|
||||||
return suspend_targets(t, 0);
|
return suspend_targets(t, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void dm_table_postsuspend_targets(struct dm_table *t)
|
void dm_table_postsuspend_targets(struct dm_table *t)
|
||||||
{
|
{
|
||||||
|
if (!t)
|
||||||
|
return;
|
||||||
|
|
||||||
return suspend_targets(t, 1);
|
return suspend_targets(t, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
198
drivers/md/dm.c
198
drivers/md/dm.c
@ -55,10 +55,10 @@ union map_info *dm_get_mapinfo(struct bio *bio)
|
|||||||
*/
|
*/
|
||||||
#define DMF_BLOCK_IO 0
|
#define DMF_BLOCK_IO 0
|
||||||
#define DMF_SUSPENDED 1
|
#define DMF_SUSPENDED 1
|
||||||
#define DMF_FS_LOCKED 2
|
|
||||||
|
|
||||||
struct mapped_device {
|
struct mapped_device {
|
||||||
struct rw_semaphore lock;
|
struct rw_semaphore io_lock;
|
||||||
|
struct semaphore suspend_lock;
|
||||||
rwlock_t map_lock;
|
rwlock_t map_lock;
|
||||||
atomic_t holders;
|
atomic_t holders;
|
||||||
|
|
||||||
@ -248,16 +248,16 @@ static inline void free_tio(struct mapped_device *md, struct target_io *tio)
|
|||||||
*/
|
*/
|
||||||
static int queue_io(struct mapped_device *md, struct bio *bio)
|
static int queue_io(struct mapped_device *md, struct bio *bio)
|
||||||
{
|
{
|
||||||
down_write(&md->lock);
|
down_write(&md->io_lock);
|
||||||
|
|
||||||
if (!test_bit(DMF_BLOCK_IO, &md->flags)) {
|
if (!test_bit(DMF_BLOCK_IO, &md->flags)) {
|
||||||
up_write(&md->lock);
|
up_write(&md->io_lock);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
bio_list_add(&md->deferred, bio);
|
bio_list_add(&md->deferred, bio);
|
||||||
|
|
||||||
up_write(&md->lock);
|
up_write(&md->io_lock);
|
||||||
return 0; /* deferred successfully */
|
return 0; /* deferred successfully */
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -568,14 +568,14 @@ static int dm_request(request_queue_t *q, struct bio *bio)
|
|||||||
int r;
|
int r;
|
||||||
struct mapped_device *md = q->queuedata;
|
struct mapped_device *md = q->queuedata;
|
||||||
|
|
||||||
down_read(&md->lock);
|
down_read(&md->io_lock);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If we're suspended we have to queue
|
* If we're suspended we have to queue
|
||||||
* this io for later.
|
* this io for later.
|
||||||
*/
|
*/
|
||||||
while (test_bit(DMF_BLOCK_IO, &md->flags)) {
|
while (test_bit(DMF_BLOCK_IO, &md->flags)) {
|
||||||
up_read(&md->lock);
|
up_read(&md->io_lock);
|
||||||
|
|
||||||
if (bio_rw(bio) == READA) {
|
if (bio_rw(bio) == READA) {
|
||||||
bio_io_error(bio, bio->bi_size);
|
bio_io_error(bio, bio->bi_size);
|
||||||
@ -594,11 +594,11 @@ static int dm_request(request_queue_t *q, struct bio *bio)
|
|||||||
* We're in a while loop, because someone could suspend
|
* We're in a while loop, because someone could suspend
|
||||||
* before we get to the following read lock.
|
* before we get to the following read lock.
|
||||||
*/
|
*/
|
||||||
down_read(&md->lock);
|
down_read(&md->io_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
__split_bio(md, bio);
|
__split_bio(md, bio);
|
||||||
up_read(&md->lock);
|
up_read(&md->io_lock);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -610,7 +610,7 @@ static int dm_flush_all(request_queue_t *q, struct gendisk *disk,
|
|||||||
int ret = -ENXIO;
|
int ret = -ENXIO;
|
||||||
|
|
||||||
if (map) {
|
if (map) {
|
||||||
ret = dm_table_flush_all(md->map);
|
ret = dm_table_flush_all(map);
|
||||||
dm_table_put(map);
|
dm_table_put(map);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -747,7 +747,8 @@ static struct mapped_device *alloc_dev(unsigned int minor, int persistent)
|
|||||||
goto bad1;
|
goto bad1;
|
||||||
|
|
||||||
memset(md, 0, sizeof(*md));
|
memset(md, 0, sizeof(*md));
|
||||||
init_rwsem(&md->lock);
|
init_rwsem(&md->io_lock);
|
||||||
|
init_MUTEX(&md->suspend_lock);
|
||||||
rwlock_init(&md->map_lock);
|
rwlock_init(&md->map_lock);
|
||||||
atomic_set(&md->holders, 1);
|
atomic_set(&md->holders, 1);
|
||||||
atomic_set(&md->event_nr, 0);
|
atomic_set(&md->event_nr, 0);
|
||||||
@ -825,18 +826,13 @@ static void event_callback(void *context)
|
|||||||
wake_up(&md->eventq);
|
wake_up(&md->eventq);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __set_size(struct gendisk *disk, sector_t size)
|
static void __set_size(struct mapped_device *md, sector_t size)
|
||||||
{
|
{
|
||||||
struct block_device *bdev;
|
set_capacity(md->disk, size);
|
||||||
|
|
||||||
set_capacity(disk, size);
|
down(&md->frozen_bdev->bd_inode->i_sem);
|
||||||
bdev = bdget_disk(disk, 0);
|
i_size_write(md->frozen_bdev->bd_inode, (loff_t)size << SECTOR_SHIFT);
|
||||||
if (bdev) {
|
up(&md->frozen_bdev->bd_inode->i_sem);
|
||||||
down(&bdev->bd_inode->i_sem);
|
|
||||||
i_size_write(bdev->bd_inode, (loff_t)size << SECTOR_SHIFT);
|
|
||||||
up(&bdev->bd_inode->i_sem);
|
|
||||||
bdput(bdev);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __bind(struct mapped_device *md, struct dm_table *t)
|
static int __bind(struct mapped_device *md, struct dm_table *t)
|
||||||
@ -845,17 +841,18 @@ static int __bind(struct mapped_device *md, struct dm_table *t)
|
|||||||
sector_t size;
|
sector_t size;
|
||||||
|
|
||||||
size = dm_table_get_size(t);
|
size = dm_table_get_size(t);
|
||||||
__set_size(md->disk, size);
|
__set_size(md, size);
|
||||||
if (size == 0)
|
if (size == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
dm_table_get(t);
|
||||||
|
dm_table_event_callback(t, event_callback, md);
|
||||||
|
|
||||||
write_lock(&md->map_lock);
|
write_lock(&md->map_lock);
|
||||||
md->map = t;
|
md->map = t;
|
||||||
|
dm_table_set_restrictions(t, q);
|
||||||
write_unlock(&md->map_lock);
|
write_unlock(&md->map_lock);
|
||||||
|
|
||||||
dm_table_get(t);
|
|
||||||
dm_table_event_callback(md->map, event_callback, md);
|
|
||||||
dm_table_set_restrictions(t, q);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -935,7 +932,7 @@ void dm_put(struct mapped_device *md)
|
|||||||
struct dm_table *map = dm_get_table(md);
|
struct dm_table *map = dm_get_table(md);
|
||||||
|
|
||||||
if (atomic_dec_and_test(&md->holders)) {
|
if (atomic_dec_and_test(&md->holders)) {
|
||||||
if (!test_bit(DMF_SUSPENDED, &md->flags) && map) {
|
if (!dm_suspended(md)) {
|
||||||
dm_table_presuspend_targets(map);
|
dm_table_presuspend_targets(map);
|
||||||
dm_table_postsuspend_targets(map);
|
dm_table_postsuspend_targets(map);
|
||||||
}
|
}
|
||||||
@ -968,17 +965,17 @@ int dm_swap_table(struct mapped_device *md, struct dm_table *table)
|
|||||||
{
|
{
|
||||||
int r = -EINVAL;
|
int r = -EINVAL;
|
||||||
|
|
||||||
down_write(&md->lock);
|
down(&md->suspend_lock);
|
||||||
|
|
||||||
/* device must be suspended */
|
/* device must be suspended */
|
||||||
if (!test_bit(DMF_SUSPENDED, &md->flags))
|
if (!dm_suspended(md))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
__unbind(md);
|
__unbind(md);
|
||||||
r = __bind(md, table);
|
r = __bind(md, table);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
up_write(&md->lock);
|
up(&md->suspend_lock);
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -986,16 +983,13 @@ out:
|
|||||||
* Functions to lock and unlock any filesystem running on the
|
* Functions to lock and unlock any filesystem running on the
|
||||||
* device.
|
* device.
|
||||||
*/
|
*/
|
||||||
static int __lock_fs(struct mapped_device *md)
|
static int lock_fs(struct mapped_device *md)
|
||||||
{
|
{
|
||||||
int error = -ENOMEM;
|
int r = -ENOMEM;
|
||||||
|
|
||||||
if (test_and_set_bit(DMF_FS_LOCKED, &md->flags))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
md->frozen_bdev = bdget_disk(md->disk, 0);
|
md->frozen_bdev = bdget_disk(md->disk, 0);
|
||||||
if (!md->frozen_bdev) {
|
if (!md->frozen_bdev) {
|
||||||
DMWARN("bdget failed in __lock_fs");
|
DMWARN("bdget failed in lock_fs");
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1003,13 +997,13 @@ static int __lock_fs(struct mapped_device *md)
|
|||||||
|
|
||||||
md->frozen_sb = freeze_bdev(md->frozen_bdev);
|
md->frozen_sb = freeze_bdev(md->frozen_bdev);
|
||||||
if (IS_ERR(md->frozen_sb)) {
|
if (IS_ERR(md->frozen_sb)) {
|
||||||
error = PTR_ERR(md->frozen_sb);
|
r = PTR_ERR(md->frozen_sb);
|
||||||
goto out_bdput;
|
goto out_bdput;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* don't bdput right now, we don't want the bdev
|
/* don't bdput right now, we don't want the bdev
|
||||||
* to go away while it is locked. We'll bdput
|
* to go away while it is locked. We'll bdput
|
||||||
* in __unlock_fs
|
* in unlock_fs
|
||||||
*/
|
*/
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -1018,15 +1012,11 @@ out_bdput:
|
|||||||
md->frozen_sb = NULL;
|
md->frozen_sb = NULL;
|
||||||
md->frozen_bdev = NULL;
|
md->frozen_bdev = NULL;
|
||||||
out:
|
out:
|
||||||
clear_bit(DMF_FS_LOCKED, &md->flags);
|
return r;
|
||||||
return error;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __unlock_fs(struct mapped_device *md)
|
static void unlock_fs(struct mapped_device *md)
|
||||||
{
|
{
|
||||||
if (!test_and_clear_bit(DMF_FS_LOCKED, &md->flags))
|
|
||||||
return;
|
|
||||||
|
|
||||||
thaw_bdev(md->frozen_bdev, md->frozen_sb);
|
thaw_bdev(md->frozen_bdev, md->frozen_sb);
|
||||||
bdput(md->frozen_bdev);
|
bdput(md->frozen_bdev);
|
||||||
|
|
||||||
@ -1043,50 +1033,37 @@ static void __unlock_fs(struct mapped_device *md)
|
|||||||
*/
|
*/
|
||||||
int dm_suspend(struct mapped_device *md)
|
int dm_suspend(struct mapped_device *md)
|
||||||
{
|
{
|
||||||
struct dm_table *map;
|
struct dm_table *map = NULL;
|
||||||
DECLARE_WAITQUEUE(wait, current);
|
DECLARE_WAITQUEUE(wait, current);
|
||||||
int error = -EINVAL;
|
int r = -EINVAL;
|
||||||
|
|
||||||
/* Flush I/O to the device. */
|
down(&md->suspend_lock);
|
||||||
down_read(&md->lock);
|
|
||||||
if (test_bit(DMF_BLOCK_IO, &md->flags))
|
if (dm_suspended(md))
|
||||||
goto out_read_unlock;
|
goto out;
|
||||||
|
|
||||||
map = dm_get_table(md);
|
map = dm_get_table(md);
|
||||||
if (map)
|
|
||||||
/* This does not get reverted if there's an error later. */
|
|
||||||
dm_table_presuspend_targets(map);
|
|
||||||
|
|
||||||
error = __lock_fs(md);
|
/* This does not get reverted if there's an error later. */
|
||||||
if (error) {
|
dm_table_presuspend_targets(map);
|
||||||
dm_table_put(map);
|
|
||||||
goto out_read_unlock;
|
|
||||||
}
|
|
||||||
|
|
||||||
up_read(&md->lock);
|
/* Flush I/O to the device. */
|
||||||
|
r = lock_fs(md);
|
||||||
|
if (r)
|
||||||
|
goto out;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* First we set the BLOCK_IO flag so no more ios will be mapped.
|
* First we set the BLOCK_IO flag so no more ios will be mapped.
|
||||||
*
|
|
||||||
* If the flag is already set we know another thread is trying to
|
|
||||||
* suspend as well, so we leave the fs locked for this thread.
|
|
||||||
*/
|
*/
|
||||||
error = -EINVAL;
|
down_write(&md->io_lock);
|
||||||
down_write(&md->lock);
|
set_bit(DMF_BLOCK_IO, &md->flags);
|
||||||
if (test_and_set_bit(DMF_BLOCK_IO, &md->flags)) {
|
|
||||||
if (map)
|
|
||||||
dm_table_put(map);
|
|
||||||
goto out_write_unlock;
|
|
||||||
}
|
|
||||||
|
|
||||||
add_wait_queue(&md->wait, &wait);
|
add_wait_queue(&md->wait, &wait);
|
||||||
up_write(&md->lock);
|
up_write(&md->io_lock);
|
||||||
|
|
||||||
/* unplug */
|
/* unplug */
|
||||||
if (map) {
|
if (map)
|
||||||
dm_table_unplug_all(map);
|
dm_table_unplug_all(map);
|
||||||
dm_table_put(map);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Then we wait for the already mapped ios to
|
* Then we wait for the already mapped ios to
|
||||||
@ -1102,62 +1079,67 @@ int dm_suspend(struct mapped_device *md)
|
|||||||
}
|
}
|
||||||
set_current_state(TASK_RUNNING);
|
set_current_state(TASK_RUNNING);
|
||||||
|
|
||||||
down_write(&md->lock);
|
down_write(&md->io_lock);
|
||||||
remove_wait_queue(&md->wait, &wait);
|
remove_wait_queue(&md->wait, &wait);
|
||||||
|
|
||||||
/* were we interrupted ? */
|
/* were we interrupted ? */
|
||||||
error = -EINTR;
|
r = -EINTR;
|
||||||
if (atomic_read(&md->pending))
|
if (atomic_read(&md->pending)) {
|
||||||
goto out_unfreeze;
|
up_write(&md->io_lock);
|
||||||
|
unlock_fs(md);
|
||||||
|
clear_bit(DMF_BLOCK_IO, &md->flags);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
up_write(&md->io_lock);
|
||||||
|
|
||||||
|
dm_table_postsuspend_targets(map);
|
||||||
|
|
||||||
set_bit(DMF_SUSPENDED, &md->flags);
|
set_bit(DMF_SUSPENDED, &md->flags);
|
||||||
|
|
||||||
map = dm_get_table(md);
|
r = 0;
|
||||||
if (map)
|
|
||||||
dm_table_postsuspend_targets(map);
|
out:
|
||||||
dm_table_put(map);
|
dm_table_put(map);
|
||||||
up_write(&md->lock);
|
up(&md->suspend_lock);
|
||||||
|
return r;
|
||||||
return 0;
|
|
||||||
|
|
||||||
out_unfreeze:
|
|
||||||
__unlock_fs(md);
|
|
||||||
clear_bit(DMF_BLOCK_IO, &md->flags);
|
|
||||||
out_write_unlock:
|
|
||||||
up_write(&md->lock);
|
|
||||||
return error;
|
|
||||||
|
|
||||||
out_read_unlock:
|
|
||||||
up_read(&md->lock);
|
|
||||||
return error;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int dm_resume(struct mapped_device *md)
|
int dm_resume(struct mapped_device *md)
|
||||||
{
|
{
|
||||||
|
int r = -EINVAL;
|
||||||
struct bio *def;
|
struct bio *def;
|
||||||
struct dm_table *map = dm_get_table(md);
|
struct dm_table *map = NULL;
|
||||||
|
|
||||||
down_write(&md->lock);
|
down(&md->suspend_lock);
|
||||||
if (!map ||
|
if (!dm_suspended(md))
|
||||||
!test_bit(DMF_SUSPENDED, &md->flags) ||
|
goto out;
|
||||||
!dm_table_get_size(map)) {
|
|
||||||
up_write(&md->lock);
|
map = dm_get_table(md);
|
||||||
dm_table_put(map);
|
if (!map || !dm_table_get_size(map))
|
||||||
return -EINVAL;
|
goto out;
|
||||||
}
|
|
||||||
|
|
||||||
dm_table_resume_targets(map);
|
dm_table_resume_targets(map);
|
||||||
clear_bit(DMF_SUSPENDED, &md->flags);
|
|
||||||
|
down_write(&md->io_lock);
|
||||||
clear_bit(DMF_BLOCK_IO, &md->flags);
|
clear_bit(DMF_BLOCK_IO, &md->flags);
|
||||||
|
|
||||||
def = bio_list_get(&md->deferred);
|
def = bio_list_get(&md->deferred);
|
||||||
__flush_deferred_io(md, def);
|
__flush_deferred_io(md, def);
|
||||||
up_write(&md->lock);
|
up_write(&md->io_lock);
|
||||||
__unlock_fs(md);
|
|
||||||
dm_table_unplug_all(map);
|
|
||||||
dm_table_put(map);
|
|
||||||
|
|
||||||
return 0;
|
unlock_fs(md);
|
||||||
|
|
||||||
|
clear_bit(DMF_SUSPENDED, &md->flags);
|
||||||
|
|
||||||
|
dm_table_unplug_all(map);
|
||||||
|
|
||||||
|
r = 0;
|
||||||
|
|
||||||
|
out:
|
||||||
|
dm_table_put(map);
|
||||||
|
up(&md->suspend_lock);
|
||||||
|
|
||||||
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-----------------------------------------------------------------
|
/*-----------------------------------------------------------------
|
||||||
|
@ -1450,6 +1450,7 @@ static int net_send_packet(struct sk_buff *skb, struct net_device *dev)
|
|||||||
/* Write the contents of the packet */
|
/* Write the contents of the packet */
|
||||||
outsw(dev->base_addr + TX_FRAME_PORT,skb->data,(skb->len+1) >>1);
|
outsw(dev->base_addr + TX_FRAME_PORT,skb->data,(skb->len+1) >>1);
|
||||||
spin_unlock_irq(&lp->lock);
|
spin_unlock_irq(&lp->lock);
|
||||||
|
lp->stats.tx_bytes += skb->len;
|
||||||
dev->trans_start = jiffies;
|
dev->trans_start = jiffies;
|
||||||
dev_kfree_skb (skb);
|
dev_kfree_skb (skb);
|
||||||
|
|
||||||
|
@ -162,7 +162,6 @@ static void e1000_vlan_rx_add_vid(struct net_device *netdev, uint16_t vid);
|
|||||||
static void e1000_vlan_rx_kill_vid(struct net_device *netdev, uint16_t vid);
|
static void e1000_vlan_rx_kill_vid(struct net_device *netdev, uint16_t vid);
|
||||||
static void e1000_restore_vlan(struct e1000_adapter *adapter);
|
static void e1000_restore_vlan(struct e1000_adapter *adapter);
|
||||||
|
|
||||||
static int e1000_notify_reboot(struct notifier_block *, unsigned long event, void *ptr);
|
|
||||||
static int e1000_suspend(struct pci_dev *pdev, uint32_t state);
|
static int e1000_suspend(struct pci_dev *pdev, uint32_t state);
|
||||||
#ifdef CONFIG_PM
|
#ifdef CONFIG_PM
|
||||||
static int e1000_resume(struct pci_dev *pdev);
|
static int e1000_resume(struct pci_dev *pdev);
|
||||||
@ -173,12 +172,6 @@ static int e1000_resume(struct pci_dev *pdev);
|
|||||||
static void e1000_netpoll (struct net_device *netdev);
|
static void e1000_netpoll (struct net_device *netdev);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct notifier_block e1000_notifier_reboot = {
|
|
||||||
.notifier_call = e1000_notify_reboot,
|
|
||||||
.next = NULL,
|
|
||||||
.priority = 0
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Exported from other modules */
|
/* Exported from other modules */
|
||||||
|
|
||||||
extern void e1000_check_options(struct e1000_adapter *adapter);
|
extern void e1000_check_options(struct e1000_adapter *adapter);
|
||||||
@ -221,9 +214,7 @@ e1000_init_module(void)
|
|||||||
printk(KERN_INFO "%s\n", e1000_copyright);
|
printk(KERN_INFO "%s\n", e1000_copyright);
|
||||||
|
|
||||||
ret = pci_module_init(&e1000_driver);
|
ret = pci_module_init(&e1000_driver);
|
||||||
if(ret >= 0) {
|
|
||||||
register_reboot_notifier(&e1000_notifier_reboot);
|
|
||||||
}
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -239,7 +230,6 @@ module_init(e1000_init_module);
|
|||||||
static void __exit
|
static void __exit
|
||||||
e1000_exit_module(void)
|
e1000_exit_module(void)
|
||||||
{
|
{
|
||||||
unregister_reboot_notifier(&e1000_notifier_reboot);
|
|
||||||
pci_unregister_driver(&e1000_driver);
|
pci_unregister_driver(&e1000_driver);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3651,23 +3641,6 @@ e1000_set_spd_dplx(struct e1000_adapter *adapter, uint16_t spddplx)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
|
||||||
e1000_notify_reboot(struct notifier_block *nb, unsigned long event, void *p)
|
|
||||||
{
|
|
||||||
struct pci_dev *pdev = NULL;
|
|
||||||
|
|
||||||
switch(event) {
|
|
||||||
case SYS_DOWN:
|
|
||||||
case SYS_HALT:
|
|
||||||
case SYS_POWER_OFF:
|
|
||||||
while((pdev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, pdev))) {
|
|
||||||
if(pci_dev_driver(pdev) == &e1000_driver)
|
|
||||||
e1000_suspend(pdev, 3);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return NOTIFY_DONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
e1000_suspend(struct pci_dev *pdev, uint32_t state)
|
e1000_suspend(struct pci_dev *pdev, uint32_t state)
|
||||||
{
|
{
|
||||||
|
@ -1671,7 +1671,7 @@ static void set_multicast_list(struct net_device *dev)
|
|||||||
|
|
||||||
static struct pcmcia_device_id nmclan_ids[] = {
|
static struct pcmcia_device_id nmclan_ids[] = {
|
||||||
PCMCIA_DEVICE_PROD_ID12("New Media Corporation", "Ethernet", 0x085a850b, 0x00b2e941),
|
PCMCIA_DEVICE_PROD_ID12("New Media Corporation", "Ethernet", 0x085a850b, 0x00b2e941),
|
||||||
PCMCIA_DEVICE_PROD_ID12("Portable Add-ons", "Ethernet", 0x0ebf1d60, 0x00b2e941),
|
PCMCIA_DEVICE_PROD_ID12("Portable Add-ons", "Ethernet+", 0xebf1d60, 0xad673aaf),
|
||||||
PCMCIA_DEVICE_NULL,
|
PCMCIA_DEVICE_NULL,
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(pcmcia, nmclan_ids);
|
MODULE_DEVICE_TABLE(pcmcia, nmclan_ids);
|
||||||
|
@ -1639,7 +1639,7 @@ static struct pcmcia_device_id pcnet_ids[] = {
|
|||||||
PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0143, 0xc0ab),
|
PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0143, 0xc0ab),
|
||||||
PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x021b, 0x0101),
|
PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x021b, 0x0101),
|
||||||
PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x08a1, 0xc0ab),
|
PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x08a1, 0xc0ab),
|
||||||
PCMCIA_PFC_DEVICE_PROD_ID12(0, "AnyCom", "Fast Ethernet ", 0x578ba6e7, 0x02d92d1e),
|
PCMCIA_PFC_DEVICE_PROD_ID12(0, "AnyCom", "Fast Ethernet + 56K COMBO", 0x578ba6e7, 0xb0ac62c4),
|
||||||
PCMCIA_PFC_DEVICE_PROD_ID12(0, "D-Link", "DME336T", 0x1a424a1c, 0xb23897ff),
|
PCMCIA_PFC_DEVICE_PROD_ID12(0, "D-Link", "DME336T", 0x1a424a1c, 0xb23897ff),
|
||||||
PCMCIA_PFC_DEVICE_PROD_ID12(0, "Grey Cell", "GCS3000", 0x2a151fac, 0x48b932ae),
|
PCMCIA_PFC_DEVICE_PROD_ID12(0, "Grey Cell", "GCS3000", 0x2a151fac, 0x48b932ae),
|
||||||
PCMCIA_PFC_DEVICE_PROD_ID12(0, "Linksys", "EtherFast 10&100 + 56K PC Card (PCMLM56)", 0x0733cc81, 0xb3765033),
|
PCMCIA_PFC_DEVICE_PROD_ID12(0, "Linksys", "EtherFast 10&100 + 56K PC Card (PCMLM56)", 0x0733cc81, 0xb3765033),
|
||||||
@ -1683,7 +1683,6 @@ static struct pcmcia_device_id pcnet_ids[] = {
|
|||||||
PCMCIA_DEVICE_PROD_ID12("ACCTON", "EN2212", 0xdfc6b5b2, 0xcb112a11),
|
PCMCIA_DEVICE_PROD_ID12("ACCTON", "EN2212", 0xdfc6b5b2, 0xcb112a11),
|
||||||
PCMCIA_DEVICE_PROD_ID12("ACCTON", "EN2216-PCMCIA-ETHERNET", 0xdfc6b5b2, 0x5542bfff),
|
PCMCIA_DEVICE_PROD_ID12("ACCTON", "EN2216-PCMCIA-ETHERNET", 0xdfc6b5b2, 0x5542bfff),
|
||||||
PCMCIA_DEVICE_PROD_ID12("Allied Telesis, K.K.", "CentreCOM LA100-PCM-T V2 100/10M LAN PC Card", 0xbb7fbdd7, 0xcd91cc68),
|
PCMCIA_DEVICE_PROD_ID12("Allied Telesis, K.K.", "CentreCOM LA100-PCM-T V2 100/10M LAN PC Card", 0xbb7fbdd7, 0xcd91cc68),
|
||||||
PCMCIA_DEVICE_PROD_ID12("Allied Telesis, K.K.", "CentreCOM LA-PCM", 0xbb7fbdd7, 0x5ba10d49),
|
|
||||||
PCMCIA_DEVICE_PROD_ID12("Allied Telesis K.K.", "LA100-PCM V2", 0x36634a66, 0xc6d05997),
|
PCMCIA_DEVICE_PROD_ID12("Allied Telesis K.K.", "LA100-PCM V2", 0x36634a66, 0xc6d05997),
|
||||||
PCMCIA_DEVICE_PROD_ID12("Allied Telesis, K.K.", "CentreCOM LA-PCM_V2", 0xbb7fBdd7, 0x28e299f8),
|
PCMCIA_DEVICE_PROD_ID12("Allied Telesis, K.K.", "CentreCOM LA-PCM_V2", 0xbb7fBdd7, 0x28e299f8),
|
||||||
PCMCIA_DEVICE_PROD_ID12("Allied Telesis K.K.", "LA-PCM V3", 0x36634a66, 0x62241d96),
|
PCMCIA_DEVICE_PROD_ID12("Allied Telesis K.K.", "LA-PCM V3", 0x36634a66, 0x62241d96),
|
||||||
@ -1719,6 +1718,7 @@ static struct pcmcia_device_id pcnet_ids[] = {
|
|||||||
PCMCIA_DEVICE_PROD_ID12("DIGITAL", "DEPCM-XX", 0x69616cb3, 0xe600e76e),
|
PCMCIA_DEVICE_PROD_ID12("DIGITAL", "DEPCM-XX", 0x69616cb3, 0xe600e76e),
|
||||||
PCMCIA_DEVICE_PROD_ID12("D-Link", "DE-650", 0x1a424a1c, 0xf28c8398),
|
PCMCIA_DEVICE_PROD_ID12("D-Link", "DE-650", 0x1a424a1c, 0xf28c8398),
|
||||||
PCMCIA_DEVICE_PROD_ID12("D-Link", "DE-660", 0x1a424a1c, 0xd9a1d05b),
|
PCMCIA_DEVICE_PROD_ID12("D-Link", "DE-660", 0x1a424a1c, 0xd9a1d05b),
|
||||||
|
PCMCIA_DEVICE_PROD_ID12("D-Link", "DE-660+", 0x1a424a1c, 0x50dcd0ec),
|
||||||
PCMCIA_DEVICE_PROD_ID12("D-Link", "DFE-650", 0x1a424a1c, 0x0f0073f9),
|
PCMCIA_DEVICE_PROD_ID12("D-Link", "DFE-650", 0x1a424a1c, 0x0f0073f9),
|
||||||
PCMCIA_DEVICE_PROD_ID12("Dual Speed", "10/100 PC Card", 0x725b842d, 0xf1efee84),
|
PCMCIA_DEVICE_PROD_ID12("Dual Speed", "10/100 PC Card", 0x725b842d, 0xf1efee84),
|
||||||
PCMCIA_DEVICE_PROD_ID12("Dual Speed", "10/100 Port Attached PC Card", 0x725b842d, 0x2db1f8e9),
|
PCMCIA_DEVICE_PROD_ID12("Dual Speed", "10/100 Port Attached PC Card", 0x725b842d, 0x2db1f8e9),
|
||||||
@ -1737,6 +1737,7 @@ static struct pcmcia_device_id pcnet_ids[] = {
|
|||||||
PCMCIA_DEVICE_PROD_ID12("GVC", "NIC-2000p", 0x76e171bd, 0x6eb1c947),
|
PCMCIA_DEVICE_PROD_ID12("GVC", "NIC-2000p", 0x76e171bd, 0x6eb1c947),
|
||||||
PCMCIA_DEVICE_PROD_ID12("IBM Corp.", "Ethernet", 0xe3736c88, 0x00b2e941),
|
PCMCIA_DEVICE_PROD_ID12("IBM Corp.", "Ethernet", 0xe3736c88, 0x00b2e941),
|
||||||
PCMCIA_DEVICE_PROD_ID12("IC-CARD", "IC-CARD", 0x60cb09a6, 0x60cb09a6),
|
PCMCIA_DEVICE_PROD_ID12("IC-CARD", "IC-CARD", 0x60cb09a6, 0x60cb09a6),
|
||||||
|
PCMCIA_DEVICE_PROD_ID12("IC-CARD+", "IC-CARD+", 0x93693494, 0x93693494),
|
||||||
PCMCIA_DEVICE_PROD_ID12("IO DATA", "PCETTX", 0x547e66dc, 0x6fc5459b),
|
PCMCIA_DEVICE_PROD_ID12("IO DATA", "PCETTX", 0x547e66dc, 0x6fc5459b),
|
||||||
PCMCIA_DEVICE_PROD_ID12("iPort", "10/100 Ethernet Card", 0x56c538d2, 0x11b0ffc0),
|
PCMCIA_DEVICE_PROD_ID12("iPort", "10/100 Ethernet Card", 0x56c538d2, 0x11b0ffc0),
|
||||||
PCMCIA_DEVICE_PROD_ID12("KANSAI ELECTRIC CO.,LTD", "KLA-PCM/T", 0xb18dc3b4, 0xcc51a956),
|
PCMCIA_DEVICE_PROD_ID12("KANSAI ELECTRIC CO.,LTD", "KLA-PCM/T", 0xb18dc3b4, 0xcc51a956),
|
||||||
@ -1753,7 +1754,7 @@ static struct pcmcia_device_id pcnet_ids[] = {
|
|||||||
PCMCIA_DEVICE_PROD_ID12("Linksys", "EtherFast 10/100 Integrated PC Card (PCM100)", 0x0733cc81, 0x453c3f9d),
|
PCMCIA_DEVICE_PROD_ID12("Linksys", "EtherFast 10/100 Integrated PC Card (PCM100)", 0x0733cc81, 0x453c3f9d),
|
||||||
PCMCIA_DEVICE_PROD_ID12("Linksys", "EtherFast 10/100 PC Card (PCMPC100)", 0x0733cc81, 0x66c5a389),
|
PCMCIA_DEVICE_PROD_ID12("Linksys", "EtherFast 10/100 PC Card (PCMPC100)", 0x0733cc81, 0x66c5a389),
|
||||||
PCMCIA_DEVICE_PROD_ID12("Linksys", "EtherFast 10/100 PC Card (PCMPC100 V2)", 0x0733cc81, 0x3a3b28e9),
|
PCMCIA_DEVICE_PROD_ID12("Linksys", "EtherFast 10/100 PC Card (PCMPC100 V2)", 0x0733cc81, 0x3a3b28e9),
|
||||||
PCMCIA_DEVICE_PROD_ID12("Linksys", "HomeLink Phoneline ", 0x0733cc81, 0x5e07cfa0),
|
PCMCIA_DEVICE_PROD_ID12("Linksys", "HomeLink Phoneline + 10/100 Network PC Card (PCM100H1)", 0x733cc81, 0x7a3e5c3a),
|
||||||
PCMCIA_DEVICE_PROD_ID12("Logitec", "LPM-LN100TX", 0x88fcdeda, 0x6d772737),
|
PCMCIA_DEVICE_PROD_ID12("Logitec", "LPM-LN100TX", 0x88fcdeda, 0x6d772737),
|
||||||
PCMCIA_DEVICE_PROD_ID12("Logitec", "LPM-LN20T", 0x88fcdeda, 0x81090922),
|
PCMCIA_DEVICE_PROD_ID12("Logitec", "LPM-LN20T", 0x88fcdeda, 0x81090922),
|
||||||
PCMCIA_DEVICE_PROD_ID12("LONGSHINE", "PCMCIA Ethernet Card", 0xf866b0b0, 0x6f6652e0),
|
PCMCIA_DEVICE_PROD_ID12("LONGSHINE", "PCMCIA Ethernet Card", 0xf866b0b0, 0x6f6652e0),
|
||||||
|
@ -2332,8 +2332,8 @@ static struct pcmcia_device_id smc91c92_ids[] = {
|
|||||||
PCMCIA_PFC_DEVICE_PROD_ID123(0, "MEGAHERTZ", "XJEM1144/CCEM1144", "PCMCIA MODEM", 0xf510db04, 0x52d21e1e, 0xbd6c43ef),
|
PCMCIA_PFC_DEVICE_PROD_ID123(0, "MEGAHERTZ", "XJEM1144/CCEM1144", "PCMCIA MODEM", 0xf510db04, 0x52d21e1e, 0xbd6c43ef),
|
||||||
PCMCIA_PFC_DEVICE_PROD_ID12(0, "Gateway 2000", "XJEM3336", 0xdd9989be, 0x662c394c),
|
PCMCIA_PFC_DEVICE_PROD_ID12(0, "Gateway 2000", "XJEM3336", 0xdd9989be, 0x662c394c),
|
||||||
PCMCIA_PFC_DEVICE_PROD_ID12(0, "MEGAHERTZ", "XJEM1144/CCEM1144", 0xf510db04, 0x52d21e1e),
|
PCMCIA_PFC_DEVICE_PROD_ID12(0, "MEGAHERTZ", "XJEM1144/CCEM1144", 0xf510db04, 0x52d21e1e),
|
||||||
PCMCIA_PFC_DEVICE_PROD_ID12(0, "Ositech", "Trumpcard", 0x0c2f80cd, 0x0573c29f),
|
PCMCIA_PFC_DEVICE_PROD_ID12(0, "Ositech", "Trumpcard:Jack of Diamonds Modem+Ethernet", 0xc2f80cd, 0x656947b9),
|
||||||
PCMCIA_PFC_DEVICE_PROD_ID12(0, "Ositech", "Trumpcard", 0x0c2f80cd, 0x0573c29f),
|
PCMCIA_PFC_DEVICE_PROD_ID12(0, "Ositech", "Trumpcard:Jack of Hearts Modem+Ethernet", 0xc2f80cd, 0xdc9ba5ed),
|
||||||
PCMCIA_MFC_DEVICE_MANF_CARD(0, 0x016c, 0x0020),
|
PCMCIA_MFC_DEVICE_MANF_CARD(0, 0x016c, 0x0020),
|
||||||
PCMCIA_DEVICE_MANF_CARD(0x016c, 0x0023),
|
PCMCIA_DEVICE_MANF_CARD(0x016c, 0x0023),
|
||||||
PCMCIA_DEVICE_PROD_ID123("BASICS by New Media Corporation", "Ethernet", "SMC91C94", 0x23c78a9d, 0x00b2e941, 0xcef397fb),
|
PCMCIA_DEVICE_PROD_ID123("BASICS by New Media Corporation", "Ethernet", "SMC91C94", 0x23c78a9d, 0x00b2e941, 0xcef397fb),
|
||||||
@ -2343,8 +2343,8 @@ static struct pcmcia_device_id smc91c92_ids[] = {
|
|||||||
PCMCIA_DEVICE_PROD_ID12("Farallon", "Farallon Enet", 0x58d93fc4, 0x244734e9),
|
PCMCIA_DEVICE_PROD_ID12("Farallon", "Farallon Enet", 0x58d93fc4, 0x244734e9),
|
||||||
PCMCIA_DEVICE_PROD_ID12("Megahertz", "CC10BT/2", 0x33234748, 0x3c95b953),
|
PCMCIA_DEVICE_PROD_ID12("Megahertz", "CC10BT/2", 0x33234748, 0x3c95b953),
|
||||||
PCMCIA_DEVICE_PROD_ID12("MELCO/SMC", "LPC-TX", 0xa2cd8e6d, 0x42da662a),
|
PCMCIA_DEVICE_PROD_ID12("MELCO/SMC", "LPC-TX", 0xa2cd8e6d, 0x42da662a),
|
||||||
PCMCIA_DEVICE_PROD_ID12("Ositech", "Trumpcard", 0x0c2f80cd, 0x0573c29f),
|
PCMCIA_DEVICE_PROD_ID12("Ositech", "Trumpcard:Four of Diamonds Ethernet", 0xc2f80cd, 0xb3466314),
|
||||||
PCMCIA_DEVICE_PROD_ID12("Ositech", "Trumpcard", 0x0c2f80cd, 0x0573c29f),
|
PCMCIA_DEVICE_PROD_ID12("Ositech", "Trumpcard:Seven of Diamonds Ethernet", 0xc2f80cd, 0x194b650a),
|
||||||
PCMCIA_DEVICE_PROD_ID12("PCMCIA", "Fast Ethernet PCCard", 0x281f1c5d, 0xdcea68bc),
|
PCMCIA_DEVICE_PROD_ID12("PCMCIA", "Fast Ethernet PCCard", 0x281f1c5d, 0xdcea68bc),
|
||||||
PCMCIA_DEVICE_PROD_ID12("Psion", "10Mb Ethernet", 0x4ef00b21, 0x844be9e9),
|
PCMCIA_DEVICE_PROD_ID12("Psion", "10Mb Ethernet", 0x4ef00b21, 0x844be9e9),
|
||||||
PCMCIA_DEVICE_PROD_ID12("SMC", "EtherEZ Ethernet 8020", 0xc4f8b18b, 0x4a0eeb2d),
|
PCMCIA_DEVICE_PROD_ID12("SMC", "EtherEZ Ethernet 8020", 0xc4f8b18b, 0x4a0eeb2d),
|
||||||
|
@ -1985,7 +1985,7 @@ static struct pcmcia_device_id xirc2ps_ids[] = {
|
|||||||
PCMCIA_PFC_DEVICE_PROD_ID13(0, "Xircom", "CEM56", 0x2e3ee845, 0xa650c32a),
|
PCMCIA_PFC_DEVICE_PROD_ID13(0, "Xircom", "CEM56", 0x2e3ee845, 0xa650c32a),
|
||||||
PCMCIA_PFC_DEVICE_PROD_ID13(0, "Xircom", "REM10", 0x2e3ee845, 0x76df1d29),
|
PCMCIA_PFC_DEVICE_PROD_ID13(0, "Xircom", "REM10", 0x2e3ee845, 0x76df1d29),
|
||||||
PCMCIA_PFC_DEVICE_PROD_ID13(0, "Xircom", "XEM5600", 0x2e3ee845, 0xf1403719),
|
PCMCIA_PFC_DEVICE_PROD_ID13(0, "Xircom", "XEM5600", 0x2e3ee845, 0xf1403719),
|
||||||
PCMCIA_PFC_DEVICE_PROD_ID12(0, "Xircom", "CreditCard Ethernet", 0x2e3ee845, 0xc0e778c2),
|
PCMCIA_PFC_DEVICE_PROD_ID12(0, "Xircom", "CreditCard Ethernet+Modem II", 0x2e3ee845, 0xeca401bf),
|
||||||
PCMCIA_DEVICE_MANF_CARD(0x01bf, 0x010a),
|
PCMCIA_DEVICE_MANF_CARD(0x01bf, 0x010a),
|
||||||
PCMCIA_DEVICE_PROD_ID13("Toshiba Information Systems", "TPCENET", 0x1b3b94fe, 0xf381c1a2),
|
PCMCIA_DEVICE_PROD_ID13("Toshiba Information Systems", "TPCENET", 0x1b3b94fe, 0xf381c1a2),
|
||||||
PCMCIA_DEVICE_PROD_ID13("Xircom", "CE3-10/100", 0x2e3ee845, 0x0ec0ac37),
|
PCMCIA_DEVICE_PROD_ID13("Xircom", "CE3-10/100", 0x2e3ee845, 0x0ec0ac37),
|
||||||
|
@ -621,8 +621,6 @@ static struct pcmcia_device_id orinoco_cs_ids[] = {
|
|||||||
PCMCIA_DEVICE_MANF_CARD(0x9005, 0x0021),
|
PCMCIA_DEVICE_MANF_CARD(0x9005, 0x0021),
|
||||||
PCMCIA_DEVICE_MANF_CARD(0xc250, 0x0002),
|
PCMCIA_DEVICE_MANF_CARD(0xc250, 0x0002),
|
||||||
PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0002),
|
PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0002),
|
||||||
PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0002),
|
|
||||||
PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0005),
|
|
||||||
PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0005),
|
PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0005),
|
||||||
PCMCIA_DEVICE_PROD_ID12("3Com", "3CRWE737A AirConnect Wireless LAN PC Card", 0x41240e5b, 0x56010af3),
|
PCMCIA_DEVICE_PROD_ID12("3Com", "3CRWE737A AirConnect Wireless LAN PC Card", 0x41240e5b, 0x56010af3),
|
||||||
PCMCIA_DEVICE_PROD_ID123("Instant Wireless ", " Network PC CARD", "Version 01.02", 0x11d901af, 0x6e9bd926, 0x4b74baa0),
|
PCMCIA_DEVICE_PROD_ID123("Instant Wireless ", " Network PC CARD", "Version 01.02", 0x11d901af, 0x6e9bd926, 0x4b74baa0),
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user