From ee5ea4ce2bc463206ed8fe01c71b31585c0cc280 Mon Sep 17 00:00:00 2001
From: Dean Camera <dean@fourwalledcubicle.com>
Date: Tue, 11 May 2010 13:45:23 +0000
Subject: Fix nasty bug in USBInterrupt.c which would cause a lockup if the
 control endpoint was not selected at the point the USB endpoint interrupt
 fires when INTERRUPT_CONTROL_ENDPOINT is defined.

---
 .../Host/Incomplete/BluetoothHost/Lib/ServiceDiscoveryProtocol.c  | 5 ++---
 LUFA/Drivers/USB/LowLevel/USBInterrupt.c                          | 8 ++++----
 2 files changed, 6 insertions(+), 7 deletions(-)

diff --git a/Demos/Host/Incomplete/BluetoothHost/Lib/ServiceDiscoveryProtocol.c b/Demos/Host/Incomplete/BluetoothHost/Lib/ServiceDiscoveryProtocol.c
index f7935cad0..bd649419a 100644
--- a/Demos/Host/Incomplete/BluetoothHost/Lib/ServiceDiscoveryProtocol.c
+++ b/Demos/Host/Incomplete/BluetoothHost/Lib/ServiceDiscoveryProtocol.c
@@ -183,8 +183,6 @@ static uint32_t ServiceDiscovery_GetDataElementSize(const void** DataElementHead
 	uint8_t SizeIndex = (*((uint8_t*)*DataElementHeader) & 0x07);
 	*DataElementHeader += sizeof(uint8_t);
 	
-	*ElementHeaderSize = 1;
-	
 	uint32_t ElementValue;
 	
 	switch (SizeIndex)
@@ -205,7 +203,8 @@ static uint32_t ServiceDiscovery_GetDataElementSize(const void** DataElementHead
 			*ElementHeaderSize  = (1 + sizeof(uint32_t));
 			break;
 		default:
-			ElementValue = (1UL << SizeIndex);
+			ElementValue = (1 << SizeIndex);
+			*ElementHeaderSize = 1;
 			break;
 	}
 	
diff --git a/LUFA/Drivers/USB/LowLevel/USBInterrupt.c b/LUFA/Drivers/USB/LowLevel/USBInterrupt.c
index 7edd3ce6a..43df5f61a 100644
--- a/LUFA/Drivers/USB/LowLevel/USBInterrupt.c
+++ b/LUFA/Drivers/USB/LowLevel/USBInterrupt.c
@@ -233,15 +233,15 @@ ISR(USB_GEN_vect, ISR_BLOCK)
 #if defined(INTERRUPT_CONTROL_ENDPOINT) && defined(USB_CAN_BE_DEVICE)
 ISR(USB_COM_vect, ISR_BLOCK)
 {
-	uint8_t PrevSelectedEndpoint = Endpoint_GetCurrentEndpoint();
+	uint8_t PrevSelectedEndpoint = Endpoint_GetCurrentEndpoint(); 
 
+	Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP);
 	USB_INT_Disable(USB_INT_RXSTPI);
 	sei();
+
 	USB_USBTask();
-	USB_INT_Enable(USB_INT_RXSTPI);
 
-	USB_INT_Clear(USB_INT_RXSTPI);
-	
+	USB_INT_Enable(USB_INT_RXSTPI);
 	Endpoint_SelectEndpoint(PrevSelectedEndpoint);
 }
 #endif
-- 
cgit v1.2.3