From d26a9ed5fd6fc60a0dfa61d04f5ae2bd7163a85d Mon Sep 17 00:00:00 2001
From: Dean Camera <dean@fourwalledcubicle.com>
Date: Thu, 28 Jan 2010 06:37:26 +0000
Subject: [PATCH] Be doubly-certain that the incomming CDC class driver's
 endpoint/pipe is flushed only once when the bank is empty.

---
 LUFA/Drivers/USB/Class/Device/CDC.c | 13 ++++++++++---
 LUFA/Drivers/USB/Class/Host/CDC.c   | 23 ++++++++++++++++-------
 2 files changed, 26 insertions(+), 10 deletions(-)

diff --git a/LUFA/Drivers/USB/Class/Device/CDC.c b/LUFA/Drivers/USB/Class/Device/CDC.c
index 16bc01549..b8a673f03 100644
--- a/LUFA/Drivers/USB/Class/Device/CDC.c
+++ b/LUFA/Drivers/USB/Class/Device/CDC.c
@@ -190,10 +190,17 @@ uint16_t CDC_Device_BytesReceived(USB_ClassInfo_CDC_Device_t* const CDCInterface
 
 	Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataOUTEndpointNumber);
 
-	if (Endpoint_IsOUTReceived() && !(Endpoint_BytesInEndpoint()))
-	  Endpoint_ClearOUT();
+	if (Endpoint_IsOUTReceived())
+	{
+		if (!(Endpoint_BytesInEndpoint()))
+		  Endpoint_ClearOUT();
 
-	return Endpoint_BytesInEndpoint();
+		return Endpoint_BytesInEndpoint();
+	}
+	else
+	{
+		return 0;
+	}
 }
 
 uint8_t CDC_Device_ReceiveByte(USB_ClassInfo_CDC_Device_t* CDCInterfaceInfo)
diff --git a/LUFA/Drivers/USB/Class/Host/CDC.c b/LUFA/Drivers/USB/Class/Host/CDC.c
index 8ad37de73..85864b05c 100644
--- a/LUFA/Drivers/USB/Class/Host/CDC.c
+++ b/LUFA/Drivers/USB/Class/Host/CDC.c
@@ -309,13 +309,22 @@ uint16_t CDC_Host_BytesReceived(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo
 	Pipe_SetPipeToken(PIPE_TOKEN_IN);
 	Pipe_Unfreeze();
 
-	if (Pipe_IsINReceived() && !(Pipe_BytesInPipe()))
-	  Pipe_ClearIN();
-	
-	BytesInPipe = Pipe_BytesInPipe();
-	Pipe_Freeze();
-	
-	return BytesInPipe;
+	if (Pipe_IsINReceived())
+	{
+		if (!(Pipe_BytesInPipe()))
+		  Pipe_ClearIN();
+		
+		BytesInPipe = Pipe_BytesInPipe();
+		Pipe_Freeze();
+		
+		return BytesInPipe;
+	}
+	else
+	{
+		Pipe_Freeze();
+		
+		return 0;
+	}
 }
 
 uint8_t CDC_Host_ReceiveByte(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo)
-- 
GitLab