]> git.sur5r.net Git - freertos/blobdiff - FreeRTOS-Plus/Source/FreeRTOS-Plus-TCP/portable/NetworkInterface/Zynq/x_emacpsif_hw.c
Update version number in readiness for V10.3.0 release. Sync SVN with reviewed releas...
[freertos] / FreeRTOS-Plus / Source / FreeRTOS-Plus-TCP / portable / NetworkInterface / Zynq / x_emacpsif_hw.c
index e9443cda8e17151e4a2381a2113c29fa31eea298..be00f4f9c8493dff2363d357744bf39b07fc1ed0 100644 (file)
-/*\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( );
+}