From 7eddac04c3426344568c62245a9ee3b806d80e46 Mon Sep 17 00:00:00 2001 From: Peter Crosthwaite Date: Sat, 5 Jan 2013 13:57:21 +1000 Subject: [PATCH] zynq_gem: Fix incorrect clearing of RX_STATUS The RX_STATUS register was being cleared after servicing the underlying event. This is incorrect as if another packet is received after the service routine (Xgmac_process_rx()) returns, then the frame-received flag for the new packet will be cleared. U-boot will then completely miss the new packet even though the hardware has sucessfully received it. Fixed by clearing the RX_STATUS register immediately after polling. Reported-by: Jason Wu Signed-off-by: Peter Crosthwaite --- drivers/net/zynq_gem_wrap.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/drivers/net/zynq_gem_wrap.c b/drivers/net/zynq_gem_wrap.c index c4ef62f1594..62adce2bb00 100644 --- a/drivers/net/zynq_gem_wrap.c +++ b/drivers/net/zynq_gem_wrap.c @@ -498,6 +498,8 @@ int Xgmac_rx(struct eth_device *dev) status = XEmacPss_ReadReg(EmacPssInstancePtr->Config.BaseAddress, XEMACPSS_RXSR_OFFSET); + XEmacPss_WriteReg(EmacPssInstancePtr->Config.BaseAddress, + XEMACPSS_RXSR_OFFSET, status); if (status & XEMACPSS_RXSR_FRAMERX_MASK) { // printf("rx packet received\n"); @@ -507,11 +509,6 @@ int Xgmac_rx(struct eth_device *dev) } while (retval == 0) ; } - /* Clear interrupt status. - */ - XEmacPss_WriteReg(EmacPssInstancePtr->Config.BaseAddress, - XEMACPSS_RXSR_OFFSET, status); - return 1; } -- 2.47.3