From: Peter Crosthwaite Date: Sat, 5 Jan 2013 03:57:21 +0000 (+1000) Subject: zynq_gem: Fix incorrect clearing of RX_STATUS X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=7eddac04c3426344568c62245a9ee3b806d80e46;p=thirdparty%2Fu-boot.git 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 --- 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; }