]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Enhanced module to handle half handshake flow control.
authorgikidy <gikidy@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 8 Jul 2009 09:29:08 +0000 (09:29 +0000)
committergikidy <gikidy@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 8 Jul 2009 09:29:08 +0000 (09:29 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@8816 6f19259b-4bc3-4df7-8a09-765794883524

IntelFrameworkModulePkg/Bus/Isa/IsaSerialDxe/IsaSerialDxe.inf
IntelFrameworkModulePkg/Bus/Isa/IsaSerialDxe/Serial.c
IntelFrameworkModulePkg/Bus/Isa/IsaSerialDxe/Serial.h
IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec
IntelFrameworkModulePkg/IntelFrameworkModulePkg.dsc

index aa7c315e1d8584927dfec82ee95d23d66d509c14..4c8c08fd539370a3b1408edb89e3f02b62222b63 100644 (file)
@@ -65,3 +65,4 @@
   gEfiMdePkgTokenSpaceGuid.PcdUartDefaultDataBits|8\r
   gEfiMdePkgTokenSpaceGuid.PcdUartDefaultParity|1\r
   gEfiMdePkgTokenSpaceGuid.PcdUartDefaultStopBits|1\r
+  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdIsaBusSerialUseHalfHandshake|FALSE\r
index f9d08ce3a0cc6831973b14408b13102d21c9471b..65f072356bdd2f44010d47ea62f8b4f1deaad706 100644 (file)
@@ -83,7 +83,8 @@ SERIAL_DEV  gSerialDevTempate = {
   FALSE,\r
   FALSE,\r
   Uart16550A,\r
-  NULL\r
+  NULL,\r
+  FixedPcdGetBool (PcdIsaBusSerialUseHalfHandshake)   //UseHalfHandshake\r
 };\r
 \r
 /**\r
@@ -801,6 +802,18 @@ IsaSerialReceiveTransmit (
     } 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
@@ -821,23 +834,21 @@ IsaSerialReceiveTransmit (
               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
@@ -861,17 +872,19 @@ IsaSerialReceiveTransmit (
         //\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
@@ -881,28 +894,22 @@ IsaSerialReceiveTransmit (
             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
index c7f2105f6264095f5f45cd08f2574ab82c99e2aa..8d985a408f9c879a2a9130a3ea4024419a4d6c84 100644 (file)
@@ -109,6 +109,7 @@ typedef struct {
   BOOLEAN                                HardwareFlowControl;\r
   EFI_UART_TYPE                          Type;\r
   EFI_UNICODE_STRING_TABLE               *ControllerNameTable;\r
+  BOOLEAN                                UseHalfHandshake;\r
 } SERIAL_DEV;\r
 \r
 #define SERIAL_DEV_FROM_THIS(a) CR (a, SERIAL_DEV, SerialIo, SERIAL_DEV_SIGNATURE)\r
index da4459022c5bb71b4a658f8f03591c5fe314e551..9e6a9bf1caad407b1ecefe8b3d4ed917d9751648 100644 (file)
   #  The default value in DxePhase is 128 KBytes.\r
   gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdStatusCodeMemorySize|1|UINT16|0x00010025\r
 \r
+  ## This PCD specifies whether Serial device use half hand shake.\r
+  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdIsaBusSerialUseHalfHandshake|FALSE|BOOLEAN|0x00010043\r
+\r
 [PcdsDynamic]\r
   ## PCD is used to mark if the machine has complete one boot cycle before.\r
   #  After the complete boot, the variable BootState will be set to TRUE. \r
index edd151a492e49fbc5a8d3d457e989c99b3ddfd9c..a91034450434807303cb62cbc57a427b2ddbb858 100644 (file)
   gEfiMdePkgTokenSpaceGuid.PcdUartDefaultParity|1\r
   gEfiMdePkgTokenSpaceGuid.PcdUartDefaultStopBits|1\r
   gEfiMdePkgTokenSpaceGuid.PcdDefaultTerminalType|0\r
-\r
+  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdIsaBusSerialUseHalfHandshake|FALSE\r
+  \r
 [PcdsDynamicDefault.PEIM.DEFAULT]\r
   gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdStatusCodeMemorySize|1\r
 \r