[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