/*\r
-FreeRTOS+TCP V2.0.7\r
+FreeRTOS+TCP V2.0.11\r
Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.\r
\r
Permission is hereby granted, free of charge, to any person obtaining a copy of\r
\r
http://aws.amazon.com/freertos\r
http://www.FreeRTOS.org\r
-*/\r
-\r
-#include "Zynq/x_emacpsif.h"\r
-#include "Zynq/x_topology.h"\r
-#include "xstatus.h"\r
-\r
-#include "xparameters.h"\r
-#include "xparameters_ps.h"\r
-#include "xil_exception.h"\r
-#include "xil_mmu.h"\r
+ */\r
\r
#include "FreeRTOS.h"\r
#include "task.h"\r
#include "FreeRTOS_IP_Private.h"\r
#include "NetworkBufferManagement.h"\r
\r
+#include "Zynq/x_emacpsif.h"\r
+#include "Zynq/x_topology.h"\r
+#include "xstatus.h"\r
+\r
+#include "xparameters.h"\r
+#include "xparameters_ps.h"\r
+#include "xil_exception.h"\r
+#include "xil_mmu.h"\r
+\r
#include "uncached_memory.h"\r
\r
/* Two defines used to set or clear the EMAC interrupt */\r
XStatus emacps_send_message(xemacpsif_s *xemacpsif, NetworkBufferDescriptor_t *pxBuffer, int iReleaseAfterSend )\r
{\r
int head = xemacpsif->txHead;\r
-int tail = xemacpsif->txTail;\r
+//int tail = xemacpsif->txTail;\r
int iHasSent = 0;\r
uint32_t ulBaseAddress = xemacpsif->emacps.Config.BaseAddress;\r
TickType_t xBlockTimeTicks = pdMS_TO_TICKS( 5000u );\r
portYIELD_FROM_ISR( xHigherPriorityTaskWoken );\r
}\r
\r
-static NetworkBufferDescriptor_t *ethMsg = NULL;\r
-static NetworkBufferDescriptor_t *ethLast = NULL;\r
-\r
-static void passEthMessages( void )\r
+static void passEthMessages( NetworkBufferDescriptor_t *ethMsg )\r
{\r
IPStackEvent_t xRxEvent;\r
\r
iptraceETHERNET_RX_EVENT_LOST();\r
FreeRTOS_printf( ( "passEthMessages: Can not queue return packet!\n" ) );\r
}\r
-\r
- ethMsg = ethLast = NULL;\r
}\r
\r
+TickType_t ack_reception_delay = 10;\r
+\r
int emacps_check_rx( xemacpsif_s *xemacpsif )\r
{\r
NetworkBufferDescriptor_t *pxBuffer, *pxNewBuffer;\r
int rx_bytes;\r
volatile int msgCount = 0;\r
int head = xemacpsif->rxHead;\r
+BaseType_t bHasDataPacket = pdFALSE;\r
+NetworkBufferDescriptor_t *ethMsg = NULL;\r
+NetworkBufferDescriptor_t *ethLast = NULL;\r
\r
/* There seems to be an issue (SI# 692601), see comments below. */\r
resetrx_on_no_rxdata(xemacpsif);\r
\r
+ {\r
+ static int maxcount = 0;\r
+ int count = 0;\r
+ for( ;; )\r
+ {\r
+ if( ( ( xemacpsif->rxSegments[ head ].address & XEMACPS_RXBUF_NEW_MASK ) == 0 ) ||\r
+ ( pxDMA_rx_buffers[ head ] == NULL ) )\r
+ {\r
+ break;\r
+ }\r
+ count++;\r
+ if( ++head == ipconfigNIC_N_RX_DESC )\r
+ {\r
+ head = 0;\r
+ }\r
+ if( head == xemacpsif->rxHead )\r
+ {\r
+ break;\r
+ }\r
+ }\r
+ if (maxcount < count) {\r
+ maxcount = count;\r
+ FreeRTOS_printf( ( "emacps_check_rx: %d packets\n", maxcount ) );\r
+ }\r
+ head = xemacpsif->rxHead;\r
+ }\r
+\r
/* This FreeRTOS+TCP driver shall be compiled with the option\r
"ipconfigUSE_LINKED_RX_MESSAGES" enabled. It allows the driver to send a\r
chain of RX messages within one message to the IP-task. */\r
rx_bytes = xemacpsif->rxSegments[ head ].flags & XEMACPS_RXBUF_LEN_MASK;\r
\r
pxBuffer->xDataLength = rx_bytes;\r
-\r
+if( rx_bytes > 60 )\r
+{\r
+ bHasDataPacket = 1;\r
+}\r
if( ucIsCachedMemory( pxBuffer->pucEthernetBuffer ) != 0 )\r
{\r
Xil_DCacheInvalidateRange( ( ( uint32_t )pxBuffer->pucEthernetBuffer ) - ipconfigPACKET_FILLER_SIZE, (unsigned)rx_bytes );\r
addr |= XEMACPS_RXBUF_WRAP_MASK;\r
}\r
/* Clearing 'XEMACPS_RXBUF_NEW_MASK' 0x00000001 *< Used bit.. */\r
- xemacpsif->rxSegments[ head ].address = addr;\r
xemacpsif->rxSegments[ head ].flags = 0;\r
+ xemacpsif->rxSegments[ head ].address = addr;\r
+ if (xemacpsif->rxSegments[ head ].address) {\r
+ // Just to read it\r
+ }\r
}\r
}\r
\r
\r
if( ethMsg != NULL )\r
{\r
- passEthMessages( );\r
+ if( bHasDataPacket == pdFALSE )\r
+ {\r
+// vTaskDelay( ack_reception_delay );\r
+ }\r
+ passEthMessages( ethMsg );\r
}\r
\r
return msgCount;\r
xemacpsif->txSegments[ index ].address = ( uint32_t )ucTxBuffer;\r
xemacpsif->txSegments[ index ].flags = XEMACPS_TXBUF_USED_MASK;\r
#if( ipconfigZERO_COPY_TX_DRIVER != 0 )\r
- pxDMA_tx_buffers[ index ] = ( void* )NULL;\r
+ pxDMA_tx_buffers[ index ] = ( unsigned char * )NULL;\r
#else\r
- pxDMA_tx_buffers[ index ] = ( void* )( ucTxBuffer + TX_OFFSET );\r
+ pxDMA_tx_buffers[ index ] = ( unsigned char * )( ucTxBuffer + TX_OFFSET );\r
#endif\r
ucTxBuffer += xemacpsif->uTxUnitSize;\r
}\r
tempcntr = XEmacPs_ReadReg( xemacpsif->emacps.Config.BaseAddress, XEMACPS_RXCNT_OFFSET );\r
if ( ( tempcntr == 0 ) && ( xemacpsif->last_rx_frms_cntr == 0 ) )\r
{\r
+FreeRTOS_printf( ( "resetrx_on_no_rxdata: RESET~\n" ) );\r
regctrl = XEmacPs_ReadReg(xemacpsif->emacps.Config.BaseAddress,\r
XEMACPS_NWCTRL_OFFSET);\r
regctrl &= (~XEMACPS_NWCTRL_RXEN_MASK);\r