--- linux-2.0.29/arch/m68k/console/fbcon.c.291197	Tue Dec  2 04:46:18 1997
+++ linux-2.0.29/arch/m68k/console/fbcon.c	Tue Dec  2 06:27:05 1997
@@ -44,6 +44,9 @@
 #include <linux/sched.h>
 #include <linux/fs.h>
 #include <linux/kernel.h>
+#ifdef CONFIG_MAC
+#include <linux/delay.h>
+#endif
 #include <linux/tty.h>
 #include <linux/console.h>
 #include <linux/string.h>
@@ -187,21 +190,15 @@
 /* ++Geert: Sorry, no hardware cursor support at the moment;
    use Atari alike software cursor */
 
-/* Michael: Mac needs timer-based cursor, possibly */
-#define MAC_VBL_CURSOR
-
 static int cursor_drawn = 0;
 
 #define CURSOR_DRAW_DELAY           (2)
 
 /* # VBL ints between cursor state changes */
-#define AMIGA_CURSOR_BLINK_RATE   (20)
-#define ATARI_CURSOR_BLINK_RATE   (42)
-#ifdef MAC_VBL_CURSOR
-#define MAC_CURSOR_BLINK_RATE     (32)
-#else
-#define MAC_CURSOR_BLINK_RATE     (2)
-#endif
+#define AMIGA_CURSOR_BLINK_RATE    (20)
+#define ATARI_CURSOR_BLINK_RATE    (42)
+#define MAC_CURSOR_VBL_BLINK_RATE  (32)
+#define MAC_CURSOR_TIMER_BLINK_RATE (2)
 
 static int vbl_cursor_cnt = 0;
 static int cursor_on = 0;
@@ -562,15 +559,26 @@
 
 
 #ifdef CONFIG_MAC
-extern int console_loglevel;
+/*
+ * On the Macintoy, there may or may not be a working VBL int. We need to probe
+ */
+static int vbl_detected = 0;
 
+static void mac_vbl_detect(int irq, void *dummy, struct pt_regs *fp)
+{
+	vbl_detected++;
+}
+
+/*
+ * Just in case no VBL int. can be detected, we need a timer-based cursor :-(.
+ */
 static void mac_cursor_blink(unsigned long);
 static struct timer_list mac_cursor_timer = { NULL, NULL, 0, 0, mac_cursor_blink };
 
 static void mac_cursor_blink(unsigned long xxx)
 {
 	fbcon_vbl_handler(0, NULL, NULL);
-	mac_cursor_timer.expires = jiffies + HZ/4;
+	mac_cursor_timer.expires = jiffies + HZ/6;
 	mac_cursor_timer.data = 0;
 	mac_cursor_timer.next = NULL;
 	add_timer(&mac_cursor_timer);
@@ -602,23 +610,38 @@
 #endif /* CONFIG_ATARI */
 #ifdef CONFIG_MAC
    if (MACH_IS_MAC) {
-      cursor_blink_rate = MAC_CURSOR_BLINK_RATE;
+      int ct = 0;
       /*
-       * Won't work yet ... 
+       * Probe for VBL: set temp. handler ...
        */
-#ifdef MAC_VBL_CURSOR
-      irqres = request_irq(IRQ_MAC_VBL, fbcon_vbl_handler, 0,
+      irqres = request_irq(IRQ_MAC_VBL, mac_vbl_detect, 0,
                            "console/cursor", fbcon_vbl_handler);
-
-#else
       /*
-       * timer based cursor init
+       * ... and spin for 20 ms ...
        */
-      mac_cursor_timer.expires = jiffies + HZ/2;
-      mac_cursor_timer.data = 0;
-      mac_cursor_timer.next = NULL;
-      add_timer(&mac_cursor_timer);
-#endif
+      while (!vbl_detected && ++ct<1000)
+         udelay(20);
+
+      if(ct==1000)
+         printk("fbcon_startup: No VBL detected, using timer based cursor.\n");
+
+      if (vbl_detected) {
+	 /*
+	  * interrupt based cursor ok
+	  */
+         cursor_blink_rate = MAC_CURSOR_VBL_BLINK_RATE;
+         irqres = request_irq(IRQ_MAC_VBL, fbcon_vbl_handler, 0,
+                              "console/cursor", fbcon_vbl_handler);
+      } else {
+         /*
+          * VBL not detected: use timer based cursor
+          */
+         cursor_blink_rate = MAC_CURSOR_TIMER_BLINK_RATE;
+         mac_cursor_timer.expires = jiffies + HZ/2;
+         mac_cursor_timer.data = 0;
+         mac_cursor_timer.next = NULL;
+         add_timer(&mac_cursor_timer);
+      }
    }
 #endif /* CONFIG_MAC */
 
--- linux-2.0.29/arch/m68k/mac/macfb.c.291197	Tue Dec  2 04:20:57 1997
+++ linux-2.0.29/arch/m68k/mac/macfb.c	Tue Dec  2 04:20:57 1997
@@ -131,7 +131,7 @@
 		fix->smem_len=PAGE_ALIGN(mac_videosize);
 	} else {
 		/*
-		 * Needs fixes in mm/filemap.c (bogus)
+		 * Needs fixes in fbmem.c
 		 */
 		fix->smem_start=mac_videobase;
 		if (console_loglevel >= 7) 
--- linux-2.0.29/arch/m68k/mac/mackeyb.c.291197	Thu Dec  4 05:10:54 1997
+++ linux-2.0.29/arch/m68k/mac/mackeyb.c	Thu Dec  4 07:11:47 1997
@@ -67,7 +67,7 @@
 	0xf200,	0xf310,	0xf200,	0xf30c,	0xf200,	0xf30a,	0xf200,	0xf208,
 	0xf200,	0xf200,	0xf200,	0xf30d,	0xf30e,	0xf200,	0xf30b,	0xf200,
 	0xf200,	0xf200,	0xf300,	0xf301,	0xf302,	0xf303,	0xf304,	0xf305,
-	0xf306,	0xf307,	0xf200,	0xf308,	0xf309,	0xf200,	0xf200,	0xf200,
+	0xf306,	0xf307,	0xfb61,	0xf308,	0xf309,	0xf200,	0xf200,	0xf200,
 	0xf104,	0xf105,	0xf106,	0xf102,	0xf107,	0xf108,	0xf200,	0xf10a,
 	0xf200,	0xf10c,	0xf200,	0xf209,	0xf200,	0xf109,	0xf200,	0xf10b,
 	0xf200,	0xf11d,	0xf115,	0xf114,	0xf118,	0xf116,	0xf103,	0xf117,
@@ -86,7 +86,7 @@
 	0xf200,	0xf310,	0xf200,	0xf30c,	0xf200,	0xf30a,	0xf200,	0xf208,
 	0xf200,	0xf200,	0xf200,	0xf30d,	0xf30e,	0xf200,	0xf30b,	0xf200,
 	0xf200,	0xf200,	0xf300,	0xf301,	0xf302,	0xf303,	0xf304,	0xf305,
-	0xf306,	0xf307,	0xf200,	0xf308,	0xf309,	0xf200,	0xf200,	0xf200,
+	0xf306,	0xf307,	0xfb41,	0xf308,	0xf309,	0xf200,	0xf200,	0xf200,
 	0xf10e,	0xf10f,	0xf110,	0xf10c,	0xf111,	0xf112,	0xf200,	0xf10a,
 	0xf200,	0xf10c,	0xf200,	0xf203,	0xf200,	0xf113,	0xf200,	0xf10b,
 	0xf200,	0xf11d,	0xf115,	0xf114,	0xf20b,	0xf116,	0xf10d,	0xf117,
@@ -105,7 +105,7 @@
 	0xf200,	0xf310,	0xf200,	0xf30c,	0xf200,	0xf30a,	0xf200,	0xf208,
 	0xf200,	0xf200,	0xf200,	0xf30d,	0xf30e,	0xf200,	0xf30b,	0xf200,
 	0xf200,	0xf200,	0xf90a,	0xf90b,	0xf90c,	0xf90d,	0xf90e,	0xf90f,
-	0xf910,	0xf911,	0xf200,	0xf912,	0xf913,	0xf200,	0xf200,	0xf200,
+	0xf910,	0xf911,	0xf914,	0xf912,	0xf913,	0xf200,	0xf200,	0xf200,
 	0xf510,	0xf511,	0xf512,	0xf50e,	0xf513,	0xf514,	0xf200,	0xf516,
 	0xf200,	0xf10c,	0xf200,	0xf202,	0xf200,	0xf515,	0xf200,	0xf517,
 	0xf200,	0xf11d,	0xf115,	0xf114,	0xf118,	0xf116,	0xf50f,	0xf117,
@@ -124,7 +124,7 @@
 	0xf200,	0xf310,	0xf200,	0xf30c,	0xf200,	0xf30a,	0xf200,	0xf208,
 	0xf200,	0xf200,	0xf200,	0xf30d,	0xf30e,	0xf200,	0xf30b,	0xf200,
 	0xf200,	0xf200,	0xf300,	0xf301,	0xf302,	0xf303,	0xf304,	0xf305,
-	0xf306,	0xf307,	0xf200,	0xf308,	0xf309,	0xf200,	0xf200,	0xf200,
+	0xf306,	0xf307,	0xf001,	0xf308,	0xf309,	0xf200,	0xf200,	0xf200,
 	0xf104,	0xf105,	0xf106,	0xf102,	0xf107,	0xf108,	0xf200,	0xf10a,
 	0xf200,	0xf10c,	0xf200,	0xf204,	0xf200,	0xf109,	0xf200,	0xf10b,
 	0xf200,	0xf11d,	0xf115,	0xf114,	0xf118,	0xf116,	0xf103,	0xf117,
@@ -143,7 +143,7 @@
 	0xf200,	0xf310,	0xf200,	0xf30c,	0xf200,	0xf30a,	0xf200,	0xf208,
 	0xf200,	0xf200,	0xf200,	0xf30d,	0xf30e,	0xf200,	0xf30b,	0xf200,
 	0xf200,	0xf200,	0xf300,	0xf301,	0xf302,	0xf303,	0xf304,	0xf305,
-	0xf306,	0xf307,	0xf200,	0xf308,	0xf309,	0xf200,	0xf200,	0xf200,
+	0xf306,	0xf307,	0xf001,	0xf308,	0xf309,	0xf200,	0xf200,	0xf200,
 	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,
 	0xf200,	0xf10c,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,	0xf200,
 	0xf200,	0xf11d,	0xf115,	0xf114,	0xf118,	0xf116,	0xf200,	0xf117,
@@ -162,7 +162,7 @@
 	0xf200,	0xf310,	0xf200,	0xf30c,	0xf200,	0xf30a,	0xf200,	0xf208,
 	0xf200,	0xf200,	0xf200,	0xf30d,	0xf30e,	0xf200,	0xf30b,	0xf200,
 	0xf200,	0xf200,	0xf900,	0xf901,	0xf902,	0xf903,	0xf904,	0xf905,
-	0xf906,	0xf907,	0xf200,	0xf908,	0xf909,	0xf200,	0xf200,	0xf200,
+	0xf906,	0xf907,	0xf861,	0xf908,	0xf909,	0xf200,	0xf200,	0xf200,
 	0xf504,	0xf505,	0xf506,	0xf502,	0xf507,	0xf508,	0xf200,	0xf50a,
 	0xf200,	0xf10c,	0xf200,	0xf209,	0xf200,	0xf509,	0xf200,	0xf50b,
 	0xf200,	0xf11d,	0xf115,	0xf114,	0xf118,	0xf116,	0xf503,	0xf117,
@@ -181,7 +181,7 @@
 	0xf200,	0xf310,	0xf200,	0xf30c,	0xf200,	0xf30a,	0xf200,	0xf208,
 	0xf200,	0xf200,	0xf200,	0xf30d,	0xf30e,	0xf200,	0xf30b,	0xf200,
 	0xf200,	0xf200,	0xf300,	0xf301,	0xf302,	0xf303,	0xf304,	0xf305,
-	0xf306,	0xf307,	0xf200,	0xf308,	0xf309,	0xf200,	0xf200,	0xf200,
+	0xf306,	0xf307,	0xf801,	0xf308,	0xf309,	0xf200,	0xf200,	0xf200,
 	0xf504,	0xf505,	0xf506,	0xf502,	0xf507,	0xf508,	0xf200,	0xf50a,
 	0xf200,	0xf10c,	0xf200,	0xf200,	0xf200,	0xf509,	0xf200,	0xf50b,
 	0xf200,	0xf11d,	0xf115,	0xf114,	0xf118,	0xf116,	0xf503,	0xf117,
--- linux-2.0.29/drivers/char/fbmem.c.291197	Thu Dec  4 04:56:40 1997
+++ linux-2.0.29/drivers/char/fbmem.c	Thu Dec  4 04:56:40 1997
@@ -212,7 +212,11 @@
 	fb->fb_get_fix(&fix, PROC_CONSOLE());
 	if ((vma->vm_end - vma->vm_start + vma->vm_offset) > fix.smem_len)
 		return -EINVAL;
+#if 0
 	vma->vm_offset += fix.smem_start;
+#else
+	vma->vm_offset += (fix.smem_start & PAGE_MASK);
+#endif
 	if (vma->vm_offset & ~PAGE_MASK)
 		return -ENXIO;
 	if (CPU_IS_040_OR_060) {
--- linux-2.0.29/drivers/char/keyb_m68k.c.291197	Thu Dec  4 05:03:19 1997
+++ linux-2.0.29/drivers/char/keyb_m68k.c	Thu Dec  4 05:03:19 1997
@@ -747,6 +747,7 @@
 	case 0x7b: keycode = 0x38; break; /* R-shift */
 	case 0x7c: keycode = 0x3a; break; /* R-option */
 	case 0x7d: keycode = 0x36; break; /* R-control */
+	case 0x0:  if (!raw_mode) keycode = 0x5a; break; /* A */
 	}
 
 	/*
--- linux-2.0.29/drivers/nubus/nubus.c.291197	Wed Dec  3 07:07:57 1997
+++ linux-2.0.29/drivers/nubus/nubus.c	Wed Dec  3 07:08:18 1997
@@ -356,6 +356,12 @@
 
 void nubus_probe_slot(int slot, int mode)
 {
+#define C030_DISABLE_D (0xfffffeff)
+#define C030_ENABLE_D  (0x00000100)
+#define C030_DISABLE_I (0xfffffffe)
+#define C030_ENABLE_I  (0x00000001)
+#define C030_DISABLE_A (0xfffffefe)
+#define C030_ENABLE_A  (0x00000101)
 	unsigned char *rp;
 	unsigned char dp;
 	int lanes;
@@ -365,6 +371,15 @@
 	struct nubus_dirent *nd;
 	struct nubus_type type_info;
 
+	if (!m68k_is040or060) {
+		/* disable data cache */
+		asm volatile ("movec %/cacr,%/d0\n\t"
+		              "andil %0,%/d0\n\t"
+		              "movec %/d0,%/cacr"
+		              : : "i" (C030_DISABLE_A)
+		              : "d0");
+	}
+
 	/*
 	 *	Ok see whats cooking in the bytelanes
 	 */
@@ -514,7 +529,24 @@
 		}
 		if (mode==1)
 			nubus_video_shutup(slot, &type_info);
+
+		if (!m68k_is040or060) {
+			/* re-enable data cache */
+			asm volatile ("movec %/cacr,%/d0\n\t"
+				      "oril %0,%/d0\n\t"
+				      "movec %/d0,%/cacr"
+				      : : "i" (C030_ENABLE_A)
+				      : "d0");
+		}
 		return;
+	}
+	if (!m68k_is040or060) {
+		/* re-enable data cache */
+		asm volatile ("movec %/cacr,%/d0\n\t"
+			      "oril %0,%/d0\n\t"
+			      "movec %/d0,%/cacr"
+			      : : "i" (C030_ENABLE_A)
+			      : "d0");
 	}
 }
 
