--- 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");
       }
}