FALSE,\r
FALSE,\r
Uart16550A,\r
- NULL\r
+ NULL,\r
+ FixedPcdGetBool (PcdIsaBusSerialUseHalfHandshake) //UseHalfHandshake\r
};\r
\r
/**\r
} while (!IsaSerialFifoEmpty (&SerialDevice->Transmit));\r
} else {\r
ReceiveFifoFull = IsaSerialFifoFull (&SerialDevice->Receive);\r
+ //\r
+ // For full handshake flow control, tell the peer to send data\r
+ // if receive buffer is available.\r
+ //\r
+ if (SerialDevice->HardwareFlowControl &&\r
+ !SerialDevice->UseHalfHandshake &&\r
+ !ReceiveFifoFull\r
+ ) {\r
+ Mcr.Data = READ_MCR (SerialDevice->IsaIo, SerialDevice->BaseAddress);\r
+ Mcr.Bits.Rts = 1;\r
+ WRITE_MCR (SerialDevice->IsaIo, SerialDevice->BaseAddress, Mcr.Data);\r
+ }\r
do {\r
Lsr.Data = READ_LSR (SerialDevice->IsaIo, SerialDevice->BaseAddress);\r
\r
continue;\r
}\r
}\r
- //\r
- // Make sure the receive data will not be missed, Assert DTR\r
- //\r
- if (SerialDevice->HardwareFlowControl) {\r
- Mcr.Data = READ_MCR (SerialDevice->IsaIo, SerialDevice->BaseAddress);\r
- Mcr.Bits.DtrC &= 0;\r
- WRITE_MCR (SerialDevice->IsaIo, SerialDevice->BaseAddress, Mcr.Data);\r
- }\r
\r
Data = READ_RBR (SerialDevice->IsaIo, SerialDevice->BaseAddress);\r
\r
+ IsaSerialFifoAdd (&SerialDevice->Receive, Data);\r
+ \r
//\r
- // Deassert DTR\r
+ // For full handshake flow control, if receive buffer full\r
+ // tell the peer to stop sending data.\r
//\r
- if (SerialDevice->HardwareFlowControl) {\r
- Mcr.Data = READ_MCR (SerialDevice->IsaIo, SerialDevice->BaseAddress);\r
- Mcr.Bits.DtrC |= 1;\r
+ if (SerialDevice->HardwareFlowControl &&\r
+ !SerialDevice->UseHalfHandshake &&\r
+ IsaSerialFifoFull (&SerialDevice->Receive)\r
+ ) {\r
+ Mcr.Data = READ_MCR (SerialDevice->IsaIo, SerialDevice->BaseAddress);\r
+ Mcr.Bits.Rts = 0;\r
WRITE_MCR (SerialDevice->IsaIo, SerialDevice->BaseAddress, Mcr.Data);\r
}\r
\r
//\r
if (SerialDevice->HardwareFlowControl) {\r
//\r
- // Send RTS\r
+ // For half handshake flow control assert RTS before sending.\r
//\r
- Mcr.Data = READ_MCR (SerialDevice->IsaIo, SerialDevice->BaseAddress);\r
- Mcr.Bits.Rts |= 1;\r
- WRITE_MCR (SerialDevice->IsaIo, SerialDevice->BaseAddress, Mcr.Data);\r
+ if (SerialDevice->UseHalfHandshake) {\r
+ Mcr.Data = READ_MCR (SerialDevice->IsaIo, SerialDevice->BaseAddress);\r
+ Mcr.Bits.Rts= 0;\r
+ WRITE_MCR (SerialDevice->IsaIo, SerialDevice->BaseAddress, Mcr.Data);\r
+ }\r
//\r
// Wait for CTS\r
//\r
TimeOut = 0;\r
Msr.Data = READ_MSR (SerialDevice->IsaIo, SerialDevice->BaseAddress);\r
- while (Msr.Bits.Cts == 0) {\r
+ while (Msr.Bits.Dcd == 1 && (!Msr.Bits.Cts ^ SerialDevice->UseHalfHandshake)) {\r
gBS->Stall (TIMEOUT_STALL_INTERVAL);\r
TimeOut++;\r
if (TimeOut > 5) {\r
Msr.Data = READ_MSR (SerialDevice->IsaIo, SerialDevice->BaseAddress);\r
}\r
\r
- if (Msr.Bits.Cts == 1) {\r
+ if (Msr.Bits.Dcd== 0 || (Msr.Bits.Cts ^ SerialDevice->UseHalfHandshake)) {\r
IsaSerialFifoRemove (&SerialDevice->Transmit, &Data);\r
WRITE_THR (SerialDevice->IsaIo, SerialDevice->BaseAddress, Data);\r
}\r
- }\r
- //\r
- // write the data out\r
- //\r
- if (!SerialDevice->HardwareFlowControl) {\r
- IsaSerialFifoRemove (&SerialDevice->Transmit, &Data);\r
- WRITE_THR (SerialDevice->IsaIo, SerialDevice->BaseAddress, Data);\r
- }\r
- //\r
- // Make sure the transmit data will not be missed\r
- //\r
- if (SerialDevice->HardwareFlowControl) {\r
+\r
//\r
- // Assert RTS\r
+ // For half handshake flow control, tell DCE we are done.\r
//\r
- Mcr.Data = READ_MCR (SerialDevice->IsaIo, SerialDevice->BaseAddress);\r
- Mcr.Bits.Rts &= 0;\r
- WRITE_MCR (SerialDevice->IsaIo, SerialDevice->BaseAddress, Mcr.Data);\r
+ if (SerialDevice->UseHalfHandshake) {\r
+ Mcr.Data = READ_MCR (SerialDevice->IsaIo, SerialDevice->BaseAddress);\r
+ Mcr.Bits.Rts = 1;\r
+ WRITE_MCR (SerialDevice->IsaIo, SerialDevice->BaseAddress, Mcr.Data);\r
+ }\r
+ } else {\r
+ IsaSerialFifoRemove (&SerialDevice->Transmit, &Data);\r
+ WRITE_THR (SerialDevice->IsaIo, SerialDevice->BaseAddress, Data);\r
}\r
}\r
} while (Lsr.Bits.Thre == 1 && !IsaSerialFifoEmpty (&SerialDevice->Transmit));\r