From 6bab7ea67f4f316118e2ec8baccce0ac9d8d05ef Mon Sep 17 00:00:00 2001 From: Sepherosa Ziehau Date: Mon, 4 Jan 2016 22:15:58 +0800 Subject: [PATCH] re: Reduce GMII PHY read/write timeout Obtained-from: FreeBSD --- sys/dev/netif/re/if_re.c | 26 ++++++++++++++++++-------- sys/dev/netif/re/if_revar.h | 1 + 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/sys/dev/netif/re/if_re.c b/sys/dev/netif/re/if_re.c index a99406fe9e..efdb25bfca 100644 --- a/sys/dev/netif/re/if_re.c +++ b/sys/dev/netif/re/if_re.c @@ -545,20 +545,24 @@ re_gmii_readreg(device_t dev, int phy, int reg) return(CSR_READ_1(sc, RE_GMEDIASTAT)); CSR_WRITE_4(sc, RE_PHYAR, reg << 16); - DELAY(1000); - for (i = 0; i < RE_TIMEOUT; i++) { + for (i = 0; i < RE_PHY_TIMEOUT; i++) { rval = CSR_READ_4(sc, RE_PHYAR); if (rval & RE_PHYAR_BUSY) break; - DELAY(100); + DELAY(25); } - if (i == RE_TIMEOUT) { + if (i == RE_PHY_TIMEOUT) { device_printf(dev, "PHY read failed\n"); return(0); } + /* + * Controller requires a 20us delay to process next MDIO request. + */ + DELAY(20); + return(rval & RE_PHYAR_PHYDATA); } @@ -571,17 +575,23 @@ re_gmii_writereg(device_t dev, int phy, int reg, int data) CSR_WRITE_4(sc, RE_PHYAR, (reg << 16) | (data & RE_PHYAR_PHYDATA) | RE_PHYAR_BUSY); - DELAY(1000); - for (i = 0; i < RE_TIMEOUT; i++) { + for (i = 0; i < RE_PHY_TIMEOUT; i++) { rval = CSR_READ_4(sc, RE_PHYAR); if ((rval & RE_PHYAR_BUSY) == 0) break; - DELAY(100); + DELAY(25); } - if (i == RE_TIMEOUT) + if (i == RE_PHY_TIMEOUT) { device_printf(dev, "PHY write failed\n"); + return(0); + } + + /* + * Controller requires a 20us delay to process next MDIO request. + */ + DELAY(20); return(0); } diff --git a/sys/dev/netif/re/if_revar.h b/sys/dev/netif/re/if_revar.h index fa288b2117..864683cda5 100644 --- a/sys/dev/netif/re/if_revar.h +++ b/sys/dev/netif/re/if_revar.h @@ -74,6 +74,7 @@ #define RE_JBUF_SIZE roundup2(RE_FRAMELEN_MAX, RE_RXBUF_ALIGN) #define RE_TIMEOUT 1000 +#define RE_PHY_TIMEOUT 2000 struct re_hwrev { uint32_t re_hwrev; -- 2.11.4.GIT