--- linux-2.0.29/arch/m68k/kernel/head.S.291197-2	Mon Dec  8 06:34:02 1997
+++ linux-2.0.29/arch/m68k/kernel/head.S	Mon Dec  8 06:35:20 1997
@@ -1070,9 +1070,9 @@
 	movel	#0xF8000000,%a1
 1:	
 	movel	%a1,%a0
-	movel	#0x00400000,%d0
+	movel	#0x02000000,%d0
 	jbsr	mmu_map
-	addl	#0x01000000,%a1
+	addl	#0x02000000,%a1
 	cmpl	#0,%a1
 	jbne	1b
 
--- linux-2.0.29/arch/m68k/mac/config.c.291197-2	Mon Dec  8 07:46:56 1997
+++ linux-2.0.29/arch/m68k/mac/config.c	Mon Dec  8 07:48:45 1997
@@ -86,7 +86,7 @@
 	int leap, oldleap, isleap;
 	int mon_days[14] = { -1, 31, 27, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, -1 };
 
-	time = boot_info.bi_mac.boottime; /* seconds */
+	time = boot_info.bi_mac.boottime +60*boot_info.bi_mac.gmtbias; /* seconds */
 
 #if 1
 	printk("mac_gettod: boottime %ld gmtbias %d \n",
--- linux-2.0.29/drivers/char/mac_SCC.c.291197-2	Sun Dec  7 20:11:46 1997
+++ linux-2.0.29/drivers/char/mac_SCC.c	Mon Dec  8 06:57:54 1997
@@ -345,7 +345,7 @@
 
 extern void breakpoint(void);  /* For the KGDB frame character */
 
-static _INLINE_ void receive_chars(struct async_struct *info,
+static /*_INLINE_*/ void receive_chars(struct async_struct *info,
 				   struct pt_regs *regs)
 {
 	struct tty_struct *tty = info->tty;
@@ -376,7 +376,7 @@
 
 		if (tty->flip.count >= TTY_FLIPBUF_SIZE)
 			queue_task_irq_off(&tty->flip.tqueue, &tq_timer);
-		tty->flip.count++;
+		
 		if (stat & Rx_OVR) {
 			flag = TTY_OVERRUN;
 			/* reset the error indication */
@@ -390,6 +390,31 @@
 			write_zsreg(info->private->zs_channel, 0, ERR_RES);
 		} else
 			flag = 0;
+
+		if (tty->flip.buf_num 
+		    && tty->flip.count >= TTY_FLIPBUF_SIZE-1) {
+#ifdef SCC_DEBUG_OVERRUN
+			printk("mac_SCC: flip buffer overrun, count %d!\n",
+				tty->flip.count);
+#endif
+			return;
+		}
+
+		if (tty->flip.char_buf_ptr < &tty->flip.char_buf[0]) {
+			printk("mac_SCC: char flip buffer %d corrupt %p %p %d!\n",
+				tty->flip.buf_num, tty->flip.char_buf_ptr, 
+				&tty->flip.char_buf[0], tty->flip.count);
+			return;
+		}
+			
+		if (tty->flip.flag_buf_ptr < &tty->flip.flag_buf[0]) {
+			printk("mac_SCC: flag flip buffer %d corrupt %p %p %d!\n",
+				tty->flip.buf_num, tty->flip.flag_buf_ptr, 
+				&tty->flip.flag_buf[0], tty->flip.count);
+			return;
+		}
+
+		tty->flip.count++;
 		*tty->flip.flag_buf_ptr++ = flag;
 		*tty->flip.char_buf_ptr++ = ch;
 
@@ -433,7 +458,7 @@
 		rs_sched_event(info, RS_EVENT_WRITE_WAKEUP);
 }
 
-static _INLINE_ void status_handle(struct async_struct *info)
+static /*_INLINE_*/ void status_handle(struct async_struct *info)
 {
 	unsigned char status;
 
@@ -503,16 +528,6 @@
 	else
 		shift = 0;	/* Channel B */
 
-	/*
-	 * Big problem: we register one interrupt for both channels. 
-	 * Hence, info is always the pointer to the async_struct of
-	 * the first device registered. So we'll have to keep a local copy
-	 * of info_A and info_B here.
-	 * Consequence: only Channel B interrupts are recognized here... 
-	 * and these seem to loop infinitely as the interrupt status doesn't
-	 * get cleared.
-	 */
-
 	for (;;) {
 		zs_intreg = read_zsreg(info->private->zs_chan_a, 3);
 #ifdef SCC_DEBUG
@@ -747,6 +762,7 @@
 			panic("macserial: can't get irq %d", IRQ4);
 		printk("mac_SCC: got SCC master interrupt %d, channel %d info %p\n",
 			IRQ4, channel, info);
+		got_autovector = 1;
 	}
 
 	if (info->private->zs_chan_a == info->private->zs_channel) {
@@ -874,7 +890,7 @@
 		/* speed == 0 -> drop DTR */
 		save_flags(flags);
 		cli();
-		info->private->curregs[5] &= ~DTR;
+		info->private->curregs[5] &= ~(DTR | RTS);
 		write_zsreg(info->private->zs_channel, 5, info->private->curregs[5]);
 		restore_flags(flags);
 		return;
--- linux-2.0.29/drivers/nubus/nubus.c.291197-2	Mon Dec  8 06:36:37 1997
+++ linux-2.0.29/drivers/nubus/nubus.c	Mon Dec  8 06:39:49 1997
@@ -356,12 +356,6 @@
 
 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;
@@ -371,15 +365,6 @@
 	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
 	 */
@@ -530,23 +515,7 @@
 		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");
 	}
 }
 
