Index: c/src/lib/libchip/serial/mc68681.c
===================================================================
--- c/src/lib/libchip/serial/mc68681.c	(revision ae21568caad6d15e32611f5550d85e02d7053fcc)
+++ c/src/lib/libchip/serial/mc68681.c	(revision 4f0ffa57d8930fc835aba70fc61f52cda4f84810)
@@ -30,16 +30,4 @@
  * Flow control is only supported when using interrupts
  */
-
-console_flow mc68681_flow_RTSCTS =
-{
-  mc68681_negate_RTS,             /* deviceStopRemoteTx */
-  mc68681_assert_RTS              /* deviceStartRemoteTx */
-};
-
-console_flow mc68681_flow_DTRCTS =
-{
-  mc68681_negate_DTR,             /* deviceStopRemoteTx */
-  mc68681_assert_DTR              /* deviceStartRemoteTx */
-};
 
 console_fns mc68681_fns =
@@ -123,4 +111,8 @@
 
   if ( !acr_bit ) {
+    /*
+     *  Baud Rate Set 1 
+     */
+
     switch (baud & CBAUD) {
       case B50:    baud_mask = 0x00; break;
@@ -149,4 +141,8 @@
     }
   } else {
+    /*
+     *  Baud Rate Set 2
+     */
+
     switch (baud & CBAUD) {
       case B75:    baud_mask = 0x00; break;
@@ -202,6 +198,6 @@
   rtems_interrupt_level  Irql;
 
-  pMC68681_port = Console_Port_Tbl[minor].ulCtrlPort1;
-  pMC68681      = Console_Port_Tbl[minor].ulCtrlPort2;
+  pMC68681      = Console_Port_Tbl[minor].ulCtrlPort1;
+  pMC68681_port = Console_Port_Tbl[minor].ulCtrlPort2;
   setReg        = Console_Port_Tbl[minor].setRegister;
 
@@ -294,5 +290,4 @@
   }
 
-  pmc68681Context->ucModemCtrl = 0x00;   /* XXX */
 }
 
@@ -306,5 +301,6 @@
 
 static unsigned int mc68681_build_imr(
-  int minor
+  int  minor,
+  int  enable_flag
 )
 {
@@ -344,9 +340,11 @@
 
   mask = 0;
-  if ( Console_Port_Tbl[minor].pDeviceFns->deviceOutputUsesInterrupts ) {
-    if ( pMC68681 == pMC68681_port )
-       mask = 0x03;
-    else
-       mask = 0x30;
+  if ( enable_flag ) {
+    if ( Console_Port_Tbl[minor].pDeviceFns->deviceOutputUsesInterrupts ) {
+      if ( pMC68681 == pMC68681_port )
+         mask = 0x03;
+      else
+         mask = 0x30;
+    }
   }
 
@@ -374,6 +372,6 @@
   mc68681_initialize_context( minor, pmc68681Context );
 
-  pMC68681_port = Console_Port_Tbl[minor].ulCtrlPort1;
-  pMC68681      = Console_Port_Tbl[minor].ulCtrlPort2;
+  pMC68681      = Console_Port_Tbl[minor].ulCtrlPort1;
+  pMC68681_port = Console_Port_Tbl[minor].ulCtrlPort2;
   setReg        = Console_Port_Tbl[minor].setRegister;
   getReg        = Console_Port_Tbl[minor].getRegister;
@@ -394,4 +392,10 @@
   (*setReg)( pMC68681, MC68681_MODE_REG_1A, 0x00 );
   (*setReg)( pMC68681, MC68681_MODE_REG_2A, 0x02 );
+
+  /*
+   *  Disable interrupts on RX and TX for this port
+   */
+
+  (*setReg)( pMC68681, MC68681_INTERRUPT_MASK_REG, mc68681_build_imr(minor, 0));
 }
 
@@ -442,13 +446,5 @@
   (*setReg)( pMC68681, MC68681_INTERRUPT_VECTOR_REG, vector );
 
-  /*
-   * Assert DTR
-   */
-
-  if(Console_Port_Tbl[minor].pDeviceFlow != &mc68681_flow_DTRCTS) {
-    mc68681_assert_DTR(minor);
-  }
-
-  return(RTEMS_SUCCESSFUL);
+  return RTEMS_SUCCESSFUL;
 }
 
@@ -479,12 +475,4 @@
   (*setReg)( pMC68681_port, MC68681_COMMAND, MC68681_MODE_REG_DISABLE_TX );
   (*setReg)( pMC68681_port, MC68681_COMMAND, MC68681_MODE_REG_DISABLE_RX );
-
-  /*
-   * Negate DTR
-   */
-
-  if(Console_Port_Tbl[minor].pDeviceFlow != &mc68681_flow_DTRCTS) {
-    mc68681_negate_DTR(minor);
-  }
 
   return(RTEMS_SUCCESSFUL);
@@ -540,208 +528,88 @@
 
 /*
- * These routines provide control of the RTS and DTR lines
- */
-
-/*
- *  mc68681_assert_RTS
- */
-
-static int mc68681_assert_RTS(int minor)
-{
-/* XXX */
-
+ *  mc68681_process
+ *
+ *  This routine is the per port console interrupt handler.
+ */
+
+static void mc68681_process(
+  int  minor
+)
+{
   unsigned32              pMC68681;
-  unsigned32              Irql;
-  mc68681_context        *pmc68681Context;
-  setRegister_f           setReg;
-
-
-  pmc68681Context = (mc68681_context *) Console_Port_Data[minor].pDeviceContext;
-
-  pMC68681 = Console_Port_Tbl[minor].ulCtrlPort1;
-  setReg   = Console_Port_Tbl[minor].setRegister;
-
-  /*
-   * Assert RTS
-   */
-  rtems_interrupt_disable(Irql);
-#if 0
-  pmc68681Context->ucModemCtrl |= SP_MODEM_RTS;
-  (*setReg)(pMC68681, MC68681_MODEM_CONTROL, pmc68681Context->ucModemCtrl);
-#endif
-  rtems_interrupt_enable(Irql);
-  return 0;
-}
-
-/*
- *  mc68681_negate_RTS
- */
-
-static int mc68681_negate_RTS(int minor)
-{
-/* XXX */
-  unsigned32              pMC68681;
-  unsigned32              Irql;
-  mc68681_context        *pmc68681Context;
-  setRegister_f           setReg;
-
-  pmc68681Context = (mc68681_context *) Console_Port_Data[minor].pDeviceContext;
-
-  pMC68681 = Console_Port_Tbl[minor].ulCtrlPort1;
-  setReg   = Console_Port_Tbl[minor].setRegister;
-
-  /*
-   * Negate RTS
-   */
-  rtems_interrupt_disable(Irql);
-#if 0
-  pmc68681Context->ucModemCtrl &= ~SP_MODEM_RTS;
-  (*setReg)(pMC68681, MC68681_MODEM_CONTROL, pmc68681Context->ucModemCtrl);
-#endif
-  rtems_interrupt_enable(Irql);
-  return 0;
-}
-
-/*
- * These flow control routines utilize a connection from the local DTR
- * line to the remote CTS line
- */
-
-/*
- *  mc68681_assert_DTR
- */
-
-static int mc68681_assert_DTR(int minor)
-{
-/* XXX */
-  unsigned32              pMC68681;
-  unsigned32              Irql;
-  mc68681_context        *pmc68681Context;
-  setRegister_f           setReg;
-
-  pmc68681Context = (mc68681_context *) Console_Port_Data[minor].pDeviceContext;
-
-  pMC68681 = Console_Port_Tbl[minor].ulCtrlPort1;
-  setReg   = Console_Port_Tbl[minor].setRegister;
-
-  /*
-   * Assert DTR
-   */
-  rtems_interrupt_disable(Irql);
-#if 0
-  pmc68681Context->ucModemCtrl |= SP_MODEM_DTR;
-  (*setReg)(pMC68681, MC68681_MODEM_CONTROL, pmc68681Context->ucModemCtrl);
-#endif
-  rtems_interrupt_enable(Irql);
-  return 0;
-}
-
-/*
- *  mc68681_negate_DTR
- */
-
-static int mc68681_negate_DTR(int minor)
-{
-/* XXX */
-  unsigned32              pMC68681;
-  unsigned32              Irql;
-  mc68681_context        *pmc68681Context;
-  setRegister_f           setReg;
-
-  pmc68681Context = (mc68681_context *) Console_Port_Data[minor].pDeviceContext;
-
-  pMC68681 = Console_Port_Tbl[minor].ulCtrlPort1;
-  setReg   = Console_Port_Tbl[minor].setRegister;
-
-  /*
-   * Negate DTR
-   */
-  rtems_interrupt_disable(Irql);
-#if 0
-  pmc68681Context->ucModemCtrl &= ~SP_MODEM_DTR;
-  (*setReg)(pMC68681, MC68681_MODEM_CONTROL,pmc68681Context->ucModemCtrl);
-#endif
-  rtems_interrupt_enable(Irql);
-  return 0;
-}
-
-/*
- *  mc68681_isr
- *
- *  This routine is the console interrupt handler.
- */
-
-static void mc68681_process(
-        int             minor
-)
-{
-/* XXX */
-  unsigned32              pMC68681;
+  unsigned32              pMC68681_port;
   volatile unsigned8      ucLineStatus; 
-  volatile unsigned8      ucInterruptId;
   char                    cChar;
   getRegister_f           getReg;
   setRegister_f           setReg;
 
-#if 1
-cChar = ucInterruptId = ucLineStatus = 0;
-#endif
-  pMC68681 = Console_Port_Tbl[minor].ulCtrlPort1;
-  getReg   = Console_Port_Tbl[minor].getRegister;
-  setReg   = Console_Port_Tbl[minor].setRegister;
-
-#if 0
-  do {
+  pMC68681      = Console_Port_Tbl[minor].ulCtrlPort1;
+  pMC68681_port = Console_Port_Tbl[minor].ulCtrlPort2;
+  getReg        = Console_Port_Tbl[minor].getRegister;
+  setReg        = Console_Port_Tbl[minor].setRegister;
+
+  /*
+   * Deal with any received characters
+   */
+  while(TRUE) {
+    ucLineStatus = (*getReg)(pMC68681_port, MC68681_STATUS);
+    if(!(ucLineStatus & MC68681_RX_READY)) {
+      break;
+    }
     /*
-     * Deal with any received characters
+     *  If there is a RX error, then dump all the data.
      */
-    while(TRUE) {
-      ucLineStatus = (*getReg)(pMC68681, MC68681_LINE_STATUS);
-      if(~ucLineStatus & SP_LSR_RDY) {
-        break;
-      }
-      cChar = (*getReg)(pMC68681, MC68681_RECEIVE_BUFFER);
-      rtems_termios_enqueue_raw_characters( 
-        Console_Port_Data[minor].termios_data,
-        &cChar, 
-        1 
-      );
-    }
-
-    while(TRUE) {
-      if(Ring_buffer_Is_empty(&Console_Port_Data[minor].TxBuffer)) {
-        Console_Port_Data[minor].bActive = FALSE;
-        if(Console_Port_Tbl[minor].pDeviceFlow != &mc68681_flow_RTSCTS) {
-          mc68681_negate_RTS(minor);
-        }
-
-        /*
-         * There is no data to transmit
-         */
-        break;
-      }
-
-      ucLineStatus = (*getReg)(pMC68681, MC68681_LINE_STATUS);
-      if(~ucLineStatus & SP_LSR_THOLD) {
-        /*
-         * We'll get another interrupt when
-         * the transmitter holding reg. becomes
-         * free again
-         */
-        break;
-      }
-
-      Ring_buffer_Remove_character( &Console_Port_Data[minor].TxBuffer, cChar);
+    if ( ucLineStatus & MC68681_RX_ERRORS ) {
+      do {
+        cChar = (*getReg)(pMC68681_port, MC68681_RX_BUFFER);
+        ucLineStatus = (*getReg)(pMC68681_port, MC68681_STATUS);
+      } while ( ucLineStatus & MC68681_RX_READY );
+      continue;
+    }
+    cChar = (*getReg)(pMC68681_port, MC68681_RX_BUFFER);
+    rtems_termios_enqueue_raw_characters( 
+      Console_Port_Data[minor].termios_data,
+      &cChar, 
+      1 
+    );
+  }
+
+  /*
+   *  Deal with the transmitter
+   */
+
+  while(TRUE) {
+    if(Ring_buffer_Is_empty(&Console_Port_Data[minor].TxBuffer)) {
+      Console_Port_Data[minor].bActive = FALSE;
+
       /*
-       * transmit character
+       * There is no data to transmit
        */
-      (*setReg)(pMC68681, MC68681_TRANSMIT_BUFFER, cChar);
-    }
-
-    ucInterruptId = (*getReg)(pMC68681, MC68681_INTERRUPT_ID);
-  }
-  while((ucInterruptId&0xf) != 0x1);
-#endif
-}
+      break;
+    }
+
+    ucLineStatus = (*getReg)(pMC68681_port, MC68681_STATUS);
+    if(!(ucLineStatus & (MC68681_TX_EMPTY|MC68681_TX_READY))) {
+      /*
+       *  We'll get another interrupt when the TX can take another character.
+       */
+      break;
+    }
+
+    Ring_buffer_Remove_character( &Console_Port_Data[minor].TxBuffer, cChar);
+    /*
+     * transmit character
+     */
+    (*setReg)(pMC68681_port, MC68681_TX_BUFFER, cChar);
+  }
+
+}
+
+/*
+ *  mc68681_isr
+ *
+ *  This is the single interrupt entry point which parcels interrupts
+ *  out to the various ports.
+ */
 
 static rtems_isr mc68681_isr(
@@ -803,5 +671,5 @@
    */
 
-  (*setReg)( pMC68681, MC68681_INTERRUPT_MASK_REG, mc68681_build_imr( minor ));
+  (*setReg)( pMC68681, MC68681_INTERRUPT_MASK_REG, mc68681_build_imr(minor, 1));
 }
 
@@ -849,7 +717,4 @@
         rtems_interrupt_disable(Irql);
         Console_Port_Data[minor].bActive = TRUE;
-        if(Console_Port_Tbl[minor].pDeviceFlow != &mc68681_flow_RTSCTS) {
-          mc68681_assert_RTS(minor);
-        }
         mc68681_process(minor);
         rtems_interrupt_enable(Irql);
@@ -882,7 +747,4 @@
     rtems_interrupt_disable(Irql);
     Console_Port_Data[minor].bActive = TRUE;
-    if(Console_Port_Tbl[minor].pDeviceFlow != &mc68681_flow_RTSCTS) {
-      mc68681_assert_RTS(minor);
-    }
     mc68681_process(minor);
     rtems_interrupt_enable(Irql);
Index: c/src/lib/libchip/serial/mc68681.h
===================================================================
--- c/src/lib/libchip/serial/mc68681.h	(revision ae21568caad6d15e32611f5550d85e02d7053fcc)
+++ c/src/lib/libchip/serial/mc68681.h	(revision 4f0ffa57d8930fc835aba70fc61f52cda4f84810)
@@ -47,11 +47,4 @@
 extern console_fns mc68681_fns_polled;
 
-/*
- * Flow control function tables
- */
-
-extern console_flow mc68681_flow_RTSCTS;
-extern console_flow mc68681_flow_DTRCTS;
-
 #ifdef __cplusplus
 }
Index: c/src/lib/libchip/serial/mc68681_p.h
===================================================================
--- c/src/lib/libchip/serial/mc68681_p.h	(revision ae21568caad6d15e32611f5550d85e02d7053fcc)
+++ c/src/lib/libchip/serial/mc68681_p.h	(revision 4f0ffa57d8930fc835aba70fc61f52cda4f84810)
@@ -166,4 +166,8 @@
 #define MC68681_RECEIVED_BREAK                              0x80
 
+#define MC68681_RX_ERRORS \
+  (MC68681_OVERRUN_ERROR|MC68681_PARITY_ERROR| \
+   MC68681_FRAMING_ERROR|MC68681_RECEIVED_BREAK)
+
 /*
  * Interupt Status Register Definitions.
@@ -226,5 +230,4 @@
 {
   int        mate;
-  unsigned8  ucModemCtrl;
 } mc68681_context;
 
@@ -256,20 +259,4 @@
   int   minor, 
   char  cChar
-);
-
-static int mc68681_assert_RTS(
-  int minor
-);
-
-static int mc68681_negate_RTS(
-  int minor
-);
-
-static int mc68681_assert_DTR(
-  int minor
-);
-
-static int mc68681_negate_DTR(
-  int minor
 );
 
Index: c/src/libchip/serial/mc68681.c
===================================================================
--- c/src/libchip/serial/mc68681.c	(revision ae21568caad6d15e32611f5550d85e02d7053fcc)
+++ c/src/libchip/serial/mc68681.c	(revision 4f0ffa57d8930fc835aba70fc61f52cda4f84810)
@@ -30,16 +30,4 @@
  * Flow control is only supported when using interrupts
  */
-
-console_flow mc68681_flow_RTSCTS =
-{
-  mc68681_negate_RTS,             /* deviceStopRemoteTx */
-  mc68681_assert_RTS              /* deviceStartRemoteTx */
-};
-
-console_flow mc68681_flow_DTRCTS =
-{
-  mc68681_negate_DTR,             /* deviceStopRemoteTx */
-  mc68681_assert_DTR              /* deviceStartRemoteTx */
-};
 
 console_fns mc68681_fns =
@@ -123,4 +111,8 @@
 
   if ( !acr_bit ) {
+    /*
+     *  Baud Rate Set 1 
+     */
+
     switch (baud & CBAUD) {
       case B50:    baud_mask = 0x00; break;
@@ -149,4 +141,8 @@
     }
   } else {
+    /*
+     *  Baud Rate Set 2
+     */
+
     switch (baud & CBAUD) {
       case B75:    baud_mask = 0x00; break;
@@ -202,6 +198,6 @@
   rtems_interrupt_level  Irql;
 
-  pMC68681_port = Console_Port_Tbl[minor].ulCtrlPort1;
-  pMC68681      = Console_Port_Tbl[minor].ulCtrlPort2;
+  pMC68681      = Console_Port_Tbl[minor].ulCtrlPort1;
+  pMC68681_port = Console_Port_Tbl[minor].ulCtrlPort2;
   setReg        = Console_Port_Tbl[minor].setRegister;
 
@@ -294,5 +290,4 @@
   }
 
-  pmc68681Context->ucModemCtrl = 0x00;   /* XXX */
 }
 
@@ -306,5 +301,6 @@
 
 static unsigned int mc68681_build_imr(
-  int minor
+  int  minor,
+  int  enable_flag
 )
 {
@@ -344,9 +340,11 @@
 
   mask = 0;
-  if ( Console_Port_Tbl[minor].pDeviceFns->deviceOutputUsesInterrupts ) {
-    if ( pMC68681 == pMC68681_port )
-       mask = 0x03;
-    else
-       mask = 0x30;
+  if ( enable_flag ) {
+    if ( Console_Port_Tbl[minor].pDeviceFns->deviceOutputUsesInterrupts ) {
+      if ( pMC68681 == pMC68681_port )
+         mask = 0x03;
+      else
+         mask = 0x30;
+    }
   }
 
@@ -374,6 +372,6 @@
   mc68681_initialize_context( minor, pmc68681Context );
 
-  pMC68681_port = Console_Port_Tbl[minor].ulCtrlPort1;
-  pMC68681      = Console_Port_Tbl[minor].ulCtrlPort2;
+  pMC68681      = Console_Port_Tbl[minor].ulCtrlPort1;
+  pMC68681_port = Console_Port_Tbl[minor].ulCtrlPort2;
   setReg        = Console_Port_Tbl[minor].setRegister;
   getReg        = Console_Port_Tbl[minor].getRegister;
@@ -394,4 +392,10 @@
   (*setReg)( pMC68681, MC68681_MODE_REG_1A, 0x00 );
   (*setReg)( pMC68681, MC68681_MODE_REG_2A, 0x02 );
+
+  /*
+   *  Disable interrupts on RX and TX for this port
+   */
+
+  (*setReg)( pMC68681, MC68681_INTERRUPT_MASK_REG, mc68681_build_imr(minor, 0));
 }
 
@@ -442,13 +446,5 @@
   (*setReg)( pMC68681, MC68681_INTERRUPT_VECTOR_REG, vector );
 
-  /*
-   * Assert DTR
-   */
-
-  if(Console_Port_Tbl[minor].pDeviceFlow != &mc68681_flow_DTRCTS) {
-    mc68681_assert_DTR(minor);
-  }
-
-  return(RTEMS_SUCCESSFUL);
+  return RTEMS_SUCCESSFUL;
 }
 
@@ -479,12 +475,4 @@
   (*setReg)( pMC68681_port, MC68681_COMMAND, MC68681_MODE_REG_DISABLE_TX );
   (*setReg)( pMC68681_port, MC68681_COMMAND, MC68681_MODE_REG_DISABLE_RX );
-
-  /*
-   * Negate DTR
-   */
-
-  if(Console_Port_Tbl[minor].pDeviceFlow != &mc68681_flow_DTRCTS) {
-    mc68681_negate_DTR(minor);
-  }
 
   return(RTEMS_SUCCESSFUL);
@@ -540,208 +528,88 @@
 
 /*
- * These routines provide control of the RTS and DTR lines
- */
-
-/*
- *  mc68681_assert_RTS
- */
-
-static int mc68681_assert_RTS(int minor)
-{
-/* XXX */
-
+ *  mc68681_process
+ *
+ *  This routine is the per port console interrupt handler.
+ */
+
+static void mc68681_process(
+  int  minor
+)
+{
   unsigned32              pMC68681;
-  unsigned32              Irql;
-  mc68681_context        *pmc68681Context;
-  setRegister_f           setReg;
-
-
-  pmc68681Context = (mc68681_context *) Console_Port_Data[minor].pDeviceContext;
-
-  pMC68681 = Console_Port_Tbl[minor].ulCtrlPort1;
-  setReg   = Console_Port_Tbl[minor].setRegister;
-
-  /*
-   * Assert RTS
-   */
-  rtems_interrupt_disable(Irql);
-#if 0
-  pmc68681Context->ucModemCtrl |= SP_MODEM_RTS;
-  (*setReg)(pMC68681, MC68681_MODEM_CONTROL, pmc68681Context->ucModemCtrl);
-#endif
-  rtems_interrupt_enable(Irql);
-  return 0;
-}
-
-/*
- *  mc68681_negate_RTS
- */
-
-static int mc68681_negate_RTS(int minor)
-{
-/* XXX */
-  unsigned32              pMC68681;
-  unsigned32              Irql;
-  mc68681_context        *pmc68681Context;
-  setRegister_f           setReg;
-
-  pmc68681Context = (mc68681_context *) Console_Port_Data[minor].pDeviceContext;
-
-  pMC68681 = Console_Port_Tbl[minor].ulCtrlPort1;
-  setReg   = Console_Port_Tbl[minor].setRegister;
-
-  /*
-   * Negate RTS
-   */
-  rtems_interrupt_disable(Irql);
-#if 0
-  pmc68681Context->ucModemCtrl &= ~SP_MODEM_RTS;
-  (*setReg)(pMC68681, MC68681_MODEM_CONTROL, pmc68681Context->ucModemCtrl);
-#endif
-  rtems_interrupt_enable(Irql);
-  return 0;
-}
-
-/*
- * These flow control routines utilize a connection from the local DTR
- * line to the remote CTS line
- */
-
-/*
- *  mc68681_assert_DTR
- */
-
-static int mc68681_assert_DTR(int minor)
-{
-/* XXX */
-  unsigned32              pMC68681;
-  unsigned32              Irql;
-  mc68681_context        *pmc68681Context;
-  setRegister_f           setReg;
-
-  pmc68681Context = (mc68681_context *) Console_Port_Data[minor].pDeviceContext;
-
-  pMC68681 = Console_Port_Tbl[minor].ulCtrlPort1;
-  setReg   = Console_Port_Tbl[minor].setRegister;
-
-  /*
-   * Assert DTR
-   */
-  rtems_interrupt_disable(Irql);
-#if 0
-  pmc68681Context->ucModemCtrl |= SP_MODEM_DTR;
-  (*setReg)(pMC68681, MC68681_MODEM_CONTROL, pmc68681Context->ucModemCtrl);
-#endif
-  rtems_interrupt_enable(Irql);
-  return 0;
-}
-
-/*
- *  mc68681_negate_DTR
- */
-
-static int mc68681_negate_DTR(int minor)
-{
-/* XXX */
-  unsigned32              pMC68681;
-  unsigned32              Irql;
-  mc68681_context        *pmc68681Context;
-  setRegister_f           setReg;
-
-  pmc68681Context = (mc68681_context *) Console_Port_Data[minor].pDeviceContext;
-
-  pMC68681 = Console_Port_Tbl[minor].ulCtrlPort1;
-  setReg   = Console_Port_Tbl[minor].setRegister;
-
-  /*
-   * Negate DTR
-   */
-  rtems_interrupt_disable(Irql);
-#if 0
-  pmc68681Context->ucModemCtrl &= ~SP_MODEM_DTR;
-  (*setReg)(pMC68681, MC68681_MODEM_CONTROL,pmc68681Context->ucModemCtrl);
-#endif
-  rtems_interrupt_enable(Irql);
-  return 0;
-}
-
-/*
- *  mc68681_isr
- *
- *  This routine is the console interrupt handler.
- */
-
-static void mc68681_process(
-        int             minor
-)
-{
-/* XXX */
-  unsigned32              pMC68681;
+  unsigned32              pMC68681_port;
   volatile unsigned8      ucLineStatus; 
-  volatile unsigned8      ucInterruptId;
   char                    cChar;
   getRegister_f           getReg;
   setRegister_f           setReg;
 
-#if 1
-cChar = ucInterruptId = ucLineStatus = 0;
-#endif
-  pMC68681 = Console_Port_Tbl[minor].ulCtrlPort1;
-  getReg   = Console_Port_Tbl[minor].getRegister;
-  setReg   = Console_Port_Tbl[minor].setRegister;
-
-#if 0
-  do {
+  pMC68681      = Console_Port_Tbl[minor].ulCtrlPort1;
+  pMC68681_port = Console_Port_Tbl[minor].ulCtrlPort2;
+  getReg        = Console_Port_Tbl[minor].getRegister;
+  setReg        = Console_Port_Tbl[minor].setRegister;
+
+  /*
+   * Deal with any received characters
+   */
+  while(TRUE) {
+    ucLineStatus = (*getReg)(pMC68681_port, MC68681_STATUS);
+    if(!(ucLineStatus & MC68681_RX_READY)) {
+      break;
+    }
     /*
-     * Deal with any received characters
+     *  If there is a RX error, then dump all the data.
      */
-    while(TRUE) {
-      ucLineStatus = (*getReg)(pMC68681, MC68681_LINE_STATUS);
-      if(~ucLineStatus & SP_LSR_RDY) {
-        break;
-      }
-      cChar = (*getReg)(pMC68681, MC68681_RECEIVE_BUFFER);
-      rtems_termios_enqueue_raw_characters( 
-        Console_Port_Data[minor].termios_data,
-        &cChar, 
-        1 
-      );
-    }
-
-    while(TRUE) {
-      if(Ring_buffer_Is_empty(&Console_Port_Data[minor].TxBuffer)) {
-        Console_Port_Data[minor].bActive = FALSE;
-        if(Console_Port_Tbl[minor].pDeviceFlow != &mc68681_flow_RTSCTS) {
-          mc68681_negate_RTS(minor);
-        }
-
-        /*
-         * There is no data to transmit
-         */
-        break;
-      }
-
-      ucLineStatus = (*getReg)(pMC68681, MC68681_LINE_STATUS);
-      if(~ucLineStatus & SP_LSR_THOLD) {
-        /*
-         * We'll get another interrupt when
-         * the transmitter holding reg. becomes
-         * free again
-         */
-        break;
-      }
-
-      Ring_buffer_Remove_character( &Console_Port_Data[minor].TxBuffer, cChar);
+    if ( ucLineStatus & MC68681_RX_ERRORS ) {
+      do {
+        cChar = (*getReg)(pMC68681_port, MC68681_RX_BUFFER);
+        ucLineStatus = (*getReg)(pMC68681_port, MC68681_STATUS);
+      } while ( ucLineStatus & MC68681_RX_READY );
+      continue;
+    }
+    cChar = (*getReg)(pMC68681_port, MC68681_RX_BUFFER);
+    rtems_termios_enqueue_raw_characters( 
+      Console_Port_Data[minor].termios_data,
+      &cChar, 
+      1 
+    );
+  }
+
+  /*
+   *  Deal with the transmitter
+   */
+
+  while(TRUE) {
+    if(Ring_buffer_Is_empty(&Console_Port_Data[minor].TxBuffer)) {
+      Console_Port_Data[minor].bActive = FALSE;
+
       /*
-       * transmit character
+       * There is no data to transmit
        */
-      (*setReg)(pMC68681, MC68681_TRANSMIT_BUFFER, cChar);
-    }
-
-    ucInterruptId = (*getReg)(pMC68681, MC68681_INTERRUPT_ID);
-  }
-  while((ucInterruptId&0xf) != 0x1);
-#endif
-}
+      break;
+    }
+
+    ucLineStatus = (*getReg)(pMC68681_port, MC68681_STATUS);
+    if(!(ucLineStatus & (MC68681_TX_EMPTY|MC68681_TX_READY))) {
+      /*
+       *  We'll get another interrupt when the TX can take another character.
+       */
+      break;
+    }
+
+    Ring_buffer_Remove_character( &Console_Port_Data[minor].TxBuffer, cChar);
+    /*
+     * transmit character
+     */
+    (*setReg)(pMC68681_port, MC68681_TX_BUFFER, cChar);
+  }
+
+}
+
+/*
+ *  mc68681_isr
+ *
+ *  This is the single interrupt entry point which parcels interrupts
+ *  out to the various ports.
+ */
 
 static rtems_isr mc68681_isr(
@@ -803,5 +671,5 @@
    */
 
-  (*setReg)( pMC68681, MC68681_INTERRUPT_MASK_REG, mc68681_build_imr( minor ));
+  (*setReg)( pMC68681, MC68681_INTERRUPT_MASK_REG, mc68681_build_imr(minor, 1));
 }
 
@@ -849,7 +717,4 @@
         rtems_interrupt_disable(Irql);
         Console_Port_Data[minor].bActive = TRUE;
-        if(Console_Port_Tbl[minor].pDeviceFlow != &mc68681_flow_RTSCTS) {
-          mc68681_assert_RTS(minor);
-        }
         mc68681_process(minor);
         rtems_interrupt_enable(Irql);
@@ -882,7 +747,4 @@
     rtems_interrupt_disable(Irql);
     Console_Port_Data[minor].bActive = TRUE;
-    if(Console_Port_Tbl[minor].pDeviceFlow != &mc68681_flow_RTSCTS) {
-      mc68681_assert_RTS(minor);
-    }
     mc68681_process(minor);
     rtems_interrupt_enable(Irql);
Index: c/src/libchip/serial/mc68681.h
===================================================================
--- c/src/libchip/serial/mc68681.h	(revision ae21568caad6d15e32611f5550d85e02d7053fcc)
+++ c/src/libchip/serial/mc68681.h	(revision 4f0ffa57d8930fc835aba70fc61f52cda4f84810)
@@ -47,11 +47,4 @@
 extern console_fns mc68681_fns_polled;
 
-/*
- * Flow control function tables
- */
-
-extern console_flow mc68681_flow_RTSCTS;
-extern console_flow mc68681_flow_DTRCTS;
-
 #ifdef __cplusplus
 }
Index: c/src/libchip/serial/mc68681_p.h
===================================================================
--- c/src/libchip/serial/mc68681_p.h	(revision ae21568caad6d15e32611f5550d85e02d7053fcc)
+++ c/src/libchip/serial/mc68681_p.h	(revision 4f0ffa57d8930fc835aba70fc61f52cda4f84810)
@@ -166,4 +166,8 @@
 #define MC68681_RECEIVED_BREAK                              0x80
 
+#define MC68681_RX_ERRORS \
+  (MC68681_OVERRUN_ERROR|MC68681_PARITY_ERROR| \
+   MC68681_FRAMING_ERROR|MC68681_RECEIVED_BREAK)
+
 /*
  * Interupt Status Register Definitions.
@@ -226,5 +230,4 @@
 {
   int        mate;
-  unsigned8  ucModemCtrl;
 } mc68681_context;
 
@@ -256,20 +259,4 @@
   int   minor, 
   char  cChar
-);
-
-static int mc68681_assert_RTS(
-  int minor
-);
-
-static int mc68681_negate_RTS(
-  int minor
-);
-
-static int mc68681_assert_DTR(
-  int minor
-);
-
-static int mc68681_negate_DTR(
-  int minor
 );
 
