2
0
mirror of https://github.com/edk2-porting/linux-next.git synced 2025-01-18 02:24:21 +08:00
linux-next/arch/m68k
Mikael Pettersson c663600584 m68k: Correct the Atari ALLOWINT definition
Booting a 3.2, 3.3, or 3.4-rc4 kernel on an Atari using the
`nfeth' ethernet device triggers a WARN_ONCE() in generic irq
handling code on the first irq for that device:

WARNING: at kernel/irq/handle.c:146 handle_irq_event_percpu+0x134/0x142()
irq 3 handler nfeth_interrupt+0x0/0x194 enabled interrupts
Modules linked in:
Call Trace: [<000299b2>] warn_slowpath_common+0x48/0x6a
 [<000299c0>] warn_slowpath_common+0x56/0x6a
 [<00029a4c>] warn_slowpath_fmt+0x2a/0x32
 [<0005b34c>] handle_irq_event_percpu+0x134/0x142
 [<0005b34c>] handle_irq_event_percpu+0x134/0x142
 [<0000a584>] nfeth_interrupt+0x0/0x194
 [<001ba0a8>] schedule_preempt_disabled+0x0/0xc
 [<0005b37a>] handle_irq_event+0x20/0x2c
 [<0005add4>] generic_handle_irq+0x2c/0x3a
 [<00002ab6>] do_IRQ+0x20/0x32
 [<0000289e>] auto_irqhandler_fixup+0x4/0x6
 [<00003144>] cpu_idle+0x22/0x2e
 [<001b8a78>] printk+0x0/0x18
 [<0024d112>] start_kernel+0x37a/0x386
 [<0003021d>] __do_proc_dointvec+0xb1/0x366
 [<0003021d>] __do_proc_dointvec+0xb1/0x366
 [<0024c31e>] _sinittext+0x31e/0x9c0

After invoking the irq's handler the kernel sees !irqs_disabled()
and concludes that the handler erroneously enabled interrupts.

However, debugging shows that !irqs_disabled() is true even before
the handler is invoked, which indicates a problem in the platform
code rather than the specific driver.

The warning does not occur in 3.1 or older kernels.

It turns out that the ALLOWINT definition for Atari is incorrect.

The Atari definition of ALLOWINT is ~0x400, the stated purpose of
that is to avoid taking HSYNC interrupts.  irqs_disabled() returns
true if the 3-bit ipl & 4 is non-zero.  The nfeth interrupt runs at
ipl 3 (it's autovector 3), but 3 & 4 is zero so irqs_disabled() is
false, and the warning above is generated.

When interrupts are explicitly disabled, ipl is set to 7.  When they
are enabled, ipl is masked with ALLOWINT.  On Atari this will result
in ipl = 3, which blocks interrupts at ipl 3 and below.  So how come
nfeth interrupts at ipl 3 are received at all?  That's because ipl
is reset to 2 by Atari-specific code in default_idle(), again with
the stated purpose of blocking HSYNC interrupts.  This discrepancy
means that ipl 3 can remain blocked for longer than intended.

Both default_idle() and falcon_hblhandler() identify HSYNC with
ipl 2, and the "Atari ST/.../F030 Hardware Register Listing" agrees,
but ALLOWINT is defined as if HSYNC was ipl 3.

[As an experiment I modified default_idle() to reset ipl to 3, and
as expected that resulted in all nfeth interrupts being blocked.]

The fix is simple: define ALLOWINT as ~0x500 instead.  This makes
arch_local_irq_enable() consistent with default_idle(), and prevents
the !irqs_disabled() problems for ipl 3 interrupts.

Tested on Atari running in an Aranym VM.

Signed-off-by: Mikael Pettersson <mikpe@it.uu.se>
Tested-by: Michael Schmitz <schmitzmic@googlemail.com> (on Falcon/CT60)
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
2012-04-22 20:16:50 +02:00
..
amiga m68k/amiga: Use arch_initcall() for registering platform devices 2012-04-22 20:16:48 +02:00
apollo Disintegrate asm/system.h for M68K 2012-03-28 18:30:02 +01:00
atari m68k/atari: Change VME irq numbers from unsigned long to unsigned int 2012-04-22 20:16:49 +02:00
bvme6000 Disintegrate asm/system.h for M68K 2012-03-28 18:30:02 +01:00
configs m68knommu: make sure 2nd FEC eth interface pins are enabled on 5275 ColdFire 2012-04-17 17:06:34 +10:00
emu TTY: remove re-assignments to tty_driver members 2012-03-08 11:37:58 -08:00
fpsp040 Fix common misspellings 2011-03-31 11:26:23 -03:00
hp300 Disintegrate asm/system.h for M68K 2012-03-28 18:30:02 +01:00
ifpsp060 Fix common misspellings 2011-03-31 11:26:23 -03:00
include/asm m68k: Correct the Atari ALLOWINT definition 2012-04-22 20:16:50 +02:00
kernel Disintegrate asm/system.h for M68K 2012-03-28 18:30:02 +01:00
lib m68k: modify user space access functions to support ColdFire CPUs 2011-12-30 10:20:21 +10:00
mac m68k/mac: Add missing platform check before registering platform devices 2012-04-01 22:57:51 +02:00
math-emu m68k/math-emu: Remove unnecessary code 2011-07-30 21:21:40 +02:00
mm m68k/mm: Port OOM changes to do_page_fault() 2012-04-22 20:16:49 +02:00
mvme16x Disintegrate asm/system.h for M68K 2012-03-28 18:30:02 +01:00
mvme147 Disintegrate asm/system.h for M68K 2012-03-28 18:30:02 +01:00
platform m68knommu: make sure 2nd FEC eth interface pins are enabled on 5275 ColdFire 2012-04-17 17:06:34 +10:00
q40 m68k/q40: Add missing platform check before registering platform devices 2012-04-01 22:57:53 +02:00
sun3 Disintegrate asm/system.h for M68K 2012-03-28 18:30:02 +01:00
sun3x Disintegrate asm/system.h for M68K 2012-03-28 18:30:02 +01:00
tools/amiga Convert files to UTF-8 and some cleanups 2007-10-19 23:21:04 +02:00
install.sh kbuild: use INSTALLKERNEL to select customized installkernel script 2009-09-20 12:18:14 +02:00
Kconfig m68k: make support for FPU hardware configurable 2012-03-05 09:43:05 +10:00
Kconfig.bus m68k: Revive lost DIO bus config option 2011-11-08 22:35:46 +01:00
Kconfig.cpu m68k: allow ColdFire 547x and 548x CPUs to be built with MMU enabled 2011-12-30 10:20:50 +10:00
Kconfig.debug Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/geert/linux-m68k 2012-01-06 18:28:12 -08:00
Kconfig.devices m68k/mac: Make CONFIG_HEARTBEAT unavailable on Mac 2012-01-04 22:23:50 +01:00
Kconfig.machine m68k/Kconfig: Separate classic m68k and coldfire early 2011-12-30 10:20:49 +10:00
Makefile m68k: merge mmu and non-mmu arch Makefiles 2011-10-18 14:22:25 +10:00