--- linux-2.0.29/drivers/char/mac_SCC.c.291197-1 Fri Dec 5 06:34:39 1997 +++ linux-2.0.29/drivers/char/mac_SCC.c Sat Dec 6 07:05:45 1997 @@ -356,7 +356,9 @@ stat = read_zsreg(info->private->zs_channel, R1); ch = read_zsdata(info->private->zs_channel); +#ifdef SCC_DEBUG printk("mac_SCC: receive_chars stat=%X char=%X \n", stat, ch); +#endif #if 0 /* KGDB not yet supported */ /* Look for kgdb 'stop' character, consult the gdb documentation @@ -491,8 +493,10 @@ */ #define CHAN_IRQMASK (CHBRxIP | CHBTxIP | CHBEXT) +#ifdef SCC_DEBUG printk("mac_SCC: interrupt; port: %lx channel: %lx \n", info->port, info->private->zs_channel); +#endif if (info->private->zs_chan_a == info->private->zs_channel) shift = 3; /* Channel A */ @@ -511,8 +515,10 @@ for (;;) { zs_intreg = read_zsreg(info->private->zs_chan_a, 3); +#ifdef SCC_DEBUG printk("mac_SCC: status %x shift %d shifted %x \n", zs_intreg, shift, zs_intreg >> shift); +#endif zs_intreg = zs_intreg >> shift; if ((zs_intreg & CHAN_IRQMASK) == 0) break; @@ -654,8 +660,9 @@ /* BUT: startup part needs to be done here! */ +#ifdef SCC_DEBUG printk("mac_SCC: init, info %lx, info->port %lx \n", info, info->port); - +#endif /* * Clear the receive FIFO. */ @@ -705,8 +712,9 @@ { static int got_autovector = 0; +#ifdef SCC_DEBUG printk("mac_SCC: init_port, info %x \n", info); - +#endif info->sw = &SCC_switch; info->private = &zs_soft_private[channel]; info->private->zs_channel = &zs_channels[channel]; @@ -715,7 +723,7 @@ info->private->zs_baud = get_zsbaud(info); info->port = (int) info->private->zs_channel->control; -#if 1 +#if 0 /* * Currently, only the autovector interrupt is used for SCC! * If another channel already requested the interrupt, we're fine... @@ -734,22 +742,25 @@ */ /* done in arch/m68k/mac/macints.c for now */ - if (!got_autovector) + if (!got_autovector) { if(request_irq(IRQ4, mac_SCC_handler, 0, "SCC master", info)) panic("macserial: can't get irq %d", IRQ4); + printk("mac_SCC: got SCC master interrupt %d, channel %d info %p\n", + IRQ4, channel, info); + } if (info->private->zs_chan_a == info->private->zs_channel) { /* Channel A */ if (request_irq(IRQ_SCCA, mac_SCC_interrupt, 0, "SCC A", info)) panic("mac_SCC: can't get irq %d", IRQ_SCCA); - printk("mac_SCC: got SCC A interrupt, channel %d info %p\n", - channel, info); + printk("mac_SCC: got SCC A interrupt %d, channel %d info %p\n", + IRQ_SCCA, channel, info); } else { /* Channel B */ if (request_irq(IRQ_SCCB, mac_SCC_interrupt, 0, "SCC B", info)) panic("mac_SCC: can't get irq %d", IRQ_SCCB); - printk("mac_SCC: got SCC B interrupt, channel %d info %p\n", - channel, info); + printk("mac_SCC: got SCC B interrupt %d, channel %d info %p\n", + IRQ_SCCB, channel, info); } #endif @@ -858,6 +869,18 @@ if (!(port = info->port)) return; i = cflag & CBAUD; + + if (i == 0 && !(info->flags & ASYNC_SPD_MASK)) { + /* speed == 0 -> drop DTR */ + save_flags(flags); + cli(); + info->private->curregs[5] &= ~DTR; + write_zsreg(info->private->zs_channel, 5, info->private->curregs[5]); + restore_flags(flags); + return; + } + + if (i & CBAUDEX) { /* XXX CBAUDEX is not obeyed. * It is impossible at a 32bits PPC. XXX?? @@ -1291,6 +1314,10 @@ /* last-ditch fixup for NetBSD booter case */ if (boot_info.bi_mac.scc == 0) boot_info.bi_mac.scc = ZS_CONTROL; + + /* testing: fix up broken 24 bit addresses */ + if ((boot_info.bi_mac.scc & 0x00FFFFFF) == boot_info.bi_mac.scc) + boot_info.bi_mac.scc |= 0x50000000; for(n=0;n<2;n++) { --- linux-2.0.29/mm/filemap.c.291197-1 Fri Dec 5 06:39:28 1997 +++ linux-2.0.29/mm/filemap.c Fri Dec 5 06:39:28 1997 @@ -1168,7 +1168,11 @@ /* share_page() can only guarantee proper page sharing if * the offsets are all page aligned. */ if (vma->vm_offset & (PAGE_SIZE - 1)) +#if 0 return -EINVAL; +#else + vma->vm_offset &= PAGE_MASK; +#endif } else { ops = &file_private_mmap; if (vma->vm_offset & (inode->i_sb->s_blocksize - 1))