summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoradrian <adrian@FreeBSD.org>2014-02-19 06:02:47 +0000
committeradrian <adrian@FreeBSD.org>2014-02-19 06:02:47 +0000
commit32733ba485577ec9c5b05a1dbef44ee5d9d15c0b (patch)
treef05277c5d994cc220eda6b160f5171607f4c025d
parent135fe0a2555cc60cd731db913781ef0ccfdaf406 (diff)
downloadFreeBSD-src-32733ba485577ec9c5b05a1dbef44ee5d9d15c0b.zip
FreeBSD-src-32733ba485577ec9c5b05a1dbef44ee5d9d15c0b.tar.gz
Teach the PHY register path about the different MDIO bus address
for the AR8327. Tested: * AR8327, DB120
-rw-r--r--sys/dev/etherswitch/arswitch/arswitch_phy.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/sys/dev/etherswitch/arswitch/arswitch_phy.c b/sys/dev/etherswitch/arswitch/arswitch_phy.c
index 62eeb1d..928ca03 100644
--- a/sys/dev/etherswitch/arswitch/arswitch_phy.c
+++ b/sys/dev/etherswitch/arswitch/arswitch_phy.c
@@ -76,6 +76,7 @@ arswitch_readphy(device_t dev, int phy, int reg)
struct arswitch_softc *sc;
uint32_t data = 0, ctrl;
int err, timeout;
+ uint32_t a;
sc = device_get_softc(dev);
ARSWITCH_LOCK_ASSERT(sc, MA_NOTOWNED);
@@ -85,8 +86,13 @@ arswitch_readphy(device_t dev, int phy, int reg)
if (reg < 0 || reg >= 32)
return (ENXIO);
+ if (AR8X16_IS_SWITCH(sc, AR8327))
+ a = AR8327_REG_MDIO_CTRL;
+ else
+ a = AR8X16_REG_MDIO_CTRL;
+
ARSWITCH_LOCK(sc);
- err = arswitch_writereg_msb(dev, AR8X16_REG_MDIO_CTRL,
+ err = arswitch_writereg_msb(dev, a,
AR8X16_MDIO_CTRL_BUSY | AR8X16_MDIO_CTRL_MASTER_EN |
AR8X16_MDIO_CTRL_CMD_READ |
(phy << AR8X16_MDIO_CTRL_PHY_ADDR_SHIFT) |
@@ -95,13 +101,13 @@ arswitch_readphy(device_t dev, int phy, int reg)
if (err != 0)
goto fail;
for (timeout = 100; timeout--; ) {
- ctrl = arswitch_readreg_msb(dev, AR8X16_REG_MDIO_CTRL);
+ ctrl = arswitch_readreg_msb(dev, a);
if ((ctrl & AR8X16_MDIO_CTRL_BUSY) == 0)
break;
}
if (timeout < 0)
goto fail;
- data = arswitch_readreg_lsb(dev, AR8X16_REG_MDIO_CTRL) &
+ data = arswitch_readreg_lsb(dev, a) &
AR8X16_MDIO_CTRL_DATA_MASK;
ARSWITCH_UNLOCK(sc);
return (data);
@@ -117,6 +123,7 @@ arswitch_writephy(device_t dev, int phy, int reg, int data)
struct arswitch_softc *sc;
uint32_t ctrl;
int err, timeout;
+ uint32_t a;
sc = device_get_softc(dev);
ARSWITCH_LOCK_ASSERT(sc, MA_NOTOWNED);
@@ -124,8 +131,13 @@ arswitch_writephy(device_t dev, int phy, int reg, int data)
if (reg < 0 || reg >= 32)
return (ENXIO);
+ if (AR8X16_IS_SWITCH(sc, AR8327))
+ a = AR8327_REG_MDIO_CTRL;
+ else
+ a = AR8X16_REG_MDIO_CTRL;
+
ARSWITCH_LOCK(sc);
- err = arswitch_writereg(dev, AR8X16_REG_MDIO_CTRL,
+ err = arswitch_writereg(dev, a,
AR8X16_MDIO_CTRL_BUSY |
AR8X16_MDIO_CTRL_MASTER_EN |
AR8X16_MDIO_CTRL_CMD_WRITE |
@@ -135,7 +147,7 @@ arswitch_writephy(device_t dev, int phy, int reg, int data)
if (err != 0)
goto out;
for (timeout = 100; timeout--; ) {
- ctrl = arswitch_readreg(dev, AR8X16_REG_MDIO_CTRL);
+ ctrl = arswitch_readreg(dev, a);
if ((ctrl & AR8X16_MDIO_CTRL_BUSY) == 0)
break;
}
OpenPOWER on IntegriCloud