fix console printing bug
authorAli Saidi <saidi@eecs.umich.edu>
Mon, 30 Apr 2007 17:13:03 +0000 (13:13 -0400)
committerAli Saidi <saidi@eecs.umich.edu>
Mon, 30 Apr 2007 17:13:03 +0000 (13:13 -0400)
--HG--
extra : convert_revision : 5481b72b22e7a2cf3367d777309bc30201f3b1fc

src/dev/uart8250.cc
src/dev/uart8250.hh

index ddee33695eec7f270862c9dc8fd373c60e12af01..d178bd1af48124301abfdc89b2a80dbdab162a93 100644 (file)
@@ -68,6 +68,7 @@ Uart8250::IntrEvent::process()
        DPRINTF(Uart, "UART InterEvent, interrupting\n");
        uart->platform->postConsoleInt();
        uart->status |= intrBit;
+       uart->lastTxInt = curTick;
     }
     else
        DPRINTF(Uart, "UART InterEvent, not interrupting\n");
@@ -153,13 +154,13 @@ Uart8250::read(PacketPtr pkt)
 
             if (status & RX_INT) /* Rx data interrupt has a higher priority */
                 pkt->set(IIR_RXID);
-            else if (status & TX_INT)
+            else if (status & TX_INT) {
                 pkt->set(IIR_TXID);
-            else
+                //Tx interrupts are cleared on IIR reads
+                status &= ~TX_INT;
+            } else
                 pkt->set(IIR_NOPEND);
 
-            //Tx interrupts are cleared on IIR reads
-            status &= ~TX_INT;
             break;
         case 0x3: // Line Control Register (LCR)
             pkt->set(LCR);
@@ -222,7 +223,16 @@ Uart8250::write(PacketPtr pkt)
                 if (UART_IER_THRI & IER)
                 {
                     DPRINTF(Uart, "IER: IER_THRI set, scheduling TX intrrupt\n");
-                    txIntrEvent.scheduleIntr();
+                    if (curTick - lastTxInt >
+                            (Tick)((Clock::Float::s / 2e9) * 450))  {
+                        DPRINTF(Uart, "-- Interrupting Immediately... %d,%d\n",
+                                curTick, lastTxInt);
+                        txIntrEvent.process();
+                    } else {
+                        DPRINTF(Uart, "-- Delaying interrupt... %d,%d\n",
+                                curTick, lastTxInt);
+                        txIntrEvent.scheduleIntr();
+                    }
                 }
                 else
                 {
index c28200592761c03d5ede441c18164075943875ba..c9c878aeda12d8dc8c29b3685aec05965e2dba72 100644 (file)
@@ -74,6 +74,7 @@ class Uart8250 : public Uart
 
   protected:
     uint8_t IER, DLAB, LCR, MCR;
+    Tick lastTxInt;
 
     class IntrEvent : public Event
     {