2 * Copyright (c) 2010-2013 Xilinx, Inc. All rights reserved.
5 * XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A
6 * COURTESY TO YOU. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS
7 * ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION OR
8 * STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION
9 * IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE
10 * FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION.
11 * XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO
12 * THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO
13 * ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE
14 * FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY
15 * AND FITNESS FOR A PARTICULAR PURPOSE.
20 /* Standard includes. */
25 #include "Zynq/x_emacpsif.h"
27 /* FreeRTOS includes. */
32 ///* FreeRTOS+TCP includes. */
33 /* FreeRTOS+TCP includes. */
34 #include "FreeRTOS_IP.h"
35 #include "FreeRTOS_Sockets.h"
36 #include "FreeRTOS_IP_Private.h"
37 #include "NetworkBufferManagement.h"
39 extern TaskHandle_t xEMACTaskHandle;
41 /*** IMPORTANT: Define PEEP in xemacpsif.h and sys_arch_raw.c
42 *** to run it on a PEEP board
45 unsigned int link_speed = 100;
47 void setup_isr( xemacpsif_s *xemacpsif )
52 XEmacPs_SetHandler(&xemacpsif->emacps, XEMACPS_HANDLER_DMASEND,
53 (void *) emacps_send_handler,
56 XEmacPs_SetHandler(&xemacpsif->emacps, XEMACPS_HANDLER_DMARECV,
57 (void *) emacps_recv_handler,
60 XEmacPs_SetHandler(&xemacpsif->emacps, XEMACPS_HANDLER_ERROR,
61 (void *) emacps_error_handler,
65 void start_emacps (xemacpsif_s *xemacps)
68 XEmacPs_Start(&xemacps->emacps);
71 extern struct xtopology_t xXTopology;
73 volatile int error_msg_count = 0;
74 volatile const char *last_err_msg = "";
82 static struct xERROR_MSG xErrorList[ 8 ];
83 static BaseType_t xErrorHead, xErrorTail;
85 void emacps_error_handler(void *arg, u8 Direction, u32 ErrorWord)
87 BaseType_t xHigherPriorityTaskWoken = pdFALSE;
88 xemacpsif_s *xemacpsif;
89 BaseType_t xNextHead = xErrorHead;
91 xemacpsif = (xemacpsif_s *)(arg);
93 if( ( Direction != XEMACPS_SEND ) || (ErrorWord != XEMACPS_TXSR_USEDREAD_MASK ) )
95 if( ++xNextHead == ( sizeof( xErrorList ) / sizeof( xErrorList[ 0 ] ) ) )
97 if( xNextHead != xErrorTail )
100 xErrorList[ xErrorHead ].arg = arg;
101 xErrorList[ xErrorHead ].Direction = Direction;
102 xErrorList[ xErrorHead ].ErrorWord = ErrorWord;
104 xErrorHead = xNextHead;
106 xemacpsif = (xemacpsif_s *)(arg);
107 xemacpsif->isr_events |= EMAC_IF_ERR_EVENT;
110 if( xEMACTaskHandle != NULL )
112 vTaskNotifyGiveFromISR( xEMACTaskHandle, &xHigherPriorityTaskWoken );
117 portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
120 static void emacps_handle_error(void *arg, u8 Direction, u32 ErrorWord);
122 int emacps_check_errors( xemacpsif_s *xemacps )
128 if( xErrorHead == xErrorTail )
136 xErrorList[ xErrorTail ].arg,
137 xErrorList[ xErrorTail ].Direction,
138 xErrorList[ xErrorTail ].ErrorWord );
144 BaseType_t xNetworkInterfaceInitialise( void );
146 static void emacps_handle_error(void *arg, u8 Direction, u32 ErrorWord)
148 xemacpsif_s *xemacpsif;
149 struct xtopology_t *xtopologyp;
152 xemacpsif = (xemacpsif_s *)(arg);
154 xtopologyp = &xXTopology;
156 xemacps = &xemacpsif->emacps;
158 /* Do not appear to be used. */
168 if( ( ErrorWord & XEMACPS_RXSR_HRESPNOK_MASK ) != 0 )
170 last_err_msg = "Receive DMA error";
171 xNetworkInterfaceInitialise( );
173 if( ( ErrorWord & XEMACPS_RXSR_RXOVR_MASK ) != 0 )
175 last_err_msg = "Receive over run";
176 emacps_recv_handler(arg);
178 if( ( ErrorWord & XEMACPS_RXSR_BUFFNA_MASK ) != 0 )
180 last_err_msg = "Receive buffer not available";
181 emacps_recv_handler(arg);
185 if( ( ErrorWord & XEMACPS_TXSR_HRESPNOK_MASK ) != 0 )
187 last_err_msg = "Transmit DMA error";
188 xNetworkInterfaceInitialise( );
190 if( ( ErrorWord & XEMACPS_TXSR_URUN_MASK ) != 0 )
192 last_err_msg = "Transmit under run";
193 HandleTxErrors( xemacpsif );
195 if( ( ErrorWord & XEMACPS_TXSR_BUFEXH_MASK ) != 0 )
197 last_err_msg = "Transmit buffer exhausted";
198 HandleTxErrors( xemacpsif );
200 if( ( ErrorWord & XEMACPS_TXSR_RXOVR_MASK ) != 0 )
202 last_err_msg = "Transmit retry excessed limits";
203 HandleTxErrors( xemacpsif );
205 if( ( ErrorWord & XEMACPS_TXSR_FRAMERX_MASK ) != 0 )
207 last_err_msg = "Transmit collision";
208 emacps_check_tx( xemacpsif );
213 // Break on this statement and inspect error_msg if you like
214 if( last_err_msg != NULL )
217 FreeRTOS_printf( ( "emacps_handle_error: %s\n", last_err_msg ) );
221 extern XEmacPs_Config mac_config;
223 void HandleTxErrors(xemacpsif_s *xemacpsif)
227 //taskENTER_CRITICAL()
229 netctrlreg = XEmacPs_ReadReg(xemacpsif->emacps.Config.BaseAddress,
230 XEMACPS_NWCTRL_OFFSET);
231 netctrlreg = netctrlreg & (~XEMACPS_NWCTRL_TXEN_MASK);
232 XEmacPs_WriteReg(xemacpsif->emacps.Config.BaseAddress,
233 XEMACPS_NWCTRL_OFFSET, netctrlreg);
235 clean_dma_txdescs( xemacpsif );
236 netctrlreg = XEmacPs_ReadReg(xemacpsif->emacps.Config.BaseAddress,
237 XEMACPS_NWCTRL_OFFSET);
238 netctrlreg = netctrlreg | (XEMACPS_NWCTRL_TXEN_MASK);
239 XEmacPs_WriteReg(xemacpsif->emacps.Config.BaseAddress,
240 XEMACPS_NWCTRL_OFFSET, netctrlreg);
242 //taskEXIT_CRITICAL( );