From ebdb1b37ca578d0086a77b62ab9159004232c349 Mon Sep 17 00:00:00 2001
From: Dean Camera <dean@fourwalledcubicle.com>
Date: Sun, 5 Sep 2010 08:24:56 +0000
Subject: [PATCH] Fix bug in Pipe_ConfigurePipe() breaking already configured
 pipes that was accidentally clearing the pipe's IN mode.

---
 LUFA/Drivers/USB/LowLevel/Pipe.c | 24 +++++++++++++++++-------
 1 file changed, 17 insertions(+), 7 deletions(-)

diff --git a/LUFA/Drivers/USB/LowLevel/Pipe.c b/LUFA/Drivers/USB/LowLevel/Pipe.c
index 5f1090245..79c21f24e 100644
--- a/LUFA/Drivers/USB/LowLevel/Pipe.c
+++ b/LUFA/Drivers/USB/LowLevel/Pipe.c
@@ -46,16 +46,25 @@ bool Pipe_ConfigurePipe(const uint8_t Number,
 {
 	uint8_t UPCFG0XTemp[PIPE_TOTAL_PIPES];
 	uint8_t UPCFG1XTemp[PIPE_TOTAL_PIPES];
+	uint8_t UPCFG2XTemp[PIPE_TOTAL_PIPES];
+	uint8_t UPCONXTemp[PIPE_TOTAL_PIPES];
+	uint8_t UPINRQXTemp[PIPE_TOTAL_PIPES];
 	
 	for (uint8_t PNum = 0; PNum < PIPE_TOTAL_PIPES; PNum++)
 	{
 		Pipe_SelectPipe(PNum);
 		UPCFG0XTemp[PNum] = UPCFG0X;
 		UPCFG1XTemp[PNum] = UPCFG1X;
+		UPCFG2XTemp[PNum] = UPCFG2X;
+		UPCONXTemp[PNum]  = UPCONX;
+		UPINRQXTemp[PNum] = UPINRQX;
 	}
 	
 	UPCFG0XTemp[Number] = ((Type << EPTYPE0) | Token | ((EndpointNumber & PIPE_EPNUM_MASK) << PEPNUM0));
 	UPCFG1XTemp[Number] = ((1 << ALLOC) | Banks | Pipe_BytesToEPSizeMask(Size));
+	UPCFG2XTemp[Number] = 0;
+	UPCONXTemp[Number]  = (1 << INMODE);
+	UPINRQXTemp[Number] = 0;
 	
 	for (uint8_t PNum = 0; PNum < PIPE_TOTAL_PIPES; PNum++)
 	{
@@ -74,16 +83,17 @@ bool Pipe_ConfigurePipe(const uint8_t Number,
 		Pipe_SelectPipe(PNum);		
 		Pipe_EnablePipe();
 
-		UPCFG0X = UPCFG0XTemp[PNum];
-		UPCFG1X = UPCFG1XTemp[PNum];
-		
+		UPCFG0X  = UPCFG0XTemp[PNum];
+		UPCFG1X  = UPCFG1XTemp[PNum];
+		UPCFG2X  = UPCFG2XTemp[PNum];
+		UPCONX  |= UPCONXTemp[PNum];
+		UPINRQX  = UPINRQXTemp[PNum];
+
 		if (!(Pipe_IsConfigured()))
 		  return false;
 	}
-	
-	Pipe_SelectPipe(Number);
-	Pipe_SetInfiniteINRequests();
-	
+		
+	Pipe_SelectPipe(Number);	
 	return true;
 }
 
-- 
GitLab