From 2bd88ebc4f37baf81d550e79b3e3118b0843e61c Mon Sep 17 00:00:00 2001
From: Dean Camera <dean@fourwalledcubicle.com>
Date: Wed, 6 May 2009 13:17:38 +0000
Subject: [PATCH] Minor correction to the DevChapter9.c handling of Set and
 Clear feature requests -- remote wake up requests now complete correctly
 rather than stalling the request.

---
 LUFA/Drivers/USB/LowLevel/DevChapter9.c | 47 ++++++++++++++-----------
 1 file changed, 27 insertions(+), 20 deletions(-)

diff --git a/LUFA/Drivers/USB/LowLevel/DevChapter9.c b/LUFA/Drivers/USB/LowLevel/DevChapter9.c
index 9c319fc07..f02d32ba3 100644
--- a/LUFA/Drivers/USB/LowLevel/DevChapter9.c
+++ b/LUFA/Drivers/USB/LowLevel/DevChapter9.c
@@ -274,6 +274,8 @@ static void USB_Device_ClearSetFeature(void)
 		case REQREC_DEVICE:
 			if ((uint8_t)USB_ControlRequest.wValue == FEATURE_REMOTE_WAKEUP)
 			  USB_RemoteWakeupEnabled = (USB_ControlRequest.bRequest == REQ_SetFeature);
+			else
+			  return;
 			
 			break;			
 #if !defined(CONTROL_ONLY_DEVICE)
@@ -282,33 +284,38 @@ static void USB_Device_ClearSetFeature(void)
 			{
 				uint8_t EndpointIndex = ((uint8_t)USB_ControlRequest.wIndex & ENDPOINT_EPNUM_MASK);
 				
-				if (EndpointIndex != ENDPOINT_CONTROLEP)
-				{
-					Endpoint_SelectEndpoint(EndpointIndex);
-
-					if (Endpoint_IsEnabled())
-					{				
-						if (USB_ControlRequest.bRequest == REQ_ClearFeature)
-						{
-							Endpoint_ClearStall();
-							Endpoint_ResetFIFO(EndpointIndex);
-							Endpoint_ResetDataToggle();
-						}
-						else
-						{
-							Endpoint_StallTransaction();						
-						}
+				if (EndpointIndex == ENDPOINT_CONTROLEP)
+				  return;
+
+				Endpoint_SelectEndpoint(EndpointIndex);
+
+				if (Endpoint_IsEnabled())
+				{				
+					if (USB_ControlRequest.bRequest == REQ_ClearFeature)
+					{
+						Endpoint_ClearStall();
+						Endpoint_ResetFIFO(EndpointIndex);
+						Endpoint_ResetDataToggle();
+					}
+					else
+					{
+						Endpoint_StallTransaction();						
 					}
-
-					Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP);
-					Endpoint_ClearSETUP();
-					Endpoint_ClearIN();
 				}
 			}
 			
 			break;
 #endif
 	}
+
+	Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP);
+
+	Endpoint_ClearSETUP();
+
+	Endpoint_ClearIN();
+
+	while (!(Endpoint_IsOUTReceived()));
+	Endpoint_ClearOUT();
 }
 
 #endif
-- 
GitLab