m68k: mac: Fix reboot hang on Mac IIci
[ Upstream commit 265a3b322df9a973ff1fc63da70af456ab6ae1d6 ] Calling mac_reset() on a Mac IIci does reset the system, but what follows is a POST failure that requires a manual reset to resolve. Avoid that by using the 68030 asm implementation instead of the C implementation. Apparently the SE/30 has a similar problem as it has used the asm implementation since before git. This patch extends that solution to other systems with a similar ROM. After this patch, the only systems still using the C implementation are 68040 systems where adb_type is either MAC_ADB_IOP or MAC_ADB_II. This implies a 1 MiB Quadra ROM. This now includes the Quadra 900/950, which previously fell through to the "should never get here" catch-all. Reported-and-tested-by: Stan Johnson <userm57@yahoo.com> Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") Signed-off-by: Finn Thain <fthain@linux-m68k.org> Reviewed-by: Geert Uytterhoeven <geert@linux-m68k.org> Link: https://lore.kernel.org/r/480ebd1249d229c6dc1f3f1c6d599b8505483fd8.1714797072.git.fthain@linux-m68k.org Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
8cae8705eb
commit
8e235c317e
1 changed files with 18 additions and 18 deletions
|
@ -452,30 +452,18 @@ void mac_poweroff(void)
|
||||||
|
|
||||||
void mac_reset(void)
|
void mac_reset(void)
|
||||||
{
|
{
|
||||||
if (macintosh_config->adb_type == MAC_ADB_II &&
|
|
||||||
macintosh_config->ident != MAC_MODEL_SE30) {
|
|
||||||
/* need ROMBASE in booter */
|
|
||||||
/* indeed, plus need to MAP THE ROM !! */
|
|
||||||
|
|
||||||
if (mac_bi_data.rombase == 0)
|
|
||||||
mac_bi_data.rombase = 0x40800000;
|
|
||||||
|
|
||||||
/* works on some */
|
|
||||||
rom_reset = (void *) (mac_bi_data.rombase + 0xa);
|
|
||||||
|
|
||||||
local_irq_disable();
|
|
||||||
rom_reset();
|
|
||||||
#ifdef CONFIG_ADB_CUDA
|
#ifdef CONFIG_ADB_CUDA
|
||||||
} else if (macintosh_config->adb_type == MAC_ADB_EGRET ||
|
if (macintosh_config->adb_type == MAC_ADB_EGRET ||
|
||||||
macintosh_config->adb_type == MAC_ADB_CUDA) {
|
macintosh_config->adb_type == MAC_ADB_CUDA) {
|
||||||
cuda_restart();
|
cuda_restart();
|
||||||
|
} else
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_ADB_PMU
|
#ifdef CONFIG_ADB_PMU
|
||||||
} else if (macintosh_config->adb_type == MAC_ADB_PB2) {
|
if (macintosh_config->adb_type == MAC_ADB_PB2) {
|
||||||
pmu_restart();
|
pmu_restart();
|
||||||
|
} else
|
||||||
#endif
|
#endif
|
||||||
} else if (CPU_IS_030) {
|
if (CPU_IS_030) {
|
||||||
|
|
||||||
/* 030-specific reset routine. The idea is general, but the
|
/* 030-specific reset routine. The idea is general, but the
|
||||||
* specific registers to reset are '030-specific. Until I
|
* specific registers to reset are '030-specific. Until I
|
||||||
* have a non-030 machine, I can't test anything else.
|
* have a non-030 machine, I can't test anything else.
|
||||||
|
@ -523,6 +511,18 @@ void mac_reset(void)
|
||||||
"jmp %/a0@\n\t" /* jump to the reset vector */
|
"jmp %/a0@\n\t" /* jump to the reset vector */
|
||||||
".chip 68k"
|
".chip 68k"
|
||||||
: : "r" (offset), "a" (rombase) : "a0");
|
: : "r" (offset), "a" (rombase) : "a0");
|
||||||
|
} else {
|
||||||
|
/* need ROMBASE in booter */
|
||||||
|
/* indeed, plus need to MAP THE ROM !! */
|
||||||
|
|
||||||
|
if (mac_bi_data.rombase == 0)
|
||||||
|
mac_bi_data.rombase = 0x40800000;
|
||||||
|
|
||||||
|
/* works on some */
|
||||||
|
rom_reset = (void *)(mac_bi_data.rombase + 0xa);
|
||||||
|
|
||||||
|
local_irq_disable();
|
||||||
|
rom_reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* should never get here */
|
/* should never get here */
|
||||||
|
|
Loading…
Reference in a new issue