From d1261468875f4772898c4395880735784e651d91 Mon Sep 17 00:00:00 2001
From: Dean Camera <dean@fourwalledcubicle.com>
Date: Sat, 8 Jan 2011 00:54:30 +0000
Subject: [PATCH] The FAST_STREAM_TRANSFERS compile time option has been
 removed due to lack of use and low cost/benefit ratio.

Add GCC_FORCE_POINTER_ACCESS() macro use to the RingBuffer library header, to attempt to force GCC into producing more efficient code for manipulating the buffers.
---
 LUFA/Drivers/Misc/RingBuffer.h                | 14 ++++---
 LUFA/Drivers/USB/HighLevel/EndpointStream.c   | 40 -------------------
 LUFA/Drivers/USB/HighLevel/PipeStream.c       | 40 -------------------
 .../HighLevel/Template/Template_Endpoint_RW.c | 40 -------------------
 .../USB/HighLevel/Template/Template_Pipe_RW.c | 40 -------------------
 LUFA/ManPages/ChangeLog.txt                   |  8 ++++
 LUFA/ManPages/CompileTimeTokens.txt           |  7 ----
 Projects/Webserver/makefile                   |  1 -
 8 files changed, 17 insertions(+), 173 deletions(-)

diff --git a/LUFA/Drivers/Misc/RingBuffer.h b/LUFA/Drivers/Misc/RingBuffer.h
index d9d3a8340..605f92c11 100644
--- a/LUFA/Drivers/Misc/RingBuffer.h
+++ b/LUFA/Drivers/Misc/RingBuffer.h
@@ -126,10 +126,10 @@
 		 */
 		static inline void RingBuffer_InitBuffer(RingBuffer_t* Buffer, uint8_t* const DataPtr, const uint16_t Size)
 		{
+			GCC_FORCE_POINTER_ACCESS(Buffer);
+
 			ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
-			{
-				GCC_FORCE_POINTER_ACCESS(Buffer);
-				
+			{	
 				Buffer->In     = DataPtr;
 				Buffer->Out    = DataPtr;
 				Buffer->Start  = &DataPtr[0];
@@ -203,9 +203,11 @@
 		 *  \param[in,out] Buffer  Pointer to a ring buffer structure to insert into.
 		 *  \param[in]     Data    Data element to insert into the buffer.
 		 */
-		static inline void RingBuffer_Insert(RingBuffer_t* const Buffer,
+		static inline void RingBuffer_Insert(RingBuffer_t* Buffer,
 		                                     const uint8_t Data)
 		{
+			GCC_FORCE_POINTER_ACCESS(Buffer);
+
 			*Buffer->In = Data;
 
 			if (++Buffer->In == Buffer->End)
@@ -227,8 +229,10 @@
 		 *
 		 *  \return Next data element stored in the buffer.
 		 */
-		static inline uint8_t RingBuffer_Remove(RingBuffer_t* const Buffer)
+		static inline uint8_t RingBuffer_Remove(RingBuffer_t* Buffer)
 		{
+			GCC_FORCE_POINTER_ACCESS(Buffer);
+		
 			uint8_t Data = *Buffer->Out;
 
 			if (++Buffer->Out == Buffer->End)
diff --git a/LUFA/Drivers/USB/HighLevel/EndpointStream.c b/LUFA/Drivers/USB/HighLevel/EndpointStream.c
index 76875b258..c2bb3922c 100644
--- a/LUFA/Drivers/USB/HighLevel/EndpointStream.c
+++ b/LUFA/Drivers/USB/HighLevel/EndpointStream.c
@@ -44,46 +44,6 @@ uint8_t Endpoint_Discard_Stream(uint16_t Length
 	if ((ErrorCode = Endpoint_WaitUntilReady()))
 	  return ErrorCode;
 
-	#if defined(FAST_STREAM_TRANSFERS)
-	uint8_t BytesRemToAlignment = (Endpoint_BytesInEndpoint() & 0x07);
-
-	if (Length >= 8)
-	{
-		Length -= BytesRemToAlignment;
-
-		switch (BytesRemToAlignment)
-		{
-			default:
-				do
-				{
-					if (!(Endpoint_IsReadWriteAllowed()))
-					{
-						Endpoint_ClearOUT();
-
-						#if !defined(NO_STREAM_CALLBACKS)
-						if ((Callback != NULL) && (Callback() == STREAMCALLBACK_Abort))
-						  return ENDPOINT_RWSTREAM_CallbackAborted;
-						#endif
-
-						if ((ErrorCode = Endpoint_WaitUntilReady()))
-						  return ErrorCode;
-					}
-
-					Length -= 8;
-					
-					Endpoint_Discard_Byte();
-			case 7: Endpoint_Discard_Byte();
-			case 6: Endpoint_Discard_Byte();
-			case 5: Endpoint_Discard_Byte();
-			case 4: Endpoint_Discard_Byte();
-			case 3: Endpoint_Discard_Byte();
-			case 2: Endpoint_Discard_Byte();
-			case 1:	Endpoint_Discard_Byte();
-				} while (Length >= 8);	
-		}
-	}
-	#endif
-
 	while (Length)
 	{
 		if (!(Endpoint_IsReadWriteAllowed()))
diff --git a/LUFA/Drivers/USB/HighLevel/PipeStream.c b/LUFA/Drivers/USB/HighLevel/PipeStream.c
index 624340017..98c57206f 100644
--- a/LUFA/Drivers/USB/HighLevel/PipeStream.c
+++ b/LUFA/Drivers/USB/HighLevel/PipeStream.c
@@ -45,46 +45,6 @@ uint8_t Pipe_Discard_Stream(uint16_t Length
 	if ((ErrorCode = Pipe_WaitUntilReady()))
 	  return ErrorCode;
 
-	#if defined(FAST_STREAM_TRANSFERS)
-	uint8_t BytesRemToAlignment = (Pipe_BytesInPipe() & 0x07);
-
-	if (Length >= 8)
-	{
-		Length -= BytesRemToAlignment;
-
-		switch (BytesRemToAlignment)
-		{
-			default:
-				do
-				{
-					if (!(Pipe_IsReadWriteAllowed()))
-					{
-						Pipe_ClearIN();
-							
-						#if !defined(NO_STREAM_CALLBACKS)
-						if ((Callback != NULL) && (Callback() == STREAMCALLBACK_Abort))
-						  return PIPE_RWSTREAM_CallbackAborted;
-						#endif
-
-						if ((ErrorCode = Pipe_WaitUntilReady()))
-						  return ErrorCode;
-					}
-
-					Length -= 8;
-					
-					Pipe_Discard_Byte();
-			case 7: Pipe_Discard_Byte();
-			case 6: Pipe_Discard_Byte();
-			case 5: Pipe_Discard_Byte();
-			case 4: Pipe_Discard_Byte();
-			case 3: Pipe_Discard_Byte();
-			case 2: Pipe_Discard_Byte();
-			case 1:	Pipe_Discard_Byte();
-				} while (Length >= 8);	
-		}
-	}
-	#endif
-
 	while (Length)
 	{
 		if (!(Pipe_IsReadWriteAllowed()))
diff --git a/LUFA/Drivers/USB/HighLevel/Template/Template_Endpoint_RW.c b/LUFA/Drivers/USB/HighLevel/Template/Template_Endpoint_RW.c
index 6657f38eb..8a97e1565 100644
--- a/LUFA/Drivers/USB/HighLevel/Template/Template_Endpoint_RW.c
+++ b/LUFA/Drivers/USB/HighLevel/Template/Template_Endpoint_RW.c
@@ -8,46 +8,6 @@ uint8_t TEMPLATE_FUNC_NAME (TEMPLATE_BUFFER_TYPE Buffer,
 	if ((ErrorCode = Endpoint_WaitUntilReady()))
 	  return ErrorCode;
 
-	#if defined(FAST_STREAM_TRANSFERS)
-	uint8_t BytesRemToAlignment = (Endpoint_BytesInEndpoint() & 0x07);
-
-	if (Length >= 8)
-	{
-		Length -= BytesRemToAlignment;
-
-		switch (BytesRemToAlignment)
-		{
-			default:
-				do
-				{
-					if (!(Endpoint_IsReadWriteAllowed()))
-					{
-						TEMPLATE_CLEAR_ENDPOINT();
-
-						#if !defined(NO_STREAM_CALLBACKS)
-						if ((Callback != NULL) && (Callback() == STREAMCALLBACK_Abort))
-						  return ENDPOINT_RWSTREAM_CallbackAborted;
-						#endif
-
-						if ((ErrorCode = Endpoint_WaitUntilReady()))
-						  return ErrorCode;
-					}
-
-					Length -= 8;
-
-					TEMPLATE_TRANSFER_BYTE(DataStream);
-			case 7: TEMPLATE_TRANSFER_BYTE(DataStream);
-			case 6: TEMPLATE_TRANSFER_BYTE(DataStream);
-			case 5: TEMPLATE_TRANSFER_BYTE(DataStream);
-			case 4: TEMPLATE_TRANSFER_BYTE(DataStream);
-			case 3: TEMPLATE_TRANSFER_BYTE(DataStream);
-			case 2: TEMPLATE_TRANSFER_BYTE(DataStream);
-			case 1:	TEMPLATE_TRANSFER_BYTE(DataStream);
-				} while (Length >= 8);
-		}
-	}
-	#endif
-
 	while (Length)
 	{
 		if (!(Endpoint_IsReadWriteAllowed()))
diff --git a/LUFA/Drivers/USB/HighLevel/Template/Template_Pipe_RW.c b/LUFA/Drivers/USB/HighLevel/Template/Template_Pipe_RW.c
index a998469d2..eebe52f12 100644
--- a/LUFA/Drivers/USB/HighLevel/Template/Template_Pipe_RW.c
+++ b/LUFA/Drivers/USB/HighLevel/Template/Template_Pipe_RW.c
@@ -10,46 +10,6 @@ uint8_t TEMPLATE_FUNC_NAME (TEMPLATE_BUFFER_TYPE Buffer,
 	if ((ErrorCode = Pipe_WaitUntilReady()))
 	  return ErrorCode;
 
-	#if defined(FAST_STREAM_TRANSFERS)
-	uint8_t BytesRemToAlignment = (Pipe_BytesInPipe() & 0x07);
-
-	if (Length >= 8)
-	{
-		Length -= BytesRemToAlignment;
-
-		switch (BytesRemToAlignment)
-		{
-			default:
-				do
-				{
-					if (!(Pipe_IsReadWriteAllowed()))
-					{
-						TEMPLATE_CLEAR_PIPE();
-
-						#if !defined(NO_STREAM_CALLBACKS)
-						if ((Callback != NULL) && (Callback() == STREAMCALLBACK_Abort))
-						  return PIPE_RWSTREAM_CallbackAborted;
-						#endif
-
-						if ((ErrorCode = Pipe_WaitUntilReady()))
-						  return ErrorCode;
-					}
-
-					Length -= 8;
-
-					TEMPLATE_TRANSFER_BYTE(DataStream);
-			case 7: TEMPLATE_TRANSFER_BYTE(DataStream);
-			case 6: TEMPLATE_TRANSFER_BYTE(DataStream);
-			case 5: TEMPLATE_TRANSFER_BYTE(DataStream);
-			case 4: TEMPLATE_TRANSFER_BYTE(DataStream);
-			case 3: TEMPLATE_TRANSFER_BYTE(DataStream);
-			case 2: TEMPLATE_TRANSFER_BYTE(DataStream);
-			case 1:	TEMPLATE_TRANSFER_BYTE(DataStream);
-				} while (Length >= 8);
-		}
-	}
-	#endif
-
 	while (Length)
 	{
 		if (!(Pipe_IsReadWriteAllowed()))
diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt
index 87aa5eedb..dc0ca01fd 100644
--- a/LUFA/ManPages/ChangeLog.txt
+++ b/LUFA/ManPages/ChangeLog.txt
@@ -25,6 +25,7 @@
   *   - Added new *_ENUMERROR_PipeConfigurationFailed error codes for the *_Host_ConfigurePipes() routines
   *   - The USARTStream global is now public and documented in the SerialStream module, allowing for the serial USART
   *     stream to be accessed via its handle rather than via the implicit stdout and stdin streams
+  *   - The FAST_STREAM_TRANSFERS compile time option has been removed due to lack of use and low cost/benefit ratio
   *  - Library Applications:
   *   - Changed the XPLAINBridge software UART to use the regular timer CTC mode instead of the alternative CTC mode
   *     via the Input Capture register, to reduce user confusion
@@ -49,6 +50,7 @@
   *   - Fixed possible programming problem in the AVRISP-MKII clone project when programming specific patterns into a target
   *     memory space that is only byte (not page) addressable
   *
+  *
   *  \section Sec_ChangeLog101122 Version 101122
   *  <b>New:</b>
   *  - Core:
@@ -154,6 +156,7 @@
   *    - Fixed incorrect PollingIntervalMS values in the demo/project/bootloader endpoint descriptors (thanks to MCS Electronics)
   *    - Fixed AVRISP-MKII clone project not starting the target's program automatically after exiting TPI programming mode
   *
+  *
   *  \section Sec_ChangeLog100807 Version 100807
   *  <b>New:</b>
   *  - Added new ADC_DisableChannel() function (thanks to Mich Davis)
@@ -218,6 +221,7 @@
   *  - Fixed software application start command broken in the DFU class bootloader when dfu-programmer is used due to application
   *    start address corruption
   *
+  *
   *  \section Sec_ChangeLog100513 Version 100513
   *  <b>New:</b>
   *  - Added incomplete MIDIToneGenerator project
@@ -293,6 +297,7 @@
   *    request is being processed, causing possible lockups if a USB interrupt occurs during a transfer
   *  - Remove incorrect Abstract Call Management class specific descriptor from the CDC demos, bootloaders and projects
   *
+  *
   *  \section Sec_ChangeLog100219 Version 100219
   *
   *  <b>New:</b>
@@ -349,6 +354,7 @@
   *  - Fixed AVRISP project not extending the command delay after each successful page/word/byte program
   *  - Fixed accuracy of the SERIAL_UBBRVAL() and SERIAL_2X_UBBRVAL() macros for higher baud rates (thanks to Renaud Cerrato)
   *
+  *
   *  \section Sec_ChangeLog091223 Version 091223
   *
   *  <b>New:</b>
@@ -414,6 +420,7 @@
   *  - Fixed AVRISP project timeouts not checking for the correct timeout period (thanks to Carl Ott)
   *  - Fixed STK525 Dataflash driver using incorrect bit-shifting for Dataflash addresses (thanks to Tim Mitchell)
   *
+  *
   *  \section Sec_ChangeLog091122 Version 091122
   *
   *  <b>New:</b>
@@ -461,6 +468,7 @@
   *  - Fixed LowLevel Keyboard demo not saving the issues report only after it has been sent to the host
   *  - Fixed Endpoint_Write_Control_Stream_* functions not sending a terminating IN when given data Length is zero
   *
+  *
   *  \section Sec_ChangeLog090924 Version 090924
   *
   *  <b>New:</b>
diff --git a/LUFA/ManPages/CompileTimeTokens.txt b/LUFA/ManPages/CompileTimeTokens.txt
index b120617e0..70ad1a935 100644
--- a/LUFA/ManPages/CompileTimeTokens.txt
+++ b/LUFA/ManPages/CompileTimeTokens.txt
@@ -90,13 +90,6 @@
  *  by defining this token, reducing the compiled binary size. When removed, the stream functions no longer accept a callback function as
  *  a parameter.
  *
- *  <b>FAST_STREAM_TRANSFERS</b> - ( \ref Group_EndpointPacketManagement , \ref Group_PipePacketManagement )\n
- *  By default, streams are transferred internally via a loop, sending or receiving one byte per iteration before checking for a bank full
- *  or empty condition. This allows for multiple stream functions to be chained together easily, as there are no alignment issues. However,
- *  this can lead to heavy performance penalties in applications where large streams are used frequently. When this compile time option is
- *  used, bytes are sent or received in groups of 8 bytes at a time increasing performance at the expense of a larger flash memory consumption
- *  due to the extra code required to deal with byte alignment.
- *
  *  <b>USE_STATIC_OPTIONS</b>=<i>x</i> - ( \ref Group_USBManagement ) \n
  *  By default, the USB_Init() function accepts dynamic options at runtime to alter the library behaviour, including whether the USB pad
  *  voltage regulator is enabled, and the device speed when in device mode. By defining this token to a mask comprised of the USB options
diff --git a/Projects/Webserver/makefile b/Projects/Webserver/makefile
index 1544218f2..acc371ad5 100644
--- a/Projects/Webserver/makefile
+++ b/Projects/Webserver/makefile
@@ -120,7 +120,6 @@ LUFA_OPTS  = -D FIXED_CONTROL_ENDPOINT_SIZE=8
 LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1
 LUFA_OPTS += -D DEVICE_STATE_AS_GPIOR=0
 LUFA_OPTS += -D USE_FLASH_DESCRIPTORS
-LUFA_OPTS += -D FAST_STREAM_TRANSFERS
 LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
 LUFA_OPTS += -D INTERRUPT_CONTROL_ENDPOINT
 
-- 
GitLab