[Zrouter-src-freebsd] ZRouter.org: push to FreeBSD HEAD tree

zrouter-src-freebsd at zrouter.org zrouter-src-freebsd at zrouter.org
Mon Apr 23 09:20:10 UTC 2012


details:   http://zrouter.org/hg/FreeBSD/head//rev/886d4c86bdfa
changeset: 462:886d4c86bdfa
user:      Aleksandr Rybalko <ray at ddteam.net>
date:      Mon Apr 23 12:14:26 2012 +0300
description:
* Unify page switching.
* Move READ4/WRITE4 to ar8x16_switchvar.h as macro.

diffstat:

 head/sys/dev/switch/ar8x16_switch.c    |  55 ++++++++++++++-------------------
 head/sys/dev/switch/ar8x16_switchvar.h |   7 ++++
 2 files changed, 30 insertions(+), 32 deletions(-)

diffs (154 lines):

diff -r 455aabca3842 -r 886d4c86bdfa head/sys/dev/switch/ar8x16_switch.c
--- a/head/sys/dev/switch/ar8x16_switch.c	Sat Apr 21 21:38:59 2012 +0300
+++ b/head/sys/dev/switch/ar8x16_switch.c	Mon Apr 23 12:14:26 2012 +0300
@@ -52,17 +52,25 @@
 static int 	set_reg(device_t dev, uint32_t reg, uint32_t *value);
 static int	reset_subsys(device_t dev, int subsys);
 
+static void
+ar8x16_set_page(struct ar8x16_switch_softc *sc, int page)
+{
+
+	if (sc->curpage != page) {
+		MII_WRITE(sc, sc->page_phy, sc->page_reg, page);
+		/* Wait for the page switch to propagate */
+		DELAY(2000);
+		/* Update current page */
+		sc->curpage = MII_READ(sc, sc->page_phy, sc->page_reg);
+	}
+}
+
 static uint32_t
 ar8x16_reg_read(struct ar8x16_switch_softc *sc, uint32_t reg)
 {
-	uint16_t lo, hi, page;
+	uint16_t lo, hi;
 
-	page = MII_READ(sc, sc->page_phy, sc->page_reg);
-	if (page != REG_PAGE(reg)) {
-		MII_WRITE(sc, sc->page_phy, sc->page_reg, REG_PAGE(reg));
-		/* Wait for the page switch to propagate */
-		DELAY(100);
-	}
+	ar8x16_set_page(sc, REG_PAGE(reg));
 
 	lo = MII_READ(sc, (0x10 | REG_PHY(reg)), REG_REG(reg));
 	hi = MII_READ(sc, (0x10 | REG_PHY(reg)), REG_REG(reg) + 1);
@@ -73,31 +81,13 @@
 static void
 ar8x16_reg_write(struct ar8x16_switch_softc *sc, uint32_t reg, uint32_t val)
 {
-	uint16_t page;
 
-	page = MII_READ(sc, sc->page_phy, sc->page_reg);
-	if (page != REG_PAGE(reg)) {
-		MII_WRITE(sc, sc->page_phy, sc->page_reg, REG_PAGE(reg));
-		/* Wait for the page switch to propagate */
-		DELAY(100);
-	}
+	ar8x16_set_page(sc, REG_PAGE(reg));
 
 	MII_WRITE(sc, (0x10 | REG_PHY(reg)), REG_REG(reg) + 1, val >> 16);
 	MII_WRITE(sc, (0x10 | REG_PHY(reg)), REG_REG(reg), val & 0xffff);
 }
 
-static uint32_t
-READ4(struct ar8x16_switch_softc *sc, uint32_t reg_addr)
-{
-	return (ar8x16_reg_read(sc, reg_addr));
-}
-
-static void
-WRITE4(struct ar8x16_switch_softc *sc, uint32_t reg_addr, uint32_t reg_val)
-{
-	ar8x16_reg_write(sc, reg_addr, reg_val);
-}
-
 static int
 miibus_writereg(device_t dev, int phy, int reg, int value)
 {
@@ -112,7 +102,6 @@
 	    (reg << AR8X16_MDIO_CTRL_REG_ADDR_SHIFT) |
 	    (value & AR8X16_MDIO_CTRL_DATA_MASK));
 
-	/* TODO: use pause */
 	if (WAIT4(sc, AR8X16_REG_MDIO_CTRL, AR8X16_MDIO_CTRL_BUSY, 0, 1000))
 		return (-1);
 
@@ -132,7 +121,6 @@
 	    (phy << AR8X16_MDIO_CTRL_PHY_ADDR_SHIFT) |
 	    (reg << AR8X16_MDIO_CTRL_REG_ADDR_SHIFT));
 
-	/* TODO: use pause */
 	if (WAIT4(sc, AR8X16_REG_MDIO_CTRL, AR8X16_MDIO_CTRL_BUSY, 0, 1000))
 		return (0xffff);
 
@@ -159,14 +147,15 @@
 set_reg(device_t dev, uint32_t reg, uint32_t *value)
 {
 	struct ar8x16_switch_softc *sc;
-	uint32_t old;
+	uint32_t old = 0xffff;
 
 	sc = device_get_softc(dev);
 	if (reg & SWITCH_REG_TYPE_RAW) {
 		old = READ4(sc, reg);
 		WRITE4(sc, reg, *value);
 	} else if (reg & SWITCH_REG_TYPE_PHY) {
-		old = miibus_readreg(dev, ((reg >> 8) & 0xff), (reg & 0xff));
+		old = miibus_readreg(dev, ((reg >> 8) & 0xff),
+		    (reg & 0xff));
 		*value = miibus_writereg(dev, ((reg >> 8) & 0xff),
 		    (reg & 0xff), *value);
 	} else {
@@ -186,7 +175,6 @@
 	/* Reset the switch. */
 	WRITE4(sc, AR8X16_REG_MASK_CTRL, AR8X16_MASK_CTRL_SOFT_RESET);
 
-	/* TODO: use pause */
 	ret = WAIT4(sc, AR8X16_REG_MASK_CTRL, AR8X16_MASK_CTRL_SOFT_RESET, 0,
 	    1000);
 	return ret;
@@ -212,6 +200,9 @@
 
 	sc->page_phy = phy;
 	sc->page_reg = reg;
+
+	/* Force page switching, to init sc->curpage */
+	rev = READ4(sc, AR8X16_REG_PORT_STS(0));
 	rev = READ4(sc, AR8X16_REG_MASK_CTRL);
 
 	switch (rev & (AR8X16_MASK_CTRL_VER_MASK|AR8X16_MASK_CTRL_REV_MASK)) {
@@ -235,7 +226,7 @@
 		break;
 	}
 
-	return (rev & (AR8X16_MASK_CTRL_VER_MASK|AR8X16_MASK_CTRL_REV_MASK));
+	return (rev);
 }
 
 static int
diff -r 455aabca3842 -r 886d4c86bdfa head/sys/dev/switch/ar8x16_switchvar.h
--- a/head/sys/dev/switch/ar8x16_switchvar.h	Sat Apr 21 21:38:59 2012 +0300
+++ b/head/sys/dev/switch/ar8x16_switchvar.h	Mon Apr 23 12:14:26 2012 +0300
@@ -37,6 +37,7 @@
 	struct switch_capability *caps;
 	int			page_reg;
 	int			page_phy;
+	int			curpage;
 	int			devid;
 	int			revid;
 	uint32_t		sc_mii_mode;
@@ -50,6 +51,12 @@
 #define MII_SW_WRITE4(_sc, _reg, _val)			\
 	SWITCHB_WRITE4(_sc->parent, _reg, _val)
 
+/* Read/write switch registers */
+#define	READ4(_sc, _addr)				\
+    ar8x16_reg_read((_sc), (_addr))
+#define	WRITE4(_sc, _addr, _val)			\
+    ar8x16_reg_write((_sc), (_addr), (_val))
+
 /* Ask switch bus to read/write phy registers */
 #define MII_READ(sc, phy, reg)				\
 	MII_SW_READ4(sc, (((phy) << 8) | (reg)))


More information about the Zrouter-src-freebsd mailing list