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