Tidy up Ethernet driver.
diff --git a/Demo/CORTEX_LPC1768_GCC_Rowley/ParTest.c b/Demo/CORTEX_LPC1768_GCC_Rowley/ParTest.c
index c789356..aaba6a0 100644
--- a/Demo/CORTEX_LPC1768_GCC_Rowley/ParTest.c
+++ b/Demo/CORTEX_LPC1768_GCC_Rowley/ParTest.c
@@ -55,7 +55,9 @@
 /* Demo application includes. */

 #include "partest.h"

 

-#define partstFIRST_IO			( ( unsigned portLONG ) 0x04 )

+#define partstFIRST_IO			( ( unsigned long ) 0x04 )

+#define partstFIO2_BITS			( ( unsigned long ) 0x0000007C )

+#define partstFIO1_BITS			( ( unsigned long ) 0xB0000000 )

 #define partstNUM_LEDS			( 5 )

 #define partstALL_OUTPUTS_OFF	( ( unsigned portLONG ) 0xff )

 

@@ -65,13 +67,13 @@
 

 void vParTestInitialise( void )

 {

-	PINSEL10 = 0;

-	FIO2DIR  = 0x000000FF;

-	FIO2MASK = 0x00000000;

-	FIO2CLR  = 0xFF;

-	SCS |= (1<<0); //fast mode for port 0 and 1

+	/* LEDs on ports 1 and 2 to output. */

+	FIO2DIR  = partstFIO2_BITS;

+    FIO1DIR  = partstFIO1_BITS;

 

-    FIO2CLR = partstALL_OUTPUTS_OFF;

+	/* Start will all LEDs off. */

+    FIO1CLR = partstFIO1_BITS;

+    FIO2CLR = partstFIO2_BITS;

 }

 /*-----------------------------------------------------------*/

 

diff --git a/Demo/CORTEX_LPC1768_GCC_Rowley/RTOSDemo.hzs b/Demo/CORTEX_LPC1768_GCC_Rowley/RTOSDemo.hzs
index df6f6f4..bb73946 100644
--- a/Demo/CORTEX_LPC1768_GCC_Rowley/RTOSDemo.hzs
+++ b/Demo/CORTEX_LPC1768_GCC_Rowley/RTOSDemo.hzs
@@ -18,10 +18,6 @@
  <Project>
   <ProjectSessionItem path="RTOSDemo" name="unnamed" />
   <ProjectSessionItem path="RTOSDemo;RTOSDemo" name="unnamed" />
-  <ProjectSessionItem path="RTOSDemo;RTOSDemo;Source Files" name="unnamed" />
-  <ProjectSessionItem path="RTOSDemo;RTOSDemo;Source Files;Common Demo Tasks" name="unnamed" />
-  <ProjectSessionItem path="RTOSDemo;RTOSDemo;Source Files;FreeRTOS" name="unnamed" />
-  <ProjectSessionItem path="RTOSDemo;RTOSDemo;Source Files;WEB Server" name="unnamed" />
  </Project>
  <Register1>
   <RegisterWindow openNodes="CPU;CPU/xPSR;CPU/CFBP;CPU/CFBP/CONTROL[0];CPU/CFBP/CONTROL[1]" binaryNodes="" unsignedNodes="" visibleGroups="CPU" decimalNodes="" octalNodes="" asciiNodes="" />
@@ -52,12 +48,7 @@
   <Watches active="0" update="Never" />
  </Watch4>
  <Files>
-  <SessionOpenFile useTextEdit="1" useBinaryEdit="0" codecName="Latin1" x="0" debugPath="C:\E\Dev\FreeRTOS\WorkingCopy3\Demo\CORTEX_LPC1768_GCC_Rowley\webserver\emac.c" y="523" path="C:\E\Dev\FreeRTOS\WorkingCopy3\Demo\CORTEX_LPC1768_GCC_Rowley\webserver\emac.c" left="0" selected="0" name="unnamed" top="489" />
-  <SessionOpenFile useTextEdit="1" useBinaryEdit="0" codecName="Latin1" x="0" debugPath="C:\E\Dev\FreeRTOS\WorkingCopy3\Demo\CORTEX_LPC1768_GCC_Rowley\main.c" y="172" path="C:\E\Dev\FreeRTOS\WorkingCopy3\Demo\CORTEX_LPC1768_GCC_Rowley\main.c" left="0" selected="1" name="unnamed" top="355" />
-  <SessionOpenFile useTextEdit="1" useBinaryEdit="0" codecName="Latin1" x="0" debugPath="C:\E\Dev\FreeRTOS\WorkingCopy3\Demo\CORTEX_LPC1768_GCC_Rowley\webserver\uIP_Task.c" y="166" path="C:\E\Dev\FreeRTOS\WorkingCopy3\Demo\CORTEX_LPC1768_GCC_Rowley\webserver\uIP_Task.c" left="0" selected="0" name="unnamed" top="138" />
-  <SessionOpenFile useTextEdit="1" useBinaryEdit="0" codecName="Latin1" x="8" debugPath="C:\E\Dev\FreeRTOS\WorkingCopy3\Demo\CORTEX_LPC1768_GCC_Rowley\webserver\EthDev_LPC17xx.h" y="277" path="C:\E\Dev\FreeRTOS\WorkingCopy3\Demo\CORTEX_LPC1768_GCC_Rowley\webserver\EthDev_LPC17xx.h" left="0" selected="0" name="unnamed" top="13" />
-  <SessionOpenFile useTextEdit="1" useBinaryEdit="0" codecName="Latin1" x="0" debugPath="C:\E\Dev\FreeRTOS\WorkingCopy3\Source\queue.c" y="1049" path="C:\E\Dev\FreeRTOS\WorkingCopy3\Source\queue.c" left="0" selected="0" name="unnamed" top="1027" />
-  <SessionOpenFile useTextEdit="1" useBinaryEdit="0" codecName="Latin1" x="0" debugPath="C:\E\Dev\FreeRTOS\WorkingCopy3\Demo\Common\Minimal\integer.c" y="155" path="C:\E\Dev\FreeRTOS\WorkingCopy3\Demo\Common\Minimal\integer.c" left="0" selected="0" name="unnamed" top="133" />
+  <SessionOpenFile useTextEdit="1" useBinaryEdit="0" codecName="Latin1" x="28" debugPath="C:\E\Dev\FreeRTOS\WorkingCopy3\Demo\CORTEX_LPC1768_GCC_Rowley\main.c" y="15" path="C:\E\Dev\FreeRTOS\WorkingCopy3\Demo\CORTEX_LPC1768_GCC_Rowley\main.c" left="0" selected="1" name="unnamed" top="10" />
  </Files>
  <ARMCrossStudioWindow activeProject="RTOSDemo" autoConnectTarget="Amontec JTAGkey" debugSearchFileMap="" fileDialogInitialDirectory="C:\E\Dev\FreeRTOS\WorkingCopy3\Demo\CORTEX_LPC1768_GCC_Rowley\webserver" fileDialogDefaultFilter="*.*" autoConnectCapabilities="388991" debugSearchPath="" buildConfiguration="THUMB Flash Debug" />
 </session>
diff --git a/Demo/CORTEX_LPC1768_GCC_Rowley/main.c b/Demo/CORTEX_LPC1768_GCC_Rowley/main.c
index 049897b..3414ee2 100644
--- a/Demo/CORTEX_LPC1768_GCC_Rowley/main.c
+++ b/Demo/CORTEX_LPC1768_GCC_Rowley/main.c
@@ -165,8 +165,6 @@
 /* The queue used to send messages to the LCD task. */

 xQueueHandle xLCDQueue;

 

-

-

 /*-----------------------------------------------------------*/

 

 int main( void )

@@ -186,7 +184,6 @@
     vStartGenericQueueTasks( mainGEN_QUEUE_TASK_PRIORITY );

     vStartQueuePeekTasks();

     vStartRecursiveMutexTasks();

-

 	vStartLEDFlashTasks( mainFLASH_TASK_PRIORITY );

 

 	/* Create the uIP task.  The WEB server runs in this task. */

@@ -356,10 +353,8 @@
 	/*  Setup the peripheral bus to be the same as the PLL output (64 MHz). */

 	PCLKSEL0 = 0x05555555;

 

-	/* Configure LED GPIOs as outputs. */

-	FIO2DIR  = 0xff;

-	FIO2CLR  = 0xff;

-	FIO2MASK = 0;

+	/* Configure the LEDs. */

+	vParTestInitialise();

 }

 /*-----------------------------------------------------------*/

 

diff --git a/Demo/CORTEX_LPC1768_GCC_Rowley/webserver/EthDev.h b/Demo/CORTEX_LPC1768_GCC_Rowley/webserver/EthDev.h
index b2a949c..f67789f 100644
--- a/Demo/CORTEX_LPC1768_GCC_Rowley/webserver/EthDev.h
+++ b/Demo/CORTEX_LPC1768_GCC_Rowley/webserver/EthDev.h
@@ -90,20 +90,22 @@
    EthDev_STATUS (*LinkChk)    (void);

 } EthDev_IOB;

 

-// prototypes

-portBASE_TYPE	Init_EMAC(void);

-unsigned short 	ReadFrameBE_EMAC(void);

-void           	CopyToFrame_EMAC(void *Source, unsigned int Size);

-void           	CopyFromFrame_EMAC(void *Dest, unsigned short Size);

-void           	DummyReadFrame_EMAC(unsigned short Size);

-unsigned short 	StartReadFrame(void);

-void           	EndReadFrame(void);

-unsigned int   	CheckFrameReceived(void);

-void           	RequestSend(void);

-unsigned int   	Rdy4Tx(void);

-void           	DoSend_EMAC(unsigned short FrameSize);

-void 			vEMACWaitForInput( void );

+

+/*

+ * Look for received data.  If data is found then uip_buf is assigned to the

+ * new data and the length of the data is returned.  If no data is found then

+ * uip_buf is not updated and 0 is returned.

+ */

 unsigned long 	ulGetEMACRxData( void );

+

+/*

+ * Send usTxDataLen bytes from uip_buf.

+ */

 void vSendEMACTxData( unsigned short usTxDataLen );

 

+/*

+ * Prepare the Ethernet hardware ready for TCP/IP comms.

+ */

+long lEMACInit(void);

+

 #endif

diff --git a/Demo/CORTEX_LPC1768_GCC_Rowley/webserver/emac.c b/Demo/CORTEX_LPC1768_GCC_Rowley/webserver/emac.c
index 5e350ed..94de9bf 100644
--- a/Demo/CORTEX_LPC1768_GCC_Rowley/webserver/emac.c
+++ b/Demo/CORTEX_LPC1768_GCC_Rowley/webserver/emac.c
@@ -1,34 +1,76 @@
-/******************************************************************

- *****                                                        *****

- *****  Ver.: 1.0                                             *****

- *****  Date: 07/05/2001                                      *****

- *****  Auth: Andreas Dannenberg                              *****

- *****        HTWK Leipzig                                    *****

- *****        university of applied sciences                  *****

- *****        Germany                                         *****

- *****  Func: ethernet packet-driver for use with LAN-        *****

- *****        controller CS8900 from Crystal/Cirrus Logic     *****

- *****                                                        *****

- *****  Keil: Module modified for use with Philips            *****

- *****        LPC2378 EMAC Ethernet controller                *****

- *****                                                        *****

- ******************************************************************/

+/*

+	FreeRTOS.org V5.3.1 - Copyright (C) 2003-2009 Richard Barry.

 

-/* Adapted from file originally written by Andreas Dannenberg.  Supplied with permission. */

+	This file is part of the FreeRTOS.org distribution.

+

+	FreeRTOS.org is free software; you can redistribute it and/or modify it

+	under the terms of the GNU General Public License (version 2) as published

+	by the Free Software Foundation and modified by the FreeRTOS exception.

+	**NOTE** The exception to the GPL is included to allow you to distribute a

+	combined work that includes FreeRTOS.org without being obliged to provide

+	the source code for any proprietary components.  Alternative commercial

+	license and support terms are also available upon request.  See the

+	licensing section of http://www.FreeRTOS.org for full details.

+

+	FreeRTOS.org is distributed in the hope that it will be useful,	but WITHOUT

+	ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or

+	FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for

+	more details.

+

+	You should have received a copy of the GNU General Public License along

+	with FreeRTOS.org; if not, write to the Free Software Foundation, Inc., 59

+	Temple Place, Suite 330, Boston, MA  02111-1307  USA.

+

+

+	***************************************************************************

+	*                                                                         *

+	* Get the FreeRTOS eBook!  See http://www.FreeRTOS.org/Documentation      *

+	*                                                                         *

+	* This is a concise, step by step, 'hands on' guide that describes both   *

+	* general multitasking concepts and FreeRTOS specifics. It presents and   *

+	* explains numerous examples that are written using the FreeRTOS API.     *

+	* Full source code for all the examples is provided in an accompanying    *

+	* .zip file.                                                              *

+	*                                                                         *

+	***************************************************************************

+

+	1 tab == 4 spaces!

+

+	Please ensure to read the configuration and relevant port sections of the

+	online documentation.

+

+	http://www.FreeRTOS.org - Documentation, latest information, license and

+	contact details.

+

+	http://www.SafeRTOS.com - A version that is certified for use in safety

+	critical systems.

+

+	http://www.OpenRTOS.com - Commercial support, development, porting,

+	licensing and training services.

+*/

+

+/* Originally adapted from file written by Andreas Dannenberg.  Supplied with permission. */

+

+/* Kernel includes. */

 #include "FreeRTOS.h"

-#include "semphr.h"

 #include "task.h"

+#include "semphr.h"

+

+/* Hardware specific includes. */

 #include "LPC17xx_defs.h"

 #include "EthDev_LPC17xx.h"

 

-#define emacPINSEL2_VALUE 0x50150105

-

+/* Time to wait between each inspection of the link status. */

 #define emacWAIT_FOR_LINK_TO_ESTABLISH ( 500 / portTICK_RATE_MS )

+

+/* Short delay used in several places during the initialisation process. */

 #define emacSHORT_DELAY				   ( 2 )

 

+/* Hardware specific bit definitions. */

 #define emacLINK_ESTABLISHED		( 0x0001 )

 #define emacFULL_DUPLEX_ENABLED		( 0x0004 )

 #define emac10BASE_T_MODE			( 0x0002 )

+#define emacPINSEL2_VALUE 0x50150105

 

 /* If no buffers are available, then wait this long before looking again.... */

 #define emacBUFFER_WAIT_DELAY	( 3 / portTICK_RATE_MS )

@@ -36,24 +78,63 @@
 /* ...and don't look more than this many times. */

 #define emacBUFFER_WAIT_ATTEMPTS	( 30 )

 

+/* Index to the Tx descriptor that is always used first for every Tx.  The second

+descriptor is then used to re-send in order to speed up the uIP Tx process. */

 #define emacTX_DESC_INDEX			( 0 )

 

-/* The semaphore used to wake the uIP task when data arives. */

-extern xSemaphoreHandle xEMACSemaphore;

+/*-----------------------------------------------------------*/

 

-static unsigned short	*rptr;

-static unsigned short	*tptr;

-

+/*

+ * Configure both the Rx and Tx descriptors during the init process.

+ */

 static void prvInitDescriptors( void );

+

+/*

+ * Setup the IO and peripherals required for Ethernet communication.

+ */

 static void prvSetupEMACHardware( void );

+

+/*

+ * Control the auto negotiate process.

+ */

 static void prvConfigurePHY( void );

+

+/*

+ * Wait for a link to be established, then setup the PHY according to the link

+ * parameters.

+ */

 static long prvSetupLinkStatus( void );

+

+/*

+ * Search the pool of buffers to find one that is free.  If a buffer is found

+ * mark it as in use before returning its address.

+ */

 static unsigned char *prvGetNextBuffer( void );

+

+/*

+ * Return an allocated buffer to the pool of free buffers.

+ */

 static void prvReturnBuffer( unsigned char *pucBuffer );

 

-/* Each ucBufferInUse index corresponds to a position in the same index in the

-ucMACBuffers array.  If the index contains a 1 then the buffer within

-ucMACBuffers is in use, if it contains a 0 then the buffer is free. */

+/*

+ * Send lValue to the lPhyReg within the PHY.

+ */

+static long prvWritePHY( long lPhyReg, long lValue );

+

+/*

+ * Read a value from ucPhyReg within the PHY.  *plStatus will be set to

+ * pdFALSE if there is an error.

+ */

+static unsigned short prvReadPHY( unsigned char ucPhyReg, long *plStatus );

+

+/*-----------------------------------------------------------*/

+

+/* The semaphore used to wake the uIP task when data arrives. */

+extern xSemaphoreHandle xEMACSemaphore;

+

+/* Each ucBufferInUse index corresponds to a position in the pool of buffers.

+If the index contains a 1 then the buffer within pool is in use, if it

+contains a 0 then the buffer is free. */

 static unsigned char ucBufferInUse[ ETH_NUM_BUFFERS ] = { pdFALSE };

 

 /* The uip_buffer is not a fixed array, but instead gets pointed to the buffers

@@ -66,64 +147,59 @@
 

 /*-----------------------------------------------------------*/

 

-int write_PHY( long lPhyReg, long lValue )

+long lEMACInit( void )

 {

-const long lMaxTime = 10;

-long x;

+long lReturn = pdPASS;

+volatile unsigned long regv, tout;

+unsigned long ulID1, ulID2;

 

-	MAC_MADR = DP83848C_DEF_ADR | lPhyReg;

-	MAC_MWTD = lValue;

+	/* Reset peripherals, configure port pins and registers. */

+	prvSetupEMACHardware();

 

-	x = 0;

-	for( x = 0; x < lMaxTime; x++ )

+	/* Check the PHY part number is as expected. */

+	ulID1 = prvReadPHY( PHY_REG_IDR1, &lReturn );

+	ulID2 = prvReadPHY( PHY_REG_IDR2, &lReturn );

+	if( ( (ulID1 << 16UL ) | ( ulID2 & 0xFFF0UL ) ) == DP83848C_ID )

 	{

-		if( ( MAC_MIND & MIND_BUSY ) == 0 )

-		{

-			/* Operation has finished. */

-			break;

-		}

+		/* Set the Ethernet MAC Address registers */

+		MAC_SA0 = ( configMAC_ADDR0 << 8 ) | configMAC_ADDR1;

+		MAC_SA1 = ( configMAC_ADDR2 << 8 ) | configMAC_ADDR3;

+		MAC_SA2 = ( configMAC_ADDR4 << 8 ) | configMAC_ADDR5;

 

-		vTaskDelay( emacSHORT_DELAY );

-	}

+		/* Initialize Tx and Rx DMA Descriptors */

+		prvInitDescriptors();

 

-	if( x < lMaxTime )

-	{

-		return pdPASS;

+		/* Receive broadcast and perfect match packets */

+		MAC_RXFILTERCTRL = RFC_UCAST_EN | RFC_BCAST_EN | RFC_PERFECT_EN;

+

+		/* Setup the PHY. */

+		prvConfigurePHY();

 	}

 	else

 	{

-		return pdFAIL;

+		lReturn = pdFAIL;

 	}

-}

-/*-----------------------------------------------------------*/

 

-unsigned short read_PHY( unsigned char ucPhyReg, long *plStatus )

-{

-long x;

-const long lMaxTime = 10;

-

-	MAC_MADR = DP83848C_DEF_ADR | ucPhyReg;

-	MAC_MCMD = MCMD_READ;

-

-	for( x = 0; x < lMaxTime; x++ )

+	/* Check the link status. */

+	if( lReturn == pdPASS )

 	{

-		/* Operation has finished. */

-		if( ( MAC_MIND & MIND_BUSY ) == 0 )

-		{

-			break;

-		}

-

-		vTaskDelay( emacSHORT_DELAY );

+		lReturn = prvSetupLinkStatus();

 	}

 

-	MAC_MCMD = 0;

-

-	if( x >= lMaxTime )

+	if( lReturn == pdPASS )

 	{

-		*plStatus = pdFAIL;

+		/* Initialise uip_buf to ensure it points somewhere valid. */

+		uip_buf = prvGetNextBuffer();

+

+		/* Reset all interrupts */

+		MAC_INTCLEAR = ( INT_RX_OVERRUN | INT_RX_ERR | INT_RX_FIN | INT_RX_DONE | INT_TX_UNDERRUN | INT_TX_ERR | INT_TX_FIN | INT_TX_DONE | INT_SOFT_INT | INT_WAKEUP );

+

+		/* Enable receive and transmit mode of MAC Ethernet core */

+		MAC_COMMAND |= ( CR_RX_EN | CR_TX_EN );

+		MAC_MAC1 |= MAC1_REC_EN;

 	}

 

-	return( MAC_MRDD );

+	return lReturn;

 }

 /*-----------------------------------------------------------*/

 

@@ -246,14 +322,14 @@
 	MAC_SUPP = 0;

 

 	/* Put the PHY in reset mode */

-	write_PHY( PHY_REG_BMCR, MCFG_RES_MII );

-	write_PHY( PHY_REG_BMCR, MCFG_RES_MII );

+	prvWritePHY( PHY_REG_BMCR, MCFG_RES_MII );

+	prvWritePHY( PHY_REG_BMCR, MCFG_RES_MII );

 

 	/* Wait for hardware reset to end. */

 	for( x = 0; x < 100; x++ )

 	{

 		vTaskDelay( emacSHORT_DELAY * 5 );

-		us = read_PHY( PHY_REG_BMCR, &lDummy );

+		us = prvReadPHY( PHY_REG_BMCR, &lDummy );

 		if( !( us & MCFG_RES_MII ) )

 		{

 			/* Reset complete */

@@ -269,13 +345,13 @@
 long x, lDummy;

 

 	/* Auto negotiate the configuration. */

-	if( write_PHY( PHY_REG_BMCR, PHY_AUTO_NEG ) )

+	if( prvWritePHY( PHY_REG_BMCR, PHY_AUTO_NEG ) )

 	{

 		vTaskDelay( emacSHORT_DELAY * 5 );

 

 		for( x = 0; x < 10; x++ )

 		{

-			us = read_PHY( PHY_REG_BMSR, &lDummy );

+			us = prvReadPHY( PHY_REG_BMSR, &lDummy );

 

 			if( us & PHY_AUTO_NEG_COMPLETE )

 			{

@@ -293,9 +369,10 @@
 long lReturn = pdFAIL, x;

 unsigned short usLinkStatus;

 

+	/* Wait with timeout for the link to be established. */

 	for( x = 0; x < 10; x++ )

 	{

-		usLinkStatus = read_PHY( PHY_REG_STS, &lReturn );

+		usLinkStatus = prvReadPHY( PHY_REG_STS, &lReturn );

 		if( usLinkStatus & emacLINK_ESTABLISHED )

 		{

 			/* Link is established. */

@@ -339,62 +416,6 @@
 }

 /*-----------------------------------------------------------*/

 

-long Init_EMAC( void )

-{

-long lReturn = pdPASS;

-volatile unsigned long regv, tout;

-unsigned long ulID1, ulID2;

-

-	/* Reset peripherals, configure port pins and registers. */

-	prvSetupEMACHardware();

-

-	/* Check if connected to a DP83848C PHY. */

-	ulID1 = read_PHY( PHY_REG_IDR1, &lReturn );

-	ulID2 = read_PHY( PHY_REG_IDR2, &lReturn );

-	if( ( (ulID1 << 16UL ) | ( ulID2 & 0xFFF0UL ) ) == DP83848C_ID )

-	{

-		/* Set the Ethernet MAC Address registers */

-		MAC_SA0 = ( configMAC_ADDR0 << 8 ) | configMAC_ADDR1;

-		MAC_SA1 = ( configMAC_ADDR2 << 8 ) | configMAC_ADDR3;

-		MAC_SA2 = ( configMAC_ADDR4 << 8 ) | configMAC_ADDR5;

-

-		/* Initialize Tx and Rx DMA Descriptors */

-		prvInitDescriptors();

-

-		/* Receive Broadcast and Perfect Match Packets */

-		MAC_RXFILTERCTRL = RFC_UCAST_EN | RFC_BCAST_EN | RFC_PERFECT_EN;

-

-		/* Setup the PHY. */

-		prvConfigurePHY();

-	}

-	else

-	{

-		lReturn = pdFAIL;

-	}

-

-	/* Check the link status. */

-	if( lReturn == pdPASS )

-	{

-		lReturn = prvSetupLinkStatus();

-	}

-

-	if( lReturn == pdPASS )

-	{

-		/* Initialise uip_buf to ensure it points somewhere valid. */

-		uip_buf = prvGetNextBuffer();

-

-		/* Reset all interrupts */

-		MAC_INTCLEAR = ( INT_RX_OVERRUN | INT_RX_ERR | INT_RX_FIN | INT_RX_DONE | INT_TX_UNDERRUN | INT_TX_ERR | INT_TX_FIN | INT_TX_DONE | INT_SOFT_INT | INT_WAKEUP );

-

-		/* Enable receive and transmit mode of MAC Ethernet core */

-		MAC_COMMAND |= ( CR_RX_EN | CR_TX_EN );

-		MAC_MAC1 |= MAC1_REC_EN;

-	}

-

-	return lReturn;

-}

-/*-----------------------------------------------------------*/

-

 static void prvReturnBuffer( unsigned char *pucBuffer )

 {

 unsigned long ul;

@@ -480,10 +501,66 @@
 }

 /*-----------------------------------------------------------*/

 

+static long prvWritePHY( long lPhyReg, long lValue )

+{

+const long lMaxTime = 10;

+long x;

 

-static char c[ 256 ] = { 0 };

-static int i = 0;

+	MAC_MADR = DP83848C_DEF_ADR | lPhyReg;

+	MAC_MWTD = lValue;

 

+	x = 0;

+	for( x = 0; x < lMaxTime; x++ )

+	{

+		if( ( MAC_MIND & MIND_BUSY ) == 0 )

+		{

+			/* Operation has finished. */

+			break;

+		}

+

+		vTaskDelay( emacSHORT_DELAY );

+	}

+

+	if( x < lMaxTime )

+	{

+		return pdPASS;

+	}

+	else

+	{

+		return pdFAIL;

+	}

+}

+/*-----------------------------------------------------------*/

+

+static unsigned short prvReadPHY( unsigned char ucPhyReg, long *plStatus )

+{

+long x;

+const long lMaxTime = 10;

+

+	MAC_MADR = DP83848C_DEF_ADR | ucPhyReg;

+	MAC_MCMD = MCMD_READ;

+

+	for( x = 0; x < lMaxTime; x++ )

+	{

+		/* Operation has finished. */

+		if( ( MAC_MIND & MIND_BUSY ) == 0 )

+		{

+			break;

+		}

+

+		vTaskDelay( emacSHORT_DELAY );

+	}

+

+	MAC_MCMD = 0;

+

+	if( x >= lMaxTime )

+	{

+		*plStatus = pdFAIL;

+	}

+

+	return( MAC_MRDD );

+}

+/*-----------------------------------------------------------*/

 

 void vEMAC_ISR( void )

 {

@@ -505,8 +582,6 @@
 	{

 		if( usSendLen > 0 )

 		{

-if( i < 255 )

-	c[ i++ ] = 1;

 			/* Send the data again, using the second descriptor.  As there are

 			only two descriptors the index is set back to 0. */

 			TX_DESC_PACKET( ( emacTX_DESC_INDEX + 1 ) ) = TX_DESC_PACKET( emacTX_DESC_INDEX );

@@ -519,9 +594,6 @@
 		}

 		else

 		{

-if( i < 255 )

-	c[ i++ ] = 1;

-

 			/* The Tx buffer is no longer required. */

 			prvReturnBuffer( ( unsigned char * ) TX_DESC_PACKET( emacTX_DESC_INDEX ) );

             TX_DESC_PACKET( emacTX_DESC_INDEX ) = NULL;

diff --git a/Demo/CORTEX_LPC1768_GCC_Rowley/webserver/uIP_Task.c b/Demo/CORTEX_LPC1768_GCC_Rowley/webserver/uIP_Task.c
index 4d8f9cb..ecdb2b0 100644
--- a/Demo/CORTEX_LPC1768_GCC_Rowley/webserver/uIP_Task.c
+++ b/Demo/CORTEX_LPC1768_GCC_Rowley/webserver/uIP_Task.c
@@ -137,7 +137,7 @@
 	vSemaphoreCreateBinary( xEMACSemaphore );

 

 	/* Initialise the MAC. */

-	while( Init_EMAC() != pdPASS )

+	while( lEMACInit() != pdPASS )

     {

         vTaskDelay( uipINIT_WAIT );

     }