-/*\r
- * Copyright (c) 2010-2013 Xilinx, Inc. All rights reserved.\r
- *\r
- * Xilinx, Inc.\r
- * XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A\r
- * COURTESY TO YOU. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS\r
- * ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION OR\r
- * STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION\r
- * IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE\r
- * FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION.\r
- * XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO\r
- * THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO\r
- * ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE\r
- * FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY\r
- * AND FITNESS FOR A PARTICULAR PURPOSE.\r
- *\r
- */\r
-\r
-\r
-/* Standard includes. */\r
-#include <stdint.h>\r
-#include <stdio.h>\r
-#include <stdlib.h>\r
-\r
-#include "Zynq/x_emacpsif.h"\r
-\r
-/* FreeRTOS includes. */\r
-#include "FreeRTOS.h"\r
-#include "task.h"\r
-#include "queue.h"\r
-\r
-///* FreeRTOS+TCP includes. */\r
-/* FreeRTOS+TCP includes. */\r
-#include "FreeRTOS_IP.h"\r
-#include "FreeRTOS_Sockets.h"\r
-#include "FreeRTOS_IP_Private.h"\r
-#include "NetworkBufferManagement.h"\r
-\r
-extern TaskHandle_t xEMACTaskHandle;\r
-\r
-/*** IMPORTANT: Define PEEP in xemacpsif.h and sys_arch_raw.c\r
- *** to run it on a PEEP board\r
- ***/\r
-\r
-unsigned int link_speed = 100;\r
-\r
-void setup_isr( xemacpsif_s *xemacpsif )\r
-{\r
- /*\r
- * Setup callbacks\r
- */\r
- XEmacPs_SetHandler(&xemacpsif->emacps, XEMACPS_HANDLER_DMASEND,\r
- (void *) emacps_send_handler,\r
- (void *) xemacpsif);\r
-\r
- XEmacPs_SetHandler(&xemacpsif->emacps, XEMACPS_HANDLER_DMARECV,\r
- (void *) emacps_recv_handler,\r
- (void *) xemacpsif);\r
-\r
- XEmacPs_SetHandler(&xemacpsif->emacps, XEMACPS_HANDLER_ERROR,\r
- (void *) emacps_error_handler,\r
- (void *) xemacpsif);\r
-}\r
-\r
-void start_emacps (xemacpsif_s *xemacps)\r
-{\r
- /* start the temac */\r
- XEmacPs_Start(&xemacps->emacps);\r
-}\r
-\r
-extern struct xtopology_t xXTopology;\r
-\r
-volatile int error_msg_count = 0;\r
-volatile const char *last_err_msg = "";\r
-\r
-struct xERROR_MSG {\r
- void *arg;\r
- u8 Direction;\r
- u32 ErrorWord;\r
-};\r
-\r
-static struct xERROR_MSG xErrorList[ 8 ];\r
-static BaseType_t xErrorHead, xErrorTail;\r
-\r
-void emacps_error_handler(void *arg, u8 Direction, u32 ErrorWord)\r
-{\r
- BaseType_t xHigherPriorityTaskWoken = pdFALSE;\r
- xemacpsif_s *xemacpsif;\r
- BaseType_t xNextHead = xErrorHead;\r
-\r
- xemacpsif = (xemacpsif_s *)(arg);\r
-\r
- if( ( Direction != XEMACPS_SEND ) || (ErrorWord != XEMACPS_TXSR_USEDREAD_MASK ) )\r
- {\r
- if( ++xNextHead == ( sizeof( xErrorList ) / sizeof( xErrorList[ 0 ] ) ) )\r
- xNextHead = 0;\r
- if( xNextHead != xErrorTail )\r
- {\r
-\r
- xErrorList[ xErrorHead ].arg = arg;\r
- xErrorList[ xErrorHead ].Direction = Direction;\r
- xErrorList[ xErrorHead ].ErrorWord = ErrorWord;\r
-\r
- xErrorHead = xNextHead;\r
-\r
- xemacpsif = (xemacpsif_s *)(arg);\r
- xemacpsif->isr_events |= EMAC_IF_ERR_EVENT;\r
- }\r
-\r
- if( xEMACTaskHandle != NULL )\r
- {\r
- vTaskNotifyGiveFromISR( xEMACTaskHandle, &xHigherPriorityTaskWoken );\r
- }\r
-\r
- }\r
-\r
- portYIELD_FROM_ISR( xHigherPriorityTaskWoken );\r
-}\r
-\r
-static void emacps_handle_error(void *arg, u8 Direction, u32 ErrorWord);\r
-\r
-int emacps_check_errors( xemacpsif_s *xemacps )\r
-{\r
-int xResult;\r
-\r
- ( void ) xemacps;\r
-\r
- if( xErrorHead == xErrorTail )\r
- {\r
- xResult = 0;\r
- }\r
- else\r
- {\r
- xResult = 1;\r
- emacps_handle_error(\r
- xErrorList[ xErrorTail ].arg,\r
- xErrorList[ xErrorTail ].Direction,\r
- xErrorList[ xErrorTail ].ErrorWord );\r
- }\r
-\r
- return xResult;\r
-}\r
-\r
-BaseType_t xNetworkInterfaceInitialise( void );\r
-\r
-static void emacps_handle_error(void *arg, u8 Direction, u32 ErrorWord)\r
-{\r
- xemacpsif_s *xemacpsif;\r
- struct xtopology_t *xtopologyp;\r
- XEmacPs *xemacps;\r
-\r
- xemacpsif = (xemacpsif_s *)(arg);\r
-\r
- xtopologyp = &xXTopology;\r
-\r
- xemacps = &xemacpsif->emacps;\r
-\r
- /* Do not appear to be used. */\r
- ( void ) xemacps;\r
- ( void ) xtopologyp;\r
-\r
- last_err_msg = NULL;\r
-\r
- if( ErrorWord != 0 )\r
- {\r
- switch (Direction) {\r
- case XEMACPS_RECV:\r
- if( ( ErrorWord & XEMACPS_RXSR_HRESPNOK_MASK ) != 0 )\r
- {\r
- last_err_msg = "Receive DMA error";\r
- xNetworkInterfaceInitialise( );\r
- }\r
- if( ( ErrorWord & XEMACPS_RXSR_RXOVR_MASK ) != 0 )\r
- {\r
- last_err_msg = "Receive over run";\r
- emacps_recv_handler(arg);\r
- }\r
- if( ( ErrorWord & XEMACPS_RXSR_BUFFNA_MASK ) != 0 )\r
- {\r
- last_err_msg = "Receive buffer not available";\r
- emacps_recv_handler(arg);\r
- }\r
- break;\r
- case XEMACPS_SEND:\r
- if( ( ErrorWord & XEMACPS_TXSR_HRESPNOK_MASK ) != 0 )\r
- {\r
- last_err_msg = "Transmit DMA error";\r
- xNetworkInterfaceInitialise( );\r
- }\r
- if( ( ErrorWord & XEMACPS_TXSR_URUN_MASK ) != 0 )\r
- {\r
- last_err_msg = "Transmit under run";\r
- HandleTxErrors( xemacpsif );\r
- }\r
- if( ( ErrorWord & XEMACPS_TXSR_BUFEXH_MASK ) != 0 )\r
- {\r
- last_err_msg = "Transmit buffer exhausted";\r
- HandleTxErrors( xemacpsif );\r
- }\r
- if( ( ErrorWord & XEMACPS_TXSR_RXOVR_MASK ) != 0 )\r
- {\r
- last_err_msg = "Transmit retry excessed limits";\r
- HandleTxErrors( xemacpsif );\r
- }\r
- if( ( ErrorWord & XEMACPS_TXSR_FRAMERX_MASK ) != 0 )\r
- {\r
- last_err_msg = "Transmit collision";\r
- emacps_check_tx( xemacpsif );\r
- }\r
- break;\r
- }\r
- }\r
- // Break on this statement and inspect error_msg if you like\r
- if( last_err_msg != NULL )\r
- {\r
- error_msg_count++;\r
- FreeRTOS_printf( ( "emacps_handle_error: %s\n", last_err_msg ) );\r
- }\r
-}\r
-\r
-extern XEmacPs_Config mac_config;\r
-\r
-void HandleTxErrors(xemacpsif_s *xemacpsif)\r
-{\r
- u32 netctrlreg;\r
-\r
- //taskENTER_CRITICAL()\r
- {\r
- netctrlreg = XEmacPs_ReadReg(xemacpsif->emacps.Config.BaseAddress,\r
- XEMACPS_NWCTRL_OFFSET);\r
- netctrlreg = netctrlreg & (~XEMACPS_NWCTRL_TXEN_MASK);\r
- XEmacPs_WriteReg(xemacpsif->emacps.Config.BaseAddress,\r
- XEMACPS_NWCTRL_OFFSET, netctrlreg);\r
-\r
- clean_dma_txdescs( xemacpsif );\r
- netctrlreg = XEmacPs_ReadReg(xemacpsif->emacps.Config.BaseAddress,\r
- XEMACPS_NWCTRL_OFFSET);\r
- netctrlreg = netctrlreg | (XEMACPS_NWCTRL_TXEN_MASK);\r
- XEmacPs_WriteReg(xemacpsif->emacps.Config.BaseAddress,\r
- XEMACPS_NWCTRL_OFFSET, netctrlreg);\r
- }\r
- //taskEXIT_CRITICAL( );\r
-}\r
+/*
+ * Copyright (c) 2010-2013 Xilinx, Inc. All rights reserved.
+ *
+ * Xilinx, Inc.
+ * XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A
+ * COURTESY TO YOU. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS
+ * ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION OR
+ * STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION
+ * IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE
+ * FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION.
+ * XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO
+ * THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO
+ * ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE
+ * FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ */
+
+
+/* Standard includes. */
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "Zynq/x_emacpsif.h"
+
+/* FreeRTOS includes. */
+#include "FreeRTOS.h"
+#include "task.h"
+#include "queue.h"
+
+///* FreeRTOS+TCP includes. */
+/* FreeRTOS+TCP includes. */
+#include "FreeRTOS_IP.h"
+#include "FreeRTOS_Sockets.h"
+#include "FreeRTOS_IP_Private.h"
+#include "NetworkBufferManagement.h"
+
+extern TaskHandle_t xEMACTaskHandle;
+
+/*** IMPORTANT: Define PEEP in xemacpsif.h and sys_arch_raw.c
+ *** to run it on a PEEP board
+ ***/
+
+unsigned int link_speed = 100;
+
+void setup_isr( xemacpsif_s *xemacpsif )
+{
+ /*
+ * Setup callbacks
+ */
+ XEmacPs_SetHandler(&xemacpsif->emacps, XEMACPS_HANDLER_DMASEND,
+ (void *) emacps_send_handler,
+ (void *) xemacpsif);
+
+ XEmacPs_SetHandler(&xemacpsif->emacps, XEMACPS_HANDLER_DMARECV,
+ (void *) emacps_recv_handler,
+ (void *) xemacpsif);
+
+ XEmacPs_SetHandler(&xemacpsif->emacps, XEMACPS_HANDLER_ERROR,
+ (void *) emacps_error_handler,
+ (void *) xemacpsif);
+}
+
+void start_emacps (xemacpsif_s *xemacps)
+{
+ /* start the temac */
+ XEmacPs_Start(&xemacps->emacps);
+}
+
+extern struct xtopology_t xXTopology;
+
+volatile int error_msg_count = 0;
+volatile const char *last_err_msg = "";
+
+struct xERROR_MSG {
+ void *arg;
+ u8 Direction;
+ u32 ErrorWord;
+};
+
+static struct xERROR_MSG xErrorList[ 8 ];
+static BaseType_t xErrorHead, xErrorTail;
+
+void emacps_error_handler(void *arg, u8 Direction, u32 ErrorWord)
+{
+ BaseType_t xHigherPriorityTaskWoken = pdFALSE;
+ xemacpsif_s *xemacpsif;
+ BaseType_t xNextHead = xErrorHead;
+
+ xemacpsif = (xemacpsif_s *)(arg);
+
+ if( ( Direction != XEMACPS_SEND ) || (ErrorWord != XEMACPS_TXSR_USEDREAD_MASK ) )
+ {
+ if( ++xNextHead == ( sizeof( xErrorList ) / sizeof( xErrorList[ 0 ] ) ) )
+ xNextHead = 0;
+ if( xNextHead != xErrorTail )
+ {
+
+ xErrorList[ xErrorHead ].arg = arg;
+ xErrorList[ xErrorHead ].Direction = Direction;
+ xErrorList[ xErrorHead ].ErrorWord = ErrorWord;
+
+ xErrorHead = xNextHead;
+
+ xemacpsif = (xemacpsif_s *)(arg);
+ xemacpsif->isr_events |= EMAC_IF_ERR_EVENT;
+ }
+
+ if( xEMACTaskHandle != NULL )
+ {
+ vTaskNotifyGiveFromISR( xEMACTaskHandle, &xHigherPriorityTaskWoken );
+ }
+
+ }
+
+ portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
+}
+
+static void emacps_handle_error(void *arg, u8 Direction, u32 ErrorWord);
+
+int emacps_check_errors( xemacpsif_s *xemacps )
+{
+int xResult;
+
+ ( void ) xemacps;
+
+ if( xErrorHead == xErrorTail )
+ {
+ xResult = 0;
+ }
+ else
+ {
+ xResult = 1;
+ emacps_handle_error(
+ xErrorList[ xErrorTail ].arg,
+ xErrorList[ xErrorTail ].Direction,
+ xErrorList[ xErrorTail ].ErrorWord );
+ }
+
+ return xResult;
+}
+
+BaseType_t xNetworkInterfaceInitialise( void );
+
+static void emacps_handle_error(void *arg, u8 Direction, u32 ErrorWord)
+{
+ xemacpsif_s *xemacpsif;
+ struct xtopology_t *xtopologyp;
+ XEmacPs *xemacps;
+
+ xemacpsif = (xemacpsif_s *)(arg);
+
+ xtopologyp = &xXTopology;
+
+ xemacps = &xemacpsif->emacps;
+
+ /* Do not appear to be used. */
+ ( void ) xemacps;
+ ( void ) xtopologyp;
+
+ last_err_msg = NULL;
+
+ if( ErrorWord != 0 )
+ {
+ switch (Direction) {
+ case XEMACPS_RECV:
+ if( ( ErrorWord & XEMACPS_RXSR_HRESPNOK_MASK ) != 0 )
+ {
+ last_err_msg = "Receive DMA error";
+ xNetworkInterfaceInitialise( );
+ }
+ if( ( ErrorWord & XEMACPS_RXSR_RXOVR_MASK ) != 0 )
+ {
+ last_err_msg = "Receive over run";
+ emacps_recv_handler(arg);
+ }
+ if( ( ErrorWord & XEMACPS_RXSR_BUFFNA_MASK ) != 0 )
+ {
+ last_err_msg = "Receive buffer not available";
+ emacps_recv_handler(arg);
+ }
+ break;
+ case XEMACPS_SEND:
+ if( ( ErrorWord & XEMACPS_TXSR_HRESPNOK_MASK ) != 0 )
+ {
+ last_err_msg = "Transmit DMA error";
+ xNetworkInterfaceInitialise( );
+ }
+ if( ( ErrorWord & XEMACPS_TXSR_URUN_MASK ) != 0 )
+ {
+ last_err_msg = "Transmit under run";
+ HandleTxErrors( xemacpsif );
+ }
+ if( ( ErrorWord & XEMACPS_TXSR_BUFEXH_MASK ) != 0 )
+ {
+ last_err_msg = "Transmit buffer exhausted";
+ HandleTxErrors( xemacpsif );
+ }
+ if( ( ErrorWord & XEMACPS_TXSR_RXOVR_MASK ) != 0 )
+ {
+ last_err_msg = "Transmit retry excessed limits";
+ HandleTxErrors( xemacpsif );
+ }
+ if( ( ErrorWord & XEMACPS_TXSR_FRAMERX_MASK ) != 0 )
+ {
+ last_err_msg = "Transmit collision";
+ emacps_check_tx( xemacpsif );
+ }
+ break;
+ }
+ }
+ // Break on this statement and inspect error_msg if you like
+ if( last_err_msg != NULL )
+ {
+ error_msg_count++;
+ FreeRTOS_printf( ( "emacps_handle_error: %s\n", last_err_msg ) );
+ }
+}
+
+extern XEmacPs_Config mac_config;
+
+void HandleTxErrors(xemacpsif_s *xemacpsif)
+{
+ u32 netctrlreg;
+
+ //taskENTER_CRITICAL()
+ {
+ netctrlreg = XEmacPs_ReadReg(xemacpsif->emacps.Config.BaseAddress,
+ XEMACPS_NWCTRL_OFFSET);
+ netctrlreg = netctrlreg & (~XEMACPS_NWCTRL_TXEN_MASK);
+ XEmacPs_WriteReg(xemacpsif->emacps.Config.BaseAddress,
+ XEMACPS_NWCTRL_OFFSET, netctrlreg);
+
+ clean_dma_txdescs( xemacpsif );
+ netctrlreg = XEmacPs_ReadReg(xemacpsif->emacps.Config.BaseAddress,
+ XEMACPS_NWCTRL_OFFSET);
+ netctrlreg = netctrlreg | (XEMACPS_NWCTRL_TXEN_MASK);
+ XEmacPs_WriteReg(xemacpsif->emacps.Config.BaseAddress,
+ XEMACPS_NWCTRL_OFFSET, netctrlreg);
+ }
+ //taskEXIT_CRITICAL( );
+}