Merge branch 'master'
This commit is contained in:
commit
d7fc3ca1cd
6
CREDITS
6
CREDITS
@ -3643,11 +3643,9 @@ S: Cambridge. CB1 7EG
|
|||||||
S: England
|
S: England
|
||||||
|
|
||||||
N: Chris Wright
|
N: Chris Wright
|
||||||
E: chrisw@osdl.org
|
E: chrisw@sous-sol.org
|
||||||
D: hacking on LSM framework and security modules.
|
D: hacking on LSM framework and security modules.
|
||||||
S: c/o OSDL
|
S: Portland, OR
|
||||||
S: 12725 SW Millikan Way, Suite 400
|
|
||||||
S: Beaverton, OR 97005
|
|
||||||
S: USA
|
S: USA
|
||||||
|
|
||||||
N: Michal Wronski
|
N: Michal Wronski
|
||||||
|
@ -111,4 +111,8 @@ source: linux/Documentation/video4linux/CARDLIST.bttv
|
|||||||
If you have problems with this please do ask on the mailing list.
|
If you have problems with this please do ask on the mailing list.
|
||||||
|
|
||||||
--
|
--
|
||||||
Authors: Richard Walker, Jamie Honan, Michael Hunold, Manu Abraham
|
Authors: Richard Walker,
|
||||||
|
Jamie Honan,
|
||||||
|
Michael Hunold,
|
||||||
|
Manu Abraham,
|
||||||
|
Michael Krufky
|
||||||
|
@ -180,3 +180,12 @@ Why: These events are not correct, and do not properly let userspace know
|
|||||||
when a file system has been mounted or unmounted. Userspace should
|
when a file system has been mounted or unmounted. Userspace should
|
||||||
poll the /proc/mounts file instead to detect this properly.
|
poll the /proc/mounts file instead to detect this properly.
|
||||||
Who: Greg Kroah-Hartman <gregkh@suse.de>
|
Who: Greg Kroah-Hartman <gregkh@suse.de>
|
||||||
|
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
What: Support for NEC DDB5074 and DDB5476 evaluation boards.
|
||||||
|
When: June 2006
|
||||||
|
Why: Board specific code doesn't build anymore since ~2.6.0 and no
|
||||||
|
users have complained indicating there is no more need for these
|
||||||
|
boards. This should really be considered a last call.
|
||||||
|
Who: Ralf Baechle <ralf@linux-mips.org>
|
||||||
|
@ -335,6 +335,12 @@ running once the system is up.
|
|||||||
timesource is not avalible, it defaults to PIT.
|
timesource is not avalible, it defaults to PIT.
|
||||||
Format: { pit | tsc | cyclone | pmtmr }
|
Format: { pit | tsc | cyclone | pmtmr }
|
||||||
|
|
||||||
|
disable_8254_timer
|
||||||
|
enable_8254_timer
|
||||||
|
[IA32/X86_64] Disable/Enable interrupt 0 timer routing
|
||||||
|
over the 8254 in addition to over the IO-APIC. The
|
||||||
|
kernel tries to set a sensible default.
|
||||||
|
|
||||||
hpet= [IA-32,HPET] option to disable HPET and use PIT.
|
hpet= [IA-32,HPET] option to disable HPET and use PIT.
|
||||||
Format: disable
|
Format: disable
|
||||||
|
|
||||||
@ -1284,6 +1290,19 @@ running once the system is up.
|
|||||||
New name for the ramdisk parameter.
|
New name for the ramdisk parameter.
|
||||||
See Documentation/ramdisk.txt.
|
See Documentation/ramdisk.txt.
|
||||||
|
|
||||||
|
rcu.blimit= [KNL,BOOT] Set maximum number of finished
|
||||||
|
RCU callbacks to process in one batch.
|
||||||
|
|
||||||
|
rcu.qhimark= [KNL,BOOT] Set threshold of queued
|
||||||
|
RCU callbacks over which batch limiting is disabled.
|
||||||
|
|
||||||
|
rcu.qlowmark= [KNL,BOOT] Set threshold of queued
|
||||||
|
RCU callbacks below which batch limiting is re-enabled.
|
||||||
|
|
||||||
|
rcu.rsinterval= [KNL,BOOT,SMP] Set the number of additional
|
||||||
|
RCU callbacks to queued before forcing reschedule
|
||||||
|
on all cpus.
|
||||||
|
|
||||||
rdinit= [KNL]
|
rdinit= [KNL]
|
||||||
Format: <full_path>
|
Format: <full_path>
|
||||||
Run specified binary instead of /init from the ramdisk,
|
Run specified binary instead of /init from the ramdisk,
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
12 -> Medion 7134 [16be:0003]
|
12 -> Medion 7134 [16be:0003]
|
||||||
13 -> Typhoon TV+Radio 90031
|
13 -> Typhoon TV+Radio 90031
|
||||||
14 -> ELSA EX-VISION 300TV [1048:226b]
|
14 -> ELSA EX-VISION 300TV [1048:226b]
|
||||||
15 -> ELSA EX-VISION 500TV [1048:226b]
|
15 -> ELSA EX-VISION 500TV [1048:226a]
|
||||||
16 -> ASUS TV-FM 7134 [1043:4842,1043:4830,1043:4840]
|
16 -> ASUS TV-FM 7134 [1043:4842,1043:4830,1043:4840]
|
||||||
17 -> AOPEN VA1000 POWER [1131:7133]
|
17 -> AOPEN VA1000 POWER [1131:7133]
|
||||||
18 -> BMK MPEX No Tuner
|
18 -> BMK MPEX No Tuner
|
||||||
@ -75,7 +75,7 @@
|
|||||||
74 -> LifeView FlyTV Platinum Mini2 [14c0:1212]
|
74 -> LifeView FlyTV Platinum Mini2 [14c0:1212]
|
||||||
75 -> AVerMedia AVerTVHD MCE A180 [1461:1044]
|
75 -> AVerMedia AVerTVHD MCE A180 [1461:1044]
|
||||||
76 -> SKNet MonsterTV Mobile [1131:4ee9]
|
76 -> SKNet MonsterTV Mobile [1131:4ee9]
|
||||||
77 -> Pinnacle PCTV 110i (saa7133) [11bd:002e]
|
77 -> Pinnacle PCTV 40i/50i/110i (saa7133) [11bd:002e]
|
||||||
78 -> ASUSTeK P7131 Dual [1043:4862]
|
78 -> ASUSTeK P7131 Dual [1043:4862]
|
||||||
79 -> Sedna/MuchTV PC TV Cardbus TV/Radio (ITO25 Rev:2B)
|
79 -> Sedna/MuchTV PC TV Cardbus TV/Radio (ITO25 Rev:2B)
|
||||||
80 -> ASUS Digimatrix TV [1043:0210]
|
80 -> ASUS Digimatrix TV [1043:0210]
|
||||||
|
@ -838,7 +838,6 @@ S: Maintained
|
|||||||
|
|
||||||
DVB SUBSYSTEM AND DRIVERS
|
DVB SUBSYSTEM AND DRIVERS
|
||||||
P: LinuxTV.org Project
|
P: LinuxTV.org Project
|
||||||
M: mchehab@infradead.org
|
|
||||||
M: v4l-dvb-maintainer@linuxtv.org
|
M: v4l-dvb-maintainer@linuxtv.org
|
||||||
L: linux-dvb@linuxtv.org (subscription required)
|
L: linux-dvb@linuxtv.org (subscription required)
|
||||||
W: http://linuxtv.org/
|
W: http://linuxtv.org/
|
||||||
@ -1632,8 +1631,8 @@ S: Supported
|
|||||||
|
|
||||||
LINUX SECURITY MODULE (LSM) FRAMEWORK
|
LINUX SECURITY MODULE (LSM) FRAMEWORK
|
||||||
P: Chris Wright
|
P: Chris Wright
|
||||||
M: chrisw@osdl.org
|
M: chrisw@sous-sol.org
|
||||||
L: linux-security-module@wirex.com
|
L: linux-security-module@vger.kernel.org
|
||||||
W: http://lsm.immunix.org
|
W: http://lsm.immunix.org
|
||||||
T: git kernel.org:/pub/scm/linux/kernel/git/chrisw/lsm-2.6.git
|
T: git kernel.org:/pub/scm/linux/kernel/git/chrisw/lsm-2.6.git
|
||||||
S: Supported
|
S: Supported
|
||||||
|
2
Makefile
2
Makefile
@ -905,7 +905,7 @@ define filechk_version.h
|
|||||||
)
|
)
|
||||||
endef
|
endef
|
||||||
|
|
||||||
include/linux/version.h: $(srctree)/Makefile .config FORCE
|
include/linux/version.h: $(srctree)/Makefile .config .kernelrelease FORCE
|
||||||
$(call filechk,version.h)
|
$(call filechk,version.h)
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
@ -151,8 +151,13 @@ handle_irq(int irq, struct pt_regs * regs)
|
|||||||
}
|
}
|
||||||
|
|
||||||
irq_enter();
|
irq_enter();
|
||||||
|
/*
|
||||||
|
* __do_IRQ() must be called with IPL_MAX. Note that we do not
|
||||||
|
* explicitly enable interrupts afterwards - some MILO PALcode
|
||||||
|
* (namely LX164 one) seems to have severe problems with RTI
|
||||||
|
* at IPL 0.
|
||||||
|
*/
|
||||||
local_irq_disable();
|
local_irq_disable();
|
||||||
__do_IRQ(irq, regs);
|
__do_IRQ(irq, regs);
|
||||||
local_irq_enable();
|
|
||||||
irq_exit();
|
irq_exit();
|
||||||
}
|
}
|
||||||
|
@ -78,7 +78,7 @@ menu "System Type"
|
|||||||
|
|
||||||
choice
|
choice
|
||||||
prompt "ARM system type"
|
prompt "ARM system type"
|
||||||
default ARCH_RPC
|
default ARCH_VERSATILE
|
||||||
|
|
||||||
config ARCH_CLPS7500
|
config ARCH_CLPS7500
|
||||||
bool "Cirrus-CL-PS7500FE"
|
bool "Cirrus-CL-PS7500FE"
|
||||||
|
@ -422,12 +422,14 @@ static int timer_dyn_tick_disable(void)
|
|||||||
void timer_dyn_reprogram(void)
|
void timer_dyn_reprogram(void)
|
||||||
{
|
{
|
||||||
struct dyn_tick_timer *dyn_tick = system_timer->dyn_tick;
|
struct dyn_tick_timer *dyn_tick = system_timer->dyn_tick;
|
||||||
|
unsigned long next, seq;
|
||||||
|
|
||||||
if (dyn_tick) {
|
if (dyn_tick && (dyn_tick->state & DYN_TICK_ENABLED)) {
|
||||||
write_seqlock(&xtime_lock);
|
next = next_timer_interrupt();
|
||||||
if (dyn_tick->state & DYN_TICK_ENABLED)
|
do {
|
||||||
|
seq = read_seqbegin(&xtime_lock);
|
||||||
dyn_tick->reprogram(next_timer_interrupt() - jiffies);
|
dyn_tick->reprogram(next_timer_interrupt() - jiffies);
|
||||||
write_sequnlock(&xtime_lock);
|
} while (read_seqretry(&xtime_lock, seq));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -56,6 +56,9 @@ static int __init nas100d_power_init(void)
|
|||||||
|
|
||||||
static void __exit nas100d_power_exit(void)
|
static void __exit nas100d_power_exit(void)
|
||||||
{
|
{
|
||||||
|
if (!(machine_is_nas100d()))
|
||||||
|
return;
|
||||||
|
|
||||||
free_irq(NAS100D_RB_IRQ, NULL);
|
free_irq(NAS100D_RB_IRQ, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -80,6 +80,7 @@ ENTRY(v6wbi_flush_kern_tlb_range)
|
|||||||
add r0, r0, #PAGE_SZ
|
add r0, r0, #PAGE_SZ
|
||||||
cmp r0, r1
|
cmp r0, r1
|
||||||
blo 1b
|
blo 1b
|
||||||
|
mcr p15, 0, r2, c7, c10, 4 @ data synchronization barrier
|
||||||
mov pc, lr
|
mov pc, lr
|
||||||
|
|
||||||
.section ".text.init", #alloc, #execinstr
|
.section ".text.init", #alloc, #execinstr
|
||||||
|
@ -45,6 +45,9 @@
|
|||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
#include <asm/pgtable.h>
|
#include <asm/pgtable.h>
|
||||||
|
|
||||||
|
void (*pm_power_off)(void) = NULL;
|
||||||
|
EXPORT_SYMBOL(pm_power_off);
|
||||||
|
|
||||||
asmlinkage void ret_from_fork(void);
|
asmlinkage void ret_from_fork(void);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -11,7 +11,7 @@ obj-y := process.o semaphore.o signal.o entry.o traps.o irq.o \
|
|||||||
|
|
||||||
obj-y += cpu/
|
obj-y += cpu/
|
||||||
obj-y += timers/
|
obj-y += timers/
|
||||||
obj-$(CONFIG_ACPI) += acpi/
|
obj-y += acpi/
|
||||||
obj-$(CONFIG_X86_BIOS_REBOOT) += reboot.o
|
obj-$(CONFIG_X86_BIOS_REBOOT) += reboot.o
|
||||||
obj-$(CONFIG_MCA) += mca.o
|
obj-$(CONFIG_MCA) += mca.o
|
||||||
obj-$(CONFIG_X86_MSR) += msr.o
|
obj-$(CONFIG_X86_MSR) += msr.o
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
obj-y := boot.o
|
obj-$(CONFIG_ACPI) += boot.o
|
||||||
obj-$(CONFIG_X86_IO_APIC) += earlyquirk.o
|
obj-$(CONFIG_X86_IO_APIC) += earlyquirk.o
|
||||||
obj-$(CONFIG_ACPI_SLEEP) += sleep.o wakeup.o
|
obj-$(CONFIG_ACPI_SLEEP) += sleep.o wakeup.o
|
||||||
|
|
||||||
|
@ -1111,9 +1111,6 @@ int __init acpi_boot_table_init(void)
|
|||||||
disable_acpi();
|
disable_acpi();
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
#ifdef __i386__
|
|
||||||
check_acpi_pci();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
acpi_table_parse(ACPI_BOOT, acpi_parse_sbf);
|
acpi_table_parse(ACPI_BOOT, acpi_parse_sbf);
|
||||||
|
|
||||||
|
@ -7,14 +7,22 @@
|
|||||||
#include <linux/pci.h>
|
#include <linux/pci.h>
|
||||||
#include <asm/pci-direct.h>
|
#include <asm/pci-direct.h>
|
||||||
#include <asm/acpi.h>
|
#include <asm/acpi.h>
|
||||||
|
#include <asm/apic.h>
|
||||||
|
|
||||||
static int __init check_bridge(int vendor, int device)
|
static int __init check_bridge(int vendor, int device)
|
||||||
{
|
{
|
||||||
|
#ifdef CONFIG_ACPI
|
||||||
/* According to Nvidia all timer overrides are bogus. Just ignore
|
/* According to Nvidia all timer overrides are bogus. Just ignore
|
||||||
them all. */
|
them all. */
|
||||||
if (vendor == PCI_VENDOR_ID_NVIDIA) {
|
if (vendor == PCI_VENDOR_ID_NVIDIA) {
|
||||||
acpi_skip_timer_override = 1;
|
acpi_skip_timer_override = 1;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
if (vendor == PCI_VENDOR_ID_ATI && timer_over_8254 == 1) {
|
||||||
|
timer_over_8254 = 0;
|
||||||
|
printk(KERN_INFO "ATI board detected. Disabling timer routing "
|
||||||
|
"over 8254.\n");
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -278,10 +278,10 @@ void __devinit generic_identify(struct cpuinfo_x86 * c)
|
|||||||
c->x86_capability[4] = excap;
|
c->x86_capability[4] = excap;
|
||||||
c->x86 = (tfms >> 8) & 15;
|
c->x86 = (tfms >> 8) & 15;
|
||||||
c->x86_model = (tfms >> 4) & 15;
|
c->x86_model = (tfms >> 4) & 15;
|
||||||
if (c->x86 == 0xf) {
|
if (c->x86 == 0xf)
|
||||||
c->x86 += (tfms >> 20) & 0xff;
|
c->x86 += (tfms >> 20) & 0xff;
|
||||||
|
if (c->x86 >= 0x6)
|
||||||
c->x86_model += ((tfms >> 16) & 0xF) << 4;
|
c->x86_model += ((tfms >> 16) & 0xF) << 4;
|
||||||
}
|
|
||||||
c->x86_mask = tfms & 15;
|
c->x86_mask = tfms & 15;
|
||||||
} else {
|
} else {
|
||||||
/* Have CPUID level 0 only - unheard of */
|
/* Have CPUID level 0 only - unheard of */
|
||||||
|
@ -70,10 +70,13 @@ static void efi_call_phys_prelog(void)
|
|||||||
{
|
{
|
||||||
unsigned long cr4;
|
unsigned long cr4;
|
||||||
unsigned long temp;
|
unsigned long temp;
|
||||||
|
struct Xgt_desc_struct *cpu_gdt_descr;
|
||||||
|
|
||||||
spin_lock(&efi_rt_lock);
|
spin_lock(&efi_rt_lock);
|
||||||
local_irq_save(efi_rt_eflags);
|
local_irq_save(efi_rt_eflags);
|
||||||
|
|
||||||
|
cpu_gdt_descr = &per_cpu(cpu_gdt_descr, 0);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If I don't have PSE, I should just duplicate two entries in page
|
* If I don't have PSE, I should just duplicate two entries in page
|
||||||
* directory. If I have PSE, I just need to duplicate one entry in
|
* directory. If I have PSE, I just need to duplicate one entry in
|
||||||
@ -103,18 +106,17 @@ static void efi_call_phys_prelog(void)
|
|||||||
*/
|
*/
|
||||||
local_flush_tlb();
|
local_flush_tlb();
|
||||||
|
|
||||||
per_cpu(cpu_gdt_descr, 0).address =
|
cpu_gdt_descr->address = __pa(cpu_gdt_descr->address);
|
||||||
__pa(per_cpu(cpu_gdt_descr, 0).address);
|
load_gdt(cpu_gdt_descr);
|
||||||
load_gdt((struct Xgt_desc_struct *)__pa(&per_cpu(cpu_gdt_descr, 0)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void efi_call_phys_epilog(void)
|
static void efi_call_phys_epilog(void)
|
||||||
{
|
{
|
||||||
unsigned long cr4;
|
unsigned long cr4;
|
||||||
|
struct Xgt_desc_struct *cpu_gdt_descr = &per_cpu(cpu_gdt_descr, 0);
|
||||||
|
|
||||||
per_cpu(cpu_gdt_descr, 0).address =
|
cpu_gdt_descr->address = __va(cpu_gdt_descr->address);
|
||||||
(unsigned long)__va(per_cpu(cpu_gdt_descr, 0).address);
|
load_gdt(cpu_gdt_descr);
|
||||||
load_gdt((struct Xgt_desc_struct *)__va(&per_cpu(cpu_gdt_descr, 0)));
|
|
||||||
|
|
||||||
cr4 = read_cr4();
|
cr4 = read_cr4();
|
||||||
|
|
||||||
|
@ -51,6 +51,8 @@ static struct { int pin, apic; } ioapic_i8259 = { -1, -1 };
|
|||||||
|
|
||||||
static DEFINE_SPINLOCK(ioapic_lock);
|
static DEFINE_SPINLOCK(ioapic_lock);
|
||||||
|
|
||||||
|
int timer_over_8254 __initdata = 1;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Is the SiS APIC rmw bug present ?
|
* Is the SiS APIC rmw bug present ?
|
||||||
* -1 = don't know, 0 = no, 1 = yes
|
* -1 = don't know, 0 = no, 1 = yes
|
||||||
@ -2267,7 +2269,8 @@ static inline void check_timer(void)
|
|||||||
apic_write_around(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_EXTINT);
|
apic_write_around(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_EXTINT);
|
||||||
init_8259A(1);
|
init_8259A(1);
|
||||||
timer_ack = 1;
|
timer_ack = 1;
|
||||||
enable_8259A_irq(0);
|
if (timer_over_8254 > 0)
|
||||||
|
enable_8259A_irq(0);
|
||||||
|
|
||||||
pin1 = find_isa_irq_pin(0, mp_INT);
|
pin1 = find_isa_irq_pin(0, mp_INT);
|
||||||
apic1 = find_isa_irq_apic(0, mp_INT);
|
apic1 = find_isa_irq_apic(0, mp_INT);
|
||||||
@ -2392,6 +2395,20 @@ void __init setup_IO_APIC(void)
|
|||||||
print_IO_APIC();
|
print_IO_APIC();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int __init setup_disable_8254_timer(char *s)
|
||||||
|
{
|
||||||
|
timer_over_8254 = -1;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
static int __init setup_enable_8254_timer(char *s)
|
||||||
|
{
|
||||||
|
timer_over_8254 = 2;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
__setup("disable_8254_timer", setup_disable_8254_timer);
|
||||||
|
__setup("enable_8254_timer", setup_enable_8254_timer);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Called after all the initialization is done. If we didnt find any
|
* Called after all the initialization is done. If we didnt find any
|
||||||
* APIC bugs then we can allow the modify fast path
|
* APIC bugs then we can allow the modify fast path
|
||||||
|
@ -116,13 +116,13 @@ static void load_segments(void)
|
|||||||
__asm__ __volatile__ (
|
__asm__ __volatile__ (
|
||||||
"\tljmp $"STR(__KERNEL_CS)",$1f\n"
|
"\tljmp $"STR(__KERNEL_CS)",$1f\n"
|
||||||
"\t1:\n"
|
"\t1:\n"
|
||||||
"\tmovl $"STR(__KERNEL_DS)",%eax\n"
|
"\tmovl $"STR(__KERNEL_DS)",%%eax\n"
|
||||||
"\tmovl %eax,%ds\n"
|
"\tmovl %%eax,%%ds\n"
|
||||||
"\tmovl %eax,%es\n"
|
"\tmovl %%eax,%%es\n"
|
||||||
"\tmovl %eax,%fs\n"
|
"\tmovl %%eax,%%fs\n"
|
||||||
"\tmovl %eax,%gs\n"
|
"\tmovl %%eax,%%gs\n"
|
||||||
"\tmovl %eax,%ss\n"
|
"\tmovl %%eax,%%ss\n"
|
||||||
);
|
::: "eax", "memory");
|
||||||
#undef STR
|
#undef STR
|
||||||
#undef __STR
|
#undef __STR
|
||||||
}
|
}
|
||||||
|
@ -357,7 +357,7 @@ static void clear_msr_range(unsigned int base, unsigned int n)
|
|||||||
wrmsr(base+i, 0, 0);
|
wrmsr(base+i, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void write_watchdog_counter(const char *descr)
|
static void write_watchdog_counter(const char *descr)
|
||||||
{
|
{
|
||||||
u64 count = (u64)cpu_khz * 1000;
|
u64 count = (u64)cpu_khz * 1000;
|
||||||
|
|
||||||
@ -544,7 +544,7 @@ void nmi_watchdog_tick (struct pt_regs * regs)
|
|||||||
* die_nmi will return ONLY if NOTIFY_STOP happens..
|
* die_nmi will return ONLY if NOTIFY_STOP happens..
|
||||||
*/
|
*/
|
||||||
die_nmi(regs, "NMI Watchdog detected LOCKUP");
|
die_nmi(regs, "NMI Watchdog detected LOCKUP");
|
||||||
|
} else {
|
||||||
last_irq_sums[cpu] = sum;
|
last_irq_sums[cpu] = sum;
|
||||||
alert_counter[cpu] = 0;
|
alert_counter[cpu] = 0;
|
||||||
}
|
}
|
||||||
|
@ -1599,6 +1599,10 @@ void __init setup_arch(char **cmdline_p)
|
|||||||
if (efi_enabled)
|
if (efi_enabled)
|
||||||
efi_map_memmap();
|
efi_map_memmap();
|
||||||
|
|
||||||
|
#ifdef CONFIG_X86_IO_APIC
|
||||||
|
check_acpi_pci(); /* Checks more than just ACPI actually */
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_ACPI
|
#ifdef CONFIG_ACPI
|
||||||
/*
|
/*
|
||||||
* Parse the ACPI tables for possible boot-time SMP configuration.
|
* Parse the ACPI tables for possible boot-time SMP configuration.
|
||||||
|
@ -412,9 +412,9 @@ static int timer_resume(struct sys_device *dev)
|
|||||||
write_seqlock_irqsave(&xtime_lock, flags);
|
write_seqlock_irqsave(&xtime_lock, flags);
|
||||||
xtime.tv_sec = sec;
|
xtime.tv_sec = sec;
|
||||||
xtime.tv_nsec = 0;
|
xtime.tv_nsec = 0;
|
||||||
write_sequnlock_irqrestore(&xtime_lock, flags);
|
jiffies_64 += sleep_length;
|
||||||
jiffies += sleep_length;
|
|
||||||
wall_jiffies += sleep_length;
|
wall_jiffies += sleep_length;
|
||||||
|
write_sequnlock_irqrestore(&xtime_lock, flags);
|
||||||
if (last_timer->resume)
|
if (last_timer->resume)
|
||||||
last_timer->resume();
|
last_timer->resume();
|
||||||
cur_timer = last_timer;
|
cur_timer = last_timer;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#
|
#
|
||||||
# Automatically generated make config: don't edit
|
# Automatically generated make config: don't edit
|
||||||
# Linux kernel version: 2.6.16-rc5
|
# Linux kernel version: 2.6.16-rc5
|
||||||
# Mon Feb 27 16:15:43 2006
|
# Thu Mar 2 16:39:10 2006
|
||||||
#
|
#
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -312,7 +312,13 @@ CONFIG_FW_LOADER=m
|
|||||||
#
|
#
|
||||||
# Plug and Play support
|
# Plug and Play support
|
||||||
#
|
#
|
||||||
# CONFIG_PNP is not set
|
CONFIG_PNP=y
|
||||||
|
# CONFIG_PNP_DEBUG is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Protocols
|
||||||
|
#
|
||||||
|
CONFIG_PNPACPI=y
|
||||||
|
|
||||||
#
|
#
|
||||||
# Block devices
|
# Block devices
|
||||||
@ -357,6 +363,7 @@ CONFIG_BLK_DEV_IDESCSI=m
|
|||||||
# IDE chipset support/bugfixes
|
# IDE chipset support/bugfixes
|
||||||
#
|
#
|
||||||
CONFIG_IDE_GENERIC=y
|
CONFIG_IDE_GENERIC=y
|
||||||
|
# CONFIG_BLK_DEV_IDEPNP is not set
|
||||||
CONFIG_BLK_DEV_IDEPCI=y
|
CONFIG_BLK_DEV_IDEPCI=y
|
||||||
# CONFIG_IDEPCI_SHARE_IRQ is not set
|
# CONFIG_IDEPCI_SHARE_IRQ is not set
|
||||||
# CONFIG_BLK_DEV_OFFBOARD is not set
|
# CONFIG_BLK_DEV_OFFBOARD is not set
|
||||||
@ -525,6 +532,7 @@ CONFIG_DUMMY=m
|
|||||||
# CONFIG_BONDING is not set
|
# CONFIG_BONDING is not set
|
||||||
# CONFIG_EQUALIZER is not set
|
# CONFIG_EQUALIZER is not set
|
||||||
# CONFIG_TUN is not set
|
# CONFIG_TUN is not set
|
||||||
|
# CONFIG_NET_SB1000 is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# ARCnet devices
|
# ARCnet devices
|
||||||
|
@ -36,7 +36,7 @@ int __init init_cyclone_clock(void)
|
|||||||
u32* volatile cyclone_timer; /* Cyclone MPMC0 register */
|
u32* volatile cyclone_timer; /* Cyclone MPMC0 register */
|
||||||
|
|
||||||
if (!use_cyclone)
|
if (!use_cyclone)
|
||||||
return -ENODEV;
|
return 0;
|
||||||
|
|
||||||
printk(KERN_INFO "Summit chipset: Starting Cyclone Counter.\n");
|
printk(KERN_INFO "Summit chipset: Starting Cyclone Counter.\n");
|
||||||
|
|
||||||
|
@ -561,11 +561,12 @@ ENTRY(dirty_bit)
|
|||||||
;; // avoid RAW on r18
|
;; // avoid RAW on r18
|
||||||
mov ar.ccv=r18 // set compare value for cmpxchg
|
mov ar.ccv=r18 // set compare value for cmpxchg
|
||||||
or r25=_PAGE_D|_PAGE_A,r18 // set the dirty and accessed bits
|
or r25=_PAGE_D|_PAGE_A,r18 // set the dirty and accessed bits
|
||||||
|
tbit.z p7,p6 = r18,_PAGE_P_BIT // Check present bit
|
||||||
;;
|
;;
|
||||||
cmpxchg8.acq r26=[r17],r25,ar.ccv
|
(p6) cmpxchg8.acq r26=[r17],r25,ar.ccv // Only update if page is present
|
||||||
mov r24=PAGE_SHIFT<<2
|
mov r24=PAGE_SHIFT<<2
|
||||||
;;
|
;;
|
||||||
cmp.eq p6,p7=r26,r18
|
(p6) cmp.eq p6,p7=r26,r18 // Only compare if page is present
|
||||||
;;
|
;;
|
||||||
(p6) itc.d r25 // install updated PTE
|
(p6) itc.d r25 // install updated PTE
|
||||||
;;
|
;;
|
||||||
@ -626,11 +627,12 @@ ENTRY(iaccess_bit)
|
|||||||
;;
|
;;
|
||||||
mov ar.ccv=r18 // set compare value for cmpxchg
|
mov ar.ccv=r18 // set compare value for cmpxchg
|
||||||
or r25=_PAGE_A,r18 // set the accessed bit
|
or r25=_PAGE_A,r18 // set the accessed bit
|
||||||
|
tbit.z p7,p6 = r18,_PAGE_P_BIT // Check present bit
|
||||||
;;
|
;;
|
||||||
cmpxchg8.acq r26=[r17],r25,ar.ccv
|
(p6) cmpxchg8.acq r26=[r17],r25,ar.ccv // Only if page present
|
||||||
mov r24=PAGE_SHIFT<<2
|
mov r24=PAGE_SHIFT<<2
|
||||||
;;
|
;;
|
||||||
cmp.eq p6,p7=r26,r18
|
(p6) cmp.eq p6,p7=r26,r18 // Only if page present
|
||||||
;;
|
;;
|
||||||
(p6) itc.i r25 // install updated PTE
|
(p6) itc.i r25 // install updated PTE
|
||||||
;;
|
;;
|
||||||
@ -680,11 +682,12 @@ ENTRY(daccess_bit)
|
|||||||
;; // avoid RAW on r18
|
;; // avoid RAW on r18
|
||||||
mov ar.ccv=r18 // set compare value for cmpxchg
|
mov ar.ccv=r18 // set compare value for cmpxchg
|
||||||
or r25=_PAGE_A,r18 // set the dirty bit
|
or r25=_PAGE_A,r18 // set the dirty bit
|
||||||
|
tbit.z p7,p6 = r18,_PAGE_P_BIT // Check present bit
|
||||||
;;
|
;;
|
||||||
cmpxchg8.acq r26=[r17],r25,ar.ccv
|
(p6) cmpxchg8.acq r26=[r17],r25,ar.ccv // Only if page is present
|
||||||
mov r24=PAGE_SHIFT<<2
|
mov r24=PAGE_SHIFT<<2
|
||||||
;;
|
;;
|
||||||
cmp.eq p6,p7=r26,r18
|
(p6) cmp.eq p6,p7=r26,r18 // Only if page is present
|
||||||
;;
|
;;
|
||||||
(p6) itc.d r25 // install updated PTE
|
(p6) itc.d r25 // install updated PTE
|
||||||
/*
|
/*
|
||||||
|
@ -123,8 +123,9 @@ mca_page_isolate(unsigned long paddr)
|
|||||||
void
|
void
|
||||||
mca_handler_bh(unsigned long paddr)
|
mca_handler_bh(unsigned long paddr)
|
||||||
{
|
{
|
||||||
printk(KERN_DEBUG "OS_MCA: process [pid: %d](%s) encounters MCA.\n",
|
printk(KERN_ERR
|
||||||
current->pid, current->comm);
|
"OS_MCA: process [pid: %d](%s) encounters MCA (paddr=%lx)\n",
|
||||||
|
current->pid, current->comm, paddr);
|
||||||
|
|
||||||
spin_lock(&mca_bh_lock);
|
spin_lock(&mca_bh_lock);
|
||||||
switch (mca_page_isolate(paddr)) {
|
switch (mca_page_isolate(paddr)) {
|
||||||
@ -132,7 +133,7 @@ mca_handler_bh(unsigned long paddr)
|
|||||||
printk(KERN_DEBUG "Page isolation: ( %lx ) success.\n", paddr);
|
printk(KERN_DEBUG "Page isolation: ( %lx ) success.\n", paddr);
|
||||||
break;
|
break;
|
||||||
case ISOLATE_NG:
|
case ISOLATE_NG:
|
||||||
printk(KERN_DEBUG "Page isolation: ( %lx ) failure.\n", paddr);
|
printk(KERN_CRIT "Page isolation: ( %lx ) failure.\n", paddr);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@ -567,10 +568,15 @@ recover_from_processor_error(int platform, slidx_table_t *slidx,
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If there is no bus error, record is weird but we need not to recover.
|
* The cache check and bus check bits have four possible states
|
||||||
|
* cc bc
|
||||||
|
* 0 0 Weird record, not recovered
|
||||||
|
* 1 0 Cache error, not recovered
|
||||||
|
* 0 1 I/O error, attempt recovery
|
||||||
|
* 1 1 Memory error, attempt recovery
|
||||||
*/
|
*/
|
||||||
if (psp->bc == 0 || pbci == NULL)
|
if (psp->bc == 0 || pbci == NULL)
|
||||||
return 1;
|
return 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Sorry, we cannot handle so many.
|
* Sorry, we cannot handle so many.
|
||||||
|
@ -446,7 +446,7 @@ static struct proc_dir_entry *proc_sn2_ptc;
|
|||||||
static int __init sn2_ptc_init(void)
|
static int __init sn2_ptc_init(void)
|
||||||
{
|
{
|
||||||
if (!ia64_platform_is("sn2"))
|
if (!ia64_platform_is("sn2"))
|
||||||
return -ENOSYS;
|
return 0;
|
||||||
|
|
||||||
if (!(proc_sn2_ptc = create_proc_entry(PTC_BASENAME, 0444, NULL))) {
|
if (!(proc_sn2_ptc = create_proc_entry(PTC_BASENAME, 0444, NULL))) {
|
||||||
printk(KERN_ERR "unable to create %s proc entry", PTC_BASENAME);
|
printk(KERN_ERR "unable to create %s proc entry", PTC_BASENAME);
|
||||||
|
@ -484,7 +484,7 @@ static int __init tiocx_init(void)
|
|||||||
int found_tiocx_device = 0;
|
int found_tiocx_device = 0;
|
||||||
|
|
||||||
if (!ia64_platform_is("sn2"))
|
if (!ia64_platform_is("sn2"))
|
||||||
return -ENODEV;
|
return 0;
|
||||||
|
|
||||||
bus_register(&tiocx_bus_type);
|
bus_register(&tiocx_bus_type);
|
||||||
|
|
||||||
|
@ -1053,6 +1053,7 @@ config CPU_MIPS32_R1
|
|||||||
depends on SYS_HAS_CPU_MIPS32_R1
|
depends on SYS_HAS_CPU_MIPS32_R1
|
||||||
select CPU_HAS_PREFETCH
|
select CPU_HAS_PREFETCH
|
||||||
select CPU_SUPPORTS_32BIT_KERNEL
|
select CPU_SUPPORTS_32BIT_KERNEL
|
||||||
|
select CPU_SUPPORTS_HIGHMEM
|
||||||
help
|
help
|
||||||
Choose this option to build a kernel for release 1 or later of the
|
Choose this option to build a kernel for release 1 or later of the
|
||||||
MIPS32 architecture. Most modern embedded systems with a 32-bit
|
MIPS32 architecture. Most modern embedded systems with a 32-bit
|
||||||
@ -1069,6 +1070,7 @@ config CPU_MIPS32_R2
|
|||||||
depends on SYS_HAS_CPU_MIPS32_R2
|
depends on SYS_HAS_CPU_MIPS32_R2
|
||||||
select CPU_HAS_PREFETCH
|
select CPU_HAS_PREFETCH
|
||||||
select CPU_SUPPORTS_32BIT_KERNEL
|
select CPU_SUPPORTS_32BIT_KERNEL
|
||||||
|
select CPU_SUPPORTS_HIGHMEM
|
||||||
help
|
help
|
||||||
Choose this option to build a kernel for release 2 or later of the
|
Choose this option to build a kernel for release 2 or later of the
|
||||||
MIPS32 architecture. Most modern embedded systems with a 32-bit
|
MIPS32 architecture. Most modern embedded systems with a 32-bit
|
||||||
@ -1082,6 +1084,7 @@ config CPU_MIPS64_R1
|
|||||||
select CPU_HAS_PREFETCH
|
select CPU_HAS_PREFETCH
|
||||||
select CPU_SUPPORTS_32BIT_KERNEL
|
select CPU_SUPPORTS_32BIT_KERNEL
|
||||||
select CPU_SUPPORTS_64BIT_KERNEL
|
select CPU_SUPPORTS_64BIT_KERNEL
|
||||||
|
select CPU_SUPPORTS_HIGHMEM
|
||||||
help
|
help
|
||||||
Choose this option to build a kernel for release 1 or later of the
|
Choose this option to build a kernel for release 1 or later of the
|
||||||
MIPS64 architecture. Many modern embedded systems with a 64-bit
|
MIPS64 architecture. Many modern embedded systems with a 64-bit
|
||||||
@ -1099,6 +1102,7 @@ config CPU_MIPS64_R2
|
|||||||
select CPU_HAS_PREFETCH
|
select CPU_HAS_PREFETCH
|
||||||
select CPU_SUPPORTS_32BIT_KERNEL
|
select CPU_SUPPORTS_32BIT_KERNEL
|
||||||
select CPU_SUPPORTS_64BIT_KERNEL
|
select CPU_SUPPORTS_64BIT_KERNEL
|
||||||
|
select CPU_SUPPORTS_HIGHMEM
|
||||||
help
|
help
|
||||||
Choose this option to build a kernel for release 2 or later of the
|
Choose this option to build a kernel for release 2 or later of the
|
||||||
MIPS64 architecture. Many modern embedded systems with a 64-bit
|
MIPS64 architecture. Many modern embedded systems with a 64-bit
|
||||||
|
@ -95,6 +95,7 @@ endif
|
|||||||
# crossformat linking we rely on the elf2ecoff tool for format conversion.
|
# crossformat linking we rely on the elf2ecoff tool for format conversion.
|
||||||
#
|
#
|
||||||
cflags-y += -G 0 -mno-abicalls -fno-pic -pipe
|
cflags-y += -G 0 -mno-abicalls -fno-pic -pipe
|
||||||
|
cflags-y += -msoft-float
|
||||||
LDFLAGS_vmlinux += -G 0 -static -n -nostdlib
|
LDFLAGS_vmlinux += -G 0 -static -n -nostdlib
|
||||||
MODFLAGS += -mlong-calls
|
MODFLAGS += -mlong-calls
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@ static void prom_console_write(struct console *co, const char *s,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __init prom_console_setup(struct console *co, char *options)
|
static int prom_console_setup(struct console *co, char *options)
|
||||||
{
|
{
|
||||||
return !(prom_flags & PROM_FLAG_USE_AS_CONSOLE);
|
return !(prom_flags & PROM_FLAG_USE_AS_CONSOLE);
|
||||||
}
|
}
|
||||||
|
@ -11,12 +11,14 @@
|
|||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <asm/ptrace.h>
|
|
||||||
#include <linux/sched.h>
|
|
||||||
#include <linux/kernel_stat.h>
|
#include <linux/kernel_stat.h>
|
||||||
|
#include <linux/mv643xx.h>
|
||||||
|
#include <linux/sched.h>
|
||||||
|
|
||||||
|
#include <asm/ptrace.h>
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <asm/irq.h>
|
#include <asm/irq.h>
|
||||||
#include <linux/mv643xx.h>
|
#include <asm/marvell.h>
|
||||||
|
|
||||||
static unsigned int irq_base;
|
static unsigned int irq_base;
|
||||||
|
|
||||||
|
@ -163,7 +163,7 @@ void do_gettimeofday(struct timeval *tv)
|
|||||||
unsigned long seq;
|
unsigned long seq;
|
||||||
unsigned long lost;
|
unsigned long lost;
|
||||||
unsigned long usec, sec;
|
unsigned long usec, sec;
|
||||||
unsigned long max_ntp_tick = tick_usec - tickadj;
|
unsigned long max_ntp_tick;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
seq = read_seqbegin(&xtime_lock);
|
seq = read_seqbegin(&xtime_lock);
|
||||||
@ -178,12 +178,13 @@ void do_gettimeofday(struct timeval *tv)
|
|||||||
* Better to lose some accuracy than have time go backwards..
|
* Better to lose some accuracy than have time go backwards..
|
||||||
*/
|
*/
|
||||||
if (unlikely(time_adjust < 0)) {
|
if (unlikely(time_adjust < 0)) {
|
||||||
|
max_ntp_tick = (USEC_PER_SEC / HZ) - tickadj;
|
||||||
usec = min(usec, max_ntp_tick);
|
usec = min(usec, max_ntp_tick);
|
||||||
|
|
||||||
if (lost)
|
if (lost)
|
||||||
usec += lost * max_ntp_tick;
|
usec += lost * max_ntp_tick;
|
||||||
} else if (unlikely(lost))
|
} else if (unlikely(lost))
|
||||||
usec += lost * tick_usec;
|
usec += lost * (USEC_PER_SEC / HZ);
|
||||||
|
|
||||||
sec = xtime.tv_sec;
|
sec = xtime.tv_sec;
|
||||||
usec += (xtime.tv_nsec / 1000);
|
usec += (xtime.tv_nsec / 1000);
|
||||||
|
@ -106,6 +106,9 @@ SECTIONS
|
|||||||
.con_initcall.init : { *(.con_initcall.init) }
|
.con_initcall.init : { *(.con_initcall.init) }
|
||||||
__con_initcall_end = .;
|
__con_initcall_end = .;
|
||||||
SECURITY_INIT
|
SECURITY_INIT
|
||||||
|
/* .exit.text is discarded at runtime, not link time, to deal with
|
||||||
|
references from .rodata */
|
||||||
|
.exit.text : { *(.exit.text) }
|
||||||
. = ALIGN(_PAGE_SIZE);
|
. = ALIGN(_PAGE_SIZE);
|
||||||
__initramfs_start = .;
|
__initramfs_start = .;
|
||||||
.init.ramfs : { *(.init.ramfs) }
|
.init.ramfs : { *(.init.ramfs) }
|
||||||
@ -133,7 +136,6 @@ SECTIONS
|
|||||||
|
|
||||||
/* Sections to be discarded */
|
/* Sections to be discarded */
|
||||||
/DISCARD/ : {
|
/DISCARD/ : {
|
||||||
*(.exit.text)
|
|
||||||
*(.exit.data)
|
*(.exit.data)
|
||||||
*(.exitcall.exit)
|
*(.exitcall.exit)
|
||||||
|
|
||||||
|
@ -280,69 +280,69 @@ static void __init build_insn(u32 **buf, enum opcode opc, ...)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#define I_u1u2u3(op) \
|
#define I_u1u2u3(op) \
|
||||||
static inline void i##op(u32 **buf, unsigned int a, \
|
static inline void __init i##op(u32 **buf, unsigned int a, \
|
||||||
unsigned int b, unsigned int c) \
|
unsigned int b, unsigned int c) \
|
||||||
{ \
|
{ \
|
||||||
build_insn(buf, insn##op, a, b, c); \
|
build_insn(buf, insn##op, a, b, c); \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define I_u2u1u3(op) \
|
#define I_u2u1u3(op) \
|
||||||
static inline void i##op(u32 **buf, unsigned int a, \
|
static inline void __init i##op(u32 **buf, unsigned int a, \
|
||||||
unsigned int b, unsigned int c) \
|
unsigned int b, unsigned int c) \
|
||||||
{ \
|
{ \
|
||||||
build_insn(buf, insn##op, b, a, c); \
|
build_insn(buf, insn##op, b, a, c); \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define I_u3u1u2(op) \
|
#define I_u3u1u2(op) \
|
||||||
static inline void i##op(u32 **buf, unsigned int a, \
|
static inline void __init i##op(u32 **buf, unsigned int a, \
|
||||||
unsigned int b, unsigned int c) \
|
unsigned int b, unsigned int c) \
|
||||||
{ \
|
{ \
|
||||||
build_insn(buf, insn##op, b, c, a); \
|
build_insn(buf, insn##op, b, c, a); \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define I_u1u2s3(op) \
|
#define I_u1u2s3(op) \
|
||||||
static inline void i##op(u32 **buf, unsigned int a, \
|
static inline void __init i##op(u32 **buf, unsigned int a, \
|
||||||
unsigned int b, signed int c) \
|
unsigned int b, signed int c) \
|
||||||
{ \
|
{ \
|
||||||
build_insn(buf, insn##op, a, b, c); \
|
build_insn(buf, insn##op, a, b, c); \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define I_u2s3u1(op) \
|
#define I_u2s3u1(op) \
|
||||||
static inline void i##op(u32 **buf, unsigned int a, \
|
static inline void __init i##op(u32 **buf, unsigned int a, \
|
||||||
signed int b, unsigned int c) \
|
signed int b, unsigned int c) \
|
||||||
{ \
|
{ \
|
||||||
build_insn(buf, insn##op, c, a, b); \
|
build_insn(buf, insn##op, c, a, b); \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define I_u2u1s3(op) \
|
#define I_u2u1s3(op) \
|
||||||
static inline void i##op(u32 **buf, unsigned int a, \
|
static inline void __init i##op(u32 **buf, unsigned int a, \
|
||||||
unsigned int b, signed int c) \
|
unsigned int b, signed int c) \
|
||||||
{ \
|
{ \
|
||||||
build_insn(buf, insn##op, b, a, c); \
|
build_insn(buf, insn##op, b, a, c); \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define I_u1u2(op) \
|
#define I_u1u2(op) \
|
||||||
static inline void i##op(u32 **buf, unsigned int a, \
|
static inline void __init i##op(u32 **buf, unsigned int a, \
|
||||||
unsigned int b) \
|
unsigned int b) \
|
||||||
{ \
|
{ \
|
||||||
build_insn(buf, insn##op, a, b); \
|
build_insn(buf, insn##op, a, b); \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define I_u1s2(op) \
|
#define I_u1s2(op) \
|
||||||
static inline void i##op(u32 **buf, unsigned int a, \
|
static inline void __init i##op(u32 **buf, unsigned int a, \
|
||||||
signed int b) \
|
signed int b) \
|
||||||
{ \
|
{ \
|
||||||
build_insn(buf, insn##op, a, b); \
|
build_insn(buf, insn##op, a, b); \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define I_u1(op) \
|
#define I_u1(op) \
|
||||||
static inline void i##op(u32 **buf, unsigned int a) \
|
static inline void __init i##op(u32 **buf, unsigned int a) \
|
||||||
{ \
|
{ \
|
||||||
build_insn(buf, insn##op, a); \
|
build_insn(buf, insn##op, a); \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define I_0(op) \
|
#define I_0(op) \
|
||||||
static inline void i##op(u32 **buf) \
|
static inline void __init i##op(u32 **buf) \
|
||||||
{ \
|
{ \
|
||||||
build_insn(buf, insn##op); \
|
build_insn(buf, insn##op); \
|
||||||
}
|
}
|
||||||
@ -623,42 +623,42 @@ static __init int __attribute__((unused)) insn_has_bdelay(struct reloc *rel,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* convenience functions for labeled branches */
|
/* convenience functions for labeled branches */
|
||||||
static void __attribute__((unused)) il_bltz(u32 **p, struct reloc **r,
|
static void __init __attribute__((unused))
|
||||||
unsigned int reg, enum label_id l)
|
il_bltz(u32 **p, struct reloc **r, unsigned int reg, enum label_id l)
|
||||||
{
|
{
|
||||||
r_mips_pc16(r, *p, l);
|
r_mips_pc16(r, *p, l);
|
||||||
i_bltz(p, reg, 0);
|
i_bltz(p, reg, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __attribute__((unused)) il_b(u32 **p, struct reloc **r,
|
static void __init __attribute__((unused)) il_b(u32 **p, struct reloc **r,
|
||||||
enum label_id l)
|
enum label_id l)
|
||||||
{
|
{
|
||||||
r_mips_pc16(r, *p, l);
|
r_mips_pc16(r, *p, l);
|
||||||
i_b(p, 0);
|
i_b(p, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void il_beqz(u32 **p, struct reloc **r, unsigned int reg,
|
static void __init il_beqz(u32 **p, struct reloc **r, unsigned int reg,
|
||||||
enum label_id l)
|
enum label_id l)
|
||||||
{
|
{
|
||||||
r_mips_pc16(r, *p, l);
|
r_mips_pc16(r, *p, l);
|
||||||
i_beqz(p, reg, 0);
|
i_beqz(p, reg, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __attribute__((unused))
|
static void __init __attribute__((unused))
|
||||||
il_beqzl(u32 **p, struct reloc **r, unsigned int reg, enum label_id l)
|
il_beqzl(u32 **p, struct reloc **r, unsigned int reg, enum label_id l)
|
||||||
{
|
{
|
||||||
r_mips_pc16(r, *p, l);
|
r_mips_pc16(r, *p, l);
|
||||||
i_beqzl(p, reg, 0);
|
i_beqzl(p, reg, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void il_bnez(u32 **p, struct reloc **r, unsigned int reg,
|
static void __init il_bnez(u32 **p, struct reloc **r, unsigned int reg,
|
||||||
enum label_id l)
|
enum label_id l)
|
||||||
{
|
{
|
||||||
r_mips_pc16(r, *p, l);
|
r_mips_pc16(r, *p, l);
|
||||||
i_bnez(p, reg, 0);
|
i_bnez(p, reg, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void il_bgezl(u32 **p, struct reloc **r, unsigned int reg,
|
static void __init il_bgezl(u32 **p, struct reloc **r, unsigned int reg,
|
||||||
enum label_id l)
|
enum label_id l)
|
||||||
{
|
{
|
||||||
r_mips_pc16(r, *p, l);
|
r_mips_pc16(r, *p, l);
|
||||||
|
@ -21,10 +21,10 @@
|
|||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/bootmem.h>
|
#include <linux/bootmem.h>
|
||||||
|
#include <linux/mv643xx.h>
|
||||||
|
|
||||||
#include <asm/addrspace.h>
|
#include <asm/addrspace.h>
|
||||||
#include <asm/bootinfo.h>
|
#include <asm/bootinfo.h>
|
||||||
#include <asm/mv64340.h>
|
|
||||||
#include <asm/pmon.h>
|
#include <asm/pmon.h>
|
||||||
|
|
||||||
#include "jaguar_atx_fpga.h"
|
#include "jaguar_atx_fpga.h"
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
* BRIEF MODULE DESCRIPTION
|
* BRIEF MODULE DESCRIPTION
|
||||||
* Momentum Computer Jaguar-ATX board dependent boot routines
|
* Momentum Computer Jaguar-ATX board dependent boot routines
|
||||||
*
|
*
|
||||||
* Copyright (C) 1996, 1997, 2001, 2004 Ralf Baechle (ralf@linux-mips.org)
|
* Copyright (C) 1996, 1997, 2001, 04, 06 Ralf Baechle (ralf@linux-mips.org)
|
||||||
* Copyright (C) 2000 RidgeRun, Inc.
|
* Copyright (C) 2000 RidgeRun, Inc.
|
||||||
* Copyright (C) 2001 Red Hat, Inc.
|
* Copyright (C) 2001 Red Hat, Inc.
|
||||||
* Copyright (C) 2002 Momentum Computer
|
* Copyright (C) 2002 Momentum Computer
|
||||||
@ -55,6 +55,8 @@
|
|||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/timex.h>
|
#include <linux/timex.h>
|
||||||
#include <linux/vmalloc.h>
|
#include <linux/vmalloc.h>
|
||||||
|
#include <linux/mv643xx.h>
|
||||||
|
|
||||||
#include <asm/time.h>
|
#include <asm/time.h>
|
||||||
#include <asm/bootinfo.h>
|
#include <asm/bootinfo.h>
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
@ -64,7 +66,6 @@
|
|||||||
#include <asm/ptrace.h>
|
#include <asm/ptrace.h>
|
||||||
#include <asm/reboot.h>
|
#include <asm/reboot.h>
|
||||||
#include <asm/tlbflush.h>
|
#include <asm/tlbflush.h>
|
||||||
#include <asm/mv64340.h>
|
|
||||||
|
|
||||||
#include "jaguar_atx_fpga.h"
|
#include "jaguar_atx_fpga.h"
|
||||||
|
|
||||||
|
@ -41,11 +41,11 @@
|
|||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/random.h>
|
#include <linux/random.h>
|
||||||
#include <linux/bitops.h>
|
#include <linux/bitops.h>
|
||||||
|
#include <linux/mv643xx.h>
|
||||||
#include <asm/bootinfo.h>
|
#include <asm/bootinfo.h>
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <asm/irq_cpu.h>
|
#include <asm/irq_cpu.h>
|
||||||
#include <asm/mipsregs.h>
|
#include <asm/mipsregs.h>
|
||||||
#include <asm/mv64340.h>
|
|
||||||
#include <asm/system.h>
|
#include <asm/system.h>
|
||||||
|
|
||||||
extern asmlinkage void ocelot_handle_int(void);
|
extern asmlinkage void ocelot_handle_int(void);
|
||||||
|
@ -19,10 +19,10 @@
|
|||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/bootmem.h>
|
#include <linux/bootmem.h>
|
||||||
|
#include <linux/mv643xx.h>
|
||||||
|
|
||||||
#include <asm/addrspace.h>
|
#include <asm/addrspace.h>
|
||||||
#include <asm/bootinfo.h>
|
#include <asm/bootinfo.h>
|
||||||
#include <asm/mv64340.h>
|
|
||||||
#include <asm/pmon.h>
|
#include <asm/pmon.h>
|
||||||
|
|
||||||
#include "ocelot_c_fpga.h"
|
#include "ocelot_c_fpga.h"
|
||||||
|
@ -54,6 +54,7 @@
|
|||||||
#include <linux/pm.h>
|
#include <linux/pm.h>
|
||||||
#include <linux/timex.h>
|
#include <linux/timex.h>
|
||||||
#include <linux/vmalloc.h>
|
#include <linux/vmalloc.h>
|
||||||
|
#include <linux/mv643xx.h>
|
||||||
|
|
||||||
#include <asm/time.h>
|
#include <asm/time.h>
|
||||||
#include <asm/bootinfo.h>
|
#include <asm/bootinfo.h>
|
||||||
@ -64,9 +65,9 @@
|
|||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
#include <asm/ptrace.h>
|
#include <asm/ptrace.h>
|
||||||
#include <asm/reboot.h>
|
#include <asm/reboot.h>
|
||||||
|
#include <asm/marvell.h>
|
||||||
#include <linux/bootmem.h>
|
#include <linux/bootmem.h>
|
||||||
#include <linux/blkdev.h>
|
#include <linux/blkdev.h>
|
||||||
#include <asm/mv64340.h>
|
|
||||||
#include "ocelot_c_fpga.h"
|
#include "ocelot_c_fpga.h"
|
||||||
|
|
||||||
unsigned long marvell_base;
|
unsigned long marvell_base;
|
||||||
@ -252,22 +253,22 @@ void __init plat_setup(void)
|
|||||||
/* shut down ethernet ports, just to be sure our memory doesn't get
|
/* shut down ethernet ports, just to be sure our memory doesn't get
|
||||||
* corrupted by random ethernet traffic.
|
* corrupted by random ethernet traffic.
|
||||||
*/
|
*/
|
||||||
MV_WRITE(MV64340_ETH_TRANSMIT_QUEUE_COMMAND_REG(0), 0xff << 8);
|
MV_WRITE(MV643XX_ETH_TRANSMIT_QUEUE_COMMAND_REG(0), 0xff << 8);
|
||||||
MV_WRITE(MV64340_ETH_TRANSMIT_QUEUE_COMMAND_REG(1), 0xff << 8);
|
MV_WRITE(MV643XX_ETH_TRANSMIT_QUEUE_COMMAND_REG(1), 0xff << 8);
|
||||||
MV_WRITE(MV64340_ETH_RECEIVE_QUEUE_COMMAND_REG(0), 0xff << 8);
|
MV_WRITE(MV643XX_ETH_RECEIVE_QUEUE_COMMAND_REG(0), 0xff << 8);
|
||||||
MV_WRITE(MV64340_ETH_RECEIVE_QUEUE_COMMAND_REG(1), 0xff << 8);
|
MV_WRITE(MV643XX_ETH_RECEIVE_QUEUE_COMMAND_REG(1), 0xff << 8);
|
||||||
do {}
|
do {}
|
||||||
while (MV_READ(MV64340_ETH_RECEIVE_QUEUE_COMMAND_REG(0)) & 0xff);
|
while (MV_READ(MV643XX_ETH_RECEIVE_QUEUE_COMMAND_REG(0)) & 0xff);
|
||||||
do {}
|
do {}
|
||||||
while (MV_READ(MV64340_ETH_RECEIVE_QUEUE_COMMAND_REG(1)) & 0xff);
|
while (MV_READ(MV643XX_ETH_RECEIVE_QUEUE_COMMAND_REG(1)) & 0xff);
|
||||||
do {}
|
do {}
|
||||||
while (MV_READ(MV64340_ETH_TRANSMIT_QUEUE_COMMAND_REG(0)) & 0xff);
|
while (MV_READ(MV643XX_ETH_TRANSMIT_QUEUE_COMMAND_REG(0)) & 0xff);
|
||||||
do {}
|
do {}
|
||||||
while (MV_READ(MV64340_ETH_TRANSMIT_QUEUE_COMMAND_REG(1)) & 0xff);
|
while (MV_READ(MV643XX_ETH_TRANSMIT_QUEUE_COMMAND_REG(1)) & 0xff);
|
||||||
MV_WRITE(MV64340_ETH_PORT_SERIAL_CONTROL_REG(0),
|
MV_WRITE(MV643XX_ETH_PORT_SERIAL_CONTROL_REG(0),
|
||||||
MV_READ(MV64340_ETH_PORT_SERIAL_CONTROL_REG(0)) & ~1);
|
MV_READ(MV643XX_ETH_PORT_SERIAL_CONTROL_REG(0)) & ~1);
|
||||||
MV_WRITE(MV64340_ETH_PORT_SERIAL_CONTROL_REG(1),
|
MV_WRITE(MV643XX_ETH_PORT_SERIAL_CONTROL_REG(1),
|
||||||
MV_READ(MV64340_ETH_PORT_SERIAL_CONTROL_REG(1)) & ~1);
|
MV_READ(MV643XX_ETH_PORT_SERIAL_CONTROL_REG(1)) & ~1);
|
||||||
|
|
||||||
/* Turn off the Bit-Error LED */
|
/* Turn off the Bit-Error LED */
|
||||||
OCELOT_FPGA_WRITE(0x80, CLR);
|
OCELOT_FPGA_WRITE(0x80, CLR);
|
||||||
|
@ -3,15 +3,17 @@
|
|||||||
* License. See the file "COPYING" in the main directory of this archive
|
* License. See the file "COPYING" in the main directory of this archive
|
||||||
* for more details.
|
* for more details.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2004 by Ralf Baechle (ralf@linux-mips.org)
|
* Copyright (C) 2004, 06 by Ralf Baechle (ralf@linux-mips.org)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/pci.h>
|
#include <linux/pci.h>
|
||||||
#include <asm/mv64340.h>
|
#include <linux/mv643xx.h>
|
||||||
|
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
|
|
||||||
|
#include <asm/marvell.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We assume the address ranges have already been setup appropriately by
|
* We assume the address ranges have already been setup appropriately by
|
||||||
* the firmware. PMON in case of the Ocelot C does that.
|
* the firmware. PMON in case of the Ocelot C does that.
|
||||||
|
@ -92,7 +92,6 @@ int main(void)
|
|||||||
|
|
||||||
DEFINE(TI_FLAGS, offsetof(struct thread_info, flags));
|
DEFINE(TI_FLAGS, offsetof(struct thread_info, flags));
|
||||||
DEFINE(TI_PREEMPT, offsetof(struct thread_info, preempt_count));
|
DEFINE(TI_PREEMPT, offsetof(struct thread_info, preempt_count));
|
||||||
DEFINE(TI_SIGFRAME, offsetof(struct thread_info, nvgprs_frame));
|
|
||||||
DEFINE(TI_TASK, offsetof(struct thread_info, task));
|
DEFINE(TI_TASK, offsetof(struct thread_info, task));
|
||||||
#ifdef CONFIG_PPC32
|
#ifdef CONFIG_PPC32
|
||||||
DEFINE(TI_EXECDOMAIN, offsetof(struct thread_info, exec_domain));
|
DEFINE(TI_EXECDOMAIN, offsetof(struct thread_info, exec_domain));
|
||||||
|
@ -53,8 +53,10 @@ extern void __setup_cpu_ppc970(unsigned long offset, struct cpu_spec* spec);
|
|||||||
PPC_FEATURE_HAS_MMU)
|
PPC_FEATURE_HAS_MMU)
|
||||||
#define COMMON_USER_PPC64 (COMMON_USER | PPC_FEATURE_64)
|
#define COMMON_USER_PPC64 (COMMON_USER | PPC_FEATURE_64)
|
||||||
#define COMMON_USER_POWER4 (COMMON_USER_PPC64 | PPC_FEATURE_POWER4)
|
#define COMMON_USER_POWER4 (COMMON_USER_PPC64 | PPC_FEATURE_POWER4)
|
||||||
#define COMMON_USER_POWER5 (COMMON_USER_PPC64 | PPC_FEATURE_POWER5)
|
#define COMMON_USER_POWER5 (COMMON_USER_PPC64 | PPC_FEATURE_POWER5 |\
|
||||||
#define COMMON_USER_POWER5_PLUS (COMMON_USER_PPC64 | PPC_FEATURE_POWER5_PLUS)
|
PPC_FEATURE_SMT | PPC_FEATURE_ICACHE_SNOOP)
|
||||||
|
#define COMMON_USER_POWER5_PLUS (COMMON_USER_PPC64 | PPC_FEATURE_POWER5_PLUS|\
|
||||||
|
PPC_FEATURE_SMT | PPC_FEATURE_ICACHE_SNOOP)
|
||||||
#define COMMON_USER_BOOKE (PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU | \
|
#define COMMON_USER_BOOKE (PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU | \
|
||||||
PPC_FEATURE_BOOKE)
|
PPC_FEATURE_BOOKE)
|
||||||
|
|
||||||
@ -267,7 +269,8 @@ struct cpu_spec cpu_specs[] = {
|
|||||||
.cpu_name = "Cell Broadband Engine",
|
.cpu_name = "Cell Broadband Engine",
|
||||||
.cpu_features = CPU_FTRS_CELL,
|
.cpu_features = CPU_FTRS_CELL,
|
||||||
.cpu_user_features = COMMON_USER_PPC64 |
|
.cpu_user_features = COMMON_USER_PPC64 |
|
||||||
PPC_FEATURE_CELL | PPC_FEATURE_HAS_ALTIVEC_COMP,
|
PPC_FEATURE_CELL | PPC_FEATURE_HAS_ALTIVEC_COMP |
|
||||||
|
PPC_FEATURE_SMT,
|
||||||
.icache_bsize = 128,
|
.icache_bsize = 128,
|
||||||
.dcache_bsize = 128,
|
.dcache_bsize = 128,
|
||||||
.cpu_setup = __setup_cpu_be,
|
.cpu_setup = __setup_cpu_be,
|
||||||
|
@ -227,7 +227,7 @@ ret_from_syscall:
|
|||||||
MTMSRD(r10)
|
MTMSRD(r10)
|
||||||
lwz r9,TI_FLAGS(r12)
|
lwz r9,TI_FLAGS(r12)
|
||||||
li r8,-_LAST_ERRNO
|
li r8,-_LAST_ERRNO
|
||||||
andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SIGPENDING|_TIF_NEED_RESCHED|_TIF_RESTOREALL|_TIF_RESTORE_SIGMASK)
|
andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP|_TIF_USER_WORK_MASK|_TIF_PERSYSCALL_MASK)
|
||||||
bne- syscall_exit_work
|
bne- syscall_exit_work
|
||||||
cmplw 0,r3,r8
|
cmplw 0,r3,r8
|
||||||
blt+ syscall_exit_cont
|
blt+ syscall_exit_cont
|
||||||
@ -287,8 +287,10 @@ syscall_dotrace:
|
|||||||
|
|
||||||
syscall_exit_work:
|
syscall_exit_work:
|
||||||
andi. r0,r9,_TIF_RESTOREALL
|
andi. r0,r9,_TIF_RESTOREALL
|
||||||
bne- 2f
|
beq+ 0f
|
||||||
cmplw 0,r3,r8
|
REST_NVGPRS(r1)
|
||||||
|
b 2f
|
||||||
|
0: cmplw 0,r3,r8
|
||||||
blt+ 1f
|
blt+ 1f
|
||||||
andi. r0,r9,_TIF_NOERROR
|
andi. r0,r9,_TIF_NOERROR
|
||||||
bne- 1f
|
bne- 1f
|
||||||
@ -302,9 +304,7 @@ syscall_exit_work:
|
|||||||
2: andi. r0,r9,(_TIF_PERSYSCALL_MASK)
|
2: andi. r0,r9,(_TIF_PERSYSCALL_MASK)
|
||||||
beq 4f
|
beq 4f
|
||||||
|
|
||||||
/* Clear per-syscall TIF flags if any are set, but _leave_
|
/* Clear per-syscall TIF flags if any are set. */
|
||||||
_TIF_SAVE_NVGPRS set in r9 since we haven't dealt with that
|
|
||||||
yet. */
|
|
||||||
|
|
||||||
li r11,_TIF_PERSYSCALL_MASK
|
li r11,_TIF_PERSYSCALL_MASK
|
||||||
addi r12,r12,TI_FLAGS
|
addi r12,r12,TI_FLAGS
|
||||||
@ -318,8 +318,13 @@ syscall_exit_work:
|
|||||||
subi r12,r12,TI_FLAGS
|
subi r12,r12,TI_FLAGS
|
||||||
|
|
||||||
4: /* Anything which requires enabling interrupts? */
|
4: /* Anything which requires enabling interrupts? */
|
||||||
andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP|_TIF_SAVE_NVGPRS)
|
andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP)
|
||||||
beq 7f
|
beq ret_from_except
|
||||||
|
|
||||||
|
/* Re-enable interrupts */
|
||||||
|
ori r10,r10,MSR_EE
|
||||||
|
SYNC
|
||||||
|
MTMSRD(r10)
|
||||||
|
|
||||||
/* Save NVGPRS if they're not saved already */
|
/* Save NVGPRS if they're not saved already */
|
||||||
lwz r4,_TRAP(r1)
|
lwz r4,_TRAP(r1)
|
||||||
@ -328,71 +333,11 @@ syscall_exit_work:
|
|||||||
SAVE_NVGPRS(r1)
|
SAVE_NVGPRS(r1)
|
||||||
li r4,0xc00
|
li r4,0xc00
|
||||||
stw r4,_TRAP(r1)
|
stw r4,_TRAP(r1)
|
||||||
|
5:
|
||||||
/* Re-enable interrupts */
|
|
||||||
5: ori r10,r10,MSR_EE
|
|
||||||
SYNC
|
|
||||||
MTMSRD(r10)
|
|
||||||
|
|
||||||
andi. r0,r9,_TIF_SAVE_NVGPRS
|
|
||||||
bne save_user_nvgprs
|
|
||||||
|
|
||||||
save_user_nvgprs_cont:
|
|
||||||
andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP)
|
|
||||||
beq 7f
|
|
||||||
|
|
||||||
addi r3,r1,STACK_FRAME_OVERHEAD
|
addi r3,r1,STACK_FRAME_OVERHEAD
|
||||||
bl do_syscall_trace_leave
|
bl do_syscall_trace_leave
|
||||||
REST_NVGPRS(r1)
|
b ret_from_except_full
|
||||||
|
|
||||||
6: lwz r3,GPR3(r1)
|
|
||||||
LOAD_MSR_KERNEL(r10,MSR_KERNEL) /* doesn't include MSR_EE */
|
|
||||||
SYNC
|
|
||||||
MTMSRD(r10) /* disable interrupts again */
|
|
||||||
rlwinm r12,r1,0,0,(31-THREAD_SHIFT) /* current_thread_info() */
|
|
||||||
lwz r9,TI_FLAGS(r12)
|
|
||||||
7:
|
|
||||||
andi. r0,r9,_TIF_NEED_RESCHED
|
|
||||||
bne 8f
|
|
||||||
lwz r5,_MSR(r1)
|
|
||||||
andi. r5,r5,MSR_PR
|
|
||||||
beq ret_from_except
|
|
||||||
andi. r0,r9,_TIF_SIGPENDING|_TIF_RESTORE_SIGMASK
|
|
||||||
beq ret_from_except
|
|
||||||
b do_user_signal
|
|
||||||
8:
|
|
||||||
ori r10,r10,MSR_EE
|
|
||||||
SYNC
|
|
||||||
MTMSRD(r10) /* re-enable interrupts */
|
|
||||||
bl schedule
|
|
||||||
b 6b
|
|
||||||
|
|
||||||
save_user_nvgprs:
|
|
||||||
lwz r8,TI_SIGFRAME(r12)
|
|
||||||
|
|
||||||
.macro savewords start, end
|
|
||||||
1: stw \start,4*(\start)(r8)
|
|
||||||
.section __ex_table,"a"
|
|
||||||
.align 2
|
|
||||||
.long 1b,save_user_nvgprs_fault
|
|
||||||
.previous
|
|
||||||
.if \end - \start
|
|
||||||
savewords "(\start+1)",\end
|
|
||||||
.endif
|
|
||||||
.endm
|
|
||||||
savewords 14,31
|
|
||||||
b save_user_nvgprs_cont
|
|
||||||
|
|
||||||
|
|
||||||
save_user_nvgprs_fault:
|
|
||||||
li r3,11 /* SIGSEGV */
|
|
||||||
lwz r4,TI_TASK(r12)
|
|
||||||
bl force_sigsegv
|
|
||||||
|
|
||||||
rlwinm r12,r1,0,0,(31-THREAD_SHIFT) /* current_thread_info() */
|
|
||||||
lwz r9,TI_FLAGS(r12)
|
|
||||||
b save_user_nvgprs_cont
|
|
||||||
|
|
||||||
#ifdef SHOW_SYSCALLS
|
#ifdef SHOW_SYSCALLS
|
||||||
do_show_syscall:
|
do_show_syscall:
|
||||||
#ifdef SHOW_SYSCALLS_TASK
|
#ifdef SHOW_SYSCALLS_TASK
|
||||||
@ -490,6 +435,14 @@ ppc_clone:
|
|||||||
stw r0,_TRAP(r1) /* register set saved */
|
stw r0,_TRAP(r1) /* register set saved */
|
||||||
b sys_clone
|
b sys_clone
|
||||||
|
|
||||||
|
.globl ppc_swapcontext
|
||||||
|
ppc_swapcontext:
|
||||||
|
SAVE_NVGPRS(r1)
|
||||||
|
lwz r0,_TRAP(r1)
|
||||||
|
rlwinm r0,r0,0,0,30 /* clear LSB to indicate full */
|
||||||
|
stw r0,_TRAP(r1) /* register set saved */
|
||||||
|
b sys_swapcontext
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Top-level page fault handling.
|
* Top-level page fault handling.
|
||||||
* This is in assembler because if do_page_fault tells us that
|
* This is in assembler because if do_page_fault tells us that
|
||||||
@ -683,7 +636,7 @@ user_exc_return: /* r10 contains MSR_KERNEL here */
|
|||||||
/* Check current_thread_info()->flags */
|
/* Check current_thread_info()->flags */
|
||||||
rlwinm r9,r1,0,0,(31-THREAD_SHIFT)
|
rlwinm r9,r1,0,0,(31-THREAD_SHIFT)
|
||||||
lwz r9,TI_FLAGS(r9)
|
lwz r9,TI_FLAGS(r9)
|
||||||
andi. r0,r9,(_TIF_SIGPENDING|_TIF_NEED_RESCHED|_TIF_RESTOREALL|_TIF_RESTORE_SIGMASK)
|
andi. r0,r9,(_TIF_SIGPENDING|_TIF_RESTORE_SIGMASK|_TIF_NEED_RESCHED)
|
||||||
bne do_work
|
bne do_work
|
||||||
|
|
||||||
restore_user:
|
restore_user:
|
||||||
|
@ -160,7 +160,7 @@ syscall_exit:
|
|||||||
mtmsrd r10,1
|
mtmsrd r10,1
|
||||||
ld r9,TI_FLAGS(r12)
|
ld r9,TI_FLAGS(r12)
|
||||||
li r11,-_LAST_ERRNO
|
li r11,-_LAST_ERRNO
|
||||||
andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP|_TIF_SIGPENDING|_TIF_NEED_RESCHED|_TIF_RESTOREALL|_TIF_SAVE_NVGPRS|_TIF_NOERROR|_TIF_RESTORE_SIGMASK)
|
andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP|_TIF_USER_WORK_MASK|_TIF_PERSYSCALL_MASK)
|
||||||
bne- syscall_exit_work
|
bne- syscall_exit_work
|
||||||
cmpld r3,r11
|
cmpld r3,r11
|
||||||
ld r5,_CCR(r1)
|
ld r5,_CCR(r1)
|
||||||
@ -216,8 +216,10 @@ syscall_exit_work:
|
|||||||
If TIF_NOERROR is set, just save r3 as it is. */
|
If TIF_NOERROR is set, just save r3 as it is. */
|
||||||
|
|
||||||
andi. r0,r9,_TIF_RESTOREALL
|
andi. r0,r9,_TIF_RESTOREALL
|
||||||
bne- 2f
|
beq+ 0f
|
||||||
cmpld r3,r11 /* r10 is -LAST_ERRNO */
|
REST_NVGPRS(r1)
|
||||||
|
b 2f
|
||||||
|
0: cmpld r3,r11 /* r10 is -LAST_ERRNO */
|
||||||
blt+ 1f
|
blt+ 1f
|
||||||
andi. r0,r9,_TIF_NOERROR
|
andi. r0,r9,_TIF_NOERROR
|
||||||
bne- 1f
|
bne- 1f
|
||||||
@ -229,9 +231,7 @@ syscall_exit_work:
|
|||||||
2: andi. r0,r9,(_TIF_PERSYSCALL_MASK)
|
2: andi. r0,r9,(_TIF_PERSYSCALL_MASK)
|
||||||
beq 4f
|
beq 4f
|
||||||
|
|
||||||
/* Clear per-syscall TIF flags if any are set, but _leave_
|
/* Clear per-syscall TIF flags if any are set. */
|
||||||
_TIF_SAVE_NVGPRS set in r9 since we haven't dealt with that
|
|
||||||
yet. */
|
|
||||||
|
|
||||||
li r11,_TIF_PERSYSCALL_MASK
|
li r11,_TIF_PERSYSCALL_MASK
|
||||||
addi r12,r12,TI_FLAGS
|
addi r12,r12,TI_FLAGS
|
||||||
@ -240,10 +240,9 @@ syscall_exit_work:
|
|||||||
stdcx. r10,0,r12
|
stdcx. r10,0,r12
|
||||||
bne- 3b
|
bne- 3b
|
||||||
subi r12,r12,TI_FLAGS
|
subi r12,r12,TI_FLAGS
|
||||||
|
|
||||||
4: bl .save_nvgprs
|
4: /* Anything else left to do? */
|
||||||
/* Anything else left to do? */
|
andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP)
|
||||||
andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP|_TIF_SAVE_NVGPRS)
|
|
||||||
beq .ret_from_except_lite
|
beq .ret_from_except_lite
|
||||||
|
|
||||||
/* Re-enable interrupts */
|
/* Re-enable interrupts */
|
||||||
@ -251,26 +250,10 @@ syscall_exit_work:
|
|||||||
ori r10,r10,MSR_EE
|
ori r10,r10,MSR_EE
|
||||||
mtmsrd r10,1
|
mtmsrd r10,1
|
||||||
|
|
||||||
andi. r0,r9,_TIF_SAVE_NVGPRS
|
bl .save_nvgprs
|
||||||
bne save_user_nvgprs
|
|
||||||
|
|
||||||
/* If tracing, re-enable interrupts and do it */
|
|
||||||
save_user_nvgprs_cont:
|
|
||||||
andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP)
|
|
||||||
beq 5f
|
|
||||||
|
|
||||||
addi r3,r1,STACK_FRAME_OVERHEAD
|
addi r3,r1,STACK_FRAME_OVERHEAD
|
||||||
bl .do_syscall_trace_leave
|
bl .do_syscall_trace_leave
|
||||||
REST_NVGPRS(r1)
|
b .ret_from_except
|
||||||
clrrdi r12,r1,THREAD_SHIFT
|
|
||||||
|
|
||||||
/* Disable interrupts again and handle other work if any */
|
|
||||||
5: mfmsr r10
|
|
||||||
rldicl r10,r10,48,1
|
|
||||||
rotldi r10,r10,16
|
|
||||||
mtmsrd r10,1
|
|
||||||
|
|
||||||
b .ret_from_except_lite
|
|
||||||
|
|
||||||
/* Save non-volatile GPRs, if not already saved. */
|
/* Save non-volatile GPRs, if not already saved. */
|
||||||
_GLOBAL(save_nvgprs)
|
_GLOBAL(save_nvgprs)
|
||||||
@ -282,51 +265,6 @@ _GLOBAL(save_nvgprs)
|
|||||||
std r0,_TRAP(r1)
|
std r0,_TRAP(r1)
|
||||||
blr
|
blr
|
||||||
|
|
||||||
|
|
||||||
save_user_nvgprs:
|
|
||||||
ld r10,TI_SIGFRAME(r12)
|
|
||||||
andi. r0,r9,_TIF_32BIT
|
|
||||||
beq- save_user_nvgprs_64
|
|
||||||
|
|
||||||
/* 32-bit save to userspace */
|
|
||||||
|
|
||||||
.macro savewords start, end
|
|
||||||
1: stw \start,4*(\start)(r10)
|
|
||||||
.section __ex_table,"a"
|
|
||||||
.align 3
|
|
||||||
.llong 1b,save_user_nvgprs_fault
|
|
||||||
.previous
|
|
||||||
.if \end - \start
|
|
||||||
savewords "(\start+1)",\end
|
|
||||||
.endif
|
|
||||||
.endm
|
|
||||||
savewords 14,31
|
|
||||||
b save_user_nvgprs_cont
|
|
||||||
|
|
||||||
save_user_nvgprs_64:
|
|
||||||
/* 64-bit save to userspace */
|
|
||||||
|
|
||||||
.macro savelongs start, end
|
|
||||||
1: std \start,8*(\start)(r10)
|
|
||||||
.section __ex_table,"a"
|
|
||||||
.align 3
|
|
||||||
.llong 1b,save_user_nvgprs_fault
|
|
||||||
.previous
|
|
||||||
.if \end - \start
|
|
||||||
savelongs "(\start+1)",\end
|
|
||||||
.endif
|
|
||||||
.endm
|
|
||||||
savelongs 14,31
|
|
||||||
b save_user_nvgprs_cont
|
|
||||||
|
|
||||||
save_user_nvgprs_fault:
|
|
||||||
li r3,11 /* SIGSEGV */
|
|
||||||
ld r4,TI_TASK(r12)
|
|
||||||
bl .force_sigsegv
|
|
||||||
|
|
||||||
clrrdi r12,r1,THREAD_SHIFT
|
|
||||||
ld r9,TI_FLAGS(r12)
|
|
||||||
b save_user_nvgprs_cont
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The sigsuspend and rt_sigsuspend system calls can call do_signal
|
* The sigsuspend and rt_sigsuspend system calls can call do_signal
|
||||||
@ -352,6 +290,16 @@ _GLOBAL(ppc_clone)
|
|||||||
bl .sys_clone
|
bl .sys_clone
|
||||||
b syscall_exit
|
b syscall_exit
|
||||||
|
|
||||||
|
_GLOBAL(ppc32_swapcontext)
|
||||||
|
bl .save_nvgprs
|
||||||
|
bl .compat_sys_swapcontext
|
||||||
|
b syscall_exit
|
||||||
|
|
||||||
|
_GLOBAL(ppc64_swapcontext)
|
||||||
|
bl .save_nvgprs
|
||||||
|
bl .sys_swapcontext
|
||||||
|
b syscall_exit
|
||||||
|
|
||||||
_GLOBAL(ret_from_fork)
|
_GLOBAL(ret_from_fork)
|
||||||
bl .schedule_tail
|
bl .schedule_tail
|
||||||
REST_NVGPRS(r1)
|
REST_NVGPRS(r1)
|
||||||
|
@ -1537,6 +1537,9 @@ _STATIC(__boot_from_prom)
|
|||||||
mr r28,r6
|
mr r28,r6
|
||||||
mr r27,r7
|
mr r27,r7
|
||||||
|
|
||||||
|
/* Align the stack to 16-byte boundary for broken yaboot */
|
||||||
|
rldicr r1,r1,0,59
|
||||||
|
|
||||||
/* Make sure we are running in 64 bits mode */
|
/* Make sure we are running in 64 bits mode */
|
||||||
bl .enable_64b_mode
|
bl .enable_64b_mode
|
||||||
|
|
||||||
|
@ -978,7 +978,7 @@ static void __init prom_init_mem(void)
|
|||||||
if (size == 0)
|
if (size == 0)
|
||||||
continue;
|
continue;
|
||||||
prom_debug(" %x %x\n", base, size);
|
prom_debug(" %x %x\n", base, size);
|
||||||
if (base == 0)
|
if (base == 0 && (RELOC(of_platform) & PLATFORM_LPAR))
|
||||||
RELOC(rmo_top) = size;
|
RELOC(rmo_top) = size;
|
||||||
if ((base + size) > RELOC(ram_top))
|
if ((base + size) > RELOC(ram_top))
|
||||||
RELOC(ram_top) = base + size;
|
RELOC(ram_top) = base + size;
|
||||||
|
@ -561,10 +561,7 @@ void do_syscall_trace_leave(struct pt_regs *regs)
|
|||||||
regs->result);
|
regs->result);
|
||||||
|
|
||||||
if ((test_thread_flag(TIF_SYSCALL_TRACE)
|
if ((test_thread_flag(TIF_SYSCALL_TRACE)
|
||||||
#ifdef CONFIG_PPC64
|
|| test_thread_flag(TIF_SINGLESTEP))
|
||||||
|| test_thread_flag(TIF_SINGLESTEP)
|
|
||||||
#endif
|
|
||||||
)
|
|
||||||
&& (current->ptrace & PT_PTRACED))
|
&& (current->ptrace & PT_PTRACED))
|
||||||
do_syscall_trace();
|
do_syscall_trace();
|
||||||
}
|
}
|
||||||
|
@ -151,10 +151,7 @@ static inline int save_general_regs(struct pt_regs *regs,
|
|||||||
elf_greg_t64 *gregs = (elf_greg_t64 *)regs;
|
elf_greg_t64 *gregs = (elf_greg_t64 *)regs;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (!FULL_REGS(regs)) {
|
WARN_ON(!FULL_REGS(regs));
|
||||||
set_thread_flag(TIF_SAVE_NVGPRS);
|
|
||||||
current_thread_info()->nvgprs_frame = frame->mc_gregs;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i <= PT_RESULT; i ++) {
|
for (i = 0; i <= PT_RESULT; i ++) {
|
||||||
if (i == 14 && !FULL_REGS(regs))
|
if (i == 14 && !FULL_REGS(regs))
|
||||||
@ -215,15 +212,7 @@ static inline int get_old_sigaction(struct k_sigaction *new_ka,
|
|||||||
static inline int save_general_regs(struct pt_regs *regs,
|
static inline int save_general_regs(struct pt_regs *regs,
|
||||||
struct mcontext __user *frame)
|
struct mcontext __user *frame)
|
||||||
{
|
{
|
||||||
if (!FULL_REGS(regs)) {
|
WARN_ON(!FULL_REGS(regs));
|
||||||
/* Zero out the unsaved GPRs to avoid information
|
|
||||||
leak, and set TIF_SAVE_NVGPRS to ensure that the
|
|
||||||
registers do actually get saved later. */
|
|
||||||
memset(®s->gpr[14], 0, 18 * sizeof(unsigned long));
|
|
||||||
current_thread_info()->nvgprs_frame = &frame->mc_gregs;
|
|
||||||
set_thread_flag(TIF_SAVE_NVGPRS);
|
|
||||||
}
|
|
||||||
|
|
||||||
return __copy_to_user(&frame->mc_gregs, regs, GP_REGS_SIZE);
|
return __copy_to_user(&frame->mc_gregs, regs, GP_REGS_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -826,8 +815,8 @@ static int do_setcontext(struct ucontext __user *ucp, struct pt_regs *regs, int
|
|||||||
}
|
}
|
||||||
|
|
||||||
long sys_swapcontext(struct ucontext __user *old_ctx,
|
long sys_swapcontext(struct ucontext __user *old_ctx,
|
||||||
struct ucontext __user *new_ctx,
|
struct ucontext __user *new_ctx,
|
||||||
int ctx_size, int r6, int r7, int r8, struct pt_regs *regs)
|
int ctx_size, int r6, int r7, int r8, struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
unsigned char tmp;
|
unsigned char tmp;
|
||||||
|
|
||||||
|
@ -118,14 +118,7 @@ static long setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,
|
|||||||
err |= __put_user(0, &sc->v_regs);
|
err |= __put_user(0, &sc->v_regs);
|
||||||
#endif /* CONFIG_ALTIVEC */
|
#endif /* CONFIG_ALTIVEC */
|
||||||
err |= __put_user(&sc->gp_regs, &sc->regs);
|
err |= __put_user(&sc->gp_regs, &sc->regs);
|
||||||
if (!FULL_REGS(regs)) {
|
WARN_ON(!FULL_REGS(regs));
|
||||||
/* Zero out the unsaved GPRs to avoid information
|
|
||||||
leak, and set TIF_SAVE_NVGPRS to ensure that the
|
|
||||||
registers do actually get saved later. */
|
|
||||||
memset(®s->gpr[14], 0, 18 * sizeof(unsigned long));
|
|
||||||
set_thread_flag(TIF_SAVE_NVGPRS);
|
|
||||||
current_thread_info()->nvgprs_frame = &sc->gp_regs;
|
|
||||||
}
|
|
||||||
err |= __copy_to_user(&sc->gp_regs, regs, GP_REGS_SIZE);
|
err |= __copy_to_user(&sc->gp_regs, regs, GP_REGS_SIZE);
|
||||||
err |= __copy_to_user(&sc->fp_regs, ¤t->thread.fpr, FP_REGS_SIZE);
|
err |= __copy_to_user(&sc->fp_regs, ¤t->thread.fpr, FP_REGS_SIZE);
|
||||||
err |= __put_user(signr, &sc->signal);
|
err |= __put_user(signr, &sc->signal);
|
||||||
|
@ -288,7 +288,7 @@ COMPAT_SYS(clock_settime)
|
|||||||
COMPAT_SYS(clock_gettime)
|
COMPAT_SYS(clock_gettime)
|
||||||
COMPAT_SYS(clock_getres)
|
COMPAT_SYS(clock_getres)
|
||||||
COMPAT_SYS(clock_nanosleep)
|
COMPAT_SYS(clock_nanosleep)
|
||||||
COMPAT_SYS(swapcontext)
|
SYSX(ppc64_swapcontext,ppc32_swapcontext,ppc_swapcontext)
|
||||||
COMPAT_SYS(tgkill)
|
COMPAT_SYS(tgkill)
|
||||||
COMPAT_SYS(utimes)
|
COMPAT_SYS(utimes)
|
||||||
COMPAT_SYS(statfs64)
|
COMPAT_SYS(statfs64)
|
||||||
|
@ -814,6 +814,8 @@ void __kprobes program_check_exception(struct pt_regs *regs)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
local_irq_enable();
|
||||||
|
|
||||||
/* Try to emulate it if we should. */
|
/* Try to emulate it if we should. */
|
||||||
if (reason & (REASON_ILLEGAL | REASON_PRIVILEGED)) {
|
if (reason & (REASON_ILLEGAL | REASON_PRIVILEGED)) {
|
||||||
switch (emulate_instruction(regs)) {
|
switch (emulate_instruction(regs)) {
|
||||||
|
@ -9,7 +9,12 @@
|
|||||||
#include <asm/pmac_feature.h>
|
#include <asm/pmac_feature.h>
|
||||||
#include <asm/pmac_pfunc.h>
|
#include <asm/pmac_pfunc.h>
|
||||||
|
|
||||||
|
#undef DEBUG
|
||||||
|
#ifdef DEBUG
|
||||||
#define DBG(fmt...) printk(fmt)
|
#define DBG(fmt...) printk(fmt)
|
||||||
|
#else
|
||||||
|
#define DBG(fmt...)
|
||||||
|
#endif
|
||||||
|
|
||||||
static irqreturn_t macio_gpio_irq(int irq, void *data, struct pt_regs *regs)
|
static irqreturn_t macio_gpio_irq(int irq, void *data, struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
|
@ -20,7 +20,13 @@
|
|||||||
#define LOG_PARSE(fmt...)
|
#define LOG_PARSE(fmt...)
|
||||||
#define LOG_ERROR(fmt...) printk(fmt)
|
#define LOG_ERROR(fmt...) printk(fmt)
|
||||||
#define LOG_BLOB(t,b,c)
|
#define LOG_BLOB(t,b,c)
|
||||||
|
|
||||||
|
#undef DEBUG
|
||||||
|
#ifdef DEBUG
|
||||||
#define DBG(fmt...) printk(fmt)
|
#define DBG(fmt...) printk(fmt)
|
||||||
|
#else
|
||||||
|
#define DBG(fmt...)
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Command numbers */
|
/* Command numbers */
|
||||||
#define PMF_CMD_LIST 0
|
#define PMF_CMD_LIST 0
|
||||||
|
@ -435,7 +435,7 @@ struct smp_ops_t psurge_smp_ops = {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
static void (*pmac_tb_freeze)(int freeze);
|
static void (*pmac_tb_freeze)(int freeze);
|
||||||
static unsigned long timebase;
|
static u64 timebase;
|
||||||
static int tb_req;
|
static int tb_req;
|
||||||
|
|
||||||
static void smp_core99_give_timebase(void)
|
static void smp_core99_give_timebase(void)
|
||||||
|
@ -131,7 +131,6 @@ main(void)
|
|||||||
DEFINE(CPU_SPEC_FEATURES, offsetof(struct cpu_spec, cpu_features));
|
DEFINE(CPU_SPEC_FEATURES, offsetof(struct cpu_spec, cpu_features));
|
||||||
DEFINE(CPU_SPEC_SETUP, offsetof(struct cpu_spec, cpu_setup));
|
DEFINE(CPU_SPEC_SETUP, offsetof(struct cpu_spec, cpu_setup));
|
||||||
|
|
||||||
DEFINE(TI_SIGFRAME, offsetof(struct thread_info, nvgprs_frame));
|
|
||||||
DEFINE(TI_TASK, offsetof(struct thread_info, task));
|
DEFINE(TI_TASK, offsetof(struct thread_info, task));
|
||||||
DEFINE(TI_EXECDOMAIN, offsetof(struct thread_info, exec_domain));
|
DEFINE(TI_EXECDOMAIN, offsetof(struct thread_info, exec_domain));
|
||||||
DEFINE(TI_FLAGS, offsetof(struct thread_info, flags));
|
DEFINE(TI_FLAGS, offsetof(struct thread_info, flags));
|
||||||
|
@ -227,7 +227,7 @@ ret_from_syscall:
|
|||||||
MTMSRD(r10)
|
MTMSRD(r10)
|
||||||
lwz r9,TI_FLAGS(r12)
|
lwz r9,TI_FLAGS(r12)
|
||||||
li r8,-_LAST_ERRNO
|
li r8,-_LAST_ERRNO
|
||||||
andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SIGPENDING|_TIF_NEED_RESCHED|_TIF_RESTOREALL)
|
andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP|_TIF_USER_WORK_MASK|_TIF_PERSYSCALL_MASK)
|
||||||
bne- syscall_exit_work
|
bne- syscall_exit_work
|
||||||
cmplw 0,r3,r8
|
cmplw 0,r3,r8
|
||||||
blt+ syscall_exit_cont
|
blt+ syscall_exit_cont
|
||||||
@ -287,8 +287,10 @@ syscall_dotrace:
|
|||||||
|
|
||||||
syscall_exit_work:
|
syscall_exit_work:
|
||||||
andi. r0,r9,_TIF_RESTOREALL
|
andi. r0,r9,_TIF_RESTOREALL
|
||||||
bne- 2f
|
beq+ 0f
|
||||||
cmplw 0,r3,r8
|
REST_NVGPRS(r1)
|
||||||
|
b 2f
|
||||||
|
0: cmplw 0,r3,r8
|
||||||
blt+ 1f
|
blt+ 1f
|
||||||
andi. r0,r9,_TIF_NOERROR
|
andi. r0,r9,_TIF_NOERROR
|
||||||
bne- 1f
|
bne- 1f
|
||||||
@ -302,9 +304,7 @@ syscall_exit_work:
|
|||||||
2: andi. r0,r9,(_TIF_PERSYSCALL_MASK)
|
2: andi. r0,r9,(_TIF_PERSYSCALL_MASK)
|
||||||
beq 4f
|
beq 4f
|
||||||
|
|
||||||
/* Clear per-syscall TIF flags if any are set, but _leave_
|
/* Clear per-syscall TIF flags if any are set. */
|
||||||
_TIF_SAVE_NVGPRS set in r9 since we haven't dealt with that
|
|
||||||
yet. */
|
|
||||||
|
|
||||||
li r11,_TIF_PERSYSCALL_MASK
|
li r11,_TIF_PERSYSCALL_MASK
|
||||||
addi r12,r12,TI_FLAGS
|
addi r12,r12,TI_FLAGS
|
||||||
@ -318,8 +318,13 @@ syscall_exit_work:
|
|||||||
subi r12,r12,TI_FLAGS
|
subi r12,r12,TI_FLAGS
|
||||||
|
|
||||||
4: /* Anything which requires enabling interrupts? */
|
4: /* Anything which requires enabling interrupts? */
|
||||||
andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP|_TIF_SAVE_NVGPRS)
|
andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP)
|
||||||
beq 7f
|
beq ret_from_except
|
||||||
|
|
||||||
|
/* Re-enable interrupts */
|
||||||
|
ori r10,r10,MSR_EE
|
||||||
|
SYNC
|
||||||
|
MTMSRD(r10)
|
||||||
|
|
||||||
/* Save NVGPRS if they're not saved already */
|
/* Save NVGPRS if they're not saved already */
|
||||||
lwz r4,TRAP(r1)
|
lwz r4,TRAP(r1)
|
||||||
@ -328,71 +333,11 @@ syscall_exit_work:
|
|||||||
SAVE_NVGPRS(r1)
|
SAVE_NVGPRS(r1)
|
||||||
li r4,0xc00
|
li r4,0xc00
|
||||||
stw r4,TRAP(r1)
|
stw r4,TRAP(r1)
|
||||||
|
5:
|
||||||
/* Re-enable interrupts */
|
|
||||||
5: ori r10,r10,MSR_EE
|
|
||||||
SYNC
|
|
||||||
MTMSRD(r10)
|
|
||||||
|
|
||||||
andi. r0,r9,_TIF_SAVE_NVGPRS
|
|
||||||
bne save_user_nvgprs
|
|
||||||
|
|
||||||
save_user_nvgprs_cont:
|
|
||||||
andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP)
|
|
||||||
beq 7f
|
|
||||||
|
|
||||||
addi r3,r1,STACK_FRAME_OVERHEAD
|
addi r3,r1,STACK_FRAME_OVERHEAD
|
||||||
bl do_syscall_trace_leave
|
bl do_syscall_trace_leave
|
||||||
REST_NVGPRS(r1)
|
b ret_from_except_full
|
||||||
|
|
||||||
6: lwz r3,GPR3(r1)
|
|
||||||
LOAD_MSR_KERNEL(r10,MSR_KERNEL) /* doesn't include MSR_EE */
|
|
||||||
SYNC
|
|
||||||
MTMSRD(r10) /* disable interrupts again */
|
|
||||||
rlwinm r12,r1,0,0,18 /* current_thread_info() */
|
|
||||||
lwz r9,TI_FLAGS(r12)
|
|
||||||
7:
|
|
||||||
andi. r0,r9,_TIF_NEED_RESCHED
|
|
||||||
bne 8f
|
|
||||||
lwz r5,_MSR(r1)
|
|
||||||
andi. r5,r5,MSR_PR
|
|
||||||
beq ret_from_except
|
|
||||||
andi. r0,r9,_TIF_SIGPENDING
|
|
||||||
beq ret_from_except
|
|
||||||
b do_user_signal
|
|
||||||
8:
|
|
||||||
ori r10,r10,MSR_EE
|
|
||||||
SYNC
|
|
||||||
MTMSRD(r10) /* re-enable interrupts */
|
|
||||||
bl schedule
|
|
||||||
b 6b
|
|
||||||
|
|
||||||
save_user_nvgprs:
|
|
||||||
lwz r8,TI_SIGFRAME(r12)
|
|
||||||
|
|
||||||
.macro savewords start, end
|
|
||||||
1: stw \start,4*(\start)(r8)
|
|
||||||
.section __ex_table,"a"
|
|
||||||
.align 2
|
|
||||||
.long 1b,save_user_nvgprs_fault
|
|
||||||
.previous
|
|
||||||
.if \end - \start
|
|
||||||
savewords "(\start+1)",\end
|
|
||||||
.endif
|
|
||||||
.endm
|
|
||||||
savewords 14,31
|
|
||||||
b save_user_nvgprs_cont
|
|
||||||
|
|
||||||
|
|
||||||
save_user_nvgprs_fault:
|
|
||||||
li r3,11 /* SIGSEGV */
|
|
||||||
lwz r4,TI_TASK(r12)
|
|
||||||
bl force_sigsegv
|
|
||||||
|
|
||||||
rlwinm r12,r1,0,0,18 /* current_thread_info() */
|
|
||||||
lwz r9,TI_FLAGS(r12)
|
|
||||||
b save_user_nvgprs_cont
|
|
||||||
|
|
||||||
#ifdef SHOW_SYSCALLS
|
#ifdef SHOW_SYSCALLS
|
||||||
do_show_syscall:
|
do_show_syscall:
|
||||||
#ifdef SHOW_SYSCALLS_TASK
|
#ifdef SHOW_SYSCALLS_TASK
|
||||||
@ -490,6 +435,14 @@ ppc_clone:
|
|||||||
stw r0,TRAP(r1) /* register set saved */
|
stw r0,TRAP(r1) /* register set saved */
|
||||||
b sys_clone
|
b sys_clone
|
||||||
|
|
||||||
|
.globl ppc_swapcontext
|
||||||
|
ppc_swapcontext:
|
||||||
|
SAVE_NVGPRS(r1)
|
||||||
|
lwz r0,TRAP(r1)
|
||||||
|
rlwinm r0,r0,0,0,30 /* clear LSB to indicate full */
|
||||||
|
stw r0,TRAP(r1) /* register set saved */
|
||||||
|
b sys_swapcontext
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Top-level page fault handling.
|
* Top-level page fault handling.
|
||||||
* This is in assembler because if do_page_fault tells us that
|
* This is in assembler because if do_page_fault tells us that
|
||||||
@ -683,7 +636,7 @@ user_exc_return: /* r10 contains MSR_KERNEL here */
|
|||||||
/* Check current_thread_info()->flags */
|
/* Check current_thread_info()->flags */
|
||||||
rlwinm r9,r1,0,0,18
|
rlwinm r9,r1,0,0,18
|
||||||
lwz r9,TI_FLAGS(r9)
|
lwz r9,TI_FLAGS(r9)
|
||||||
andi. r0,r9,(_TIF_SIGPENDING|_TIF_NEED_RESCHED|_TIF_RESTOREALL)
|
andi. r0,r9,(_TIF_SIGPENDING|_TIF_RESTORE_SIGMASK|_TIF_NEED_RESCHED)
|
||||||
bne do_work
|
bne do_work
|
||||||
|
|
||||||
restore_user:
|
restore_user:
|
||||||
|
@ -2,8 +2,7 @@
|
|||||||
* arch/s390/lib/spinlock.c
|
* arch/s390/lib/spinlock.c
|
||||||
* Out of line spinlock code.
|
* Out of line spinlock code.
|
||||||
*
|
*
|
||||||
* S390 version
|
* Copyright (C) IBM Corp. 2004, 2006
|
||||||
* Copyright (C) 2004 IBM Deutschland Entwicklung GmbH, IBM Corporation
|
|
||||||
* Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com)
|
* Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -44,6 +43,8 @@ _raw_spin_lock_wait(raw_spinlock_t *lp, unsigned int pc)
|
|||||||
_diag44();
|
_diag44();
|
||||||
count = spin_retry;
|
count = spin_retry;
|
||||||
}
|
}
|
||||||
|
if (__raw_spin_is_locked(lp))
|
||||||
|
continue;
|
||||||
if (_raw_compare_and_swap(&lp->lock, 0, pc) == 0)
|
if (_raw_compare_and_swap(&lp->lock, 0, pc) == 0)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -56,6 +57,8 @@ _raw_spin_trylock_retry(raw_spinlock_t *lp, unsigned int pc)
|
|||||||
int count = spin_retry;
|
int count = spin_retry;
|
||||||
|
|
||||||
while (count-- > 0) {
|
while (count-- > 0) {
|
||||||
|
if (__raw_spin_is_locked(lp))
|
||||||
|
continue;
|
||||||
if (_raw_compare_and_swap(&lp->lock, 0, pc) == 0)
|
if (_raw_compare_and_swap(&lp->lock, 0, pc) == 0)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -74,6 +77,8 @@ _raw_read_lock_wait(raw_rwlock_t *rw)
|
|||||||
_diag44();
|
_diag44();
|
||||||
count = spin_retry;
|
count = spin_retry;
|
||||||
}
|
}
|
||||||
|
if (!__raw_read_can_lock(rw))
|
||||||
|
continue;
|
||||||
old = rw->lock & 0x7fffffffU;
|
old = rw->lock & 0x7fffffffU;
|
||||||
if (_raw_compare_and_swap(&rw->lock, old, old + 1) == old)
|
if (_raw_compare_and_swap(&rw->lock, old, old + 1) == old)
|
||||||
return;
|
return;
|
||||||
@ -88,6 +93,8 @@ _raw_read_trylock_retry(raw_rwlock_t *rw)
|
|||||||
int count = spin_retry;
|
int count = spin_retry;
|
||||||
|
|
||||||
while (count-- > 0) {
|
while (count-- > 0) {
|
||||||
|
if (!__raw_read_can_lock(rw))
|
||||||
|
continue;
|
||||||
old = rw->lock & 0x7fffffffU;
|
old = rw->lock & 0x7fffffffU;
|
||||||
if (_raw_compare_and_swap(&rw->lock, old, old + 1) == old)
|
if (_raw_compare_and_swap(&rw->lock, old, old + 1) == old)
|
||||||
return 1;
|
return 1;
|
||||||
@ -106,6 +113,8 @@ _raw_write_lock_wait(raw_rwlock_t *rw)
|
|||||||
_diag44();
|
_diag44();
|
||||||
count = spin_retry;
|
count = spin_retry;
|
||||||
}
|
}
|
||||||
|
if (!__raw_write_can_lock(rw))
|
||||||
|
continue;
|
||||||
if (_raw_compare_and_swap(&rw->lock, 0, 0x80000000) == 0)
|
if (_raw_compare_and_swap(&rw->lock, 0, 0x80000000) == 0)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -118,6 +127,8 @@ _raw_write_trylock_retry(raw_rwlock_t *rw)
|
|||||||
int count = spin_retry;
|
int count = spin_retry;
|
||||||
|
|
||||||
while (count-- > 0) {
|
while (count-- > 0) {
|
||||||
|
if (!__raw_write_can_lock(rw))
|
||||||
|
continue;
|
||||||
if (_raw_compare_and_swap(&rw->lock, 0, 0x80000000) == 0)
|
if (_raw_compare_and_swap(&rw->lock, 0, 0x80000000) == 0)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -198,12 +198,12 @@ __strnlen_user_asm:
|
|||||||
0: srst %r2,%r1
|
0: srst %r2,%r1
|
||||||
jo 0b
|
jo 0b
|
||||||
sacf 0
|
sacf 0
|
||||||
jh 1f # \0 found in string ?
|
|
||||||
ahi %r2,1 # strnlen_user result includes the \0
|
ahi %r2,1 # strnlen_user result includes the \0
|
||||||
1: slr %r2,%r3
|
# or return count+1 if \0 not found
|
||||||
|
slr %r2,%r3
|
||||||
br %r14
|
br %r14
|
||||||
2: sacf 0
|
2: sacf 0
|
||||||
lhi %r2,-EFAULT
|
slr %r2,%r2 # return 0 on exception
|
||||||
br %r14
|
br %r14
|
||||||
.section __ex_table,"a"
|
.section __ex_table,"a"
|
||||||
.long 0b,2b
|
.long 0b,2b
|
||||||
|
@ -194,12 +194,12 @@ __strnlen_user_asm:
|
|||||||
0: srst %r2,%r1
|
0: srst %r2,%r1
|
||||||
jo 0b
|
jo 0b
|
||||||
sacf 0
|
sacf 0
|
||||||
jh 1f # \0 found in string ?
|
|
||||||
aghi %r2,1 # strnlen_user result includes the \0
|
aghi %r2,1 # strnlen_user result includes the \0
|
||||||
1: slgr %r2,%r3
|
# or return count+1 if \0 not found
|
||||||
|
slgr %r2,%r3
|
||||||
br %r14
|
br %r14
|
||||||
2: sacf 0
|
2: sacf 0
|
||||||
lghi %r2,-EFAULT
|
slgr %r2,%r2 # return 0 on exception
|
||||||
br %r14
|
br %r14
|
||||||
.section __ex_table,"a"
|
.section __ex_table,"a"
|
||||||
.quad 0b,2b
|
.quad 0b,2b
|
||||||
|
@ -392,9 +392,9 @@ config SH_TMU
|
|||||||
|
|
||||||
endmenu
|
endmenu
|
||||||
|
|
||||||
source "arch/sh/boards/renesas/hs7751rvoip/Kconfig"
|
#source "arch/sh/boards/renesas/hs7751rvoip/Kconfig"
|
||||||
|
|
||||||
source "arch/sh/boards/renesas/rts7751r2d/Kconfig"
|
#source "arch/sh/boards/renesas/rts7751r2d/Kconfig"
|
||||||
|
|
||||||
config SH_PCLK_FREQ
|
config SH_PCLK_FREQ
|
||||||
int "Peripheral clock frequency (in Hz)"
|
int "Peripheral clock frequency (in Hz)"
|
||||||
|
@ -318,7 +318,7 @@ do_sys_recvmsg: /* compat_sys_recvmsg(int, struct compat_msghdr *, unsigned int)
|
|||||||
nop
|
nop
|
||||||
nop
|
nop
|
||||||
|
|
||||||
.section __ex_table
|
.section __ex_table,"a"
|
||||||
.align 4
|
.align 4
|
||||||
.word 1b, __retl_efault, 2b, __retl_efault
|
.word 1b, __retl_efault, 2b, __retl_efault
|
||||||
.word 3b, __retl_efault, 4b, __retl_efault
|
.word 3b, __retl_efault, 4b, __retl_efault
|
||||||
|
@ -47,7 +47,7 @@ __do_int_store:
|
|||||||
mov 0, %o0
|
mov 0, %o0
|
||||||
.size __do_int_store, .-__do_int_store
|
.size __do_int_store, .-__do_int_store
|
||||||
|
|
||||||
.section __ex_table
|
.section __ex_table,"a"
|
||||||
.word 4b, __retl_efault
|
.word 4b, __retl_efault
|
||||||
.word 5b, __retl_efault
|
.word 5b, __retl_efault
|
||||||
.word 6b, __retl_efault
|
.word 6b, __retl_efault
|
||||||
@ -129,7 +129,7 @@ do_int_load:
|
|||||||
mov 0, %o0
|
mov 0, %o0
|
||||||
.size __do_int_load, .-__do_int_load
|
.size __do_int_load, .-__do_int_load
|
||||||
|
|
||||||
.section __ex_table
|
.section __ex_table,"a"
|
||||||
.word 4b, __retl_efault
|
.word 4b, __retl_efault
|
||||||
.word 5b, __retl_efault
|
.word 5b, __retl_efault
|
||||||
.word 6b, __retl_efault
|
.word 6b, __retl_efault
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
.align 4; \
|
.align 4; \
|
||||||
99: retl; \
|
99: retl; \
|
||||||
mov 1, %o0; \
|
mov 1, %o0; \
|
||||||
.section __ex_table; \
|
.section __ex_table,"a";\
|
||||||
.align 4; \
|
.align 4; \
|
||||||
.word 98b, 99b; \
|
.word 98b, 99b; \
|
||||||
.text; \
|
.text; \
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
.align 4; \
|
.align 4; \
|
||||||
99: retl; \
|
99: retl; \
|
||||||
mov 1, %o0; \
|
mov 1, %o0; \
|
||||||
.section __ex_table; \
|
.section __ex_table,"a";\
|
||||||
.align 4; \
|
.align 4; \
|
||||||
.word 98b, 99b; \
|
.word 98b, 99b; \
|
||||||
.text; \
|
.text; \
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
.align 4; \
|
.align 4; \
|
||||||
99: retl; \
|
99: retl; \
|
||||||
mov 1, %o0; \
|
mov 1, %o0; \
|
||||||
.section __ex_table; \
|
.section __ex_table,"a";\
|
||||||
.align 4; \
|
.align 4; \
|
||||||
.word 98b, 99b; \
|
.word 98b, 99b; \
|
||||||
.text; \
|
.text; \
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
.align 4; \
|
.align 4; \
|
||||||
99: retl; \
|
99: retl; \
|
||||||
mov 1, %o0; \
|
mov 1, %o0; \
|
||||||
.section __ex_table; \
|
.section __ex_table,"a";\
|
||||||
.align 4; \
|
.align 4; \
|
||||||
.word 98b, 99b; \
|
.word 98b, 99b; \
|
||||||
.text; \
|
.text; \
|
||||||
|
@ -92,7 +92,7 @@ __bzero_done:
|
|||||||
.align 4; \
|
.align 4; \
|
||||||
99: retl; \
|
99: retl; \
|
||||||
mov %o1, %o0; \
|
mov %o1, %o0; \
|
||||||
.section __ex_table; \
|
.section __ex_table,"a";\
|
||||||
.align 4; \
|
.align 4; \
|
||||||
.word 98b, 99b; \
|
.word 98b, 99b; \
|
||||||
.text; \
|
.text; \
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
.align 4; \
|
.align 4; \
|
||||||
99: retl; \
|
99: retl; \
|
||||||
mov 1, %o0; \
|
mov 1, %o0; \
|
||||||
.section __ex_table; \
|
.section __ex_table,"a";\
|
||||||
.align 4; \
|
.align 4; \
|
||||||
.word 98b, 99b; \
|
.word 98b, 99b; \
|
||||||
.text; \
|
.text; \
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
.align 4; \
|
.align 4; \
|
||||||
99: retl; \
|
99: retl; \
|
||||||
mov -1, %o0; \
|
mov -1, %o0; \
|
||||||
.section __ex_table; \
|
.section __ex_table,"a";\
|
||||||
.align 4; \
|
.align 4; \
|
||||||
.word 98b, 99b; \
|
.word 98b, 99b; \
|
||||||
.text; \
|
.text; \
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
.align 4; \
|
.align 4; \
|
||||||
99: retl; \
|
99: retl; \
|
||||||
mov -1, %o0; \
|
mov -1, %o0; \
|
||||||
.section __ex_table; \
|
.section __ex_table,"a";\
|
||||||
.align 4; \
|
.align 4; \
|
||||||
.word 98b, 99b; \
|
.word 98b, 99b; \
|
||||||
.text; \
|
.text; \
|
||||||
|
@ -85,7 +85,7 @@ __strnlen_user:
|
|||||||
retl
|
retl
|
||||||
clr %o0
|
clr %o0
|
||||||
|
|
||||||
.section __ex_table,#alloc
|
.section __ex_table,"a"
|
||||||
.align 4
|
.align 4
|
||||||
|
|
||||||
.word 10b, 30b
|
.word 10b, 30b
|
||||||
|
@ -125,7 +125,7 @@ __strncpy_from_user:
|
|||||||
add %o2, %o3, %o0
|
add %o2, %o3, %o0
|
||||||
.size __strncpy_from_user, .-__strncpy_from_user
|
.size __strncpy_from_user, .-__strncpy_from_user
|
||||||
|
|
||||||
.section __ex_table,#alloc
|
.section __ex_table,"a"
|
||||||
.align 4
|
.align 4
|
||||||
.word 60b, __retl_efault
|
.word 60b, __retl_efault
|
||||||
.word 61b, __retl_efault
|
.word 61b, __retl_efault
|
||||||
|
@ -217,7 +217,7 @@ solaris_unimplemented:
|
|||||||
ba,pt %xcc, ret_from_solaris
|
ba,pt %xcc, ret_from_solaris
|
||||||
nop
|
nop
|
||||||
|
|
||||||
.section __ex_table,#alloc
|
.section __ex_table,"a"
|
||||||
.align 4
|
.align 4
|
||||||
.word exen, exenf
|
.word exen, exenf
|
||||||
|
|
||||||
|
@ -30,6 +30,9 @@
|
|||||||
#include <asm/system.h>
|
#include <asm/system.h>
|
||||||
#include <asm/pgtable.h>
|
#include <asm/pgtable.h>
|
||||||
|
|
||||||
|
void (*pm_power_off)(void) = NULL;
|
||||||
|
EXPORT_SYMBOL(pm_power_off);
|
||||||
|
|
||||||
extern void ret_from_fork (void);
|
extern void ret_from_fork (void);
|
||||||
|
|
||||||
|
|
||||||
|
@ -140,7 +140,7 @@ static void load_segments(void)
|
|||||||
"\tmovl %0,%%ss\n"
|
"\tmovl %0,%%ss\n"
|
||||||
"\tmovl %0,%%fs\n"
|
"\tmovl %0,%%fs\n"
|
||||||
"\tmovl %0,%%gs\n"
|
"\tmovl %0,%%gs\n"
|
||||||
: : "a" (__KERNEL_DS)
|
: : "a" (__KERNEL_DS) : "memory"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -26,6 +26,10 @@ config GENERIC_HARDIRQS
|
|||||||
bool
|
bool
|
||||||
default y
|
default y
|
||||||
|
|
||||||
|
config RWSEM_GENERIC_SPINLOCK
|
||||||
|
bool
|
||||||
|
default y
|
||||||
|
|
||||||
source "init/Kconfig"
|
source "init/Kconfig"
|
||||||
|
|
||||||
menu "Processor type and features"
|
menu "Processor type and features"
|
||||||
|
@ -64,6 +64,9 @@ EXPORT_SYMBOL(init_task);
|
|||||||
|
|
||||||
struct task_struct *current_set[NR_CPUS] = {&init_task, };
|
struct task_struct *current_set[NR_CPUS] = {&init_task, };
|
||||||
|
|
||||||
|
void (*pm_power_off)(void) = NULL;
|
||||||
|
EXPORT_SYMBOL(pm_power_off);
|
||||||
|
|
||||||
|
|
||||||
#if XCHAL_CP_NUM > 0
|
#if XCHAL_CP_NUM > 0
|
||||||
|
|
||||||
|
@ -625,26 +625,31 @@ static inline int ordered_bio_endio(struct request *rq, struct bio *bio,
|
|||||||
* Different hardware can have different requirements as to what pages
|
* Different hardware can have different requirements as to what pages
|
||||||
* it can do I/O directly to. A low level driver can call
|
* it can do I/O directly to. A low level driver can call
|
||||||
* blk_queue_bounce_limit to have lower memory pages allocated as bounce
|
* blk_queue_bounce_limit to have lower memory pages allocated as bounce
|
||||||
* buffers for doing I/O to pages residing above @page. By default
|
* buffers for doing I/O to pages residing above @page.
|
||||||
* the block layer sets this to the highest numbered "low" memory page.
|
|
||||||
**/
|
**/
|
||||||
void blk_queue_bounce_limit(request_queue_t *q, u64 dma_addr)
|
void blk_queue_bounce_limit(request_queue_t *q, u64 dma_addr)
|
||||||
{
|
{
|
||||||
unsigned long bounce_pfn = dma_addr >> PAGE_SHIFT;
|
unsigned long bounce_pfn = dma_addr >> PAGE_SHIFT;
|
||||||
|
int dma = 0;
|
||||||
|
|
||||||
/*
|
q->bounce_gfp = GFP_NOIO;
|
||||||
* set appropriate bounce gfp mask -- unfortunately we don't have a
|
#if BITS_PER_LONG == 64
|
||||||
* full 4GB zone, so we have to resort to low memory for any bounces.
|
/* Assume anything <= 4GB can be handled by IOMMU.
|
||||||
* ISA has its own < 16MB zone.
|
Actually some IOMMUs can handle everything, but I don't
|
||||||
*/
|
know of a way to test this here. */
|
||||||
if (bounce_pfn < blk_max_low_pfn) {
|
if (bounce_pfn < (0xffffffff>>PAGE_SHIFT))
|
||||||
BUG_ON(dma_addr < BLK_BOUNCE_ISA);
|
dma = 1;
|
||||||
|
q->bounce_pfn = max_low_pfn;
|
||||||
|
#else
|
||||||
|
if (bounce_pfn < blk_max_low_pfn)
|
||||||
|
dma = 1;
|
||||||
|
q->bounce_pfn = bounce_pfn;
|
||||||
|
#endif
|
||||||
|
if (dma) {
|
||||||
init_emergency_isa_pool();
|
init_emergency_isa_pool();
|
||||||
q->bounce_gfp = GFP_NOIO | GFP_DMA;
|
q->bounce_gfp = GFP_NOIO | GFP_DMA;
|
||||||
} else
|
q->bounce_pfn = bounce_pfn;
|
||||||
q->bounce_gfp = GFP_NOIO;
|
}
|
||||||
|
|
||||||
q->bounce_pfn = bounce_pfn;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT_SYMBOL(blk_queue_bounce_limit);
|
EXPORT_SYMBOL(blk_queue_bounce_limit);
|
||||||
|
@ -555,7 +555,7 @@ fore200e_pca_reset(struct fore200e* fore200e)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int __init
|
static int __devinit
|
||||||
fore200e_pca_map(struct fore200e* fore200e)
|
fore200e_pca_map(struct fore200e* fore200e)
|
||||||
{
|
{
|
||||||
DPRINTK(2, "device %s being mapped in memory\n", fore200e->name);
|
DPRINTK(2, "device %s being mapped in memory\n", fore200e->name);
|
||||||
@ -589,7 +589,7 @@ fore200e_pca_unmap(struct fore200e* fore200e)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int __init
|
static int __devinit
|
||||||
fore200e_pca_configure(struct fore200e* fore200e)
|
fore200e_pca_configure(struct fore200e* fore200e)
|
||||||
{
|
{
|
||||||
struct pci_dev* pci_dev = (struct pci_dev*)fore200e->bus_dev;
|
struct pci_dev* pci_dev = (struct pci_dev*)fore200e->bus_dev;
|
||||||
@ -2125,7 +2125,7 @@ fore200e_change_qos(struct atm_vcc* vcc,struct atm_qos* qos, int flags)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int __init
|
static int __devinit
|
||||||
fore200e_irq_request(struct fore200e* fore200e)
|
fore200e_irq_request(struct fore200e* fore200e)
|
||||||
{
|
{
|
||||||
if (request_irq(fore200e->irq, fore200e_interrupt, SA_SHIRQ, fore200e->name, fore200e->atm_dev) < 0) {
|
if (request_irq(fore200e->irq, fore200e_interrupt, SA_SHIRQ, fore200e->name, fore200e->atm_dev) < 0) {
|
||||||
@ -2148,7 +2148,7 @@ fore200e_irq_request(struct fore200e* fore200e)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int __init
|
static int __devinit
|
||||||
fore200e_get_esi(struct fore200e* fore200e)
|
fore200e_get_esi(struct fore200e* fore200e)
|
||||||
{
|
{
|
||||||
struct prom_data* prom = fore200e_kmalloc(sizeof(struct prom_data), GFP_KERNEL | GFP_DMA);
|
struct prom_data* prom = fore200e_kmalloc(sizeof(struct prom_data), GFP_KERNEL | GFP_DMA);
|
||||||
@ -2180,7 +2180,7 @@ fore200e_get_esi(struct fore200e* fore200e)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int __init
|
static int __devinit
|
||||||
fore200e_alloc_rx_buf(struct fore200e* fore200e)
|
fore200e_alloc_rx_buf(struct fore200e* fore200e)
|
||||||
{
|
{
|
||||||
int scheme, magn, nbr, size, i;
|
int scheme, magn, nbr, size, i;
|
||||||
@ -2245,7 +2245,7 @@ fore200e_alloc_rx_buf(struct fore200e* fore200e)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int __init
|
static int __devinit
|
||||||
fore200e_init_bs_queue(struct fore200e* fore200e)
|
fore200e_init_bs_queue(struct fore200e* fore200e)
|
||||||
{
|
{
|
||||||
int scheme, magn, i;
|
int scheme, magn, i;
|
||||||
@ -2308,7 +2308,7 @@ fore200e_init_bs_queue(struct fore200e* fore200e)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int __init
|
static int __devinit
|
||||||
fore200e_init_rx_queue(struct fore200e* fore200e)
|
fore200e_init_rx_queue(struct fore200e* fore200e)
|
||||||
{
|
{
|
||||||
struct host_rxq* rxq = &fore200e->host_rxq;
|
struct host_rxq* rxq = &fore200e->host_rxq;
|
||||||
@ -2368,7 +2368,7 @@ fore200e_init_rx_queue(struct fore200e* fore200e)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int __init
|
static int __devinit
|
||||||
fore200e_init_tx_queue(struct fore200e* fore200e)
|
fore200e_init_tx_queue(struct fore200e* fore200e)
|
||||||
{
|
{
|
||||||
struct host_txq* txq = &fore200e->host_txq;
|
struct host_txq* txq = &fore200e->host_txq;
|
||||||
@ -2431,7 +2431,7 @@ fore200e_init_tx_queue(struct fore200e* fore200e)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int __init
|
static int __devinit
|
||||||
fore200e_init_cmd_queue(struct fore200e* fore200e)
|
fore200e_init_cmd_queue(struct fore200e* fore200e)
|
||||||
{
|
{
|
||||||
struct host_cmdq* cmdq = &fore200e->host_cmdq;
|
struct host_cmdq* cmdq = &fore200e->host_cmdq;
|
||||||
@ -2487,7 +2487,7 @@ fore200e_param_bs_queue(struct fore200e* fore200e,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int __init
|
static int __devinit
|
||||||
fore200e_initialize(struct fore200e* fore200e)
|
fore200e_initialize(struct fore200e* fore200e)
|
||||||
{
|
{
|
||||||
struct cp_queues __iomem * cpq;
|
struct cp_queues __iomem * cpq;
|
||||||
@ -2539,7 +2539,7 @@ fore200e_initialize(struct fore200e* fore200e)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void __init
|
static void __devinit
|
||||||
fore200e_monitor_putc(struct fore200e* fore200e, char c)
|
fore200e_monitor_putc(struct fore200e* fore200e, char c)
|
||||||
{
|
{
|
||||||
struct cp_monitor __iomem * monitor = fore200e->cp_monitor;
|
struct cp_monitor __iomem * monitor = fore200e->cp_monitor;
|
||||||
@ -2551,7 +2551,7 @@ fore200e_monitor_putc(struct fore200e* fore200e, char c)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int __init
|
static int __devinit
|
||||||
fore200e_monitor_getc(struct fore200e* fore200e)
|
fore200e_monitor_getc(struct fore200e* fore200e)
|
||||||
{
|
{
|
||||||
struct cp_monitor __iomem * monitor = fore200e->cp_monitor;
|
struct cp_monitor __iomem * monitor = fore200e->cp_monitor;
|
||||||
@ -2576,7 +2576,7 @@ fore200e_monitor_getc(struct fore200e* fore200e)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void __init
|
static void __devinit
|
||||||
fore200e_monitor_puts(struct fore200e* fore200e, char* str)
|
fore200e_monitor_puts(struct fore200e* fore200e, char* str)
|
||||||
{
|
{
|
||||||
while (*str) {
|
while (*str) {
|
||||||
@ -2591,7 +2591,7 @@ fore200e_monitor_puts(struct fore200e* fore200e, char* str)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int __init
|
static int __devinit
|
||||||
fore200e_start_fw(struct fore200e* fore200e)
|
fore200e_start_fw(struct fore200e* fore200e)
|
||||||
{
|
{
|
||||||
int ok;
|
int ok;
|
||||||
@ -2622,7 +2622,7 @@ fore200e_start_fw(struct fore200e* fore200e)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int __init
|
static int __devinit
|
||||||
fore200e_load_fw(struct fore200e* fore200e)
|
fore200e_load_fw(struct fore200e* fore200e)
|
||||||
{
|
{
|
||||||
u32* fw_data = (u32*) fore200e->bus->fw_data;
|
u32* fw_data = (u32*) fore200e->bus->fw_data;
|
||||||
@ -2648,7 +2648,7 @@ fore200e_load_fw(struct fore200e* fore200e)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int __init
|
static int __devinit
|
||||||
fore200e_register(struct fore200e* fore200e)
|
fore200e_register(struct fore200e* fore200e)
|
||||||
{
|
{
|
||||||
struct atm_dev* atm_dev;
|
struct atm_dev* atm_dev;
|
||||||
@ -2675,7 +2675,7 @@ fore200e_register(struct fore200e* fore200e)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int __init
|
static int __devinit
|
||||||
fore200e_init(struct fore200e* fore200e)
|
fore200e_init(struct fore200e* fore200e)
|
||||||
{
|
{
|
||||||
if (fore200e_register(fore200e) < 0)
|
if (fore200e_register(fore200e) < 0)
|
||||||
@ -2721,7 +2721,7 @@ fore200e_init(struct fore200e* fore200e)
|
|||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
|
|
||||||
fore200e_supply(fore200e);
|
fore200e_supply(fore200e);
|
||||||
|
|
||||||
/* all done, board initialization is now complete */
|
/* all done, board initialization is now complete */
|
||||||
fore200e->state = FORE200E_STATE_COMPLETE;
|
fore200e->state = FORE200E_STATE_COMPLETE;
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -41,6 +41,7 @@
|
|||||||
#include <linux/timer.h>
|
#include <linux/timer.h>
|
||||||
#include <linux/pci.h>
|
#include <linux/pci.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
|
#include <linux/random.h>
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include "DAC960.h"
|
#include "DAC960.h"
|
||||||
@ -3463,7 +3464,7 @@ static inline boolean DAC960_ProcessCompletedRequest(DAC960_Command_T *Command,
|
|||||||
Command->SegmentCount, Command->DmaDirection);
|
Command->SegmentCount, Command->DmaDirection);
|
||||||
|
|
||||||
if (!end_that_request_first(Request, UpToDate, Command->BlockCount)) {
|
if (!end_that_request_first(Request, UpToDate, Command->BlockCount)) {
|
||||||
|
add_disk_randomness(Request->rq_disk);
|
||||||
end_that_request_last(Request, UpToDate);
|
end_that_request_last(Request, UpToDate);
|
||||||
|
|
||||||
if (Command->Completion) {
|
if (Command->Completion) {
|
||||||
|
@ -131,7 +131,9 @@ enum {
|
|||||||
rng_hw_none,
|
rng_hw_none,
|
||||||
rng_hw_intel,
|
rng_hw_intel,
|
||||||
rng_hw_amd,
|
rng_hw_amd,
|
||||||
|
#ifdef __i386__
|
||||||
rng_hw_via,
|
rng_hw_via,
|
||||||
|
#endif
|
||||||
rng_hw_geode,
|
rng_hw_geode,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -675,7 +675,7 @@ static int __init mmtimer_init(void)
|
|||||||
cnodeid_t node, maxn = -1;
|
cnodeid_t node, maxn = -1;
|
||||||
|
|
||||||
if (!ia64_platform_is("sn2"))
|
if (!ia64_platform_is("sn2"))
|
||||||
return -1;
|
return 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Sanity check the cycles/sec variable
|
* Sanity check the cycles/sec variable
|
||||||
|
@ -13,11 +13,12 @@
|
|||||||
*
|
*
|
||||||
* (C) 2000,2001,2002,2003,2004 Omnikey AG
|
* (C) 2000,2001,2002,2003,2004 Omnikey AG
|
||||||
*
|
*
|
||||||
* (C) 2005 Harald Welte <laforge@gnumonks.org>
|
* (C) 2005-2006 Harald Welte <laforge@gnumonks.org>
|
||||||
* - Adhere to Kernel CodingStyle
|
* - Adhere to Kernel CodingStyle
|
||||||
* - Port to 2.6.13 "new" style PCMCIA
|
* - Port to 2.6.13 "new" style PCMCIA
|
||||||
* - Check for copy_{from,to}_user return values
|
* - Check for copy_{from,to}_user return values
|
||||||
* - Use nonseekable_open()
|
* - Use nonseekable_open()
|
||||||
|
* - add class interface for udev device creation
|
||||||
*
|
*
|
||||||
* All rights reserved. Licensed under dual BSD/GPL license.
|
* All rights reserved. Licensed under dual BSD/GPL license.
|
||||||
*/
|
*/
|
||||||
@ -56,7 +57,7 @@ module_param(pc_debug, int, 0600);
|
|||||||
#else
|
#else
|
||||||
#define DEBUGP(n, rdr, x, args...)
|
#define DEBUGP(n, rdr, x, args...)
|
||||||
#endif
|
#endif
|
||||||
static char *version = "cm4000_cs.c v2.4.0gm5 - All bugs added by Harald Welte";
|
static char *version = "cm4000_cs.c v2.4.0gm6 - All bugs added by Harald Welte";
|
||||||
|
|
||||||
#define T_1SEC (HZ)
|
#define T_1SEC (HZ)
|
||||||
#define T_10MSEC msecs_to_jiffies(10)
|
#define T_10MSEC msecs_to_jiffies(10)
|
||||||
@ -156,6 +157,7 @@ struct cm4000_dev {
|
|||||||
/*queue*/ 4*sizeof(wait_queue_head_t))
|
/*queue*/ 4*sizeof(wait_queue_head_t))
|
||||||
|
|
||||||
static dev_link_t *dev_table[CM4000_MAX_DEV];
|
static dev_link_t *dev_table[CM4000_MAX_DEV];
|
||||||
|
static struct class *cmm_class;
|
||||||
|
|
||||||
/* This table doesn't use spaces after the comma between fields and thus
|
/* This table doesn't use spaces after the comma between fields and thus
|
||||||
* violates CodingStyle. However, I don't really think wrapping it around will
|
* violates CodingStyle. However, I don't really think wrapping it around will
|
||||||
@ -1937,6 +1939,9 @@ static int cm4000_attach(struct pcmcia_device *p_dev)
|
|||||||
link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
|
link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
|
||||||
cm4000_config(link, i);
|
cm4000_config(link, i);
|
||||||
|
|
||||||
|
class_device_create(cmm_class, NULL, MKDEV(major, i), NULL,
|
||||||
|
"cmm%d", i);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1962,6 +1967,8 @@ static void cm4000_detach(struct pcmcia_device *p_dev)
|
|||||||
dev_table[devno] = NULL;
|
dev_table[devno] = NULL;
|
||||||
kfree(dev);
|
kfree(dev);
|
||||||
|
|
||||||
|
class_device_destroy(cmm_class, MKDEV(major, devno));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1995,8 +2002,18 @@ static struct pcmcia_driver cm4000_driver = {
|
|||||||
|
|
||||||
static int __init cmm_init(void)
|
static int __init cmm_init(void)
|
||||||
{
|
{
|
||||||
|
int rc;
|
||||||
|
|
||||||
printk(KERN_INFO "%s\n", version);
|
printk(KERN_INFO "%s\n", version);
|
||||||
pcmcia_register_driver(&cm4000_driver);
|
|
||||||
|
cmm_class = class_create(THIS_MODULE, "cardman_4000");
|
||||||
|
if (!cmm_class)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
rc = pcmcia_register_driver(&cm4000_driver);
|
||||||
|
if (rc < 0)
|
||||||
|
return rc;
|
||||||
|
|
||||||
major = register_chrdev(0, DEVICE_NAME, &cm4000_fops);
|
major = register_chrdev(0, DEVICE_NAME, &cm4000_fops);
|
||||||
if (major < 0) {
|
if (major < 0) {
|
||||||
printk(KERN_WARNING MODULE_NAME
|
printk(KERN_WARNING MODULE_NAME
|
||||||
@ -2012,6 +2029,7 @@ static void __exit cmm_exit(void)
|
|||||||
printk(KERN_INFO MODULE_NAME ": unloading\n");
|
printk(KERN_INFO MODULE_NAME ": unloading\n");
|
||||||
pcmcia_unregister_driver(&cm4000_driver);
|
pcmcia_unregister_driver(&cm4000_driver);
|
||||||
unregister_chrdev(major, DEVICE_NAME);
|
unregister_chrdev(major, DEVICE_NAME);
|
||||||
|
class_destroy(cmm_class);
|
||||||
};
|
};
|
||||||
|
|
||||||
module_init(cmm_init);
|
module_init(cmm_init);
|
||||||
|
@ -3,12 +3,13 @@
|
|||||||
*
|
*
|
||||||
* (c) 2000-2004 Omnikey AG (http://www.omnikey.com/)
|
* (c) 2000-2004 Omnikey AG (http://www.omnikey.com/)
|
||||||
*
|
*
|
||||||
* (C) 2005 Harald Welte <laforge@gnumonks.org>
|
* (C) 2005-2006 Harald Welte <laforge@gnumonks.org>
|
||||||
* - add support for poll()
|
* - add support for poll()
|
||||||
* - driver cleanup
|
* - driver cleanup
|
||||||
* - add waitqueues
|
* - add waitqueues
|
||||||
* - adhere to linux kernel coding style and policies
|
* - adhere to linux kernel coding style and policies
|
||||||
* - support 2.6.13 "new style" pcmcia interface
|
* - support 2.6.13 "new style" pcmcia interface
|
||||||
|
* - add class interface for udev device creation
|
||||||
*
|
*
|
||||||
* The device basically is a USB CCID compliant device that has been
|
* The device basically is a USB CCID compliant device that has been
|
||||||
* attached to an I/O-Mapped FIFO.
|
* attached to an I/O-Mapped FIFO.
|
||||||
@ -53,7 +54,7 @@ module_param(pc_debug, int, 0600);
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
static char *version =
|
static char *version =
|
||||||
"OMNIKEY CardMan 4040 v1.1.0gm4 - All bugs added by Harald Welte";
|
"OMNIKEY CardMan 4040 v1.1.0gm5 - All bugs added by Harald Welte";
|
||||||
|
|
||||||
#define CCID_DRIVER_BULK_DEFAULT_TIMEOUT (150*HZ)
|
#define CCID_DRIVER_BULK_DEFAULT_TIMEOUT (150*HZ)
|
||||||
#define CCID_DRIVER_ASYNC_POWERUP_TIMEOUT (35*HZ)
|
#define CCID_DRIVER_ASYNC_POWERUP_TIMEOUT (35*HZ)
|
||||||
@ -67,6 +68,7 @@ static char *version =
|
|||||||
static void reader_release(dev_link_t *link);
|
static void reader_release(dev_link_t *link);
|
||||||
|
|
||||||
static int major;
|
static int major;
|
||||||
|
static struct class *cmx_class;
|
||||||
|
|
||||||
#define BS_READABLE 0x01
|
#define BS_READABLE 0x01
|
||||||
#define BS_WRITABLE 0x02
|
#define BS_WRITABLE 0x02
|
||||||
@ -696,6 +698,9 @@ static int reader_attach(struct pcmcia_device *p_dev)
|
|||||||
link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
|
link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
|
||||||
reader_config(link, i);
|
reader_config(link, i);
|
||||||
|
|
||||||
|
class_device_create(cmx_class, NULL, MKDEV(major, i), NULL,
|
||||||
|
"cmx%d", i);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -721,6 +726,8 @@ static void reader_detach(struct pcmcia_device *p_dev)
|
|||||||
dev_table[devno] = NULL;
|
dev_table[devno] = NULL;
|
||||||
kfree(dev);
|
kfree(dev);
|
||||||
|
|
||||||
|
class_device_destroy(cmx_class, MKDEV(major, devno));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -755,8 +762,17 @@ static struct pcmcia_driver reader_driver = {
|
|||||||
|
|
||||||
static int __init cm4040_init(void)
|
static int __init cm4040_init(void)
|
||||||
{
|
{
|
||||||
|
int rc;
|
||||||
|
|
||||||
printk(KERN_INFO "%s\n", version);
|
printk(KERN_INFO "%s\n", version);
|
||||||
pcmcia_register_driver(&reader_driver);
|
cmx_class = class_create(THIS_MODULE, "cardman_4040");
|
||||||
|
if (!cmx_class)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
rc = pcmcia_register_driver(&reader_driver);
|
||||||
|
if (rc < 0)
|
||||||
|
return rc;
|
||||||
|
|
||||||
major = register_chrdev(0, DEVICE_NAME, &reader_fops);
|
major = register_chrdev(0, DEVICE_NAME, &reader_fops);
|
||||||
if (major < 0) {
|
if (major < 0) {
|
||||||
printk(KERN_WARNING MODULE_NAME
|
printk(KERN_WARNING MODULE_NAME
|
||||||
@ -771,6 +787,7 @@ static void __exit cm4040_exit(void)
|
|||||||
printk(KERN_INFO MODULE_NAME ": unloading\n");
|
printk(KERN_INFO MODULE_NAME ": unloading\n");
|
||||||
pcmcia_unregister_driver(&reader_driver);
|
pcmcia_unregister_driver(&reader_driver);
|
||||||
unregister_chrdev(major, DEVICE_NAME);
|
unregister_chrdev(major, DEVICE_NAME);
|
||||||
|
class_destroy(cmx_class);
|
||||||
}
|
}
|
||||||
|
|
||||||
module_init(cm4040_init);
|
module_init(cm4040_init);
|
||||||
|
@ -6,17 +6,29 @@
|
|||||||
# $Id: Kconfig,v 1.4.2.7 2005/07/08 22:05:38 dsp_llnl Exp $
|
# $Id: Kconfig,v 1.4.2.7 2005/07/08 22:05:38 dsp_llnl Exp $
|
||||||
#
|
#
|
||||||
|
|
||||||
menu 'EDAC - error detection and reporting (RAS)'
|
menu 'EDAC - error detection and reporting (RAS) (EXPERIMENTAL)'
|
||||||
|
|
||||||
config EDAC
|
config EDAC
|
||||||
tristate "EDAC core system error reporting"
|
tristate "EDAC core system error reporting (EXPERIMENTAL)"
|
||||||
depends on X86
|
depends on X86 && EXPERIMENTAL
|
||||||
help
|
help
|
||||||
EDAC is designed to report errors in the core system.
|
EDAC is designed to report errors in the core system.
|
||||||
These are low-level errors that are reported in the CPU or
|
These are low-level errors that are reported in the CPU or
|
||||||
supporting chipset: memory errors, cache errors, PCI errors,
|
supporting chipset: memory errors, cache errors, PCI errors,
|
||||||
thermal throttling, etc.. If unsure, select 'Y'.
|
thermal throttling, etc.. If unsure, select 'Y'.
|
||||||
|
|
||||||
|
If this code is reporting problems on your system, please
|
||||||
|
see the EDAC project web pages for more information at:
|
||||||
|
|
||||||
|
<http://bluesmoke.sourceforge.net/>
|
||||||
|
|
||||||
|
and:
|
||||||
|
|
||||||
|
<http://buttersideup.com/edacwiki>
|
||||||
|
|
||||||
|
There is also a mailing list for the EDAC project, which can
|
||||||
|
be found via the sourceforge page.
|
||||||
|
|
||||||
|
|
||||||
comment "Reporting subsystems"
|
comment "Reporting subsystems"
|
||||||
depends on EDAC
|
depends on EDAC
|
||||||
|
@ -132,11 +132,13 @@ static struct kobject edac_pci_kobj;
|
|||||||
* /sys/devices/system/edac/mc;
|
* /sys/devices/system/edac/mc;
|
||||||
* data structures and methods
|
* data structures and methods
|
||||||
*/
|
*/
|
||||||
|
#if 0
|
||||||
static ssize_t memctrl_string_show(void *ptr, char *buffer)
|
static ssize_t memctrl_string_show(void *ptr, char *buffer)
|
||||||
{
|
{
|
||||||
char *value = (char*) ptr;
|
char *value = (char*) ptr;
|
||||||
return sprintf(buffer, "%s\n", value);
|
return sprintf(buffer, "%s\n", value);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static ssize_t memctrl_int_show(void *ptr, char *buffer)
|
static ssize_t memctrl_int_show(void *ptr, char *buffer)
|
||||||
{
|
{
|
||||||
@ -207,7 +209,9 @@ struct memctrl_dev_attribute attr_##_name = { \
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* cwrow<id> attribute f*/
|
/* cwrow<id> attribute f*/
|
||||||
|
#if 0
|
||||||
MEMCTRL_STRING_ATTR(mc_version,EDAC_MC_VERSION,S_IRUGO,memctrl_string_show,NULL);
|
MEMCTRL_STRING_ATTR(mc_version,EDAC_MC_VERSION,S_IRUGO,memctrl_string_show,NULL);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* csrow<id> control files */
|
/* csrow<id> control files */
|
||||||
MEMCTRL_ATTR(panic_on_ue,S_IRUGO|S_IWUSR,memctrl_int_show,memctrl_int_store);
|
MEMCTRL_ATTR(panic_on_ue,S_IRUGO|S_IWUSR,memctrl_int_show,memctrl_int_store);
|
||||||
@ -222,7 +226,6 @@ static struct memctrl_dev_attribute *memctrl_attr[] = {
|
|||||||
&attr_log_ue,
|
&attr_log_ue,
|
||||||
&attr_log_ce,
|
&attr_log_ce,
|
||||||
&attr_poll_msec,
|
&attr_poll_msec,
|
||||||
&attr_mc_version,
|
|
||||||
NULL,
|
NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -309,6 +312,8 @@ struct list_control {
|
|||||||
int *count;
|
int *count;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#if 0
|
||||||
/* Output the list as: vendor_id:device:id<,vendor_id:device_id> */
|
/* Output the list as: vendor_id:device:id<,vendor_id:device_id> */
|
||||||
static ssize_t edac_pci_list_string_show(void *ptr, char *buffer)
|
static ssize_t edac_pci_list_string_show(void *ptr, char *buffer)
|
||||||
{
|
{
|
||||||
@ -430,6 +435,7 @@ static ssize_t edac_pci_list_string_store(void *ptr, const char *buffer,
|
|||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
static ssize_t edac_pci_int_show(void *ptr, char *buffer)
|
static ssize_t edac_pci_int_show(void *ptr, char *buffer)
|
||||||
{
|
{
|
||||||
int *value = ptr;
|
int *value = ptr;
|
||||||
@ -498,6 +504,7 @@ struct edac_pci_dev_attribute edac_pci_attr_##_name = { \
|
|||||||
.store = _store, \
|
.store = _store, \
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if 0
|
||||||
static struct list_control pci_whitelist_control = {
|
static struct list_control pci_whitelist_control = {
|
||||||
.list = pci_whitelist,
|
.list = pci_whitelist,
|
||||||
.count = &pci_whitelist_count
|
.count = &pci_whitelist_count
|
||||||
@ -520,6 +527,7 @@ EDAC_PCI_STRING_ATTR(pci_parity_blacklist,
|
|||||||
S_IRUGO|S_IWUSR,
|
S_IRUGO|S_IWUSR,
|
||||||
edac_pci_list_string_show,
|
edac_pci_list_string_show,
|
||||||
edac_pci_list_string_store);
|
edac_pci_list_string_store);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* PCI Parity control files */
|
/* PCI Parity control files */
|
||||||
EDAC_PCI_ATTR(check_pci_parity,S_IRUGO|S_IWUSR,edac_pci_int_show,edac_pci_int_store);
|
EDAC_PCI_ATTR(check_pci_parity,S_IRUGO|S_IWUSR,edac_pci_int_show,edac_pci_int_store);
|
||||||
@ -531,8 +539,6 @@ static struct edac_pci_dev_attribute *edac_pci_attr[] = {
|
|||||||
&edac_pci_attr_check_pci_parity,
|
&edac_pci_attr_check_pci_parity,
|
||||||
&edac_pci_attr_panic_on_pci_parity,
|
&edac_pci_attr_panic_on_pci_parity,
|
||||||
&edac_pci_attr_pci_parity_count,
|
&edac_pci_attr_pci_parity_count,
|
||||||
&edac_pci_attr_pci_parity_whitelist,
|
|
||||||
&edac_pci_attr_pci_parity_blacklist,
|
|
||||||
NULL,
|
NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -39,7 +39,7 @@
|
|||||||
#include "dcdbas.h"
|
#include "dcdbas.h"
|
||||||
|
|
||||||
#define DRIVER_NAME "dcdbas"
|
#define DRIVER_NAME "dcdbas"
|
||||||
#define DRIVER_VERSION "5.6.0-1"
|
#define DRIVER_VERSION "5.6.0-2"
|
||||||
#define DRIVER_DESCRIPTION "Dell Systems Management Base Driver"
|
#define DRIVER_DESCRIPTION "Dell Systems Management Base Driver"
|
||||||
|
|
||||||
static struct platform_device *dcdbas_pdev;
|
static struct platform_device *dcdbas_pdev;
|
||||||
@ -581,9 +581,13 @@ static int __init dcdbas_init(void)
|
|||||||
*/
|
*/
|
||||||
static void __exit dcdbas_exit(void)
|
static void __exit dcdbas_exit(void)
|
||||||
{
|
{
|
||||||
platform_device_unregister(dcdbas_pdev);
|
/*
|
||||||
|
* make sure functions that use dcdbas_pdev are called
|
||||||
|
* before platform_device_unregister
|
||||||
|
*/
|
||||||
unregister_reboot_notifier(&dcdbas_reboot_nb);
|
unregister_reboot_notifier(&dcdbas_reboot_nb);
|
||||||
smi_data_buf_free();
|
smi_data_buf_free();
|
||||||
|
platform_device_unregister(dcdbas_pdev);
|
||||||
}
|
}
|
||||||
|
|
||||||
module_init(dcdbas_init);
|
module_init(dcdbas_init);
|
||||||
|
@ -445,6 +445,7 @@ static struct pcmcia_device_id ide_ids[] = {
|
|||||||
PCMCIA_DEVICE_PROD_ID12("PCMCIA", "PnPIDE", 0x281f1c5d, 0x0c694728),
|
PCMCIA_DEVICE_PROD_ID12("PCMCIA", "PnPIDE", 0x281f1c5d, 0x0c694728),
|
||||||
PCMCIA_DEVICE_PROD_ID12("SHUTTLE TECHNOLOGY LTD.", "PCCARD-IDE/ATAPI Adapter", 0x4a3f0ba0, 0x322560e1),
|
PCMCIA_DEVICE_PROD_ID12("SHUTTLE TECHNOLOGY LTD.", "PCCARD-IDE/ATAPI Adapter", 0x4a3f0ba0, 0x322560e1),
|
||||||
PCMCIA_DEVICE_PROD_ID12("TOSHIBA", "MK2001MPL", 0xb4585a1a, 0x3489e003),
|
PCMCIA_DEVICE_PROD_ID12("TOSHIBA", "MK2001MPL", 0xb4585a1a, 0x3489e003),
|
||||||
|
PCMCIA_DEVICE_PROD_ID1("TRANSCEND 512M ", 0xd0909443),
|
||||||
PCMCIA_DEVICE_PROD_ID12("WIT", "IDE16", 0x244e5994, 0x3e232852),
|
PCMCIA_DEVICE_PROD_ID12("WIT", "IDE16", 0x244e5994, 0x3e232852),
|
||||||
PCMCIA_DEVICE_PROD_ID1("STI Flash", 0xe4a13209),
|
PCMCIA_DEVICE_PROD_ID1("STI Flash", 0xe4a13209),
|
||||||
PCMCIA_DEVICE_PROD_ID12("STI", "Flash 5.0", 0xbf2df18d, 0x8cb57a0e),
|
PCMCIA_DEVICE_PROD_ID12("STI", "Flash 5.0", 0xbf2df18d, 0x8cb57a0e),
|
||||||
|
@ -1155,6 +1155,12 @@ static int srp_send_tsk_mgmt(struct scsi_cmnd *scmnd, u8 func)
|
|||||||
|
|
||||||
spin_lock_irq(target->scsi_host->host_lock);
|
spin_lock_irq(target->scsi_host->host_lock);
|
||||||
|
|
||||||
|
if (target->state == SRP_TARGET_DEAD ||
|
||||||
|
target->state == SRP_TARGET_REMOVED) {
|
||||||
|
scmnd->result = DID_BAD_TARGET << 16;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
if (scmnd->host_scribble == (void *) -1L)
|
if (scmnd->host_scribble == (void *) -1L)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
@ -58,7 +58,7 @@ static unsigned int psmouse_resetafter = 5;
|
|||||||
module_param_named(resetafter, psmouse_resetafter, uint, 0644);
|
module_param_named(resetafter, psmouse_resetafter, uint, 0644);
|
||||||
MODULE_PARM_DESC(resetafter, "Reset device after so many bad packets (0 = never).");
|
MODULE_PARM_DESC(resetafter, "Reset device after so many bad packets (0 = never).");
|
||||||
|
|
||||||
static unsigned int psmouse_resync_time = 5;
|
static unsigned int psmouse_resync_time;
|
||||||
module_param_named(resync_time, psmouse_resync_time, uint, 0644);
|
module_param_named(resync_time, psmouse_resync_time, uint, 0644);
|
||||||
MODULE_PARM_DESC(resync_time, "How long can mouse stay idle before forcing resync (in seconds, 0 = never).");
|
MODULE_PARM_DESC(resync_time, "How long can mouse stay idle before forcing resync (in seconds, 0 = never).");
|
||||||
|
|
||||||
|
@ -1929,6 +1929,8 @@ static struct pci_device_id hisax_pci_tbl[] __initdata = {
|
|||||||
{PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B00B, PCI_ANY_ID, PCI_ANY_ID},
|
{PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B00B, PCI_ANY_ID, PCI_ANY_ID},
|
||||||
{PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B00C, PCI_ANY_ID, PCI_ANY_ID},
|
{PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B00C, PCI_ANY_ID, PCI_ANY_ID},
|
||||||
{PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B100, PCI_ANY_ID, PCI_ANY_ID},
|
{PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B100, PCI_ANY_ID, PCI_ANY_ID},
|
||||||
|
{PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B700, PCI_ANY_ID, PCI_ANY_ID},
|
||||||
|
{PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B701, PCI_ANY_ID, PCI_ANY_ID},
|
||||||
{PCI_VENDOR_ID_ABOCOM, PCI_DEVICE_ID_ABOCOM_2BD1, PCI_ANY_ID, PCI_ANY_ID},
|
{PCI_VENDOR_ID_ABOCOM, PCI_DEVICE_ID_ABOCOM_2BD1, PCI_ANY_ID, PCI_ANY_ID},
|
||||||
{PCI_VENDOR_ID_ASUSTEK, PCI_DEVICE_ID_ASUSTEK_0675, PCI_ANY_ID, PCI_ANY_ID},
|
{PCI_VENDOR_ID_ASUSTEK, PCI_DEVICE_ID_ASUSTEK_0675, PCI_ANY_ID, PCI_ANY_ID},
|
||||||
{PCI_VENDOR_ID_BERKOM, PCI_DEVICE_ID_BERKOM_T_CONCEPT, PCI_ANY_ID, PCI_ANY_ID},
|
{PCI_VENDOR_ID_BERKOM, PCI_DEVICE_ID_BERKOM_T_CONCEPT, PCI_ANY_ID, PCI_ANY_ID},
|
||||||
|
@ -51,6 +51,8 @@ static const PCI_ENTRY id_list[] =
|
|||||||
{PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B00B, "Billion", "B00B"},
|
{PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B00B, "Billion", "B00B"},
|
||||||
{PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B00C, "Billion", "B00C"},
|
{PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B00C, "Billion", "B00C"},
|
||||||
{PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B100, "Seyeon", "B100"},
|
{PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B100, "Seyeon", "B100"},
|
||||||
|
{PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B700, "Primux II S0", "B700"},
|
||||||
|
{PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_B701, "Primux II S0 NT", "B701"},
|
||||||
{PCI_VENDOR_ID_ABOCOM, PCI_DEVICE_ID_ABOCOM_2BD1, "Abocom/Magitek", "2BD1"},
|
{PCI_VENDOR_ID_ABOCOM, PCI_DEVICE_ID_ABOCOM_2BD1, "Abocom/Magitek", "2BD1"},
|
||||||
{PCI_VENDOR_ID_ASUSTEK, PCI_DEVICE_ID_ASUSTEK_0675, "Asuscom/Askey", "675"},
|
{PCI_VENDOR_ID_ASUSTEK, PCI_DEVICE_ID_ASUSTEK_0675, "Asuscom/Askey", "675"},
|
||||||
{PCI_VENDOR_ID_BERKOM, PCI_DEVICE_ID_BERKOM_T_CONCEPT, "German telekom", "T-Concept"},
|
{PCI_VENDOR_ID_BERKOM, PCI_DEVICE_ID_BERKOM_T_CONCEPT, "German telekom", "T-Concept"},
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* hfc_usb.c
|
* hfc_usb.c
|
||||||
*
|
*
|
||||||
* $Id: hfc_usb.c,v 4.36 2005/04/08 09:55:13 martinb1 Exp $
|
* $Id: hfc_usb.c,v 2.3.2.13 2006/02/17 17:17:22 mbachem Exp $
|
||||||
*
|
*
|
||||||
* modular HiSax ISDN driver for Colognechip HFC-S USB chip
|
* modular HiSax ISDN driver for Colognechip HFC-S USB chip
|
||||||
*
|
*
|
||||||
@ -45,7 +45,7 @@
|
|||||||
#include "hfc_usb.h"
|
#include "hfc_usb.h"
|
||||||
|
|
||||||
static const char *hfcusb_revision =
|
static const char *hfcusb_revision =
|
||||||
"$Revision: 4.36 $ $Date: 2005/04/08 09:55:13 $ ";
|
"$Revision: 2.3.2.13 $ $Date: 2006/02/17 17:17:22 $ ";
|
||||||
|
|
||||||
/* Hisax debug support
|
/* Hisax debug support
|
||||||
* use "modprobe debug=x" where x is bitfield of USB_DBG & ISDN_DBG
|
* use "modprobe debug=x" where x is bitfield of USB_DBG & ISDN_DBG
|
||||||
@ -219,7 +219,7 @@ symbolic(struct hfcusb_symbolic_list list[], const int num)
|
|||||||
for (i = 0; list[i].name != NULL; i++)
|
for (i = 0; list[i].name != NULL; i++)
|
||||||
if (list[i].num == num)
|
if (list[i].num == num)
|
||||||
return (list[i].name);
|
return (list[i].name);
|
||||||
return "<unkown ERROR>";
|
return "<unknown ERROR>";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -235,9 +235,9 @@ ctrl_start_transfer(hfcusb_data * hfc)
|
|||||||
hfc->ctrl_urb->transfer_buffer = NULL;
|
hfc->ctrl_urb->transfer_buffer = NULL;
|
||||||
hfc->ctrl_urb->transfer_buffer_length = 0;
|
hfc->ctrl_urb->transfer_buffer_length = 0;
|
||||||
hfc->ctrl_write.wIndex =
|
hfc->ctrl_write.wIndex =
|
||||||
hfc->ctrl_buff[hfc->ctrl_out_idx].hfc_reg;
|
cpu_to_le16(hfc->ctrl_buff[hfc->ctrl_out_idx].hfc_reg);
|
||||||
hfc->ctrl_write.wValue =
|
hfc->ctrl_write.wValue =
|
||||||
hfc->ctrl_buff[hfc->ctrl_out_idx].reg_val;
|
cpu_to_le16(hfc->ctrl_buff[hfc->ctrl_out_idx].reg_val);
|
||||||
|
|
||||||
usb_submit_urb(hfc->ctrl_urb, GFP_ATOMIC); /* start transfer */
|
usb_submit_urb(hfc->ctrl_urb, GFP_ATOMIC); /* start transfer */
|
||||||
}
|
}
|
||||||
@ -1282,7 +1282,7 @@ usb_init(hfcusb_data * hfc)
|
|||||||
/* init the background machinery for control requests */
|
/* init the background machinery for control requests */
|
||||||
hfc->ctrl_read.bRequestType = 0xc0;
|
hfc->ctrl_read.bRequestType = 0xc0;
|
||||||
hfc->ctrl_read.bRequest = 1;
|
hfc->ctrl_read.bRequest = 1;
|
||||||
hfc->ctrl_read.wLength = 1;
|
hfc->ctrl_read.wLength = cpu_to_le16(1);
|
||||||
hfc->ctrl_write.bRequestType = 0x40;
|
hfc->ctrl_write.bRequestType = 0x40;
|
||||||
hfc->ctrl_write.bRequest = 0;
|
hfc->ctrl_write.bRequest = 0;
|
||||||
hfc->ctrl_write.wLength = 0;
|
hfc->ctrl_write.wLength = 0;
|
||||||
@ -1373,9 +1373,8 @@ hfc_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
|||||||
|
|
||||||
vend_idx = 0xffff;
|
vend_idx = 0xffff;
|
||||||
for (i = 0; hfcusb_idtab[i].idVendor; i++) {
|
for (i = 0; hfcusb_idtab[i].idVendor; i++) {
|
||||||
if (dev->descriptor.idVendor == hfcusb_idtab[i].idVendor
|
if ((le16_to_cpu(dev->descriptor.idVendor) == hfcusb_idtab[i].idVendor)
|
||||||
&& dev->descriptor.idProduct ==
|
&& (le16_to_cpu(dev->descriptor.idProduct) == hfcusb_idtab[i].idProduct)) {
|
||||||
hfcusb_idtab[i].idProduct) {
|
|
||||||
vend_idx = i;
|
vend_idx = i;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -1516,8 +1515,7 @@ hfc_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
|||||||
usb_transfer_mode
|
usb_transfer_mode
|
||||||
= USB_INT;
|
= USB_INT;
|
||||||
packet_size =
|
packet_size =
|
||||||
ep->desc.
|
le16_to_cpu(ep->desc.wMaxPacketSize);
|
||||||
wMaxPacketSize;
|
|
||||||
break;
|
break;
|
||||||
case USB_ENDPOINT_XFER_BULK:
|
case USB_ENDPOINT_XFER_BULK:
|
||||||
if (ep_addr & 0x80)
|
if (ep_addr & 0x80)
|
||||||
@ -1545,8 +1543,7 @@ hfc_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
|||||||
usb_transfer_mode
|
usb_transfer_mode
|
||||||
= USB_BULK;
|
= USB_BULK;
|
||||||
packet_size =
|
packet_size =
|
||||||
ep->desc.
|
le16_to_cpu(ep->desc.wMaxPacketSize);
|
||||||
wMaxPacketSize;
|
|
||||||
break;
|
break;
|
||||||
case USB_ENDPOINT_XFER_ISOC:
|
case USB_ENDPOINT_XFER_ISOC:
|
||||||
if (ep_addr & 0x80)
|
if (ep_addr & 0x80)
|
||||||
@ -1574,8 +1571,7 @@ hfc_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
|||||||
usb_transfer_mode
|
usb_transfer_mode
|
||||||
= USB_ISOC;
|
= USB_ISOC;
|
||||||
iso_packet_size =
|
iso_packet_size =
|
||||||
ep->desc.
|
le16_to_cpu(ep->desc.wMaxPacketSize);
|
||||||
wMaxPacketSize;
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
context->
|
context->
|
||||||
@ -1588,10 +1584,8 @@ hfc_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
|||||||
fifonum = cidx;
|
fifonum = cidx;
|
||||||
context->fifos[cidx].hfc =
|
context->fifos[cidx].hfc =
|
||||||
context;
|
context;
|
||||||
context->fifos[cidx].
|
context->fifos[cidx].usb_packet_maxlen =
|
||||||
usb_packet_maxlen =
|
le16_to_cpu(ep->desc.wMaxPacketSize);
|
||||||
ep->desc.
|
|
||||||
wMaxPacketSize;
|
|
||||||
context->fifos[cidx].
|
context->fifos[cidx].
|
||||||
intervall =
|
intervall =
|
||||||
ep->desc.bInterval;
|
ep->desc.bInterval;
|
||||||
|
@ -1682,6 +1682,7 @@ isdn_tty_close(struct tty_struct *tty, struct file *filp)
|
|||||||
#ifdef ISDN_DEBUG_MODEM_OPEN
|
#ifdef ISDN_DEBUG_MODEM_OPEN
|
||||||
printk(KERN_DEBUG "isdn_tty_close after info->count != 0\n");
|
printk(KERN_DEBUG "isdn_tty_close after info->count != 0\n");
|
||||||
#endif
|
#endif
|
||||||
|
module_put(info->owner);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
info->flags |= ISDN_ASYNC_CLOSING;
|
info->flags |= ISDN_ASYNC_CLOSING;
|
||||||
|
@ -35,6 +35,8 @@
|
|||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/mutex.h>
|
#include <linux/mutex.h>
|
||||||
|
|
||||||
|
#include <asm/prom.h>
|
||||||
|
|
||||||
#include "windfarm.h"
|
#include "windfarm.h"
|
||||||
|
|
||||||
#define VERSION "0.2"
|
#define VERSION "0.2"
|
||||||
@ -465,6 +467,11 @@ static int __init windfarm_core_init(void)
|
|||||||
{
|
{
|
||||||
DBG("wf: core loaded\n");
|
DBG("wf: core loaded\n");
|
||||||
|
|
||||||
|
/* Don't register on old machines that use therm_pm72 for now */
|
||||||
|
if (machine_is_compatible("PowerMac7,2") ||
|
||||||
|
machine_is_compatible("PowerMac7,3") ||
|
||||||
|
machine_is_compatible("RackMac3,1"))
|
||||||
|
return -ENODEV;
|
||||||
platform_device_register(&wf_platform_device);
|
platform_device_register(&wf_platform_device);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,8 @@
|
|||||||
#include <linux/wait.h>
|
#include <linux/wait.h>
|
||||||
#include <linux/cpufreq.h>
|
#include <linux/cpufreq.h>
|
||||||
|
|
||||||
|
#include <asm/prom.h>
|
||||||
|
|
||||||
#include "windfarm.h"
|
#include "windfarm.h"
|
||||||
|
|
||||||
#define VERSION "0.3"
|
#define VERSION "0.3"
|
||||||
@ -74,6 +76,12 @@ static int __init wf_cpufreq_clamp_init(void)
|
|||||||
{
|
{
|
||||||
struct wf_control *clamp;
|
struct wf_control *clamp;
|
||||||
|
|
||||||
|
/* Don't register on old machines that use therm_pm72 for now */
|
||||||
|
if (machine_is_compatible("PowerMac7,2") ||
|
||||||
|
machine_is_compatible("PowerMac7,3") ||
|
||||||
|
machine_is_compatible("RackMac3,1"))
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
clamp = kmalloc(sizeof(struct wf_control), GFP_KERNEL);
|
clamp = kmalloc(sizeof(struct wf_control), GFP_KERNEL);
|
||||||
if (clamp == NULL)
|
if (clamp == NULL)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
|
|
||||||
#include "windfarm.h"
|
#include "windfarm.h"
|
||||||
|
|
||||||
#define VERSION "0.1"
|
#define VERSION "0.2"
|
||||||
|
|
||||||
#undef DEBUG
|
#undef DEBUG
|
||||||
|
|
||||||
@ -113,6 +113,7 @@ static struct wf_lm75_sensor *wf_lm75_create(struct i2c_adapter *adapter,
|
|||||||
const char *loc)
|
const char *loc)
|
||||||
{
|
{
|
||||||
struct wf_lm75_sensor *lm;
|
struct wf_lm75_sensor *lm;
|
||||||
|
int rc;
|
||||||
|
|
||||||
DBG("wf_lm75: creating %s device at address 0x%02x\n",
|
DBG("wf_lm75: creating %s device at address 0x%02x\n",
|
||||||
ds1775 ? "ds1775" : "lm75", addr);
|
ds1775 ? "ds1775" : "lm75", addr);
|
||||||
@ -139,9 +140,11 @@ static struct wf_lm75_sensor *wf_lm75_create(struct i2c_adapter *adapter,
|
|||||||
lm->i2c.driver = &wf_lm75_driver;
|
lm->i2c.driver = &wf_lm75_driver;
|
||||||
strncpy(lm->i2c.name, lm->sens.name, I2C_NAME_SIZE-1);
|
strncpy(lm->i2c.name, lm->sens.name, I2C_NAME_SIZE-1);
|
||||||
|
|
||||||
if (i2c_attach_client(&lm->i2c)) {
|
rc = i2c_attach_client(&lm->i2c);
|
||||||
printk(KERN_ERR "windfarm: failed to attach %s %s to i2c\n",
|
if (rc) {
|
||||||
ds1775 ? "ds1775" : "lm75", lm->i2c.name);
|
printk(KERN_ERR "windfarm: failed to attach %s %s to i2c,"
|
||||||
|
" err %d\n", ds1775 ? "ds1775" : "lm75",
|
||||||
|
lm->i2c.name, rc);
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -175,16 +178,22 @@ static int wf_lm75_attach(struct i2c_adapter *adapter)
|
|||||||
(dev = of_get_next_child(busnode, dev)) != NULL;) {
|
(dev = of_get_next_child(busnode, dev)) != NULL;) {
|
||||||
const char *loc =
|
const char *loc =
|
||||||
get_property(dev, "hwsensor-location", NULL);
|
get_property(dev, "hwsensor-location", NULL);
|
||||||
u32 *reg = (u32 *)get_property(dev, "reg", NULL);
|
u8 addr;
|
||||||
DBG(" dev: %s... (loc: %p, reg: %p)\n", dev->name, loc, reg);
|
|
||||||
if (loc == NULL || reg == NULL)
|
/* We must re-match the adapter in order to properly check
|
||||||
|
* the channel on multibus setups
|
||||||
|
*/
|
||||||
|
if (!pmac_i2c_match_adapter(dev, adapter))
|
||||||
|
continue;
|
||||||
|
addr = pmac_i2c_get_dev_addr(dev);
|
||||||
|
if (loc == NULL || addr == 0)
|
||||||
continue;
|
continue;
|
||||||
/* real lm75 */
|
/* real lm75 */
|
||||||
if (device_is_compatible(dev, "lm75"))
|
if (device_is_compatible(dev, "lm75"))
|
||||||
wf_lm75_create(adapter, *reg, 0, loc);
|
wf_lm75_create(adapter, addr, 0, loc);
|
||||||
/* ds1775 (compatible, better resolution */
|
/* ds1775 (compatible, better resolution */
|
||||||
else if (device_is_compatible(dev, "ds1775"))
|
else if (device_is_compatible(dev, "ds1775"))
|
||||||
wf_lm75_create(adapter, *reg, 1, loc);
|
wf_lm75_create(adapter, addr, 1, loc);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -206,6 +215,11 @@ static int wf_lm75_detach(struct i2c_client *client)
|
|||||||
|
|
||||||
static int __init wf_lm75_sensor_init(void)
|
static int __init wf_lm75_sensor_init(void)
|
||||||
{
|
{
|
||||||
|
/* Don't register on old machines that use therm_pm72 for now */
|
||||||
|
if (machine_is_compatible("PowerMac7,2") ||
|
||||||
|
machine_is_compatible("PowerMac7,3") ||
|
||||||
|
machine_is_compatible("RackMac3,1"))
|
||||||
|
return -ENODEV;
|
||||||
return i2c_add_driver(&wf_lm75_driver);
|
return i2c_add_driver(&wf_lm75_driver);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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