linux/arch/sparc/kernel
David S. Miller d0cac39e4e sparc64: Fix lost interrupts on sun4u.
Based upon a report by Meelis Roos.

Sparc64 SBUS and PCI controllers use a combination of IMAP and ICLR
registers to manage device interrupts.

The IMAP register contains the "valid" enable bit as well as CPU
targetting information.  Whereas the ICLR register is written with
zero at the end of handling an interrupt to reset the state machine
for that interrupt to IDLE so it can be sent again.

For PCI slot and SBUS slot devices we can have multiple interrupts
sharing the same IMAP register.  There are individual ICLR registers
but only one IMAP register for managing those.

We represent each shared case with individual virtual IRQs so the
generic IRQ layer thinks there is only one user of the IRQ instance.

In such shared IMAP cases this is wrong, so if there are multiple
active users then a free_irq() call will prematurely turn off the
interrupt by clearing the Valid bit in the IMAP register even though
there are other active users.

Fix this by simply doing nothing in sun4u_disable_irq() and checking
IRQF_DISABLED during IRQ dispatch.

This situation doesn't exist in the hypervisor sun4v cases, so I left
those alone.

Tested-by: Meelis Roos <mroos@linux.ee>
Signed-off-by: David S. Miller <davem@davemloft.net>
2009-03-04 14:43:47 -08:00
..
.gitignore sparc: gitignore a few files 2008-12-04 09:17:15 -08:00
apc.c sparc: correct section of apc_no_idle 2008-10-22 21:53:43 -07:00
asm-offsets.c sparc,sparc64: unify asm-offsets.c 2008-12-04 09:17:12 -08:00
audit.c sparc,sparc64: unify kernel/ 2008-12-04 09:17:21 -08:00
auxio_32.c sparc: move EXPORT_SYMBOL to the symbols definition 2009-01-08 16:58:05 -08:00
auxio_64.c sparc64: move EXPORT_SYMBOL to the symbols definition 2009-01-08 16:58:20 -08:00
central.c sparc64: Initialize FHC/CLOCK LED platform_device 'id' field correctly. 2009-01-19 13:27:15 -08:00
cherrs.S sparc,sparc64: unify kernel/ 2008-12-04 09:17:21 -08:00
chmc.c sparc64: Fix crashes in jbusmc_print_dimm() 2009-02-11 00:54:07 -08:00
compat_audit.c sparc,sparc64: unify kernel/ 2008-12-04 09:17:21 -08:00
cpu.c sparc: Probe PMU type and record in sparc_pmu_type. 2009-01-28 17:27:14 -08:00
devices.c sparc: drop CONFIG_SUN_AUXIO 2008-12-04 13:26:31 -08:00
dma.c sparc32: Implement more generic dma_*() interfaces. 2008-08-29 02:13:14 -07:00
dma.h sparc32: Implement more generic dma_*() interfaces. 2008-08-29 02:13:14 -07:00
ds.c sparc64: Use unsigned long long for u64. 2009-01-06 13:19:28 -08:00
dtlb_miss.S sparc,sparc64: unify kernel/ 2008-12-04 09:17:21 -08:00
dtlb_prot.S sparc,sparc64: unify kernel/ 2008-12-04 09:17:21 -08:00
ebus.c sparc,sparc64: unify kernel/ 2008-12-04 09:17:21 -08:00
entry.h sparc: fix sparse warnings in irq_32.c 2008-12-08 01:08:24 -08:00
entry.S [CVE-2009-0029] Remove __attribute__((weak)) from sys_pipe/sys_pipe2 2009-01-14 14:15:15 +01:00
etrap_32.S sparc: prepare kernel/ for unification 2008-12-04 09:17:20 -08:00
etrap_64.S sparc,sparc64: unify kernel/ 2008-12-04 09:17:21 -08:00
fpu_traps.S sparc,sparc64: unify kernel/ 2008-12-04 09:17:21 -08:00
ftrace.c sparc,sparc64: unify kernel/ 2008-12-04 09:17:21 -08:00
getsetcc.S sparc,sparc64: unify kernel/ 2008-12-04 09:17:21 -08:00
head_32.S sparc: unify sections.h 2008-12-27 00:35:12 -08:00
head_64.S sparc64: Kill .fixup section bloat. 2009-02-08 22:00:55 -08:00
helpers.S sparc,sparc64: unify kernel/ 2008-12-04 09:17:21 -08:00
hvapi.c sparc,sparc64: unify kernel/ 2008-12-04 09:17:21 -08:00
hvcalls.S sparc,sparc64: unify kernel/ 2008-12-04 09:17:21 -08:00
hvtramp.S sparc,sparc64: unify kernel/ 2008-12-04 09:17:21 -08:00
idprom.c sparc: move EXPORT_SYMBOL to the symbols definition 2009-01-08 16:58:05 -08:00
init_task.c take init_fs to saner place 2008-12-31 18:07:42 -05:00
iommu_common.h sparc,sparc64: unify kernel/ 2008-12-04 09:17:21 -08:00
iommu.c sparc64: Use unsigned long long for u64. 2009-01-06 13:19:28 -08:00
ioport.c sparc: move EXPORT_SYMBOL to the symbols definition 2009-01-08 16:58:05 -08:00
irq_32.c sparc: move EXPORT_SYMBOL to the symbols definition 2009-01-08 16:58:05 -08:00
irq_64.c sparc64: Fix lost interrupts on sun4u. 2009-03-04 14:43:47 -08:00
irq.h sparc32: Kill clear_profile_irq btfixup entry. 2008-09-19 21:17:59 -07:00
itlb_miss.S sparc,sparc64: unify kernel/ 2008-12-04 09:17:21 -08:00
ivec.S sparc,sparc64: unify kernel/ 2008-12-04 09:17:21 -08:00
kernel.h sparc: Probe PMU type and record in sparc_pmu_type. 2009-01-28 17:27:14 -08:00
kgdb_32.c sparc: add '32' suffix to reg_window, sigcontext, __siginfo_t 2009-01-02 19:32:59 -08:00
kgdb_64.c sparc,sparc64: unify kernel/ 2008-12-04 09:17:21 -08:00
kprobes.c trivial: fix then -> than typos in comments and documentation 2009-01-06 11:28:06 +01:00
kstack.h sparc,sparc64: unify kernel/ 2008-12-04 09:17:21 -08:00
ktlb.S sparc,sparc64: unify kernel/ 2008-12-04 09:17:21 -08:00
ldc.c sparc: make proces_ver_nack a bit more readable 2009-01-06 10:23:22 -08:00
led.c sparc: switch /proc/led to seq_file 2008-06-03 15:21:21 -07:00
Makefile sparc64: Implement NMI watchdog on capable cpus. 2009-01-30 00:03:53 -08:00
mdesc.c sparc64: Use unsigned long long for u64. 2009-01-06 13:19:28 -08:00
misctrap.S sparc,sparc64: unify kernel/ 2008-12-04 09:17:21 -08:00
module.c sparc: unify module.c 2008-12-26 15:38:17 -08:00
muldiv.c sparc: add '32' suffix to reg_window, sigcontext, __siginfo_t 2009-01-02 19:32:59 -08:00
nmi.c sparc64: Call dump_stack() in die_nmi(). 2009-02-04 13:48:11 -08:00
of_device_32.c sparc: prepare kernel/ for unification 2008-12-04 09:17:20 -08:00
of_device_64.c sparc64: Use unsigned long long for u64. 2009-01-06 13:19:28 -08:00
pci_common.c sparc64: Use unsigned long long for u64. 2009-01-06 13:19:28 -08:00
pci_fire.c sparc,sparc64: unify kernel/ 2008-12-04 09:17:21 -08:00
pci_impl.h sparc,sparc64: unify kernel/ 2008-12-04 09:17:21 -08:00
pci_msi.c sparc64: Use unsigned long long for u64. 2009-01-06 13:19:28 -08:00
pci_psycho.c sparc: Kill bogus comment about IRQF_SHARED in pci_psycho.c 2009-01-02 19:12:46 -08:00
pci_sabre.c sparc,sparc64: unify kernel/ 2008-12-04 09:17:21 -08:00
pci_schizo.c sparc64: Use unsigned long long for u64. 2009-01-06 13:19:28 -08:00
pci_sun4v_asm.S sparc,sparc64: unify kernel/ 2008-12-04 09:17:21 -08:00
pci_sun4v.c sparc64: Use unsigned long long for u64. 2009-01-06 13:19:28 -08:00
pci_sun4v.h sparc,sparc64: unify kernel/ 2008-12-04 09:17:21 -08:00
pci.c sparc64: move EXPORT_SYMBOL to the symbols definition 2009-01-08 16:58:20 -08:00
pcic.c sparc: move EXPORT_SYMBOL to the symbols definition 2009-01-08 16:58:05 -08:00
pcr.c sparc64: Don't hook up pcr_ops on spitfire chips. 2009-02-05 23:59:04 -08:00
pmc.c sparc: fix trivial style issues in kernel/pmc.c 2008-12-08 01:02:55 -08:00
power.c sparc64: Use unsigned long long for u64. 2009-01-06 13:19:28 -08:00
process_32.c sparc: move EXPORT_SYMBOL to the symbols definition 2009-01-08 16:58:05 -08:00
process_64.c sparc64: On non-Niagara, need to touch NMI watchdog in NOHZ mode. 2009-02-02 21:57:48 -08:00
prom_32.c sparc: Restore irq_trans_init() call in prom_create_node(). 2008-12-07 00:46:33 -08:00
prom_64.c sparc: Move of_console_{device,path,options} info prom_common.c 2008-12-05 18:17:08 -08:00
prom_common.c sparc: Clean arch-specific code in prom_common.c 2009-01-05 00:07:18 -08:00
prom_irqtrans.c sparc64: Use unsigned long long for u64. 2009-01-06 13:19:28 -08:00
prom.h sparc: Restore irq_trans_init() call in prom_create_node(). 2008-12-07 00:46:33 -08:00
psycho_common.c sparc64: fix warnings in psycho_common after ull conversion 2009-01-08 11:37:19 -08:00
psycho_common.h sparc,sparc64: unify kernel/ 2008-12-04 09:17:21 -08:00
ptrace_32.c sparc: prepare kernel/ for unification 2008-12-04 09:17:20 -08:00
ptrace_64.c sparc,sparc64: unify kernel/ 2008-12-04 09:17:21 -08:00
reboot.c sparc,sparc64: unify kernel/ 2008-12-04 09:17:21 -08:00
rtrap_32.S sparc: prepare kernel/ for unification 2008-12-04 09:17:20 -08:00
rtrap_64.S sparc,sparc64: unify kernel/ 2008-12-04 09:17:21 -08:00
sbus.c sparc64: move EXPORT_SYMBOL to the symbols definition 2009-01-08 16:58:20 -08:00
setup_32.c sparc: move EXPORT_SYMBOL to the symbols definition 2009-01-08 16:58:05 -08:00
setup_64.c sparc: Probe PMU type and record in sparc_pmu_type. 2009-01-28 17:27:14 -08:00
signal_32.c sparc: add '32' suffix to reg_window, sigcontext, __siginfo_t 2009-01-02 19:32:59 -08:00
signal_64.c sparc,sparc64: unify kernel/ 2008-12-04 09:17:21 -08:00
signal32.c sparc,sparc64: unify kernel/ 2008-12-04 09:17:21 -08:00
smp_32.c Merge branch 'cpus4096-for-linus-2' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip 2009-01-02 11:44:09 -08:00
smp_64.c sparc64: Use unsigned long long for u64. 2009-01-06 13:19:28 -08:00
sparc_ksyms_32.c sparc: Eliminate PROMLIB_INTERNAL as it does nothing 2009-01-08 16:59:01 -08:00
sparc_ksyms_64.c sparc64: Fix UP build failure. 2009-01-13 17:38:24 -08:00
spiterrs.S sparc,sparc64: unify kernel/ 2008-12-04 09:17:21 -08:00
sstate.c sparc,sparc64: unify kernel/ 2008-12-04 09:17:21 -08:00
stacktrace.c sparc,sparc64: unify kernel/ 2008-12-04 09:17:21 -08:00
starfire.c sparc,sparc64: unify kernel/ 2008-12-04 09:17:21 -08:00
sun4c_irq.c sparc: Add missing of_node_put 2008-12-04 09:17:22 -08:00
sun4d_irq.c sparc: fix sparse warnings in irq_32.c 2008-12-08 01:08:24 -08:00
sun4d_smp.c sparc: Fix sun4d_irq.c build. 2009-01-08 16:47:17 -08:00
sun4m_irq.c sparc: Add missing of_node_put 2008-12-04 09:17:22 -08:00
sun4m_smp.c generic swap(): sparc: rename swap() to swap_ulong() 2009-01-08 08:31:14 -08:00
sun4v_ivec.S sparc,sparc64: unify kernel/ 2008-12-04 09:17:21 -08:00
sun4v_tlb_miss.S sparc,sparc64: unify kernel/ 2008-12-04 09:17:21 -08:00
sys_sparc_32.c sparc: prepare kernel/ for unification 2008-12-04 09:17:20 -08:00
sys_sparc_64.c sparc64: Annotate sparc64 specific syscalls with SYSCALL_DEFINEx() 2009-01-19 21:11:27 -08:00
sys_sparc32.c sparc,sparc64: unify kernel/ 2008-12-04 09:17:21 -08:00
sys32.S sparc,sparc64: unify kernel/ 2008-12-04 09:17:21 -08:00
syscalls.S sparc64: Annotate sparc64 specific syscalls with SYSCALL_DEFINEx() 2009-01-19 21:11:27 -08:00
sysfs.c sparc: fix hardirq.h removal fallout 2008-12-26 15:33:07 -08:00
systbls_32.S [CVE-2009-0029] Remove __attribute__((weak)) from sys_pipe/sys_pipe2 2009-01-14 14:15:15 +01:00
systbls_64.S sparc64: Annotate sparc64 specific syscalls with SYSCALL_DEFINEx() 2009-01-19 21:11:27 -08:00
systbls.h sparc64: Annotate sparc64 specific syscalls with SYSCALL_DEFINEx() 2009-01-19 21:11:27 -08:00
tadpole.c Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
tick14.c sparc32: Delete claim_ticker14(). 2008-09-19 21:18:01 -07:00
time_32.c sparc: move EXPORT_SYMBOL to the symbols definition 2009-01-08 16:58:05 -08:00
time_64.c sparc64: move EXPORT_SYMBOL to the symbols definition 2009-01-08 16:58:20 -08:00
trampoline_32.S sparc: prepare kernel/ for unification 2008-12-04 09:17:20 -08:00
trampoline_64.S sparc,sparc64: unify kernel/ 2008-12-04 09:17:21 -08:00
traps_32.c sparc: move EXPORT_SYMBOL to the symbols definition 2009-01-08 16:58:05 -08:00
traps_64.c sparc64: Fix DAX handling via userspace access from kernel. 2009-01-19 22:44:04 -08:00
tsb.S sparc,sparc64: unify kernel/ 2008-12-04 09:17:21 -08:00
ttable.S sparc64: Move generic PCR support code to seperate file. 2009-01-28 17:13:57 -08:00
una_asm_32.S sparc: prepare kernel/ for unification 2008-12-04 09:17:20 -08:00
una_asm_64.S sparc,sparc64: unify kernel/ 2008-12-04 09:17:21 -08:00
unaligned_32.c sparc: add '32' suffix to reg_window, sigcontext, __siginfo_t 2009-01-02 19:32:59 -08:00
unaligned_64.c sparc: Most unaligned_64.c tweaks for branch tracer warnings. 2009-01-08 16:52:36 -08:00
us2e_cpufreq.c sparc,sparc64: unify kernel/ 2008-12-04 09:17:21 -08:00
us3_cpufreq.c sparc,sparc64: unify kernel/ 2008-12-04 09:17:21 -08:00
utrap.S sparc,sparc64: unify kernel/ 2008-12-04 09:17:21 -08:00
vio.c sparc64: Use unsigned long long for u64. 2009-01-06 13:19:28 -08:00
viohs.c sparc64: refactor code in viohs.c 2009-01-06 12:46:46 -08:00
visemul.c sparc,sparc64: unify kernel/ 2008-12-04 09:17:21 -08:00
vmlinux.lds.S sparc: unify sections.h 2008-12-27 00:35:12 -08:00
windows.c sparc: add '32' suffix to reg_window, sigcontext, __siginfo_t 2009-01-02 19:32:59 -08:00
winfixup.S sparc,sparc64: unify kernel/ 2008-12-04 09:17:21 -08:00
wof.S sparc/kernel/: possible cleanups 2008-07-17 21:37:46 -07:00
wuf.S sparc/kernel/: possible cleanups 2008-07-17 21:37:46 -07:00