mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-10 07:00:48 +00:00
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
|
||||
your driver name. Eg, for pcnet_cs, name should point to the
|
||||
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
|
||||
5stack 5-jack in back, 2-jack in front
|
||||
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
|
||||
z71v 3-jack (HP shared SPDIF)
|
||||
asus 3-jack
|
||||
uniwill 3-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
|
||||
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.
|
||||
|
||||
Module snd-pxa2xx-ac97 (on arm only)
|
||||
------------------------------------
|
||||
|
||||
Module for AC97 driver for the Intel PXA2xx chip
|
||||
|
||||
For ARM architecture only.
|
||||
|
||||
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 snd-sun-dbri (on sparc only)
|
||||
-----------------------------------
|
||||
|
||||
Module for DBRI sound chips found on Sparcs.
|
||||
|
||||
Module supports up to 8 cards.
|
||||
|
||||
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 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)
|
||||
|
||||
@ -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.
|
||||
|
||||
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
|
||||
-----------------
|
||||
|
||||
|
@ -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
|
||||
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
|
||||
number of times this has caused internal kernel interfaces to be
|
||||
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
|
||||
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
|
||||
with not properly synchronized CPUs. Only useful with a SMP kernel
|
||||
with not properly synchronized CPUs.
|
||||
|
||||
report_lost_ticks
|
||||
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
|
||||
to get slightly better performance in multiprocessor benchmarks. It also
|
||||
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
|
||||
|
||||
@ -178,6 +181,5 @@ Debugging
|
||||
Misc
|
||||
|
||||
noreplacement Don't replace instructions with more appropiate ones
|
||||
for the CPU. This may be useful on asymmetric MP systems
|
||||
where some CPU have less capabilities than the others.
|
||||
|
||||
for the CPU. This may be useful on asymmetric MP systems
|
||||
where some CPU have less capabilities than the others.
|
||||
|
2
Makefile
2
Makefile
@ -1,7 +1,7 @@
|
||||
VERSION = 2
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 13
|
||||
EXTRAVERSION =-rc3
|
||||
EXTRAVERSION =-rc4
|
||||
NAME=Woozy Numbat
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
@ -176,6 +176,7 @@ asmlinkage void __cpuinit secondary_start_kernel(void)
|
||||
cpu_set(cpu, mm->cpu_vm_mask);
|
||||
cpu_switch_mm(mm->pgd, mm);
|
||||
enter_lazy_tlb(mm, current);
|
||||
local_flush_tlb_all();
|
||||
|
||||
cpu_init();
|
||||
|
||||
|
@ -7,7 +7,7 @@
|
||||
1: ldrexb r2, [r1]
|
||||
\instr r2, r2, r3
|
||||
strexb r0, r2, [r1]
|
||||
cmpne r0, #0
|
||||
cmp r0, #0
|
||||
bne 1b
|
||||
mov pc, lr
|
||||
.endm
|
||||
|
@ -15,6 +15,7 @@
|
||||
#include <linux/mm.h>
|
||||
|
||||
#include <asm/atomic.h>
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/delay.h>
|
||||
#include <asm/mmu_context.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.
|
||||
*/
|
||||
pen_release = cpu;
|
||||
flush_cache_all();
|
||||
|
||||
/*
|
||||
* 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
|
||||
* GNU general public license version 2. See "COPYING" or
|
||||
* http://www.gnu.org/licenses/gpl.html
|
||||
@ -44,7 +44,7 @@
|
||||
|
||||
#define PFX "powernow-k8: "
|
||||
#define BFX PFX "BIOS error: "
|
||||
#define VERSION "version 1.40.2"
|
||||
#define VERSION "version 1.50.3"
|
||||
#include "powernow-k8.h"
|
||||
|
||||
/* 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.
|
||||
* 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)
|
||||
{
|
||||
@ -466,7 +466,7 @@ static int check_supported_cpu(unsigned int cpu)
|
||||
eax = cpuid_eax(CPUID_PROCESSOR_SIGNATURE);
|
||||
if (((eax & CPUID_USE_XFAM_XMOD) != CPUID_USE_XFAM_XMOD) ||
|
||||
((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);
|
||||
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->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->vidmvs = 1 << ((data->acpi_data.states[index].control >> MVS_SHIFT) & MVS_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++) {
|
||||
u32 fid = data->acpi_data.states[i].control & FID_MASK;
|
||||
u32 vid = (data->acpi_data.states[i].control >> VID_SHIFT) & VID_MASK;
|
||||
u32 fid;
|
||||
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);
|
||||
|
||||
@ -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 */
|
||||
if (vid == 0x1f) {
|
||||
if (vid == VID_OFF) {
|
||||
dprintk("invalid vid %u, ignoring\n", vid);
|
||||
powernow_table[i].frequency = CPUFREQ_ENTRY_INVALID;
|
||||
continue;
|
||||
@ -929,15 +938,6 @@ static int powernowk8_target(struct cpufreq_policy *pol, unsigned targfreq, unsi
|
||||
|
||||
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);
|
||||
|
||||
if (transition_frequency(data, newstate)) {
|
||||
@ -977,7 +977,7 @@ static int __init powernowk8_cpu_init(struct cpufreq_policy *pol)
|
||||
{
|
||||
struct powernow_k8_data *data;
|
||||
cpumask_t oldmask = CPU_MASK_ALL;
|
||||
int rc;
|
||||
int rc, i;
|
||||
|
||||
if (!check_supported_cpu(pol->cpu))
|
||||
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",
|
||||
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;
|
||||
|
||||
|
@ -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
|
||||
* GNU general public license version 2. See "COPYING" or
|
||||
* http://www.gnu.org/licenses/gpl.html
|
||||
@ -19,6 +19,7 @@ struct powernow_k8_data {
|
||||
u32 vidmvs; /* usable value calculated from mvs */
|
||||
u32 vstable; /* voltage stabilization time, units 20 us */
|
||||
u32 plllock; /* pll lock time, units 1 us */
|
||||
u32 exttype; /* extended interface = 1 */
|
||||
|
||||
/* keep track of the current fid / vid */
|
||||
u32 currvid, currfid;
|
||||
@ -41,7 +42,7 @@ struct powernow_k8_data {
|
||||
#define CPUID_XFAM 0x0ff00000 /* extended family */
|
||||
#define CPUID_XFAM_K8 0
|
||||
#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_GET_MAX_CAPABILITIES 0x80000000
|
||||
#define CPUID_FREQ_VOLT_CAPABILITIES 0x80000007
|
||||
@ -57,25 +58,26 @@ struct powernow_k8_data {
|
||||
|
||||
/* Field definitions within the FID VID Low Control MSR : */
|
||||
#define MSR_C_LO_INIT_FID_VID 0x00010000
|
||||
#define MSR_C_LO_NEW_VID 0x00001f00
|
||||
#define MSR_C_LO_NEW_FID 0x0000002f
|
||||
#define MSR_C_LO_NEW_VID 0x00003f00
|
||||
#define MSR_C_LO_NEW_FID 0x0000003f
|
||||
#define MSR_C_LO_VID_SHIFT 8
|
||||
|
||||
/* 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 : */
|
||||
#define MSR_S_LO_CHANGE_PENDING 0x80000000 /* cleared when completed */
|
||||
#define MSR_S_LO_MAX_RAMP_VID 0x1f000000
|
||||
#define MSR_S_LO_CHANGE_PENDING 0x80000000 /* cleared when completed */
|
||||
#define MSR_S_LO_MAX_RAMP_VID 0x3f000000
|
||||
#define MSR_S_LO_MAX_FID 0x003f0000
|
||||
#define MSR_S_LO_START_FID 0x00003f00
|
||||
#define MSR_S_LO_CURRENT_FID 0x0000003f
|
||||
|
||||
/* Field definitions within the FID VID High Status MSR : */
|
||||
#define MSR_S_HI_MAX_WORKING_VID 0x001f0000
|
||||
#define MSR_S_HI_START_VID 0x00001f00
|
||||
#define MSR_S_HI_CURRENT_VID 0x0000001f
|
||||
#define MSR_C_HI_STP_GNT_BENIGN 0x00000001
|
||||
#define MSR_S_HI_MIN_WORKING_VID 0x3f000000
|
||||
#define MSR_S_HI_MAX_WORKING_VID 0x003f0000
|
||||
#define MSR_S_HI_START_VID 0x00003f00
|
||||
#define MSR_S_HI_CURRENT_VID 0x0000003f
|
||||
#define MSR_C_HI_STP_GNT_BENIGN 0x00000001
|
||||
|
||||
/*
|
||||
* 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 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 MAX_FREQ 5000
|
||||
|
||||
#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 */
|
||||
|
||||
@ -121,12 +125,14 @@ struct powernow_k8_data {
|
||||
|
||||
#define IRT_SHIFT 30
|
||||
#define RVO_SHIFT 28
|
||||
#define EXT_TYPE_SHIFT 27
|
||||
#define PLL_L_SHIFT 20
|
||||
#define MVS_SHIFT 18
|
||||
#define VST_SHIFT 11
|
||||
#define VID_SHIFT 6
|
||||
#define IRT_MASK 3
|
||||
#define RVO_MASK 3
|
||||
#define EXT_TYPE_MASK 1
|
||||
#define PLL_L_MASK 0x7f
|
||||
#define MVS_MASK 3
|
||||
#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);
|
||||
cache_eax.full = eax;
|
||||
if (cache_eax.split.type == CACHE_TYPE_NULL)
|
||||
return -1;
|
||||
return -EIO; /* better error ? */
|
||||
|
||||
this_leaf->eax.full = eax;
|
||||
this_leaf->ebx.full = ebx;
|
||||
@ -334,6 +334,7 @@ static int __devinit detect_cache_attributes(unsigned int cpu)
|
||||
struct _cpuid4_info *this_leaf;
|
||||
unsigned long j;
|
||||
int retval;
|
||||
cpumask_t oldmask;
|
||||
|
||||
if (num_cache_leaves == 0)
|
||||
return -ENOENT;
|
||||
@ -345,19 +346,26 @@ static int __devinit detect_cache_attributes(unsigned int cpu)
|
||||
memset(cpuid4_info[cpu], 0,
|
||||
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 */
|
||||
retval = 0;
|
||||
for (j = 0; j < num_cache_leaves; j++) {
|
||||
this_leaf = CPUID4_INFO_IDX(cpu, j);
|
||||
retval = cpuid4_cache_lookup(j, this_leaf);
|
||||
if (unlikely(retval < 0))
|
||||
goto err_out;
|
||||
break;
|
||||
cache_shared_cpu_map_setup(cpu, j);
|
||||
}
|
||||
return 0;
|
||||
set_cpus_allowed(current, oldmask);
|
||||
|
||||
err_out:
|
||||
free_cache_attributes(cpu);
|
||||
return -ENOMEM;
|
||||
out:
|
||||
if (retval)
|
||||
free_cache_attributes(cpu);
|
||||
return retval;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SYSFS
|
||||
|
@ -16,6 +16,7 @@
|
||||
#include <asm/io.h>
|
||||
#include <asm/apic.h>
|
||||
#include <asm/cpufeature.h>
|
||||
#include <asm/desc.h>
|
||||
|
||||
static inline unsigned long read_cr3(void)
|
||||
{
|
||||
@ -90,33 +91,32 @@ static void identity_map_page(unsigned long address)
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
static void set_idt(void *newidt, __u16 limit)
|
||||
{
|
||||
unsigned char curidt[6];
|
||||
struct Xgt_desc_struct curidt;
|
||||
|
||||
/* ia32 supports unaliged loads & stores */
|
||||
(*(__u16 *)(curidt)) = limit;
|
||||
(*(__u32 *)(curidt +2)) = (unsigned long)(newidt);
|
||||
curidt.size = limit;
|
||||
curidt.address = (unsigned long)newidt;
|
||||
|
||||
__asm__ __volatile__ (
|
||||
"lidt %0\n"
|
||||
: "=m" (curidt)
|
||||
"lidtl %0\n"
|
||||
: : "m" (curidt)
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
static void set_gdt(void *newgdt, __u16 limit)
|
||||
{
|
||||
unsigned char curgdt[6];
|
||||
struct Xgt_desc_struct curgdt;
|
||||
|
||||
/* ia32 supports unaligned loads & stores */
|
||||
(*(__u16 *)(curgdt)) = limit;
|
||||
(*(__u32 *)(curgdt +2)) = (unsigned long)(newgdt);
|
||||
curgdt.size = limit;
|
||||
curgdt.address = (unsigned long)newgdt;
|
||||
|
||||
__asm__ __volatile__ (
|
||||
"lgdt %0\n"
|
||||
: "=m" (curgdt)
|
||||
"lgdtl %0\n"
|
||||
: : "m" (curgdt)
|
||||
);
|
||||
};
|
||||
|
||||
|
@ -1116,7 +1116,15 @@ int mp_register_gsi (u32 gsi, int edge_level, int active_high_low)
|
||||
*/
|
||||
int irq = gsi;
|
||||
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;
|
||||
} else {
|
||||
printk(KERN_ERR "GSI %u is too high\n", gsi);
|
||||
|
@ -31,6 +31,7 @@
|
||||
#include <linux/nodemask.h>
|
||||
#include <asm/numaq.h>
|
||||
#include <asm/topology.h>
|
||||
#include <asm/processor.h>
|
||||
|
||||
#define MB_TO_PAGES(addr) ((addr) << (20 - PAGE_SHIFT))
|
||||
|
||||
@ -77,3 +78,11 @@ int __init get_memcfg_numaq(void)
|
||||
smp_dump_qct();
|
||||
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 */
|
||||
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
|
||||
* 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)
|
||||
{
|
||||
/* 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)
|
||||
{
|
||||
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;
|
||||
asm volatile(
|
||||
"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;
|
||||
}
|
||||
/************************ timer, work, DIAG <END> ****************************/
|
||||
|
@ -1,7 +1,7 @@
|
||||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.12-rc3
|
||||
# Fri Apr 22 15:30:58 2005
|
||||
# Linux kernel version: 2.6.13-rc4
|
||||
# Fri Jul 29 14:49:30 2005
|
||||
#
|
||||
CONFIG_MMU=y
|
||||
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
|
||||
@ -23,10 +23,11 @@ CONFIG_INIT_ENV_ARG_LIMIT=32
|
||||
CONFIG_LOCALVERSION=""
|
||||
CONFIG_SWAP=y
|
||||
CONFIG_SYSVIPC=y
|
||||
# CONFIG_POSIX_MQUEUE is not set
|
||||
CONFIG_POSIX_MQUEUE=y
|
||||
# CONFIG_BSD_PROCESS_ACCT is not set
|
||||
CONFIG_SYSCTL=y
|
||||
# CONFIG_AUDIT is not set
|
||||
CONFIG_AUDIT=y
|
||||
# CONFIG_AUDITSYSCALL is not set
|
||||
CONFIG_HOTPLUG=y
|
||||
CONFIG_KOBJECT_UEVENT=y
|
||||
CONFIG_IKCONFIG=y
|
||||
@ -36,6 +37,8 @@ CONFIG_IKCONFIG_PROC=y
|
||||
CONFIG_KALLSYMS=y
|
||||
# CONFIG_KALLSYMS_ALL is not set
|
||||
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
||||
CONFIG_PRINTK=y
|
||||
CONFIG_BUG=y
|
||||
CONFIG_BASE_FULL=y
|
||||
CONFIG_FUTEX=y
|
||||
CONFIG_EPOLL=y
|
||||
@ -51,9 +54,10 @@ CONFIG_BASE_SMALL=0
|
||||
# Loadable module support
|
||||
#
|
||||
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_MODVERSIONS is not set
|
||||
CONFIG_MODVERSIONS=y
|
||||
# CONFIG_MODULE_SRCVERSION_ALL is not set
|
||||
CONFIG_KMOD=y
|
||||
CONFIG_STOP_MACHINE=y
|
||||
@ -81,8 +85,15 @@ CONFIG_MARCH_G5=y
|
||||
# CONFIG_MARCH_Z990 is not set
|
||||
CONFIG_PACK_STACK=y
|
||||
# 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_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
|
||||
@ -95,7 +106,7 @@ CONFIG_QDIO=y
|
||||
#
|
||||
# Misc
|
||||
#
|
||||
# CONFIG_PREEMPT is not set
|
||||
CONFIG_PREEMPT=y
|
||||
CONFIG_IPL=y
|
||||
# CONFIG_IPL_TAPE is not set
|
||||
CONFIG_IPL_VM=y
|
||||
@ -105,9 +116,110 @@ CONFIG_BINFMT_MISC=m
|
||||
CONFIG_PFAULT=y
|
||||
# CONFIG_SHARED_KERNEL 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_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
|
||||
|
||||
#
|
||||
@ -133,6 +245,7 @@ CONFIG_CHR_DEV_ST=y
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_CHR_DEV_SG=y
|
||||
# CONFIG_CHR_DEV_SCH is not set
|
||||
|
||||
#
|
||||
# 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_MULTIPATH=m
|
||||
# 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
|
||||
@ -231,7 +350,8 @@ CONFIG_CCW_CONSOLE=y
|
||||
CONFIG_SCLP=y
|
||||
CONFIG_SCLP_TTY=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_S390_TAPE=m
|
||||
|
||||
@ -255,105 +375,8 @@ CONFIG_S390_TAPE_34XX=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_DUMMY=m
|
||||
CONFIG_BONDING=m
|
||||
@ -411,12 +434,15 @@ CONFIG_CCWGROUP=y
|
||||
# CONFIG_SLIP is not set
|
||||
# CONFIG_SHAPER is not set
|
||||
# CONFIG_NETCONSOLE is not set
|
||||
# CONFIG_NETPOLL is not set
|
||||
# CONFIG_NET_POLL_CONTROLLER is not set
|
||||
|
||||
#
|
||||
# File systems
|
||||
#
|
||||
CONFIG_EXT2_FS=y
|
||||
# CONFIG_EXT2_FS_XATTR is not set
|
||||
# CONFIG_EXT2_FS_XIP is not set
|
||||
CONFIG_EXT3_FS=y
|
||||
CONFIG_EXT3_FS_XATTR=y
|
||||
# CONFIG_EXT3_FS_POSIX_ACL is not set
|
||||
@ -426,6 +452,7 @@ CONFIG_JBD=y
|
||||
CONFIG_FS_MBCACHE=y
|
||||
# CONFIG_REISERFS_FS is not set
|
||||
# CONFIG_JFS_FS is not set
|
||||
# CONFIG_FS_POSIX_ACL is not set
|
||||
|
||||
#
|
||||
# XFS support
|
||||
@ -433,6 +460,7 @@ CONFIG_FS_MBCACHE=y
|
||||
# CONFIG_XFS_FS is not set
|
||||
# CONFIG_MINIX_FS is not set
|
||||
# CONFIG_ROMFS_FS is not set
|
||||
CONFIG_INOTIFY=y
|
||||
# CONFIG_QUOTA is not set
|
||||
CONFIG_DNOTIFY=y
|
||||
# CONFIG_AUTOFS_FS is not set
|
||||
@ -457,7 +485,6 @@ CONFIG_DNOTIFY=y
|
||||
CONFIG_PROC_FS=y
|
||||
CONFIG_PROC_KCORE=y
|
||||
CONFIG_SYSFS=y
|
||||
# CONFIG_DEVFS_FS is not set
|
||||
# CONFIG_DEVPTS_FS_XATTR is not set
|
||||
CONFIG_TMPFS=y
|
||||
# CONFIG_TMPFS_XATTR is not set
|
||||
@ -486,15 +513,18 @@ CONFIG_RAMFS=y
|
||||
#
|
||||
CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V3=y
|
||||
# CONFIG_NFS_V3_ACL is not set
|
||||
# CONFIG_NFS_V4 is not set
|
||||
# CONFIG_NFS_DIRECTIO is not set
|
||||
CONFIG_NFSD=y
|
||||
CONFIG_NFSD_V3=y
|
||||
# CONFIG_NFSD_V3_ACL is not set
|
||||
# CONFIG_NFSD_V4 is not set
|
||||
CONFIG_NFSD_TCP=y
|
||||
CONFIG_LOCKD=y
|
||||
CONFIG_LOCKD_V4=y
|
||||
CONFIG_EXPORTFS=y
|
||||
CONFIG_NFS_COMMON=y
|
||||
CONFIG_SUNRPC=y
|
||||
# CONFIG_RPCSEC_GSS_KRB5 is not set
|
||||
# CONFIG_RPCSEC_GSS_SPKM3 is not set
|
||||
@ -544,11 +574,12 @@ CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_LOG_BUF_SHIFT=17
|
||||
# CONFIG_SCHEDSTATS is not set
|
||||
# CONFIG_DEBUG_SLAB is not set
|
||||
CONFIG_DEBUG_PREEMPT=y
|
||||
# CONFIG_DEBUG_SPINLOCK is not set
|
||||
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
|
||||
# CONFIG_DEBUG_KOBJECT is not set
|
||||
# CONFIG_DEBUG_INFO is not set
|
||||
# CONFIG_DEBUG_FS is not set
|
||||
CONFIG_DEBUG_FS=y
|
||||
|
||||
#
|
||||
# Security options
|
||||
|
@ -346,6 +346,13 @@ iplstart:
|
||||
la %r2,.Lreset
|
||||
lhi %r3,26
|
||||
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
|
||||
.Lwaitrdrirq:
|
||||
lpsw .Lrdrwaitpsw
|
||||
|
@ -345,6 +345,13 @@ iplstart:
|
||||
la %r2,.Lreset
|
||||
lhi %r3,26
|
||||
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
|
||||
.Lwaitrdrirq:
|
||||
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)
|
||||
|
||||
targets := pcap_kern.o pcap_user.o
|
||||
|
||||
$(obj)/pcap.o: $(obj)/pcap_kern.o $(obj)/pcap_user.o
|
||||
$(LD) -r -dp -o $@ $^ $(LDFLAGS) $(LDFLAGS_pcap.o)
|
||||
#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)
|
||||
|
||||
# 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-$(CONFIG_SSL) += ssl.o
|
||||
|
@ -557,7 +557,7 @@ static int create_proc_mconsole(void)
|
||||
|
||||
ent = create_proc_entry("mconsole", S_IFREG | 0200, 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);
|
||||
}
|
||||
|
||||
|
@ -48,7 +48,7 @@ static int make_proc_exitcode(void)
|
||||
|
||||
ent = create_proc_entry("exitcode", 0600, &proc_root);
|
||||
if(ent == NULL){
|
||||
printk("make_proc_exitcode : Failed to register "
|
||||
printk(KERN_WARNING "make_proc_exitcode : Failed to register "
|
||||
"/proc/exitcode\n");
|
||||
return(0);
|
||||
}
|
||||
|
@ -131,7 +131,7 @@ int start_fork_tramp(void *thread_arg, unsigned long temp_stack,
|
||||
return(arg.pid);
|
||||
}
|
||||
|
||||
static int ptrace_child(void)
|
||||
static int ptrace_child(void *arg)
|
||||
{
|
||||
int ret;
|
||||
int pid = os_getpid(), ppid = getppid();
|
||||
@ -160,16 +160,20 @@ static int ptrace_child(void)
|
||||
_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;
|
||||
|
||||
pid = fork();
|
||||
if(pid == 0)
|
||||
ptrace_child();
|
||||
|
||||
stack = mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE | PROT_EXEC,
|
||||
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
|
||||
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)
|
||||
panic("check_ptrace : fork failed, errno = %d", errno);
|
||||
panic("check_ptrace : clone failed, errno = %d", errno);
|
||||
CATCH_EINTR(n = waitpid(pid, &status, WUNTRACED));
|
||||
if(n < 0)
|
||||
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",
|
||||
status);
|
||||
|
||||
*stack_out = stack;
|
||||
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.
|
||||
* So only for SYSEMU features we test mustpanic, while normal host features
|
||||
* 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;
|
||||
|
||||
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));
|
||||
if(!WIFEXITED(status) || (WEXITSTATUS(status) != exitcode)) {
|
||||
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 "
|
||||
"expecting %d; status 0x%x", exit_with,
|
||||
exitcode, status);
|
||||
if (mustexit)
|
||||
if (mustpanic)
|
||||
panic("\n");
|
||||
else
|
||||
printk("\n");
|
||||
ret = -1;
|
||||
}
|
||||
|
||||
if(munmap(stack, PAGE_SIZE) < 0)
|
||||
panic("check_ptrace : munmap failed, errno = %d", errno);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -242,11 +249,12 @@ __uml_setup("nosysemu", nosysemu_cmd_param,
|
||||
|
||||
static void __init check_sysemu(void)
|
||||
{
|
||||
void *stack;
|
||||
int pid, syscall, n, status, count=0;
|
||||
|
||||
printk("Checking syscall emulation patch for ptrace...");
|
||||
sysemu_supported = 0;
|
||||
pid = start_ptraced_child();
|
||||
pid = start_ptraced_child(&stack);
|
||||
|
||||
if(ptrace(PTRACE_SYSEMU, pid, 0, 0) < 0)
|
||||
goto fail;
|
||||
@ -264,7 +272,7 @@ static void __init check_sysemu(void)
|
||||
panic("check_sysemu : failed to modify system "
|
||||
"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;
|
||||
|
||||
sysemu_supported = 1;
|
||||
@ -272,7 +280,7 @@ static void __init check_sysemu(void)
|
||||
set_using_sysemu(!force_sysemu_disabled);
|
||||
|
||||
printk("Checking advanced syscall emulation patch for ptrace...");
|
||||
pid = start_ptraced_child();
|
||||
pid = start_ptraced_child(&stack);
|
||||
while(1){
|
||||
count++;
|
||||
if(ptrace(PTRACE_SYSEMU_SINGLESTEP, pid, 0, 0) < 0)
|
||||
@ -297,7 +305,7 @@ static void __init check_sysemu(void)
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (stop_ptraced_child(pid, 0, 0) < 0)
|
||||
if (stop_ptraced_child(pid, stack, 0, 0) < 0)
|
||||
goto fail_stopped;
|
||||
|
||||
sysemu_supported = 2;
|
||||
@ -308,17 +316,18 @@ static void __init check_sysemu(void)
|
||||
return;
|
||||
|
||||
fail:
|
||||
stop_ptraced_child(pid, 1, 0);
|
||||
stop_ptraced_child(pid, stack, 1, 0);
|
||||
fail_stopped:
|
||||
printk("missing\n");
|
||||
}
|
||||
|
||||
void __init check_ptrace(void)
|
||||
{
|
||||
void *stack;
|
||||
int pid, syscall, n, status;
|
||||
|
||||
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)
|
||||
panic("check_ptrace: PTRACE_SETOPTIONS failed, errno = %d", errno);
|
||||
@ -345,7 +354,7 @@ void __init check_ptrace(void)
|
||||
break;
|
||||
}
|
||||
}
|
||||
stop_ptraced_child(pid, 0, 1);
|
||||
stop_ptraced_child(pid, stack, 0, 1);
|
||||
printk("OK\n");
|
||||
check_sysemu();
|
||||
}
|
||||
@ -380,10 +389,11 @@ extern void *__syscall_stub_start, __syscall_stub_end;
|
||||
static inline void check_skas3_ptrace_support(void)
|
||||
{
|
||||
struct ptrace_faultinfo fi;
|
||||
void *stack;
|
||||
int pid, n;
|
||||
|
||||
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);
|
||||
if (n < 0) {
|
||||
@ -402,7 +412,7 @@ static inline void check_skas3_ptrace_support(void)
|
||||
}
|
||||
|
||||
init_registers(pid);
|
||||
stop_ptraced_child(pid, 1, 1);
|
||||
stop_ptraced_child(pid, stack, 1, 1);
|
||||
}
|
||||
|
||||
int can_do_skas(void)
|
||||
|
@ -412,7 +412,7 @@ int __init make_proc_sysemu(void)
|
||||
|
||||
if (ent == NULL)
|
||||
{
|
||||
printk("Failed to register /proc/sysemu\n");
|
||||
printk(KERN_WARNING "Failed to register /proc/sysemu\n");
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
@ -64,7 +64,7 @@ void wait_stub_done(int pid, int sig, char * fname)
|
||||
(WSTOPSIG(status) == SIGVTALRM));
|
||||
|
||||
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, "
|
||||
"pid = %d, n = %d, errno = %d, status = 0x%x\n",
|
||||
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) ||
|
||||
(sig == SIGILL) || (sig == SIGTRAP));
|
||||
|
||||
regs->skas.is_user = 1;
|
||||
if (segv)
|
||||
get_skas_faultinfo(pid, ®s->skas.faultinfo);
|
||||
info = &sig_info[sig];
|
||||
|
@ -137,7 +137,10 @@ long um_stime(int __user *tptr)
|
||||
void timer_handler(int sig, union uml_pt_regs *regs)
|
||||
{
|
||||
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();
|
||||
if(current_thread->cpu == 0)
|
||||
timer_irq(regs);
|
||||
|
@ -9,9 +9,10 @@
|
||||
*/
|
||||
#include <elf.h>
|
||||
#include <stddef.h>
|
||||
#include <asm/elf.h>
|
||||
#include "init.h"
|
||||
#include "elf_user.h"
|
||||
#include <asm/elf.h>
|
||||
#include "mem_user.h"
|
||||
|
||||
#if ELF_CLASS == ELFCLASS32
|
||||
typedef Elf32_auxv_t elf_auxv_t;
|
||||
@ -41,6 +42,9 @@ __init void scan_elf_aux( char **envp)
|
||||
break;
|
||||
case AT_SYSINFO_EHDR:
|
||||
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;
|
||||
case AT_HWCAP:
|
||||
elf_aux_hwcap = auxv->a_un.a_val;
|
||||
|
@ -83,6 +83,9 @@ EXPORT_SYMBOL_PROTO(statfs64);
|
||||
|
||||
EXPORT_SYMBOL_PROTO(getuid);
|
||||
|
||||
EXPORT_SYMBOL_PROTO(fsync);
|
||||
EXPORT_SYMBOL_PROTO(fdatasync);
|
||||
|
||||
/*
|
||||
* Overrides for Emacs so that we follow Linus's tabbing style.
|
||||
* 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 %%eax, %%ebx ; movl %0, %%eax ; movl %1, %%ecx ;"
|
||||
"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
|
||||
* hand.
|
||||
*/
|
||||
__asm__("popl %%eax ; popl %%eax ; popl %%eax ; movl %0, %%eax ; "
|
||||
"int $0x80" : : "g" (__NR_sigreturn));
|
||||
__asm__("mov %0,%%esp ; movl %1, %%eax ; "
|
||||
"int $0x80" : : "a" (sc), "g" (__NR_sigreturn));
|
||||
}
|
||||
|
@ -329,12 +329,15 @@ config HPET_EMULATE_RTC
|
||||
|
||||
config GART_IOMMU
|
||||
bool "IOMMU support"
|
||||
default y
|
||||
depends on PCI
|
||||
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
|
||||
Cycle). The IOMMU can be turned off at runtime with the iommu=off parameter.
|
||||
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.
|
||||
|
||||
# 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 $
|
||||
|
||||
#
|
||||
# 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
|
||||
OBJCOPYFLAGS := -O binary -R .note -R .comment -S
|
||||
LDFLAGS_vmlinux :=
|
||||
|
@ -1,7 +1,7 @@
|
||||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.12-rc4
|
||||
# Fri May 13 06:39:11 2005
|
||||
# Linux kernel version: 2.6.13-rc3
|
||||
# Fri Jul 22 16:47:31 2005
|
||||
#
|
||||
CONFIG_X86_64=y
|
||||
CONFIG_64BIT=y
|
||||
@ -84,14 +84,27 @@ CONFIG_X86_IO_APIC=y
|
||||
CONFIG_X86_LOCAL_APIC=y
|
||||
CONFIG_MTRR=y
|
||||
CONFIG_SMP=y
|
||||
# CONFIG_PREEMPT is not set
|
||||
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_NUMA_EMU is not set
|
||||
CONFIG_DISCONTIGMEM=y
|
||||
CONFIG_ARCH_DISCONTIGMEM_ENABLE=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_NR_CPUS=8
|
||||
CONFIG_NR_CPUS=32
|
||||
CONFIG_HPET_TIMER=y
|
||||
CONFIG_X86_PM_TIMER=y
|
||||
CONFIG_HPET_EMULATE_RTC=y
|
||||
@ -99,7 +112,13 @@ CONFIG_GART_IOMMU=y
|
||||
CONFIG_SWIOTLB=y
|
||||
CONFIG_X86_MCE=y
|
||||
CONFIG_X86_MCE_INTEL=y
|
||||
CONFIG_PHYSICAL_START=0x100000
|
||||
# CONFIG_KEXEC is not set
|
||||
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_IRQ_PROBE=y
|
||||
CONFIG_ISA_DMA_API=y
|
||||
@ -118,12 +137,11 @@ CONFIG_PM_STD_PARTITION=""
|
||||
CONFIG_ACPI=y
|
||||
CONFIG_ACPI_BOOT=y
|
||||
CONFIG_ACPI_INTERPRETER=y
|
||||
CONFIG_ACPI_SLEEP=y
|
||||
CONFIG_ACPI_SLEEP_PROC_FS=y
|
||||
CONFIG_ACPI_AC=y
|
||||
CONFIG_ACPI_BATTERY=y
|
||||
CONFIG_ACPI_BUTTON=y
|
||||
# CONFIG_ACPI_VIDEO is not set
|
||||
CONFIG_ACPI_HOTKEY=m
|
||||
CONFIG_ACPI_FAN=y
|
||||
CONFIG_ACPI_PROCESSOR=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_USERSPACE=y
|
||||
CONFIG_CPU_FREQ_GOV_ONDEMAND=y
|
||||
# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set
|
||||
|
||||
#
|
||||
# CPUFreq processor drivers
|
||||
@ -203,6 +222,76 @@ CONFIG_COMPAT=y
|
||||
CONFIG_SYSVIPC_COMPAT=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
|
||||
#
|
||||
@ -308,6 +397,7 @@ CONFIG_BLK_DEV_AMD74XX=y
|
||||
# CONFIG_BLK_DEV_HPT366 is not set
|
||||
# CONFIG_BLK_DEV_SC1200 is not set
|
||||
CONFIG_BLK_DEV_PIIX=y
|
||||
# CONFIG_BLK_DEV_IT821X is not set
|
||||
# CONFIG_BLK_DEV_NS87415 is not set
|
||||
# CONFIG_BLK_DEV_PDC202XX_OLD is not set
|
||||
CONFIG_BLK_DEV_PDC202XX_NEW=y
|
||||
@ -338,6 +428,7 @@ CONFIG_BLK_DEV_SD=y
|
||||
# CONFIG_CHR_DEV_OSST is not set
|
||||
# CONFIG_BLK_DEV_SR 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
|
||||
@ -372,7 +463,6 @@ CONFIG_AIC79XX_DEBUG_MASK=0
|
||||
# CONFIG_MEGARAID_NEWGEN is not set
|
||||
# CONFIG_MEGARAID_LEGACY is not set
|
||||
CONFIG_SCSI_SATA=y
|
||||
# CONFIG_SCSI_SATA_AHCI is not set
|
||||
# CONFIG_SCSI_SATA_SVW is not set
|
||||
CONFIG_SCSI_ATA_PIIX=y
|
||||
# CONFIG_SCSI_SATA_NV is not set
|
||||
@ -410,14 +500,21 @@ CONFIG_SCSI_QLA2XXX=y
|
||||
#
|
||||
# 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
|
||||
#
|
||||
CONFIG_FUSION=y
|
||||
CONFIG_FUSION_MAX_SGE=40
|
||||
# CONFIG_FUSION_CTL is not set
|
||||
# CONFIG_FUSION is not set
|
||||
# CONFIG_FUSION_SPI is not set
|
||||
# CONFIG_FUSION_FC is not set
|
||||
|
||||
#
|
||||
# IEEE 1394 (FireWire) support
|
||||
@ -430,75 +527,8 @@ CONFIG_FUSION_MAX_SGE=40
|
||||
# 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_DUMMY is not set
|
||||
# CONFIG_BONDING is not set
|
||||
@ -517,7 +547,9 @@ CONFIG_NET_ETHERNET=y
|
||||
CONFIG_MII=y
|
||||
# CONFIG_HAPPYMEAL 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
|
||||
@ -532,7 +564,7 @@ CONFIG_NET_PCI=y
|
||||
CONFIG_FORCEDETH=y
|
||||
# CONFIG_DGRS is not set
|
||||
# CONFIG_EEPRO100 is not set
|
||||
# CONFIG_E100 is not set
|
||||
CONFIG_E100=y
|
||||
# CONFIG_FEALNX is not set
|
||||
# CONFIG_NATSEMI is not set
|
||||
# CONFIG_NE2K_PCI is not set
|
||||
@ -553,14 +585,15 @@ CONFIG_8139TOO=y
|
||||
# CONFIG_ACENIC is not set
|
||||
# CONFIG_DL2K is not set
|
||||
CONFIG_E1000=y
|
||||
# CONFIG_E1000_NAPI is not set
|
||||
# CONFIG_NS83820 is not set
|
||||
# CONFIG_HAMACHI is not set
|
||||
# CONFIG_YELLOWFIN is not set
|
||||
# CONFIG_R8169 is not set
|
||||
# CONFIG_SKGE is not set
|
||||
# CONFIG_SK98LIN is not set
|
||||
# CONFIG_VIA_VELOCITY is not set
|
||||
CONFIG_TIGON3=y
|
||||
# CONFIG_BNX2 is not set
|
||||
|
||||
#
|
||||
# Ethernet (10000 Mbit)
|
||||
@ -647,7 +680,6 @@ CONFIG_SERIO_I8042=y
|
||||
CONFIG_SERIO_LIBPS2=y
|
||||
# CONFIG_SERIO_RAW is not set
|
||||
# CONFIG_GAMEPORT is not set
|
||||
CONFIG_SOUND_GAMEPORT=y
|
||||
|
||||
#
|
||||
# Character devices
|
||||
@ -716,12 +748,19 @@ CONFIG_MAX_RAW_DEVS=256
|
||||
# I2C support
|
||||
#
|
||||
# CONFIG_I2C is not set
|
||||
# CONFIG_I2C_SENSOR is not set
|
||||
|
||||
#
|
||||
# Dallas's 1-wire bus
|
||||
#
|
||||
# CONFIG_W1 is not set
|
||||
|
||||
#
|
||||
# Hardware Monitoring support
|
||||
#
|
||||
CONFIG_HWMON=y
|
||||
# CONFIG_HWMON_DEBUG_CHIP is not set
|
||||
|
||||
#
|
||||
# Misc devices
|
||||
#
|
||||
@ -808,6 +847,7 @@ CONFIG_USB_DEVICEFS=y
|
||||
CONFIG_USB_EHCI_HCD=y
|
||||
# CONFIG_USB_EHCI_SPLIT_ISO 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_BIG_ENDIAN is not set
|
||||
CONFIG_USB_OHCI_LITTLE_ENDIAN=y
|
||||
@ -846,12 +886,15 @@ CONFIG_USB_HIDINPUT=y
|
||||
# CONFIG_USB_HIDDEV is not set
|
||||
# CONFIG_USB_AIPTEK is not set
|
||||
# CONFIG_USB_WACOM is not set
|
||||
# CONFIG_USB_ACECAD is not set
|
||||
# CONFIG_USB_KBTAB is not set
|
||||
# CONFIG_USB_POWERMATE is not set
|
||||
# CONFIG_USB_MTOUCH is not set
|
||||
# CONFIG_USB_ITMTOUCH is not set
|
||||
# CONFIG_USB_EGALAX is not set
|
||||
# CONFIG_USB_XPAD is not set
|
||||
# CONFIG_USB_ATI_REMOTE is not set
|
||||
# CONFIG_USB_KEYSPAN_REMOTE is not set
|
||||
|
||||
#
|
||||
# USB Imaging devices
|
||||
@ -902,10 +945,11 @@ CONFIG_USB_MON=y
|
||||
# CONFIG_USB_PHIDGETSERVO is not set
|
||||
# CONFIG_USB_IDMOUSE is not set
|
||||
# CONFIG_USB_SISUSBVGA is not set
|
||||
# CONFIG_USB_LD 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
|
||||
|
||||
#
|
||||
# SN Devices
|
||||
#
|
||||
|
||||
#
|
||||
# Firmware Drivers
|
||||
#
|
||||
@ -935,6 +983,7 @@ CONFIG_EXT2_FS=y
|
||||
CONFIG_EXT2_FS_XATTR=y
|
||||
CONFIG_EXT2_FS_POSIX_ACL=y
|
||||
# CONFIG_EXT2_FS_SECURITY is not set
|
||||
# CONFIG_EXT2_FS_XIP is not set
|
||||
CONFIG_EXT3_FS=y
|
||||
CONFIG_EXT3_FS_XATTR=y
|
||||
CONFIG_EXT3_FS_POSIX_ACL=y
|
||||
@ -957,6 +1006,7 @@ CONFIG_FS_POSIX_ACL=y
|
||||
# CONFIG_XFS_FS is not set
|
||||
# CONFIG_MINIX_FS is not set
|
||||
# CONFIG_ROMFS_FS is not set
|
||||
CONFIG_INOTIFY=y
|
||||
# CONFIG_QUOTA is not set
|
||||
CONFIG_DNOTIFY=y
|
||||
CONFIG_AUTOFS_FS=y
|
||||
@ -986,7 +1036,6 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
|
||||
CONFIG_PROC_FS=y
|
||||
CONFIG_PROC_KCORE=y
|
||||
CONFIG_SYSFS=y
|
||||
# CONFIG_DEVFS_FS is not set
|
||||
# CONFIG_DEVPTS_FS_XATTR is not set
|
||||
CONFIG_TMPFS=y
|
||||
# CONFIG_TMPFS_XATTR is not set
|
||||
@ -1016,15 +1065,18 @@ CONFIG_RAMFS=y
|
||||
#
|
||||
CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V3=y
|
||||
# CONFIG_NFS_V3_ACL is not set
|
||||
# CONFIG_NFS_V4 is not set
|
||||
# CONFIG_NFS_DIRECTIO is not set
|
||||
CONFIG_NFSD=y
|
||||
CONFIG_NFSD_V3=y
|
||||
# CONFIG_NFSD_V3_ACL is not set
|
||||
# CONFIG_NFSD_V4 is not set
|
||||
CONFIG_NFSD_TCP=y
|
||||
CONFIG_LOCKD=y
|
||||
CONFIG_LOCKD_V4=y
|
||||
CONFIG_EXPORTFS=y
|
||||
CONFIG_NFS_COMMON=y
|
||||
CONFIG_SUNRPC=y
|
||||
# CONFIG_RPCSEC_GSS_KRB5 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 \
|
||||
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
|
||||
obj-$(CONFIG_IA32_EMULATION) += $(sysv-y)
|
||||
|
||||
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)
|
||||
|
||||
# Teach kbuild about targets
|
||||
|
@ -14,16 +14,6 @@
|
||||
#include <asm/tlbflush.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_sysenter[], syscall32_sysenter_end[];
|
||||
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
|
||||
/* push in order ss, rsp, eflags, cs, rip */
|
||||
xorq %rax, %rax
|
||||
xorl %eax, %eax
|
||||
pushq %rax /* ss */
|
||||
CFI_ADJUST_CFA_OFFSET 8
|
||||
pushq %rax /* rsp */
|
||||
@ -423,7 +423,7 @@ ENTRY(stub_rt_sigreturn)
|
||||
testl $3,CS(%rdi)
|
||||
je 1f
|
||||
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
|
||||
cmoveq %rax,%rsp
|
||||
pushq %rdi # save old stack
|
||||
@ -436,7 +436,7 @@ ENTRY(common_interrupt)
|
||||
ret_from_intr:
|
||||
popq %rdi
|
||||
cli
|
||||
subl $1,%gs:pda_irqcount
|
||||
decl %gs:pda_irqcount
|
||||
#ifdef CONFIG_DEBUG_INFO
|
||||
movq RBP(%rdi),%rbp
|
||||
#endif
|
||||
@ -494,7 +494,7 @@ retint_signal:
|
||||
sti
|
||||
SAVE_REST
|
||||
movq $-1,ORIG_RAX(%rsp)
|
||||
xorq %rsi,%rsi # oldset
|
||||
xorl %esi,%esi # oldset
|
||||
movq %rsp,%rdi # &pt_regs
|
||||
call do_notify_resume
|
||||
RESTORE_REST
|
||||
@ -752,7 +752,7 @@ child_rip:
|
||||
movq %rsi, %rdi
|
||||
call *%rax
|
||||
# exit
|
||||
xorq %rdi, %rdi
|
||||
xorl %edi, %edi
|
||||
call do_exit
|
||||
|
||||
/*
|
||||
@ -918,3 +918,15 @@ ENTRY(machine_check)
|
||||
ENTRY(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_flat;
|
||||
extern struct genapic apic_physflat;
|
||||
|
||||
struct genapic *genapic = &apic_flat;
|
||||
|
||||
@ -44,12 +45,7 @@ void __init clustered_apic_check(void)
|
||||
u8 clusters, max_cluster;
|
||||
u8 id;
|
||||
u8 cluster_cnt[NUM_APIC_CLUSTERS];
|
||||
|
||||
if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD) {
|
||||
/* AMD always uses flat mode right now */
|
||||
genapic = &apic_flat;
|
||||
goto print;
|
||||
}
|
||||
int num_cpus = 0;
|
||||
|
||||
#if defined(CONFIG_ACPI_BUS)
|
||||
/*
|
||||
@ -64,15 +60,34 @@ void __init clustered_apic_check(void)
|
||||
#endif
|
||||
|
||||
memset(cluster_cnt, 0, sizeof(cluster_cnt));
|
||||
|
||||
for (i = 0; i < NR_CPUS; i++) {
|
||||
id = bios_cpu_apicid[i];
|
||||
if (id != BAD_APICID)
|
||||
cluster_cnt[APIC_CLUSTERID(id)]++;
|
||||
if (id == BAD_APICID)
|
||||
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;
|
||||
max_cluster = 0;
|
||||
|
||||
for (i = 0; i < NUM_APIC_CLUSTERS; i++) {
|
||||
if (cluster_cnt[i] > 0) {
|
||||
++clusters;
|
||||
|
@ -2,13 +2,11 @@
|
||||
* Copyright 2004 James Cleverdon, IBM.
|
||||
* 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
|
||||
* Martin Bligh, Andi Kleen, James Bottomley, John Stultz, and
|
||||
* James Cleverdon.
|
||||
* Ashok Raj <ashok.raj@intel.com>
|
||||
* Removed IPI broadcast shortcut to support CPU hotplug
|
||||
*/
|
||||
#include <linux/config.h>
|
||||
#include <linux/threads.h>
|
||||
@ -20,47 +18,6 @@
|
||||
#include <asm/smp.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)
|
||||
{
|
||||
return cpu_online_map;
|
||||
@ -119,37 +76,15 @@ static void flat_send_IPI_mask(cpumask_t cpumask, int vector)
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
__local_flat_send_IPI_all(vector);
|
||||
__send_IPI_shortcut(APIC_DEST_ALLINC, vector, APIC_DEST_LOGICAL);
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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 = {
|
||||
.name = "flat",
|
||||
.int_delivery_mode = dest_LowestPrio,
|
||||
@ -195,11 +120,62 @@ struct genapic apic_flat = {
|
||||
.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" :
|
||||
"Shortcut");
|
||||
return 0;
|
||||
return cpumask_of_cpu(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
|
||||
|
||||
/* Setup cr0 */
|
||||
xorq %rax, %rax
|
||||
btsq $31, %rax /* Enable paging */
|
||||
btsq $0, %rax /* Enable protected mode */
|
||||
btsq $1, %rax /* Enable MP */
|
||||
btsq $4, %rax /* Enable ET */
|
||||
btsq $5, %rax /* Enable NE */
|
||||
btsq $16, %rax /* Enable WP */
|
||||
btsq $18, %rax /* Enable AM */
|
||||
#define CR0_PM 1 /* protected mode */
|
||||
#define CR0_MP (1<<1)
|
||||
#define CR0_ET (1<<4)
|
||||
#define CR0_NE (1<<5)
|
||||
#define CR0_WP (1<<16)
|
||||
#define CR0_AM (1<<18)
|
||||
#define CR0_PAGING (1<<31)
|
||||
movl $CR0_PM|CR0_MP|CR0_ET|CR0_NE|CR0_WP|CR0_AM|CR0_PAGING,%eax
|
||||
/* Make changes effective */
|
||||
movq %rax, %cr0
|
||||
|
||||
|
@ -135,3 +135,22 @@ void fixup_irqs(cpumask_t map)
|
||||
local_irq_disable();
|
||||
}
|
||||
#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/kexec.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/reboot.h>
|
||||
#include <asm/pda.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/pgalloc.h>
|
||||
#include <asm/tlbflush.h>
|
||||
#include <asm/mmu_context.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/apic.h>
|
||||
#include <asm/cpufeature.h>
|
||||
#include <asm/hw_irq.h>
|
||||
|
||||
#define LEVEL0_SIZE (1UL << 12UL)
|
||||
#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)
|
||||
static void init_level2_page(pmd_t *level2p, unsigned long addr)
|
||||
{
|
||||
unsigned long end_addr;
|
||||
|
||||
addr &= PAGE_MASK;
|
||||
end_addr = addr + LEVEL2_SIZE;
|
||||
end_addr = addr + PUD_SIZE;
|
||||
while (addr < end_addr) {
|
||||
*(level2p++) = addr | L1_ATTR;
|
||||
addr += LEVEL1_SIZE;
|
||||
set_pmd(level2p++, __pmd(addr | __PAGE_KERNEL_LARGE_EXEC));
|
||||
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 end_addr;
|
||||
@ -52,32 +35,32 @@ static int init_level3_page(struct kimage *image, u64 *level3p,
|
||||
|
||||
result = 0;
|
||||
addr &= PAGE_MASK;
|
||||
end_addr = addr + LEVEL3_SIZE;
|
||||
end_addr = addr + PGDIR_SIZE;
|
||||
while ((addr < last_addr) && (addr < end_addr)) {
|
||||
struct page *page;
|
||||
u64 *level2p;
|
||||
pmd_t *level2p;
|
||||
|
||||
page = kimage_alloc_control_pages(image, 0);
|
||||
if (!page) {
|
||||
result = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
level2p = (u64 *)page_address(page);
|
||||
level2p = (pmd_t *)page_address(page);
|
||||
init_level2_page(level2p, addr);
|
||||
*(level3p++) = __pa(level2p) | L2_ATTR;
|
||||
addr += LEVEL2_SIZE;
|
||||
set_pud(level3p++, __pud(__pa(level2p) | _KERNPG_TABLE));
|
||||
addr += PUD_SIZE;
|
||||
}
|
||||
/* clear the unused entries */
|
||||
while (addr < end_addr) {
|
||||
*(level3p++) = 0;
|
||||
addr += LEVEL2_SIZE;
|
||||
pud_clear(level3p++);
|
||||
addr += PUD_SIZE;
|
||||
}
|
||||
out:
|
||||
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 end_addr;
|
||||
@ -85,28 +68,28 @@ static int init_level4_page(struct kimage *image, u64 *level4p,
|
||||
|
||||
result = 0;
|
||||
addr &= PAGE_MASK;
|
||||
end_addr = addr + LEVEL4_SIZE;
|
||||
end_addr = addr + (PTRS_PER_PGD * PGDIR_SIZE);
|
||||
while ((addr < last_addr) && (addr < end_addr)) {
|
||||
struct page *page;
|
||||
u64 *level3p;
|
||||
pud_t *level3p;
|
||||
|
||||
page = kimage_alloc_control_pages(image, 0);
|
||||
if (!page) {
|
||||
result = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
level3p = (u64 *)page_address(page);
|
||||
level3p = (pud_t *)page_address(page);
|
||||
result = init_level3_page(image, level3p, addr, last_addr);
|
||||
if (result) {
|
||||
goto out;
|
||||
}
|
||||
*(level4p++) = __pa(level3p) | L3_ATTR;
|
||||
addr += LEVEL3_SIZE;
|
||||
set_pgd(level4p++, __pgd(__pa(level3p) | _KERNPG_TABLE));
|
||||
addr += PGDIR_SIZE;
|
||||
}
|
||||
/* clear the unused entries */
|
||||
while (addr < end_addr) {
|
||||
*(level4p++) = 0;
|
||||
addr += LEVEL3_SIZE;
|
||||
pgd_clear(level4p++);
|
||||
addr += PGDIR_SIZE;
|
||||
}
|
||||
out:
|
||||
return result;
|
||||
@ -115,52 +98,50 @@ out:
|
||||
|
||||
static int init_pgtable(struct kimage *image, unsigned long start_pgtable)
|
||||
{
|
||||
u64 *level4p;
|
||||
level4p = (u64 *)__va(start_pgtable);
|
||||
pgd_t *level4p;
|
||||
level4p = (pgd_t *)__va(start_pgtable);
|
||||
return init_level4_page(image, level4p, 0, end_pfn << PAGE_SHIFT);
|
||||
}
|
||||
|
||||
static void set_idt(void *newidt, u16 limit)
|
||||
{
|
||||
unsigned char curidt[10];
|
||||
struct desc_ptr curidt;
|
||||
|
||||
/* x86-64 supports unaliged loads & stores */
|
||||
(*(u16 *)(curidt)) = limit;
|
||||
(*(u64 *)(curidt +2)) = (unsigned long)(newidt);
|
||||
curidt.size = limit;
|
||||
curidt.address = (unsigned long)newidt;
|
||||
|
||||
__asm__ __volatile__ (
|
||||
"lidt %0\n"
|
||||
: "=m" (curidt)
|
||||
"lidtq %0\n"
|
||||
: : "m" (curidt)
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
static void set_gdt(void *newgdt, u16 limit)
|
||||
{
|
||||
unsigned char curgdt[10];
|
||||
struct desc_ptr curgdt;
|
||||
|
||||
/* x86-64 supports unaligned loads & stores */
|
||||
(*(u16 *)(curgdt)) = limit;
|
||||
(*(u64 *)(curgdt +2)) = (unsigned long)(newgdt);
|
||||
curgdt.size = limit;
|
||||
curgdt.address = (unsigned long)newgdt;
|
||||
|
||||
__asm__ __volatile__ (
|
||||
"lgdt %0\n"
|
||||
: "=m" (curgdt)
|
||||
"lgdtq %0\n"
|
||||
: : "m" (curgdt)
|
||||
);
|
||||
};
|
||||
|
||||
static void load_segments(void)
|
||||
{
|
||||
__asm__ __volatile__ (
|
||||
"\tmovl $"STR(__KERNEL_DS)",%eax\n"
|
||||
"\tmovl %eax,%ds\n"
|
||||
"\tmovl %eax,%es\n"
|
||||
"\tmovl %eax,%ss\n"
|
||||
"\tmovl %eax,%fs\n"
|
||||
"\tmovl %eax,%gs\n"
|
||||
"\tmovl %0,%%ds\n"
|
||||
"\tmovl %0,%%es\n"
|
||||
"\tmovl %0,%%ss\n"
|
||||
"\tmovl %0,%%fs\n"
|
||||
"\tmovl %0,%%gs\n"
|
||||
: : "a" (__KERNEL_DS)
|
||||
);
|
||||
#undef STR
|
||||
#undef __STR
|
||||
}
|
||||
|
||||
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 */
|
||||
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 */
|
||||
result = init_pgtable(image, start_pgtable);
|
||||
@ -214,7 +195,7 @@ NORET_TYPE void machine_kexec(struct kimage *image)
|
||||
/* Calculate the offsets */
|
||||
page_list = image->head;
|
||||
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
|
||||
* page table for kexec. Leave the high half pointing at the
|
||||
|
@ -15,6 +15,8 @@
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/miscdevice.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/cpu.h>
|
||||
#include <linux/percpu.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/msr.h>
|
||||
#include <asm/mce.h>
|
||||
@ -514,10 +516,7 @@ static struct sysdev_class mce_sysclass = {
|
||||
set_kset_name("machinecheck"),
|
||||
};
|
||||
|
||||
static struct sys_device device_mce = {
|
||||
.id = 0,
|
||||
.cls = &mce_sysclass,
|
||||
};
|
||||
static DEFINE_PER_CPU(struct sys_device, device_mce);
|
||||
|
||||
/* Why are there no generic functions for this? */
|
||||
#define ACCESSOR(name, var, start) \
|
||||
@ -542,27 +541,83 @@ ACCESSOR(bank4ctl,bank[4],mce_restart())
|
||||
ACCESSOR(tolerant,tolerant,)
|
||||
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;
|
||||
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))
|
||||
return -EIO;
|
||||
err = sysdev_class_register(&mce_sysclass);
|
||||
if (!err)
|
||||
err = sysdev_register(&device_mce);
|
||||
if (!err) {
|
||||
/* 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);
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
for_each_online_cpu(i) {
|
||||
mce_create_device(i);
|
||||
}
|
||||
|
||||
register_cpu_notifier(&mce_cpu_notifier);
|
||||
misc_register(&mce_log_device);
|
||||
return err;
|
||||
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
int ver;
|
||||
int ver, cpu;
|
||||
static int found_bsp=0;
|
||||
|
||||
if (!(m->mpc_cpuflag & CPU_ENABLED))
|
||||
@ -131,7 +131,7 @@ static void __init MP_processor_info (struct mpc_config_processor *m)
|
||||
return;
|
||||
}
|
||||
|
||||
num_processors++;
|
||||
cpu = num_processors++;
|
||||
|
||||
if (m->mpc_apicid > MAX_APICS) {
|
||||
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
|
||||
* entry is BSP, and so on.
|
||||
*/
|
||||
cpu = 0;
|
||||
|
||||
bios_cpu_apicid[0] = m->mpc_apicid;
|
||||
x86_cpu_to_apicid[0] = m->mpc_apicid;
|
||||
found_bsp = 1;
|
||||
} else {
|
||||
bios_cpu_apicid[num_processors - found_bsp] = m->mpc_apicid;
|
||||
x86_cpu_to_apicid[num_processors - found_bsp] = m->mpc_apicid;
|
||||
}
|
||||
} else
|
||||
cpu = num_processors - found_bsp;
|
||||
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)
|
||||
|
@ -765,8 +765,6 @@ static void __init amd_detect_cmp(struct cpuinfo_x86 *c)
|
||||
int cpu = smp_processor_id();
|
||||
int node = 0;
|
||||
unsigned bits;
|
||||
if (c->x86_num_cores == 1)
|
||||
return;
|
||||
|
||||
bits = 0;
|
||||
while ((1 << bits) < c->x86_num_cores)
|
||||
@ -1081,8 +1079,7 @@ void __cpuinit identify_cpu(struct cpuinfo_x86 *c)
|
||||
else
|
||||
mtrr_ap_init();
|
||||
#ifdef CONFIG_NUMA
|
||||
if (c != &boot_cpu_data)
|
||||
numa_add_cpu(c - cpu_data);
|
||||
numa_add_cpu(smp_processor_id());
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -12,6 +12,7 @@
|
||||
#include <linux/string.h>
|
||||
#include <linux/bootmem.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/module.h>
|
||||
#include <asm/bootsetup.h>
|
||||
#include <asm/pda.h>
|
||||
#include <asm/pgtable.h>
|
||||
@ -22,10 +23,8 @@
|
||||
#include <asm/smp.h>
|
||||
#include <asm/i387.h>
|
||||
#include <asm/percpu.h>
|
||||
#include <asm/mtrr.h>
|
||||
#include <asm/proto.h>
|
||||
#include <asm/mman.h>
|
||||
#include <asm/numa.h>
|
||||
#include <asm/sections.h>
|
||||
|
||||
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;
|
||||
|
||||
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 };
|
||||
|
||||
char boot_cpu_stack[IRQSTACKSIZE] __attribute__((section(".bss.page_aligned")));
|
||||
@ -101,7 +95,7 @@ void __init setup_per_cpu_areas(void)
|
||||
#endif
|
||||
|
||||
for (i = 0; i < NR_CPUS; i++) {
|
||||
unsigned char *ptr;
|
||||
char *ptr;
|
||||
|
||||
if (!NODE_DATA(cpu_to_node(i))) {
|
||||
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)
|
||||
{
|
||||
#ifdef CONFIG_SMP
|
||||
int cpu = stack_smp_processor_id();
|
||||
#else
|
||||
int cpu = smp_processor_id();
|
||||
#endif
|
||||
struct tss_struct *t = &per_cpu(init_tss, cpu);
|
||||
unsigned long v;
|
||||
char *estacks = NULL;
|
||||
@ -214,7 +204,7 @@ void __cpuinit cpu_init (void)
|
||||
|
||||
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,
|
||||
|
@ -129,10 +129,9 @@ asmlinkage void smp_invalidate_interrupt (void)
|
||||
} else
|
||||
leave_mm(cpu);
|
||||
}
|
||||
out:
|
||||
ack_APIC_irq();
|
||||
cpu_clear(cpu, flush_cpumask);
|
||||
|
||||
out:
|
||||
put_cpu_no_resched();
|
||||
}
|
||||
|
||||
@ -293,6 +292,69 @@ void unlock_ipi_call_lock(void)
|
||||
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
|
||||
* 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 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
|
||||
* bootstrap into the page concerned. The caller
|
||||
@ -229,9 +211,6 @@ static __cpuinit void sync_master(void *arg)
|
||||
{
|
||||
unsigned long flags, i;
|
||||
|
||||
if (smp_processor_id() != 0)
|
||||
return;
|
||||
|
||||
go[MASTER] = 0;
|
||||
|
||||
local_irq_save(flags);
|
||||
@ -280,7 +259,7 @@ get_delta(long *rt, long *master)
|
||||
return tcenter - best_tm;
|
||||
}
|
||||
|
||||
static __cpuinit void sync_tsc(void)
|
||||
static __cpuinit void sync_tsc(unsigned int master)
|
||||
{
|
||||
int i, done = 0;
|
||||
long delta, adj, adjust_latency = 0;
|
||||
@ -294,9 +273,17 @@ static __cpuinit void sync_tsc(void)
|
||||
} t[NUM_ROUNDS] __cpuinitdata;
|
||||
#endif
|
||||
|
||||
printk(KERN_INFO "CPU %d: Syncing TSC to CPU %u.\n",
|
||||
smp_processor_id(), master);
|
||||
|
||||
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 */
|
||||
no_cpu_relax();
|
||||
@ -340,16 +327,14 @@ static __cpuinit void sync_tsc(void)
|
||||
printk(KERN_INFO
|
||||
"CPU %d: synchronized TSC with CPU %u (last diff %ld cycles, "
|
||||
"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)
|
||||
{
|
||||
if (notscsync || !cpu_has_tsc)
|
||||
return;
|
||||
printk(KERN_INFO "CPU %d: Syncing TSC to CPU %u.\n", smp_processor_id(),
|
||||
boot_cpu_id);
|
||||
sync_tsc();
|
||||
sync_tsc(boot_cpu_id);
|
||||
}
|
||||
|
||||
static __init int notscsync_setup(char *s)
|
||||
@ -773,8 +758,9 @@ do_rest:
|
||||
initial_code = start_secondary;
|
||||
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,
|
||||
start_rip, init_rsp);
|
||||
printk(KERN_INFO "Booting processor %d/%d APIC 0x%x\n", cpu,
|
||||
cpus_weight(cpu_present_map),
|
||||
apicid);
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
@ -987,25 +994,15 @@ static int __init smp_sanity_check(unsigned max_cpus)
|
||||
*/
|
||||
void __init smp_prepare_cpus(unsigned int max_cpus)
|
||||
{
|
||||
int i;
|
||||
|
||||
nmi_watchdog_default();
|
||||
current_cpu_data = boot_cpu_data;
|
||||
current_thread_info()->cpu = 0; /* needed? */
|
||||
|
||||
enforce_max_cpus(max_cpus);
|
||||
|
||||
/*
|
||||
* Fill in cpu_present_mask
|
||||
*/
|
||||
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);
|
||||
}
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
prefill_possible_map();
|
||||
#endif
|
||||
|
||||
if (smp_sanity_check(max_cpus) < 0) {
|
||||
printk(KERN_INFO "SMP disabled\n");
|
||||
@ -1189,8 +1186,7 @@ void __cpu_die(unsigned int cpu)
|
||||
printk ("CPU %d is now offline\n", cpu);
|
||||
return;
|
||||
}
|
||||
current->state = TASK_UNINTERRUPTIBLE;
|
||||
schedule_timeout(HZ/10);
|
||||
msleep(100);
|
||||
}
|
||||
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)
|
||||
reason = get_nmi_reason();
|
||||
|
||||
if (!cpu_online(cpu))
|
||||
return;
|
||||
|
||||
if (!(reason & 0xc0)) {
|
||||
if (notify_die(DIE_NMI_IPI, "nmi_ipi", regs, reason, 0, SIGINT)
|
||||
== NOTIFY_STOP)
|
||||
|
@ -18,8 +18,6 @@
|
||||
#include <asm/smp.h>
|
||||
#endif
|
||||
|
||||
int x86_udelay_tsc = 0; /* Delay via TSC */
|
||||
|
||||
int read_current_timer(unsigned long *timer_value)
|
||||
{
|
||||
rdtscll(*timer_value);
|
||||
|
@ -23,7 +23,6 @@
|
||||
#include <linux/vt_kern.h> /* For unblank_screen() */
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/kprobes.h>
|
||||
|
||||
#include <asm/system.h>
|
||||
#include <asm/uaccess.h>
|
||||
|
@ -36,34 +36,36 @@ int numa_off __initdata;
|
||||
int __init compute_hash_shift(struct node *nodes, int numnodes)
|
||||
{
|
||||
int i;
|
||||
int shift = 24;
|
||||
u64 addr;
|
||||
int shift = 20;
|
||||
unsigned long addr,maxend=0;
|
||||
|
||||
/* When in doubt use brute force. */
|
||||
while (shift < 48) {
|
||||
memset(memnodemap,0xff,sizeof(*memnodemap) * NODEMAPSIZE);
|
||||
for (i = 0; i < numnodes; i++) {
|
||||
if (nodes[i].start == nodes[i].end)
|
||||
continue;
|
||||
for (addr = nodes[i].start;
|
||||
addr < nodes[i].end;
|
||||
addr += (1UL << shift)) {
|
||||
if (memnodemap[addr >> shift] != 0xff &&
|
||||
memnodemap[addr >> shift] != i) {
|
||||
printk(KERN_INFO
|
||||
"node %d shift %d addr %Lx conflict %d\n",
|
||||
i, shift, addr, memnodemap[addr>>shift]);
|
||||
goto next;
|
||||
}
|
||||
memnodemap[addr >> shift] = i;
|
||||
for (i = 0; i < numnodes; i++)
|
||||
if ((nodes[i].start != nodes[i].end) && (nodes[i].end > maxend))
|
||||
maxend = nodes[i].end;
|
||||
|
||||
while ((1UL << shift) < (maxend / NODEMAPSIZE))
|
||||
shift++;
|
||||
|
||||
printk (KERN_DEBUG"Using %d for the hash shift. Max adder is %lx \n",
|
||||
shift,maxend);
|
||||
memset(memnodemap,0xff,sizeof(*memnodemap) * NODEMAPSIZE);
|
||||
for (i = 0; i < numnodes; i++) {
|
||||
if (nodes[i].start == nodes[i].end)
|
||||
continue;
|
||||
for (addr = nodes[i].start;
|
||||
addr < nodes[i].end;
|
||||
addr += (1UL << shift)) {
|
||||
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 -1;
|
||||
return shift;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SPARSEMEM
|
||||
|
@ -20,6 +20,9 @@
|
||||
|
||||
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_found __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();
|
||||
return;
|
||||
}
|
||||
if (pa->apic_id >= NR_CPUS) {
|
||||
printk(KERN_ERR "SRAT: lapic %u too large.\n",
|
||||
pa->apic_id);
|
||||
if (num_processors >= NR_CPUS) {
|
||||
printk(KERN_ERR "SRAT: Processor #%d (lapic %u) INVALID. (Max ID: %d).\n",
|
||||
num_processors, pa->apic_id, NR_CPUS);
|
||||
bad_srat();
|
||||
return;
|
||||
}
|
||||
cpu_to_node[pa->apic_id] = node;
|
||||
cpu_to_node[num_processors] = node;
|
||||
acpi_numa = 1;
|
||||
printk(KERN_INFO "SRAT: PXM %u -> APIC %u -> Node %u\n",
|
||||
pxm, pa->apic_id, node);
|
||||
printk(KERN_INFO "SRAT: PXM %u -> APIC %u -> CPU %u -> Node %u\n",
|
||||
pxm, pa->apic_id, num_processors, node);
|
||||
|
||||
num_processors++;
|
||||
}
|
||||
|
||||
/* 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)
|
||||
return;
|
||||
/* hotplug bit is ignored for now */
|
||||
pxm = ma->proximity_domain;
|
||||
node = setup_node(pxm);
|
||||
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);
|
||||
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);
|
||||
if (i >= 0) {
|
||||
printk(KERN_ERR
|
||||
|
@ -29,7 +29,7 @@ __init static int
|
||||
fill_mp_bus_to_cpumask(void)
|
||||
{
|
||||
struct pci_dev *nb_dev = NULL;
|
||||
int i, j, printed;
|
||||
int i, j;
|
||||
u32 ldtbus, nid;
|
||||
static int lbnr[3] = {
|
||||
LDT_BUS_NUMBER_REGISTER_0,
|
||||
|
@ -1135,7 +1135,7 @@ static int revalidate_allvol(ctlr_info_t *host)
|
||||
/* this is for the online array utilities */
|
||||
if (!drv->heads && i)
|
||||
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);
|
||||
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_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);
|
||||
|
||||
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
|
||||
* that every queue gets a chance to be started first.
|
||||
*/
|
||||
for (j=0; j < NWD; j++){
|
||||
int curr_queue = (start_queue + j) % NWD;
|
||||
for (j=0; j < h->highest_lun + 1; j++){
|
||||
int curr_queue = (start_queue + j) % (h->highest_lun + 1);
|
||||
/* make sure the disk has been added and the drive is real
|
||||
* 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))
|
||||
continue;
|
||||
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 (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;
|
||||
} else {
|
||||
h->next_to_run = curr_queue;
|
||||
goto cleanup;
|
||||
}
|
||||
} 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);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
/*
|
||||
* We cannot read the structure directly, for portablity we must use
|
||||
* the io functions.
|
||||
@ -2789,13 +2788,6 @@ static int __devinit cciss_init_one(struct pci_dev *pdev,
|
||||
}
|
||||
|
||||
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.
|
||||
have it point to hba[i]. */
|
||||
@ -2817,6 +2809,20 @@ static int __devinit cciss_init_one(struct pci_dev *pdev,
|
||||
|
||||
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);
|
||||
|
||||
/* 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);
|
||||
|
||||
|
||||
for(j=0; j<NWD; j++) {
|
||||
drive_info_struct *drv = &(hba[i]->drv[j]);
|
||||
struct gendisk *disk = hba[i]->gendisk[j];
|
||||
|
||||
q->queuedata = hba[i];
|
||||
sprintf(disk->disk_name, "cciss/c%dd%d", i, j);
|
||||
sprintf(disk->devfs_name, "cciss/host%d/target%d", i, j);
|
||||
disk->major = hba[i]->major;
|
||||
disk->first_minor = j << NWD_SHIFT;
|
||||
disk->fops = &cciss_fops;
|
||||
disk->queue = hba[i]->queue;
|
||||
disk->queue = q;
|
||||
disk->private_data = drv;
|
||||
/* we must register the controller even if no disks exist */
|
||||
/* this is for the online array utilities */
|
||||
if(!drv->heads && j)
|
||||
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);
|
||||
add_disk(disk);
|
||||
}
|
||||
|
||||
return(1);
|
||||
|
||||
clean4:
|
||||
@ -2912,10 +2915,10 @@ static void __devexit cciss_remove_one (struct pci_dev *pdev)
|
||||
for (j = 0; j < NWD; j++) {
|
||||
struct gendisk *disk = hba[i]->gendisk[j];
|
||||
if (disk->flags & GENHD_FL_UP)
|
||||
blk_cleanup_queue(disk->queue);
|
||||
del_gendisk(disk);
|
||||
}
|
||||
|
||||
blk_cleanup_queue(hba[i]->queue);
|
||||
pci_free_consistent(hba[i]->pdev, NR_CMDS * sizeof(CommandList_struct),
|
||||
hba[i]->cmd_pool, hba[i]->cmd_pool_dhandle);
|
||||
pci_free_consistent(hba[i]->pdev, NR_CMDS * sizeof( ErrorInfo_struct),
|
||||
|
@ -29,6 +29,7 @@ typedef struct _drive_info_struct
|
||||
{
|
||||
__u32 LunID;
|
||||
int usage_count;
|
||||
struct request_queue *queue;
|
||||
sector_t nr_blocks;
|
||||
int block_size;
|
||||
int heads;
|
||||
@ -72,7 +73,6 @@ struct ctlr_info
|
||||
unsigned int maxQsinceinit;
|
||||
unsigned int maxSG;
|
||||
spinlock_t lock;
|
||||
struct request_queue *queue;
|
||||
|
||||
//* pointers to command and error info pool */
|
||||
CommandList_struct *cmd_pool;
|
||||
@ -260,7 +260,7 @@ struct board_type {
|
||||
struct access_method *access;
|
||||
};
|
||||
|
||||
#define CCISS_LOCK(i) (hba[i]->queue->queue_lock)
|
||||
#define CCISS_LOCK(i) (&hba[i]->lock)
|
||||
|
||||
#endif /* CCISS_H */
|
||||
|
||||
|
@ -143,6 +143,7 @@ struct agp_bridge_data {
|
||||
char major_version;
|
||||
char minor_version;
|
||||
struct list_head list;
|
||||
u32 apbase_config;
|
||||
};
|
||||
|
||||
#define KB(x) ((x) * 1024)
|
||||
|
@ -1047,9 +1047,15 @@ static int intel_845_configure(void)
|
||||
/* aperture size */
|
||||
pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
|
||||
|
||||
/* 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);
|
||||
if (agp_bridge->apbase_config != 0) {
|
||||
pci_write_config_dword(agp_bridge->dev, AGP_APBASE,
|
||||
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 */
|
||||
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)
|
||||
return -EINVAL;
|
||||
if (keycode > KEY_MAX)
|
||||
return -EINVAL;
|
||||
if (keycode < 0 || keycode > KEY_MAX)
|
||||
return -EINVAL;
|
||||
if (keycode >> (dev->keycodesize * 8))
|
||||
return -EINVAL;
|
||||
|
||||
oldkey = SET_INPUT_KEYCODE(dev, scancode, keycode);
|
||||
|
||||
|
@ -439,6 +439,11 @@ static struct {
|
||||
{ 0, 0 },
|
||||
};
|
||||
|
||||
struct sonypi_keypress {
|
||||
struct input_dev *dev;
|
||||
int key;
|
||||
};
|
||||
|
||||
static struct sonypi_device {
|
||||
struct pci_dev *dev;
|
||||
struct platform_device *pdev;
|
||||
@ -710,22 +715,61 @@ static void sonypi_setbluetoothpower(u8 state)
|
||||
|
||||
static void input_keyrelease(void *data)
|
||||
{
|
||||
struct input_dev *input_dev;
|
||||
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;
|
||||
struct sonypi_keypress kp;
|
||||
|
||||
while (kfifo_get(sonypi_device.input_fifo, (unsigned char *)&kp,
|
||||
sizeof(kp)) == sizeof(kp)) {
|
||||
msleep(10);
|
||||
input_report_key(input_dev, key, 0);
|
||||
input_sync(input_dev);
|
||||
input_report_key(kp.dev, kp.key, 0);
|
||||
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
|
||||
"sonypi: event port1=0x%02x,port2=0x%02x\n", v1, v2);
|
||||
|
||||
if (useinput) {
|
||||
struct input_dev *input_jog_dev = &sonypi_device.input_jog_dev;
|
||||
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);
|
||||
}
|
||||
if (useinput)
|
||||
sonypi_report_input_event(event);
|
||||
|
||||
kfifo_put(sonypi_device.fifo, (unsigned char *)&event, sizeof(event));
|
||||
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)] =
|
||||
BIT(BTN_MIDDLE);
|
||||
sonypi_device.input_jog_dev.relbit[0] = BIT(REL_WHEEL);
|
||||
sonypi_device.input_jog_dev.name =
|
||||
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.name = SONYPI_JOG_INPUTNAME;
|
||||
sonypi_device.input_jog_dev.id.bustype = BUS_ISA;
|
||||
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)
|
||||
set_bit(sonypi_inputkeys[i].inputev,
|
||||
sonypi_device.input_key_dev.keybit);
|
||||
sonypi_device.input_key_dev.name =
|
||||
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.name = SONYPI_KEY_INPUTNAME;
|
||||
sonypi_device.input_key_dev.id.bustype = BUS_ISA;
|
||||
sonypi_device.input_key_dev.id.vendor = PCI_VENDOR_ID_SONY;
|
||||
|
||||
@ -1313,11 +1300,7 @@ out_platformdev:
|
||||
kfifo_free(sonypi_device.input_fifo);
|
||||
out_infifo:
|
||||
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);
|
||||
kfree(sonypi_device.input_jog_dev.name);
|
||||
out_inkmallocinput1:
|
||||
free_irq(sonypi_device.irq, sonypi_irq);
|
||||
out_reqirq:
|
||||
release_region(sonypi_device.ioport1, sonypi_device.region_size);
|
||||
@ -1337,13 +1320,14 @@ static void __devexit sonypi_remove(void)
|
||||
{
|
||||
sonypi_disable();
|
||||
|
||||
synchronize_sched(); /* Allow sonypi interrupt to complete. */
|
||||
flush_scheduled_work();
|
||||
|
||||
platform_device_unregister(sonypi_device.pdev);
|
||||
|
||||
if (useinput) {
|
||||
input_unregister_device(&sonypi_device.input_key_dev);
|
||||
kfree(sonypi_device.input_key_dev.name);
|
||||
input_unregister_device(&sonypi_device.input_jog_dev);
|
||||
kfree(sonypi_device.input_jog_dev.name);
|
||||
kfifo_free(sonypi_device.input_fifo);
|
||||
}
|
||||
|
||||
|
@ -1130,7 +1130,7 @@ int cpufreq_driver_target(struct cpufreq_policy *policy,
|
||||
unsigned int target_freq,
|
||||
unsigned int relation)
|
||||
{
|
||||
unsigned int ret;
|
||||
int ret;
|
||||
|
||||
policy = cpufreq_cpu_get(policy->cpu);
|
||||
if (!policy)
|
||||
@ -1151,7 +1151,7 @@ EXPORT_SYMBOL_GPL(cpufreq_driver_target);
|
||||
|
||||
static int __cpufreq_governor(struct cpufreq_policy *policy, unsigned int event)
|
||||
{
|
||||
int ret = -EINVAL;
|
||||
int ret;
|
||||
|
||||
if (!try_module_get(policy->governor->owner))
|
||||
return -EINVAL;
|
||||
|
@ -25,14 +25,22 @@ setup_serial_console(struct pcdp_uart *uart)
|
||||
#ifdef CONFIG_SERIAL_8250_CONSOLE
|
||||
int mmio;
|
||||
static char options[64], *p = options;
|
||||
char parity;
|
||||
|
||||
mmio = (uart->addr.address_space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY);
|
||||
p += sprintf(p, "console=uart,%s,0x%lx",
|
||||
mmio ? "mmio" : "io", uart->addr.address);
|
||||
if (uart->baud)
|
||||
if (uart->baud) {
|
||||
p += sprintf(p, ",%lu", uart->baud);
|
||||
if (uart->bits)
|
||||
p += sprintf(p, "n%d", uart->bits);
|
||||
if (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);
|
||||
#else
|
||||
|
@ -393,7 +393,7 @@ void adm1026_init_client(struct i2c_client *client)
|
||||
|
||||
value = data->config3;
|
||||
if (data->config3 & CFG3_GPIO16_ENABLE) {
|
||||
dev_dbg(&client->dev, "GPIO16 enabled. THERM"
|
||||
dev_dbg(&client->dev, "GPIO16 enabled. THERM "
|
||||
"pin disabled.\n");
|
||||
} else {
|
||||
dev_dbg(&client->dev, "THERM pin enabled. "
|
||||
|
@ -21,6 +21,7 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/jiffies.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/i2c-sensor.h>
|
||||
#include <linux/i2c-vid.h>
|
||||
@ -80,9 +81,7 @@ static struct atxp1_data * atxp1_update_device(struct device *dev)
|
||||
|
||||
down(&data->update_lock);
|
||||
|
||||
if ((jiffies - data->last_updated > HZ) ||
|
||||
(jiffies < data->last_updated) ||
|
||||
!data->valid) {
|
||||
if (time_after(jiffies, data->last_updated + HZ) || !data->valid) {
|
||||
|
||||
/* Update local register data */
|
||||
data->reg.vid = i2c_smbus_read_byte_data(client, ATXP1_VID);
|
||||
|
@ -32,6 +32,7 @@
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/jiffies.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/i2c-sensor.h>
|
||||
#include <linux/init.h>
|
||||
@ -572,8 +573,7 @@ static struct fscpos_data *fscpos_update_device(struct device *dev)
|
||||
|
||||
down(&data->update_lock);
|
||||
|
||||
if ((jiffies - data->last_updated > 2 * HZ) ||
|
||||
(jiffies < data->last_updated) || !data->valid) {
|
||||
if (time_after(jiffies, data->last_updated + 2 * HZ) || !data->valid) {
|
||||
int i;
|
||||
|
||||
dev_dbg(&client->dev, "Starting fscpos update\n");
|
||||
|
@ -24,6 +24,7 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/jiffies.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/i2c-sensor.h>
|
||||
#include <linux/i2c-vid.h>
|
||||
@ -678,8 +679,7 @@ static struct gl520_data *gl520_update_device(struct device *dev)
|
||||
|
||||
down(&data->update_lock);
|
||||
|
||||
if ((jiffies - data->last_updated > 2 * HZ) ||
|
||||
(jiffies < data->last_updated) || !data->valid) {
|
||||
if (time_after(jiffies, data->last_updated + 2 * HZ) || !data->valid) {
|
||||
|
||||
dev_dbg(&client->dev, "Starting gl520sm update\n");
|
||||
|
||||
|
@ -363,7 +363,7 @@ static void __exit sensors_max1619_exit(void)
|
||||
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>");
|
||||
MODULE_DESCRIPTION("MAX1619 sensor driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -1043,7 +1043,7 @@ static void pc87360_init_client(struct i2c_client *client, int use_thermistors)
|
||||
if (init >= 2 && data->innr) {
|
||||
reg = pc87360_read_value(data, LD_IN, NO_BANK,
|
||||
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");
|
||||
pc87360_write_value(data, LD_IN, NO_BANK,
|
||||
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);
|
||||
i801_smba &= 0xfff0;
|
||||
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");
|
||||
return -ENODEV;
|
||||
}
|
||||
@ -186,7 +186,7 @@ static int i801_transaction(void)
|
||||
int result = 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),
|
||||
inb_p(SMBHSTCMD), inb_p(SMBHSTADD), inb_p(SMBHSTDAT0),
|
||||
inb_p(SMBHSTDAT1));
|
||||
@ -240,7 +240,7 @@ static int i801_transaction(void)
|
||||
outb_p(inb(SMBHSTSTS), SMBHSTSTS);
|
||||
|
||||
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);
|
||||
}
|
||||
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_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_DESCRIPTION
|
||||
("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[1] = BIN2BCD(dt->tm_sec);
|
||||
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[5] = BIN2BCD(dt->tm_mday);
|
||||
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 */
|
||||
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,
|
||||
val | (1 << 6));
|
||||
val & 0x3f);
|
||||
}
|
||||
|
||||
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;
|
||||
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:
|
||||
(1) I2C block reads (faster, but unsupported by most adapters)
|
||||
(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->flags = 0;
|
||||
|
||||
/* prevent 24RF08 corruption */
|
||||
i2c_smbus_write_quick(new_client, 0);
|
||||
|
||||
/* Fill in the remaining client fields */
|
||||
strlcpy(new_client->name, "eeprom", I2C_NAME_SIZE);
|
||||
data->valid = 0;
|
||||
|
@ -343,6 +343,11 @@ static int max6875_detect(struct i2c_adapter *adapter, int address, int kind)
|
||||
struct max6875_data *data;
|
||||
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:
|
||||
(1) I2C block reads (faster, but unsupported by most adapters)
|
||||
(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->flags = 0;
|
||||
|
||||
/* Prevent 24RF08 corruption */
|
||||
i2c_smbus_write_quick(new_client, 0);
|
||||
|
||||
/* Setup the user section */
|
||||
data->blocks[max6875_eeprom_user].type = max6875_eeprom_user;
|
||||
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 ((res = driver->detach_adapter(adap))) {
|
||||
dev_warn(&adap->dev, "can't detach adapter "
|
||||
"while detaching driver %s: driver not "
|
||||
"detached!", driver->name);
|
||||
"while detaching driver %s: driver "
|
||||
"not detached!\n", driver->name);
|
||||
goto out_unlock;
|
||||
}
|
||||
}
|
||||
@ -456,8 +456,8 @@ int i2c_detach_client(struct i2c_client *client)
|
||||
res = adapter->client_unregister(client);
|
||||
if (res) {
|
||||
dev_err(&client->dev,
|
||||
"client_unregister [%s] failed, "
|
||||
"client not detached", client->name);
|
||||
"client_unregister [%s] failed, "
|
||||
"client not detached\n", client->name);
|
||||
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("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("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 ", "PnPIDE", 0x0a5c52fd, 0x0c694728),
|
||||
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("WIT", "IDE16", 0x244e5994, 0x3e232852),
|
||||
PCMCIA_DEVICE_PROD_ID1("STI Flash", 0xe4a13209),
|
||||
PCMCIA_MFC_DEVICE_PROD_ID12(1, "SanDisk", "ConnectPlus", 0x7a954bd9, 0x74be00c6),
|
||||
PCMCIA_DEVICE_NULL,
|
||||
};
|
||||
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 (get_user(v, ip + 1)) return -EFAULT;
|
||||
if (v < 0 || v > KEY_MAX) return -EINVAL;
|
||||
if (v >> (dev->keycodesize * 8)) return -EINVAL;
|
||||
u = SET_INPUT_KEYCODE(dev, t, v);
|
||||
clear_bit(u, dev->keybit);
|
||||
set_bit(v, dev->keybit);
|
||||
|
@ -48,12 +48,6 @@ static LIST_HEAD(input_handler_list);
|
||||
|
||||
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)
|
||||
{
|
||||
struct input_handle *handle;
|
||||
@ -312,6 +306,7 @@ static struct input_device_id *input_match_device(struct input_device_id *id, st
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Input hotplugging interface - loading event handlers based on
|
||||
* device bitfields.
|
||||
@ -428,162 +423,27 @@ static void input_call_hotplug(char *verb, struct input_dev *dev)
|
||||
|
||||
#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
|
||||
|
||||
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++;
|
||||
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;
|
||||
|
||||
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);
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
input_devices_state++;
|
||||
wake_up(&input_devices_poll_wait);
|
||||
#endif
|
||||
int state = input_devices_state;
|
||||
poll_wait(file, &input_devices_poll_wait, wait);
|
||||
if (state != input_devices_state)
|
||||
return POLLIN | POLLRDNORM;
|
||||
return 0;
|
||||
}
|
||||
|
||||
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) \
|
||||
do { \
|
||||
len += sprintf(buf + len, "B: %s", name); \
|
||||
@ -600,16 +460,6 @@ static struct file_operations input_fops = {
|
||||
SPRINTF_BIT_B(bit, name, max); \
|
||||
} 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)
|
||||
{
|
||||
struct input_dev *dev;
|
||||
@ -704,68 +554,225 @@ static int __init input_proc_init(void)
|
||||
struct proc_dir_entry *entry;
|
||||
|
||||
proc_bus_input_dir = proc_mkdir("input", proc_bus);
|
||||
if (proc_bus_input_dir == NULL)
|
||||
if (!proc_bus_input_dir)
|
||||
return -ENOMEM;
|
||||
|
||||
proc_bus_input_dir->owner = THIS_MODULE;
|
||||
|
||||
entry = create_proc_read_entry("devices", 0, proc_bus_input_dir, input_devices_read, NULL);
|
||||
if (entry == NULL) {
|
||||
remove_proc_entry("input", proc_bus);
|
||||
return -ENOMEM;
|
||||
}
|
||||
if (!entry)
|
||||
goto fail1;
|
||||
|
||||
entry->owner = THIS_MODULE;
|
||||
input_fileops = *entry->proc_fops;
|
||||
entry->proc_fops = &input_fileops;
|
||||
entry->proc_fops->poll = input_devices_poll;
|
||||
|
||||
entry = create_proc_read_entry("handlers", 0, proc_bus_input_dir, input_handlers_read, NULL);
|
||||
if (entry == NULL) {
|
||||
remove_proc_entry("devices", proc_bus_input_dir);
|
||||
remove_proc_entry("input", proc_bus);
|
||||
return -ENOMEM;
|
||||
}
|
||||
if (!entry)
|
||||
goto fail2;
|
||||
|
||||
entry->owner = THIS_MODULE;
|
||||
|
||||
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 */
|
||||
static inline void input_wakeup_procfs_readers(void) { }
|
||||
static inline int input_proc_init(void) { return 0; }
|
||||
static inline void input_proc_exit(void) { }
|
||||
#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;
|
||||
|
||||
static int __init input_init(void)
|
||||
{
|
||||
int retval = -ENOMEM;
|
||||
int err;
|
||||
|
||||
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);
|
||||
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");
|
||||
if (retval) {
|
||||
remove_proc_entry("devices", proc_bus_input_dir);
|
||||
remove_proc_entry("handlers", proc_bus_input_dir);
|
||||
remove_proc_entry("input", proc_bus);
|
||||
unregister_chrdev(INPUT_MAJOR, "input");
|
||||
class_destroy(input_class);
|
||||
err = input_proc_init();
|
||||
if (err)
|
||||
goto fail1;
|
||||
|
||||
err = register_chrdev(INPUT_MAJOR, "input", &input_fops);
|
||||
if (err) {
|
||||
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)
|
||||
{
|
||||
remove_proc_entry("devices", proc_bus_input_dir);
|
||||
remove_proc_entry("handlers", proc_bus_input_dir);
|
||||
remove_proc_entry("input", proc_bus);
|
||||
|
||||
input_proc_exit();
|
||||
devfs_remove("input");
|
||||
unregister_chrdev(INPUT_MAJOR, "input");
|
||||
class_destroy(input_class);
|
||||
|
@ -37,8 +37,6 @@ MODULE_LICENSE("GPL");
|
||||
#define JOYDEV_MINORS 16
|
||||
#define JOYDEV_BUFFER_SIZE 64
|
||||
|
||||
#define MSECS(t) (1000 * ((t) / HZ) + 1000 * ((t) % HZ) / HZ)
|
||||
|
||||
struct joydev {
|
||||
int exist;
|
||||
int open;
|
||||
@ -117,7 +115,7 @@ static void joydev_event(struct input_handle *handle, unsigned int type, unsigne
|
||||
return;
|
||||
}
|
||||
|
||||
event.time = MSECS(jiffies);
|
||||
event.time = jiffies_to_msecs(jiffies);
|
||||
|
||||
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;
|
||||
|
||||
event.time = MSECS(jiffies);
|
||||
event.time = jiffies_to_msecs(jiffies);
|
||||
|
||||
if (list->startup < joydev->nkey) {
|
||||
event.type = JS_EVENT_BUTTON | JS_EVENT_INIT;
|
||||
|
@ -36,16 +36,6 @@
|
||||
#include <linux/miscdevice.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)
|
||||
{
|
||||
struct uinput_device *udev;
|
||||
@ -63,22 +53,24 @@ static int uinput_dev_event(struct input_dev *dev, unsigned int type, unsigned i
|
||||
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. */
|
||||
struct uinput_device *udev = dev->private;
|
||||
int id;
|
||||
int err = -1;
|
||||
|
||||
down(&udev->requests_sem);
|
||||
for (id=0; id<UINPUT_NUM_REQUESTS; id++)
|
||||
spin_lock(&udev->requests_lock);
|
||||
|
||||
for (id = 0; id < UINPUT_NUM_REQUESTS; id++)
|
||||
if (!udev->requests[id]) {
|
||||
udev->requests[id] = request;
|
||||
request->id = id;
|
||||
up(&udev->requests_sem);
|
||||
return 0;
|
||||
udev->requests[id] = request;
|
||||
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)
|
||||
@ -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. */
|
||||
if (id >= UINPUT_NUM_REQUESTS || id < 0)
|
||||
return NULL;
|
||||
if (udev->requests[id]->completed)
|
||||
return NULL;
|
||||
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;
|
||||
|
||||
memset(request, 0, sizeof(struct uinput_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));
|
||||
/* Allocate slot. If none are available right away, wait. */
|
||||
return wait_event_interruptible(udev->requests_waitq,
|
||||
!uinput_request_alloc_id(udev, 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;
|
||||
|
||||
/* Tell our userspace app about this new request by queueing an input event */
|
||||
uinput_dev_event(dev, EV_UINPUT, request->code, request->id);
|
||||
|
||||
/* Wait for the request to complete */
|
||||
retval = wait_event_interruptible(request->waitq, request->completed);
|
||||
if (retval)
|
||||
request->retval = retval;
|
||||
retval = wait_for_completion_interruptible(&request->done);
|
||||
if (!retval)
|
||||
retval = request->retval;
|
||||
|
||||
/* Release this request's ID, let others know it's available */
|
||||
udev->requests[request->id] = NULL;
|
||||
wake_up_interruptible(&udev->requests_waitq);
|
||||
return retval;
|
||||
}
|
||||
|
||||
static int uinput_dev_upload_effect(struct input_dev *dev, struct ff_effect *effect)
|
||||
{
|
||||
struct uinput_request request;
|
||||
int retval;
|
||||
|
||||
if (!test_bit(EV_FF, dev->evbit))
|
||||
return -ENOSYS;
|
||||
|
||||
uinput_request_init(dev, &request, UI_FF_UPLOAD);
|
||||
if (request.retval)
|
||||
return request.retval;
|
||||
request.id = -1;
|
||||
init_completion(&request.done);
|
||||
request.code = UI_FF_UPLOAD;
|
||||
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)
|
||||
{
|
||||
struct uinput_request request;
|
||||
int retval;
|
||||
|
||||
if (!test_bit(EV_FF, dev->evbit))
|
||||
return -ENOSYS;
|
||||
|
||||
uinput_request_init(dev, &request, UI_FF_ERASE);
|
||||
if (request.retval)
|
||||
return request.retval;
|
||||
request.id = -1;
|
||||
init_completion(&request.done);
|
||||
request.code = UI_FF_ERASE;
|
||||
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)
|
||||
@ -159,32 +159,30 @@ static int uinput_create_device(struct uinput_device *udev)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
udev->dev->open = uinput_dev_open;
|
||||
udev->dev->close = uinput_dev_close;
|
||||
udev->dev->event = uinput_dev_event;
|
||||
udev->dev->upload_effect = uinput_dev_upload_effect;
|
||||
udev->dev->erase_effect = uinput_dev_erase_effect;
|
||||
udev->dev->private = udev;
|
||||
|
||||
init_waitqueue_head(&(udev->waitq));
|
||||
init_waitqueue_head(&udev->waitq);
|
||||
|
||||
input_register_device(udev->dev);
|
||||
|
||||
set_bit(UIST_CREATED, &(udev->state));
|
||||
set_bit(UIST_CREATED, &udev->state);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
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);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
input_unregister_device(udev->dev);
|
||||
|
||||
clear_bit(UIST_CREATED, &(udev->state));
|
||||
clear_bit(UIST_CREATED, &udev->state);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -198,7 +196,7 @@ static int uinput_open(struct inode *inode, struct file *file)
|
||||
if (!newdev)
|
||||
goto error;
|
||||
memset(newdev, 0, sizeof(struct uinput_device));
|
||||
init_MUTEX(&newdev->requests_sem);
|
||||
spin_lock_init(&newdev->requests_lock);
|
||||
init_waitqueue_head(&newdev->requests_waitq);
|
||||
|
||||
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 input_dev *dev;
|
||||
struct uinput_device *udev;
|
||||
int size,
|
||||
retval;
|
||||
char *name;
|
||||
int size;
|
||||
int retval;
|
||||
|
||||
retval = count;
|
||||
|
||||
udev = file->private_data;
|
||||
dev = udev->dev;
|
||||
|
||||
user_dev = kmalloc(sizeof(*user_dev), GFP_KERNEL);
|
||||
user_dev = kmalloc(sizeof(struct uinput_user_dev), GFP_KERNEL);
|
||||
if (!user_dev) {
|
||||
retval = -ENOMEM;
|
||||
goto exit;
|
||||
@ -272,17 +271,17 @@ static int uinput_alloc_device(struct file *file, const char __user *buffer, siz
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if (NULL != dev->name)
|
||||
if (dev->name)
|
||||
kfree(dev->name);
|
||||
|
||||
size = strnlen(user_dev->name, UINPUT_MAX_NAME_SIZE) + 1;
|
||||
dev->name = kmalloc(size, GFP_KERNEL);
|
||||
if (!dev->name) {
|
||||
dev->name = name = kmalloc(size, GFP_KERNEL);
|
||||
if (!name) {
|
||||
retval = -ENOMEM;
|
||||
goto exit;
|
||||
}
|
||||
strlcpy(name, user_dev->name, size);
|
||||
|
||||
strlcpy(dev->name, user_dev->name, size);
|
||||
dev->id.bustype = user_dev->id.bustype;
|
||||
dev->id.vendor = user_dev->id.vendor;
|
||||
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;
|
||||
|
||||
if (test_bit(UIST_CREATED, &(udev->state))) {
|
||||
if (test_bit(UIST_CREATED, &udev->state)) {
|
||||
struct input_event ev;
|
||||
|
||||
if (copy_from_user(&ev, buffer, sizeof(struct input_event)))
|
||||
return -EFAULT;
|
||||
input_event(udev->dev, ev.type, ev.code, ev.value);
|
||||
}
|
||||
else
|
||||
} else
|
||||
count = uinput_alloc_device(file, buffer, 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;
|
||||
int retval = 0;
|
||||
|
||||
if (!test_bit(UIST_CREATED, &(udev->state)))
|
||||
if (!test_bit(UIST_CREATED, &udev->state))
|
||||
return -ENODEV;
|
||||
|
||||
if ((udev->head == udev->tail) && (file->f_flags & O_NONBLOCK))
|
||||
if (udev->head == udev->tail && (file->f_flags & O_NONBLOCK))
|
||||
return -EAGAIN;
|
||||
|
||||
retval = wait_event_interruptible(udev->waitq,
|
||||
(udev->head != udev->tail) ||
|
||||
!test_bit(UIST_CREATED, &(udev->state)));
|
||||
|
||||
udev->head != udev->tail || !test_bit(UIST_CREATED, &udev->state));
|
||||
if (retval)
|
||||
return retval;
|
||||
|
||||
if (!test_bit(UIST_CREATED, &(udev->state)))
|
||||
if (!test_bit(UIST_CREATED, &udev->state))
|
||||
return -ENODEV;
|
||||
|
||||
while ((udev->head != udev->tail) &&
|
||||
(retval + sizeof(struct input_event) <= count)) {
|
||||
if (copy_to_user(buffer + retval, &(udev->buff[udev->tail]),
|
||||
sizeof(struct input_event))) return -EFAULT;
|
||||
if (copy_to_user(buffer + retval, &udev->buff[udev->tail], sizeof(struct input_event)))
|
||||
return -EFAULT;
|
||||
udev->tail = (udev->tail + 1) % UINPUT_BUFFER_SIZE;
|
||||
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)
|
||||
{
|
||||
if (test_bit(UIST_CREATED, &(udev->state)))
|
||||
if (test_bit(UIST_CREATED, &udev->state))
|
||||
uinput_destroy_device(udev);
|
||||
|
||||
if (NULL != udev->dev->name)
|
||||
if (udev->dev->name)
|
||||
kfree(udev->dev->name);
|
||||
if (NULL != udev->dev->phys)
|
||||
if (udev->dev->phys)
|
||||
kfree(udev->dev->phys);
|
||||
|
||||
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)
|
||||
{
|
||||
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)
|
||||
@ -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_request *req;
|
||||
int length;
|
||||
char *phys;
|
||||
|
||||
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_FFBIT:
|
||||
case UI_SET_PHYS:
|
||||
if (test_bit(UIST_CREATED, &(udev->state)))
|
||||
if (test_bit(UIST_CREATED, &udev->state))
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@ -498,20 +496,19 @@ static int uinput_ioctl(struct inode *inode, struct file *file, unsigned int cmd
|
||||
retval = -EFAULT;
|
||||
break;
|
||||
}
|
||||
if (NULL != udev->dev->phys)
|
||||
kfree(udev->dev->phys);
|
||||
udev->dev->phys = kmalloc(length, GFP_KERNEL);
|
||||
if (!udev->dev->phys) {
|
||||
kfree(udev->dev->phys);
|
||||
udev->dev->phys = phys = kmalloc(length, GFP_KERNEL);
|
||||
if (!phys) {
|
||||
retval = -ENOMEM;
|
||||
break;
|
||||
}
|
||||
if (copy_from_user(udev->dev->phys, p, length)) {
|
||||
retval = -EFAULT;
|
||||
kfree(udev->dev->phys);
|
||||
if (copy_from_user(phys, p, length)) {
|
||||
udev->dev->phys = NULL;
|
||||
kfree(phys);
|
||||
retval = -EFAULT;
|
||||
break;
|
||||
}
|
||||
udev->dev->phys[length-1] = '\0';
|
||||
phys[length - 1] = '\0';
|
||||
break;
|
||||
|
||||
case UI_BEGIN_FF_UPLOAD:
|
||||
@ -520,7 +517,7 @@ static int uinput_ioctl(struct inode *inode, struct file *file, unsigned int cmd
|
||||
break;
|
||||
}
|
||||
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;
|
||||
break;
|
||||
}
|
||||
@ -538,7 +535,7 @@ static int uinput_ioctl(struct inode *inode, struct file *file, unsigned int cmd
|
||||
break;
|
||||
}
|
||||
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;
|
||||
break;
|
||||
}
|
||||
@ -556,14 +553,13 @@ static int uinput_ioctl(struct inode *inode, struct file *file, unsigned int cmd
|
||||
break;
|
||||
}
|
||||
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;
|
||||
break;
|
||||
}
|
||||
req->retval = ff_up.retval;
|
||||
memcpy(req->u.effect, &ff_up.effect, sizeof(struct ff_effect));
|
||||
req->completed = 1;
|
||||
wake_up_interruptible(&req->waitq);
|
||||
uinput_request_done(udev, req);
|
||||
break;
|
||||
|
||||
case UI_END_FF_ERASE:
|
||||
@ -572,13 +568,12 @@ static int uinput_ioctl(struct inode *inode, struct file *file, unsigned int cmd
|
||||
break;
|
||||
}
|
||||
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;
|
||||
break;
|
||||
}
|
||||
req->retval = ff_erase.retval;
|
||||
req->completed = 1;
|
||||
wake_up_interruptible(&req->waitq);
|
||||
uinput_request_done(udev, req);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -2,7 +2,7 @@
|
||||
* ALPS touchpad PS/2 mouse driver
|
||||
*
|
||||
* 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) 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)
|
||||
{
|
||||
struct alps_data *priv = psmouse->private;
|
||||
unsigned char param[4];
|
||||
int version;
|
||||
|
||||
psmouse_reset(psmouse);
|
||||
@ -358,21 +357,20 @@ static int alps_reconnect(struct psmouse *psmouse)
|
||||
if (!(priv->i = alps_get_model(psmouse, &version)))
|
||||
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;
|
||||
|
||||
if (alps_get_status(psmouse, param))
|
||||
return -1;
|
||||
|
||||
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");
|
||||
if (alps_tap_mode(psmouse, 1)) {
|
||||
printk(KERN_WARNING "alps.c: Failed to reenable hardware tapping\n");
|
||||
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 0;
|
||||
@ -389,7 +387,6 @@ static void alps_disconnect(struct psmouse *psmouse)
|
||||
int alps_init(struct psmouse *psmouse)
|
||||
{
|
||||
struct alps_data *priv;
|
||||
unsigned char param[4];
|
||||
int version;
|
||||
|
||||
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))
|
||||
goto init_fail;
|
||||
|
||||
if (alps_get_status(psmouse, param)) {
|
||||
printk(KERN_ERR "alps.c: touchpad status report request failed\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_tap_mode(psmouse, 1))
|
||||
printk(KERN_WARNING "alps.c: Failed to enable hardware tapping\n");
|
||||
|
||||
if (alps_absolute_mode(psmouse)) {
|
||||
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)
|
||||
clear_bit(BTN_MIDDLE, psmouse->dev.keybit);
|
||||
if (buttons < 2)
|
||||
clear_bit(BTN_RIGHT, psmouse->dev.keybit);
|
||||
|
||||
if (model_info)
|
||||
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;
|
||||
|
||||
if (set_properties) {
|
||||
set_bit(BTN_MIDDLE, psmouse->dev.keybit);
|
||||
set_bit(REL_WHEEL, psmouse->dev.relbit);
|
||||
|
||||
if (!psmouse->vendor) psmouse->vendor = "Generic";
|
||||
@ -376,6 +377,7 @@ static int im_explorer_detect(struct psmouse *psmouse, int set_properties)
|
||||
return -1;
|
||||
|
||||
if (set_properties) {
|
||||
set_bit(BTN_MIDDLE, psmouse->dev.keybit);
|
||||
set_bit(REL_WHEEL, psmouse->dev.relbit);
|
||||
set_bit(BTN_SIDE, 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[4], 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);
|
||||
} else
|
||||
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 */
|
||||
if (child) {
|
||||
if (child->type >= PSMOUSE_GENPS)
|
||||
if (child->pktsize == 4)
|
||||
priv->mode |= SYN_BIT_FOUR_BYTE_CLIENT;
|
||||
else
|
||||
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"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.ident = "Toshiba Dynabook",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME , "dynabook"),
|
||||
},
|
||||
},
|
||||
{ }
|
||||
};
|
||||
#endif
|
||||
@ -656,7 +663,8 @@ int synaptics_init(struct psmouse *psmouse)
|
||||
* thye same as rate of standard PS/2 mouse.
|
||||
*/
|
||||
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;
|
||||
}
|
||||
#endif
|
||||
|
@ -175,7 +175,7 @@ config SERIO_RAW
|
||||
allocating minor 1 (that historically corresponds to /dev/psaux)
|
||||
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
|
||||
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"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.ident = "Fujitsu-Siemens Lifebook T3010",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK T3010"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.ident = "Toshiba P10",
|
||||
.matches = {
|
||||
@ -137,6 +144,13 @@ static struct dmi_system_id __initdata i8042_dmi_nomux_table[] = {
|
||||
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] = {
|
||||
{
|
||||
.disable = I8042_CTR_KBDDIS,
|
||||
.irqen = I8042_CTR_KBDINT,
|
||||
.irqen = I8042_CTR_KBDINT,
|
||||
.mux = -1,
|
||||
.name = "KBD",
|
||||
},
|
||||
@ -191,41 +191,45 @@ static int i8042_flush(void)
|
||||
static int i8042_command(unsigned char *param, int command)
|
||||
{
|
||||
unsigned long flags;
|
||||
int retval = 0, i = 0;
|
||||
int i, retval, auxerr = 0;
|
||||
|
||||
if (i8042_noloop && command == I8042_CMD_AUX_LOOP)
|
||||
return -1;
|
||||
|
||||
spin_lock_irqsave(&i8042_lock, flags);
|
||||
|
||||
retval = i8042_wait_write();
|
||||
if (!retval) {
|
||||
dbg("%02x -> i8042 (command)", command & 0xff);
|
||||
i8042_write_command(command & 0xff);
|
||||
if ((retval = i8042_wait_write()))
|
||||
goto out;
|
||||
|
||||
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 >> 12) & 0xf); i++) {
|
||||
if ((retval = i8042_wait_write())) break;
|
||||
dbg("%02x -> i8042 (parameter)", param[i]);
|
||||
i8042_write_data(param[i]);
|
||||
for (i = 0; i < ((command >> 8) & 0xf); i++) {
|
||||
if ((retval = i8042_wait_read()))
|
||||
goto out;
|
||||
|
||||
if (command == I8042_CMD_AUX_LOOP &&
|
||||
!(i8042_read_status() & I8042_STR_AUXDATA)) {
|
||||
retval = auxerr = -1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!retval)
|
||||
for (i = 0; i < ((command >> 8) & 0xf); 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);
|
||||
param[i] = i8042_read_data();
|
||||
dbg("%02x <- i8042 (return)", param[i]);
|
||||
}
|
||||
|
||||
if (retval)
|
||||
dbg(" -- i8042 (timeout)");
|
||||
dbg(" -- i8042 (%s)", auxerr ? "auxerr" : "timeout");
|
||||
|
||||
out:
|
||||
spin_unlock_irqrestore(&i8042_lock, flags);
|
||||
return retval;
|
||||
}
|
||||
|
||||
@ -507,17 +511,17 @@ static int i8042_set_mux_mode(unsigned int mode, unsigned char *mux_version)
|
||||
*/
|
||||
|
||||
param = 0xf0;
|
||||
if (i8042_command(¶m, I8042_CMD_AUX_LOOP) || param != 0x0f)
|
||||
if (i8042_command(¶m, I8042_CMD_AUX_LOOP) || param != 0xf0)
|
||||
return -1;
|
||||
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;
|
||||
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;
|
||||
|
||||
if (mux_version)
|
||||
*mux_version = ~param;
|
||||
*mux_version = param;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -619,7 +623,7 @@ static int __init i8042_check_aux(void)
|
||||
*/
|
||||
|
||||
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
|
||||
@ -630,7 +634,7 @@ static int __init i8042_check_aux(void)
|
||||
*/
|
||||
|
||||
if (i8042_command(¶m, I8042_CMD_AUX_TEST)
|
||||
|| (param && param != 0xfa && param != 0xff))
|
||||
|| (param && param != 0xfa && param != 0xff))
|
||||
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);
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
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[] = {
|
||||
__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(bind_mode, S_IWUSR | S_IRUGO, serio_show_bind_mode, serio_set_bind_mode),
|
||||
__ATTR_NULL
|
||||
@ -785,36 +794,37 @@ static int serio_bus_match(struct device *dev, struct device_driver *drv)
|
||||
|
||||
#ifdef CONFIG_HOTPLUG
|
||||
|
||||
#define PUT_ENVP(fmt, val) \
|
||||
do { \
|
||||
envp[i++] = buffer; \
|
||||
length += snprintf(buffer, buffer_size - length, fmt, val); \
|
||||
if (buffer_size - length <= 0 || i >= num_envp) \
|
||||
return -ENOMEM; \
|
||||
length++; \
|
||||
buffer += length; \
|
||||
} while (0)
|
||||
#define SERIO_ADD_HOTPLUG_VAR(fmt, val...) \
|
||||
do { \
|
||||
int err = add_hotplug_env_var(envp, num_envp, &i, \
|
||||
buffer, buffer_size, &len, \
|
||||
fmt, val); \
|
||||
if (err) \
|
||||
return err; \
|
||||
} while (0)
|
||||
|
||||
static int serio_hotplug(struct device *dev, char **envp, int num_envp, char *buffer, int buffer_size)
|
||||
{
|
||||
struct serio *serio;
|
||||
int i = 0;
|
||||
int length = 0;
|
||||
int len = 0;
|
||||
|
||||
if (!dev)
|
||||
return -ENODEV;
|
||||
|
||||
serio = to_serio_port(dev);
|
||||
|
||||
PUT_ENVP("SERIO_TYPE=%02x", serio->id.type);
|
||||
PUT_ENVP("SERIO_PROTO=%02x", serio->id.proto);
|
||||
PUT_ENVP("SERIO_ID=%02x", serio->id.id);
|
||||
PUT_ENVP("SERIO_EXTRA=%02x", serio->id.extra);
|
||||
|
||||
SERIO_ADD_HOTPLUG_VAR("SERIO_TYPE=%02x", serio->id.type);
|
||||
SERIO_ADD_HOTPLUG_VAR("SERIO_PROTO=%02x", serio->id.proto);
|
||||
SERIO_ADD_HOTPLUG_VAR("SERIO_ID=%02x", serio->id.id);
|
||||
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;
|
||||
|
||||
return 0;
|
||||
}
|
||||
#undef PUT_ENVP
|
||||
#undef SERIO_ADD_HOTPLUG_VAR
|
||||
|
||||
#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.name = serio_raw->name;
|
||||
serio_raw->dev.dev = &serio->dev;
|
||||
serio_raw->dev.fops = &serio_raw_fops;
|
||||
|
||||
err = misc_register(&serio_raw->dev);
|
||||
|
@ -58,7 +58,7 @@ config TOUCHSCREEN_ELO
|
||||
If unsure, say N.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called gunze.
|
||||
module will be called elo.
|
||||
|
||||
config TOUCHSCREEN_MTOUCH
|
||||
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)
|
||||
{
|
||||
if (!t)
|
||||
return;
|
||||
|
||||
return suspend_targets(t, 0);
|
||||
}
|
||||
|
||||
void dm_table_postsuspend_targets(struct dm_table *t)
|
||||
{
|
||||
if (!t)
|
||||
return;
|
||||
|
||||
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_SUSPENDED 1
|
||||
#define DMF_FS_LOCKED 2
|
||||
|
||||
struct mapped_device {
|
||||
struct rw_semaphore lock;
|
||||
struct rw_semaphore io_lock;
|
||||
struct semaphore suspend_lock;
|
||||
rwlock_t map_lock;
|
||||
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)
|
||||
{
|
||||
down_write(&md->lock);
|
||||
down_write(&md->io_lock);
|
||||
|
||||
if (!test_bit(DMF_BLOCK_IO, &md->flags)) {
|
||||
up_write(&md->lock);
|
||||
up_write(&md->io_lock);
|
||||
return 1;
|
||||
}
|
||||
|
||||
bio_list_add(&md->deferred, bio);
|
||||
|
||||
up_write(&md->lock);
|
||||
up_write(&md->io_lock);
|
||||
return 0; /* deferred successfully */
|
||||
}
|
||||
|
||||
@ -568,14 +568,14 @@ static int dm_request(request_queue_t *q, struct bio *bio)
|
||||
int r;
|
||||
struct mapped_device *md = q->queuedata;
|
||||
|
||||
down_read(&md->lock);
|
||||
down_read(&md->io_lock);
|
||||
|
||||
/*
|
||||
* If we're suspended we have to queue
|
||||
* this io for later.
|
||||
*/
|
||||
while (test_bit(DMF_BLOCK_IO, &md->flags)) {
|
||||
up_read(&md->lock);
|
||||
up_read(&md->io_lock);
|
||||
|
||||
if (bio_rw(bio) == READA) {
|
||||
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
|
||||
* before we get to the following read lock.
|
||||
*/
|
||||
down_read(&md->lock);
|
||||
down_read(&md->io_lock);
|
||||
}
|
||||
|
||||
__split_bio(md, bio);
|
||||
up_read(&md->lock);
|
||||
up_read(&md->io_lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -610,7 +610,7 @@ static int dm_flush_all(request_queue_t *q, struct gendisk *disk,
|
||||
int ret = -ENXIO;
|
||||
|
||||
if (map) {
|
||||
ret = dm_table_flush_all(md->map);
|
||||
ret = dm_table_flush_all(map);
|
||||
dm_table_put(map);
|
||||
}
|
||||
|
||||
@ -747,7 +747,8 @@ static struct mapped_device *alloc_dev(unsigned int minor, int persistent)
|
||||
goto bad1;
|
||||
|
||||
memset(md, 0, sizeof(*md));
|
||||
init_rwsem(&md->lock);
|
||||
init_rwsem(&md->io_lock);
|
||||
init_MUTEX(&md->suspend_lock);
|
||||
rwlock_init(&md->map_lock);
|
||||
atomic_set(&md->holders, 1);
|
||||
atomic_set(&md->event_nr, 0);
|
||||
@ -825,18 +826,13 @@ static void event_callback(void *context)
|
||||
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);
|
||||
bdev = bdget_disk(disk, 0);
|
||||
if (bdev) {
|
||||
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);
|
||||
}
|
||||
down(&md->frozen_bdev->bd_inode->i_sem);
|
||||
i_size_write(md->frozen_bdev->bd_inode, (loff_t)size << SECTOR_SHIFT);
|
||||
up(&md->frozen_bdev->bd_inode->i_sem);
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
size = dm_table_get_size(t);
|
||||
__set_size(md->disk, size);
|
||||
__set_size(md, size);
|
||||
if (size == 0)
|
||||
return 0;
|
||||
|
||||
dm_table_get(t);
|
||||
dm_table_event_callback(t, event_callback, md);
|
||||
|
||||
write_lock(&md->map_lock);
|
||||
md->map = t;
|
||||
dm_table_set_restrictions(t, q);
|
||||
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;
|
||||
}
|
||||
|
||||
@ -935,7 +932,7 @@ void dm_put(struct mapped_device *md)
|
||||
struct dm_table *map = dm_get_table(md);
|
||||
|
||||
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_postsuspend_targets(map);
|
||||
}
|
||||
@ -968,17 +965,17 @@ int dm_swap_table(struct mapped_device *md, struct dm_table *table)
|
||||
{
|
||||
int r = -EINVAL;
|
||||
|
||||
down_write(&md->lock);
|
||||
down(&md->suspend_lock);
|
||||
|
||||
/* device must be suspended */
|
||||
if (!test_bit(DMF_SUSPENDED, &md->flags))
|
||||
if (!dm_suspended(md))
|
||||
goto out;
|
||||
|
||||
__unbind(md);
|
||||
r = __bind(md, table);
|
||||
|
||||
out:
|
||||
up_write(&md->lock);
|
||||
up(&md->suspend_lock);
|
||||
return r;
|
||||
}
|
||||
|
||||
@ -986,16 +983,13 @@ out:
|
||||
* Functions to lock and unlock any filesystem running on the
|
||||
* device.
|
||||
*/
|
||||
static int __lock_fs(struct mapped_device *md)
|
||||
static int lock_fs(struct mapped_device *md)
|
||||
{
|
||||
int error = -ENOMEM;
|
||||
|
||||
if (test_and_set_bit(DMF_FS_LOCKED, &md->flags))
|
||||
return 0;
|
||||
int r = -ENOMEM;
|
||||
|
||||
md->frozen_bdev = bdget_disk(md->disk, 0);
|
||||
if (!md->frozen_bdev) {
|
||||
DMWARN("bdget failed in __lock_fs");
|
||||
DMWARN("bdget failed in lock_fs");
|
||||
goto out;
|
||||
}
|
||||
|
||||
@ -1003,13 +997,13 @@ static int __lock_fs(struct mapped_device *md)
|
||||
|
||||
md->frozen_sb = freeze_bdev(md->frozen_bdev);
|
||||
if (IS_ERR(md->frozen_sb)) {
|
||||
error = PTR_ERR(md->frozen_sb);
|
||||
r = PTR_ERR(md->frozen_sb);
|
||||
goto out_bdput;
|
||||
}
|
||||
|
||||
/* don't bdput right now, we don't want the bdev
|
||||
* to go away while it is locked. We'll bdput
|
||||
* in __unlock_fs
|
||||
* in unlock_fs
|
||||
*/
|
||||
return 0;
|
||||
|
||||
@ -1018,15 +1012,11 @@ out_bdput:
|
||||
md->frozen_sb = NULL;
|
||||
md->frozen_bdev = NULL;
|
||||
out:
|
||||
clear_bit(DMF_FS_LOCKED, &md->flags);
|
||||
return error;
|
||||
return r;
|
||||
}
|
||||
|
||||
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);
|
||||
bdput(md->frozen_bdev);
|
||||
|
||||
@ -1043,50 +1033,37 @@ static void __unlock_fs(struct mapped_device *md)
|
||||
*/
|
||||
int dm_suspend(struct mapped_device *md)
|
||||
{
|
||||
struct dm_table *map;
|
||||
struct dm_table *map = NULL;
|
||||
DECLARE_WAITQUEUE(wait, current);
|
||||
int error = -EINVAL;
|
||||
int r = -EINVAL;
|
||||
|
||||
/* Flush I/O to the device. */
|
||||
down_read(&md->lock);
|
||||
if (test_bit(DMF_BLOCK_IO, &md->flags))
|
||||
goto out_read_unlock;
|
||||
down(&md->suspend_lock);
|
||||
|
||||
if (dm_suspended(md))
|
||||
goto out;
|
||||
|
||||
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);
|
||||
if (error) {
|
||||
dm_table_put(map);
|
||||
goto out_read_unlock;
|
||||
}
|
||||
/* This does not get reverted if there's an error later. */
|
||||
dm_table_presuspend_targets(map);
|
||||
|
||||
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.
|
||||
*
|
||||
* 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->lock);
|
||||
if (test_and_set_bit(DMF_BLOCK_IO, &md->flags)) {
|
||||
if (map)
|
||||
dm_table_put(map);
|
||||
goto out_write_unlock;
|
||||
}
|
||||
down_write(&md->io_lock);
|
||||
set_bit(DMF_BLOCK_IO, &md->flags);
|
||||
|
||||
add_wait_queue(&md->wait, &wait);
|
||||
up_write(&md->lock);
|
||||
up_write(&md->io_lock);
|
||||
|
||||
/* unplug */
|
||||
if (map) {
|
||||
if (map)
|
||||
dm_table_unplug_all(map);
|
||||
dm_table_put(map);
|
||||
}
|
||||
|
||||
/*
|
||||
* 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);
|
||||
|
||||
down_write(&md->lock);
|
||||
down_write(&md->io_lock);
|
||||
remove_wait_queue(&md->wait, &wait);
|
||||
|
||||
/* were we interrupted ? */
|
||||
error = -EINTR;
|
||||
if (atomic_read(&md->pending))
|
||||
goto out_unfreeze;
|
||||
r = -EINTR;
|
||||
if (atomic_read(&md->pending)) {
|
||||
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);
|
||||
|
||||
map = dm_get_table(md);
|
||||
if (map)
|
||||
dm_table_postsuspend_targets(map);
|
||||
r = 0;
|
||||
|
||||
out:
|
||||
dm_table_put(map);
|
||||
up_write(&md->lock);
|
||||
|
||||
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;
|
||||
up(&md->suspend_lock);
|
||||
return r;
|
||||
}
|
||||
|
||||
int dm_resume(struct mapped_device *md)
|
||||
{
|
||||
int r = -EINVAL;
|
||||
struct bio *def;
|
||||
struct dm_table *map = dm_get_table(md);
|
||||
struct dm_table *map = NULL;
|
||||
|
||||
down_write(&md->lock);
|
||||
if (!map ||
|
||||
!test_bit(DMF_SUSPENDED, &md->flags) ||
|
||||
!dm_table_get_size(map)) {
|
||||
up_write(&md->lock);
|
||||
dm_table_put(map);
|
||||
return -EINVAL;
|
||||
}
|
||||
down(&md->suspend_lock);
|
||||
if (!dm_suspended(md))
|
||||
goto out;
|
||||
|
||||
map = dm_get_table(md);
|
||||
if (!map || !dm_table_get_size(map))
|
||||
goto out;
|
||||
|
||||
dm_table_resume_targets(map);
|
||||
clear_bit(DMF_SUSPENDED, &md->flags);
|
||||
|
||||
down_write(&md->io_lock);
|
||||
clear_bit(DMF_BLOCK_IO, &md->flags);
|
||||
|
||||
def = bio_list_get(&md->deferred);
|
||||
__flush_deferred_io(md, def);
|
||||
up_write(&md->lock);
|
||||
__unlock_fs(md);
|
||||
dm_table_unplug_all(map);
|
||||
dm_table_put(map);
|
||||
up_write(&md->io_lock);
|
||||
|
||||
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 */
|
||||
outsw(dev->base_addr + TX_FRAME_PORT,skb->data,(skb->len+1) >>1);
|
||||
spin_unlock_irq(&lp->lock);
|
||||
lp->stats.tx_bytes += skb->len;
|
||||
dev->trans_start = jiffies;
|
||||
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_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);
|
||||
#ifdef CONFIG_PM
|
||||
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);
|
||||
#endif
|
||||
|
||||
struct notifier_block e1000_notifier_reboot = {
|
||||
.notifier_call = e1000_notify_reboot,
|
||||
.next = NULL,
|
||||
.priority = 0
|
||||
};
|
||||
|
||||
/* Exported from other modules */
|
||||
|
||||
extern void e1000_check_options(struct e1000_adapter *adapter);
|
||||
@ -221,9 +214,7 @@ e1000_init_module(void)
|
||||
printk(KERN_INFO "%s\n", e1000_copyright);
|
||||
|
||||
ret = pci_module_init(&e1000_driver);
|
||||
if(ret >= 0) {
|
||||
register_reboot_notifier(&e1000_notifier_reboot);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -239,7 +230,6 @@ module_init(e1000_init_module);
|
||||
static void __exit
|
||||
e1000_exit_module(void)
|
||||
{
|
||||
unregister_reboot_notifier(&e1000_notifier_reboot);
|
||||
pci_unregister_driver(&e1000_driver);
|
||||
}
|
||||
|
||||
@ -3651,23 +3641,6 @@ e1000_set_spd_dplx(struct e1000_adapter *adapter, uint16_t spddplx)
|
||||
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
|
||||
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[] = {
|
||||
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,
|
||||
};
|
||||
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, 0x021b, 0x0101),
|
||||
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, "Grey Cell", "GCS3000", 0x2a151fac, 0x48b932ae),
|
||||
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", "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 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.", "CentreCOM LA-PCM_V2", 0xbb7fBdd7, 0x28e299f8),
|
||||
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("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, 0x50dcd0ec),
|
||||
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 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("IBM Corp.", "Ethernet", 0xe3736c88, 0x00b2e941),
|
||||
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("iPort", "10/100 Ethernet Card", 0x56c538d2, 0x11b0ffc0),
|
||||
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 PC Card (PCMPC100)", 0x0733cc81, 0x66c5a389),
|
||||
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-LN20T", 0x88fcdeda, 0x81090922),
|
||||
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_ID12(0, "Gateway 2000", "XJEM3336", 0xdd9989be, 0x662c394c),
|
||||
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", 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:Jack of Hearts Modem+Ethernet", 0xc2f80cd, 0xdc9ba5ed),
|
||||
PCMCIA_MFC_DEVICE_MANF_CARD(0, 0x016c, 0x0020),
|
||||
PCMCIA_DEVICE_MANF_CARD(0x016c, 0x0023),
|
||||
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("Megahertz", "CC10BT/2", 0x33234748, 0x3c95b953),
|
||||
PCMCIA_DEVICE_PROD_ID12("MELCO/SMC", "LPC-TX", 0xa2cd8e6d, 0x42da662a),
|
||||
PCMCIA_DEVICE_PROD_ID12("Ositech", "Trumpcard", 0x0c2f80cd, 0x0573c29f),
|
||||
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:Seven of Diamonds Ethernet", 0xc2f80cd, 0x194b650a),
|
||||
PCMCIA_DEVICE_PROD_ID12("PCMCIA", "Fast Ethernet PCCard", 0x281f1c5d, 0xdcea68bc),
|
||||
PCMCIA_DEVICE_PROD_ID12("Psion", "10Mb Ethernet", 0x4ef00b21, 0x844be9e9),
|
||||
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", "REM10", 0x2e3ee845, 0x76df1d29),
|
||||
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_PROD_ID13("Toshiba Information Systems", "TPCENET", 0x1b3b94fe, 0xf381c1a2),
|
||||
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(0xc250, 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_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),
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user