]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
m68k: mac: Fix reboot hang on Mac IIci
authorFinn Thain <fthain@linux-m68k.org>
Sat, 4 May 2024 04:31:12 +0000 (14:31 +1000)
committerGeert Uytterhoeven <geert@linux-m68k.org>
Wed, 8 May 2024 15:43:22 +0000 (17:43 +0200)
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>
arch/m68k/mac/misc.c

index 4c8f8cbfa05f3404e7b81202c74f5def142c6fa3..e7f0f72c1b36efa35066eef54740213930725b3b 100644 (file)
@@ -453,30 +453,18 @@ void mac_poweroff(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
-       } else if (macintosh_config->adb_type == MAC_ADB_EGRET ||
-                  macintosh_config->adb_type == MAC_ADB_CUDA) {
+       if (macintosh_config->adb_type == MAC_ADB_EGRET ||
+           macintosh_config->adb_type == MAC_ADB_CUDA) {
                cuda_restart();
+       } else
 #endif
 #ifdef CONFIG_ADB_PMU
-       } else if (macintosh_config->adb_type == MAC_ADB_PB2) {
+       if (macintosh_config->adb_type == MAC_ADB_PB2) {
                pmu_restart();
+       } else
 #endif
-       } else if (CPU_IS_030) {
-
+       if (CPU_IS_030) {
                /* 030-specific reset routine.  The idea is general, but the
                 * specific registers to reset are '030-specific.  Until I
                 * have a non-030 machine, I can't test anything else.
@@ -524,6 +512,18 @@ void mac_reset(void)
                    "jmp %/a0@\n\t" /* jump to the reset vector */
                    ".chip 68k"
                    : : "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 */